@ngneat/helipopper 6.6.0 → 7.0.1

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.
package/README.md CHANGED
@@ -73,7 +73,7 @@ You have the freedom to [customize](https://atomiks.github.io/tippyjs/v6/themes/
73
73
  Import the standalone `TippyDirective` and use it in your templates:
74
74
 
75
75
  ```html
76
- <button tippy="Helpful Message">
76
+ <button tp="Helpful Message">
77
77
  I have a tooltip
78
78
  </button>
79
79
  ```
@@ -95,7 +95,7 @@ export const tooltipVariation = {
95
95
  ### Use `TemplateRef` as content
96
96
 
97
97
  ```html
98
- <button [tippy]="tpl" variation="popper">
98
+ <button [tp]="tpl" tpVariation="popper">
99
99
  Click Me
100
100
  </button>
101
101
 
@@ -117,7 +117,7 @@ class MyComponent {
117
117
  ```
118
118
 
119
119
  ```html
120
- <button [tippy]="MyComponent">
120
+ <button [tp]="MyComponent">
121
121
  Click Me
122
122
  </button>
123
123
  ```
@@ -128,7 +128,7 @@ You can pass the `onlyTextOverflow` input to show the tooltip only when the host
128
128
 
129
129
  ```html
130
130
  <div style="max-width: 100px;" class="overflow-hidden flex">
131
- <p class="ellipsis" [tippy]="text" placement="right" [onlyTextOverflow]="true">
131
+ <p class="ellipsis" [tp]="text" tpPlacement="right" [tpOnlyTextOverflow]="true">
132
132
  {{ text }}
133
133
  </p>
134
134
  </div>
@@ -141,7 +141,7 @@ Note that it's using [`ResizeObserver`](https://caniuse.com/resizeobserver) api.
141
141
  You can instruct tippy to use the element textContent as the tooltip content:
142
142
 
143
143
  ```html
144
- <p tippy useTextContent>
144
+ <p tp tpUseTextContent>
145
145
  {{ text }}
146
146
  </p>
147
147
  ```
@@ -149,12 +149,12 @@ You can instruct tippy to use the element textContent as the tooltip content:
149
149
 
150
150
  ### Lazy
151
151
 
152
- You can pass the `lazy` input when you want to defer the creation of tippy only when the element is in the view:
152
+ You can pass the `tpIsLazy` input when you want to defer the creation of tippy only when the element is in the view:
153
153
 
154
154
  ```html
155
155
  <div *ngFor="let item of items"
156
- [tippy]="item.label"
157
- [lazy]="true">{{ item.label }}
156
+ [tp]="item.label"
157
+ [tpIsLazy]="true">{{ item.label }}
158
158
  </div>
159
159
  ```
160
160
 
@@ -196,9 +196,9 @@ Now you can use it in your template:
196
196
 
197
197
  <ul>
198
198
  <li *ngFor="let item of list"
199
- [tippy]="contextMenu"
200
- [data]="item"
201
- variation="contextMenu">
199
+ [tp]="contextMenu"
200
+ [tpData]="item"
201
+ tpVariation="contextMenu">
202
202
  {{ item.label }}
203
203
  </li>
204
204
  </ul>
@@ -207,7 +207,7 @@ Now you can use it in your template:
207
207
  ### Manual Trigger
208
208
 
209
209
  ```html
210
- <div tippy="Helpful Message" trigger="manual" #tooltip="tippy">
210
+ <div tp="Helpful Message" tpTrigger="manual" #tooltip="tippy">
211
211
  Click Open to see me
212
212
  </div>
213
213
 
@@ -215,12 +215,12 @@ Now you can use it in your template:
215
215
  <button (click)="tooltip.hide()">Close</button>
216
216
  ```
217
217
 
218
- ### Show/hide declarativly
218
+ ### Declarative show/hide
219
219
 
220
220
  Use isVisible to trigger show and hide. Set trigger to manual.
221
221
 
222
222
  ```html
223
- <div tippy="Helpful Message" trigger="manual" [isVisible]="visibility">
223
+ <div tp="Helpful Message" tpTrigger="manual" [tpIsVisible]="visibility">
224
224
  Click Open to see me
225
225
  </div>
226
226
 
@@ -235,38 +235,42 @@ live [here](https://ngneat.github.io/helipopper/).
235
235
  ### Inputs
236
236
 
237
237
  ```ts
238
- appendTo: TippyProps['appendTo'];
239
- delay: TippyProps['delay'];
240
- duration: TippyProps['duration'];
241
- hideOnClick: TippyProps['hideOnClick'];
242
- interactive: TippyProps['interactive'];
243
- interactiveBorder: TippyProps['interactiveBorder'];
244
- maxWidth: TippyProps['maxWidth'];
245
- offset: TippyProps['offset'];
246
- placement: TippyProps['placement'];
247
- popperOptions: TippyProps['popperOptions'];
248
- showOnCreate: TippyProps['showOnCreate'];
249
- trigger: TippyProps['trigger'];
250
- triggerTarget: TippyProps['triggerTarget'];
251
- zIndex: TippyProps['zIndex'];
252
- tippyHost: HTMLElement;
253
-
254
- useTextContent: boolean;
255
- lazy: boolean;
256
- variation: string;
257
- isEnabled: boolean;
258
- isVisible: boolean;
259
- className: string;
260
- onlyTextOverflow: boolean;
261
- useHostWidth: boolean;
262
- hideOnEscape: boolean;
263
- data: any;
238
+ tp: string | TemplateRef<any> | Type<any> | undefined | null;
239
+ tpAppendTo: TippyProps['appendTo'];
240
+ tpDelay: TippyProps['delay'];
241
+ tpDuration: TippyProps['duration'];
242
+ tpHideOnClick: TippyProps['hideOnClick'];
243
+ tpInteractive: TippyProps['interactive'];
244
+ tpInteractiveBorder: TippyProps['interactiveBorder'];
245
+ tpMaxWidth: TippyProps['maxWidth'];
246
+ tpOffset: TippyProps['offset'];
247
+ tpPlacement: TippyProps['placement'];
248
+ tpPopperOptions: TippyProps['popperOptions'];
249
+ tpShowOnCreate: TippyProps['showOnCreate'];
250
+ tpTrigger: TippyProps['trigger'];
251
+ tpTriggerTarget: TippyProps['triggerTarget'];
252
+ tpZIndex: TippyProps['zIndex'];
253
+ tpAnimation: TippyProps['animation'];
254
+ tpUseTextContent: boolean;
255
+ tpIsLazy: boolean;
256
+ tpVariation: string;
257
+ tpIsEnabled: boolean;
258
+ tpIsVisible: boolean;
259
+ tpClassName: string;
260
+ tpOnlyTextOverflow: boolean;
261
+ tpData: any;
262
+ tpUseHostWidth: boolean;
263
+ tpHideOnEscape: boolean;
264
+ tpDetectChangesComponent: boolean;
265
+ tpPopperWidth: number | string;
266
+ tpHost: HTMLElement;
267
+ tpIsVisible: boolean;
264
268
  ```
265
269
 
266
270
  ### Outputs
267
271
 
268
272
  ```ts
269
- visible = new EventEmitter<boolean>();
273
+ tpVisible = new EventEmitter<boolean>();
270
274
  ```
271
275
 
272
276
  ### Global Config
@@ -280,8 +284,8 @@ import { TippyService, TippyInstance } from '@ngneat/helipopper';
280
284
 
281
285
  class Component {
282
286
  @ViewChild('inputName') inputName: ElementRef;
287
+ tippy: TippyInstance;
283
288
  private tippyService = inject(TippyService);
284
- tippy:TippyInstance;
285
289
 
286
290
  show() {
287
291
  if(!this.tippy) {
@@ -21,8 +21,8 @@ export class TippyDirective {
21
21
  this.useHostWidth = false;
22
22
  this.hideOnEscape = false;
23
23
  this.detectChangesComponent = true;
24
- this.visible = new EventEmitter();
25
24
  this.isVisible = false;
25
+ this.visible = new EventEmitter();
26
26
  this.destroyed = new Subject();
27
27
  this.enabled = true;
28
28
  this.variationDefined = false;
@@ -77,7 +77,7 @@ export class TippyDirective {
77
77
  if (isPlatformServer(this.platformId))
78
78
  return;
79
79
  this.zone.runOutsideAngular(() => {
80
- if (this.lazy) {
80
+ if (this.isLazy) {
81
81
  if (this.onlyTextOverflow) {
82
82
  inView(this.host)
83
83
  .pipe(switchMap(() => overflowChanges(this.host)), takeUntil(this.destroyed))
@@ -308,12 +308,12 @@ export class TippyDirective {
308
308
  }
309
309
  }
310
310
  TippyDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: TippyDirective, deps: [{ token: PLATFORM_ID }, { token: TIPPY_CONFIG }, { token: i0.Injector }, { token: i1.ViewService }, { token: i0.ViewContainerRef }, { token: i0.NgZone }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
311
- TippyDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.1", type: TippyDirective, isStandalone: true, selector: "[tippy]", inputs: { appendTo: "appendTo", delay: "delay", duration: "duration", hideOnClick: "hideOnClick", interactive: "interactive", interactiveBorder: "interactiveBorder", maxWidth: "maxWidth", offset: "offset", placement: "placement", popperOptions: "popperOptions", showOnCreate: "showOnCreate", trigger: "trigger", triggerTarget: "triggerTarget", zIndex: "zIndex", animation: "animation", useTextContent: "useTextContent", lazy: "lazy", variation: "variation", isEnabled: "isEnabled", className: "className", onlyTextOverflow: "onlyTextOverflow", data: "data", useHostWidth: "useHostWidth", hideOnEscape: "hideOnEscape", detectChangesComponent: "detectChangesComponent", popperWidth: "popperWidth", content: ["tippy", "content"], customHost: ["tippyHost", "customHost"], isVisible: "isVisible" }, outputs: { visible: "visible" }, exportAs: ["tippy"], usesOnChanges: true, ngImport: i0 });
311
+ TippyDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.1", type: TippyDirective, isStandalone: true, selector: "[tp]", inputs: { content: ["tp", "content"], appendTo: ["tpAppendTo", "appendTo"], delay: ["tpDelay", "delay"], duration: ["tpDuration", "duration"], hideOnClick: ["tpHideOnClick", "hideOnClick"], interactive: ["tpInteractive", "interactive"], interactiveBorder: ["tpInteractiveBorder", "interactiveBorder"], maxWidth: ["tpMaxWidth", "maxWidth"], offset: ["tpOffset", "offset"], placement: ["tpPlacement", "placement"], popperOptions: ["tpPopperOptions", "popperOptions"], showOnCreate: ["tpShowOnCreate", "showOnCreate"], trigger: ["tpTrigger", "trigger"], triggerTarget: ["tpTriggerTarget", "triggerTarget"], zIndex: ["tpZIndex", "zIndex"], animation: ["tpAnimation", "animation"], useTextContent: ["tpUseTextContent", "useTextContent"], isLazy: ["tpIsLazy", "isLazy"], variation: ["tpVariation", "variation"], isEnabled: ["tpIsEnabled", "isEnabled"], className: ["tpClassName", "className"], onlyTextOverflow: ["tpOnlyTextOverflow", "onlyTextOverflow"], data: ["tpData", "data"], useHostWidth: ["tpUseHostWidth", "useHostWidth"], hideOnEscape: ["tpHideOnEscape", "hideOnEscape"], detectChangesComponent: ["tpDetectChangesComponent", "detectChangesComponent"], popperWidth: ["tpPopperWidth", "popperWidth"], customHost: ["tpHost", "customHost"], isVisible: ["tpIsVisible", "isVisible"] }, outputs: { visible: "tpVisible" }, exportAs: ["tippy"], usesOnChanges: true, ngImport: i0 });
312
312
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: TippyDirective, decorators: [{
313
313
  type: Directive,
314
314
  args: [{
315
315
  // eslint-disable-next-line @angular-eslint/directive-selector
316
- selector: '[tippy]',
316
+ selector: '[tp]',
317
317
  exportAs: 'tippy',
318
318
  standalone: true
319
319
  }]
@@ -323,68 +323,96 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.1", ngImpor
323
323
  }] }, { type: undefined, decorators: [{
324
324
  type: Inject,
325
325
  args: [TIPPY_CONFIG]
326
- }] }, { type: i0.Injector }, { type: i1.ViewService }, { type: i0.ViewContainerRef }, { type: i0.NgZone }, { type: i0.ElementRef }]; }, propDecorators: { appendTo: [{
327
- type: Input
326
+ }] }, { type: i0.Injector }, { type: i1.ViewService }, { type: i0.ViewContainerRef }, { type: i0.NgZone }, { type: i0.ElementRef }]; }, propDecorators: { content: [{
327
+ type: Input,
328
+ args: ['tp']
329
+ }], appendTo: [{
330
+ type: Input,
331
+ args: ['tpAppendTo']
328
332
  }], delay: [{
329
- type: Input
333
+ type: Input,
334
+ args: ['tpDelay']
330
335
  }], duration: [{
331
- type: Input
336
+ type: Input,
337
+ args: ['tpDuration']
332
338
  }], hideOnClick: [{
333
- type: Input
339
+ type: Input,
340
+ args: ['tpHideOnClick']
334
341
  }], interactive: [{
335
- type: Input
342
+ type: Input,
343
+ args: ['tpInteractive']
336
344
  }], interactiveBorder: [{
337
- type: Input
345
+ type: Input,
346
+ args: ['tpInteractiveBorder']
338
347
  }], maxWidth: [{
339
- type: Input
348
+ type: Input,
349
+ args: ['tpMaxWidth']
340
350
  }], offset: [{
341
- type: Input
351
+ type: Input,
352
+ args: ['tpOffset']
342
353
  }], placement: [{
343
- type: Input
354
+ type: Input,
355
+ args: ['tpPlacement']
344
356
  }], popperOptions: [{
345
- type: Input
357
+ type: Input,
358
+ args: ['tpPopperOptions']
346
359
  }], showOnCreate: [{
347
- type: Input
360
+ type: Input,
361
+ args: ['tpShowOnCreate']
348
362
  }], trigger: [{
349
- type: Input
363
+ type: Input,
364
+ args: ['tpTrigger']
350
365
  }], triggerTarget: [{
351
- type: Input
366
+ type: Input,
367
+ args: ['tpTriggerTarget']
352
368
  }], zIndex: [{
353
- type: Input
369
+ type: Input,
370
+ args: ['tpZIndex']
354
371
  }], animation: [{
355
- type: Input
372
+ type: Input,
373
+ args: ['tpAnimation']
356
374
  }], useTextContent: [{
357
- type: Input
358
- }], lazy: [{
359
- type: Input
375
+ type: Input,
376
+ args: ['tpUseTextContent']
377
+ }], isLazy: [{
378
+ type: Input,
379
+ args: ['tpIsLazy']
360
380
  }], variation: [{
361
- type: Input
381
+ type: Input,
382
+ args: ['tpVariation']
362
383
  }], isEnabled: [{
363
- type: Input
384
+ type: Input,
385
+ args: ['tpIsEnabled']
364
386
  }], className: [{
365
- type: Input
387
+ type: Input,
388
+ args: ['tpClassName']
366
389
  }], onlyTextOverflow: [{
367
- type: Input
390
+ type: Input,
391
+ args: ['tpOnlyTextOverflow']
368
392
  }], data: [{
369
- type: Input
393
+ type: Input,
394
+ args: ['tpData']
370
395
  }], useHostWidth: [{
371
- type: Input
396
+ type: Input,
397
+ args: ['tpUseHostWidth']
372
398
  }], hideOnEscape: [{
373
- type: Input
399
+ type: Input,
400
+ args: ['tpHideOnEscape']
374
401
  }], detectChangesComponent: [{
375
- type: Input
402
+ type: Input,
403
+ args: ['tpDetectChangesComponent']
376
404
  }], popperWidth: [{
377
- type: Input
378
- }], content: [{
379
405
  type: Input,
380
- args: ['tippy']
406
+ args: ['tpPopperWidth']
381
407
  }], customHost: [{
382
408
  type: Input,
383
- args: ['tippyHost']
384
- }], visible: [{
385
- type: Output
409
+ args: ['tpHost']
386
410
  }], isVisible: [{
387
- type: Input
411
+ type: Input,
412
+ args: ['tpIsVisible']
413
+ }], visible: [{
414
+ type: Output,
415
+ args: ['tpVisible']
388
416
  }] } });
389
417
  function isChanged(key, changes) {
390
418
  return key in changes;
@@ -392,4 +420,4 @@ function isChanged(key, changes) {
392
420
  export function coerceBooleanInput(value) {
393
421
  return value != null && `${value}` !== 'false';
394
422
  }
395
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlwcHkuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmduZWF0L2hlbGlwb3BwZXIvc3JjL2xpYi90aXBweS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osTUFBTSxFQUNOLFFBQVEsRUFDUixLQUFLLEVBS0wsTUFBTSxFQUNOLFdBQVcsRUFFWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEtBQW1CLE1BQU0sVUFBVSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQVcsV0FBVyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQXFDLE1BQU0sa0JBQWtCLENBQUM7QUFFcEgsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsTUFBTSxFQUNOLGtCQUFrQixFQUNsQixjQUFjLEVBQ2QsZUFBZSxFQUNoQixNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQWEsWUFBWSxFQUFFLFNBQVMsRUFBMEMsTUFBTSxlQUFlLENBQUM7OztBQVEzRyxNQUFNLE9BQU8sY0FBYztJQXNEekIsWUFDaUMsVUFBa0IsRUFDakIsWUFBeUIsRUFDL0MsUUFBa0IsRUFDbEIsV0FBd0IsRUFDeEIsR0FBcUIsRUFDckIsSUFBWSxFQUNaLE9BQW1CO1FBTkUsZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQUNqQixpQkFBWSxHQUFaLFlBQVksQ0FBYTtRQUMvQyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FB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QkFDRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFFVSxPQUFPO3NCQUF0QixLQUFLO3VCQUFDLE9BQU87Z0JBQ00sVUFBVTtzQkFBN0IsS0FBSzt1QkFBQyxXQUFXO2dCQUVSLE9BQU87c0JBQWhCLE1BQU07Z0JBQ1MsU0FBUztzQkFBeEIsS0FBSzs7QUFtVlIsU0FBUyxTQUFTLENBQW1CLEdBQVksRUFBRSxPQUFVO0lBQzNELE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQztBQUN4QixDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEtBQVU7SUFDM0MsT0FBTyxLQUFLLElBQUksSUFBSSxJQUFJLEdBQUcsS0FBSyxFQUFFLEtBQUssT0FBTyxDQUFDO0FBQ2pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBQTEFURk9STV9JRCxcbiAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGlzUGxhdGZvcm1TZXJ2ZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHRpcHB5LCB7IEluc3RhbmNlIH0gZnJvbSAndGlwcHkuanMnO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBtZXJnZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENvbnRlbnQsIGlzQ29tcG9uZW50LCBpc1N0cmluZywgaXNUZW1wbGF0ZVJlZiwgVmlld09wdGlvbnMsIFZpZXdSZWYsIFZpZXdTZXJ2aWNlIH0gZnJvbSAnQG5nbmVhdC9vdmVydmlldyc7XG5cbmltcG9ydCB7XG4gIGNvZXJjZUNzc1BpeGVsVmFsdWUsXG4gIGRpbWVuc2lvbnNDaGFuZ2VzLFxuICBpblZpZXcsXG4gIG5vcm1hbGl6ZUNsYXNzTmFtZSxcbiAgb25seVRpcHB5UHJvcHMsXG4gIG92ZXJmbG93Q2hhbmdlc1xufSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IE5nQ2hhbmdlcywgVElQUFlfQ09ORklHLCBUSVBQWV9SRUYsIFRpcHB5Q29uZmlnLCBUaXBweUluc3RhbmNlLCBUaXBweVByb3BzIH0gZnJvbSAnLi90aXBweS50eXBlcyc7XG5cbkBEaXJlY3RpdmUoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1zZWxlY3RvclxuICBzZWxlY3RvcjogJ1t0aXBweV0nLFxuICBleHBvcnRBczogJ3RpcHB5JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBUaXBweURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBPbkluaXQge1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfdXNlVGV4dENvbnRlbnQ6IGJvb2xlYW4gfCAnJztcblxuICBASW5wdXQoKSBhcHBlbmRUbzogVGlwcHlQcm9wc1snYXBwZW5kVG8nXTtcbiAgQElucHV0KCkgZGVsYXk6IFRpcHB5UHJvcHNbJ2RlbGF5J107XG4gIEBJbnB1dCgpIGR1cmF0aW9uOiBUaXBweVByb3BzWydkdXJhdGlvbiddO1xuICBASW5wdXQoKSBoaWRlT25DbGljazogVGlwcHlQcm9wc1snaGlkZU9uQ2xpY2snXTtcbiAgQElucHV0KCkgaW50ZXJhY3RpdmU6IFRpcHB5UHJvcHNbJ2ludGVyYWN0aXZlJ107XG4gIEBJbnB1dCgpIGludGVyYWN0aXZlQm9yZGVyOiBUaXBweVByb3BzWydpbnRlcmFjdGl2ZUJvcmRlciddO1xuICBASW5wdXQoKSBtYXhXaWR0aDogVGlwcHlQcm9wc1snbWF4V2lkdGgnXTtcbiAgQElucHV0KCkgb2Zmc2V0OiBUaXBweVByb3BzWydvZmZzZXQnXTtcbiAgQElucHV0KCkgcGxhY2VtZW50OiBUaXBweVByb3BzWydwbGFjZW1lbnQnXTtcbiAgQElucHV0KCkgcG9wcGVyT3B0aW9uczogVGlwcHlQcm9wc1sncG9wcGVyT3B0aW9ucyddO1xuICBASW5wdXQoKSBzaG93T25DcmVhdGU6IFRpcHB5UHJvcHNbJ3Nob3dPbkNyZWF0ZSddO1xuICBASW5wdXQoKSB0cmlnZ2VyOiBUaXBweVByb3BzWyd0cmlnZ2VyJ107XG4gIEBJbnB1dCgpIHRyaWdnZXJUYXJnZXQ6IFRpcHB5UHJvcHNbJ3RyaWdnZXJUYXJnZXQnXTtcbiAgQElucHV0KCkgekluZGV4OiBUaXBweVByb3BzWyd6SW5kZXgnXTtcbiAgQElucHV0KCkgYW5pbWF0aW9uOiBUaXBweVByb3BzWydhbmltYXRpb24nXTtcblxuICBASW5wdXQoKSB1c2VUZXh0Q29udGVudDogYm9vbGVhbjtcbiAgQElucHV0KCkgbGF6eTogYm9vbGVhbjtcbiAgQElucHV0KCkgdmFyaWF0aW9uOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGlzRW5hYmxlZDogYm9vbGVhbjtcbiAgQElucHV0KCkgY2xhc3NOYW1lOiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgQElucHV0KCkgb25seVRleHRPdmVyZmxvdyA9IGZhbHNlO1xuICBASW5wdXQoKSBkYXRhOiBhbnk7XG4gIEBJbnB1dCgpIHVzZUhvc3RXaWR0aCA9IGZhbHNlO1xuICBASW5wdXQoKSBoaWRlT25Fc2NhcGUgPSBmYWxzZTtcbiAgQElucHV0KCkgZGV0ZWN0Q2hhbmdlc0NvbXBvbmVudCA9IHRydWU7XG4gIEBJbnB1dCgpIHBvcHBlcldpZHRoOiBudW1iZXIgfCBzdHJpbmc7XG5cbiAgQElucHV0KCd0aXBweScpIGNvbnRlbnQ6IENvbnRlbnQgfCB1bmRlZmluZWQgfCBudWxsO1xuICBASW5wdXQoJ3RpcHB5SG9zdCcpIGN1c3RvbUhvc3Q6IEhUTUxFbGVtZW50O1xuXG4gIEBPdXRwdXQoKSB2aXNpYmxlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBASW5wdXQoKSBwdWJsaWMgaXNWaXNpYmxlID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIGluc3RhbmNlOiBUaXBweUluc3RhbmNlO1xuICBwcm90ZWN0ZWQgdmlld1JlZjogVmlld1JlZjtcbiAgcHJvdGVjdGVkIGRlc3Ryb3llZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByb3RlY3RlZCBwcm9wczogUGFydGlhbDxUaXBweUNvbmZpZz47XG4gIHByb3RlY3RlZCBlbmFibGVkID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIHZhcmlhdGlvbkRlZmluZWQgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHZpZXdPcHRpb25zJDogVmlld09wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFdlIGhhZCB1c2UgYHZpc2libGVgIGV2ZW50IGVtaXR0ZXIgcHJldmlvdXNseSBhcyBhIGB0YWtlVW50aWxgIHN1YnNjcmliZXIgaW4gbXVsdGlwbGUgcGxhY2VzXG4gICAqIHdpdGhpbiB0aGUgZGlyZWN0aXZlLlxuICAgKiBUaGlzIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seTsgdGh1cyB3ZSBkb24ndCBoYXZlIHRvIGRlYWwgd2l0aCB0aGUgYHZpc2libGVgIGV2ZW50IGVtaXR0ZXJcbiAgICogYW5kIHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbnMgb25seSB3aGVuIHRoZSBgdmlzaWJsZWAgZXZlbnQgaXMgYmVpbmcgbGlzdGVuZWQgb3V0c2lkZVxuICAgKiBpbiB0aGUgdGVtcGxhdGUgKGA8YnV0dG9uIFt0aXBweV09XCIuLi5cIiAodmlzaWJsZSk9XCIuLi5cIj48L2J1dHRvbj5gKS5cbiAgICovXG4gIHByb3RlY3RlZCB2aXNpYmxlSW50ZXJuYWwgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByb3RlY3RlZCBwbGF0Zm9ybUlkOiBzdHJpbmcsXG4gICAgQEluamVjdChUSVBQWV9DT05GSUcpIHByb3RlY3RlZCBnbG9iYWxDb25maWc6IFRpcHB5Q29uZmlnLFxuICAgIHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJvdGVjdGVkIHZpZXdTZXJ2aWNlOiBWaWV3U2VydmljZSxcbiAgICBwcm90ZWN0ZWQgdmNyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByb3RlY3RlZCB6b25lOiBOZ1pvbmUsXG4gICAgcHJvdGVjdGVkIGhvc3RSZWY6IEVsZW1lbnRSZWZcbiAgKSB7fVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IE5nQ2hhbmdlczxUaXBweURpcmVjdGl2ZT4pIHtcbiAgICBpZiAoaXNQbGF0Zm9ybVNlcnZlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG5cbiAgICBsZXQgcHJvcHM6IFBhcnRpYWw8VGlwcHlDb25maWc+ID0gT2JqZWN0LmtleXMoY2hhbmdlcykucmVkdWNlKChhY2MsIGNoYW5nZSkgPT4ge1xuICAgICAgaWYgKGNoYW5nZSA9PT0gJ2lzVmlzaWJsZScpIHJldHVybiBhY2M7XG5cbiAgICAgIGFjY1tjaGFuZ2VdID0gY2hhbmdlc1tjaGFuZ2VdLmN1cnJlbnRWYWx1ZTtcblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG5cbiAgICBsZXQgdmFyaWF0aW9uOiBzdHJpbmc7XG5cbiAgICBpZiAoaXNDaGFuZ2VkPE5nQ2hhbmdlczxUaXBweURpcmVjdGl2ZT4+KCd2YXJpYXRpb24nLCBjaGFuZ2VzKSkge1xuICAgICAgdmFyaWF0aW9uID0gY2hhbmdlcy52YXJpYXRpb24uY3VycmVudFZhbHVlO1xuICAgICAgdGhpcy52YXJpYXRpb25EZWZpbmVkID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnZhcmlhdGlvbkRlZmluZWQpIHtcbiAgICAgIHZhcmlhdGlvbiA9IHRoaXMuZ2xvYmFsQ29uZmlnLmRlZmF1bHRWYXJpYXRpb247XG4gICAgICB0aGlzLnZhcmlhdGlvbkRlZmluZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICh2YXJpYXRpb24pIHtcbiAgICAgIHByb3BzID0ge1xuICAgICAgICAuLi50aGlzLmdsb2JhbENvbmZpZy52YXJpYXRpb25zW3ZhcmlhdGlvbl0sXG4gICAgICAgIC4uLnByb3BzXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChpc0NoYW5nZWQ8TmdDaGFuZ2VzPFRpcHB5RGlyZWN0aXZlPj4oJ2lzRW5hYmxlZCcsIGNoYW5nZXMpKSB7XG4gICAgICB0aGlzLmVuYWJsZWQgPSBjaGFuZ2VzLmlzRW5hYmxlZC5jdXJyZW50VmFsdWU7XG4gICAgICB0aGlzLnNldFN0YXR1cygpO1xuICAgIH1cblxuICAgIGlmIChpc0NoYW5nZWQ8TmdDaGFuZ2VzPFRpcHB5RGlyZWN0aXZlPj4oJ2lzVmlzaWJsZScsIGNoYW5nZXMpKSB7XG4gICAgICB0aGlzLmlzVmlzaWJsZSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRQcm9wcyh7IC4uLnRoaXMucHJvcHMsIC4uLnByb3BzIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMudXNlSG9zdFdpZHRoKSB7XG4gICAgICB0aGlzLnByb3BzLm1heFdpZHRoID0gdGhpcy5ob3N0V2lkdGg7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGlmIChpc1BsYXRmb3JtU2VydmVyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcblxuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBpZiAodGhpcy5sYXp5KSB7XG4gICAgICAgIGlmICh0aGlzLm9ubHlUZXh0T3ZlcmZsb3cpIHtcbiAgICAgICAgICBpblZpZXcodGhpcy5ob3N0KVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiBvdmVyZmxvd0NoYW5nZXModGhpcy5ob3N0KSksXG4gICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoaXNFbGVtZW50T3ZlcmZsb3cgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmNoZWNrT3ZlcmZsb3coaXNFbGVtZW50T3ZlcmZsb3cpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW5WaWV3KHRoaXMuaG9zdClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVJbnN0YW5jZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vbmx5VGV4dE92ZXJmbG93KSB7XG4gICAgICAgIG92ZXJmbG93Q2hhbmdlcyh0aGlzLmhvc3QpXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkKSlcbiAgICAgICAgICAuc3Vic2NyaWJlKGlzRWxlbWVudE92ZXJmbG93ID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tPdmVyZmxvdyhpc0VsZW1lbnRPdmVyZmxvdyk7XG4gICAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNyZWF0ZUluc3RhbmNlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3llZC5uZXh0KCk7XG4gICAgdGhpcy5pbnN0YW5jZT8uZGVzdHJveSgpO1xuICAgIHRoaXMuZGVzdHJveVZpZXcoKTtcbiAgfVxuXG4gIGRlc3Ryb3lWaWV3KCkge1xuICAgIHRoaXMudmlld09wdGlvbnMkID0gbnVsbDtcbiAgICB0aGlzLnZpZXdSZWY/LmRlc3Ryb3koKTtcbiAgICB0aGlzLnZpZXdSZWYgPSBudWxsO1xuICB9XG5cbiAgc2hvdygpIHtcbiAgICB0aGlzLmluc3RhbmNlPy5zaG93KCk7XG4gIH1cblxuICBoaWRlKCkge1xuICAgIHRoaXMuaW5zdGFuY2U/LmhpZGUoKTtcbiAgfVxuXG4gIGVuYWJsZSgpIHtcbiAgICB0aGlzLmluc3RhbmNlPy5lbmFibGUoKTtcbiAgfVxuXG4gIGRpc2FibGUoKSB7XG4gICAgdGhpcy5pbnN0YW5jZT8uZGlzYWJsZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldFByb3BzKHByb3BzOiBQYXJ0aWFsPFRpcHB5Q29uZmlnPikge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgICB0aGlzLmluc3RhbmNlPy5zZXRQcm9wcyhvbmx5VGlwcHlQcm9wcyhwcm9wcykpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldFN0YXR1cygpIHtcbiAgICB0aGlzLmVuYWJsZWQgPyB0aGlzLmluc3RhbmNlPy5lbmFibGUoKSA6IHRoaXMuaW5zdGFuY2U/LmRpc2FibGUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgaG9zdCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuY3VzdG9tSG9zdCB8fCB0aGlzLmhvc3RSZWYubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgaG9zdFdpZHRoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVJbnN0YW5jZSgpIHtcbiAgICBpZiAoIXRoaXMuY29udGVudCAmJiAhY29lcmNlQm9vbGVhbklucHV0KHRoaXMudXNlVGV4dENvbnRlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuaW5zdGFuY2UgPSB0aXBweSh0aGlzLmhvc3QsIHtcbiAgICAgICAgYWxsb3dIVE1MOiB0cnVlLFxuICAgICAgICBhcHBlbmRUbzogZG9jdW1lbnQuYm9keSxcbiAgICAgICAgLi4ub25seVRpcHB5UHJvcHModGhpcy5nbG9iYWxDb25maWcpLFxuICAgICAgICAuLi5vbmx5VGlwcHlQcm9wcyh0aGlzLnByb3BzKSxcbiAgICAgICAgb25Nb3VudDogaW5zdGFuY2UgPT4ge1xuICAgICAgICAgIHRoaXMuaXNWaXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnZpc2libGVJbnRlcm5hbC5uZXh0KHRoaXMuaXNWaXNpYmxlKTtcbiAgICAgICAgICBpZiAodGhpcy52aXNpYmxlLm9ic2VydmVkKSB7XG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMudmlzaWJsZS5uZXh0KHRoaXMuaXNWaXNpYmxlKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudXNlSG9zdFdpZHRoICYmIHRoaXMubGlzdGVuVG9Ib3N0UmVzaXplKCk7XG4gICAgICAgICAgdGhpcy5nbG9iYWxDb25maWcub25Nb3VudD8uKGluc3RhbmNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25DcmVhdGU6IGluc3RhbmNlID0+IHtcbiAgICAgICAgICBpbnN0YW5jZS5wb3BwZXIuY2xhc3NMaXN0LmFkZChgdGlwcHktdmFyaWF0aW9uLSR7dGhpcy52YXJpYXRpb24gfHwgdGhpcy5nbG9iYWxDb25maWcuZGVmYXVsdFZhcmlhdGlvbn1gKTtcbiAgICAgICAgICBpZiAodGhpcy5jbGFzc05hbWUpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2xhc3Mgb2Ygbm9ybWFsaXplQ2xhc3NOYW1lKHRoaXMuY2xhc3NOYW1lKSkge1xuICAgICAgICAgICAgICBpbnN0YW5jZS5wb3BwZXIuY2xhc3NMaXN0LmFkZChrbGFzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZ2xvYmFsQ29uZmlnLm9uQ3JlYXRlPy4oaW5zdGFuY2UpO1xuICAgICAgICAgIGlmICh0aGlzLmlzVmlzaWJsZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgaW5zdGFuY2Uuc2hvdygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25TaG93OiBpbnN0YW5jZSA9PiB7XG4gICAgICAgICAgaW5zdGFuY2UucmVmZXJlbmNlLnNldEF0dHJpYnV0ZSgnZGF0YS10aXBweS1vcGVuJywgJycpO1xuICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMucmVzb2x2ZUNvbnRlbnQoaW5zdGFuY2UpO1xuICAgICAgICAgICAgaWYgKGlzU3RyaW5nKGNvbnRlbnQpKSB7XG4gICAgICAgICAgICAgIGluc3RhbmNlLnNldFByb3BzKHsgYWxsb3dIVE1MOiBmYWxzZSB9KTtcblxuICAgICAgICAgICAgICBpZiAoIWNvbnRlbnQ/LnRyaW0oKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZSgpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5zdGFuY2Uuc2V0Q29udGVudChjb250ZW50KTtcbiAgICAgICAgICAgIHRoaXMuaGlkZU9uRXNjYXBlICYmIHRoaXMuaGFuZGxlRXNjYXBlQnV0dG9uKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHRoaXMudXNlSG9zdFdpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLnNldEluc3RhbmNlV2lkdGgoaW5zdGFuY2UsIHRoaXMuaG9zdFdpZHRoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucG9wcGVyV2lkdGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5zdGFuY2VXaWR0aChpbnN0YW5jZSwgdGhpcy5wb3BwZXJXaWR0aCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZ2xvYmFsQ29uZmlnLm9uU2hvdz8uKGluc3RhbmNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25IaWRlKGluc3RhbmNlKSB7XG4gICAgICAgICAgaW5zdGFuY2UucmVmZXJlbmNlLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS10aXBweS1vcGVuJyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uSGlkZGVuOiBpbnN0YW5jZSA9PiB7XG4gICAgICAgICAgdGhpcy5kZXN0cm95VmlldygpO1xuICAgICAgICAgIHRoaXMuaXNWaXNpYmxlID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy52aXNpYmxlSW50ZXJuYWwubmV4dCh0aGlzLmlzVmlzaWJsZSk7XG4gICAgICAgICAgaWYgKHRoaXMudmlzaWJsZS5vYnNlcnZlZCkge1xuICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB0aGlzLnZpc2libGUubmV4dCh0aGlzLmlzVmlzaWJsZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmdsb2JhbENvbmZpZy5vbkhpZGRlbj8uKGluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc2V0U3RhdHVzKCk7XG4gICAgICB0aGlzLnNldFByb3BzKHRoaXMucHJvcHMpO1xuXG4gICAgICB0aGlzLnZhcmlhdGlvbiA9PT0gJ2NvbnRleHRNZW51JyAmJiB0aGlzLmhhbmRsZUNvbnRleHRNZW51KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzb2x2ZUNvbnRlbnQoaW5zdGFuY2U6IFRpcHB5SW5zdGFuY2UpIHtcbiAgICBpZiAoIXRoaXMudmlld09wdGlvbnMkICYmICFpc1N0cmluZyh0aGlzLmNvbnRlbnQpKSB7XG4gICAgICBpZiAoaXNDb21wb25lbnQodGhpcy5jb250ZW50KSkge1xuICAgICAgICB0aGlzLmluc3RhbmNlLmRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIHRoaXMudmlld09wdGlvbnMkID0ge1xuICAgICAgICAgIGluamVjdG9yOiBJbmplY3Rvci5jcmVhdGUoe1xuICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcm92aWRlOiBUSVBQWV9SRUYsXG4gICAgICAgICAgICAgICAgdXNlVmFsdWU6IHRoaXMuaW5zdGFuY2VcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHBhcmVudDogdGhpcy5pbmplY3RvclxuICAgICAgICAgIH0pXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKGlzVGVtcGxhdGVSZWYodGhpcy5jb250ZW50KSkge1xuICAgICAgICB0aGlzLnZpZXdPcHRpb25zJCA9IHtcbiAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAkaW1wbGljaXQ6IHRoaXMuaGlkZS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgZGF0YTogdGhpcy5kYXRhXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudmlld1JlZiA9IHRoaXMudmlld1NlcnZpY2UuY3JlYXRlVmlldyh0aGlzLmNvbnRlbnQsIHtcbiAgICAgIHZjcjogdGhpcy52Y3IsXG4gICAgICAuLi50aGlzLnZpZXdPcHRpb25zJFxuICAgIH0pO1xuXG4gICAgLy8gV2UgbmVlZCB0byBjYWxsIGRldGVjdENoYW5nZXMgZm9yIG9uUHVzaCBjb21wb25lbnRzIHRvIHVwZGF0ZSB0aGUgY29udGVudFxuICAgIGlmICh0aGlzLmRldGVjdENoYW5nZXNDb21wb25lbnQgJiYgaXNDb21wb25lbnQodGhpcy5jb250ZW50KSkge1xuICAgICAgdGhpcy52aWV3UmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBsZXQgY29udGVudCA9IHRoaXMudmlld1JlZi5nZXRFbGVtZW50KCk7XG5cbiAgICBpZiAoY29lcmNlQm9vbGVhbklucHV0KHRoaXMudXNlVGV4dENvbnRlbnQpKSB7XG4gICAgICBjb250ZW50ID0gaW5zdGFuY2UucmVmZXJlbmNlLnRleHRDb250ZW50O1xuICAgIH1cblxuICAgIGlmIChpc1N0cmluZyhjb250ZW50KSAmJiB0aGlzLmdsb2JhbENvbmZpZy5iZWZvcmVSZW5kZXIpIHtcbiAgICAgIGNvbnRlbnQgPSB0aGlzLmdsb2JhbENvbmZpZy5iZWZvcmVSZW5kZXIoY29udGVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlQ29udGV4dE1lbnUoKSB7XG4gICAgZnJvbUV2ZW50KHRoaXMuaG9zdCwgJ2NvbnRleHRtZW51JylcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCkpXG4gICAgICAuc3Vic2NyaWJlKChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIHRoaXMuaW5zdGFuY2Uuc2V0UHJvcHMoe1xuICAgICAgICAgIGdldFJlZmVyZW5jZUNsaWVudFJlY3Q6ICgpID0+XG4gICAgICAgICAgICAoe1xuICAgICAgICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgICAgICAgICB0b3A6IGV2ZW50LmNsaWVudFksXG4gICAgICAgICAgICAgIGJvdHRvbTogZXZlbnQuY2xpZW50WSxcbiAgICAgICAgICAgICAgbGVmdDogZXZlbnQuY2xpZW50WCxcbiAgICAgICAgICAgICAgcmlnaHQ6IGV2ZW50LmNsaWVudFhcbiAgICAgICAgICAgIH0gYXMgRE9NUmVjdFJlYWRPbmx5KVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmluc3RhbmNlLnNob3coKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZUVzY2FwZUJ1dHRvbigpOiB2b2lkIHtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgZnJvbUV2ZW50KGRvY3VtZW50LmJvZHksICdrZXlkb3duJylcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKCh7IGNvZGUgfTogS2V5Ym9hcmRFdmVudCkgPT4gY29kZSA9PT0gJ0VzY2FwZScpLFxuICAgICAgICAgIHRha2VVbnRpbChtZXJnZSh0aGlzLmRlc3Ryb3llZCwgdGhpcy52aXNpYmxlSW50ZXJuYWwucGlwZShmaWx0ZXIodiA9PiAhdikpKSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuaGlkZSgpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja092ZXJmbG93KGlzRWxlbWVudE92ZXJmbG93OiBib29sZWFuKSB7XG4gICAgaWYgKGlzRWxlbWVudE92ZXJmbG93KSB7XG4gICAgICBpZiAoIXRoaXMuaW5zdGFuY2UpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVJbnN0YW5jZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbnN0YW5jZS5lbmFibGUoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbnN0YW5jZT8uZGlzYWJsZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBsaXN0ZW5Ub0hvc3RSZXNpemUoKSB7XG4gICAgZGltZW5zaW9uc0NoYW5nZXModGhpcy5ob3N0KVxuICAgICAgLnBpcGUodGFrZVVudGlsKG1lcmdlKHRoaXMuZGVzdHJveWVkLCB0aGlzLnZpc2libGVJbnRlcm5hbCkpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0SW5zdGFuY2VXaWR0aCh0aGlzLmluc3RhbmNlLCB0aGlzLmhvc3RXaWR0aCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRJbnN0YW5jZVdpZHRoKGluc3RhbmNlOiBJbnN0YW5jZSwgd2lkdGg6IHN0cmluZyB8IG51bWJlcikge1xuICAgIGNvbnN0IGluUGl4ZWxzID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZSh3aWR0aCk7XG4gICAgaW5zdGFuY2UucG9wcGVyLnN0eWxlLndpZHRoID0gaW5QaXhlbHM7XG4gICAgaW5zdGFuY2UucG9wcGVyLnN0eWxlLm1heFdpZHRoID0gaW5QaXhlbHM7XG4gICAgKGluc3RhbmNlLnBvcHBlci5maXJzdEVsZW1lbnRDaGlsZCBhcyBIVE1MRWxlbWVudCkuc3R5bGUubWF4V2lkdGggPSBpblBpeGVscztcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0NoYW5nZWQ8VCBleHRlbmRzIG9iamVjdD4oa2V5OiBrZXlvZiBULCBjaGFuZ2VzOiBUKSB7XG4gIHJldHVybiBrZXkgaW4gY2hhbmdlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvZXJjZUJvb2xlYW5JbnB1dCh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIGAke3ZhbHVlfWAgIT09ICdmYWxzZSc7XG59XG4iXX0=
423
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlwcHkuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmduZWF0L2hlbGlwb3BwZXIvc3JjL2xpYi90aXBweS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osTUFBTSxFQUNOLFFBQVEsRUFDUixLQUFLLEVBS0wsTUFBTSxFQUNOLFdBQVcsRUFFWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEtBQW1CLE1BQU0sVUFBVSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQVcsV0FBVyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQXFDLE1BQU0sa0JBQWtCLENBQUM7QUFFcEgsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsTUFBTSxFQUNOLGtCQUFrQixFQUNsQixjQUFjLEVBQ2QsZUFBZSxFQUNoQixNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQWEsWUFBWSxFQUFFLFNBQVMsRUFBMEMsTUFBTSxlQUFlLENBQUM7OztBQVEzRyxNQUFNLE9BQU8sY0FBYztJQW9EekIsWUFDaUMsVUFBa0IsRUFDakIsWUFBeUIsRUFDL0MsUUFBa0IsRUFDbEIsV0FBd0IsRUFDeEIsR0FBcUIsRUFDckIsSUFBWSxFQUNaLE9BQW1CO1FBTkUsZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQUNqQixpQkFBWSxHQUFaLFlBQVksQ0FBYTtRQUMvQyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FB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O2dCQUNPLGNBQWM7c0JBQXhDLEtBQUs7dUJBQUMsa0JBQWtCO2dCQUNOLE1BQU07c0JBQXhCLEtBQUs7dUJBQUMsVUFBVTtnQkFDSyxTQUFTO3NCQUE5QixLQUFLO3VCQUFDLGFBQWE7Z0JBQ0UsU0FBUztzQkFBOUIsS0FBSzt1QkFBQyxhQUFhO2dCQUNFLFNBQVM7c0JBQTlCLEtBQUs7dUJBQUMsYUFBYTtnQkFDUyxnQkFBZ0I7c0JBQTVDLEtBQUs7dUJBQUMsb0JBQW9CO2dCQUNWLElBQUk7c0JBQXBCLEtBQUs7dUJBQUMsUUFBUTtnQkFDVSxZQUFZO3NCQUFwQyxLQUFLO3VCQUFDLGdCQUFnQjtnQkFDRSxZQUFZO3NCQUFwQyxLQUFLO3VCQUFDLGdCQUFnQjtnQkFDWSxzQkFBc0I7c0JBQXhELEtBQUs7dUJBQUMsMEJBQTBCO2dCQUNULFdBQVc7c0JBQWxDLEtBQUs7dUJBQUMsZUFBZTtnQkFDTCxVQUFVO3NCQUExQixLQUFLO3VCQUFDLFFBQVE7Z0JBQ08sU0FBUztzQkFBOUIsS0FBSzt1QkFBQyxhQUFhO2dCQUVDLE9BQU87c0JBQTNCLE1BQU07dUJBQUMsV0FBVzs7QUFtVnJCLFNBQVMsU0FBUyxDQUFtQixHQUFZLEVBQUUsT0FBVTtJQUMzRCxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUM7QUFDeEIsQ0FBQztBQUVELE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxLQUFVO0lBQzNDLE9BQU8sS0FBSyxJQUFJLElBQUksSUFBSSxHQUFHLEtBQUssRUFBRSxLQUFLLE9BQU8sQ0FBQztBQUNqRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUExBVEZPUk1fSUQsXG4gIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtU2VydmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB0aXBweSwgeyBJbnN0YW5jZSB9IGZyb20gJ3RpcHB5LmpzJztcbmltcG9ydCB7IGZyb21FdmVudCwgbWVyZ2UsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgc3dpdGNoTWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb250ZW50LCBpc0NvbXBvbmVudCwgaXNTdHJpbmcsIGlzVGVtcGxhdGVSZWYsIFZpZXdPcHRpb25zLCBWaWV3UmVmLCBWaWV3U2VydmljZSB9IGZyb20gJ0BuZ25lYXQvb3ZlcnZpZXcnO1xuXG5pbXBvcnQge1xuICBjb2VyY2VDc3NQaXhlbFZhbHVlLFxuICBkaW1lbnNpb25zQ2hhbmdlcyxcbiAgaW5WaWV3LFxuICBub3JtYWxpemVDbGFzc05hbWUsXG4gIG9ubHlUaXBweVByb3BzLFxuICBvdmVyZmxvd0NoYW5nZXNcbn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBOZ0NoYW5nZXMsIFRJUFBZX0NPTkZJRywgVElQUFlfUkVGLCBUaXBweUNvbmZpZywgVGlwcHlJbnN0YW5jZSwgVGlwcHlQcm9wcyB9IGZyb20gJy4vdGlwcHkudHlwZXMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9kaXJlY3RpdmUtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdbdHBdJyxcbiAgZXhwb3J0QXM6ICd0aXBweScsXG4gIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgVGlwcHlEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25Jbml0IHtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX3VzZVRleHRDb250ZW50OiBib29sZWFuIHwgJyc7XG5cbiAgQElucHV0KCd0cCcpIGNvbnRlbnQ6IENvbnRlbnQgfCB1bmRlZmluZWQgfCBudWxsO1xuICBASW5wdXQoJ3RwQXBwZW5kVG8nKSBhcHBlbmRUbzogVGlwcHlQcm9wc1snYXBwZW5kVG8nXTtcbiAgQElucHV0KCd0cERlbGF5JykgZGVsYXk6IFRpcHB5UHJvcHNbJ2RlbGF5J107XG4gIEBJbnB1dCgndHBEdXJhdGlvbicpIGR1cmF0aW9uOiBUaXBweVByb3BzWydkdXJhdGlvbiddO1xuICBASW5wdXQoJ3RwSGlkZU9uQ2xpY2snKSBoaWRlT25DbGljazogVGlwcHlQcm9wc1snaGlkZU9uQ2xpY2snXTtcbiAgQElucHV0KCd0cEludGVyYWN0aXZlJykgaW50ZXJhY3RpdmU6IFRpcHB5UHJvcHNbJ2ludGVyYWN0aXZlJ107XG4gIEBJbnB1dCgndHBJbnRlcmFjdGl2ZUJvcmRlcicpIGludGVyYWN0aXZlQm9yZGVyOiBUaXBweVByb3BzWydpbnRlcmFjdGl2ZUJvcmRlciddO1xuICBASW5wdXQoJ3RwTWF4V2lkdGgnKSBtYXhXaWR0aDogVGlwcHlQcm9wc1snbWF4V2lkdGgnXTtcbiAgQElucHV0KCd0cE9mZnNldCcpIG9mZnNldDogVGlwcHlQcm9wc1snb2Zmc2V0J107XG4gIEBJbnB1dCgndHBQbGFjZW1lbnQnKSBwbGFjZW1lbnQ6IFRpcHB5UHJvcHNbJ3BsYWNlbWVudCddO1xuICBASW5wdXQoJ3RwUG9wcGVyT3B0aW9ucycpIHBvcHBlck9wdGlvbnM6IFRpcHB5UHJvcHNbJ3BvcHBlck9wdGlvbnMnXTtcbiAgQElucHV0KCd0cFNob3dPbkNyZWF0ZScpIHNob3dPbkNyZWF0ZTogVGlwcHlQcm9wc1snc2hvd09uQ3JlYXRlJ107XG4gIEBJbnB1dCgndHBUcmlnZ2VyJykgdHJpZ2dlcjogVGlwcHlQcm9wc1sndHJpZ2dlciddO1xuICBASW5wdXQoJ3RwVHJpZ2dlclRhcmdldCcpIHRyaWdnZXJUYXJnZXQ6IFRpcHB5UHJvcHNbJ3RyaWdnZXJUYXJnZXQnXTtcbiAgQElucHV0KCd0cFpJbmRleCcpIHpJbmRleDogVGlwcHlQcm9wc1snekluZGV4J107XG4gIEBJbnB1dCgndHBBbmltYXRpb24nKSBhbmltYXRpb246IFRpcHB5UHJvcHNbJ2FuaW1hdGlvbiddO1xuICBASW5wdXQoJ3RwVXNlVGV4dENvbnRlbnQnKSB1c2VUZXh0Q29udGVudDogYm9vbGVhbjtcbiAgQElucHV0KCd0cElzTGF6eScpIGlzTGF6eTogYm9vbGVhbjtcbiAgQElucHV0KCd0cFZhcmlhdGlvbicpIHZhcmlhdGlvbjogc3RyaW5nO1xuICBASW5wdXQoJ3RwSXNFbmFibGVkJykgaXNFbmFibGVkOiBib29sZWFuO1xuICBASW5wdXQoJ3RwQ2xhc3NOYW1lJykgY2xhc3NOYW1lOiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgQElucHV0KCd0cE9ubHlUZXh0T3ZlcmZsb3cnKSBvbmx5VGV4dE92ZXJmbG93ID0gZmFsc2U7XG4gIEBJbnB1dCgndHBEYXRhJykgZGF0YTogYW55O1xuICBASW5wdXQoJ3RwVXNlSG9zdFdpZHRoJykgdXNlSG9zdFdpZHRoID0gZmFsc2U7XG4gIEBJbnB1dCgndHBIaWRlT25Fc2NhcGUnKSBoaWRlT25Fc2NhcGUgPSBmYWxzZTtcbiAgQElucHV0KCd0cERldGVjdENoYW5nZXNDb21wb25lbnQnKSBkZXRlY3RDaGFuZ2VzQ29tcG9uZW50ID0gdHJ1ZTtcbiAgQElucHV0KCd0cFBvcHBlcldpZHRoJykgcG9wcGVyV2lkdGg6IG51bWJlciB8IHN0cmluZztcbiAgQElucHV0KCd0cEhvc3QnKSBjdXN0b21Ib3N0OiBIVE1MRWxlbWVudDtcbiAgQElucHV0KCd0cElzVmlzaWJsZScpIGlzVmlzaWJsZSA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoJ3RwVmlzaWJsZScpIHZpc2libGUgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgcHJvdGVjdGVkIGluc3RhbmNlOiBUaXBweUluc3RhbmNlO1xuICBwcm90ZWN0ZWQgdmlld1JlZjogVmlld1JlZjtcbiAgcHJvdGVjdGVkIGRlc3Ryb3llZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByb3RlY3RlZCBwcm9wczogUGFydGlhbDxUaXBweUNvbmZpZz47XG4gIHByb3RlY3RlZCBlbmFibGVkID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIHZhcmlhdGlvbkRlZmluZWQgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHZpZXdPcHRpb25zJDogVmlld09wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFdlIGhhZCB1c2UgYHZpc2libGVgIGV2ZW50IGVtaXR0ZXIgcHJldmlvdXNseSBhcyBhIGB0YWtlVW50aWxgIHN1YnNjcmliZXIgaW4gbXVsdGlwbGUgcGxhY2VzXG4gICAqIHdpdGhpbiB0aGUgZGlyZWN0aXZlLlxuICAgKiBUaGlzIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seTsgdGh1cyB3ZSBkb24ndCBoYXZlIHRvIGRlYWwgd2l0aCB0aGUgYHZpc2libGVgIGV2ZW50IGVtaXR0ZXJcbiAgICogYW5kIHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbnMgb25seSB3aGVuIHRoZSBgdmlzaWJsZWAgZXZlbnQgaXMgYmVpbmcgbGlzdGVuZWQgb3V0c2lkZVxuICAgKiBpbiB0aGUgdGVtcGxhdGUgKGA8YnV0dG9uIFt0aXBweV09XCIuLi5cIiAodmlzaWJsZSk9XCIuLi5cIj48L2J1dHRvbj5gKS5cbiAgICovXG4gIHByb3RlY3RlZCB2aXNpYmxlSW50ZXJuYWwgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByb3RlY3RlZCBwbGF0Zm9ybUlkOiBzdHJpbmcsXG4gICAgQEluamVjdChUSVBQWV9DT05GSUcpIHByb3RlY3RlZCBnbG9iYWxDb25maWc6IFRpcHB5Q29uZmlnLFxuICAgIHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJvdGVjdGVkIHZpZXdTZXJ2aWNlOiBWaWV3U2VydmljZSxcbiAgICBwcm90ZWN0ZWQgdmNyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByb3RlY3RlZCB6b25lOiBOZ1pvbmUsXG4gICAgcHJvdGVjdGVkIGhvc3RSZWY6IEVsZW1lbnRSZWZcbiAgKSB7fVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IE5nQ2hhbmdlczxUaXBweURpcmVjdGl2ZT4pIHtcbiAgICBpZiAoaXNQbGF0Zm9ybVNlcnZlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG5cbiAgICBsZXQgcHJvcHM6IFBhcnRpYWw8VGlwcHlDb25maWc+ID0gT2JqZWN0LmtleXMoY2hhbmdlcykucmVkdWNlKChhY2MsIGNoYW5nZSkgPT4ge1xuICAgICAgaWYgKGNoYW5nZSA9PT0gJ2lzVmlzaWJsZScpIHJldHVybiBhY2M7XG5cbiAgICAgIGFjY1tjaGFuZ2VdID0gY2hhbmdlc1tjaGFuZ2VdLmN1cnJlbnRWYWx1ZTtcblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG5cbiAgICBsZXQgdmFyaWF0aW9uOiBzdHJpbmc7XG5cbiAgICBpZiAoaXNDaGFuZ2VkPE5nQ2hhbmdlczxUaXBweURpcmVjdGl2ZT4+KCd2YXJpYXRpb24nLCBjaGFuZ2VzKSkge1xuICAgICAgdmFyaWF0aW9uID0gY2hhbmdlcy52YXJpYXRpb24uY3VycmVudFZhbHVlO1xuICAgICAgdGhpcy52YXJpYXRpb25EZWZpbmVkID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnZhcmlhdGlvbkRlZmluZWQpIHtcbiAgICAgIHZhcmlhdGlvbiA9IHRoaXMuZ2xvYmFsQ29uZmlnLmRlZmF1bHRWYXJpYXRpb247XG4gICAgICB0aGlzLnZhcmlhdGlvbkRlZmluZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICh2YXJpYXRpb24pIHtcbiAgICAgIHByb3BzID0ge1xuICAgICAgICAuLi50aGlzLmdsb2JhbENvbmZpZy52YXJpYXRpb25zW3ZhcmlhdGlvbl0sXG4gICAgICAgIC4uLnByb3BzXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChpc0NoYW5nZWQ8TmdDaGFuZ2VzPFRpcHB5RGlyZWN0aXZlPj4oJ2lzRW5hYmxlZCcsIGNoYW5nZXMpKSB7XG4gICAgICB0aGlzLmVuYWJsZWQgPSBjaGFuZ2VzLmlzRW5hYmxlZC5jdXJyZW50VmFsdWU7XG4gICAgICB0aGlzLnNldFN0YXR1cygpO1xuICAgIH1cblxuICAgIGlmIChpc0NoYW5nZWQ8TmdDaGFuZ2VzPFRpcHB5RGlyZWN0aXZlPj4oJ2lzVmlzaWJsZScsIGNoYW5nZXMpKSB7XG4gICAgICB0aGlzLmlzVmlzaWJsZSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRQcm9wcyh7IC4uLnRoaXMucHJvcHMsIC4uLnByb3BzIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMudXNlSG9zdFdpZHRoKSB7XG4gICAgICB0aGlzLnByb3BzLm1heFdpZHRoID0gdGhpcy5ob3N0V2lkdGg7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGlmIChpc1BsYXRmb3JtU2VydmVyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcblxuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc0xhenkpIHtcbiAgICAgICAgaWYgKHRoaXMub25seVRleHRPdmVyZmxvdykge1xuICAgICAgICAgIGluVmlldyh0aGlzLmhvc3QpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IG92ZXJmbG93Q2hhbmdlcyh0aGlzLmhvc3QpKSxcbiAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZShpc0VsZW1lbnRPdmVyZmxvdyA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuY2hlY2tPdmVyZmxvdyhpc0VsZW1lbnRPdmVyZmxvdyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpblZpZXcodGhpcy5ob3N0KVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUluc3RhbmNlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLm9ubHlUZXh0T3ZlcmZsb3cpIHtcbiAgICAgICAgb3ZlcmZsb3dDaGFuZ2VzKHRoaXMuaG9zdClcbiAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoaXNFbGVtZW50T3ZlcmZsb3cgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaGVja092ZXJmbG93KGlzRWxlbWVudE92ZXJmbG93KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3JlYXRlSW5zdGFuY2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveWVkLm5leHQoKTtcbiAgICB0aGlzLmluc3RhbmNlPy5kZXN0cm95KCk7XG4gICAgdGhpcy5kZXN0cm95VmlldygpO1xuICB9XG5cbiAgZGVzdHJveVZpZXcoKSB7XG4gICAgdGhpcy52aWV3T3B0aW9ucyQgPSBudWxsO1xuICAgIHRoaXMudmlld1JlZj8uZGVzdHJveSgpO1xuICAgIHRoaXMudmlld1JlZiA9IG51bGw7XG4gIH1cblxuICBzaG93KCkge1xuICAgIHRoaXMuaW5zdGFuY2U/LnNob3coKTtcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgdGhpcy5pbnN0YW5jZT8uaGlkZSgpO1xuICB9XG5cbiAgZW5hYmxlKCkge1xuICAgIHRoaXMuaW5zdGFuY2U/LmVuYWJsZSgpO1xuICB9XG5cbiAgZGlzYWJsZSgpIHtcbiAgICB0aGlzLmluc3RhbmNlPy5kaXNhYmxlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0UHJvcHMocHJvcHM6IFBhcnRpYWw8VGlwcHlDb25maWc+KSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgIHRoaXMuaW5zdGFuY2U/LnNldFByb3BzKG9ubHlUaXBweVByb3BzKHByb3BzKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0U3RhdHVzKCkge1xuICAgIHRoaXMuZW5hYmxlZCA/IHRoaXMuaW5zdGFuY2U/LmVuYWJsZSgpIDogdGhpcy5pbnN0YW5jZT8uZGlzYWJsZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBob3N0KCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5jdXN0b21Ib3N0IHx8IHRoaXMuaG9zdFJlZi5uYXRpdmVFbGVtZW50O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBob3N0V2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5ob3N0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZUluc3RhbmNlKCkge1xuICAgIGlmICghdGhpcy5jb250ZW50ICYmICFjb2VyY2VCb29sZWFuSW5wdXQodGhpcy51c2VUZXh0Q29udGVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5pbnN0YW5jZSA9IHRpcHB5KHRoaXMuaG9zdCwge1xuICAgICAgICBhbGxvd0hUTUw6IHRydWUsXG4gICAgICAgIGFwcGVuZFRvOiBkb2N1bWVudC5ib2R5LFxuICAgICAgICAuLi5vbmx5VGlwcHlQcm9wcyh0aGlzLmdsb2JhbENvbmZpZyksXG4gICAgICAgIC4uLm9ubHlUaXBweVByb3BzKHRoaXMucHJvcHMpLFxuICAgICAgICBvbk1vdW50OiBpbnN0YW5jZSA9PiB7XG4gICAgICAgICAgdGhpcy5pc1Zpc2libGUgPSB0cnVlO1xuICAgICAgICAgIHRoaXMudmlzaWJsZUludGVybmFsLm5leHQodGhpcy5pc1Zpc2libGUpO1xuICAgICAgICAgIGlmICh0aGlzLnZpc2libGUub2JzZXJ2ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4gdGhpcy52aXNpYmxlLm5leHQodGhpcy5pc1Zpc2libGUpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy51c2VIb3N0V2lkdGggJiYgdGhpcy5saXN0ZW5Ub0hvc3RSZXNpemUoKTtcbiAgICAgICAgICB0aGlzLmdsb2JhbENvbmZpZy5vbk1vdW50Py4oaW5zdGFuY2UpO1xuICAgICAgICB9LFxuICAgICAgICBvbkNyZWF0ZTogaW5zdGFuY2UgPT4ge1xuICAgICAgICAgIGluc3RhbmNlLnBvcHBlci5jbGFzc0xpc3QuYWRkKGB0aXBweS12YXJpYXRpb24tJHt0aGlzLnZhcmlhdGlvbiB8fCB0aGlzLmdsb2JhbENvbmZpZy5kZWZhdWx0VmFyaWF0aW9ufWApO1xuICAgICAgICAgIGlmICh0aGlzLmNsYXNzTmFtZSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrbGFzcyBvZiBub3JtYWxpemVDbGFzc05hbWUodGhpcy5jbGFzc05hbWUpKSB7XG4gICAgICAgICAgICAgIGluc3RhbmNlLnBvcHBlci5jbGFzc0xpc3QuYWRkKGtsYXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5nbG9iYWxDb25maWcub25DcmVhdGU/LihpbnN0YW5jZSk7XG4gICAgICAgICAgaWYgKHRoaXMuaXNWaXNpYmxlID09PSB0cnVlKSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5zaG93KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvblNob3c6IGluc3RhbmNlID0+IHtcbiAgICAgICAgICBpbnN0YW5jZS5yZWZlcmVuY2Uuc2V0QXR0cmlidXRlKCdkYXRhLXRpcHB5LW9wZW4nLCAnJyk7XG4gICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5yZXNvbHZlQ29udGVudChpbnN0YW5jZSk7XG4gICAgICAgICAgICBpZiAoaXNTdHJpbmcoY29udGVudCkpIHtcbiAgICAgICAgICAgICAgaW5zdGFuY2Uuc2V0UHJvcHMoeyBhbGxvd0hUTUw6IGZhbHNlIH0pO1xuXG4gICAgICAgICAgICAgIGlmICghY29udGVudD8udHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmFibGUoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnN0YW5jZS5zZXRDb250ZW50KGNvbnRlbnQpO1xuICAgICAgICAgICAgdGhpcy5oaWRlT25Fc2NhcGUgJiYgdGhpcy5oYW5kbGVFc2NhcGVCdXR0b24oKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAodGhpcy51c2VIb3N0V2lkdGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5zdGFuY2VXaWR0aChpbnN0YW5jZSwgdGhpcy5ob3N0V2lkdGgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wb3BwZXJXaWR0aCkge1xuICAgICAgICAgICAgdGhpcy5zZXRJbnN0YW5jZVdpZHRoKGluc3RhbmNlLCB0aGlzLnBvcHBlcldpZHRoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5nbG9iYWxDb25maWcub25TaG93Py4oaW5zdGFuY2UpO1xuICAgICAgICB9LFxuICAgICAgICBvbkhpZGUoaW5zdGFuY2UpIHtcbiAgICAgICAgICBpbnN0YW5jZS5yZWZlcmVuY2UucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXRpcHB5LW9wZW4nKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25IaWRkZW46IGluc3RhbmNlID0+IHtcbiAgICAgICAgICB0aGlzLmRlc3Ryb3lWaWV3KCk7XG4gICAgICAgICAgdGhpcy5pc1Zpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnZpc2libGVJbnRlcm5hbC5uZXh0KHRoaXMuaXNWaXNpYmxlKTtcbiAgICAgICAgICBpZiAodGhpcy52aXNpYmxlLm9ic2VydmVkKSB7XG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMudmlzaWJsZS5uZXh0KHRoaXMuaXNWaXNpYmxlKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZ2xvYmFsQ29uZmlnLm9uSGlkZGVuPy4oaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zZXRTdGF0dXMoKTtcbiAgICAgIHRoaXMuc2V0UHJvcHModGhpcy5wcm9wcyk7XG5cbiAgICAgIHRoaXMudmFyaWF0aW9uID09PSAnY29udGV4dE1lbnUnICYmIHRoaXMuaGFuZGxlQ29udGV4dE1lbnUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvbHZlQ29udGVudChpbnN0YW5jZTogVGlwcHlJbnN0YW5jZSkge1xuICAgIGlmICghdGhpcy52aWV3T3B0aW9ucyQgJiYgIWlzU3RyaW5nKHRoaXMuY29udGVudCkpIHtcbiAgICAgIGlmIChpc0NvbXBvbmVudCh0aGlzLmNvbnRlbnQpKSB7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UuZGF0YSA9IHRoaXMuZGF0YTtcbiAgICAgICAgdGhpcy52aWV3T3B0aW9ucyQgPSB7XG4gICAgICAgICAgaW5qZWN0b3I6IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByb3ZpZGU6IFRJUFBZX1JFRixcbiAgICAgICAgICAgICAgICB1c2VWYWx1ZTogdGhpcy5pbnN0YW5jZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcGFyZW50OiB0aGlzLmluamVjdG9yXG4gICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoaXNUZW1wbGF0ZVJlZih0aGlzLmNvbnRlbnQpKSB7XG4gICAgICAgIHRoaXMudmlld09wdGlvbnMkID0ge1xuICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICRpbXBsaWNpdDogdGhpcy5oaWRlLmJpbmQodGhpcyksXG4gICAgICAgICAgICBkYXRhOiB0aGlzLmRhdGFcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy52aWV3UmVmID0gdGhpcy52aWV3U2VydmljZS5jcmVhdGVWaWV3KHRoaXMuY29udGVudCwge1xuICAgICAgdmNyOiB0aGlzLnZjcixcbiAgICAgIC4uLnRoaXMudmlld09wdGlvbnMkXG4gICAgfSk7XG5cbiAgICAvLyBXZSBuZWVkIHRvIGNhbGwgZGV0ZWN0Q2hhbmdlcyBmb3Igb25QdXNoIGNvbXBvbmVudHMgdG8gdXBkYXRlIHRoZSBjb250ZW50XG4gICAgaWYgKHRoaXMuZGV0ZWN0Q2hhbmdlc0NvbXBvbmVudCAmJiBpc0NvbXBvbmVudCh0aGlzLmNvbnRlbnQpKSB7XG4gICAgICB0aGlzLnZpZXdSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIGxldCBjb250ZW50ID0gdGhpcy52aWV3UmVmLmdldEVsZW1lbnQoKTtcblxuICAgIGlmIChjb2VyY2VCb29sZWFuSW5wdXQodGhpcy51c2VUZXh0Q29udGVudCkpIHtcbiAgICAgIGNvbnRlbnQgPSBpbnN0YW5jZS5yZWZlcmVuY2UudGV4dENvbnRlbnQ7XG4gICAgfVxuXG4gICAgaWYgKGlzU3RyaW5nKGNvbnRlbnQpICYmIHRoaXMuZ2xvYmFsQ29uZmlnLmJlZm9yZVJlbmRlcikge1xuICAgICAgY29udGVudCA9IHRoaXMuZ2xvYmFsQ29uZmlnLmJlZm9yZVJlbmRlcihjb250ZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVDb250ZXh0TWVudSgpIHtcbiAgICBmcm9tRXZlbnQodGhpcy5ob3N0LCAnY29udGV4dG1lbnUnKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkKSlcbiAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgdGhpcy5pbnN0YW5jZS5zZXRQcm9wcyh7XG4gICAgICAgICAgZ2V0UmVmZXJlbmNlQ2xpZW50UmVjdDogKCkgPT5cbiAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgIHdpZHRoOiAwLFxuICAgICAgICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgICAgICAgIHRvcDogZXZlbnQuY2xpZW50WSxcbiAgICAgICAgICAgICAgYm90dG9tOiBldmVudC5jbGllbnRZLFxuICAgICAgICAgICAgICBsZWZ0OiBldmVudC5jbGllbnRYLFxuICAgICAgICAgICAgICByaWdodDogZXZlbnQuY2xpZW50WFxuICAgICAgICAgICAgfSBhcyBET01SZWN0UmVhZE9ubHkpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuaW5zdGFuY2Uuc2hvdygpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlRXNjYXBlQnV0dG9uKCk6IHZvaWQge1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBmcm9tRXZlbnQoZG9jdW1lbnQuYm9keSwgJ2tleWRvd24nKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIoKHsgY29kZSB9OiBLZXlib2FyZEV2ZW50KSA9PiBjb2RlID09PSAnRXNjYXBlJyksXG4gICAgICAgICAgdGFrZVVudGlsKG1lcmdlKHRoaXMuZGVzdHJveWVkLCB0aGlzLnZpc2libGVJbnRlcm5hbC5waXBlKGZpbHRlcih2ID0+ICF2KSkpKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5oaWRlKCkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrT3ZlcmZsb3coaXNFbGVtZW50T3ZlcmZsb3c6IGJvb2xlYW4pIHtcbiAgICBpZiAoaXNFbGVtZW50T3ZlcmZsb3cpIHtcbiAgICAgIGlmICghdGhpcy5pbnN0YW5jZSkge1xuICAgICAgICB0aGlzLmNyZWF0ZUluc3RhbmNlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmluc3RhbmNlLmVuYWJsZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmluc3RhbmNlPy5kaXNhYmxlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGxpc3RlblRvSG9zdFJlc2l6ZSgpIHtcbiAgICBkaW1lbnNpb25zQ2hhbmdlcyh0aGlzLmhvc3QpXG4gICAgICAucGlwZSh0YWtlVW50aWwobWVyZ2UodGhpcy5kZXN0cm95ZWQsIHRoaXMudmlzaWJsZUludGVybmFsKSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5zZXRJbnN0YW5jZVdpZHRoKHRoaXMuaW5zdGFuY2UsIHRoaXMuaG9zdFdpZHRoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldEluc3RhbmNlV2lkdGgoaW5zdGFuY2U6IEluc3RhbmNlLCB3aWR0aDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgY29uc3QgaW5QaXhlbHMgPSBjb2VyY2VDc3NQaXhlbFZhbHVlKHdpZHRoKTtcbiAgICBpbnN0YW5jZS5wb3BwZXIuc3R5bGUud2lkdGggPSBpblBpeGVscztcbiAgICBpbnN0YW5jZS5wb3BwZXIuc3R5bGUubWF4V2lkdGggPSBpblBpeGVscztcbiAgICAoaW5zdGFuY2UucG9wcGVyLmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5tYXhXaWR0aCA9IGluUGl4ZWxzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ2hhbmdlZDxUIGV4dGVuZHMgb2JqZWN0PihrZXk6IGtleW9mIFQsIGNoYW5nZXM6IFQpIHtcbiAgcmV0dXJuIGtleSBpbiBjaGFuZ2VzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29lcmNlQm9vbGVhbklucHV0KHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgYCR7dmFsdWV9YCAhPT0gJ2ZhbHNlJztcbn1cbiJdfQ==