@aquera/ngx-smart-table 0.0.17-patch-0.3 → 0.0.17-patch-0.4

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.
@@ -16,11 +16,13 @@ function injectCodeEditorStyles() {
16
16
  const style = document.createElement('style');
17
17
  style.id = styleId;
18
18
  style.textContent = `
19
- /* Nile Code Editor cell styling */
19
+ /* Nile Code Editor cell styling - constrained to cell height */
20
20
  nile-code-editor.st-cell-editor {
21
21
  display: block;
22
22
  width: 100%;
23
23
  height: 100%;
24
+ max-height: 32px;
25
+ overflow: hidden;
24
26
  font-size: inherit !important;
25
27
  font-family: inherit !important;
26
28
  line-height: inherit !important;
@@ -28,19 +30,31 @@ function injectCodeEditorStyles() {
28
30
  nile-code-editor.st-cell-editor::part(code-editor-base) {
29
31
  border: none !important;
30
32
  min-height: 100% !important;
33
+ max-height: 32px !important;
31
34
  background: transparent !important;
32
35
  font-size: inherit !important;
33
36
  font-family: inherit !important;
34
37
  line-height: inherit !important;
38
+ overflow: hidden !important;
35
39
  }
36
40
  /* Ensure proper sizing within table cell */
37
41
  .st-nile-code-editor {
38
42
  width: 100%;
39
43
  height: 100%;
44
+ max-height: 32px;
40
45
  min-height: 28px;
41
46
  font-size: inherit !important;
47
+ overflow: hidden;
48
+ }
49
+ /* CodeMirror content should inherit font size and be constrained */
50
+ nile-code-editor.st-cell-editor .cm-editor {
51
+ max-height: 32px !important;
52
+ overflow: hidden !important;
53
+ }
54
+ nile-code-editor.st-cell-editor .cm-scroller {
55
+ max-height: 32px !important;
56
+ overflow: hidden !important;
42
57
  }
43
- /* CodeMirror content should inherit font size */
44
58
  nile-code-editor.st-cell-editor .cm-content,
45
59
  nile-code-editor.st-cell-editor .cm-line {
46
60
  font-size: inherit !important;
@@ -53,12 +67,15 @@ function injectCodeEditorStyles() {
53
67
  align-items: center;
54
68
  width: 100%;
55
69
  height: 100%;
70
+ max-height: 32px;
56
71
  gap: 4px;
57
72
  }
58
73
  .st-code-editor-wrapper .st-code-editor-input {
59
74
  flex: 1;
60
75
  min-width: 0;
61
76
  height: 100%;
77
+ max-height: 32px;
78
+ overflow: hidden;
62
79
  }
63
80
  .st-code-editor-wrapper .st-expand-button {
64
81
  display: flex;
@@ -79,13 +96,22 @@ function injectCodeEditorStyles() {
79
96
  background: var(--nile-color-neutral-100, #f3f4f6);
80
97
  color: var(--nile-color-neutral-700, #374151);
81
98
  }
82
- /* Dialog code editor styling */
99
+ /* Dialog code editor styling - fixed header/footer, scrollable content */
83
100
  .st-code-editor-dialog::part(panel) {
84
101
  max-height: var(--max-height, 80vh) !important;
85
102
  overflow: hidden !important;
103
+ display: flex !important;
104
+ flex-direction: column !important;
105
+ }
106
+ .st-code-editor-dialog::part(header) {
107
+ flex-shrink: 0 !important;
86
108
  }
87
109
  .st-code-editor-dialog::part(body) {
88
- overflow: auto !important;
110
+ overflow: hidden !important;
111
+ flex: 1 !important;
112
+ display: flex !important;
113
+ flex-direction: column !important;
114
+ padding: 0 !important;
89
115
  }
90
116
  .st-code-editor-dialog nile-code-editor {
91
117
  width: 100%;
@@ -94,14 +120,6 @@ function injectCodeEditorStyles() {
94
120
  .st-code-editor-dialog nile-code-editor::part(code-editor-base) {
95
121
  border: 1px solid var(--nile-color-neutral-200, #e5e7eb) !important;
96
122
  border-radius: 4px !important;
97
- overflow: auto !important;
98
- min-height: var(--dialog-editor-min-height, 300px) !important;
99
- }
100
- .st-code-editor-dialog nile-code-editor .cm-editor {
101
- min-height: var(--dialog-editor-min-height, 300px) !important;
102
- }
103
- .st-code-editor-dialog nile-code-editor .cm-content {
104
- min-height: var(--dialog-editor-min-height, 300px) !important;
105
123
  }
106
124
  `;
107
125
  document.head.appendChild(style);
@@ -118,6 +136,10 @@ export class NileCodeEditor {
118
136
  this.dialogOpen = false;
119
137
  this.expandButtonClicked = false;
120
138
  this.trackedValue = null;
139
+ this.syncingFromDialog = false; // Flag to prevent inline editor from overwriting multiline content
140
+ this.userEditedInline = false; // Flag to track if user has typed in inline editor
141
+ this.dialogOriginalValue = ''; // Store original value when dialog opens
142
+ this.dialogCurrentValue = ''; // Track current value in dialog
121
143
  }
122
144
  edit(context) {
123
145
  if (!context.container) {
@@ -125,7 +147,10 @@ export class NileCodeEditor {
125
147
  return;
126
148
  }
127
149
  this.context = context;
128
- this.trackedValue = null;
150
+ // Initialize tracked value from context
151
+ this.trackedValue = String(context.value ?? '');
152
+ this.syncingFromDialog = false;
153
+ this.userEditedInline = false;
129
154
  // Inject global styles once
130
155
  injectCodeEditorStyles();
131
156
  // Check if we should show expand button (default: true)
@@ -145,6 +170,11 @@ export class NileCodeEditor {
145
170
  this.editor.style.height = '100%';
146
171
  this.editor.style.boxSizing = 'border-box';
147
172
  this.editor.noborder = this.options?.noborder !== false;
173
+ // Enable multiline by default for inline editor to support paste and multiline content
174
+ this.editor.multiline = this.options?.multiline !== false;
175
+ this.editor.hasScroller = true;
176
+ // No line numbers for inline editor
177
+ this.editor.lineNumbers = false;
148
178
  editorContainer.appendChild(this.editor);
149
179
  this.wrapper.appendChild(editorContainer);
150
180
  // Create expand button
@@ -178,6 +208,11 @@ export class NileCodeEditor {
178
208
  this.editor.style.height = '100%';
179
209
  this.editor.style.boxSizing = 'border-box';
180
210
  this.editor.noborder = this.options?.noborder !== false;
211
+ // Enable multiline by default for inline editor to support paste and multiline content
212
+ this.editor.multiline = this.options?.multiline !== false;
213
+ this.editor.hasScroller = true;
214
+ // No line numbers for inline editor
215
+ this.editor.lineNumbers = false;
181
216
  // Clear container and append editor
182
217
  context.container.innerHTML = '';
183
218
  context.container.appendChild(this.editor);
@@ -228,8 +263,17 @@ export class NileCodeEditor {
228
263
  /**
229
264
  * Read the live value directly from CodeMirror's internal state,
230
265
  * bypassing debounced nile-change events and the possibly-stale .value property.
266
+ *
267
+ * Priority order:
268
+ * 1. trackedValue - always up to date from change events
269
+ * 2. CodeMirror internal state - for real-time reading
270
+ * 3. editor.value property - fallback
231
271
  */
232
272
  getLiveEditorValue() {
273
+ // Use tracked value if available (updated by change events)
274
+ if (this.trackedValue !== null) {
275
+ return this.trackedValue;
276
+ }
233
277
  if (!this.editor)
234
278
  return '';
235
279
  try {
@@ -244,8 +288,6 @@ export class NileCodeEditor {
244
288
  catch {
245
289
  // Fall through to other methods
246
290
  }
247
- if (this.trackedValue !== null)
248
- return this.trackedValue;
249
291
  return this.editor.value ?? '';
250
292
  }
251
293
  /**
@@ -256,6 +298,8 @@ export class NileCodeEditor {
256
298
  return;
257
299
  this.dialogOpen = true;
258
300
  this.expandButtonClicked = false; // Reset flag now that dialog is opening
301
+ // Store original value for cancel functionality
302
+ this.dialogOriginalValue = this.getLiveEditorValue();
259
303
  // Create dialog with configurable dimensions
260
304
  const dialogWidth = this.options?.dialogWidth || '600px';
261
305
  const dialogMaxHeight = this.options?.dialogMaxHeight || '80vh';
@@ -266,26 +310,26 @@ export class NileCodeEditor {
266
310
  this.dialog.label = dialogTitle;
267
311
  this.dialog.style.setProperty('--width', dialogWidth);
268
312
  this.dialog.style.setProperty('--max-height', dialogMaxHeight);
269
- // Create dialog content
313
+ // Create dialog content wrapper - flex column to handle fixed header/footer
314
+ const contentWrapper = document.createElement('div');
315
+ contentWrapper.style.display = 'flex';
316
+ contentWrapper.style.flexDirection = 'column';
317
+ contentWrapper.style.height = `calc(${dialogMaxHeight} - 60px)`; // Account for dialog header
318
+ contentWrapper.style.maxHeight = `calc(${dialogMaxHeight} - 60px)`;
319
+ // Create editor content area - this is the scrollable part
270
320
  const content = document.createElement('div');
271
321
  content.style.padding = '16px';
272
- content.style.maxHeight = `calc(${dialogMaxHeight} - 80px)`;
322
+ content.style.paddingBottom = '8px';
323
+ content.style.flex = '1';
273
324
  content.style.overflow = 'auto';
325
+ content.style.minHeight = '0'; // Important for flex shrinking
274
326
  // Create full editor
275
327
  this.dialogEditor = document.createElement('nile-code-editor');
276
- const minLines = this.options?.dialogMinLines ?? 20;
277
- const currentValue = this.getLiveEditorValue();
278
- const currentLineCount = (currentValue.match(/\n/g) || []).length + 1;
279
- const paddingLines = Math.max(0, minLines - currentLineCount);
280
- this.dialogEditor.value = currentValue + '\n'.repeat(paddingLines);
328
+ this.dialogEditor.value = this.dialogOriginalValue;
281
329
  this.dialogEditor.multiline = true;
282
330
  this.dialogEditor.lineNumbersMultiline = true;
283
331
  this.dialogEditor.hasScroller = true;
284
- const lineHeightPx = 20;
285
- const minHeightFromLines = `${minLines * lineHeightPx}px`;
286
- this.dialogEditor.style.minHeight = `max(${dialogEditorHeight}, ${minHeightFromLines})`;
287
- this.dialogEditor.style.maxHeight = `calc(${dialogMaxHeight} - 120px)`;
288
- content.style.setProperty('--dialog-editor-min-height', `max(${dialogEditorHeight}, ${minHeightFromLines})`);
332
+ this.dialogEditor.style.minHeight = dialogEditorHeight;
289
333
  // Apply same options to dialog editor
290
334
  if (this.options?.language) {
291
335
  this.dialogEditor.language = this.options.language;
@@ -312,38 +356,44 @@ export class NileCodeEditor {
312
356
  this.dialogEditor.customThemeCSS = this.options.customThemeCSS;
313
357
  }
314
358
  this.dialogEditor.expandable = false;
315
- // Real-time sync: Update cell editor whenever dialog editor changes
359
+ // Initialize dialog current value
360
+ this.dialogCurrentValue = this.dialogOriginalValue;
361
+ // Track changes in dialog editor
316
362
  this.dialogEditor.addEventListener('nile-change', (e) => {
317
- const dialogValue = e.detail?.value || '';
318
- this.trackedValue = dialogValue;
319
- if (this.editor) {
320
- this.editor.value = dialogValue;
321
- }
322
- if (this.context) {
323
- this.context.onChange(dialogValue);
324
- }
363
+ this.dialogCurrentValue = e.detail?.value ?? '';
325
364
  });
326
365
  content.appendChild(this.dialogEditor);
327
- this.dialog.appendChild(content);
328
- // Handle dialog close events (clicking X button - stay in edit mode)
366
+ contentWrapper.appendChild(content);
367
+ // Create footer with Ok button - fixed at bottom
368
+ const footer = document.createElement('div');
369
+ footer.style.display = 'flex';
370
+ footer.style.justifyContent = 'flex-end';
371
+ footer.style.padding = '12px 16px';
372
+ footer.style.borderTop = '1px solid var(--nile-color-neutral-200, #e5e7eb)';
373
+ footer.style.gap = '8px';
374
+ footer.style.flexShrink = '0'; // Prevent footer from shrinking
375
+ footer.style.backgroundColor = 'var(--nile-color-neutral-0, #ffffff)';
376
+ const okButton = document.createElement('nile-button');
377
+ okButton.setAttribute('variant', 'primary');
378
+ okButton.textContent = 'Ok';
379
+ okButton.addEventListener('click', () => {
380
+ this.applyDialogChanges();
381
+ });
382
+ footer.appendChild(okButton);
383
+ contentWrapper.appendChild(footer);
384
+ this.dialog.appendChild(contentWrapper);
385
+ // Handle dialog close events (clicking X button - cancel changes)
329
386
  this.dialog.addEventListener('nile-request-close', (e) => {
330
- const customEvent = e;
331
- // Check if close was triggered by overlay click (clicking outside)
332
- if (customEvent.detail?.source === 'overlay') {
333
- // Clicking outside the dialog - save and exit edit mode
334
- this.closeDialog(true);
335
- }
336
- else {
337
- // Clicking X button - stay in edit mode
338
- this.closeDialog(false);
339
- }
387
+ e.preventDefault();
388
+ // X button or overlay click - cancel changes
389
+ this.cancelDialogChanges();
340
390
  });
341
- // Handle Escape key in dialog - stay in edit mode
391
+ // Handle Escape key in dialog - cancel changes
342
392
  this.dialog.addEventListener('keydown', (e) => {
343
393
  if (e.key === 'Escape') {
344
394
  e.preventDefault();
345
395
  e.stopPropagation();
346
- this.closeDialog(false);
396
+ this.cancelDialogChanges();
347
397
  }
348
398
  });
349
399
  // Append to body and show
@@ -360,34 +410,113 @@ export class NileCodeEditor {
360
410
  }, 0);
361
411
  }
362
412
  /**
363
- * Close the dialog and optionally save/exit edit mode
413
+ * Get the current value from the dialog editor
414
+ */
415
+ getDialogEditorValue() {
416
+ // Use tracked value from change events (most reliable)
417
+ if (this.dialogCurrentValue) {
418
+ return this.dialogCurrentValue.replace(/\n+$/, '');
419
+ }
420
+ if (!this.dialogEditor)
421
+ return this.dialogOriginalValue;
422
+ // Try to get value from CodeMirror's internal state
423
+ try {
424
+ const shadowRoot = this.dialogEditor.shadowRoot;
425
+ if (shadowRoot) {
426
+ const cmEditor = shadowRoot.querySelector('.cm-editor');
427
+ if (cmEditor?.cmView?.view) {
428
+ const value = cmEditor.cmView.view.state.doc.toString();
429
+ return value.replace(/\n+$/, '');
430
+ }
431
+ }
432
+ }
433
+ catch {
434
+ // Fall through to other methods
435
+ }
436
+ // Fallback to value property
437
+ const value = this.dialogEditor.value;
438
+ return (value ?? '').replace(/\n+$/, '');
439
+ }
440
+ /**
441
+ * Apply changes from dialog and close it
442
+ */
443
+ applyDialogChanges() {
444
+ if (!this.dialogOpen)
445
+ return;
446
+ // Get the value from dialog editor - try multiple sources
447
+ let dialogValue = this.dialogCurrentValue;
448
+ // If no tracked value, try reading directly from dialog editor
449
+ if (!dialogValue && this.dialogEditor) {
450
+ try {
451
+ const shadowRoot = this.dialogEditor.shadowRoot;
452
+ if (shadowRoot) {
453
+ const cmEditor = shadowRoot.querySelector('.cm-editor');
454
+ if (cmEditor?.cmView?.view) {
455
+ dialogValue = cmEditor.cmView.view.state.doc.toString();
456
+ }
457
+ }
458
+ }
459
+ catch {
460
+ // Fall through
461
+ }
462
+ // Fallback to value property
463
+ if (!dialogValue) {
464
+ dialogValue = this.dialogEditor.value ?? '';
465
+ }
466
+ }
467
+ // Strip trailing newlines
468
+ dialogValue = (dialogValue || '').replace(/\n+$/, '');
469
+ // Update tracked value and inline editor
470
+ this.trackedValue = dialogValue;
471
+ this.userEditedInline = false;
472
+ this.syncingFromDialog = true;
473
+ if (this.editor) {
474
+ this.editor.value = dialogValue;
475
+ }
476
+ setTimeout(() => {
477
+ this.syncingFromDialog = false;
478
+ }, 0);
479
+ // Notify context of the change
480
+ if (this.context) {
481
+ this.context.onChange(dialogValue);
482
+ }
483
+ // Close dialog
484
+ this.closeDialogUI();
485
+ // Refocus the cell editor to stay in edit mode
486
+ setTimeout(() => {
487
+ this.focusEditor();
488
+ }, 50);
489
+ }
490
+ /**
491
+ * Cancel dialog changes and revert to original value
364
492
  */
365
- closeDialog(saveAndExit = false) {
493
+ cancelDialogChanges() {
366
494
  if (!this.dialogOpen)
367
495
  return;
368
- // Reset flag immediately so document click handler works
496
+ // Revert to original value (don't change anything)
497
+ // trackedValue and inline editor remain as they were before dialog opened
498
+ // Close dialog
499
+ this.closeDialogUI();
500
+ // Refocus the cell editor to stay in edit mode
501
+ setTimeout(() => {
502
+ this.focusEditor();
503
+ }, 50);
504
+ }
505
+ /**
506
+ * Close and remove the dialog UI
507
+ */
508
+ closeDialogUI() {
369
509
  this.dialogOpen = false;
370
- // Close and remove dialog
510
+ this.dialogCurrentValue = '';
371
511
  if (this.dialog) {
372
512
  this.dialog.open = false;
373
513
  const dialogRef = this.dialog;
374
- const dialogEditorRef = this.dialogEditor;
375
514
  this.dialog = undefined;
376
515
  this.dialogEditor = undefined;
377
516
  // Remove from DOM after animation
378
517
  setTimeout(() => {
379
518
  dialogRef?.remove();
380
519
  }, 200);
381
- if (saveAndExit && this.context) {
382
- // Save and exit edit mode
383
- this.context.onSave(this.getCurrentValue());
384
- }
385
- else {
386
- // Refocus the cell editor to stay in edit mode
387
- setTimeout(() => {
388
- this.focusEditor();
389
- }, 50);
390
- }
391
520
  }
392
521
  }
393
522
  /**
@@ -549,6 +678,11 @@ export class NileCodeEditor {
549
678
  const changeHandler = (e) => {
550
679
  const customEvent = e;
551
680
  const newValue = customEvent.detail?.value ?? '';
681
+ // Don't process if we're syncing from dialog (prevents feedback loop)
682
+ if (this.syncingFromDialog) {
683
+ return;
684
+ }
685
+ // Update tracked value
552
686
  this.trackedValue = newValue;
553
687
  context.onChange(newValue);
554
688
  };
@@ -614,6 +748,11 @@ export class NileCodeEditor {
614
748
  this.expandButton = undefined;
615
749
  this.context = undefined;
616
750
  this.expandButtonClicked = false;
751
+ this.syncingFromDialog = false;
752
+ this.trackedValue = null;
753
+ this.userEditedInline = false;
754
+ this.dialogOriginalValue = '';
755
+ this.dialogCurrentValue = '';
617
756
  }
618
757
  focus() {
619
758
  this.editor?.focus();
@@ -639,4 +778,4 @@ export class NileCodeEditor {
639
778
  return this.editor;
640
779
  }
641
780
  }
642
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmlsZS1jb2RlLWVkaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvZWRpdG9ycy9uaWxlLWNvZGUtZWRpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQXFISDs7R0FFRztBQUNILElBQUksd0JBQXdCLEdBQUcsS0FBSyxDQUFDO0FBQ3JDLFNBQVMsc0JBQXNCO0lBQzdCLElBQUksd0JBQXdCO1FBQUUsT0FBTztJQUNyQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7SUFFaEMsTUFBTSxPQUFPLEdBQUcsOEJBQThCLENBQUM7SUFDL0MsSUFBSSxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU87SUFFN0MsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QyxLQUFLLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUNuQixLQUFLLENBQUMsV0FBVyxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0ZuQixDQUFDO0lBQ0YsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sY0FBYztJQWF6QixZQUE2QixPQUErQjtRQUEvQixZQUFPLEdBQVAsT0FBTyxDQUF3QjtRQVBwRCxtQkFBYyxHQUFxRCxFQUFFLENBQUM7UUFFdEUsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQix3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUFFNUIsaUJBQVksR0FBa0IsSUFBSSxDQUFDO0lBRW9CLENBQUM7SUFFaEUsSUFBSSxDQUFDLE9BQTZCO1FBQ2hDLElBQUksQ0FBQyxPQUFP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SCxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxFQUFrQixDQUFDO1FBQzVDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3hDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFpQixDQUFDO0lBQ25ELENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVEsQ0FBQyxLQUFRO1FBQ2YsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztTQUN6QztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEN1c3RvbSBlZGl0b3IgdXNpbmcgTmlsZUNvZGVFZGl0b3IgZnJvbSBAYXF1ZXJhL25pbGUtZWxlbWVudHNcbiAqIFRoaXMgcHJvdmlkZXMgY29kZSBlZGl0aW5nIGNhcGFiaWxpdGllcyB3aXRoIHN5bnRheCBoaWdobGlnaHRpbmcgZm9yIHRhYmxlIGNlbGxzXG4gKi9cblxuaW1wb3J0IHsgQ2VsbEVkaXRvciwgQ2VsbEVkaXRvckNvbnRleHQgfSBmcm9tICcuLi9tb2RlbHMvY2VsbC1zdHJhdGVnaWVzLmludGVyZmFjZSc7XG5cbi8qKlxuICogQXV0b2NvbXBsZXRpb24gaXRlbSBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZUVkaXRvckNvbXBsZXRpb24ge1xuICAvKiogVGhlIGNvbXBsZXRpb24gbGFiZWwgc2hvd24gaW4gZHJvcGRvd24gKi9cbiAgbGFiZWw6IHN0cmluZztcbiAgLyoqIFRoZSB2YWx1ZSB0byBpbnNlcnQgKi9cbiAgdmFsdWU/OiBzdHJpbmc7XG4gIC8qKiBPcHRpb25hbCBkZXNjcmlwdGlvbiAqL1xuICBkZXRhaWw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQXV0b2NvbXBsZXRlIHN0eWxlIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRvQ29tcGxldGVTdHlsZSB7XG4gIC8qKiBXaWR0aCBvZiB0aGUgYXV0b2NvbXBsZXRlIGRyb3Bkb3duICovXG4gIHdpZHRoPzogc3RyaW5nO1xuICAvKiogRW5hYmxlIG11bHRpbGluZSBjb250ZW50IGluIGF1dG9jb21wbGV0ZSAqL1xuICBtdWx0aWxpbmU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgaW50ZXJmYWNlIGZvciBOaWxlQ29kZUVkaXRvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5pbGVDb2RlRWRpdG9yT3B0aW9ucyB7XG4gIC8vIExhbmd1YWdlIGFuZCBzeW50YXhcbiAgLyoqIExhbmd1YWdlIG1vZGUgZm9yIHN5bnRheCBoaWdobGlnaHRpbmcgKi9cbiAgbGFuZ3VhZ2U/OiAnamF2YXNjcmlwdCcgfCAnc3FsJyB8ICdqc29uJyB8ICdodG1sJztcbiAgLyoqIERpc2FibGUgc3ludGF4IGhpZ2hsaWdodGluZyAqL1xuICBkaXNhYmxlU3ludGF4SGlnaGxpZ2h0aW5nPzogYm9vbGVhbjtcblxuICAvLyBFZGl0b3IgYXBwZWFyYW5jZVxuICAvKiogUGxhY2Vob2xkZXIgdGV4dCB3aGVuIGVtcHR5ICovXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAvKiogU2hvdyBsaW5lIG51bWJlcnMgKHNpbmdsZS1saW5lIG1vZGUpICovXG4gIGxpbmVOdW1iZXJzPzogYm9vbGVhbjtcbiAgLyoqIFNob3cgbGluZSBudW1iZXJzIGluIG11bHRpbGluZSBtb2RlICovXG4gIGxpbmVOdW1iZXJzTXVsdGlsaW5lPzogYm9vbGVhbjtcbiAgLyoqIEFsbG93IG11bHRpLWxpbmUgZWRpdGluZyAqL1xuICBtdWx0aWxpbmU/OiBib29sZWFuO1xuICAvKiogUmVuZGVyIHdpdGhvdXQgYm9yZGVyICovXG4gIG5vYm9yZGVyPzogYm9vbGVhbjtcbiAgLyoqIFVzZSBkZWZhdWx0IGZvbnQgaW5zdGVhZCBvZiBpbmhlcml0ICovXG4gIGRlZmF1bHRGb250PzogYm9vbGVhbjtcblxuICAvLyBFZGl0b3IgYmVoYXZpb3JcbiAgLyoqIEF1dG8gZm9jdXMgb24gZWRpdCAqL1xuICBhdXRvRm9jdXM/OiBib29sZWFuO1xuICAvKiogUmVhZC1vbmx5IG1vZGUgKi9cbiAgcmVhZG9ubHk/OiBib29sZWFuO1xuICAvKiogRGlzYWJsZWQgc3RhdGUgKi9cbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICAvKiogRW5hYmxlIFRhYi10by1jb21wbGV0ZSAqL1xuICB0YWJDb21wbGV0aW9uPzogYm9vbGVhbjtcbiAgLyoqIEVuYWJsZSBzZWFyY2gga2V5bWFwICovXG4gIGVuYWJsZVNlYXJjaD86IGJvb2xlYW47XG4gIC8qKiBTaG93IGNvZGUgZm9sZGluZyBndXR0ZXJzICovXG4gIGVuYWJsZUZvbGRHdXR0ZXJzPzogYm9vbGVhbjtcbiAgLyoqIEludGVybmFsIHNjcm9sbCBjb250YWluZXIgKi9cbiAgaGFzU2Nyb2xsZXI/OiBib29sZWFuO1xuICAvKiogU2hvdyBleHBhbmQgY29udHJvbCAobmF0aXZlIG5pbGUtY29kZS1lZGl0b3IgZXhwYW5kKSAqL1xuICBleHBhbmRhYmxlPzogYm9vbGVhbjtcbiAgLyoqIEljb24gZm9yIGV4cGFuZCBjb250cm9sICovXG4gIGV4cGFuZEljb24/OiBzdHJpbmc7XG4gIFxuICAvLyBEaWFsb2cgZXhwYW5kIGZlYXR1cmVcbiAgLyoqIFNob3cgZXhwYW5kIGJ1dHRvbiB0byBvcGVuIGZ1bGwgZWRpdG9yIGRpYWxvZyAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgc2hvd0V4cGFuZEJ1dHRvbj86IGJvb2xlYW47XG4gIC8qKiBEaWFsb2cgdGl0bGUgKGRlZmF1bHQ6ICdFZGl0IENvZGUnKSAqL1xuICBkaWFsb2dUaXRsZT86IHN0cmluZztcbiAgLyoqIERpYWxvZyB3aWR0aCAoZGVmYXVsdDogJzYwMHB4JykgKi9cbiAgZGlhbG9nV2lkdGg/OiBzdHJpbmc7XG4gIC8qKiBEaWFsb2cgbWF4IGhlaWdodCAoZGVmYXVsdDogJzgwdmgnKSAqL1xuICBkaWFsb2dNYXhIZWlnaHQ/OiBzdHJpbmc7XG4gIC8qKiBEaWFsb2cgZWRpdG9yIG1pbiBoZWlnaHQgKGRlZmF1bHQ6ICczMDBweCcpICovXG4gIGRpYWxvZ0VkaXRvckhlaWdodD86IHN0cmluZztcbiAgLyoqIE1pbmltdW0gbnVtYmVyIG9mIHZpc2libGUgbGluZXMgaW4gdGhlIGRpYWxvZyBlZGl0b3IgKGRlZmF1bHQ6IDIwKSAqL1xuICBkaWFsb2dNaW5MaW5lcz86IG51bWJlcjtcblxuICAvLyBBdXRvY29tcGxldGlvblxuICAvKiogSW5saW5lIGNvbXBsZXRpb24gZGF0YXNldCAqL1xuICBjdXN0b21BdXRvQ29tcGxldGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBDb2RlRWRpdG9yQ29tcGxldGlvbltdPiB8IENvZGVFZGl0b3JDb21wbGV0aW9uW107XG4gIC8qKiBQYXRocyB0byBmZXRjaCBjb21wbGV0aW9uIGRhdGFzZXRzIGZyb20gKi9cbiAgY3VzdG9tQ29tcGxldGlvbnNQYXRocz86IHN0cmluZ1tdO1xuICAvKiogRW5hYmxlIHZhcmlhYmxlcyBpbiBzdWdnZXN0aW9ucyAqL1xuICBhbGxvd1ZhcmlhYmxlSW5DdXN0b21TdWdnZXN0aW9uPzogYm9vbGVhbjtcbiAgLyoqIFNob3cgYXV0b2NvbXBsZXRlIGFib3ZlIGN1cnNvciAqL1xuICBhYm92ZUN1cnNvcj86IGJvb2xlYW47XG4gIC8qKiBTdHlsZSBjb25maWcgZm9yIGF1dG9jb21wbGV0ZSBkcm9wZG93biAqL1xuICBhdXRvQ29tcGxldGVTdHlsZT86IEF1dG9Db21wbGV0ZVN0eWxlO1xuXG4gIC8vIENoYW5nZSBoYW5kbGluZ1xuICAvKiogRGVib3VuY2UgY2hhbmdlIGV2ZW50cyAqL1xuICBkZWJvdW5jZT86IGJvb2xlYW47XG4gIC8qKiBEZWJvdW5jZSBkZWxheSBpbiBtcyAqL1xuICBkZWJvdW5jZVRpbWVvdXQ/OiBudW1iZXI7XG5cbiAgLy8gVmlzdWFsIHN0YXRlc1xuICAvKiogRXJyb3Igc3RhdGUgKi9cbiAgZXJyb3I/OiBib29sZWFuO1xuICAvKiogRXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5ICovXG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcblxuICAvLyBDdXN0b20gdGhlbWVcbiAgLyoqIEN1c3RvbSB0aGVtZSBDU1Mgb2JqZWN0ICovXG4gIGN1c3RvbVRoZW1lQ1NTPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG5cbiAgLy8gVmFsaWRhdGlvbiBiZWhhdmlvclxuICAvKiogVmFsaWRhdGUgYmVmb3JlIHNhdmluZyAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgdmFsaWRhdGVPblNhdmU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEluamVjdCBnbG9iYWwgc3R5bGVzIGZvciBuaWxlLWNvZGUtZWRpdG9yIGluIHRhYmxlIGNlbGxzXG4gKi9cbmxldCBjb2RlRWRpdG9yU3R5bGVzSW5qZWN0ZWQgPSBmYWxzZTtcbmZ1bmN0aW9uIGluamVjdENvZGVFZGl0b3JTdHlsZXMoKTogdm9pZCB7XG4gIGlmIChjb2RlRWRpdG9yU3R5bGVzSW5qZWN0ZWQpIHJldHVybjtcbiAgY29kZUVkaXRvclN0eWxlc0luamVjdGVkID0gdHJ1ZTtcblxuICBjb25zdCBzdHlsZUlkID0gJ25pbGUtY29kZS1lZGl0b3ItY2VsbC1zdHlsZXMnO1xuICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc3R5bGVJZCkpIHJldHVybjtcblxuICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gIHN0eWxlLmlkID0gc3R5bGVJZDtcbiAgc3R5bGUudGV4dENvbnRlbnQgPSBgXG4gICAgLyogTmlsZSBDb2RlIEVkaXRvciBjZWxsIHN0eWxpbmcgKi9cbiAgICBuaWxlLWNvZGUtZWRpdG9yLnN0LWNlbGwtZWRpdG9yIHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBmb250LXNpemU6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgICBsaW5lLWhlaWdodDogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgIH1cbiAgICBuaWxlLWNvZGUtZWRpdG9yLnN0LWNlbGwtZWRpdG9yOjpwYXJ0KGNvZGUtZWRpdG9yLWJhc2UpIHtcbiAgICAgIGJvcmRlcjogbm9uZSAhaW1wb3J0YW50O1xuICAgICAgbWluLWhlaWdodDogMTAwJSAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcbiAgICAgIGZvbnQtc2l6ZTogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICAgIGxpbmUtaGVpZ2h0OiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgfVxuICAgIC8qIEVuc3VyZSBwcm9wZXIgc2l6aW5nIHdpdGhpbiB0YWJsZSBjZWxsICovXG4gICAgLnN0LW5pbGUtY29kZS1lZGl0b3Ige1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBtaW4taGVpZ2h0OiAyOHB4O1xuICAgICAgZm9udC1zaXplOiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgfVxuICAgIC8qIENvZGVNaXJyb3IgY29udGVudCBzaG91bGQgaW5oZXJpdCBmb250IHNpemUgKi9cbiAgICBuaWxlLWNvZGUtZWRpdG9yLnN0LWNlbGwtZWRpdG9yIC5jbS1jb250ZW50LFxuICAgIG5pbGUtY29kZS1lZGl0b3Iuc3QtY2VsbC1lZGl0b3IgLmNtLWxpbmUge1xuICAgICAgZm9udC1zaXplOiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgICBmb250LWZhbWlseTogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgICAgbGluZS1oZWlnaHQ6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICB9XG4gICAgLyogQ29udGFpbmVyIHdyYXBwZXIgZm9yIGVkaXRvciArIGV4cGFuZCBidXR0b24gKi9cbiAgICAuc3QtY29kZS1lZGl0b3Itd3JhcHBlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgZ2FwOiA0cHg7XG4gICAgfVxuICAgIC5zdC1jb2RlLWVkaXRvci13cmFwcGVyIC5zdC1jb2RlLWVkaXRvci1pbnB1dCB7XG4gICAgICBmbGV4OiAxO1xuICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgIH1cbiAgICAuc3QtY29kZS1lZGl0b3Itd3JhcHBlciAuc3QtZXhwYW5kLWJ1dHRvbiB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgd2lkdGg6IDI0cHg7XG4gICAgICBoZWlnaHQ6IDI0cHg7XG4gICAgICBtaW4td2lkdGg6IDI0cHg7XG4gICAgICBwYWRkaW5nOiAwO1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICBjb2xvcjogdmFyKC0tbmlsZS1jb2xvci1uZXV0cmFsLTUwMCwgIzZiNzI4MCk7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycztcbiAgICB9XG4gICAgLnN0LWNvZGUtZWRpdG9yLXdyYXBwZXIgLnN0LWV4cGFuZC1idXR0b246aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tbmlsZS1jb2xvci1uZXV0cmFsLTEwMCwgI2YzZjRmNik7XG4gICAgICBjb2xvcjogdmFyKC0tbmlsZS1jb2xvci1uZXV0cmFsLTcwMCwgIzM3NDE1MSk7XG4gICAgfVxuICAgIC8qIERpYWxvZyBjb2RlIGVkaXRvciBzdHlsaW5nICovXG4gICAgLnN0LWNvZGUtZWRpdG9yLWRpYWxvZzo6cGFydChwYW5lbCkge1xuICAgICAgbWF4LWhlaWdodDogdmFyKC0tbWF4LWhlaWdodCwgODB2aCkgIWltcG9ydGFudDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcbiAgICB9XG4gICAgLnN0LWNvZGUtZWRpdG9yLWRpYWxvZzo6cGFydChib2R5KSB7XG4gICAgICBvdmVyZmxvdzogYXV0byAhaW1wb3J0YW50O1xuICAgIH1cbiAgICAuc3QtY29kZS1lZGl0b3ItZGlhbG9nIG5pbGUtY29kZS1lZGl0b3Ige1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gICAgLnN0LWNvZGUtZWRpdG9yLWRpYWxvZyBuaWxlLWNvZGUtZWRpdG9yOjpwYXJ0KGNvZGUtZWRpdG9yLWJhc2UpIHtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW5pbGUtY29sb3ItbmV1dHJhbC0yMDAsICNlNWU3ZWIpICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHggIWltcG9ydGFudDtcbiAgICAgIG92ZXJmbG93OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgICBtaW4taGVpZ2h0OiB2YXIoLS1kaWFsb2ctZWRpdG9yLW1pbi1oZWlnaHQsIDMwMHB4KSAhaW1wb3J0YW50O1xuICAgIH1cbiAgICAuc3QtY29kZS1lZGl0b3ItZGlhbG9nIG5pbGUtY29kZS1lZGl0b3IgLmNtLWVkaXRvciB7XG4gICAgICBtaW4taGVpZ2h0OiB2YXIoLS1kaWFsb2ctZWRpdG9yLW1pbi1oZWlnaHQsIDMwMHB4KSAhaW1wb3J0YW50O1xuICAgIH1cbiAgICAuc3QtY29kZS1lZGl0b3ItZGlhbG9nIG5pbGUtY29kZS1lZGl0b3IgLmNtLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogdmFyKC0tZGlhbG9nLWVkaXRvci1taW4taGVpZ2h0LCAzMDBweCkgIWltcG9ydGFudDtcbiAgICB9XG4gIGA7XG4gIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xufVxuXG4vKipcbiAqIEN1c3RvbSBlZGl0b3IgdGhhdCB1c2VzIE5pbGVDb2RlRWRpdG9yIGNvbXBvbmVudFxuICogUHJvdmlkZXMgY29kZSBlZGl0aW5nIHdpdGggc3ludGF4IGhpZ2hsaWdodGluZyBmb3IgdGFibGUgY2VsbHNcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB2YWx1ZSB0eXBlICh0eXBpY2FsbHkgc3RyaW5nKVxuICovXG5leHBvcnQgY2xhc3MgTmlsZUNvZGVFZGl0b3I8VCA9IHN0cmluZz4gaW1wbGVtZW50cyBDZWxsRWRpdG9yPFQ+IHtcbiAgcHJpdmF0ZSBlZGl0b3I/OiBhbnk7XG4gIHByaXZhdGUgd3JhcHBlcj86IEhUTUxEaXZFbGVtZW50O1xuICBwcml2YXRlIGV4cGFuZEJ1dHRvbj86IEhUTUxCdXR0b25FbGVtZW50O1xuICBwcml2YXRlIGRpYWxvZz86IGFueTtcbiAgcHJpdmF0ZSBkaWFsb2dFZGl0b3I/OiBhbnk7XG4gIHByaXZhdGUgZXZlbnRMaXN0ZW5lcnM6IEFycmF5PHsgZXZlbnQ6IHN0cmluZzsgaGFuZGxlcjogRXZlbnRMaXN0ZW5lciB9PiA9IFtdO1xuICBwcml2YXRlIGNvbnRleHQ/OiBDZWxsRWRpdG9yQ29udGV4dDxUPjtcbiAgcHJpdmF0ZSBkaWFsb2dPcGVuID0gZmFsc2U7XG4gIHByaXZhdGUgZXhwYW5kQnV0dG9uQ2xpY2tlZCA9IGZhbHNlO1xuICBwcml2YXRlIGRvY3VtZW50Q2xpY2tIYW5kbGVyPzogKGU6IE1vdXNlRXZlbnQpID0+IHZvaWQ7XG4gIHByaXZhdGUgdHJhY2tlZFZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM/OiBOaWxlQ29kZUVkaXRvck9wdGlvbnMpIHt9XG5cbiAgZWRpdChjb250ZXh0OiBDZWxsRWRpdG9yQ29udGV4dDxUPik6IHZvaWQge1xuICAgIGlmICghY29udGV4dC5jb250YWluZXIpIHtcbiAgICAgIGNvbnNvbGUud2FybignTmlsZUNvZGVFZGl0b3IgcmVxdWlyZXMgYSBjb250YWluZXIgZWxlbWVudCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgdGhpcy50cmFja2VkVmFsdWUgPSBudWxsO1xuXG4gICAgLy8gSW5qZWN0IGdsb2JhbCBzdHlsZXMgb25jZVxuICAgIGluamVjdENvZGVFZGl0b3JTdHlsZXMoKTtcblxuICAgIC8vIENoZWNrIGlmIHdlIHNob3VsZCBzaG93IGV4cGFuZCBidXR0b24gKGRlZmF1bHQ6IHRydWUpXG4gICAgY29uc3Qgc2hvd0V4cGFuZEJ1dHRvbiA9IHRoaXMub3B0aW9ucz8uc2hvd0V4cGFuZEJ1dHRvbiAhPT0gZmFsc2U7XG5cbiAgICBpZiAoc2hvd0V4cGFuZEJ1dHRvbikge1xuICAgICAgLy8gQ3JlYXRlIHdyYXBwZXIgZm9yIGVkaXRvciArIGV4cGFuZCBidXR0b25cbiAgICAgIHRoaXMud3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgdGhpcy53cmFwcGVyLmNsYXNzTmFtZSA9ICdzdC1jb2RlLWVkaXRvci13cmFwcGVyJztcblxuICAgICAgLy8gQ3JlYXRlIHRoZSBlZGl0b3IgY29udGFpbmVyXG4gICAgICBjb25zdCBlZGl0b3JDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGVkaXRvckNvbnRhaW5lci5jbGFzc05hbWUgPSAnc3QtY29kZS1lZGl0b3ItaW5wdXQnO1xuXG4gICAgICAvLyBDcmVhdGUgTmlsZUNvZGVFZGl0b3IgY3VzdG9tIGVsZW1lbnRcbiAgICAgIHRoaXMuZWRpdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbmlsZS1jb2RlLWVkaXRvcicpO1xuICAgICAgdGhpcy5lZGl0b3IudmFsdWUgPSBTdHJpbmcoY29udGV4dC52YWx1ZSA/PyAnJyk7XG4gICAgICB0aGlzLmVkaXRvci5jbGFzc05hbWUgPSAnc3QtY2VsbC1lZGl0b3Igc3QtbmlsZS1jb2RlLWVkaXRvcic7XG4gICAgICB0aGlzLmVkaXRvci5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgIHRoaXMuZWRpdG9yLnN0eWxlLmhlaWdodCA9ICcxMDAlJztcbiAgICAgIHRoaXMuZWRpdG9yLnN0eWxlLmJveFNpemluZyA9ICdib3JkZXItYm94JztcbiAgICAgIHRoaXMuZWRpdG9yLm5vYm9yZGVyID0gdGhpcy5vcHRpb25zPy5ub2JvcmRlciAhPT0gZmFsc2U7XG5cbiAgICAgIGVkaXRvckNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmVkaXRvcik7XG4gICAgICB0aGlzLndyYXBwZXIuYXBwZW5kQ2hpbGQoZWRpdG9yQ29udGFpbmVyKTtcblxuICAgICAgLy8gQ3JlYXRlIGV4cGFuZCBidXR0b25cbiAgICAgIHRoaXMuZXhwYW5kQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICB0aGlzLmV4cGFuZEJ1dHRvbi5jbGFzc05hbWUgPSAnc3QtZXhwYW5kLWJ1dHRvbic7XG4gICAgICB0aGlzLmV4cGFuZEJ1dHRvbi50eXBlID0gJ2J1dHRvbic7XG4gICAgICB0aGlzLmV4cGFuZEJ1dHRvbi50aXRsZSA9ICdFeHBhbmQgZWRpdG9yJztcbiAgICAgIHRoaXMuZXhwYW5kQnV0dG9uLmlubmVySFRNTCA9ICc8bmlsZS1pY29uIG5hbWU9XCJleHBhbmQtMDZcIiBzaXplPVwiMTZcIj48L25pbGUtaWNvbj4nO1xuICAgICAgXG4gICAgICAvLyBVc2UgbW91c2Vkb3duIHRvIHNldCBmbGFnIEJFRk9SRSBibHVyIGV2ZW50IGZpcmVzXG4gICAgICB0aGlzLmV4cGFuZEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoZSkgPT4ge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuZXhwYW5kQnV0dG9uQ2xpY2tlZCA9IHRydWU7XG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgdGhpcy5leHBhbmRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMub3BlbkRpYWxvZygpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLndyYXBwZXIuYXBwZW5kQ2hpbGQodGhpcy5leHBhbmRCdXR0b24pO1xuXG4gICAgICAvLyBDbGVhciBjb250YWluZXIgYW5kIGFwcGVuZCB3cmFwcGVyXG4gICAgICBjb250ZXh0LmNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICAgIGNvbnRleHQuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMud3JhcHBlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENyZWF0ZSBOaWxlQ29kZUVkaXRvciBjdXN0b20gZWxlbWVudCB3aXRob3V0IHdyYXBwZXJcbiAgICAgIHRoaXMuZWRpdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbmlsZS1jb2RlLWVkaXRvcicpO1xuICAgICAgdGhpcy5lZGl0b3IudmFsdWUgPSBTdHJpbmcoY29udGV4dC52YWx1ZSA/PyAnJyk7XG4gICAgICB0aGlzLmVkaXRvci5jbGFzc05hbWUgPSAnc3QtY2VsbC1lZGl0b3Igc3QtbmlsZS1jb2RlLWVkaXRvcic7XG4gICAgICB0aGlzLmVkaXRvci5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgIHRoaXMuZWRpdG9yLnN0eWxlLmhlaWdodCA9ICcxMDAlJztcbiAgICAgIHRoaXMuZWRpdG9yLnN0eWxlLmJveFNpemluZyA9ICdib3JkZXItYm94JztcbiAgICAgIHRoaXMuZWRpdG9yLm5vYm9yZGVyID0gdGhpcy5vcHRpb25zPy5ub2JvcmRlciAhPT0gZmFsc2U7XG5cbiAgICAgIC8vIENsZWFyIGNvbnRhaW5lciBhbmQgYXBwZW5kIGVkaXRvclxuICAgICAgY29udGV4dC5jb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgICBjb250ZXh0LmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmVkaXRvcik7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgYWxsIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgIHRoaXMuYXBwbHlPcHRpb25zKCk7XG5cbiAgICAvLyBTZXQgdXAgZXZlbnQgbGlzdGVuZXJzXG4gICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKGNvbnRleHQpO1xuXG4gICAgLy8gQXV0byBmb2N1cyAtIG5lZWQgYSBzbGlnaHQgZGVsYXkgZm9yIG5pbGUtY29kZS1lZGl0b3IgdG8gZnVsbHkgaW5pdGlhbGl6ZVxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmF1dG9Gb2N1cyAhPT0gZmFsc2UpIHtcbiAgICAgIC8vIExpc3RlbiBmb3IgdGhlIG5pbGUtYWZ0ZXItaW5pdCBldmVudCB3aGljaCBmaXJlcyB3aGVuIGVkaXRvciBpcyByZWFkeVxuICAgICAgY29uc3QgaW5pdEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuZWRpdG9yPy5yZW1vdmVFdmVudExpc3RlbmVyKCduaWxlLWFmdGVyLWluaXQnLCBpbml0SGFuZGxlcik7XG4gICAgICAgIHRoaXMuZm9jdXNFZGl0b3IoKTtcbiAgICAgIH07XG4gICAgICB0aGlzLmVkaXRvci5hZGRFdmVudExpc3RlbmVyKCduaWxlLWFmdGVyLWluaXQnLCBpbml0SGFuZGxlcik7XG4gICAgICBcbiAgICAgIC8vIEZhbGxiYWNrOiBhbHNvIHRyeSBhZnRlciBhIGRlbGF5IGluIGNhc2UgdGhlIGV2ZW50IGFscmVhZHkgZmlyZWRcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmZvY3VzRWRpdG9yKCk7XG4gICAgICB9LCAxMDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGb2N1cyB0aGUgZWRpdG9yIGFuZCBwbGFjZSBjdXJzb3JcbiAgICovXG4gIHByaXZhdGUgZm9jdXNFZGl0b3IoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVkaXRvcikgcmV0dXJuO1xuICAgIFxuICAgIHRyeSB7XG4gICAgICAvLyBDYWxsIHRoZSBjb21wb25lbnQncyBmb2N1cyBtZXRob2RcbiAgICAgIHRoaXMuZWRpdG9yLmZvY3VzKCk7XG4gICAgICBcbiAgICAgIC8vIFRyeSB0byBkaXJlY3RseSBmb2N1cyB0aGUgQ29kZU1pcnJvciBjb250ZW50IGFyZWFcbiAgICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSB0aGlzLmVkaXRvci5zaGFkb3dSb290O1xuICAgICAgaWYgKHNoYWRvd1Jvb3QpIHtcbiAgICAgICAgY29uc3QgY21Db250ZW50ID0gc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCcuY20tY29udGVudCcpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAoY21Db250ZW50KSB7XG4gICAgICAgICAgY21Db250ZW50LmZvY3VzKCk7XG4gICAgICAgICAgLy8gRGlzcGF0Y2ggYSBjbGljayBldmVudCB0byBlbnN1cmUgY3Vyc29yIHBsYWNlbWVudFxuICAgICAgICAgIGNtQ29udGVudC5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdtb3VzZWRvd24nLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgICAgICAgIGNtQ29udGVudC5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdtb3VzZXVwJywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIFNpbGVudGx5IGhhbmRsZSBhbnkgZXJyb3JzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgdGhlIGxpdmUgdmFsdWUgZGlyZWN0bHkgZnJvbSBDb2RlTWlycm9yJ3MgaW50ZXJuYWwgc3RhdGUsXG4gICAqIGJ5cGFzc2luZyBkZWJvdW5jZWQgbmlsZS1jaGFuZ2UgZXZlbnRzIGFuZCB0aGUgcG9zc2libHktc3RhbGUgLnZhbHVlIHByb3BlcnR5LlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRMaXZlRWRpdG9yVmFsdWUoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuZWRpdG9yKSByZXR1cm4gJyc7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2hhZG93Um9vdCA9IHRoaXMuZWRpdG9yLnNoYWRvd1Jvb3Q7XG4gICAgICBpZiAoc2hhZG93Um9vdCkge1xuICAgICAgICBjb25zdCBjbUVkaXRvciA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignLmNtLWVkaXRvcicpIGFzIGFueTtcbiAgICAgICAgaWYgKGNtRWRpdG9yPy5jbVZpZXc/LnZpZXcpIHtcbiAgICAgICAgICByZXR1cm4gY21FZGl0b3IuY21WaWV3LnZpZXcuc3RhdGUuZG9jLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBvdGhlciBtZXRob2RzXG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHJhY2tlZFZhbHVlICE9PSBudWxsKSByZXR1cm4gdGhpcy50cmFja2VkVmFsdWU7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLnZhbHVlID8/ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gdGhlIGZ1bGwgZWRpdG9yIGRpYWxvZ1xuICAgKi9cbiAgcHJpdmF0ZSBvcGVuRGlhbG9nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpYWxvZ09wZW4pIHJldHVybjtcbiAgICB0aGlzLmRpYWxvZ09wZW4gPSB0cnVlO1xuICAgIHRoaXMuZXhwYW5kQnV0dG9uQ2xpY2tlZCA9IGZhbHNlOyAvLyBSZXNldCBmbGFnIG5vdyB0aGF0IGRpYWxvZyBpcyBvcGVuaW5nXG5cbiAgICAvLyBDcmVhdGUgZGlhbG9nIHdpdGggY29uZmlndXJhYmxlIGRpbWVuc2lvbnNcbiAgICBjb25zdCBkaWFsb2dXaWR0aCA9IHRoaXMub3B0aW9ucz8uZGlhbG9nV2lkdGggfHwgJzYwMHB4JztcbiAgICBjb25zdCBkaWFsb2dNYXhIZWlnaHQgPSB0aGlzLm9wdGlvbnM/LmRpYWxvZ01heEhlaWdodCB8fCAnODB2aCc7XG4gICAgY29uc3QgZGlhbG9nRWRpdG9ySGVpZ2h0ID0gdGhpcy5vcHRpb25zPy5kaWFsb2dFZGl0b3JIZWlnaHQgfHwgJzMwMHB4JztcbiAgICBjb25zdCBkaWFsb2dUaXRsZSA9IHRoaXMub3B0aW9ucz8uZGlhbG9nVGl0bGUgfHwgJ0VkaXQgQ29kZSc7XG5cbiAgICB0aGlzLmRpYWxvZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ25pbGUtZGlhbG9nJyk7XG4gICAgdGhpcy5kaWFsb2cuY2xhc3NOYW1lID0gJ3N0LWNvZGUtZWRpdG9yLWRpYWxvZyc7XG4gICAgdGhpcy5kaWFsb2cubGFiZWwgPSBkaWFsb2dUaXRsZTtcbiAgICB0aGlzLmRpYWxvZy5zdHlsZS5zZXRQcm9wZXJ0eSgnLS13aWR0aCcsIGRpYWxvZ1dpZHRoKTtcbiAgICB0aGlzLmRpYWxvZy5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1tYXgtaGVpZ2h0JywgZGlhbG9nTWF4SGVpZ2h0KTtcblxuICAgIC8vIENyZWF0ZSBkaWFsb2cgY29udGVudFxuICAgIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb250ZW50LnN0eWxlLnBhZGRpbmcgPSAnMTZweCc7XG4gICAgY29udGVudC5zdHlsZS5tYXhIZWlnaHQgPSBgY2FsYygke2RpYWxvZ01heEhlaWdodH0gLSA4MHB4KWA7XG4gICAgY29udGVudC5zdHlsZS5vdmVyZmxvdyA9ICdhdXRvJztcblxuICAgIC8vIENyZWF0ZSBmdWxsIGVkaXRvclxuICAgIHRoaXMuZGlhbG9nRWRpdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbmlsZS1jb2RlLWVkaXRvcicpO1xuICAgIGNvbnN0IG1pbkxpbmVzID0gdGhpcy5vcHRpb25zPy5kaWFsb2dNaW5MaW5lcyA/PyAyMDtcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLmdldExpdmVFZGl0b3JWYWx1ZSgpO1xuICAgIGNvbnN0IGN1cnJlbnRMaW5lQ291bnQgPSAoY3VycmVudFZhbHVlLm1hdGNoKC9cXG4vZykgfHwgW10pLmxlbmd0aCArIDE7XG4gICAgY29uc3QgcGFkZGluZ0xpbmVzID0gTWF0aC5tYXgoMCwgbWluTGluZXMgLSBjdXJyZW50TGluZUNvdW50KTtcbiAgICB0aGlzLmRpYWxvZ0VkaXRvci52YWx1ZSA9IGN1cnJlbnRWYWx1ZSArICdcXG4nLnJlcGVhdChwYWRkaW5nTGluZXMpO1xuICAgIHRoaXMuZGlhbG9nRWRpdG9yLm11bHRpbGluZSA9IHRydWU7XG4gICAgdGhpcy5kaWFsb2dFZGl0b3IubGluZU51bWJlcnNNdWx0aWxpbmUgPSB0cnVlO1xuICAgIHRoaXMuZGlhbG9nRWRpdG9yLmhhc1Njcm9sbGVyID0gdHJ1ZTtcbiAgICBjb25zdCBsaW5lSGVpZ2h0UHggPSAyMDtcbiAgICBjb25zdCBtaW5IZWlnaHRGcm9tTGluZXMgPSBgJHttaW5MaW5lcyAqIGxpbmVIZWlnaHRQeH1weGA7XG4gICAgdGhpcy5kaWFsb2dFZGl0b3Iuc3R5bGUubWluSGVpZ2h0ID0gYG1heCgke2RpYWxvZ0VkaXRvckhlaWdodH0sICR7bWluSGVpZ2h0RnJvbUxpbmVzfSlgO1xuICAgIHRoaXMuZGlhbG9nRWRpdG9yLnN0eWxlLm1heEhlaWdodCA9IGBjYWxjKCR7ZGlhbG9nTWF4SGVpZ2h0fSAtIDEyMHB4KWA7XG4gICAgY29udGVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1kaWFsb2ctZWRpdG9yLW1pbi1oZWlnaHQnLCBgbWF4KCR7ZGlhbG9nRWRpdG9ySGVpZ2h0fSwgJHttaW5IZWlnaHRGcm9tTGluZXN9KWApO1xuXG4gICAgLy8gQXBwbHkgc2FtZSBvcHRpb25zIHRvIGRpYWxvZyBlZGl0b3JcbiAgICBpZiAodGhpcy5vcHRpb25zPy5sYW5ndWFnZSkge1xuICAgICAgdGhpcy5kaWFsb2dFZGl0b3IubGFuZ3VhZ2UgPSB0aGlzLm9wdGlvbnMubGFuZ3VhZ2U7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnM/LnBsYWNlaG9sZGVyKSB7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvci5wbGFjZWhvbGRlciA9IHRoaXMub3B0aW9ucy5wbGFjZWhvbGRlcjtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucz8udGFiQ29tcGxldGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvci50YWJDb21wbGV0aW9uID0gdGhpcy5vcHRpb25zLnRhYkNvbXBsZXRpb247XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmVuYWJsZVNlYXJjaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvci5lbmFibGVTZWFyY2ggPSB0aGlzLm9wdGlvbnMuZW5hYmxlU2VhcmNoO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zPy5lbmFibGVGb2xkR3V0dGVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvci5lbmFibGVGb2xkR3V0dGVycyA9IHRoaXMub3B0aW9ucy5lbmFibGVGb2xkR3V0dGVycztcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucz8uY3VzdG9tQXV0b0NvbXBsZXRpb25zKSB7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvci5jdXN0b21BdXRvQ29tcGxldGlvbnMgPSB0aGlzLm9wdGlvbnMuY3VzdG9tQXV0b0NvbXBsZXRpb25zO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zPy5jdXN0b21Db21wbGV0aW9uc1BhdGhzKSB7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvci5jdXN0b21Db21wbGV0aW9uc1BhdGhzID0gdGhpcy5vcHRpb25zLmN1c3RvbUNvbXBsZXRpb25zUGF0aHM7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmN1c3RvbVRoZW1lQ1NTKSB7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvci5jdXN0b21UaGVtZUNTUyA9IHRoaXMub3B0aW9ucy5jdXN0b21UaGVtZUNTUztcbiAgICB9XG5cbiAgICB0aGlzLmRpYWxvZ0VkaXRvci5leHBhbmRhYmxlID0gZmFsc2U7XG5cbiAgICAvLyBSZWFsLXRpbWUgc3luYzogVXBkYXRlIGNlbGwgZWRpdG9yIHdoZW5ldmVyIGRpYWxvZyBlZGl0b3IgY2hhbmdlc1xuICAgIHRoaXMuZGlhbG9nRWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ25pbGUtY2hhbmdlJywgKGU6IEN1c3RvbUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBkaWFsb2dWYWx1ZSA9IGUuZGV0YWlsPy52YWx1ZSB8fCAnJztcbiAgICAgIHRoaXMudHJhY2tlZFZhbHVlID0gZGlhbG9nVmFsdWU7XG4gICAgICBpZiAodGhpcy5lZGl0b3IpIHtcbiAgICAgICAgdGhpcy5lZGl0b3IudmFsdWUgPSBkaWFsb2dWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0Lm9uQ2hhbmdlKGRpYWxvZ1ZhbHVlIGFzIFQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29udGVudC5hcHBlbmRDaGlsZCh0aGlzLmRpYWxvZ0VkaXRvcik7XG4gICAgdGhpcy5kaWFsb2cuYXBwZW5kQ2hpbGQoY29udGVudCk7XG5cbiAgICAvLyBIYW5kbGUgZGlhbG9nIGNsb3NlIGV2ZW50cyAoY2xpY2tpbmcgWCBidXR0b24gLSBzdGF5IGluIGVkaXQgbW9kZSlcbiAgICB0aGlzLmRpYWxvZy5hZGRFdmVudExpc3RlbmVyKCduaWxlLXJlcXVlc3QtY2xvc2UnLCAoZTogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZSBhcyBDdXN0b21FdmVudDtcbiAgICAgIC8vIENoZWNrIGlmIGNsb3NlIHdhcyB0cmlnZ2VyZWQgYnkgb3ZlcmxheSBjbGljayAoY2xpY2tpbmcgb3V0c2lkZSlcbiAgICAgIGlmIChjdXN0b21FdmVudC5kZXRhaWw/LnNvdXJjZSA9PT0gJ292ZXJsYXknKSB7XG4gICAgICAgIC8vIENsaWNraW5nIG91dHNpZGUgdGhlIGRpYWxvZyAtIHNhdmUgYW5kIGV4aXQgZWRpdCBtb2RlXG4gICAgICAgIHRoaXMuY2xvc2VEaWFsb2codHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDbGlja2luZyBYIGJ1dHRvbiAtIHN0YXkgaW4gZWRpdCBtb2RlXG4gICAgICAgIHRoaXMuY2xvc2VEaWFsb2coZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gSGFuZGxlIEVzY2FwZSBrZXkgaW4gZGlhbG9nIC0gc3RheSBpbiBlZGl0IG1vZGVcbiAgICB0aGlzLmRpYWxvZy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLmNsb3NlRGlhbG9nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEFwcGVuZCB0byBib2R5IGFuZCBzaG93XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmRpYWxvZyk7XG4gICAgXG4gICAgLy8gT3BlbiBkaWFsb2cgYWZ0ZXIgYSB0aWNrIHRvIGVuc3VyZSBpdCdzIGluIHRoZSBET01cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmRpYWxvZykge1xuICAgICAgICB0aGlzLmRpYWxvZy5vcGVuID0gdHJ1ZTtcbiAgICAgICAgLy8gRm9jdXMgdGhlIGRpYWxvZyBlZGl0b3JcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5kaWFsb2dFZGl0b3I/LmZvY3VzKCk7XG4gICAgICAgIH0sIDEwMCk7XG4gICAgICB9XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIGRpYWxvZyBhbmQgb3B0aW9uYWxseSBzYXZlL2V4aXQgZWRpdCBtb2RlXG4gICAqL1xuICBwcml2YXRlIGNsb3NlRGlhbG9nKHNhdmVBbmRFeGl0OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGlhbG9nT3BlbikgcmV0dXJuO1xuXG4gICAgLy8gUmVzZXQgZmxhZyBpbW1lZGlhdGVseSBzbyBkb2N1bWVudCBjbGljayBoYW5kbGVyIHdvcmtzXG4gICAgdGhpcy5kaWFsb2dPcGVuID0gZmFsc2U7XG5cbiAgICAvLyBDbG9zZSBhbmQgcmVtb3ZlIGRpYWxvZ1xuICAgIGlmICh0aGlzLmRpYWxvZykge1xuICAgICAgdGhpcy5kaWFsb2cub3BlbiA9IGZhbHNlO1xuICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2c7XG4gICAgICBjb25zdCBkaWFsb2dFZGl0b3JSZWYgPSB0aGlzLmRpYWxvZ0VkaXRvcjtcbiAgICAgIHRoaXMuZGlhbG9nID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kaWFsb2dFZGl0b3IgPSB1bmRlZmluZWQ7XG4gICAgICBcbiAgICAgIC8vIFJlbW92ZSBmcm9tIERPTSBhZnRlciBhbmltYXRpb25cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBkaWFsb2dSZWY/LnJlbW92ZSgpO1xuICAgICAgfSwgMjAwKTtcbiAgICAgIFxuICAgICAgaWYgKHNhdmVBbmRFeGl0ICYmIHRoaXMuY29udGV4dCkge1xuICAgICAgICAvLyBTYXZlIGFuZCBleGl0IGVkaXQgbW9kZVxuICAgICAgICB0aGlzLmNvbnRleHQub25TYXZlKHRoaXMuZ2V0Q3VycmVudFZhbHVlKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVmb2N1cyB0aGUgY2VsbCBlZGl0b3IgdG8gc3RheSBpbiBlZGl0IG1vZGVcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5mb2N1c0VkaXRvcigpO1xuICAgICAgICB9LCA1MCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGFsbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdGhlIE5pbGVDb2RlRWRpdG9yIGVsZW1lbnRcbiAgICovXG4gIHByaXZhdGUgYXBwbHlPcHRpb25zKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0b3IpIHJldHVybjtcblxuICAgIC8vIExhbmd1YWdlIGFuZCBzeW50YXhcbiAgICBpZiAodGhpcy5vcHRpb25zPy5sYW5ndWFnZSkge1xuICAgICAgdGhpcy5lZGl0b3IubGFuZ3VhZ2UgPSB0aGlzLm9wdGlvbnMubGFuZ3VhZ2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZGlzYWJsZVN5bnRheEhpZ2hsaWdodGluZykge1xuICAgICAgdGhpcy5lZGl0b3IuZGlzYWJsZVN5bnRheEhpZ2hsaWdodGluZyA9IHRoaXMub3B0aW9ucy5kaXNhYmxlU3ludGF4SGlnaGxpZ2h0aW5nO1xuICAgIH1cblxuICAgIC8vIEVkaXRvciBhcHBlYXJhbmNlXG4gICAgaWYgKHRoaXMub3B0aW9ucz8ucGxhY2Vob2xkZXIpIHtcbiAgICAgIHRoaXMuZWRpdG9yLnBsYWNlaG9sZGVyID0gdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmxpbmVOdW1iZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmxpbmVOdW1iZXJzID0gdGhpcy5vcHRpb25zLmxpbmVOdW1iZXJzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmxpbmVOdW1iZXJzTXVsdGlsaW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmxpbmVOdW1iZXJzTXVsdGlsaW5lID0gdGhpcy5vcHRpb25zLmxpbmVOdW1iZXJzTXVsdGlsaW5lO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/Lm11bHRpbGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVkaXRvci5tdWx0aWxpbmUgPSB0aGlzLm9wdGlvbnMubXVsdGlsaW5lO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmRlZmF1bHRGb250ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmRlZmF1bHRGb250ID0gdGhpcy5vcHRpb25zLmRlZmF1bHRGb250O1xuICAgIH1cblxuICAgIC8vIEVkaXRvciBiZWhhdmlvclxuICAgIGlmICh0aGlzLm9wdGlvbnM/LnJlYWRvbmx5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLnJlYWRvbmx5ID0gdGhpcy5vcHRpb25zLnJlYWRvbmx5O1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmRpc2FibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmRpc2FibGVkID0gdGhpcy5vcHRpb25zLmRpc2FibGVkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LnRhYkNvbXBsZXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lZGl0b3IudGFiQ29tcGxldGlvbiA9IHRoaXMub3B0aW9ucy50YWJDb21wbGV0aW9uO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmVuYWJsZVNlYXJjaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVkaXRvci5lbmFibGVTZWFyY2ggPSB0aGlzLm9wdGlvbnMuZW5hYmxlU2VhcmNoO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmVuYWJsZUZvbGRHdXR0ZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmVuYWJsZUZvbGRHdXR0ZXJzID0gdGhpcy5vcHRpb25zLmVuYWJsZUZvbGRHdXR0ZXJzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/Lmhhc1Njcm9sbGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmhhc1Njcm9sbGVyID0gdGhpcy5vcHRpb25zLmhhc1Njcm9sbGVyO1xuICAgIH1cblxuICAgIC8vIEV4cGFuZGFibGUgLSBkZWZhdWx0IHRvIGZhbHNlIGZvciBjZWxsIGVkaXRpbmdcbiAgICB0aGlzLmVkaXRvci5leHBhbmRhYmxlID0gdGhpcy5vcHRpb25zPy5leHBhbmRhYmxlID8/IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZXhwYW5kSWNvbikge1xuICAgICAgdGhpcy5lZGl0b3IuZXhwYW5kSWNvbiA9IHRoaXMub3B0aW9ucy5leHBhbmRJY29uO1xuICAgIH1cblxuICAgIC8vIEF1dG9jb21wbGV0aW9uXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uY3VzdG9tQXV0b0NvbXBsZXRpb25zKSB7XG4gICAgICB0aGlzLmVkaXRvci5jdXN0b21BdXRvQ29tcGxldGlvbnMgPSB0aGlzLm9wdGlvbnMuY3VzdG9tQXV0b0NvbXBsZXRpb25zO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmN1c3RvbUNvbXBsZXRpb25zUGF0aHMpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmN1c3RvbUNvbXBsZXRpb25zUGF0aHMgPSB0aGlzLm9wdGlvbnMuY3VzdG9tQ29tcGxldGlvbnNQYXRocztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5hbGxvd1ZhcmlhYmxlSW5DdXN0b21TdWdnZXN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmFsbG93VmFyaWFibGVJbkN1c3RvbVN1Z2dlc3Rpb24gPSB0aGlzLm9wdGlvbnMuYWxsb3dWYXJpYWJsZUluQ3VzdG9tU3VnZ2VzdGlvbjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5hYm92ZUN1cnNvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVkaXRvci5hYm92ZUN1cnNvciA9IHRoaXMub3B0aW9ucy5hYm92ZUN1cnNvcjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5hdXRvQ29tcGxldGVTdHlsZSkge1xuICAgICAgdGhpcy5lZGl0b3IuYXV0b0NvbXBsZXRlU3R5bGUgPSB0aGlzLm9wdGlvbnMuYXV0b0NvbXBsZXRlU3R5bGU7XG4gICAgfVxuXG4gICAgLy8gQ2hhbmdlIGhhbmRsaW5nXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZGVib3VuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lZGl0b3IuZGVib3VuY2UgPSB0aGlzLm9wdGlvbnMuZGVib3VuY2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZGVib3VuY2VUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmRlYm91bmNlVGltZW91dCA9IHRoaXMub3B0aW9ucy5kZWJvdW5jZVRpbWVvdXQ7XG4gICAgfVxuXG4gICAgLy8gVmlzdWFsIHN0YXRlc1xuICAgIGlmICh0aGlzLm9wdGlvbnM/LmVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmVycm9yID0gdGhpcy5vcHRpb25zLmVycm9yO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmVycm9yTWVzc2FnZSkge1xuICAgICAgdGhpcy5lZGl0b3IuZXJyb3JNZXNzYWdlID0gdGhpcy5vcHRpb25zLmVycm9yTWVzc2FnZTtcbiAgICB9XG5cbiAgICAvLyBDdXN0b20gdGhlbWVcbiAgICBpZiAodGhpcy5vcHRpb25zPy5jdXN0b21UaGVtZUNTUykge1xuICAgICAgdGhpcy5lZGl0b3IuY3VzdG9tVGhlbWVDU1MgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVGhlbWVDU1M7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB1cCBhbGwgZXZlbnQgbGlzdGVuZXJzIHdpdGggcHJvcGVyIGNsZWFudXAgdHJhY2tpbmdcbiAgICovXG4gIHByaXZhdGUgc2V0dXBFdmVudExpc3RlbmVycyhjb250ZXh0OiBDZWxsRWRpdG9yQ29udGV4dDxUPik6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0b3IpIHJldHVybjtcblxuICAgIGNvbnN0IHZhbGlkYXRlT25TYXZlID0gdGhpcy5vcHRpb25zPy52YWxpZGF0ZU9uU2F2ZSAhPT0gZmFsc2U7XG5cbiAgICAvLyBIYW5kbGUga2V5Ym9hcmQgZXZlbnRzXG4gICAgY29uc3Qga2V5ZG93bkhhbmRsZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGtleUV2ZW50ID0gZSBhcyBLZXlib2FyZEV2ZW50O1xuICAgICAgXG4gICAgICAvLyBGb3Igc2luZ2xlLWxpbmUgbW9kZSwgRW50ZXIgc2F2ZXNcbiAgICAgIGlmICghdGhpcy5vcHRpb25zPy5tdWx0aWxpbmUgJiYga2V5RXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIGtleUV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGtleUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLnNhdmVWYWx1ZShjb250ZXh0LCB2YWxpZGF0ZU9uU2F2ZSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEVzY2FwZSBjYW5jZWxzXG4gICAgICBpZiAoa2V5RXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICBrZXlFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBrZXlFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgY29udGV4dC5vbkNhbmNlbCgpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5lZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGtleWRvd25IYW5kbGVyKTtcbiAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLnB1c2goeyBldmVudDogJ2tleWRvd24nLCBoYW5kbGVyOiBrZXlkb3duSGFuZGxlciB9KTtcblxuICAgIC8vIFVzZSBuaWxlLWJsdXIgZXZlbnQgZm9yIHNhdmluZyBvbiBibHVyXG4gICAgY29uc3QgYmx1ckhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAvLyBEb24ndCBzYXZlIGlmIGRpYWxvZyBpcyBvcGVuXG4gICAgICBpZiAodGhpcy5kaWFsb2dPcGVuKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRG9uJ3Qgc2F2ZSBpZiBleHBhbmQgYnV0dG9uIHdhcyBjbGlja2VkIChtb3VzZWRvd24gc2V0cyB0aGlzIGZsYWcpXG4gICAgICBpZiAodGhpcy5leHBhbmRCdXR0b25DbGlja2VkKSB7XG4gICAgICAgIC8vIFJlc2V0IGZsYWcgLSB0aGUgY2xpY2sgaGFuZGxlciB3aWxsIG9wZW4gdGhlIGRpYWxvZ1xuICAgICAgICB0aGlzLmV4cGFuZEJ1dHRvbkNsaWNrZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTYXZlIGFuZCBleGl0IGVkaXQgbW9kZVxuICAgICAgdGhpcy5zYXZlVmFsdWUoY29udGV4dCwgdmFsaWRhdGVPblNhdmUpO1xuICAgIH07XG4gICAgdGhpcy5lZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcignbmlsZS1ibHVyJywgYmx1ckhhbmRsZXIpO1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMucHVzaCh7IGV2ZW50OiAnbmlsZS1ibHVyJywgaGFuZGxlcjogYmx1ckhhbmRsZXIgfSk7XG5cbiAgICAvLyBEb2N1bWVudC1sZXZlbCBtb3VzZWRvd24gaGFuZGxlciB0byBkZXRlY3QgY2xpY2tzIG91dHNpZGUgdGhlIGVkaXRvclxuICAgIHRoaXMuZG9jdW1lbnRDbGlja0hhbmRsZXIgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgLy8gRG9uJ3QgcHJvY2VzcyBpZiBkaWFsb2cgaXMgb3BlbiBvciBleHBhbmQgYnV0dG9uIHdhcyBjbGlja2VkXG4gICAgICBpZiAodGhpcy5kaWFsb2dPcGVuIHx8IHRoaXMuZXhwYW5kQnV0dG9uQ2xpY2tlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFVzZSBjb21wb3NlZFBhdGggdG8gaGFuZGxlIFNoYWRvdyBET00gYm91bmRhcmllc1xuICAgICAgY29uc3QgcGF0aCA9IGUuY29tcG9zZWRQYXRoKCk7XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIGFueSBlbGVtZW50IGluIHRoZSBwYXRoIGlzIG91ciB3cmFwcGVyLCBlZGl0b3IsIG9yIGV4cGFuZCBidXR0b25cbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBwYXRoKSB7XG4gICAgICAgIGlmIChlbGVtZW50ID09PSB0aGlzLndyYXBwZXIgfHwgZWxlbWVudCA9PT0gdGhpcy5lZGl0b3IgfHwgZWxlbWVudCA9PT0gdGhpcy5leHBhbmRCdXR0b24pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWxzbyBjaGVjayBpZiBpdCdzIHRoZSBjb250YWluZXIgKHRoZSBjZWxsKVxuICAgICAgICBpZiAoZWxlbWVudCA9PT0gY29udGV4dC5jb250YWluZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2xpY2sgaXMgb3V0c2lkZSAtIHNhdmUgYW5kIGV4aXRcbiAgICAgIHRoaXMuc2F2ZVZhbHVlKGNvbnRleHQsIHZhbGlkYXRlT25TYXZlKTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIHdpdGggYSBzbWFsbCBkZWxheSB0byBhdm9pZCBjYXB0dXJpbmcgdGhlIGluaXRpYWwgY2xpY2sgdGhhdCBvcGVuZWQgdGhlIGVkaXRvclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5kb2N1bWVudENsaWNrSGFuZGxlciEsIHRydWUpO1xuICAgIH0sIDUwKTtcblxuICAgIC8vIFJlYWwtdGltZSB2YWx1ZSB1cGRhdGVzIHVzaW5nIG5pbGUtY2hhbmdlXG4gICAgY29uc3QgY2hhbmdlSGFuZGxlciA9IChlOiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBlIGFzIEN1c3RvbUV2ZW50O1xuICAgICAgY29uc3QgbmV3VmFsdWUgPSBjdXN0b21FdmVudC5kZXRhaWw/LnZhbHVlID8/ICcnO1xuICAgICAgdGhpcy50cmFja2VkVmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgIGNvbnRleHQub25DaGFuZ2UobmV3VmFsdWUgYXMgVCk7XG4gICAgfTtcbiAgICB0aGlzLmVkaXRvci5hZGRFdmVudExpc3RlbmVyKCduaWxlLWNoYW5nZScsIGNoYW5nZUhhbmRsZXIpO1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMucHVzaCh7IGV2ZW50OiAnbmlsZS1jaGFuZ2UnLCBoYW5kbGVyOiBjaGFuZ2VIYW5kbGVyIH0pO1xuXG4gICAgLy8gSGFuZGxlIGV4cGFuZCBldmVudCBpZiBleHBhbmRhYmxlXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZXhwYW5kYWJsZSkge1xuICAgICAgY29uc3QgZXhwYW5kSGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgLy8gRW1pdCBhIGN1c3RvbSBldmVudCB0aGF0IHRoZSBwYXJlbnQgY2FuIGxpc3RlbiB0b1xuICAgICAgICBjb25zdCBleHBhbmRFdmVudCA9IG5ldyBDdXN0b21FdmVudCgnc3QtY29kZS1lZGl0b3ItZXhwYW5kJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiB7IHZhbHVlOiB0aGlzLmdldEN1cnJlbnRWYWx1ZSgpIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZWRpdG9yPy5kaXNwYXRjaEV2ZW50KGV4cGFuZEV2ZW50KTtcbiAgICAgIH07XG4gICAgICB0aGlzLmVkaXRvci5hZGRFdmVudExpc3RlbmVyKCduaWxlLWV4cGFuZCcsIGV4cGFuZEhhbmRsZXIpO1xuICAgICAgdGhpcy5ldmVudExpc3RlbmVycy5wdXNoKHsgZXZlbnQ6ICduaWxlLWV4cGFuZCcsIGhhbmRsZXI6IGV4cGFuZEhhbmRsZXIgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdmFsdWUgd2l0aCBvcHRpb25hbCB2YWxpZGF0aW9uXG4gICAqL1xuICBwcml2YXRlIHNhdmVWYWx1ZShjb250ZXh0OiBDZWxsRWRpdG9yQ29udGV4dDxUPiwgdmFsaWRhdGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZWRpdG9yKSByZXR1cm47XG5cbiAgICAvLyBDb2RlIGVkaXRvciBkb2Vzbid0IGhhdmUgYnVpbHQtaW4gdmFsaWRhdGlvbiBsaWtlIGlucHV0XG4gICAgLy8gQnV0IHdlIGNhbiBjaGVjayBmb3IgZXJyb3Igc3RhdGVcbiAgICBpZiAodmFsaWRhdGUgJiYgdGhpcy5vcHRpb25zPy5lcnJvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRDdXJyZW50VmFsdWUoKTtcbiAgICBjb250ZXh0Lm9uU2F2ZSh2YWx1ZSk7XG4gIH1cblxuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIC8vIFJlbW92ZSBkb2N1bWVudCBjbGljayBoYW5kbGVyXG4gICAgaWYgKHRoaXMuZG9jdW1lbnRDbGlja0hhbmRsZXIpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuZG9jdW1lbnRDbGlja0hhbmRsZXIsIHRydWUpO1xuICAgICAgdGhpcy5kb2N1bWVudENsaWNrSGFuZGxlciA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBDbG9zZSBkaWFsb2cgaWYgb3BlblxuICAgIGlmICh0aGlzLmRpYWxvZ09wZW4gJiYgdGhpcy5kaWFsb2cpIHtcbiAgICAgIHRoaXMuZGlhbG9nLm9wZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMuZGlhbG9nLnJlbW92ZSgpO1xuICAgICAgdGhpcy5kaWFsb2cgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvciA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZGlhbG9nT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhbGwgZXZlbnQgbGlzdGVuZXJzXG4gICAgaWYgKHRoaXMuZWRpdG9yKSB7XG4gICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLmZvckVhY2goKHsgZXZlbnQsIGhhbmRsZXIgfSkgPT4ge1xuICAgICAgICB0aGlzLmVkaXRvcj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlcik7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMgPSBbXTtcblxuICAgICAgdGhpcy5lZGl0b3IucmVtb3ZlKCk7XG4gICAgICB0aGlzLmVkaXRvciA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgd3JhcHBlciBpZiBleGlzdHNcbiAgICBpZiAodGhpcy53cmFwcGVyKSB7XG4gICAgICB0aGlzLndyYXBwZXIucmVtb3ZlKCk7XG4gICAgICB0aGlzLndyYXBwZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgZXhwYW5kIGJ1dHRvbiByZWZlcmVuY2VcbiAgICB0aGlzLmV4cGFuZEJ1dHRvbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNvbnRleHQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5leHBhbmRCdXR0b25DbGlja2VkID0gZmFsc2U7XG4gIH1cblxuICBmb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRvcj8uZm9jdXMoKTtcbiAgfVxuXG4gIGdldEN1cnJlbnRWYWx1ZSgpOiBUIHtcbiAgICBpZiAoIXRoaXMuZWRpdG9yKSByZXR1cm4gJycgYXMgdW5rbm93biBhcyBUO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRMaXZlRWRpdG9yVmFsdWUoKTtcbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxuKyQvLCAnJykgYXMgdW5rbm93biBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB2YWx1ZSBwcm9ncmFtbWF0aWNhbGx5XG4gICAqL1xuICBzZXRWYWx1ZSh2YWx1ZTogVCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVkaXRvcikge1xuICAgICAgdGhpcy5lZGl0b3IudmFsdWUgPSBTdHJpbmcodmFsdWUgPz8gJycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIENvZGVNaXJyb3IgaW5zdGFuY2UgKGlmIG5lZWRlZCBmb3IgYWR2YW5jZWQgdXNhZ2UpXG4gICAqL1xuICBnZXRFZGl0b3JJbnN0YW5jZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmVkaXRvcjtcbiAgfVxufVxuIl19
781
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmlsZS1jb2RlLWVkaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvZWRpdG9ycy9uaWxlLWNvZGUtZWRpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQW1ISDs7R0FFRztBQUNILElBQUksd0JBQXdCLEdBQUcsS0FBSyxDQUFDO0FBQ3JDLFNBQVMsc0JBQXNCO0lBQzdCLElBQUksd0JBQXdCO1FBQUUsT0FBTztJQUNyQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7SUFFaEMsTUFBTSxPQUFPLEdBQUcsOEJBQThCLENBQUM7SUFDL0MsSUFBSSxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU87SUFFN0MsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QyxLQUFLLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUNuQixLQUFLLENBQUMsV0FBVyxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEduQixDQUFDO0lBQ0YsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sY0FBYztJQWlCekIsWUFBNkIsT0FBK0I7UUFBL0IsWUFBTyxHQUFQLE9BQU8sQ0FBd0I7UUFYcEQsbUJBQWMsR0FBcUQsRUFBRSxDQUFDO1FBRXRFLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBRTVCLGlCQUFZLEdBQWtCLElBQUksQ0FBQztRQUNuQyxzQkFBaUIsR0FBRyxLQUFLLENBQUMsQ0FBQyxt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LENBQUM7SUFFRDs7T0FFRztJQUNILGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEN1c3RvbSBlZGl0b3IgdXNpbmcgTmlsZUNvZGVFZGl0b3IgZnJvbSBAYXF1ZXJhL25pbGUtZWxlbWVudHNcbiAqIFRoaXMgcHJvdmlkZXMgY29kZSBlZGl0aW5nIGNhcGFiaWxpdGllcyB3aXRoIHN5bnRheCBoaWdobGlnaHRpbmcgZm9yIHRhYmxlIGNlbGxzXG4gKi9cblxuaW1wb3J0IHsgQ2VsbEVkaXRvciwgQ2VsbEVkaXRvckNvbnRleHQgfSBmcm9tICcuLi9tb2RlbHMvY2VsbC1zdHJhdGVnaWVzLmludGVyZmFjZSc7XG5cbi8qKlxuICogQXV0b2NvbXBsZXRpb24gaXRlbSBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZUVkaXRvckNvbXBsZXRpb24ge1xuICAvKiogVGhlIGNvbXBsZXRpb24gbGFiZWwgc2hvd24gaW4gZHJvcGRvd24gKi9cbiAgbGFiZWw6IHN0cmluZztcbiAgLyoqIFRoZSB2YWx1ZSB0byBpbnNlcnQgKi9cbiAgdmFsdWU/OiBzdHJpbmc7XG4gIC8qKiBPcHRpb25hbCBkZXNjcmlwdGlvbiAqL1xuICBkZXRhaWw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQXV0b2NvbXBsZXRlIHN0eWxlIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRvQ29tcGxldGVTdHlsZSB7XG4gIC8qKiBXaWR0aCBvZiB0aGUgYXV0b2NvbXBsZXRlIGRyb3Bkb3duICovXG4gIHdpZHRoPzogc3RyaW5nO1xuICAvKiogRW5hYmxlIG11bHRpbGluZSBjb250ZW50IGluIGF1dG9jb21wbGV0ZSAqL1xuICBtdWx0aWxpbmU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgaW50ZXJmYWNlIGZvciBOaWxlQ29kZUVkaXRvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5pbGVDb2RlRWRpdG9yT3B0aW9ucyB7XG4gIC8vIExhbmd1YWdlIGFuZCBzeW50YXhcbiAgLyoqIExhbmd1YWdlIG1vZGUgZm9yIHN5bnRheCBoaWdobGlnaHRpbmcgKi9cbiAgbGFuZ3VhZ2U/OiAnamF2YXNjcmlwdCcgfCAnc3FsJyB8ICdqc29uJyB8ICdodG1sJztcbiAgLyoqIERpc2FibGUgc3ludGF4IGhpZ2hsaWdodGluZyAqL1xuICBkaXNhYmxlU3ludGF4SGlnaGxpZ2h0aW5nPzogYm9vbGVhbjtcblxuICAvLyBFZGl0b3IgYXBwZWFyYW5jZVxuICAvKiogUGxhY2Vob2xkZXIgdGV4dCB3aGVuIGVtcHR5ICovXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAvKiogU2hvdyBsaW5lIG51bWJlcnMgKHNpbmdsZS1saW5lIG1vZGUpICovXG4gIGxpbmVOdW1iZXJzPzogYm9vbGVhbjtcbiAgLyoqIFNob3cgbGluZSBudW1iZXJzIGluIG11bHRpbGluZSBtb2RlICovXG4gIGxpbmVOdW1iZXJzTXVsdGlsaW5lPzogYm9vbGVhbjtcbiAgLyoqIEFsbG93IG11bHRpLWxpbmUgZWRpdGluZyAqL1xuICBtdWx0aWxpbmU/OiBib29sZWFuO1xuICAvKiogUmVuZGVyIHdpdGhvdXQgYm9yZGVyICovXG4gIG5vYm9yZGVyPzogYm9vbGVhbjtcbiAgLyoqIFVzZSBkZWZhdWx0IGZvbnQgaW5zdGVhZCBvZiBpbmhlcml0ICovXG4gIGRlZmF1bHRGb250PzogYm9vbGVhbjtcblxuICAvLyBFZGl0b3IgYmVoYXZpb3JcbiAgLyoqIEF1dG8gZm9jdXMgb24gZWRpdCAqL1xuICBhdXRvRm9jdXM/OiBib29sZWFuO1xuICAvKiogUmVhZC1vbmx5IG1vZGUgKi9cbiAgcmVhZG9ubHk/OiBib29sZWFuO1xuICAvKiogRGlzYWJsZWQgc3RhdGUgKi9cbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICAvKiogRW5hYmxlIFRhYi10by1jb21wbGV0ZSAqL1xuICB0YWJDb21wbGV0aW9uPzogYm9vbGVhbjtcbiAgLyoqIEVuYWJsZSBzZWFyY2gga2V5bWFwICovXG4gIGVuYWJsZVNlYXJjaD86IGJvb2xlYW47XG4gIC8qKiBTaG93IGNvZGUgZm9sZGluZyBndXR0ZXJzICovXG4gIGVuYWJsZUZvbGRHdXR0ZXJzPzogYm9vbGVhbjtcbiAgLyoqIEludGVybmFsIHNjcm9sbCBjb250YWluZXIgKi9cbiAgaGFzU2Nyb2xsZXI/OiBib29sZWFuO1xuICAvKiogU2hvdyBleHBhbmQgY29udHJvbCAobmF0aXZlIG5pbGUtY29kZS1lZGl0b3IgZXhwYW5kKSAqL1xuICBleHBhbmRhYmxlPzogYm9vbGVhbjtcbiAgLyoqIEljb24gZm9yIGV4cGFuZCBjb250cm9sICovXG4gIGV4cGFuZEljb24/OiBzdHJpbmc7XG4gIFxuICAvLyBEaWFsb2cgZXhwYW5kIGZlYXR1cmVcbiAgLyoqIFNob3cgZXhwYW5kIGJ1dHRvbiB0byBvcGVuIGZ1bGwgZWRpdG9yIGRpYWxvZyAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgc2hvd0V4cGFuZEJ1dHRvbj86IGJvb2xlYW47XG4gIC8qKiBEaWFsb2cgdGl0bGUgKGRlZmF1bHQ6ICdFZGl0IENvZGUnKSAqL1xuICBkaWFsb2dUaXRsZT86IHN0cmluZztcbiAgLyoqIERpYWxvZyB3aWR0aCAoZGVmYXVsdDogJzYwMHB4JykgKi9cbiAgZGlhbG9nV2lkdGg/OiBzdHJpbmc7XG4gIC8qKiBEaWFsb2cgbWF4IGhlaWdodCAoZGVmYXVsdDogJzgwdmgnKSAqL1xuICBkaWFsb2dNYXhIZWlnaHQ/OiBzdHJpbmc7XG4gIC8qKiBEaWFsb2cgZWRpdG9yIG1pbiBoZWlnaHQgKGRlZmF1bHQ6ICczMDBweCcpICovXG4gIGRpYWxvZ0VkaXRvckhlaWdodD86IHN0cmluZztcblxuICAvLyBBdXRvY29tcGxldGlvblxuICAvKiogSW5saW5lIGNvbXBsZXRpb24gZGF0YXNldCAqL1xuICBjdXN0b21BdXRvQ29tcGxldGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBDb2RlRWRpdG9yQ29tcGxldGlvbltdPiB8IENvZGVFZGl0b3JDb21wbGV0aW9uW107XG4gIC8qKiBQYXRocyB0byBmZXRjaCBjb21wbGV0aW9uIGRhdGFzZXRzIGZyb20gKi9cbiAgY3VzdG9tQ29tcGxldGlvbnNQYXRocz86IHN0cmluZ1tdO1xuICAvKiogRW5hYmxlIHZhcmlhYmxlcyBpbiBzdWdnZXN0aW9ucyAqL1xuICBhbGxvd1ZhcmlhYmxlSW5DdXN0b21TdWdnZXN0aW9uPzogYm9vbGVhbjtcbiAgLyoqIFNob3cgYXV0b2NvbXBsZXRlIGFib3ZlIGN1cnNvciAqL1xuICBhYm92ZUN1cnNvcj86IGJvb2xlYW47XG4gIC8qKiBTdHlsZSBjb25maWcgZm9yIGF1dG9jb21wbGV0ZSBkcm9wZG93biAqL1xuICBhdXRvQ29tcGxldGVTdHlsZT86IEF1dG9Db21wbGV0ZVN0eWxlO1xuXG4gIC8vIENoYW5nZSBoYW5kbGluZ1xuICAvKiogRGVib3VuY2UgY2hhbmdlIGV2ZW50cyAqL1xuICBkZWJvdW5jZT86IGJvb2xlYW47XG4gIC8qKiBEZWJvdW5jZSBkZWxheSBpbiBtcyAqL1xuICBkZWJvdW5jZVRpbWVvdXQ/OiBudW1iZXI7XG5cbiAgLy8gVmlzdWFsIHN0YXRlc1xuICAvKiogRXJyb3Igc3RhdGUgKi9cbiAgZXJyb3I/OiBib29sZWFuO1xuICAvKiogRXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5ICovXG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcblxuICAvLyBDdXN0b20gdGhlbWVcbiAgLyoqIEN1c3RvbSB0aGVtZSBDU1Mgb2JqZWN0ICovXG4gIGN1c3RvbVRoZW1lQ1NTPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG5cbiAgLy8gVmFsaWRhdGlvbiBiZWhhdmlvclxuICAvKiogVmFsaWRhdGUgYmVmb3JlIHNhdmluZyAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgdmFsaWRhdGVPblNhdmU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEluamVjdCBnbG9iYWwgc3R5bGVzIGZvciBuaWxlLWNvZGUtZWRpdG9yIGluIHRhYmxlIGNlbGxzXG4gKi9cbmxldCBjb2RlRWRpdG9yU3R5bGVzSW5qZWN0ZWQgPSBmYWxzZTtcbmZ1bmN0aW9uIGluamVjdENvZGVFZGl0b3JTdHlsZXMoKTogdm9pZCB7XG4gIGlmIChjb2RlRWRpdG9yU3R5bGVzSW5qZWN0ZWQpIHJldHVybjtcbiAgY29kZUVkaXRvclN0eWxlc0luamVjdGVkID0gdHJ1ZTtcblxuICBjb25zdCBzdHlsZUlkID0gJ25pbGUtY29kZS1lZGl0b3ItY2VsbC1zdHlsZXMnO1xuICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc3R5bGVJZCkpIHJldHVybjtcblxuICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gIHN0eWxlLmlkID0gc3R5bGVJZDtcbiAgc3R5bGUudGV4dENvbnRlbnQgPSBgXG4gICAgLyogTmlsZSBDb2RlIEVkaXRvciBjZWxsIHN0eWxpbmcgLSBjb25zdHJhaW5lZCB0byBjZWxsIGhlaWdodCAqL1xuICAgIG5pbGUtY29kZS1lZGl0b3Iuc3QtY2VsbC1lZGl0b3Ige1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIG1heC1oZWlnaHQ6IDMycHg7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgZm9udC1zaXplOiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgICBmb250LWZhbWlseTogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgICAgbGluZS1oZWlnaHQ6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICB9XG4gICAgbmlsZS1jb2RlLWVkaXRvci5zdC1jZWxsLWVkaXRvcjo6cGFydChjb2RlLWVkaXRvci1iYXNlKSB7XG4gICAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgIG1pbi1oZWlnaHQ6IDEwMCUgIWltcG9ydGFudDtcbiAgICAgIG1heC1oZWlnaHQ6IDMycHggIWltcG9ydGFudDtcbiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7XG4gICAgICBmb250LXNpemU6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgICBsaW5lLWhlaWdodDogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xuICAgIH1cbiAgICAvKiBFbnN1cmUgcHJvcGVyIHNpemluZyB3aXRoaW4gdGFibGUgY2VsbCAqL1xuICAgIC5zdC1uaWxlLWNvZGUtZWRpdG9yIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgbWF4LWhlaWdodDogMzJweDtcbiAgICAgIG1pbi1oZWlnaHQ6IDI4cHg7XG4gICAgICBmb250LXNpemU6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgfVxuICAgIC8qIENvZGVNaXJyb3IgY29udGVudCBzaG91bGQgaW5oZXJpdCBmb250IHNpemUgYW5kIGJlIGNvbnN0cmFpbmVkICovXG4gICAgbmlsZS1jb2RlLWVkaXRvci5zdC1jZWxsLWVkaXRvciAuY20tZWRpdG9yIHtcbiAgICAgIG1heC1oZWlnaHQ6IDMycHggIWltcG9ydGFudDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcbiAgICB9XG4gICAgbmlsZS1jb2RlLWVkaXRvci5zdC1jZWxsLWVkaXRvciAuY20tc2Nyb2xsZXIge1xuICAgICAgbWF4LWhlaWdodDogMzJweCAhaW1wb3J0YW50O1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xuICAgIH1cbiAgICBuaWxlLWNvZGUtZWRpdG9yLnN0LWNlbGwtZWRpdG9yIC5jbS1jb250ZW50LFxuICAgIG5pbGUtY29kZS1lZGl0b3Iuc3QtY2VsbC1lZGl0b3IgLmNtLWxpbmUge1xuICAgICAgZm9udC1zaXplOiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgICBmb250LWZhbWlseTogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgICAgbGluZS1oZWlnaHQ6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICB9XG4gICAgLyogQ29udGFpbmVyIHdyYXBwZXIgZm9yIGVkaXRvciArIGV4cGFuZCBidXR0b24gKi9cbiAgICAuc3QtY29kZS1lZGl0b3Itd3JhcHBlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgbWF4LWhlaWdodDogMzJweDtcbiAgICAgIGdhcDogNHB4O1xuICAgIH1cbiAgICAuc3QtY29kZS1lZGl0b3Itd3JhcHBlciAuc3QtY29kZS1lZGl0b3ItaW5wdXQge1xuICAgICAgZmxleDogMTtcbiAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIG1heC1oZWlnaHQ6IDMycHg7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIH1cbiAgICAuc3QtY29kZS1lZGl0b3Itd3JhcHBlciAuc3QtZXhwYW5kLWJ1dHRvbiB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgd2lkdGg6IDI0cHg7XG4gICAgICBoZWlnaHQ6IDI0cHg7XG4gICAgICBtaW4td2lkdGg6IDI0cHg7XG4gICAgICBwYWRkaW5nOiAwO1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICBjb2xvcjogdmFyKC0tbmlsZS1jb2xvci1uZXV0cmFsLTUwMCwgIzZiNzI4MCk7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycztcbiAgICB9XG4gICAgLnN0LWNvZGUtZWRpdG9yLXdyYXBwZXIgLnN0LWV4cGFuZC1idXR0b246aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tbmlsZS1jb2xvci1uZXV0cmFsLTEwMCwgI2YzZjRmNik7XG4gICAgICBjb2xvcjogdmFyKC0tbmlsZS1jb2xvci1uZXV0cmFsLTcwMCwgIzM3NDE1MSk7XG4gICAgfVxuICAgIC8qIERpYWxvZyBjb2RlIGVkaXRvciBzdHlsaW5nIC0gZml4ZWQgaGVhZGVyL2Zvb3Rlciwgc2Nyb2xsYWJsZSBjb250ZW50ICovXG4gICAgLnN0LWNvZGUtZWRpdG9yLWRpYWxvZzo6cGFydChwYW5lbCkge1xuICAgICAgbWF4LWhlaWdodDogdmFyKC0tbWF4LWhlaWdodCwgODB2aCkgIWltcG9ydGFudDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcbiAgICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4gIWltcG9ydGFudDtcbiAgICB9XG4gICAgLnN0LWNvZGUtZWRpdG9yLWRpYWxvZzo6cGFydChoZWFkZXIpIHtcbiAgICAgIGZsZXgtc2hyaW5rOiAwICFpbXBvcnRhbnQ7XG4gICAgfVxuICAgIC5zdC1jb2RlLWVkaXRvci1kaWFsb2c6OnBhcnQoYm9keSkge1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xuICAgICAgZmxleDogMSAhaW1wb3J0YW50O1xuICAgICAgZGlzcGxheTogZmxleCAhaW1wb3J0YW50O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbiAhaW1wb3J0YW50O1xuICAgICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xuICAgIH1cbiAgICAuc3QtY29kZS1lZGl0b3ItZGlhbG9nIG5pbGUtY29kZS1lZGl0b3Ige1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gICAgLnN0LWNvZGUtZWRpdG9yLWRpYWxvZyBuaWxlLWNvZGUtZWRpdG9yOjpwYXJ0KGNvZGUtZWRpdG9yLWJhc2UpIHtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW5pbGUtY29sb3ItbmV1dHJhbC0yMDAsICNlNWU3ZWIpICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHggIWltcG9ydGFudDtcbiAgICB9XG4gIGA7XG4gIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xufVxuXG4vKipcbiAqIEN1c3RvbSBlZGl0b3IgdGhhdCB1c2VzIE5pbGVDb2RlRWRpdG9yIGNvbXBvbmVudFxuICogUHJvdmlkZXMgY29kZSBlZGl0aW5nIHdpdGggc3ludGF4IGhpZ2hsaWdodGluZyBmb3IgdGFibGUgY2VsbHNcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB2YWx1ZSB0eXBlICh0eXBpY2FsbHkgc3RyaW5nKVxuICovXG5leHBvcnQgY2xhc3MgTmlsZUNvZGVFZGl0b3I8VCA9IHN0cmluZz4gaW1wbGVtZW50cyBDZWxsRWRpdG9yPFQ+IHtcbiAgcHJpdmF0ZSBlZGl0b3I/OiBhbnk7XG4gIHByaXZhdGUgd3JhcHBlcj86IEhUTUxEaXZFbGVtZW50O1xuICBwcml2YXRlIGV4cGFuZEJ1dHRvbj86IEhUTUxCdXR0b25FbGVtZW50O1xuICBwcml2YXRlIGRpYWxvZz86IGFueTtcbiAgcHJpdmF0ZSBkaWFsb2dFZGl0b3I/OiBhbnk7XG4gIHByaXZhdGUgZXZlbnRMaXN0ZW5lcnM6IEFycmF5PHsgZXZlbnQ6IHN0cmluZzsgaGFuZGxlcjogRXZlbnRMaXN0ZW5lciB9PiA9IFtdO1xuICBwcml2YXRlIGNvbnRleHQ/OiBDZWxsRWRpdG9yQ29udGV4dDxUPjtcbiAgcHJpdmF0ZSBkaWFsb2dPcGVuID0gZmFsc2U7XG4gIHByaXZhdGUgZXhwYW5kQnV0dG9uQ2xpY2tlZCA9IGZhbHNlO1xuICBwcml2YXRlIGRvY3VtZW50Q2xpY2tIYW5kbGVyPzogKGU6IE1vdXNlRXZlbnQpID0+IHZvaWQ7XG4gIHByaXZhdGUgdHJhY2tlZFZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzeW5jaW5nRnJvbURpYWxvZyA9IGZhbHNlOyAvLyBGbGFnIHRvIHByZXZlbnQgaW5saW5lIGVkaXRvciBmcm9tIG92ZXJ3cml0aW5nIG11bHRpbGluZSBjb250ZW50XG4gIHByaXZhdGUgdXNlckVkaXRlZElubGluZSA9IGZhbHNlOyAvLyBGbGFnIHRvIHRyYWNrIGlmIHVzZXIgaGFzIHR5cGVkIGluIGlubGluZSBlZGl0b3JcbiAgcHJpdmF0ZSBkaWFsb2dPcmlnaW5hbFZhbHVlOiBzdHJpbmcgPSAnJzsgLy8gU3RvcmUgb3JpZ2luYWwgdmFsdWUgd2hlbiBkaWFsb2cgb3BlbnNcbiAgcHJpdmF0ZSBkaWFsb2dDdXJyZW50VmFsdWU6IHN0cmluZyA9ICcnOyAvLyBUcmFjayBjdXJyZW50IHZhbHVlIGluIGRpYWxvZ1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb3B0aW9ucz86IE5pbGVDb2RlRWRpdG9yT3B0aW9ucykge31cblxuICBlZGl0KGNvbnRleHQ6IENlbGxFZGl0b3JDb250ZXh0PFQ+KTogdm9pZCB7XG4gICAgaWYgKCFjb250ZXh0LmNvbnRhaW5lcikge1xuICAgICAgY29uc29sZS53YXJuKCdOaWxlQ29kZUVkaXRvciByZXF1aXJlcyBhIGNvbnRhaW5lciBlbGVtZW50Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAvLyBJbml0aWFsaXplIHRyYWNrZWQgdmFsdWUgZnJvbSBjb250ZXh0XG4gICAgdGhpcy50cmFja2VkVmFsdWUgPSBTdHJpbmcoY29udGV4dC52YWx1ZSA/PyAnJyk7XG4gICAgdGhpcy5zeW5jaW5nRnJvbURpYWxvZyA9IGZhbHNlO1xuICAgIHRoaXMudXNlckVkaXRlZElubGluZSA9IGZhbHNlO1xuXG4gICAgLy8gSW5qZWN0IGdsb2JhbCBzdHlsZXMgb25jZVxuICAgIGluamVjdENvZGVFZGl0b3JTdHlsZXMoKTtcblxuICAgIC8vIENoZWNrIGlmIHdlIHNob3VsZCBzaG93IGV4cGFuZCBidXR0b24gKGRlZmF1bHQ6IHRydWUpXG4gICAgY29uc3Qgc2hvd0V4cGFuZEJ1dHRvbiA9IHRoaXMub3B0aW9ucz8uc2hvd0V4cGFuZEJ1dHRvbiAhPT0gZmFsc2U7XG5cbiAgICBpZiAoc2hvd0V4cGFuZEJ1dHRvbikge1xuICAgICAgLy8gQ3JlYXRlIHdyYXBwZXIgZm9yIGVkaXRvciArIGV4cGFuZCBidXR0b25cbiAgICAgIHRoaXMud3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgdGhpcy53cmFwcGVyLmNsYXNzTmFtZSA9ICdzdC1jb2RlLWVkaXRvci13cmFwcGVyJztcblxuICAgICAgLy8gQ3JlYXRlIHRoZSBlZGl0b3IgY29udGFpbmVyXG4gICAgICBjb25zdCBlZGl0b3JDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGVkaXRvckNvbnRhaW5lci5jbGFzc05hbWUgPSAnc3QtY29kZS1lZGl0b3ItaW5wdXQnO1xuXG4gICAgICAvLyBDcmVhdGUgTmlsZUNvZGVFZGl0b3IgY3VzdG9tIGVsZW1lbnRcbiAgICAgIHRoaXMuZWRpdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbmlsZS1jb2RlLWVkaXRvcicpO1xuICAgICAgdGhpcy5lZGl0b3IudmFsdWUgPSBTdHJpbmcoY29udGV4dC52YWx1ZSA/PyAnJyk7XG4gICAgICB0aGlzLmVkaXRvci5jbGFzc05hbWUgPSAnc3QtY2VsbC1lZGl0b3Igc3QtbmlsZS1jb2RlLWVkaXRvcic7XG4gICAgICB0aGlzLmVkaXRvci5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgIHRoaXMuZWRpdG9yLnN0eWxlLmhlaWdodCA9ICcxMDAlJztcbiAgICAgIHRoaXMuZWRpdG9yLnN0eWxlLmJveFNpemluZyA9ICdib3JkZXItYm94JztcbiAgICAgIHRoaXMuZWRpdG9yLm5vYm9yZGVyID0gdGhpcy5vcHRpb25zPy5ub2JvcmRlciAhPT0gZmFsc2U7XG4gICAgICAvLyBFbmFibGUgbXVsdGlsaW5lIGJ5IGRlZmF1bHQgZm9yIGlubGluZSBlZGl0b3IgdG8gc3VwcG9ydCBwYXN0ZSBhbmQgbXVsdGlsaW5lIGNvbnRlbnRcbiAgICAgIHRoaXMuZWRpdG9yLm11bHRpbGluZSA9IHRoaXMub3B0aW9ucz8ubXVsdGlsaW5lICE9PSBmYWxzZTtcbiAgICAgIHRoaXMuZWRpdG9yLmhhc1Njcm9sbGVyID0gdHJ1ZTtcbiAgICAgIC8vIE5vIGxpbmUgbnVtYmVycyBmb3IgaW5saW5lIGVkaXRvclxuICAgICAgdGhpcy5lZGl0b3IubGluZU51bWJlcnMgPSBmYWxzZTtcblxuICAgICAgZWRpdG9yQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZWRpdG9yKTtcbiAgICAgIHRoaXMud3JhcHBlci5hcHBlbmRDaGlsZChlZGl0b3JDb250YWluZXIpO1xuXG4gICAgICAvLyBDcmVhdGUgZXhwYW5kIGJ1dHRvblxuICAgICAgdGhpcy5leHBhbmRCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgIHRoaXMuZXhwYW5kQnV0dG9uLmNsYXNzTmFtZSA9ICdzdC1leHBhbmQtYnV0dG9uJztcbiAgICAgIHRoaXMuZXhwYW5kQnV0dG9uLnR5cGUgPSAnYnV0dG9uJztcbiAgICAgIHRoaXMuZXhwYW5kQnV0dG9uLnRpdGxlID0gJ0V4cGFuZCBlZGl0b3InO1xuICAgICAgdGhpcy5leHBhbmRCdXR0b24uaW5uZXJIVE1MID0gJzxuaWxlLWljb24gbmFtZT1cImV4cGFuZC0wNlwiIHNpemU9XCIxNlwiPjwvbmlsZS1pY29uPic7XG4gICAgICBcbiAgICAgIC8vIFVzZSBtb3VzZWRvd24gdG8gc2V0IGZsYWcgQkVGT1JFIGJsdXIgZXZlbnQgZmlyZXNcbiAgICAgIHRoaXMuZXhwYW5kQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIChlKSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5leHBhbmRCdXR0b25DbGlja2VkID0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICB0aGlzLmV4cGFuZEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5vcGVuRGlhbG9nKCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMud3JhcHBlci5hcHBlbmRDaGlsZCh0aGlzLmV4cGFuZEJ1dHRvbik7XG5cbiAgICAgIC8vIENsZWFyIGNvbnRhaW5lciBhbmQgYXBwZW5kIHdyYXBwZXJcbiAgICAgIGNvbnRleHQuY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgY29udGV4dC5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy53cmFwcGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIE5pbGVDb2RlRWRpdG9yIGN1c3RvbSBlbGVtZW50IHdpdGhvdXQgd3JhcHBlclxuICAgICAgdGhpcy5lZGl0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCduaWxlLWNvZGUtZWRpdG9yJyk7XG4gICAgICB0aGlzLmVkaXRvci52YWx1ZSA9IFN0cmluZyhjb250ZXh0LnZhbHVlID8/ICcnKTtcbiAgICAgIHRoaXMuZWRpdG9yLmNsYXNzTmFtZSA9ICdzdC1jZWxsLWVkaXRvciBzdC1uaWxlLWNvZGUtZWRpdG9yJztcbiAgICAgIHRoaXMuZWRpdG9yLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgdGhpcy5lZGl0b3Iuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xuICAgICAgdGhpcy5lZGl0b3Iuc3R5bGUuYm94U2l6aW5nID0gJ2JvcmRlci1ib3gnO1xuICAgICAgdGhpcy5lZGl0b3Iubm9ib3JkZXIgPSB0aGlzLm9wdGlvbnM/Lm5vYm9yZGVyICE9PSBmYWxzZTtcbiAgICAgIC8vIEVuYWJsZSBtdWx0aWxpbmUgYnkgZGVmYXVsdCBmb3IgaW5saW5lIGVkaXRvciB0byBzdXBwb3J0IHBhc3RlIGFuZCBtdWx0aWxpbmUgY29udGVudFxuICAgICAgdGhpcy5lZGl0b3IubXVsdGlsaW5lID0gdGhpcy5vcHRpb25zPy5tdWx0aWxpbmUgIT09IGZhbHNlO1xuICAgICAgdGhpcy5lZGl0b3IuaGFzU2Nyb2xsZXIgPSB0cnVlO1xuICAgICAgLy8gTm8gbGluZSBudW1iZXJzIGZvciBpbmxpbmUgZWRpdG9yXG4gICAgICB0aGlzLmVkaXRvci5saW5lTnVtYmVycyA9IGZhbHNlO1xuXG4gICAgICAvLyBDbGVhciBjb250YWluZXIgYW5kIGFwcGVuZCBlZGl0b3JcbiAgICAgIGNvbnRleHQuY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgY29udGV4dC5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5lZGl0b3IpO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IGFsbCBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICB0aGlzLmFwcGx5T3B0aW9ucygpO1xuXG4gICAgLy8gU2V0IHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgIHRoaXMuc2V0dXBFdmVudExpc3RlbmVycyhjb250ZXh0KTtcblxuICAgIC8vIEF1dG8gZm9jdXMgLSBuZWVkIGEgc2xpZ2h0IGRlbGF5IGZvciBuaWxlLWNvZGUtZWRpdG9yIHRvIGZ1bGx5IGluaXRpYWxpemVcbiAgICBpZiAodGhpcy5vcHRpb25zPy5hdXRvRm9jdXMgIT09IGZhbHNlKSB7XG4gICAgICAvLyBMaXN0ZW4gZm9yIHRoZSBuaWxlLWFmdGVyLWluaXQgZXZlbnQgd2hpY2ggZmlyZXMgd2hlbiBlZGl0b3IgaXMgcmVhZHlcbiAgICAgIGNvbnN0IGluaXRIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmVkaXRvcj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbmlsZS1hZnRlci1pbml0JywgaW5pdEhhbmRsZXIpO1xuICAgICAgICB0aGlzLmZvY3VzRWRpdG9yKCk7XG4gICAgICB9O1xuICAgICAgdGhpcy5lZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcignbmlsZS1hZnRlci1pbml0JywgaW5pdEhhbmRsZXIpO1xuICAgICAgXG4gICAgICAvLyBGYWxsYmFjazogYWxzbyB0cnkgYWZ0ZXIgYSBkZWxheSBpbiBjYXNlIHRoZSBldmVudCBhbHJlYWR5IGZpcmVkXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5mb2N1c0VkaXRvcigpO1xuICAgICAgfSwgMTAwKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9jdXMgdGhlIGVkaXRvciBhbmQgcGxhY2UgY3Vyc29yXG4gICAqL1xuICBwcml2YXRlIGZvY3VzRWRpdG9yKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0b3IpIHJldHVybjtcbiAgICBcbiAgICB0cnkge1xuICAgICAgLy8gQ2FsbCB0aGUgY29tcG9uZW50J3MgZm9jdXMgbWV0aG9kXG4gICAgICB0aGlzLmVkaXRvci5mb2N1cygpO1xuICAgICAgXG4gICAgICAvLyBUcnkgdG8gZGlyZWN0bHkgZm9jdXMgdGhlIENvZGVNaXJyb3IgY29udGVudCBhcmVhXG4gICAgICBjb25zdCBzaGFkb3dSb290ID0gdGhpcy5lZGl0b3Iuc2hhZG93Um9vdDtcbiAgICAgIGlmIChzaGFkb3dSb290KSB7XG4gICAgICAgIGNvbnN0IGNtQ29udGVudCA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignLmNtLWNvbnRlbnQnKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKGNtQ29udGVudCkge1xuICAgICAgICAgIGNtQ29udGVudC5mb2N1cygpO1xuICAgICAgICAgIC8vIERpc3BhdGNoIGEgY2xpY2sgZXZlbnQgdG8gZW5zdXJlIGN1cnNvciBwbGFjZW1lbnRcbiAgICAgICAgICBjbUNvbnRlbnQuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgnbW91c2Vkb3duJywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICAgICAgICBjbUNvbnRlbnQuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgnbW91c2V1cCcsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBTaWxlbnRseSBoYW5kbGUgYW55IGVycm9yc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRoZSBsaXZlIHZhbHVlIGRpcmVjdGx5IGZyb20gQ29kZU1pcnJvcidzIGludGVybmFsIHN0YXRlLFxuICAgKiBieXBhc3NpbmcgZGVib3VuY2VkIG5pbGUtY2hhbmdlIGV2ZW50cyBhbmQgdGhlIHBvc3NpYmx5LXN0YWxlIC52YWx1ZSBwcm9wZXJ0eS5cbiAgICogXG4gICAqIFByaW9yaXR5IG9yZGVyOlxuICAgKiAxLiB0cmFja2VkVmFsdWUgLSBhbHdheXMgdXAgdG8gZGF0ZSBmcm9tIGNoYW5nZSBldmVudHNcbiAgICogMi4gQ29kZU1pcnJvciBpbnRlcm5hbCBzdGF0ZSAtIGZvciByZWFsLXRpbWUgcmVhZGluZ1xuICAgKiAzLiBlZGl0b3IudmFsdWUgcHJvcGVydHkgLSBmYWxsYmFja1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRMaXZlRWRpdG9yVmFsdWUoKTogc3RyaW5nIHtcbiAgICAvLyBVc2UgdHJhY2tlZCB2YWx1ZSBpZiBhdmFpbGFibGUgKHVwZGF0ZWQgYnkgY2hhbmdlIGV2ZW50cylcbiAgICBpZiAodGhpcy50cmFja2VkVmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYWNrZWRWYWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZWRpdG9yKSByZXR1cm4gJyc7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2hhZG93Um9vdCA9IHRoaXMuZWRpdG9yLnNoYWRvd1Jvb3Q7XG4gICAgICBpZiAoc2hhZG93Um9vdCkge1xuICAgICAgICBjb25zdCBjbUVkaXRvciA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignLmNtLWVkaXRvcicpIGFzIGFueTtcbiAgICAgICAgaWYgKGNtRWRpdG9yPy5jbVZpZXc/LnZpZXcpIHtcbiAgICAgICAgICByZXR1cm4gY21FZGl0b3IuY21WaWV3LnZpZXcuc3RhdGUuZG9jLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBvdGhlciBtZXRob2RzXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLnZhbHVlID8/ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gdGhlIGZ1bGwgZWRpdG9yIGRpYWxvZ1xuICAgKi9cbiAgcHJpdmF0ZSBvcGVuRGlhbG9nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpYWxvZ09wZW4pIHJldHVybjtcbiAgICB0aGlzLmRpYWxvZ09wZW4gPSB0cnVlO1xuICAgIHRoaXMuZXhwYW5kQnV0dG9uQ2xpY2tlZCA9IGZhbHNlOyAvLyBSZXNldCBmbGFnIG5vdyB0aGF0IGRpYWxvZyBpcyBvcGVuaW5nXG5cbiAgICAvLyBTdG9yZSBvcmlnaW5hbCB2YWx1ZSBmb3IgY2FuY2VsIGZ1bmN0aW9uYWxpdHlcbiAgICB0aGlzLmRpYWxvZ09yaWdpbmFsVmFsdWUgPSB0aGlzLmdldExpdmVFZGl0b3JWYWx1ZSgpO1xuXG4gICAgLy8gQ3JlYXRlIGRpYWxvZyB3aXRoIGNvbmZpZ3VyYWJsZSBkaW1lbnNpb25zXG4gICAgY29uc3QgZGlhbG9nV2lkdGggPSB0aGlzLm9wdGlvbnM/LmRpYWxvZ1dpZHRoIHx8ICc2MDBweCc7XG4gICAgY29uc3QgZGlhbG9nTWF4SGVpZ2h0ID0gdGhpcy5vcHRpb25zPy5kaWFsb2dNYXhIZWlnaHQgfHwgJzgwdmgnO1xuICAgIGNvbnN0IGRpYWxvZ0VkaXRvckhlaWdodCA9IHRoaXMub3B0aW9ucz8uZGlhbG9nRWRpdG9ySGVpZ2h0IHx8ICczMDBweCc7XG4gICAgY29uc3QgZGlhbG9nVGl0bGUgPSB0aGlzLm9wdGlvbnM/LmRpYWxvZ1RpdGxlIHx8ICdFZGl0IENvZGUnO1xuXG4gICAgdGhpcy5kaWFsb2cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCduaWxlLWRpYWxvZycpO1xuICAgIHRoaXMuZGlhbG9nLmNsYXNzTmFtZSA9ICdzdC1jb2RlLWVkaXRvci1kaWFsb2cnO1xuICAgIHRoaXMuZGlhbG9nLmxhYmVsID0gZGlhbG9nVGl0bGU7XG4gICAgdGhpcy5kaWFsb2cuc3R5bGUuc2V0UHJvcGVydHkoJy0td2lkdGgnLCBkaWFsb2dXaWR0aCk7XG4gICAgdGhpcy5kaWFsb2cuc3R5bGUuc2V0UHJvcGVydHkoJy0tbWF4LWhlaWdodCcsIGRpYWxvZ01heEhlaWdodCk7XG5cbiAgICAvLyBDcmVhdGUgZGlhbG9nIGNvbnRlbnQgd3JhcHBlciAtIGZsZXggY29sdW1uIHRvIGhhbmRsZSBmaXhlZCBoZWFkZXIvZm9vdGVyXG4gICAgY29uc3QgY29udGVudFdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb250ZW50V3JhcHBlci5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgIGNvbnRlbnRXcmFwcGVyLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSAnY29sdW1uJztcbiAgICBjb250ZW50V3JhcHBlci5zdHlsZS5oZWlnaHQgPSBgY2FsYygke2RpYWxvZ01heEhlaWdodH0gLSA2MHB4KWA7IC8vIEFjY291bnQgZm9yIGRpYWxvZyBoZWFkZXJcbiAgICBjb250ZW50V3JhcHBlci5zdHlsZS5tYXhIZWlnaHQgPSBgY2FsYygke2RpYWxvZ01heEhlaWdodH0gLSA2MHB4KWA7XG5cbiAgICAvLyBDcmVhdGUgZWRpdG9yIGNvbnRlbnQgYXJlYSAtIHRoaXMgaXMgdGhlIHNjcm9sbGFibGUgcGFydFxuICAgIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb250ZW50LnN0eWxlLnBhZGRpbmcgPSAnMTZweCc7XG4gICAgY29udGVudC5zdHlsZS5wYWRkaW5nQm90dG9tID0gJzhweCc7XG4gICAgY29udGVudC5zdHlsZS5mbGV4ID0gJzEnO1xuICAgIGNvbnRlbnQuc3R5bGUub3ZlcmZsb3cgPSAnYXV0byc7XG4gICAgY29udGVudC5zdHlsZS5taW5IZWlnaHQgPSAnMCc7IC8vIEltcG9ydGFudCBmb3IgZmxleCBzaHJpbmtpbmdcblxuICAgIC8vIENyZWF0ZSBmdWxsIGVkaXRvclxuICAgIHRoaXMuZGlhbG9nRWRpdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbmlsZS1jb2RlLWVkaXRvcicpO1xuICAgIHRoaXMuZGlhbG9nRWRpdG9yLnZhbHVlID0gdGhpcy5kaWFsb2dPcmlnaW5hbFZhbHVlO1xuICAgIHRoaXMuZGlhbG9nRWRpdG9yLm11bHRpbGluZSA9IHRydWU7XG4gICAgdGhpcy5kaWFsb2dFZGl0b3IubGluZU51bWJlcnNNdWx0aWxpbmUgPSB0cnVlO1xuICAgIHRoaXMuZGlhbG9nRWRpdG9yLmhhc1Njcm9sbGVyID0gdHJ1ZTtcbiAgICB0aGlzLmRpYWxvZ0VkaXRvci5zdHlsZS5taW5IZWlnaHQgPSBkaWFsb2dFZGl0b3JIZWlnaHQ7XG5cbiAgICAvLyBBcHBseSBzYW1lIG9wdGlvbnMgdG8gZGlhbG9nIGVkaXRvclxuICAgIGlmICh0aGlzLm9wdGlvbnM/Lmxhbmd1YWdlKSB7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvci5sYW5ndWFnZSA9IHRoaXMub3B0aW9ucy5sYW5ndWFnZTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucz8ucGxhY2Vob2xkZXIpIHtcbiAgICAgIHRoaXMuZGlhbG9nRWRpdG9yLnBsYWNlaG9sZGVyID0gdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zPy50YWJDb21wbGV0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZGlhbG9nRWRpdG9yLnRhYkNvbXBsZXRpb24gPSB0aGlzLm9wdGlvbnMudGFiQ29tcGxldGlvbjtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZW5hYmxlU2VhcmNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZGlhbG9nRWRpdG9yLmVuYWJsZVNlYXJjaCA9IHRoaXMub3B0aW9ucy5lbmFibGVTZWFyY2g7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmVuYWJsZUZvbGRHdXR0ZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZGlhbG9nRWRpdG9yLmVuYWJsZUZvbGRHdXR0ZXJzID0gdGhpcy5vcHRpb25zLmVuYWJsZUZvbGRHdXR0ZXJzO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zPy5jdXN0b21BdXRvQ29tcGxldGlvbnMpIHtcbiAgICAgIHRoaXMuZGlhbG9nRWRpdG9yLmN1c3RvbUF1dG9Db21wbGV0aW9ucyA9IHRoaXMub3B0aW9ucy5jdXN0b21BdXRvQ29tcGxldGlvbnM7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmN1c3RvbUNvbXBsZXRpb25zUGF0aHMpIHtcbiAgICAgIHRoaXMuZGlhbG9nRWRpdG9yLmN1c3RvbUNvbXBsZXRpb25zUGF0aHMgPSB0aGlzLm9wdGlvbnMuY3VzdG9tQ29tcGxldGlvbnNQYXRocztcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucz8uY3VzdG9tVGhlbWVDU1MpIHtcbiAgICAgIHRoaXMuZGlhbG9nRWRpdG9yLmN1c3RvbVRoZW1lQ1NTID0gdGhpcy5vcHRpb25zLmN1c3RvbVRoZW1lQ1NTO1xuICAgIH1cblxuICAgIHRoaXMuZGlhbG9nRWRpdG9yLmV4cGFuZGFibGUgPSBmYWxzZTtcblxuICAgIC8vIEluaXRpYWxpemUgZGlhbG9nIGN1cnJlbnQgdmFsdWVcbiAgICB0aGlzLmRpYWxvZ0N1cnJlbnRWYWx1ZSA9IHRoaXMuZGlhbG9nT3JpZ2luYWxWYWx1ZTtcblxuICAgIC8vIFRyYWNrIGNoYW5nZXMgaW4gZGlhbG9nIGVkaXRvclxuICAgIHRoaXMuZGlhbG9nRWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ25pbGUtY2hhbmdlJywgKGU6IEN1c3RvbUV2ZW50KSA9PiB7XG4gICAgICB0aGlzLmRpYWxvZ0N1cnJlbnRWYWx1ZSA9IGUuZGV0YWlsPy52YWx1ZSA/PyAnJztcbiAgICB9KTtcblxuICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQodGhpcy5kaWFsb2dFZGl0b3IpO1xuICAgIGNvbnRlbnRXcmFwcGVyLmFwcGVuZENoaWxkKGNvbnRlbnQpO1xuXG4gICAgLy8gQ3JlYXRlIGZvb3RlciB3aXRoIE9rIGJ1dHRvbiAtIGZpeGVkIGF0IGJvdHRvbVxuICAgIGNvbnN0IGZvb3RlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGZvb3Rlci5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgIGZvb3Rlci5zdHlsZS5qdXN0aWZ5Q29udGVudCA9ICdmbGV4LWVuZCc7XG4gICAgZm9vdGVyLnN0eWxlLnBhZGRpbmcgPSAnMTJweCAxNnB4JztcbiAgICBmb290ZXIuc3R5bGUuYm9yZGVyVG9wID0gJzFweCBzb2xpZCB2YXIoLS1uaWxlLWNvbG9yLW5ldXRyYWwtMjAwLCAjZTVlN2ViKSc7XG4gICAgZm9vdGVyLnN0eWxlLmdhcCA9ICc4cHgnO1xuICAgIGZvb3Rlci5zdHlsZS5mbGV4U2hyaW5rID0gJzAnOyAvLyBQcmV2ZW50IGZvb3RlciBmcm9tIHNocmlua2luZ1xuICAgIGZvb3Rlci5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAndmFyKC0tbmlsZS1jb2xvci1uZXV0cmFsLTAsICNmZmZmZmYpJztcblxuICAgIGNvbnN0IG9rQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbmlsZS1idXR0b24nKTtcbiAgICBva0J1dHRvbi5zZXRBdHRyaWJ1dGUoJ3ZhcmlhbnQnLCAncHJpbWFyeScpO1xuICAgIG9rQnV0dG9uLnRleHRDb250ZW50ID0gJ09rJztcbiAgICBva0J1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRoaXMuYXBwbHlEaWFsb2dDaGFuZ2VzKCk7XG4gICAgfSk7XG5cbiAgICBmb290ZXIuYXBwZW5kQ2hpbGQob2tCdXR0b24pO1xuICAgIGNvbnRlbnRXcmFwcGVyLmFwcGVuZENoaWxkKGZvb3Rlcik7XG5cbiAgICB0aGlzLmRpYWxvZy5hcHBlbmRDaGlsZChjb250ZW50V3JhcHBlcik7XG5cbiAgICAvLyBIYW5kbGUgZGlhbG9nIGNsb3NlIGV2ZW50cyAoY2xpY2tpbmcgWCBidXR0b24gLSBjYW5jZWwgY2hhbmdlcylcbiAgICB0aGlzLmRpYWxvZy5hZGRFdmVudExpc3RlbmVyKCduaWxlLXJlcXVlc3QtY2xvc2UnLCAoZTogRXZlbnQpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIC8vIFggYnV0dG9uIG9yIG92ZXJsYXkgY2xpY2sgLSBjYW5jZWwgY2hhbmdlc1xuICAgICAgdGhpcy5jYW5jZWxEaWFsb2dDaGFuZ2VzKCk7XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGUgRXNjYXBlIGtleSBpbiBkaWFsb2cgLSBjYW5jZWwgY2hhbmdlc1xuICAgIHRoaXMuZGlhbG9nLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuY2FuY2VsRGlhbG9nQ2hhbmdlcygpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQXBwZW5kIHRvIGJvZHkgYW5kIHNob3dcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuZGlhbG9nKTtcbiAgICBcbiAgICAvLyBPcGVuIGRpYWxvZyBhZnRlciBhIHRpY2sgdG8gZW5zdXJlIGl0J3MgaW4gdGhlIERPTVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGlhbG9nKSB7XG4gICAgICAgIHRoaXMuZGlhbG9nLm9wZW4gPSB0cnVlO1xuICAgICAgICAvLyBGb2N1cyB0aGUgZGlhbG9nIGVkaXRvclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmRpYWxvZ0VkaXRvcj8uZm9jdXMoKTtcbiAgICAgICAgfSwgMTAwKTtcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGUgZGlhbG9nIGVkaXRvclxuICAgKi9cbiAgcHJpdmF0ZSBnZXREaWFsb2dFZGl0b3JWYWx1ZSgpOiBzdHJpbmcge1xuICAgIC8vIFVzZSB0cmFja2VkIHZhbHVlIGZyb20gY2hhbmdlIGV2ZW50cyAobW9zdCByZWxpYWJsZSlcbiAgICBpZiAodGhpcy5kaWFsb2dDdXJyZW50VmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpYWxvZ0N1cnJlbnRWYWx1ZS5yZXBsYWNlKC9cXG4rJC8sICcnKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKCF0aGlzLmRpYWxvZ0VkaXRvcikgcmV0dXJuIHRoaXMuZGlhbG9nT3JpZ2luYWxWYWx1ZTtcbiAgICBcbiAgICAvLyBUcnkgdG8gZ2V0IHZhbHVlIGZyb20gQ29kZU1pcnJvcidzIGludGVybmFsIHN0YXRlXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSB0aGlzLmRpYWxvZ0VkaXRvci5zaGFkb3dSb290O1xuICAgICAgaWYgKHNoYWRvd1Jvb3QpIHtcbiAgICAgICAgY29uc3QgY21FZGl0b3IgPSBzaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJy5jbS1lZGl0b3InKSBhcyBhbnk7XG4gICAgICAgIGlmIChjbUVkaXRvcj8uY21WaWV3Py52aWV3KSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBjbUVkaXRvci5jbVZpZXcudmlldy5zdGF0ZS5kb2MudG9TdHJpbmcoKTtcbiAgICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxuKyQvLCAnJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBvdGhlciBtZXRob2RzXG4gICAgfVxuICAgIFxuICAgIC8vIEZhbGxiYWNrIHRvIHZhbHVlIHByb3BlcnR5XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmRpYWxvZ0VkaXRvci52YWx1ZTtcbiAgICByZXR1cm4gKHZhbHVlID8/ICcnKS5yZXBsYWNlKC9cXG4rJC8sICcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBjaGFuZ2VzIGZyb20gZGlhbG9nIGFuZCBjbG9zZSBpdFxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseURpYWxvZ0NoYW5nZXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRpYWxvZ09wZW4pIHJldHVybjtcblxuICAgIC8vIEdldCB0aGUgdmFsdWUgZnJvbSBkaWFsb2cgZWRpdG9yIC0gdHJ5IG11bHRpcGxlIHNvdXJjZXNcbiAgICBsZXQgZGlhbG9nVmFsdWUgPSB0aGlzLmRpYWxvZ0N1cnJlbnRWYWx1ZTtcbiAgICBcbiAgICAvLyBJZiBubyB0cmFja2VkIHZhbHVlLCB0cnkgcmVhZGluZyBkaXJlY3RseSBmcm9tIGRpYWxvZyBlZGl0b3JcbiAgICBpZiAoIWRpYWxvZ1ZhbHVlICYmIHRoaXMuZGlhbG9nRWRpdG9yKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzaGFkb3dSb290ID0gdGhpcy5kaWFsb2dFZGl0b3Iuc2hhZG93Um9vdDtcbiAgICAgICAgaWYgKHNoYWRvd1Jvb3QpIHtcbiAgICAgICAgICBjb25zdCBjbUVkaXRvciA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignLmNtLWVkaXRvcicpIGFzIGFueTtcbiAgICAgICAgICBpZiAoY21FZGl0b3I/LmNtVmlldz8udmlldykge1xuICAgICAgICAgICAgZGlhbG9nVmFsdWUgPSBjbUVkaXRvci5jbVZpZXcudmlldy5zdGF0ZS5kb2MudG9TdHJpbmcoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBGYWxsIHRocm91Z2hcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRmFsbGJhY2sgdG8gdmFsdWUgcHJvcGVydHlcbiAgICAgIGlmICghZGlhbG9nVmFsdWUpIHtcbiAgICAgICAgZGlhbG9nVmFsdWUgPSB0aGlzLmRpYWxvZ0VkaXRvci52YWx1ZSA/PyAnJztcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gU3RyaXAgdHJhaWxpbmcgbmV3bGluZXNcbiAgICBkaWFsb2dWYWx1ZSA9IChkaWFsb2dWYWx1ZSB8fCAnJykucmVwbGFjZSgvXFxuKyQvLCAnJyk7XG4gICAgXG4gICAgLy8gVXBkYXRlIHRyYWNrZWQgdmFsdWUgYW5kIGlubGluZSBlZGl0b3JcbiAgICB0aGlzLnRyYWNrZWRWYWx1ZSA9IGRpYWxvZ1ZhbHVlO1xuICAgIHRoaXMudXNlckVkaXRlZElubGluZSA9IGZhbHNlO1xuICAgIFxuICAgIHRoaXMuc3luY2luZ0Zyb21EaWFsb2cgPSB0cnVlO1xuICAgIGlmICh0aGlzLmVkaXRvcikge1xuICAgICAgdGhpcy5lZGl0b3IudmFsdWUgPSBkaWFsb2dWYWx1ZTtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnN5bmNpbmdGcm9tRGlhbG9nID0gZmFsc2U7XG4gICAgfSwgMCk7XG4gICAgXG4gICAgLy8gTm90aWZ5IGNvbnRleHQgb2YgdGhlIGNoYW5nZVxuICAgIGlmICh0aGlzLmNvbnRleHQpIHtcbiAgICAgIHRoaXMuY29udGV4dC5vbkNoYW5nZShkaWFsb2dWYWx1ZSBhcyB1bmtub3duIGFzIFQpO1xuICAgIH1cblxuICAgIC8vIENsb3NlIGRpYWxvZ1xuICAgIHRoaXMuY2xvc2VEaWFsb2dVSSgpO1xuICAgIFxuICAgIC8vIFJlZm9jdXMgdGhlIGNlbGwgZWRpdG9yIHRvIHN0YXkgaW4gZWRpdCBtb2RlXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmZvY3VzRWRpdG9yKCk7XG4gICAgfSwgNTApO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbCBkaWFsb2cgY2hhbmdlcyBhbmQgcmV2ZXJ0IHRvIG9yaWdpbmFsIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIGNhbmNlbERpYWxvZ0NoYW5nZXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRpYWxvZ09wZW4pIHJldHVybjtcblxuICAgIC8vIFJldmVydCB0byBvcmlnaW5hbCB2YWx1ZSAoZG9uJ3QgY2hhbmdlIGFueXRoaW5nKVxuICAgIC8vIHRyYWNrZWRWYWx1ZSBhbmQgaW5saW5lIGVkaXRvciByZW1haW4gYXMgdGhleSB3ZXJlIGJlZm9yZSBkaWFsb2cgb3BlbmVkXG5cbiAgICAvLyBDbG9zZSBkaWFsb2dcbiAgICB0aGlzLmNsb3NlRGlhbG9nVUkoKTtcbiAgICBcbiAgICAvLyBSZWZvY3VzIHRoZSBjZWxsIGVkaXRvciB0byBzdGF5IGluIGVkaXQgbW9kZVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5mb2N1c0VkaXRvcigpO1xuICAgIH0sIDUwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSBhbmQgcmVtb3ZlIHRoZSBkaWFsb2cgVUlcbiAgICovXG4gIHByaXZhdGUgY2xvc2VEaWFsb2dVSSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpYWxvZ09wZW4gPSBmYWxzZTtcbiAgICB0aGlzLmRpYWxvZ0N1cnJlbnRWYWx1ZSA9ICcnO1xuXG4gICAgaWYgKHRoaXMuZGlhbG9nKSB7XG4gICAgICB0aGlzLmRpYWxvZy5vcGVuID0gZmFsc2U7XG4gICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZztcbiAgICAgIHRoaXMuZGlhbG9nID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kaWFsb2dFZGl0b3IgPSB1bmRlZmluZWQ7XG4gICAgICBcbiAgICAgIC8vIFJlbW92ZSBmcm9tIERPTSBhZnRlciBhbmltYXRpb25cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBkaWFsb2dSZWY/LnJlbW92ZSgpO1xuICAgICAgfSwgMjAwKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgYWxsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB0aGUgTmlsZUNvZGVFZGl0b3IgZWxlbWVudFxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseU9wdGlvbnMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVkaXRvcikgcmV0dXJuO1xuXG4gICAgLy8gTGFuZ3VhZ2UgYW5kIHN5bnRheFxuICAgIGlmICh0aGlzLm9wdGlvbnM/Lmxhbmd1YWdlKSB7XG4gICAgICB0aGlzLmVkaXRvci5sYW5ndWFnZSA9IHRoaXMub3B0aW9ucy5sYW5ndWFnZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5kaXNhYmxlU3ludGF4SGlnaGxpZ2h0aW5nKSB7XG4gICAgICB0aGlzLmVkaXRvci5kaXNhYmxlU3ludGF4SGlnaGxpZ2h0aW5nID0gdGhpcy5vcHRpb25zLmRpc2FibGVTeW50YXhIaWdobGlnaHRpbmc7XG4gICAgfVxuXG4gICAgLy8gRWRpdG9yIGFwcGVhcmFuY2VcbiAgICBpZiAodGhpcy5vcHRpb25zPy5wbGFjZWhvbGRlcikge1xuICAgICAgdGhpcy5lZGl0b3IucGxhY2Vob2xkZXIgPSB0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXI7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8ubGluZU51bWJlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lZGl0b3IubGluZU51bWJlcnMgPSB0aGlzLm9wdGlvbnMubGluZU51bWJlcnM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8ubGluZU51bWJlcnNNdWx0aWxpbmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lZGl0b3IubGluZU51bWJlcnNNdWx0aWxpbmUgPSB0aGlzLm9wdGlvbnMubGluZU51bWJlcnNNdWx0aWxpbmU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8ubXVsdGlsaW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLm11bHRpbGluZSA9IHRoaXMub3B0aW9ucy5tdWx0aWxpbmU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZGVmYXVsdEZvbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lZGl0b3IuZGVmYXVsdEZvbnQgPSB0aGlzLm9wdGlvbnMuZGVmYXVsdEZvbnQ7XG4gICAgfVxuXG4gICAgLy8gRWRpdG9yIGJlaGF2aW9yXG4gICAgaWYgKHRoaXMub3B0aW9ucz8ucmVhZG9ubHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lZGl0b3IucmVhZG9ubHkgPSB0aGlzLm9wdGlvbnMucmVhZG9ubHk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZGlzYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lZGl0b3IuZGlzYWJsZWQgPSB0aGlzLm9wdGlvbnMuZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8udGFiQ29tcGxldGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVkaXRvci50YWJDb21wbGV0aW9uID0gdGhpcy5vcHRpb25zLnRhYkNvbXBsZXRpb247XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZW5hYmxlU2VhcmNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmVuYWJsZVNlYXJjaCA9IHRoaXMub3B0aW9ucy5lbmFibGVTZWFyY2g7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZW5hYmxlRm9sZEd1dHRlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lZGl0b3IuZW5hYmxlRm9sZEd1dHRlcnMgPSB0aGlzLm9wdGlvbnMuZW5hYmxlRm9sZEd1dHRlcnM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uaGFzU2Nyb2xsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lZGl0b3IuaGFzU2Nyb2xsZXIgPSB0aGlzLm9wdGlvbnMuaGFzU2Nyb2xsZXI7XG4gICAgfVxuXG4gICAgLy8gRXhwYW5kYWJsZSAtIGRlZmF1bHQgdG8gZmFsc2UgZm9yIGNlbGwgZWRpdGluZ1xuICAgIHRoaXMuZWRpdG9yLmV4cGFuZGFibGUgPSB0aGlzLm9wdGlvbnM/LmV4cGFuZGFibGUgPz8gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5leHBhbmRJY29uKSB7XG4gICAgICB0aGlzLmVkaXRvci5leHBhbmRJY29uID0gdGhpcy5vcHRpb25zLmV4cGFuZEljb247XG4gICAgfVxuXG4gICAgLy8gQXV0b2NvbXBsZXRpb25cbiAgICBpZiAodGhpcy5vcHRpb25zPy5jdXN0b21BdXRvQ29tcGxldGlvbnMpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmN1c3RvbUF1dG9Db21wbGV0aW9ucyA9IHRoaXMub3B0aW9ucy5jdXN0b21BdXRvQ29tcGxldGlvbnM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uY3VzdG9tQ29tcGxldGlvbnNQYXRocykge1xuICAgICAgdGhpcy5lZGl0b3IuY3VzdG9tQ29tcGxldGlvbnNQYXRocyA9IHRoaXMub3B0aW9ucy5jdXN0b21Db21wbGV0aW9uc1BhdGhzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmFsbG93VmFyaWFibGVJbkN1c3RvbVN1Z2dlc3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lZGl0b3IuYWxsb3dWYXJpYWJsZUluQ3VzdG9tU3VnZ2VzdGlvbiA9IHRoaXMub3B0aW9ucy5hbGxvd1ZhcmlhYmxlSW5DdXN0b21TdWdnZXN0aW9uO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmFib3ZlQ3Vyc29yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmFib3ZlQ3Vyc29yID0gdGhpcy5vcHRpb25zLmFib3ZlQ3Vyc29yO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmF1dG9Db21wbGV0ZVN0eWxlKSB7XG4gICAgICB0aGlzLmVkaXRvci5hdXRvQ29tcGxldGVTdHlsZSA9IHRoaXMub3B0aW9ucy5hdXRvQ29tcGxldGVTdHlsZTtcbiAgICB9XG5cbiAgICAvLyBDaGFuZ2UgaGFuZGxpbmdcbiAgICBpZiAodGhpcy5vcHRpb25zPy5kZWJvdW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVkaXRvci5kZWJvdW5jZSA9IHRoaXMub3B0aW9ucy5kZWJvdW5jZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5kZWJvdW5jZVRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lZGl0b3IuZGVib3VuY2VUaW1lb3V0ID0gdGhpcy5vcHRpb25zLmRlYm91bmNlVGltZW91dDtcbiAgICB9XG5cbiAgICAvLyBWaXN1YWwgc3RhdGVzXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lZGl0b3IuZXJyb3IgPSB0aGlzLm9wdGlvbnMuZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZXJyb3JNZXNzYWdlKSB7XG4gICAgICB0aGlzLmVkaXRvci5lcnJvck1lc3NhZ2UgPSB0aGlzLm9wdGlvbnMuZXJyb3JNZXNzYWdlO1xuICAgIH1cblxuICAgIC8vIEN1c3RvbSB0aGVtZVxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmN1c3RvbVRoZW1lQ1NTKSB7XG4gICAgICB0aGlzLmVkaXRvci5jdXN0b21UaGVtZUNTUyA9IHRoaXMub3B0aW9ucy5jdXN0b21UaGVtZUNTUztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IHVwIGFsbCBldmVudCBsaXN0ZW5lcnMgd2l0aCBwcm9wZXIgY2xlYW51cCB0cmFja2luZ1xuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cEV2ZW50TGlzdGVuZXJzKGNvbnRleHQ6IENlbGxFZGl0b3JDb250ZXh0PFQ+KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVkaXRvcikgcmV0dXJuO1xuXG4gICAgY29uc3QgdmFsaWRhdGVPblNhdmUgPSB0aGlzLm9wdGlvbnM/LnZhbGlkYXRlT25TYXZlICE9PSBmYWxzZTtcblxuICAgIC8vIEhhbmRsZSBrZXlib2FyZCBldmVudHNcbiAgICBjb25zdCBrZXlkb3duSGFuZGxlciA9IChlOiBFdmVudCkgPT4ge1xuICAgICAgY29uc3Qga2V5RXZlbnQgPSBlIGFzIEtleWJvYXJkRXZlbnQ7XG4gICAgICBcbiAgICAgIC8vIEZvciBzaW5nbGUtbGluZSBtb2RlLCBFbnRlciBzYXZlc1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbnM/Lm11bHRpbGluZSAmJiBrZXlFdmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgICAga2V5RXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAga2V5RXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuc2F2ZVZhbHVlKGNvbnRleHQsIHZhbGlkYXRlT25TYXZlKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRXNjYXBlIGNhbmNlbHNcbiAgICAgIGlmIChrZXlFdmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgIGtleUV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGtleUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBjb250ZXh0Lm9uQ2FuY2VsKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLmVkaXRvci5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywga2V5ZG93bkhhbmRsZXIpO1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMucHVzaCh7IGV2ZW50OiAna2V5ZG93bicsIGhhbmRsZXI6IGtleWRvd25IYW5kbGVyIH0pO1xuXG4gICAgLy8gVXNlIG5pbGUtYmx1ciBldmVudCBmb3Igc2F2aW5nIG9uIGJsdXJcbiAgICBjb25zdCBibHVySGFuZGxlciA9ICgpID0+IHtcbiAgICAgIC8vIERvbid0IHNhdmUgaWYgZGlhbG9nIGlzIG9wZW5cbiAgICAgIGlmICh0aGlzLmRpYWxvZ09wZW4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBEb24ndCBzYXZlIGlmIGV4cGFuZCBidXR0b24gd2FzIGNsaWNrZWQgKG1vdXNlZG93biBzZXRzIHRoaXMgZmxhZylcbiAgICAgIGlmICh0aGlzLmV4cGFuZEJ1dHRvbkNsaWNrZWQpIHtcbiAgICAgICAgLy8gUmVzZXQgZmxhZyAtIHRoZSBjbGljayBoYW5kbGVyIHdpbGwgb3BlbiB0aGUgZGlhbG9nXG4gICAgICAgIHRoaXMuZXhwYW5kQnV0dG9uQ2xpY2tlZCA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFNhdmUgYW5kIGV4aXQgZWRpdCBtb2RlXG4gICAgICB0aGlzLnNhdmVWYWx1ZShjb250ZXh0LCB2YWxpZGF0ZU9uU2F2ZSk7XG4gICAgfTtcbiAgICB0aGlzLmVkaXRvci5hZGRFdmVudExpc3RlbmVyKCduaWxlLWJsdXInLCBibHVySGFuZGxlcik7XG4gICAgdGhpcy5ldmVudExpc3RlbmVycy5wdXNoKHsgZXZlbnQ6ICduaWxlLWJsdXInLCBoYW5kbGVyOiBibHVySGFuZGxlciB9KTtcblxuICAgIC8vIERvY3VtZW50LWxldmVsIG1vdXNlZG93biBoYW5kbGVyIHRvIGRldGVjdCBjbGlja3Mgb3V0c2lkZSB0aGUgZWRpdG9yXG4gICAgdGhpcy5kb2N1bWVudENsaWNrSGFuZGxlciA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAvLyBEb24ndCBwcm9jZXNzIGlmIGRpYWxvZyBpcyBvcGVuIG9yIGV4cGFuZCBidXR0b24gd2FzIGNsaWNrZWRcbiAgICAgIGlmICh0aGlzLmRpYWxvZ09wZW4gfHwgdGhpcy5leHBhbmRCdXR0b25DbGlja2VkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVXNlIGNvbXBvc2VkUGF0aCB0byBoYW5kbGUgU2hhZG93IERPTSBib3VuZGFyaWVzXG4gICAgICBjb25zdCBwYXRoID0gZS5jb21wb3NlZFBhdGgoKTtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgYW55IGVsZW1lbnQgaW4gdGhlIHBhdGggaXMgb3VyIHdyYXBwZXIsIGVkaXRvciwgb3IgZXhwYW5kIGJ1dHRvblxuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHBhdGgpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQgPT09IHRoaXMud3JhcHBlciB8fCBlbGVtZW50ID09PSB0aGlzLmVkaXRvciB8fCBlbGVtZW50ID09PSB0aGlzLmV4cGFuZEJ1dHRvbikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBbHNvIGNoZWNrIGlmIGl0J3MgdGhlIGNvbnRhaW5lciAodGhlIGNlbGwpXG4gICAgICAgIGlmIChlbGVtZW50ID09PSBjb250ZXh0LmNvbnRhaW5lcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDbGljayBpcyBvdXRzaWRlIC0gc2F2ZSBhbmQgZXhpdFxuICAgICAgdGhpcy5zYXZlVmFsdWUoY29udGV4dCwgdmFsaWRhdGVPblNhdmUpO1xuICAgIH07XG5cbiAgICAvLyBBZGQgd2l0aCBhIHNtYWxsIGRlbGF5IHRvIGF2b2lkIGNhcHR1cmluZyB0aGUgaW5pdGlhbCBjbGljayB0aGF0IG9wZW5lZCB0aGUgZWRpdG9yXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLmRvY3VtZW50Q2xpY2tIYW5kbGVyISwgdHJ1ZSk7XG4gICAgfSwgNTApO1xuXG4gICAgLy8gUmVhbC10aW1lIHZhbHVlIHVwZGF0ZXMgdXNpbmcgbmlsZS1jaGFuZ2VcbiAgICBjb25zdCBjaGFuZ2VIYW5kbGVyID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21FdmVudCA9IGUgYXMgQ3VzdG9tRXZlbnQ7XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IGN1c3RvbUV2ZW50LmRldGFpbD8udmFsdWUgPz8gJyc7XG4gICAgICBcbiAgICAgIC8vIERvbid0IHByb2Nlc3MgaWYgd2UncmUgc3luY2luZyBmcm9tIGRpYWxvZyAocHJldmVudHMgZmVlZGJhY2sgbG9vcClcbiAgICAgIGlmICh0aGlzLnN5bmNpbmdGcm9tRGlhbG9nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVXBkYXRlIHRyYWNrZWQgdmFsdWVcbiAgICAgIHRoaXMudHJhY2tlZFZhbHVlID0gbmV3VmFsdWU7XG4gICAgICBjb250ZXh0Lm9uQ2hhbmdlKG5ld1ZhbHVlIGFzIHVua25vd24gYXMgVCk7XG4gICAgfTtcbiAgICB0aGlzLmVkaXRvci5hZGRFdmVudExpc3RlbmVyKCduaWxlLWNoYW5nZScsIGNoYW5nZUhhbmRsZXIpO1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMucHVzaCh7IGV2ZW50OiAnbmlsZS1jaGFuZ2UnLCBoYW5kbGVyOiBjaGFuZ2VIYW5kbGVyIH0pO1xuXG4gICAgLy8gSGFuZGxlIGV4cGFuZCBldmVudCBpZiBleHBhbmRhYmxlXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZXhwYW5kYWJsZSkge1xuICAgICAgY29uc3QgZXhwYW5kSGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgLy8gRW1pdCBhIGN1c3RvbSBldmVudCB0aGF0IHRoZSBwYXJlbnQgY2FuIGxpc3RlbiB0b1xuICAgICAgICBjb25zdCBleHBhbmRFdmVudCA9IG5ldyBDdXN0b21FdmVudCgnc3QtY29kZS1lZGl0b3ItZXhwYW5kJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiB7IHZhbHVlOiB0aGlzLmdldEN1cnJlbnRWYWx1ZSgpIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZWRpdG9yPy5kaXNwYXRjaEV2ZW50KGV4cGFuZEV2ZW50KTtcbiAgICAgIH07XG4gICAgICB0aGlzLmVkaXRvci5hZGRFdmVudExpc3RlbmVyKCduaWxlLWV4cGFuZCcsIGV4cGFuZEhhbmRsZXIpO1xuICAgICAgdGhpcy5ldmVudExpc3RlbmVycy5wdXNoKHsgZXZlbnQ6ICduaWxlLWV4cGFuZCcsIGhhbmRsZXI6IGV4cGFuZEhhbmRsZXIgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdmFsdWUgd2l0aCBvcHRpb25hbCB2YWxpZGF0aW9uXG4gICAqL1xuICBwcml2YXRlIHNhdmVWYWx1ZShjb250ZXh0OiBDZWxsRWRpdG9yQ29udGV4dDxUPiwgdmFsaWRhdGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZWRpdG9yKSByZXR1cm47XG5cbiAgICAvLyBDb2RlIGVkaXRvciBkb2Vzbid0IGhhdmUgYnVpbHQtaW4gdmFsaWRhdGlvbiBsaWtlIGlucHV0XG4gICAgLy8gQnV0IHdlIGNhbiBjaGVjayBmb3IgZXJyb3Igc3RhdGVcbiAgICBpZiAodmFsaWRhdGUgJiYgdGhpcy5vcHRpb25zPy5lcnJvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRDdXJyZW50VmFsdWUoKTtcbiAgICBjb250ZXh0Lm9uU2F2ZSh2YWx1ZSk7XG4gIH1cblxuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIC8vIFJlbW92ZSBkb2N1bWVudCBjbGljayBoYW5kbGVyXG4gICAgaWYgKHRoaXMuZG9jdW1lbnRDbGlja0hhbmRsZXIpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuZG9jdW1lbnRDbGlja0hhbmRsZXIsIHRydWUpO1xuICAgICAgdGhpcy5kb2N1bWVudENsaWNrSGFuZGxlciA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBDbG9zZSBkaWFsb2cgaWYgb3BlblxuICAgIGlmICh0aGlzLmRpYWxvZ09wZW4gJiYgdGhpcy5kaWFsb2cpIHtcbiAgICAgIHRoaXMuZGlhbG9nLm9wZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMuZGlhbG9nLnJlbW92ZSgpO1xuICAgICAgdGhpcy5kaWFsb2cgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvciA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZGlhbG9nT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhbGwgZXZlbnQgbGlzdGVuZXJzXG4gICAgaWYgKHRoaXMuZWRpdG9yKSB7XG4gICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLmZvckVhY2goKHsgZXZlbnQsIGhhbmRsZXIgfSkgPT4ge1xuICAgICAgICB0aGlzLmVkaXRvcj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlcik7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMgPSBbXTtcblxuICAgICAgdGhpcy5lZGl0b3IucmVtb3ZlKCk7XG4gICAgICB0aGlzLmVkaXRvciA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgd3JhcHBlciBpZiBleGlzdHNcbiAgICBpZiAodGhpcy53cmFwcGVyKSB7XG4gICAgICB0aGlzLndyYXBwZXIucmVtb3ZlKCk7XG4gICAgICB0aGlzLndyYXBwZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgZXhwYW5kIGJ1dHRvbiByZWZlcmVuY2VcbiAgICB0aGlzLmV4cGFuZEJ1dHRvbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNvbnRleHQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5leHBhbmRCdXR0b25DbGlja2VkID0gZmFsc2U7XG4gICAgdGhpcy5zeW5jaW5nRnJvbURpYWxvZyA9IGZhbHNlO1xuICAgIHRoaXMudHJhY2tlZFZhbHVlID0gbnVsbDtcbiAgICB0aGlzLnVzZXJFZGl0ZWRJbmxpbmUgPSBmYWxzZTtcbiAgICB0aGlzLmRpYWxvZ09yaWdpbmFsVmFsdWUgPSAnJztcbiAgICB0aGlzLmRpYWxvZ0N1cnJlbnRWYWx1ZSA9ICcnO1xuICB9XG5cbiAgZm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0b3I/LmZvY3VzKCk7XG4gIH1cblxuICBnZXRDdXJyZW50VmFsdWUoKTogVCB7XG4gICAgaWYgKCF0aGlzLmVkaXRvcikgcmV0dXJuICcnIGFzIHVua25vd24gYXMgVDtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0TGl2ZUVkaXRvclZhbHVlKCk7XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1xcbiskLywgJycpIGFzIHVua25vd24gYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdmFsdWUgcHJvZ3JhbW1hdGljYWxseVxuICAgKi9cbiAgc2V0VmFsdWUodmFsdWU6IFQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lZGl0b3IpIHtcbiAgICAgIHRoaXMuZWRpdG9yLnZhbHVlID0gU3RyaW5nKHZhbHVlID8/ICcnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBDb2RlTWlycm9yIGluc3RhbmNlIChpZiBuZWVkZWQgZm9yIGFkdmFuY2VkIHVzYWdlKVxuICAgKi9cbiAgZ2V0RWRpdG9ySW5zdGFuY2UoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3I7XG4gIH1cbn1cbiJdfQ==