@talrace/ngx-noder 0.0.11 → 0.0.13

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.
Files changed (80) hide show
  1. package/README.md +374 -71
  2. package/esm2022/lib/apart-components/editor-title/editor-title.component.mjs +1 -1
  3. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font/font.component.mjs +2 -2
  4. package/esm2022/lib/apart-components/editor-toolbar/components/menu-dropdowns/menu-dropdowns.component.mjs +2 -5
  5. package/esm2022/lib/apart-components/editor-toolbar/editor-toolbar/editor-toolbar.component.mjs +3 -3
  6. package/esm2022/lib/editor/components/edges/edge-element.model.mjs +30 -1
  7. package/esm2022/lib/editor/components/edges/edge.component.mjs +23 -23
  8. package/esm2022/lib/editor/components/edges/edges.mjs +30 -15
  9. package/esm2022/lib/editor/components/image/components/image.component.mjs +2 -2
  10. package/esm2022/lib/editor/components/image/input-handler/image-input.handler.mjs +2 -2
  11. package/esm2022/lib/editor/components/table/components/table-cell.component.mjs +5 -3
  12. package/esm2022/lib/editor/components/table/components/table.component.mjs +7 -5
  13. package/esm2022/lib/editor/components/table/selection/table-selection.mjs +12 -5
  14. package/esm2022/lib/editor/content/display-data/display-data.mjs +4 -4
  15. package/esm2022/lib/editor/content/helpers/content-style.helper.mjs +1 -1
  16. package/esm2022/lib/editor/content/helpers/link.helper.mjs +39 -3
  17. package/esm2022/lib/editor/display/layers/text.layer.mjs +100 -75
  18. package/esm2022/lib/editor/display/print/print.helper.mjs +3 -3
  19. package/esm2022/lib/editor/display/print/print.renderer.mjs +5 -5
  20. package/esm2022/lib/editor/display/renderer.mjs +23 -25
  21. package/esm2022/lib/editor/display/virtual.renderer.mjs +10 -43
  22. package/esm2022/lib/editor/execution/edit.session.mjs +26 -16
  23. package/esm2022/lib/editor/execution/editor.mjs +88 -127
  24. package/esm2022/lib/editor/execution/regulator.service.mjs +44 -39
  25. package/esm2022/lib/editor/execution/targeting/cell-session-source.model.mjs +2 -3
  26. package/esm2022/lib/editor/execution/targeting/edge-session-source.model.mjs +2 -3
  27. package/esm2022/lib/editor/execution/targeting/main-session-source.model.mjs +2 -2
  28. package/esm2022/lib/editor/execution/targeting/session-source.model.mjs +1 -1
  29. package/esm2022/lib/editor/gadgets/history/operation-history.mjs +39 -37
  30. package/esm2022/lib/editor/interaction/editor.service.mjs +22 -22
  31. package/esm2022/lib/editor/interaction/mouse.handler.mjs +2 -2
  32. package/esm2022/lib/editor/operations/helpers/content-operations.helper.mjs +4 -4
  33. package/esm2022/lib/editor/operations/helpers/format-operations.helper.mjs +2 -2
  34. package/esm2022/lib/editor/operations/helpers/link-operations.helper.mjs +59 -7
  35. package/esm2022/lib/editor/operations/operations-helper.helper.mjs +24 -25
  36. package/esm2022/lib/editor/operations/save-commands.helper.mjs +6 -5
  37. package/esm2022/lib/editor/positioning/content.helper.mjs +10 -1
  38. package/esm2022/lib/editor/positioning/position.helper.mjs +49 -35
  39. package/esm2022/lib/editor/revision.helper.mjs +3 -1
  40. package/esm2022/lib/models/generated/delete.model.mjs +1 -1
  41. package/esm2022/lib/models/generated/link-data.model.mjs +1 -1
  42. package/esm2022/lib/models/generated/link.model.mjs +1 -1
  43. package/esm2022/lib/models/generated/restore-text-styles.model.mjs +1 -1
  44. package/esm2022/lib/models/generated/target.model.mjs +1 -1
  45. package/fesm2022/talrace-ngx-noder.mjs +672 -545
  46. package/fesm2022/talrace-ngx-noder.mjs.map +1 -1
  47. package/lib/apart-components/editor-toolbar/components/menu-dropdowns/menu-dropdowns.component.d.ts +1 -3
  48. package/lib/apart-components/editor-toolbar/editor-toolbar/editor-toolbar.component.d.ts +1 -1
  49. package/lib/editor/components/edges/edge-element.model.d.ts +9 -1
  50. package/lib/editor/components/edges/edge.component.d.ts +4 -4
  51. package/lib/editor/components/edges/edges.d.ts +8 -2
  52. package/lib/editor/components/table/components/table.component.d.ts +4 -2
  53. package/lib/editor/components/table/selection/table-selection.d.ts +5 -2
  54. package/lib/editor/content/display-data/display-data.d.ts +2 -1
  55. package/lib/editor/content/helpers/content-style.helper.d.ts +1 -1
  56. package/lib/editor/content/helpers/link.helper.d.ts +4 -1
  57. package/lib/editor/display/layers/text.layer.d.ts +8 -10
  58. package/lib/editor/display/print/print.helper.d.ts +1 -2
  59. package/lib/editor/display/print/print.renderer.d.ts +1 -2
  60. package/lib/editor/display/renderer.d.ts +9 -9
  61. package/lib/editor/display/virtual.renderer.d.ts +3 -10
  62. package/lib/editor/execution/edit.session.d.ts +7 -2
  63. package/lib/editor/execution/editor.d.ts +10 -9
  64. package/lib/editor/execution/regulator.service.d.ts +6 -4
  65. package/lib/editor/execution/targeting/cell-session-source.model.d.ts +0 -1
  66. package/lib/editor/execution/targeting/edge-session-source.model.d.ts +0 -1
  67. package/lib/editor/execution/targeting/session-source.model.d.ts +0 -1
  68. package/lib/editor/gadgets/history/operation-history.d.ts +7 -3
  69. package/lib/editor/interaction/editor.service.d.ts +13 -12
  70. package/lib/editor/operations/helpers/content-operations.helper.d.ts +1 -1
  71. package/lib/editor/operations/helpers/link-operations.helper.d.ts +7 -2
  72. package/lib/editor/operations/operations-helper.helper.d.ts +3 -3
  73. package/lib/editor/operations/save-commands.helper.d.ts +1 -1
  74. package/lib/editor/positioning/content.helper.d.ts +2 -0
  75. package/lib/editor/positioning/position.helper.d.ts +21 -6
  76. package/lib/models/generated/delete.model.d.ts +1 -1
  77. package/lib/models/generated/restore-text-styles.model.d.ts +1 -0
  78. package/lib/models/generated/target.model.d.ts +0 -1
  79. package/package.json +1 -1
  80. package/src/scss/base-editor.scss +4 -0
@@ -4,10 +4,10 @@ import { ContentHelper } from '../positioning/content.helper';
4
4
  import { CursorParagraph } from '../positioning/cursor-paragraph';
5
5
  import { CUSTOM_ELEMENT_MARKER } from '../components/shared/custom-content-markers.const';
6
6
  import { CustomComponentHelper } from '../components/shared/custom-component.hepler';
7
- import { DEFAULT_TEXT_STYLE, HYPERLINK_FONT_COLOR, HYPERLINK_HEADING_STYLE_ID, NEW_LINE_MARKUP } from '../content/constants/editor.const';
8
7
  import { ElementModel } from '../../models/generated/element.model';
9
8
  import { FormatStyleHelper } from './helpers/format-style.helper';
10
9
  import { InsertElementModel } from '../../models/generated/insert-element.model';
10
+ import { NEW_LINE_MARKUP } from '../content/constants/editor.const';
11
11
  import { NoderImageComponent } from '../components/image/components/image.component';
12
12
  import { NoderTabComponent } from '../components/tab/tab.component';
13
13
  import { NoderTableComponent } from '../components/table/components/table.component';
@@ -16,12 +16,14 @@ import { NumberingParagraphStyleModel } from '../gadgets/numbering/numbering-par
16
16
  import { OperationsHelper } from '../operations/operations-helper.helper';
17
17
  import { ParagraphStyleHelper } from './helpers/paragraph-style.helper';
18
18
  import { Range } from '../positioning/range';
19
- import { TextStyleModel } from '../../models/generated/text-style.model';
20
19
  import { UnicodeHelper } from '../gadgets/unicode/unicode.helper';
21
20
  export class EditSession {
22
21
  get scrollTop() {
23
22
  return this.scrollBar?.scrollTop ?? 0; // only main session is scrollable
24
23
  }
24
+ get scrollBarHeight() {
25
+ return this.scrollBar?.element.clientHeight ?? 0; // only main session is scrollable
26
+ }
25
27
  constructor(displayData, sessionId, customContentService, model, selection, generalProperties, editorService, customComponents, type, scrollBar) {
26
28
  this.displayData = displayData;
27
29
  this.sessionId = sessionId;
@@ -118,6 +120,20 @@ export class EditSession {
118
120
  const paragraphContent = this.displayData.getParagraphContent(row);
119
121
  return paragraphContent.substring(startColumn || 0, endColumn || paragraphContent.length);
120
122
  }
123
+ isEdgeOrWithinEdge() {
124
+ return this.isEdge() || this.isWithinEdge();
125
+ }
126
+ isEdge() {
127
+ return this.type === 'edge';
128
+ }
129
+ isWithinEdge() {
130
+ return this.type === 'cellWithinEdge';
131
+ }
132
+ onRendered() {
133
+ if (this.isEdgeOrWithinEdge()) {
134
+ this.editorService.changedEdge(this.sessionId);
135
+ }
136
+ }
121
137
  removeByDocumentIndexes(startIndex, endIndex) {
122
138
  const startParagraphPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, startIndex);
123
139
  const endParagraphPosition = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, endIndex);
@@ -223,12 +239,12 @@ export class EditSession {
223
239
  const start = this.displayData.indexToPosition(applyImage.insertIndex, 0);
224
240
  this.displayData.updateNextLineIndexes(start.row, this.displayData.paragraphs.length - 1);
225
241
  }
226
- restoreTextStyles(formats) {
242
+ restoreTextStyles(formats, linkFormats) {
227
243
  const startIndex = formats[0].startIndex;
228
244
  const endIndex = formats[formats.length - 1].endIndex;
229
245
  const startParagraph = ContentHelper.documentIndexToParagraphIndex(this.displayData.paragraphs, startIndex).row;
230
246
  const endPosition = ContentHelper.documentIndexToParagraphWithOffset(this.displayData.paragraphs, endIndex);
231
- OperationsHelper.restoreTextStyles(this.model, formats);
247
+ OperationsHelper.restoreTextStyles(this.model, formats, linkFormats);
232
248
  this.displayData.updateNextLineIndexes(startParagraph, endPosition.row);
233
249
  this.selection.placeCursor(endPosition);
234
250
  this.applyToolbarStyles();
@@ -261,7 +277,7 @@ export class EditSession {
261
277
  CustomComponentHelper.applyRemovingComponents(this.customComponents.images, partIndexes.startIndex, partIndexes.endIndex);
262
278
  CustomComponentHelper.applyRemovingComponents(this.customComponents.customElements, partIndexes.startIndex, partIndexes.endIndex);
263
279
  CustomComponentHelper.applyRemovingComponents(this.customComponents.tabs, partIndexes.startIndex, partIndexes.endIndex);
264
- OperationsHelper.delete(this.model, partIndexes.startIndex, partIndexes.endIndex);
280
+ OperationsHelper.delete(this.model, partIndexes.startIndex, partIndexes.endIndex - partIndexes.startIndex + 1);
265
281
  this.selection.placeCursor(range.start);
266
282
  this.displayData.resetAllNumberingInfo(range.start.row);
267
283
  this.displayData.updateNextLineIndexes(range.start.row, range.start.row);
@@ -271,7 +287,7 @@ export class EditSession {
271
287
  this.applyToolbarStyles();
272
288
  }
273
289
  replace(model) {
274
- this.removeByDocumentIndexes(model.delete.startIndex, model.delete.endIndex + 1);
290
+ this.removeByDocumentIndexes(model.delete.startIndex, model.delete.startIndex + model.delete.count);
275
291
  let endPoint;
276
292
  if (model.insertText) {
277
293
  endPoint = this.insertTextByDocumentIndex(model.insertText.insertIndex, model.insertText.text);
@@ -365,13 +381,7 @@ export class EditSession {
365
381
  }
366
382
  insertLink(position, linkData) {
367
383
  const insertIndex = ContentHelper.paragraphPositionToDocumentIndex(this.displayData.paragraphs, position);
368
- const linkStyle = new TextStyleModel({
369
- ...DEFAULT_TEXT_STYLE,
370
- headingStyleId: HYPERLINK_HEADING_STYLE_ID,
371
- underline: true,
372
- fontColor: HYPERLINK_FONT_COLOR
373
- });
374
- OperationsHelper.insertLink(this.model, linkData.text, linkData.link, insertIndex, linkStyle);
384
+ OperationsHelper.insertLink(this.model, linkData.text, linkData.link, insertIndex);
375
385
  const endPosition = this.displayData.insertText(position, linkData.text);
376
386
  this.displayData.updateNextLineIndexes(position.row, position.row);
377
387
  this.selection.placeCursor(endPosition);
@@ -479,7 +489,7 @@ export class EditSession {
479
489
  }
480
490
  getStyleForCursor(index) {
481
491
  const link = this.model.links.find(x => x.startIndex <= index && x.endIndex > index);
482
- if (link) {
492
+ if (link && !this.displayData.paragraphs.some(x => x.startIndex === index)) {
483
493
  const indexInLink = index - link.startIndex;
484
494
  const linkFormat = link.formats.find(x => x.startIndex <= indexInLink && x.endIndex >= indexInLink);
485
495
  return [linkFormat.textStyle];
@@ -532,7 +542,7 @@ export class EditSession {
532
542
  }
533
543
  getLinkModel(cursor) {
534
544
  const index = ContentHelper.paragraphPositionToDocumentIndex(this.displayData.paragraphs, cursor);
535
- return this.model.links.find(x => x.startIndex <= index && x.endIndex > index);
545
+ return this.model.links.find(x => x.startIndex <= index && x.endIndex >= index);
536
546
  }
537
547
  insertTableRows(insertIndex, rowsCount, targetIndex, inheritIndex) {
538
548
  const table = this.customComponents.tables.find(x => x.instance.insertIndex === insertIndex);
@@ -571,4 +581,4 @@ export class EditSession {
571
581
  tableComponent.instance.updateTable();
572
582
  }
573
583
  }
574
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdC5zZXNzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW5vZGVyL3NyYy9saWIvZWRpdG9yL2V4ZWN1dGlvbi9lZGl0LnNlc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQzFGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBR3JGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxvQkFBb0IsRUFBRSwwQkFBMEIsRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUkxSSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFcEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFLbEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFTakYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDckYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDcEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDckYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBR3hFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBQ3BHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdD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QUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hILElBQUksQ0FBQyxXQUFXLENBQUMsNkJBQTZCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEQsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3BFLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELFlBQVksQ0FBQyxXQUFtQixFQUFFLEtBQWlCO1FBQy9DLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBZSxDQUFDO1FBQ2pFLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNqRSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxLQUFLLFdBQVcsQ0FBQyxDQUFDO1FBQ3RHLGNBQWMsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDMUMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50UmVmLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEFwcGx5RWxlbWVudFN0eWxlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2FwcGx5LWVsZW1lbnQtc3R5bGUubW9kZWwnO1xuaW1wb3J0IHsgQXBwbHlJbWFnZVN0eWxlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2FwcGx5LWltYWdlLXN0eWxlLm1vZGVsJztcbmltcG9ydCB7IEJhc2VOb2RlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvc2hhcmVkL2Fic3RyYWN0L2Jhc2UuY29tcG9uZW50JztcbmltcG9ydCB7IEJyZWFrSGVscGVyIH0gZnJvbSAnLi4vZ2FkZ2V0cy9wYWdlLWJyZWFrL2JyZWFrLmhlbHBlcic7XG5pbXBvcnQgeyBCcmVha1R5cGVzIH0gZnJvbSAnLi4vZ2FkZ2V0cy9wYWdlLWJyZWFrL2JyZWFrLXR5cGVzLmVudW0nO1xuaW1wb3J0IHsgQ29udGVudEhlbHBlciB9IGZyb20gJy4uL3Bvc2l0aW9uaW5nL2NvbnRlbnQuaGVscGVyJztcbmltcG9ydCB7IENvbnRlbnRzSW50ZXJmYWNlIH0gZnJvbSAnLi4vY29udGVudC9jb250ZW50cy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ3Vyc29yUGFyYWdyYXBoIH0gZnJvbSAnLi4vcG9zaXRpb25pbmcvY3Vyc29yLXBhcmFncmFwaCc7XG5pbXBvcnQgeyBDVVNUT01fRUxFTUVOVF9NQVJLRVIgfSBmcm9tICcuLi9jb21wb25lbnRzL3NoYXJlZC9jdXN0b20tY29udGVudC1tYXJrZXJzLmNvbnN0JztcbmltcG9ydCB7IEN1c3RvbUNvbXBvbmVudEhlbHBlciB9IGZyb20gJy4uL2NvbXBvbmVudHMvc2hhcmVkL2N1c3RvbS1jb21wb25lbnQuaGVwbGVyJztcbmltcG9ydCB7IEN1c3RvbUNvbnRlbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL3NoYXJlZC9jdXN0b20tY29udGVudCc7XG5pbXBvcnQgeyBDdXN0b21Db250ZW50U2VydmljZSB9IGZyb20gJy4uL2NvbXBvbmVudHMvc2hhcmVkL3NlcnZpY2VzL2N1c3RvbS1jb250ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgREVGQVVMVF9URVhUX1NUWUxFLCBIWVBFUkxJTktfRk9OVF9DT0xPUiwgSFlQRVJMSU5LX0hFQURJTkdfU1RZTEVfSUQsIE5FV19MSU5FX01BUktVUCB9IGZyb20gJy4uL2NvbnRlbnQvY29uc3RhbnRzL2VkaXRvci5jb25zdCc7XG5pbXBvcnQgeyBEaXNwbGF5RGF0YSB9IGZyb20gJy4uL2NvbnRlbnQvZGlzcGxheS1kYXRhL2Rpc3BsYXktZGF0YSc7XG5pbXBvcnQgeyBFZGl0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vZWRpdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgRWxlbWVudERhdGFNb2RlbCB9IGZyb20gJy4uL2NvbXBvbmVudHMvZXh0ZXJuYWwtZWxlbWVudC9tb2RlbHMvZWxlbWVudC1kYXRhLm1vZGVsJztcbmltcG9ydCB7IEVsZW1lbnRNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvZWxlbWVudC5tb2RlbCc7XG5pbXBvcnQgeyBGb3JtYXRNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvZm9ybWF0Lm1vZGVsJztcbmltcG9ydCB7IEZvcm1hdFN0eWxlSGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL2Zvcm1hdC1zdHlsZS5oZWxwZXInO1xuaW1wb3J0IHsgR2VuZXJhbFByb3BlcnRpZXNNb2RlbCB9IGZyb20gJy4uL2NvbnRlbnQvZGlzcGxheS1kYXRhL2dlbmVyYWwtcHJvcGVydGllcy5tb2RlbCc7XG5pbXBvcnQgeyBJQ3VzdG9tQ29tcG9uZW50cyB9IGZyb20gJy4uL2NvbXBvbmVudHMvc2hhcmVkL2N1c3RvbS1jb21wb25lbnRzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJbWFnZURhdGFNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW1hZ2UtZGF0YS5tb2RlbCc7XG5pbXBvcnQgeyBJbnNlcnRCcmVha01vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9pbnNlcnQtYnJlYWsubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0RWxlbWVudE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9pbnNlcnQtZWxlbWVudC5tb2RlbCc7XG5pbXBvcnQgeyBJbnNlcnRJbWFnZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9pbnNlcnQtaW1hZ2UubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0TGlua01vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9pbnNlcnQtbGluay5tb2RlbCc7XG5pbXBvcnQgeyBJbnNlcnRQYXJhZ3JhcGhNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LXBhcmFncmFwaC5tb2RlbCc7XG5pbXBvcnQgeyBJbnNlcnRUYWJsZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9pbnNlcnQtdGFibGUubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0VGFiTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2luc2VydC10YWIubW9kZWwnO1xuaW1wb3J0IHsgSVRvb2xiYXJTdHlsZXMgfSBmcm9tICcuLi9jb250ZW50L2Rpc3BsYXktZGF0YS90b29sYmFyLXN0eWxlcy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTGlua0RhdGFNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvbGluay1kYXRhLm1vZGVsJztcbmltcG9ydCB7IExpbmtNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvbGluay5tb2RlbCc7XG5pbXBvcnQgeyBOb2RlckltYWdlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9pbWFnZS9jb21wb25lbnRzL2ltYWdlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOb2RlclRhYkNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvdGFiL3RhYi5jb21wb25lbnQnO1xuaW1wb3J0IHsgTm9kZXJUYWJsZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvdGFibGUvY29tcG9uZW50cy90YWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTnVtYmVyaW5nSGVscGVyIH0gZnJvbSAnLi4vZ2FkZ2V0cy9udW1iZXJpbmcvbnVtYmVyaW5nLmhlbHBlcic7XG5pbXBvcnQgeyBOdW1iZXJpbmdMZXZlbE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9udW1iZXJpbmctbGV2ZWwubW9kZWwnO1xuaW1wb3J0IHsgTnVtYmVyaW5nTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL251bWJlcmluZy5tb2RlbCc7XG5pbXBvcnQgeyBOdW1iZXJpbmdQYXJhZ3JhcGhTdHlsZU1vZGVsIH0gZnJvbSAnLi4vZ2FkZ2V0cy9udW1iZXJpbmcvbnVtYmVyaW5nLXBhcmFncmFwaC1zdHlsZS5tb2RlbCc7XG5pbXBvcnQgeyBPcGVyYXRpb25zSGVscGVyIH0gZnJvbSAnLi4vb3BlcmF0aW9ucy9vcGVyYXRpb25zLWhlbHBlci5oZWxwZXInO1xuaW1wb3J0IHsgUGFyYWdyYXBoTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3BhcmFncmFwaC5tb2RlbCc7XG5pbXBvcnQgeyBQYXJhZ3JhcGhTdHlsZUhlbHBlciB9IGZyb20gJy4vaGVscGVycy9wYXJhZ3JhcGgtc3R5bGUuaGVscGVyJztcbmltcG9ydCB7IFBhcmFncmFwaFN0eWxlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3BhcmFncmFwaC1zdHlsZS5tb2RlbCc7XG5pbXBvcnQgeyBSYW5nZSB9IGZyb20gJy4uL3Bvc2l0aW9uaW5nL3JhbmdlJztcbmltcG9ydCB7IFJlcGxhY2VNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvcmVwbGFjZS5tb2RlbCc7XG5pbXBvcnQgeyBSZXNpemVUYWJsZUNvbHVtbnNNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvcmVzaXplLXRhYmxlLWNvbHVtbnMubW9kZWwnO1xuaW1wb3J0IHsgUmVzdG9yZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9yZXN0b3JlLm1vZGVsJztcbmltcG9ydCB7IFNjcm9sbEJhciB9IGZyb20gJy4uL2dhZGdldHMvc2Nyb2xsYmFyJztcbmltcG9ydCB7IFNlbGVjdGlvbiB9IGZyb20gJy4uL3Bvc2l0aW9uaW5nL3NlbGVjdGlvbic7XG5pbXBvcnQgeyBUYWJsZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC90YWJsZS5tb2RlbCc7XG5pbXBvcnQgeyBUZXh0U3R5bGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvdGV4dC1zdHlsZS5tb2RlbCc7XG5pbXBvcnQgeyBVbmljb2RlSGVscGVyIH0gZnJvbSAnLi4vZ2FkZ2V0cy91bmljb2RlL3VuaWNvZGUuaGVscGVyJztcblxuZXhwb3J0IGNsYXNzIEVkaXRTZXNzaW9uIHtcbiAgICB0b2tlblJlID0gbmV3IFJlZ0V4cCgnXlsnICsgVW5pY29kZUhlbHBlci53b3JkQ2hhcnMgKyAnXFxcXCRfXSsnLCAnZycpO1xuXG4gICAgbm9uVG9rZW5SZSA9IG5ldyBSZWdFeHAoJ14oPzpbXicgKyBVbmljb2RlSGVscGVyLndvcmRDaGFycyArICdcXFxcJF9dfFxcXFxzXSkrJywgJ2cnKTtcblxuICAgIGdldCBzY3JvbGxUb3AoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjcm9sbEJhcj8uc2Nyb2xsVG9wID8/IDA7IC8vIG9ubHkgbWFpbiBzZXNzaW9uIGlzIHNjcm9sbGFibGVcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGRpc3BsYXlEYXRhOiBEaXNwbGF5RGF0YSxcbiAgICAgICAgcHVibGljIHNlc3Npb25JZDogbnVtYmVyLFxuICAgICAgICBwdWJsaWMgY3VzdG9tQ29udGVudFNlcnZpY2U6IEN1c3RvbUNvbnRlbnRTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgbW9kZWw6IENvbnRlbnRzSW50ZXJmYWNlLFxuICAgICAgICBwdWJsaWMgc2VsZWN0aW9uOiBTZWxlY3Rpb24sXG4gICAgICAgIHB1YmxpYyBnZW5lcmFsUHJvcGVydGllczogR2VuZXJhbFByb3BlcnRpZXNNb2RlbCxcbiAgICAgICAgcHVibGljIGVkaXRvclNlcnZpY2U6IEVkaXRvclNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBjdXN0b21Db21wb25lbnRzOiBJQ3VzdG9tQ29tcG9uZW50cyxcbiAgICAgICAgcHJpdmF0ZSB0eXBlOiAnY2VsbCcgfCAnZWRnZScgfCAnbWFpbicsXG4gICAgICAgIHByaXZhdGUgc2Nyb2xsQmFyPzogU2Nyb2xsQmFyXG4gICAgKSB7fVxuXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgZ2V0Um93TGVuZ3RoKHJvdzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCF0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHNbcm93XS5uZXh0TGluZUluZGV4ZXMpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBoc1tyb3ddLm5leHRMaW5lSW5kZXhlcy5sZW5ndGggKyAxO1xuICAgIH1cblxuICAgIGdldFJvd0NhY2hlSW5kZXgoY2FjaGVBcnJheTogbnVtYmVyW10sIHZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBsZXQgc3RhcnQgPSAwO1xuICAgICAgICBsZXQgZW5kID0gY2FjaGVBcnJheS5sZW5ndGggLSAxO1xuICAgICAgICB3aGlsZSAoc3RhcnQgPD0gZW5kKSB7XG4gICAgICAgICAgICBjb25zdCBtaWQgPSAoc3RhcnQgKyBlbmQpID4+IDE7XG4gICAgICAgICAgICBjb25zdCBjZW50ZXIgPSBjYWNoZUFycmF5W21pZF07XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZSA+IGNlbnRlcikge1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0gbWlkICsgMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPCBjZW50ZXIpIHtcbiAgICAgICAgICAgICAgICBlbmQgPSBtaWQgLSAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWlkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0YXJ0IC0gMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSB3aWR0aCBvZiB0aGUgc3RyaW5nIGBzdHJgIG9uIHRoZSBzY3JlZW4gd2hpbGUgYXNzdW1pbmcgdGhhdCB0aGUgc3RyaW5nIHN0YXJ0cyBhdCB0aGUgZmlyc3QgY29sdW1uIG9uIHRoZSBzY3JlZW4uXG4gICAgICogVGhlIGZpcnN0IHBvc2l0aW9uIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgZm9yIGBzdHJgIG9uIHNjcmVlbi5cbiAgICAgKiBUaGUgc2Vjb25kIHZhbHVlIGNvbnRhaW5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgZG9jdW1lbnQgY29sdW1uIHRoYXQgdGhpcyBmdW5jdGlvbiByZWFkIHVudGlsLlxuICAgICAqL1xuICAgIGdldFN0cmluZ1NjcmVlbldpZHRoKHN0cjogc3RyaW5nLCBtYXhTY3JlZW5Db2x1bW4/OiBudW1iZXIpOiBudW1iZXJbXSB7XG4gICAgICAgIGxldCBzY3JlZW5Db2x1bW4gPSAwO1xuICAgICAgICBsZXQgY29sdW1uOiBudW1iZXI7XG4gICAgICAgIGZvciAoY29sdW1uID0gMDsgY29sdW1uIDwgc3RyLmxlbmd0aDsgY29sdW1uKyspIHtcbiAgICAgICAgICAgIHNjcmVlbkNvbHVtbiArPSAxO1xuXG4gICAgICAgICAgICBpZiAoc2NyZWVuQ29sdW1uID4gbWF4U2NyZWVuQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW3NjcmVlbkNvbHVtbiwgY29sdW1uXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIHN0YXJ0aW5nIHJvdyBhbmQgY29sdW1uLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBgUmFuZ2VgIG9mIHRoZSBmaXJzdCB3b3JkIGJvdW5kYXJ5IGl0IGZpbmRzLlxuICAgICAqL1xuICAgIGdldFdvcmRSYW5nZShyb3c6IG51bWJlciwgY29sdW1uOiBudW1iZXIpOiBSYW5nZSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLmRpc3BsYXlEYXRhLmdldFBhcmFncmFwaENvbnRlbnQocm93KTtcbiAgICAgICAgbGV0IGluVG9rZW4gPSBmYWxzZTtcbiAgICAgICAgaWYgKGNvbHVtbiA+IDApIHtcbiAgICAgICAgICAgIGluVG9rZW4gPSAhIWxpbmUuY2hhckF0KGNvbHVtbiAtIDEpLm1hdGNoKHRoaXMudG9rZW5SZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWluVG9rZW4pIHtcbiAgICAgICAgICAgIGluVG9rZW4gPSAhIWxpbmUuY2hhckF0KGNvbHVtbikubWF0Y2godGhpcy50b2tlblJlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZWdleHA6IFJlZ0V4cDtcbiAgICAgICAgaWYgKGluVG9rZW4pIHtcbiAgICAgICAgICAgIHJlZ2V4cCA9IHRoaXMudG9rZW5SZTtcbiAgICAgICAgfSBlbHNlIGlmICgvXlxccyskLy50ZXN0KGxpbmUuc2xpY2UoY29sdW1uIC0gMSwgY29sdW1uICsgMSkpKSB7XG4gICAgICAgICAgICByZWdleHAgPSAvXFxzLztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlZ2V4cCA9IHRoaXMubm9uVG9rZW5SZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdGFydCA9IGNvbHVtbjtcbiAgICAgICAgaWYgKHN0YXJ0ID4gMCkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIHN0YXJ0LS07XG4gICAgICAgICAgICB9IHdoaWxlIChzdGFydCA+PSAwICYmIGxpbmUuY2hhckF0KHN0YXJ0KS5tYXRjaChyZWdleHApKTtcblxuICAgICAgICAgICAgc3RhcnQrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbmQgPSBjb2x1bW47XG4gICAgICAgIHdoaWxlIChlbmQgPCBsaW5lLmxlbmd0aCAmJiBsaW5lLmNoYXJBdChlbmQpLm1hdGNoKHJlZ2V4cCkpIHtcbiAgICAgICAgICAgIGVuZCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShuZXcgQ3Vyc29yUGFyYWdyYXBoKHJvdywgc3RhcnQpLCBuZXcgQ3Vyc29yUGFyYWdyYXBoKHJvdywgZW5kKSk7XG4gICAgfVxuXG4gICAgZ2V0RGlzcGxheUxpbmUocm93OiBudW1iZXIsIGVuZENvbHVtbjogbnVtYmVyLCBzdGFydENvbHVtbj86IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaENvbnRlbnQgPSB0aGlzLmRpc3BsYXlEYXRhLmdldFBhcmFncmFwaENvbnRlbnQocm93KTtcblxuICAgICAgICByZXR1cm4gcGFyYWdyYXBoQ29udGVudC5zdWJzdHJpbmcoc3RhcnRDb2x1bW4gfHwgMCwgZW5kQ29sdW1uIHx8IHBhcmFncmFwaENvbnRlbnQubGVuZ3RoKTtcbiAgICB9XG5cbiAgICByZW1vdmVCeURvY3VtZW50SW5kZXhlcyhzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhcnRQYXJhZ3JhcGhQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBzdGFydEluZGV4KTtcbiAgICAgICAgY29uc3QgZW5kUGFyYWdyYXBoUG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgZW5kSW5kZXgpO1xuICAgICAgICB0aGlzLnJlbW92ZShuZXcgUmFuZ2Uoc3RhcnRQYXJhZ3JhcGhQb3NpdGlvbiwgZW5kUGFyYWdyYXBoUG9zaXRpb24pKTtcbiAgICB9XG5cbiAgICBpbnNlcnRUZXh0QnlEb2N1bWVudEluZGV4KGluZGV4OiBudW1iZXIsIHRleHQ6IHN0cmluZywgc3R5bGU/OiBUZXh0U3R5bGVNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0VGV4dChwYXJhZ3JhcGhQb3NpdGlvbiwgdGV4dCwgc3R5bGUpO1xuICAgIH1cblxuICAgIGluc2VydEVsZW1lbnRCeURvY3VtZW50SW5kZXgoaW5zZXJ0RWxlbWVudDogSW5zZXJ0RWxlbWVudE1vZGVsKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGluc2VydEVsZW1lbnQuZWxlbWVudC5pbnNlcnRJbmRleCk7XG4gICAgICAgIHJldHVybiB0aGlzLmluc2VydEVsZW1lbnQoZWxlbWVudFBvc2l0aW9uLCBpbnNlcnRFbGVtZW50LmVsZW1lbnQpO1xuICAgIH1cblxuICAgIGluc2VydEJyZWFrQnlEb2N1bWVudEluZGV4KGluc2VydEVsZW1lbnQ6IEluc2VydEJyZWFrTW9kZWwpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBlbGVtZW50UG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgaW5zZXJ0RWxlbWVudC5pbnNlcnRJbmRleCk7XG4gICAgICAgIHJldHVybiB0aGlzLmluc2VydEJyZWFrKGVsZW1lbnRQb3NpdGlvbiwgaW5zZXJ0RWxlbWVudC5icmVha1R5cGUgYXMgQnJlYWtUeXBlcyk7XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFiQnlEb2N1bWVudEluZGV4KGluc2VydEVsZW1lbnQ6IEluc2VydFRhYk1vZGVsKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGluc2VydEVsZW1lbnQuaW5zZXJ0SW5kZXgpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRUYWIoZWxlbWVudFBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBpbnNlcnRJbWFnZUJ5RG9jdW1lbnRJbmRleChpbnNlcnRFbGVtZW50OiBJbnNlcnRJbWFnZU1vZGVsKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGluc2VydEVsZW1lbnQuaW5zZXJ0SW5kZXgpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRJbWFnZShlbGVtZW50UG9zaXRpb24sIGluc2VydEVsZW1lbnQuaW1hZ2VEYXRhKTtcbiAgICB9XG5cbiAgICBpbnNlcnRUYWJsZUJ5RG9jdW1lbnRJbmRleChpbnNlcnRFbGVtZW50OiBJbnNlcnRUYWJsZU1vZGVsKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGluc2VydEVsZW1lbnQuaW5zZXJ0SW5kZXgpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRUYWJsZShlbGVtZW50UG9zaXRpb24sIGluc2VydEVsZW1lbnQpO1xuICAgIH1cblxuICAgIGluc2VydExpbmtCeURvY3VtZW50SW5kZXgoaW5zZXJ0RWxlbWVudDogSW5zZXJ0TGlua01vZGVsKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGluc2VydEVsZW1lbnQuaW5zZXJ0SW5kZXgpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRMaW5rKGVsZW1lbnRQb3NpdGlvbiwgaW5zZXJ0RWxlbWVudC5saW5rRGF0YU1vZGVsKTtcbiAgICB9XG5cbiAgICBpbnNlcnRQYXJhZ3JhcGhCeURvY3VtZW50SW5kZXgoaW5zZXJ0RWxlbWVudDogSW5zZXJ0UGFyYWdyYXBoTW9kZWwpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBlbGVtZW50UG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgaW5zZXJ0RWxlbWVudC5pbnNlcnRJbmRleCk7XG4gICAgICAgIHJldHVybiB0aGlzLmluc2VydFBhcmFncmFwaChlbGVtZW50UG9zaXRpb24sIGluc2VydEVsZW1lbnQpO1xuICAgIH1cblxuICAgIGFwcGx5VGV4dFN0eWxlKHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlciwgdGV4dFN0eWxlOiBUZXh0U3R5bGVNb2RlbCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzdGFydFBhcmFncmFwaCA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBzdGFydEluZGV4KS5yb3c7XG4gICAgICAgIGNvbnN0IGVuZFBhcmFncmFwaCA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBlbmRJbmRleCkucm93O1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmFwcGx5VGV4dFN0eWxlKHRoaXMubW9kZWwsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCB0ZXh0U3R5bGUpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhzdGFydFBhcmFncmFwaCwgZW5kUGFyYWdyYXBoKTtcbiAgICAgICAgdGhpcy5zZXRUZXh0U3R5bGUodGV4dFN0eWxlKTtcbiAgICB9XG5cbiAgICBhcHBseVBhcmFncmFwaFN0eWxlKHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlciwgcGFyYWdyYXBoU3R5bGU6IFBhcmFncmFwaFN0eWxlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhcnRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgc3RhcnRJbmRleCkucm93O1xuICAgICAgICBjb25zdCBlbmRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgZW5kSW5kZXgpLnJvdztcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5hcHBseVBhcmFncmFwaFN0eWxlKHRoaXMubW9kZWwsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBwYXJhZ3JhcGhTdHlsZSk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHN0YXJ0UGFyYWdyYXBoLCBlbmRQYXJhZ3JhcGgpO1xuICAgICAgICB0aGlzLmFwcGx5VG9vbGJhclN0eWxlcygpO1xuICAgIH1cblxuICAgIGFwcGx5RWxlbWVudFN0eWxlKG1vZGVsOiBBcHBseUVsZW1lbnRTdHlsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuYXBwbHlFbGVtZW50U3R5bGUodGhpcy5tb2RlbCwgbW9kZWwpO1xuICAgICAgICBjb25zdCBpbWFnZUNvbXBvbmVudFJlZiA9IHRoaXMuY3VzdG9tQ29tcG9uZW50cy5jdXN0b21FbGVtZW50cy5maW5kKHggPT4geC5pbnN0YW5jZS5pbnNlcnRJbmRleCA9PT0gbW9kZWwuaW5zZXJ0SW5kZXgpO1xuICAgICAgICBpbWFnZUNvbXBvbmVudFJlZi5pbnN0YW5jZS5pbml0aWFsaXplKCk7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaCA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBtb2RlbC5pbnNlcnRJbmRleCkucm93O1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhwYXJhZ3JhcGgsIHBhcmFncmFwaCk7XG4gICAgfVxuXG4gICAgYWRkTnVtYmVyaW5nKGxldmVsczogTnVtYmVyaW5nTGV2ZWxNb2RlbFtdLCBzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhcnRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgc3RhcnRJbmRleCkucm93O1xuICAgICAgICBjb25zdCBlbmRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgZW5kSW5kZXgpLnJvdztcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5hZGROdW1iZXJpbmcodGhpcy5tb2RlbCwgdGhpcy5nZW5lcmFsUHJvcGVydGllcy5udW1iZXJpbmdzLCBzdGFydEluZGV4LCBlbmRJbmRleCwgbGV2ZWxzKTtcbiAgICAgICAgdGhpcy5nZW5lcmFsUHJvcGVydGllcy5udW1iZXJpbmdJbmZvID0ge307XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHN0YXJ0UGFyYWdyYXBoLCBlbmRQYXJhZ3JhcGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRQYXJhZ3JhcGg7IGkgPD0gZW5kUGFyYWdyYXBoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3BsYXlEYXRhLmdldFBhcmFncmFwaFNldHRpbmdzKGkpLm51bWJlcmluZ0RhdGEubnVtYmVyaW5nSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU51bWJlcmluZ3NEYXRhT25DaGFuZ2UoZW5kUGFyYWdyYXBoICsgMSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFwcGx5VG9vbGJhclN0eWxlcygpO1xuICAgIH1cblxuICAgIHJlbW92ZU51bWJlcmluZ3Moc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGFyYWdyYXBoID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHN0YXJ0SW5kZXgpLnJvdztcbiAgICAgICAgY29uc3QgZW5kUGFyYWdyYXBoID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGVuZEluZGV4KS5yb3c7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIucmVtb3ZlTnVtYmVyaW5ncyh0aGlzLm1vZGVsLCB0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLm51bWJlcmluZ3MsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS5yZXNldEFsbE51bWJlcmluZ0luZm8oc3RhcnRQYXJhZ3JhcGgpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhzdGFydFBhcmFncmFwaCwgZW5kUGFyYWdyYXBoKTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKGVuZFBhcmFncmFwaCk7XG5cbiAgICAgICAgdGhpcy5hcHBseVRvb2xiYXJTdHlsZXMoKTtcbiAgICB9XG5cbiAgICByZXN0b3JlTnVtYmVyaW5ncyhwYXJhZ3JhcGhzOiBQYXJhZ3JhcGhNb2RlbFtdLCBudW1iZXJpbmdzOiBOdW1iZXJpbmdNb2RlbFtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBwYXJhZ3JhcGhzWzBdLmluc2VydEluZGV4O1xuICAgICAgICBjb25zdCBlbmRJbmRleCA9IHBhcmFncmFwaHNbcGFyYWdyYXBocy5sZW5ndGggLSAxXS5pbnNlcnRJbmRleDtcbiAgICAgICAgY29uc3Qgc3RhcnRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgc3RhcnRJbmRleCkucm93O1xuICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoV2l0aE9mZnNldCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGVuZEluZGV4KTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZXN0b3JlTnVtYmVyaW5ncyh0aGlzLm1vZGVsLCB0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLm51bWJlcmluZ3MsIHBhcmFncmFwaHMsIG51bWJlcmluZ3MpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnJlc2V0QWxsTnVtYmVyaW5nSW5mbyhzdGFydFBhcmFncmFwaCk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHN0YXJ0UGFyYWdyYXBoLCBlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICBmb3IgKGNvbnN0IHBhcmFncmFwaCBvZiBwYXJhZ3JhcGhzKSB7XG4gICAgICAgICAgICBpZiAocGFyYWdyYXBoLnBhcmFncmFwaFN0eWxlLm51bWJlcmluZ0lkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKGVuZFBvc2l0aW9uLnJvdyArIDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoZW5kUG9zaXRpb24pO1xuICAgICAgICB0aGlzLmFwcGx5VG9vbGJhclN0eWxlcygpO1xuICAgIH1cblxuICAgIGFwcGx5SW1hZ2VTdHlsZShhcHBseUltYWdlOiBBcHBseUltYWdlU3R5bGVNb2RlbCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbWFnZUNvbXBvbmVudFJlZiA9IHRoaXMuY3VzdG9tQ29tcG9uZW50cy5pbWFnZXMuZmluZCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPT09IGFwcGx5SW1hZ2UuaW5zZXJ0SW5kZXgpO1xuICAgICAgICBpbWFnZUNvbXBvbmVudFJlZi5pbnN0YW5jZS5yZXNpemUoeyB3aWR0aDogYXBwbHlJbWFnZS53aWR0aCwgaGVpZ2h0OiBhcHBseUltYWdlLmhlaWdodCB9KTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5hcHBseUltYWdlU3R5bGUodGhpcy5tb2RlbCwgYXBwbHlJbWFnZSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5kaXNwbGF5RGF0YS5pbmRleFRvUG9zaXRpb24oYXBwbHlJbWFnZS5pbnNlcnRJbmRleCwgMCk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHN0YXJ0LnJvdywgdGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLmxlbmd0aCAtIDEpO1xuICAgIH1cblxuICAgIHJlc3RvcmVUZXh0U3R5bGVzKGZvcm1hdHM6IEZvcm1hdE1vZGVsW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IGZvcm1hdHNbMF0uc3RhcnRJbmRleDtcbiAgICAgICAgY29uc3QgZW5kSW5kZXggPSBmb3JtYXRzW2Zvcm1hdHMubGVuZ3RoIC0gMV0uZW5kSW5kZXg7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGFyYWdyYXBoID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHN0YXJ0SW5kZXgpLnJvdztcbiAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaFdpdGhPZmZzZXQodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBlbmRJbmRleCk7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIucmVzdG9yZVRleHRTdHlsZXModGhpcy5tb2RlbCwgZm9ybWF0cyk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHN0YXJ0UGFyYWdyYXBoLCBlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb3NpdGlvbik7XG4gICAgICAgIHRoaXMuYXBwbHlUb29sYmFyU3R5bGVzKCk7XG4gICAgfVxuXG4gICAgcmVzdG9yZVBhcmFncmFwaFN0eWxlcyhwYXJhZ3JhcGhzOiBQYXJhZ3JhcGhNb2RlbFtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBwYXJhZ3JhcGhzWzBdLmluc2VydEluZGV4O1xuICAgICAgICBjb25zdCBlbmRJbmRleCA9IHBhcmFncmFwaHNbcGFyYWdyYXBocy5sZW5ndGggLSAxXS5pbnNlcnRJbmRleDtcbiAgICAgICAgY29uc3Qgc3RhcnRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgc3RhcnRJbmRleCkucm93O1xuICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoV2l0aE9mZnNldCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGVuZEluZGV4KTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZXN0b3JlUGFyYWdyYXBoU3R5bGVzKHRoaXMubW9kZWwsIHBhcmFncmFwaHMpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhzdGFydFBhcmFncmFwaCwgZW5kUG9zaXRpb24ucm93KTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoZW5kUG9zaXRpb24pO1xuICAgICAgICB0aGlzLmFwcGx5VG9vbGJhclN0eWxlcygpO1xuICAgIH1cblxuICAgIHNldFRleHRTdHlsZSh0ZXh0U3R5bGU6IFRleHRTdHlsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogSVRvb2xiYXJTdHlsZXMgPSB7IC4uLnRoaXMuZWRpdG9yU2VydmljZS5zdHlsZXMgfTtcbiAgICAgICAgZm9yIChsZXQga2V5IG9mIE9iamVjdC5rZXlzKHRleHRTdHlsZSkpIHtcbiAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdGV4dFN0eWxlW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLnN0eWxlcyA9IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBgcmFuZ2VgIGZyb20gdGhlIGRvY3VtZW50LlxuICAgICAqIElmIGByYW5nZWAgaXMgZW1wdHksIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdW5tb2RpZmllZCB2YWx1ZSBvZiBgcmFuZ2Uuc3RhcnRgLlxuICAgICAqL1xuICAgIHJlbW92ZShyYW5nZTogUmFuZ2UpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFydEluZGV4ZXMgPSBDb250ZW50SGVscGVyLmdldFNlbGVjdGVkUGFydERvY3VtZW50SW5kZXhlcyh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHJhbmdlKTtcblxuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnJlbW92ZVJhbmdlKHJhbmdlKTtcblxuICAgICAgICBDdXN0b21Db21wb25lbnRIZWxwZXIuYXBwbHlSZW1vdmluZ0NvbXBvbmVudHModGhpcy5jdXN0b21Db21wb25lbnRzLnRhYmxlcywgcGFydEluZGV4ZXMuc3RhcnRJbmRleCwgcGFydEluZGV4ZXMuZW5kSW5kZXgpO1xuICAgICAgICBDdXN0b21Db21wb25lbnRIZWxwZXIuYXBwbHlSZW1vdmluZ0NvbXBvbmVudHModGhpcy5jdXN0b21Db21wb25lbnRzLmltYWdlcywgcGFydEluZGV4ZXMuc3RhcnRJbmRleCwgcGFydEluZGV4ZXMuZW5kSW5kZXgpO1xuICAgICAgICBDdXN0b21Db21wb25lbnRIZWxwZXIuYXBwbHlSZW1vdmluZ0NvbXBvbmVudHModGhpcy5jdXN0b21Db21wb25lbnRzLmN1c3RvbUVsZW1lbnRzLCBwYXJ0SW5kZXhlcy5zdGFydEluZGV4LCBwYXJ0SW5kZXhlcy5lbmRJbmRleCk7XG4gICAgICAgIEN1c3RvbUNvbXBvbmVudEhlbHBlci5hcHBseVJlbW92aW5nQ29tcG9uZW50cyh0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFicywgcGFydEluZGV4ZXMuc3RhcnRJbmRleCwgcGFydEluZGV4ZXMuZW5kSW5kZXgpO1xuXG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuZGVsZXRlKHRoaXMubW9kZWwsIHBhcnRJbmRleGVzLnN0YXJ0SW5kZXgsIHBhcnRJbmRleGVzLmVuZEluZGV4KTtcblxuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihyYW5nZS5zdGFydCk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEucmVzZXRBbGxOdW1iZXJpbmdJbmZvKHJhbmdlLnN0YXJ0LnJvdyk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2Uuc3RhcnQucm93KTtcbiAgICAgICAgaWYgKHJhbmdlLmVuZC5yb3cgLSByYW5nZS5zdGFydC5yb3cgJiYgdGhpcy50eXBlICE9PSAnY2VsbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTnVtYmVyaW5nc0RhdGFPbkNoYW5nZShyYW5nZS5zdGFydC5yb3cgKyAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXBwbHlUb29sYmFyU3R5bGVzKCk7XG4gICAgfVxuXG4gICAgcmVwbGFjZShtb2RlbDogUmVwbGFjZU1vZGVsKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgdGhpcy5yZW1vdmVCeURvY3VtZW50SW5kZXhlcyhtb2RlbC5kZWxldGUuc3RhcnRJbmRleCwgbW9kZWwuZGVsZXRlLmVuZEluZGV4ICsgMSk7XG4gICAgICAgIGxldCBlbmRQb2ludDogQ3Vyc29yUGFyYWdyYXBoO1xuICAgICAgICBpZiAobW9kZWwuaW5zZXJ0VGV4dCkge1xuICAgICAgICAgICAgZW5kUG9pbnQgPSB0aGlzLmluc2VydFRleHRCeURvY3VtZW50SW5kZXgobW9kZWwuaW5zZXJ0VGV4dC5pbnNlcnRJbmRleCwgbW9kZWwuaW5zZXJ0VGV4dC50ZXh0KTtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlbC5pbnNlcnRQYXJhZ3JhcGgpIHtcbiAgICAgICAgICAgIGVuZFBvaW50ID0gdGhpcy5pbnNlcnRQYXJhZ3JhcGhCeURvY3VtZW50SW5kZXgobW9kZWwuaW5zZXJ0UGFyYWdyYXBoKTtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlbC5pbnNlcnRFbGVtZW50KSB7XG4gICAgICAgICAgICBlbmRQb2ludCA9IHRoaXMuaW5zZXJ0RWxlbWVudEJ5RG9jdW1lbnRJbmRleChtb2RlbC5pbnNlcnRFbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlbC5pbnNlcnRCcmVhaykge1xuICAgICAgICAgICAgZW5kUG9pbnQgPSB0aGlzLmluc2VydEJyZWFrQnlEb2N1bWVudEluZGV4KG1vZGVsLmluc2VydEJyZWFrKTtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlbC5pbnNlcnRUYWIpIHtcbiAgICAgICAgICAgIGVuZFBvaW50ID0gdGhpcy5pbnNlcnRUYWJCeURvY3VtZW50SW5kZXgobW9kZWwuaW5zZXJ0VGFiKTtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlbC5pbnNlcnRJbWFnZSkge1xuICAgICAgICAgICAgZW5kUG9pbnQgPSB0aGlzLmluc2VydEltYWdlQnlEb2N1bWVudEluZGV4KG1vZGVsLmluc2VydEltYWdlKTtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlbC5pbnNlcnRUYWJsZSkge1xuICAgICAgICAgICAgZW5kUG9pbnQgPSB0aGlzLmluc2VydFRhYmxlQnlEb2N1bWVudEluZGV4KG1vZGVsLmluc2VydFRhYmxlKTtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlbC5pbnNlcnRMaW5rKSB7XG4gICAgICAgICAgICBlbmRQb2ludCA9IHRoaXMuaW5zZXJ0TGlua0J5RG9jdW1lbnRJbmRleChtb2RlbC5pbnNlcnRMaW5rKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbmRQb2ludDtcbiAgICB9XG5cbiAgICBpbnNlcnRUZXh0KHBvc2l0aW9uOiBDdXJzb3JQYXJhZ3JhcGgsIHRleHQ6IHN0cmluZywgY3Vyc29yU3R5bGU/OiBUZXh0U3R5bGVNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHBvc2l0aW9uKTtcbiAgICAgICAgaWYgKGN1cnNvclN0eWxlKSB7XG4gICAgICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydFN0eWxlZFRleHQodGhpcy5tb2RlbCwgdGV4dCwgaW5zZXJ0SW5kZXgsIGN1cnNvclN0eWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuaW5zZXJ0VGV4dCh0aGlzLm1vZGVsLCB0ZXh0LCBpbnNlcnRJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSB0aGlzLmRpc3BsYXlEYXRhLmluc2VydFRleHQocG9zaXRpb24sIHRleHQpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnJlc2V0QWxsTnVtYmVyaW5nSW5mbyhwb3NpdGlvbi5yb3cpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhwb3NpdGlvbi5yb3csIGVuZFBvc2l0aW9uLnJvdyk7XG4gICAgICAgIGlmIChlbmRQb3NpdGlvbi5yb3cgLSBwb3NpdGlvbi5yb3cgJiYgdGhpcy50eXBlICE9PSAnY2VsbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTnVtYmVyaW5nc0RhdGFPbkNoYW5nZShlbmRQb3NpdGlvbi5yb3cgKyAxKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb3NpdGlvbik7XG4gICAgICAgIHJldHVybiBlbmRQb3NpdGlvbjtcbiAgICB9XG5cbiAgICBpbnNlcnRFbGVtZW50KHBvc2l0aW9uOiBDdXJzb3JQYXJhZ3JhcGgsIGVsZW1lbnQ6IEVsZW1lbnREYXRhTW9kZWwpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBwb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IGluc2VydEVsZW1lbnQgPSBuZXcgSW5zZXJ0RWxlbWVudE1vZGVsKHsgZWxlbWVudDogbmV3IEVsZW1lbnRNb2RlbCh7IGluc2VydEluZGV4LCAuLi5lbGVtZW50IH0pIH0pO1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydEVsZW1lbnQodGhpcy5tb2RlbCwgaW5zZXJ0RWxlbWVudCk7XG5cbiAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVsLmVsZW1lbnRzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4ID09PSBpbnNlcnRJbmRleCk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLmN1c3RvbUNvbnRlbnRTZXJ2aWNlLmZpbmRDb21wb25lbnRUeXBlKG1vZGVsLnR5cGUpO1xuICAgICAgICB0aGlzLmFkZENvbXBvbmVudCh0aGlzLmN1c3RvbUNvbXBvbmVudHMuY3VzdG9tRWxlbWVudHMsIG1vZGVsLCB0eXBlKTtcblxuICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IHRoaXMuZGlzcGxheURhdGEuaW5zZXJ0VGV4dChwb3NpdGlvbiwgQ1VTVE9NX0VMRU1FTlRfTUFSS0VSKTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOZXh0TGluZUluZGV4ZXMocG9zaXRpb24ucm93LCBlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb3NpdGlvbik7XG4gICAgICAgIHJldHVybiBlbmRQb3NpdGlvbjtcbiAgICB9XG5cbiAgICBpbnNlcnRCcmVhayhwb3NpdGlvbjogQ3Vyc29yUGFyYWdyYXBoLCBicmVha1R5cGU6IEJyZWFrVHlwZXMpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBwb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IGlzT25OZXdQYXJhZ3JhcGggPVxuICAgICAgICAgICAgYnJlYWtUeXBlID09PSBCcmVha1R5cGVzLlBhZ2UgJiZcbiAgICAgICAgICAgIEJyZWFrSGVscGVyLmdldEJyZWFrVHlwZSh0aGlzLm1vZGVsLCBDVVNUT01fRUxFTUVOVF9NQVJLRVIsIGluc2VydEluZGV4IC0gMSkgIT09IEJyZWFrVHlwZXMuUGFnZTtcbiAgICAgICAgY29uc3QgdGV4dCA9IGlzT25OZXdQYXJhZ3JhcGggPyBgJHtORVdfTElORV9NQVJLVVB9JHtDVVNUT01fRUxFTUVOVF9NQVJLRVJ9YCA6IENVU1RPTV9FTEVNRU5UX01BUktFUjtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5pbnNlcnRCcmVhayh0aGlzLm1vZGVsLCB0ZXh0LCBpbnNlcnRJbmRleCwgYnJlYWtUeXBlKTtcblxuICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IHRoaXMuZGlzcGxheURhdGEuaW5zZXJ0VGV4dChwb3NpdGlvbiwgdGV4dCk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHBvc2l0aW9uLnJvdywgZW5kUG9zaXRpb24ucm93KTtcbiAgICAgICAgaWYgKGlzT25OZXdQYXJhZ3JhcGggJiYgZW5kUG9zaXRpb24ucm93IC0gcG9zaXRpb24ucm93KSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU51bWJlcmluZ3NEYXRhT25DaGFuZ2UoZW5kUG9zaXRpb24ucm93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN1cnNvclBvc2l0aW9uID0gdGhpcy5kaXNwbGF5RGF0YS5nZXRQb3NpdGlvbkFmdGVyQnJlYWsoZW5kUG9zaXRpb24sIGJyZWFrVHlwZSk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGN1cnNvclBvc2l0aW9uKTtcblxuICAgICAgICByZXR1cm4gZW5kUG9zaXRpb247XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFiKHBvc2l0aW9uOiBDdXJzb3JQYXJhZ3JhcGgpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBwb3NpdGlvbik7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuaW5zZXJ0VGFiKHRoaXMubW9kZWwsIGluc2VydEluZGV4KTtcblxuICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWwudGFicy5maW5kKHggPT4geC5pbnNlcnRJbmRleCA9PT0gaW5zZXJ0SW5kZXgpO1xuICAgICAgICB0aGlzLmFkZENvbXBvbmVudCh0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFicywgbW9kZWwsIE5vZGVyVGFiQ29tcG9uZW50KTtcblxuICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IHRoaXMuZGlzcGxheURhdGEuaW5zZXJ0VGV4dChwb3NpdGlvbiwgQ1VTVE9NX0VMRU1FTlRfTUFSS0VSKTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOZXh0TGluZUluZGV4ZXMocG9zaXRpb24ucm93LCBwb3NpdGlvbi5yb3cpO1xuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvc2l0aW9uKTtcbiAgICAgICAgcmV0dXJuIGVuZFBvc2l0aW9uO1xuICAgIH1cblxuICAgIGluc2VydEltYWdlKHBvc2l0aW9uOiBDdXJzb3JQYXJhZ3JhcGgsIGltYWdlRGF0YTogSW1hZ2VEYXRhTW9kZWwpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBwb3NpdGlvbik7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuaW5zZXJ0SW1hZ2UodGhpcy5tb2RlbCwgaW5zZXJ0SW5kZXgsIGltYWdlRGF0YSk7XG5cbiAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVsLmltYWdlcy5maW5kKHggPT4geC5pbnNlcnRJbmRleCA9PT0gaW5zZXJ0SW5kZXgpO1xuICAgICAgICB0aGlzLmFkZENvbXBvbmVudCh0aGlzLmN1c3RvbUNvbXBvbmVudHMuaW1hZ2VzLCBtb2RlbCwgTm9kZXJJbWFnZUNvbXBvbmVudCk7XG5cbiAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSB0aGlzLmRpc3BsYXlEYXRhLmluc2VydFRleHQocG9zaXRpb24sIENVU1RPTV9FTEVNRU5UX01BUktFUik7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHBvc2l0aW9uLnJvdywgcG9zaXRpb24ucm93KTtcblxuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb3NpdGlvbik7XG5cbiAgICAgICAgcmV0dXJuIGVuZFBvc2l0aW9uO1xuICAgIH1cblxuICAgIGluc2VydExpbmsocG9zaXRpb246IEN1cnNvclBhcmFncmFwaCwgbGlua0RhdGE6IExpbmtEYXRhTW9kZWwpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBwb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IGxpbmtTdHlsZSA9IG5ldyBUZXh0U3R5bGVNb2RlbCh7XG4gICAgICAgICAgICAuLi5ERUZBVUxUX1RFWFRfU1RZTEUsXG4gICAgICAgICAgICBoZWFkaW5nU3R5bGVJZDogSFlQRVJMSU5LX0hFQURJTkdfU1RZTEVfSUQsXG4gICAgICAgICAgICB1bmRlcmxpbmU6IHRydWUsXG4gICAgICAgICAgICBmb250Q29sb3I6IEhZUEVSTElOS19GT05UX0NPTE9SXG4gICAgICAgIH0pO1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydExpbmsodGhpcy5tb2RlbCwgbGlua0RhdGEudGV4dCwgbGlua0RhdGEubGluaywgaW5zZXJ0SW5kZXgsIGxpbmtTdHlsZSk7XG5cbiAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSB0aGlzLmRpc3BsYXlEYXRhLmluc2VydFRleHQocG9zaXRpb24sIGxpbmtEYXRhLnRleHQpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhwb3NpdGlvbi5yb3csIHBvc2l0aW9uLnJvdyk7XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoZW5kUG9zaXRpb24pO1xuICAgICAgICByZXR1cm4gZW5kUG9zaXRpb247XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFibGUocG9zaXRpb246IEN1cnNvclBhcmFncmFwaCwgdGFibGVNb2RlbDogSW5zZXJ0VGFibGVNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHBvc2l0aW9uKTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5pbnNlcnRUYWJsZSh0aGlzLm1vZGVsLCBpbnNlcnRJbmRleCwgdGFibGVNb2RlbCwgdGhpcy5kaXNwbGF5RGF0YS5jb250ZW50V2lkdGgpO1xuICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWwudGFibGVzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4ID09PSB0YWJsZU1vZGVsLmluc2VydFRhYmxlSW5kZXgpO1xuICAgICAgICB0aGlzLmFkZENvbXBvbmVudCh0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFibGVzLCBtb2RlbCwgTm9kZXJUYWJsZUNvbXBvbmVudCk7XG4gICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gdGhpcy5kaXNwbGF5RGF0YS5pbnNlcnRUZXh0KHBvc2l0aW9uLCB0YWJsZU1vZGVsLmNvbnRlbnQpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhwb3NpdGlvbi5yb3csIGVuZFBvc2l0aW9uLnJvdyk7XG4gICAgICAgIGlmIChlbmRQb3NpdGlvbi5yb3cgLSBwb3NpdGlvbi5yb3cpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTnVtYmVyaW5nc0RhdGFPbkNoYW5nZShlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvc2l0aW9uKTtcbiAgICAgICAgcmV0dXJuIGVuZFBvc2l0aW9uO1xuICAgIH1cblxuICAgIGluc2VydFBhcmFncmFwaChwb3NpdGlvbjogQ3Vyc29yUGFyYWdyYXBoLCBwYXJhZ3JhcGhNb2RlbDogSW5zZXJ0UGFyYWdyYXBoTW9kZWwpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBwb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IHRleHQgPSBPcGVyYXRpb25zSGVscGVyLmluc2VydFBhcmFncmFwaCh0aGlzLm1vZGVsLCBpbnNlcnRJbmRleCwgcGFyYWdyYXBoTW9kZWwsIHRoaXMuZGlzcGxheURhdGEuY29udGVudFdpZHRoKTtcbiAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSB0aGlzLmRpc3BsYXlEYXRhLmluc2VydFRleHQocG9zaXRpb24sIHRleHQpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhwb3NpdGlvbi5yb3csIGVuZFBvc2l0aW9uLnJvdyk7XG4gICAgICAgIGlmIChlbmRQb3NpdGlvbi5yb3cgLSBwb3NpdGlvbi5yb3cpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTnVtYmVyaW5nc0RhdGFPbkNoYW5nZShlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBlbmRQb2ludDogQ3Vyc29yUGFyYWdyYXBoO1xuICAgICAgICBpZiAocGFyYWdyYXBoTW9kZWwuaW5zZXJ0VGV4dCkge1xuICAgICAgICAgICAgY29uc3QgcGFyYWdyYXBoUG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KFxuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocyxcbiAgICAgICAgICAgICAgICBwYXJhZ3JhcGhNb2RlbC5pbnNlcnRUZXh0Lmluc2VydEluZGV4XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZW5kUG9pbnQgPSB0aGlzLmRpc3BsYXlEYXRhLmluc2VydFRleHQocGFyYWdyYXBoUG9zaXRpb24sIHRleHQpO1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOZXh0TGluZUluZGV4ZXMocGFyYWdyYXBoUG9zaXRpb24ucm93LCBlbmRQb2ludC5yb3cpO1xuICAgICAgICAgICAgaWYgKGVuZFBvaW50LnJvdyAtIHBhcmFncmFwaFBvc2l0aW9uLnJvdykge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTnVtYmVyaW5nc0RhdGFPbkNoYW5nZShlbmRQb2ludC5yb3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoZW5kUG9pbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcmFncmFwaE1vZGVsLmluc2VydEltYWdlKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJhZ3JhcGhQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgoXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLFxuICAgICAgICAgICAgICAgIHBhcmFncmFwaE1vZGVsLmluc2VydEltYWdlLmluc2VydEluZGV4XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgaW1hZ2VJbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBwb3NpdGlvbik7XG4gICAgICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWwuaW1hZ2VzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4ID09PSBpbWFnZUluc2VydEluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuYWRkQ29tcG9uZW50KHRoaXMuY3VzdG9tQ29tcG9uZW50cy5pbWFnZXMsIG1vZGVsLCBOb2RlckltYWdlQ29tcG9uZW50KTtcbiAgICAgICAgICAgIGVuZFBvaW50ID0gdGhpcy5kaXNwbGF5RGF0YS5pbnNlcnRUZXh0KHBhcmFncmFwaFBvc2l0aW9uLCBDVVNUT01fRUxFTUVOVF9NQVJLRVIpO1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOZXh0TGluZUluZGV4ZXMocGFyYWdyYXBoUG9zaXRpb24ucm93LCBwYXJhZ3JhcGhQb3NpdGlvbi5yb3cpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoZW5kUG9pbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcmFncmFwaE1vZGVsLmluc2VydFRhYmxlKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJhZ3JhcGhQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgoXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLFxuICAgICAgICAgICAgICAgIHBhcmFncmFwaE1vZGVsLmluc2VydFRhYmxlLmluc2VydEluZGV4XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVsLnRhYmxlcy5maW5kKHggPT4geC5pbnNlcnRJbmRleCA9PT0gcGFyYWdyYXBoTW9kZWwuaW5zZXJ0VGFibGUuaW5zZXJ0VGFibGVJbmRleCk7XG4gICAgICAgICAgICB0aGlzLmFkZENvbXBvbmVudCh0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFibGVzLCBtb2RlbCwgTm9kZXJUYWJsZUNvbXBvbmVudCk7XG4gICAgICAgICAgICBlbmRQb2ludCA9IHRoaXMuZGlzcGxheURhdGEuaW5zZXJ0VGV4dChwYXJhZ3JhcGhQb3NpdGlvbiwgcGFyYWdyYXBoTW9kZWwuaW5zZXJ0VGFibGUuY29udGVudCk7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhwYXJhZ3JhcGhQb3NpdGlvbi5yb3csIGVuZFBvaW50LnJvdyk7XG4gICAgICAgICAgICBpZiAoZW5kUG9pbnQucm93IC0gcGFyYWdyYXBoUG9zaXRpb24ucm93KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKGVuZFBvaW50LnJvdyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb2ludCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVuZFBvaW50O1xuICAgIH1cblxuICAgIGFkZENvbXBvbmVudDxUIGV4dGVuZHMgQmFzZU5vZGVyQ29tcG9uZW50PihjdXN0b21FbGVtZW50czogQ29tcG9uZW50UmVmPFQ+W10sIG1vZGVsOiBDdXN0b21Db250ZW50LCBjb21wb25lbnRUeXBlOiBUeXBlPFQ+KSB7XG4gICAgICAgIGNvbnN0IGN1c3RvbUVsZW1lbnQgPSB0aGlzLmN1c3RvbUNvbnRlbnRTZXJ2aWNlLmNvbXBvbmVudFNlcnZpY2UuZ2VuZXJhdGVDb21wb25lbnQoY29tcG9uZW50VHlwZSwge1xuICAgICAgICAgICAgY29udGVudDogbW9kZWwsXG4gICAgICAgICAgICBzZXNzaW9uSWQ6IHRoaXMuc2Vzc2lvbklkLFxuICAgICAgICAgICAgZ2VuZXJhbFByb3BlcnRpZXM6IHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMsXG4gICAgICAgICAgICBjb250ZW50V2lkdGg6IHRoaXMuZGlzcGxheURhdGEuY29udGVudFdpZHRoXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBuZXdFbGVtZW50UG9zaXRpb24gPSBjdXN0b21FbGVtZW50cy5maW5kSW5kZXgoeCA9PiB4Lmluc3RhbmNlLmluc2VydEluZGV4ID4gbW9kZWwuaW5zZXJ0SW5kZXgpO1xuICAgICAgICBpZiAobmV3RWxlbWVudFBvc2l0aW9uID49IDApIHtcbiAgICAgICAgICAgIGN1c3RvbUVsZW1lbnRzLnNwbGljZShuZXdFbGVtZW50UG9zaXRpb24sIDAsIGN1c3RvbUVsZW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3VzdG9tRWxlbWVudHMucHVzaChjdXN0b21FbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFwcGx5VG9vbGJhclN0eWxlcygpOiB2b2lkIHtcbiAgICAgICAgLy8gdW5kZWZpbmVkIC0gdmFsdWUgd2Fzbid0IHNldFxuICAgICAgICAvLyBudWxsIC0gY29sbGlzaW9uIChkaWZmZXJlbnQgdmFsdWVzIGF0IHRoZSBzYW1lIHRpbWUpXG4gICAgICAgIC8vIHZhbHVlIC0gdmFsdWUgd2FzIHNldCB3aXRob3V0IGNvbGxpc2lvbnNcbiAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFBvc2l0aW9uVG9Eb2N1bWVudEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgdGhpcy5zZWxlY3Rpb24ucmFuZ2Uuc3RhcnQpO1xuICAgICAgICBsZXQgZW5kSW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFBvc2l0aW9uVG9Eb2N1bWVudEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgdGhpcy5zZWxlY3Rpb24ucmFuZ2UuZW5kKTtcbiAgICAgICAgaWYgKHN0YXJ0SW5kZXggIT09IGVuZEluZGV4KSB7XG4gICAgICAgICAgICBlbmRJbmRleC0tO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uLmN1cnNvci5jb2x1bW4gPiAwKSB7XG4gICAgICAgICAgICBzdGFydEluZGV4LS07XG4gICAgICAgICAgICBlbmRJbmRleC0tO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaFN0eWxlcyA9IFBhcmFncmFwaFN0eWxlSGVscGVyLmdldFBhcmFncmFwaHNBdFJhbmdlKHRoaXMubW9kZWwucGFyYWdyYXBocywgc3RhcnRJbmRleCwgZW5kSW5kZXgpLm1hcCh4ID0+XG4gICAgICAgICAgICB4LnBhcmFncmFwaFN0eWxlLm51bWJlcmluZ0lkXG4gICAgICAgICAgICAgICAgPyBOdW1iZXJpbmdIZWxwZXIuZ2V0U3R5bGVzKHgucGFyYWdyYXBoU3R5bGUsIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMubnVtYmVyaW5ncylcbiAgICAgICAgICAgICAgICA6IG5ldyBOdW1iZXJpbmdQYXJhZ3JhcGhTdHlsZU1vZGVsKHgucGFyYWdyYXBoU3R5bGUpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IHRoaXMuc2VsZWN0aW9uLmlzRW1wdHlcbiAgICAgICAgICAgID8gdGhpcy5nZXRTdHlsZUZvckN1cnNvcihzdGFydEluZGV4KVxuICAgICAgICAgICAgOiBGb3JtYXRTdHlsZUhlbHBlci5jb21iaW5lU2VjdGlvbih0aGlzLm1vZGVsLmZvcm1hdHMsIHRoaXMubW9kZWwubGlua3MsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KS5tYXAoeCA9PiB4LnRleHRTdHlsZSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogSVRvb2xiYXJTdHlsZXMgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgc3R5bGUgb2YgWy4uLnN0eWxlcywgLi4ucGFyYWdyYXBoU3R5bGVzXSkge1xuICAgICAgICAgICAgZm9yIChsZXQga2V5IG9mIE9iamVjdC5rZXlzKHN0eWxlKSkge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHRba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gc3R5bGVba2V5XTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdFtrZXldICE9PSBzdHlsZVtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLnN0eWxlcyA9IHJlc3VsdDtcbiAgICB9XG5cbiAgICBnZXRTdHlsZUZvckN1cnNvcihpbmRleDogbnVtYmVyKTogVGV4dFN0eWxlTW9kZWxbXSB7XG4gICAgICAgIGNvbnN0IGxpbmsgPSB0aGlzLm1vZGVsLmxpbmtzLmZpbmQoeCA9PiB4LnN0YXJ0SW5kZXggPD0gaW5kZXggJiYgeC5lbmRJbmRleCA+IGluZGV4KTtcbiAgICAgICAgaWYgKGxpbmspIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4SW5MaW5rID0gaW5kZXggLSBsaW5rLnN0YXJ0SW5kZXg7XG4gICAgICAgICAgICBjb25zdCBsaW5rRm9ybWF0ID0gbGluay5mb3JtYXRzLmZpbmQoeCA9PiB4LnN0YXJ0SW5kZXggPD0gaW5kZXhJbkxpbmsgJiYgeC5lbmRJbmRleCA+PSBpbmRleEluTGluayk7XG4gICAgICAgICAgICByZXR1cm4gW2xpbmtGb3JtYXQudGV4dFN0eWxlXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IEZvcm1hdFN0eWxlSGVscGVyLmdldEZvcm1hdEF0SW5kZXgodGhpcy5tb2RlbC5mb3JtYXRzLCBpbmRleCk7XG4gICAgICAgIHJldHVybiBbZm9ybWF0LnRleHRTdHlsZV07XG4gICAgfVxuXG4gICAgcmVzdG9yZShtb2RlbDogUmVzdG9yZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIG1vZGVsLnN0YXJ0SW5kZXgpO1xuICAgICAgICBpZiAobW9kZWwuc3RhcnRJbmRleCAhPT0gbW9kZWwuZW5kSW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQnlEb2N1bWVudEluZGV4ZXMobW9kZWwuc3RhcnRJbmRleCwgbW9kZWwuZW5kSW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZXN0b3JlKHRoaXMubW9kZWwsIG1vZGVsKTtcblxuICAgICAgICBjb25zdCByZXN0b3JlRW5kSW5kZXggPSBtb2RlbC5zdGFydEluZGV4ICsgbW9kZWwudGV4dC5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzdG9yZUNvbXBvbmVudHModGhpcy5tb2RlbC50YWJsZXMsIHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMsIE5vZGVyVGFibGVDb21wb25lbnQsIG1vZGVsLnN0YXJ0SW5kZXgsIHJlc3RvcmVFbmRJbmRleCk7XG4gICAgICAgIHRoaXMucmVzdG9yZUNvbXBvbmVudHModGhpcy5tb2RlbC5pbWFnZXMsIHRoaXMuY3VzdG9tQ29tcG9uZW50cy5pbWFnZXMsIE5vZGVySW1hZ2VDb21wb25lbnQsIG1vZGVsLnN0YXJ0SW5kZXgsIHJlc3RvcmVFbmRJbmRleCk7XG4gICAgICAgIHRoaXMucmVzdG9yZUNvbXBvbmVudHModGhpcy5tb2RlbC50YWJzLCB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFicywgTm9kZXJUYWJDb21wb25lbnQsIG1vZGVsLnN0YXJ0SW5kZXgsIHJlc3RvcmVFbmRJbmRleCk7XG4gICAgICAgIHRoaXMucmVzdG9yZUVsZW1lbnRDb21wb25lbnRzKHRoaXMubW9kZWwuZWxlbWVudHMsIG1vZGVsLnN0YXJ0SW5kZXgsIHJlc3RvcmVFbmRJbmRleCk7XG5cbiAgICAgICAgY29uc3QgZW5kUG9pbnQgPSB0aGlzLmRpc3BsYXlEYXRhLmluc2VydFRleHQocGFyYWdyYXBoUG9zaXRpb24sIG1vZGVsLnRleHQpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnJlc2V0QWxsTnVtYmVyaW5nSW5mbyhwYXJhZ3JhcGhQb3NpdGlvbi5yb3cpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhwYXJhZ3JhcGhQb3NpdGlvbi5yb3csIGVuZFBvaW50LnJvdyk7XG4gICAgICAgIGlmIChlbmRQb2ludC5yb3cgLSBwYXJhZ3JhcGhQb3NpdGlvbi5yb3cgJiYgdGhpcy50eXBlICE9PSAnY2VsbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTnVtYmVyaW5nc0RhdGFPbkNoYW5nZShlbmRQb2ludC5yb3cgKyAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvaW50KTtcbiAgICAgICAgdGhpcy5hcHBseVRvb2xiYXJTdHlsZXMoKTtcbiAgICB9XG5cbiAgICByZXN0b3JlQ29tcG9uZW50czxUIGV4dGVuZHMgQmFzZU5vZGVyQ29tcG9uZW50PihcbiAgICAgICAgbW9kZWxzOiBDdXN0b21Db250ZW50W10sXG4gICAgICAgIGNvbXBvbmVudHM6IENvbXBvbmVudFJlZjxCYXNlTm9kZXJDb21wb25lbnQ+W10sXG4gICAgICAgIGNvbXBvbmVudFR5cGU6IFR5cGU8VD4sXG4gICAgICAgIHJlc3RvcmVJbmRleDogbnVtYmVyLFxuICAgICAgICByZXN0b3JlRW5kSW5kZXg6IG51bWJlclxuICAgICk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IG1vZGVsIG9mIG1vZGVscykge1xuICAgICAgICAgICAgaWYgKG1vZGVsLmluc2VydEluZGV4IDwgcmVzdG9yZUluZGV4KSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluc2VydEluZGV4ID49IHJlc3RvcmVFbmRJbmRleCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hZGRDb21wb25lbnQoY29tcG9uZW50cywgbW9kZWwsIGNvbXBvbmVudFR5cGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzdG9yZUVsZW1lbnRDb21wb25lbnRzKGVsZW1lbnRzOiBFbGVtZW50TW9kZWxbXSwgcmVzdG9yZUluZGV4OiBudW1iZXIsIHJlc3RvcmVFbmRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgbW9kZWwgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgICAgIGlmIChtb2RlbC5pbnNlcnRJbmRleCA8IHJlc3RvcmVJbmRleCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtb2RlbC5pbnNlcnRJbmRleCA+PSByZXN0b3JlRW5kSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLmN1c3RvbUNvbnRlbnRTZXJ2aWNlLmZpbmRDb21wb25lbnRUeXBlKG1vZGVsLnR5cGUpO1xuICAgICAgICAgICAgdGhpcy5hZGRDb21wb25lbnQodGhpcy5jdXN0b21Db21wb25lbnRzLmN1c3RvbUVsZW1lbnRzLCBtb2RlbCwgdHlwZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRMaW5rTW9kZWwoY3Vyc29yOiBDdXJzb3JQYXJhZ3JhcGgpOiBMaW5rTW9kZWwge1xuICAgICAgICBjb25zdCBpbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBjdXJzb3IpO1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbC5saW5rcy5maW5kKHggPT4geC5zdGFydEluZGV4IDw9IGluZGV4ICYmIHguZW5kSW5kZXggPiBpbmRleCk7XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFibGVSb3dzKGluc2VydEluZGV4OiBudW1iZXIsIHJvd3NDb3VudDogbnVtYmVyLCB0YXJnZXRJbmRleDogbnVtYmVyLCBpbmhlcml0SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMuZmluZCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPT09IGluc2VydEluZGV4KTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS5yZXNldE51bWJlcmluZ0luZm9CeVRhYmxlQ2VsbCh0YWJsZSk7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuaW5zZXJ0VGFibGVSb3dzKHRoaXMubW9kZWwsIGluc2VydEluZGV4LCByb3dzQ291bnQsIHRhcmdldEluZGV4LCBpbmhlcml0SW5kZXgpO1xuICAgICAgICB0YWJsZS5pbnN0YW5jZS51cGRhdGVUYWJsZSgpO1xuICAgIH1cblxuICAgIGluc2VydFRhYmxlQ29sdW1ucyhpbnNlcnRJbmRleDogbnVtYmVyLCBjb2x1bW5zQ291bnQ6IG51bWJlciwgdGFyZ2V0SW5kZXg6IG51bWJlciwgaW5oZXJpdEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFibGVzLmZpbmQoeCA9PiB4Lmluc3RhbmNlLmluc2VydEluZGV4ID09PSBpbnNlcnRJbmRleCk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEucmVzZXROdW1iZXJpbmdJbmZvQnlUYWJsZUNlbGwodGFibGUpO1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydFRhYmxlQ29sdW1ucyhcbiAgICAgICAgICAgIHRoaXMubW9kZWwsXG4gICAgICAgICAgICBpbnNlcnRJbmRleCxcbiAgICAgICAgICAgIGNvbHVtbnNDb3VudCxcbiAgICAgICAgICAgIHRhcmdldEluZGV4LFxuICAgICAgICAgICAgaW5oZXJpdEluZGV4LFxuICAgICAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS5jb250ZW50V2lkdGhcbiAgICAgICAgKTtcbiAgICAgICAgdGFibGUuaW5zdGFuY2UudXBkYXRlVGFibGUoKTtcbiAgICB9XG5cbiAgICByZW1vdmVUYWJsZVJvd3MoaW5zZXJ0SW5kZXg6IG51bWJlciwgc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5jdXN0b21Db21wb25lbnRzLnRhYmxlcy5maW5kKHggPT4geC5pbnN0YW5jZS5pbnNlcnRJbmRleCA9PT0gaW5zZXJ0SW5kZXgpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnJlc2V0TnVtYmVyaW5nSW5mb0J5VGFibGVDZWxsKHRhYmxlKTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZW1vdmVUYWJsZVJvd3ModGhpcy5tb2RlbCwgaW5zZXJ0SW5kZXgsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgdGFibGUuaW5zdGFuY2UudXBkYXRlVGFibGUoKTtcbiAgICB9XG5cbiAgICByZW1vdmVUYWJsZUNvbHVtbnMoaW5zZXJ0SW5kZXg6IG51bWJlciwgc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5jdXN0b21Db21wb25lbnRzLnRhYmxlcy5maW5kKHggPT4geC5pbnN0YW5jZS5pbnNlcnRJbmRleCA9PT0gaW5zZXJ0SW5kZXgpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnJlc2V0TnVtYmVyaW5nSW5mb0J5VGFibGVDZWxsKHRhYmxlKTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZW1vdmVUYWJsZUNvbHVtbnModGhpcy5tb2RlbCwgaW5zZXJ0SW5kZXgsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCB0aGlzLmRpc3BsYXlEYXRhLmNvbnRlbnRXaWR0aCk7XG4gICAgICAgIHRhYmxlLmluc3RhbmNlLnVwZGF0ZVRhYmxlKCk7XG4gICAgfVxuXG4gICAgcmVzaXplVGFibGVDb2x1bW5zKHJlc2l6ZVRhYmxlQ29sdW1uczogUmVzaXplVGFibGVDb2x1bW5zTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFibGVzLmZpbmQoeCA9PiB4Lmluc3RhbmNlLmluc2VydEluZGV4ID09PSByZXNpemVUYWJsZUNvbHVtbnMuaW5zZXJ0SW5kZXgpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnJlc2V0TnVtYmVyaW5nSW5mb0J5VGFibGVDZWxsKHRhYmxlKTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZXNpemVUYWJsZUNvbHVtbnModGhpcy5tb2RlbCwgcmVzaXplVGFibGVDb2x1bW5zKTtcbiAgICAgICAgdGFibGUuaW5zdGFuY2UudXBkYXRlVGFibGUoKTtcbiAgICB9XG5cbiAgICByZXN0b3JlVGFibGUoaW5zZXJ0SW5kZXg6IG51bWJlciwgdGFibGU6IFRhYmxlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb2xkVGFibGUgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRhYmxlKSkgYXMgVGFibGVNb2RlbDtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZXN0b3JlVGFibGUodGhpcy5tb2RlbCwgaW5zZXJ0SW5kZXgsIG9sZFRhYmxlKTtcbiAgICAgICAgY29uc3QgdGFibGVDb21wb25lbnQgPSB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFibGVzLmZpbmQoeCA9PiB4Lmluc3RhbmNlLmluc2VydEluZGV4ID09PSBpbnNlcnRJbmRleCk7XG4gICAgICAgIHRhYmxlQ29tcG9uZW50Lmluc3RhbmNlLnVwZGF0ZVRhYmxlKCk7XG4gICAgfVxufVxuIl19
584
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdC5zZXNzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW5vZGVyL3NyYy9saWIvZWRpdG9yL2V4ZWN1dGlvbi9lZGl0LnNlc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQzFGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBTXJGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUVwRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUtsRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQVNqRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDckYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDcEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDckYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBR3hFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBQ3BHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRTFFLE9BQU8sRUFBRSxvQkFBb0IsRUFB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QUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnRSZWYsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQXBwbHlFbGVtZW50U3R5bGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvYXBwbHktZWxlbWVudC1zdHlsZS5tb2RlbCc7XG5pbXBvcnQgeyBBcHBseUltYWdlU3R5bGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvYXBwbHktaW1hZ2Utc3R5bGUubW9kZWwnO1xuaW1wb3J0IHsgQmFzZU5vZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9zaGFyZWQvYWJzdHJhY3QvYmFzZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnJlYWtIZWxwZXIgfSBmcm9tICcuLi9nYWRnZXRzL3BhZ2UtYnJlYWsvYnJlYWsuaGVscGVyJztcbmltcG9ydCB7IEJyZWFrVHlwZXMgfSBmcm9tICcuLi9nYWRnZXRzL3BhZ2UtYnJlYWsvYnJlYWstdHlwZXMuZW51bSc7XG5pbXBvcnQgeyBDb250ZW50SGVscGVyIH0gZnJvbSAnLi4vcG9zaXRpb25pbmcvY29udGVudC5oZWxwZXInO1xuaW1wb3J0IHsgQ29udGVudHNJbnRlcmZhY2UgfSBmcm9tICcuLi9jb250ZW50L2NvbnRlbnRzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDdXJzb3JQYXJhZ3JhcGggfSBmcm9tICcuLi9wb3NpdGlvbmluZy9jdXJzb3ItcGFyYWdyYXBoJztcbmltcG9ydCB7IENVU1RPTV9FTEVNRU5UX01BUktFUiB9IGZyb20gJy4uL2NvbXBvbmVudHMvc2hhcmVkL2N1c3RvbS1jb250ZW50LW1hcmtlcnMuY29uc3QnO1xuaW1wb3J0IHsgQ3VzdG9tQ29tcG9uZW50SGVscGVyIH0gZnJvbSAnLi4vY29tcG9uZW50cy9zaGFyZWQvY3VzdG9tLWNvbXBvbmVudC5oZXBsZXInO1xuaW1wb3J0IHsgQ3VzdG9tQ29udGVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvc2hhcmVkL2N1c3RvbS1jb250ZW50JztcbmltcG9ydCB7IEN1c3RvbUNvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vY29tcG9uZW50cy9zaGFyZWQvc2VydmljZXMvY3VzdG9tLWNvbnRlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBEaXNwbGF5RGF0YSB9IGZyb20gJy4uL2NvbnRlbnQvZGlzcGxheS1kYXRhL2Rpc3BsYXktZGF0YSc7XG5pbXBvcnQgeyBFZGl0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vZWRpdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgRWxlbWVudERhdGFNb2RlbCB9IGZyb20gJy4uL2NvbXBvbmVudHMvZXh0ZXJuYWwtZWxlbWVudC9tb2RlbHMvZWxlbWVudC1kYXRhLm1vZGVsJztcbmltcG9ydCB7IEVsZW1lbnRNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvZWxlbWVudC5tb2RlbCc7XG5pbXBvcnQgeyBGb3JtYXRNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvZm9ybWF0Lm1vZGVsJztcbmltcG9ydCB7IEZvcm1hdFN0eWxlSGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL2Zvcm1hdC1zdHlsZS5oZWxwZXInO1xuaW1wb3J0IHsgR2VuZXJhbFByb3BlcnRpZXNNb2RlbCB9IGZyb20gJy4uL2NvbnRlbnQvZGlzcGxheS1kYXRhL2dlbmVyYWwtcHJvcGVydGllcy5tb2RlbCc7XG5pbXBvcnQgeyBJQ3VzdG9tQ29tcG9uZW50cyB9IGZyb20gJy4uL2NvbXBvbmVudHMvc2hhcmVkL2N1c3RvbS1jb21wb25lbnRzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJbWFnZURhdGFNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW1hZ2UtZGF0YS5tb2RlbCc7XG5pbXBvcnQgeyBJbnNlcnRCcmVha01vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9pbnNlcnQtYnJlYWsubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0RWxlbWVudE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9pbnNlcnQtZWxlbWVudC5tb2RlbCc7XG5pbXBvcnQgeyBJbnNlcnRJbWFnZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9pbnNlcnQtaW1hZ2UubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0TGlua01vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9pbnNlcnQtbGluay5tb2RlbCc7XG5pbXBvcnQgeyBJbnNlcnRQYXJhZ3JhcGhNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LXBhcmFncmFwaC5tb2RlbCc7XG5pbXBvcnQgeyBJbnNlcnRUYWJsZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9pbnNlcnQtdGFibGUubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0VGFiTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2luc2VydC10YWIubW9kZWwnO1xuaW1wb3J0IHsgSVRvb2xiYXJTdHlsZXMgfSBmcm9tICcuLi9jb250ZW50L2Rpc3BsYXktZGF0YS90b29sYmFyLXN0eWxlcy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTGlua0RhdGFNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvbGluay1kYXRhLm1vZGVsJztcbmltcG9ydCB7IExpbmtNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvbGluay5tb2RlbCc7XG5pbXBvcnQgeyBORVdfTElORV9NQVJLVVAgfSBmcm9tICcuLi9jb250ZW50L2NvbnN0YW50cy9lZGl0b3IuY29uc3QnO1xuaW1wb3J0IHsgTm9kZXJJbWFnZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvaW1hZ2UvY29tcG9uZW50cy9pbWFnZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTm9kZXJUYWJDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL3RhYi90YWIuY29tcG9uZW50JztcbmltcG9ydCB7IE5vZGVyVGFibGVDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL3RhYmxlL2NvbXBvbmVudHMvdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IE51bWJlcmluZ0hlbHBlciB9IGZyb20gJy4uL2dhZGdldHMvbnVtYmVyaW5nL251bWJlcmluZy5oZWxwZXInO1xuaW1wb3J0IHsgTnVtYmVyaW5nTGV2ZWxNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvbnVtYmVyaW5nLWxldmVsLm1vZGVsJztcbmltcG9ydCB7IE51bWJlcmluZ01vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9udW1iZXJpbmcubW9kZWwnO1xuaW1wb3J0IHsgTnVtYmVyaW5nUGFyYWdyYXBoU3R5bGVNb2RlbCB9IGZyb20gJy4uL2dhZGdldHMvbnVtYmVyaW5nL251bWJlcmluZy1wYXJhZ3JhcGgtc3R5bGUubW9kZWwnO1xuaW1wb3J0IHsgT3BlcmF0aW9uc0hlbHBlciB9IGZyb20gJy4uL29wZXJhdGlvbnMvb3BlcmF0aW9ucy1oZWxwZXIuaGVscGVyJztcbmltcG9ydCB7IFBhcmFncmFwaE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9wYXJhZ3JhcGgubW9kZWwnO1xuaW1wb3J0IHsgUGFyYWdyYXBoU3R5bGVIZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvcGFyYWdyYXBoLXN0eWxlLmhlbHBlcic7XG5pbXBvcnQgeyBQYXJhZ3JhcGhTdHlsZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9wYXJhZ3JhcGgtc3R5bGUubW9kZWwnO1xuaW1wb3J0IHsgUmFuZ2UgfSBmcm9tICcuLi9wb3NpdGlvbmluZy9yYW5nZSc7XG5pbXBvcnQgeyBSZXBsYWNlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3JlcGxhY2UubW9kZWwnO1xuaW1wb3J0IHsgUmVzaXplVGFibGVDb2x1bW5zTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3Jlc2l6ZS10YWJsZS1jb2x1bW5zLm1vZGVsJztcbmltcG9ydCB7IFJlc3RvcmVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvcmVzdG9yZS5tb2RlbCc7XG5pbXBvcnQgeyBTY3JvbGxCYXIgfSBmcm9tICcuLi9nYWRnZXRzL3Njcm9sbGJhcic7XG5pbXBvcnQgeyBTZWxlY3Rpb24gfSBmcm9tICcuLi9wb3NpdGlvbmluZy9zZWxlY3Rpb24nO1xuaW1wb3J0IHsgVGFibGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvdGFibGUubW9kZWwnO1xuaW1wb3J0IHsgVGV4dFN0eWxlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3RleHQtc3R5bGUubW9kZWwnO1xuaW1wb3J0IHsgVW5pY29kZUhlbHBlciB9IGZyb20gJy4uL2dhZGdldHMvdW5pY29kZS91bmljb2RlLmhlbHBlcic7XG5cbmV4cG9ydCBjbGFzcyBFZGl0U2Vzc2lvbiB7XG4gICAgdG9rZW5SZSA9IG5ldyBSZWdFeHAoJ15bJyArIFVuaWNvZGVIZWxwZXIud29yZENoYXJzICsgJ1xcXFwkX10rJywgJ2cnKTtcblxuICAgIG5vblRva2VuUmUgPSBuZXcgUmVnRXhwKCdeKD86W14nICsgVW5pY29kZUhlbHBlci53b3JkQ2hhcnMgKyAnXFxcXCRfXXxcXFxcc10pKycsICdnJyk7XG5cbiAgICBnZXQgc2Nyb2xsVG9wKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxCYXI/LnNjcm9sbFRvcCA/PyAwOyAvLyBvbmx5IG1haW4gc2Vzc2lvbiBpcyBzY3JvbGxhYmxlXG4gICAgfVxuXG4gICAgZ2V0IHNjcm9sbEJhckhlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsQmFyPy5lbGVtZW50LmNsaWVudEhlaWdodCA/PyAwOyAvLyBvbmx5IG1haW4gc2Vzc2lvbiBpcyBzY3JvbGxhYmxlXG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBkaXNwbGF5RGF0YTogRGlzcGxheURhdGEsXG4gICAgICAgIHB1YmxpYyBzZXNzaW9uSWQ6IG51bWJlcixcbiAgICAgICAgcHVibGljIGN1c3RvbUNvbnRlbnRTZXJ2aWNlOiBDdXN0b21Db250ZW50U2VydmljZSxcbiAgICAgICAgcHVibGljIG1vZGVsOiBDb250ZW50c0ludGVyZmFjZSxcbiAgICAgICAgcHVibGljIHNlbGVjdGlvbjogU2VsZWN0aW9uLFxuICAgICAgICBwdWJsaWMgZ2VuZXJhbFByb3BlcnRpZXM6IEdlbmVyYWxQcm9wZXJ0aWVzTW9kZWwsXG4gICAgICAgIHB1YmxpYyBlZGl0b3JTZXJ2aWNlOiBFZGl0b3JTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgY3VzdG9tQ29tcG9uZW50czogSUN1c3RvbUNvbXBvbmVudHMsXG4gICAgICAgIHByaXZhdGUgdHlwZTogJ2NlbGwnIHwgJ2VkZ2UnIHwgJ21haW4nIHwgJ2NlbGxXaXRoaW5FZGdlJyxcbiAgICAgICAgcHJpdmF0ZSBzY3JvbGxCYXI/OiBTY3JvbGxCYXJcbiAgICApIHt9XG5cbiAgICBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBnZXRSb3dMZW5ndGgocm93OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBpZiAoIXRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBoc1tyb3ddLm5leHRMaW5lSW5kZXhlcykge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzW3Jvd10ubmV4dExpbmVJbmRleGVzLmxlbmd0aCArIDE7XG4gICAgfVxuXG4gICAgZ2V0Um93Q2FjaGVJbmRleChjYWNoZUFycmF5OiBudW1iZXJbXSwgdmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGxldCBzdGFydCA9IDA7XG4gICAgICAgIGxldCBlbmQgPSBjYWNoZUFycmF5Lmxlbmd0aCAtIDE7XG4gICAgICAgIHdoaWxlIChzdGFydCA8PSBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1pZCA9IChzdGFydCArIGVuZCkgPj4gMTtcbiAgICAgICAgICAgIGNvbnN0IGNlbnRlciA9IGNhY2hlQXJyYXlbbWlkXTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlID4gY2VudGVyKSB7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSBtaWQgKyAxO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA8IGNlbnRlcikge1xuICAgICAgICAgICAgICAgIGVuZCA9IG1pZCAtIDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBtaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3RhcnQgLSAxO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgdGhlIHdpZHRoIG9mIHRoZSBzdHJpbmcgYHN0cmAgb24gdGhlIHNjcmVlbiB3aGlsZSBhc3N1bWluZyB0aGF0IHRoZSBzdHJpbmcgc3RhcnRzIGF0IHRoZSBmaXJzdCBjb2x1bW4gb24gdGhlIHNjcmVlbi5cbiAgICAgKiBUaGUgZmlyc3QgcG9zaXRpb24gaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgY29sdW1ucyBmb3IgYHN0cmAgb24gc2NyZWVuLlxuICAgICAqIFRoZSBzZWNvbmQgdmFsdWUgY29udGFpbnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBkb2N1bWVudCBjb2x1bW4gdGhhdCB0aGlzIGZ1bmN0aW9uIHJlYWQgdW50aWwuXG4gICAgICovXG4gICAgZ2V0U3RyaW5nU2NyZWVuV2lkdGgoc3RyOiBzdHJpbmcsIG1heFNjcmVlbkNvbHVtbj86IG51bWJlcik6IG51bWJlcltdIHtcbiAgICAgICAgbGV0IHNjcmVlbkNvbHVtbiA9IDA7XG4gICAgICAgIGxldCBjb2x1bW46IG51bWJlcjtcbiAgICAgICAgZm9yIChjb2x1bW4gPSAwOyBjb2x1bW4gPCBzdHIubGVuZ3RoOyBjb2x1bW4rKykge1xuICAgICAgICAgICAgc2NyZWVuQ29sdW1uICs9IDE7XG5cbiAgICAgICAgICAgIGlmIChzY3JlZW5Db2x1bW4gPiBtYXhTY3JlZW5Db2x1bW4pIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbc2NyZWVuQ29sdW1uLCBjb2x1bW5dO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgc3RhcnRpbmcgcm93IGFuZCBjb2x1bW4sIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGBSYW5nZWAgb2YgdGhlIGZpcnN0IHdvcmQgYm91bmRhcnkgaXQgZmluZHMuXG4gICAgICovXG4gICAgZ2V0V29yZFJhbmdlKHJvdzogbnVtYmVyLCBjb2x1bW46IG51bWJlcik6IFJhbmdlIHtcbiAgICAgICAgY29uc3QgbGluZSA9IHRoaXMuZGlzcGxheURhdGEuZ2V0UGFyYWdyYXBoQ29udGVudChyb3cpO1xuICAgICAgICBsZXQgaW5Ub2tlbiA9IGZhbHNlO1xuICAgICAgICBpZiAoY29sdW1uID4gMCkge1xuICAgICAgICAgICAgaW5Ub2tlbiA9ICEhbGluZS5jaGFyQXQoY29sdW1uIC0gMSkubWF0Y2godGhpcy50b2tlblJlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaW5Ub2tlbikge1xuICAgICAgICAgICAgaW5Ub2tlbiA9ICEhbGluZS5jaGFyQXQoY29sdW1uKS5tYXRjaCh0aGlzLnRva2VuUmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlZ2V4cDogUmVnRXhwO1xuICAgICAgICBpZiAoaW5Ub2tlbikge1xuICAgICAgICAgICAgcmVnZXhwID0gdGhpcy50b2tlblJlO1xuICAgICAgICB9IGVsc2UgaWYgKC9eXFxzKyQvLnRlc3QobGluZS5zbGljZShjb2x1bW4gLSAxLCBjb2x1bW4gKyAxKSkpIHtcbiAgICAgICAgICAgIHJlZ2V4cCA9IC9cXHMvO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVnZXhwID0gdGhpcy5ub25Ub2tlblJlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHN0YXJ0ID0gY29sdW1uO1xuICAgICAgICBpZiAoc3RhcnQgPiAwKSB7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgc3RhcnQtLTtcbiAgICAgICAgICAgIH0gd2hpbGUgKHN0YXJ0ID49IDAgJiYgbGluZS5jaGFyQXQoc3RhcnQpLm1hdGNoKHJlZ2V4cCkpO1xuXG4gICAgICAgICAgICBzdGFydCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVuZCA9IGNvbHVtbjtcbiAgICAgICAgd2hpbGUgKGVuZCA8IGxpbmUubGVuZ3RoICYmIGxpbmUuY2hhckF0KGVuZCkubWF0Y2gocmVnZXhwKSkge1xuICAgICAgICAgICAgZW5kKys7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFJhbmdlKG5ldyBDdXJzb3JQYXJhZ3JhcGgocm93LCBzdGFydCksIG5ldyBDdXJzb3JQYXJhZ3JhcGgocm93LCBlbmQpKTtcbiAgICB9XG5cbiAgICBnZXREaXNwbGF5TGluZShyb3c6IG51bWJlciwgZW5kQ29sdW1uOiBudW1iZXIsIHN0YXJ0Q29sdW1uPzogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoQ29udGVudCA9IHRoaXMuZGlzcGxheURhdGEuZ2V0UGFyYWdyYXBoQ29udGVudChyb3cpO1xuXG4gICAgICAgIHJldHVybiBwYXJhZ3JhcGhDb250ZW50LnN1YnN0cmluZyhzdGFydENvbHVtbiB8fCAwLCBlbmRDb2x1bW4gfHwgcGFyYWdyYXBoQ29udGVudC5sZW5ndGgpO1xuICAgIH1cblxuICAgIGlzRWRnZU9yV2l0aGluRWRnZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNFZGdlKCkgfHwgdGhpcy5pc1dpdGhpbkVkZ2UoKTtcbiAgICB9XG5cbiAgICBpc0VkZ2UoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdlZGdlJztcbiAgICB9XG5cbiAgICBpc1dpdGhpbkVkZ2UoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdjZWxsV2l0aGluRWRnZSc7XG4gICAgfVxuXG4gICAgb25SZW5kZXJlZCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFZGdlT3JXaXRoaW5FZGdlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5jaGFuZ2VkRWRnZSh0aGlzLnNlc3Npb25JZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW1vdmVCeURvY3VtZW50SW5kZXhlcyhzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhcnRQYXJhZ3JhcGhQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBzdGFydEluZGV4KTtcbiAgICAgICAgY29uc3QgZW5kUGFyYWdyYXBoUG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgZW5kSW5kZXgpO1xuICAgICAgICB0aGlzLnJlbW92ZShuZXcgUmFuZ2Uoc3RhcnRQYXJhZ3JhcGhQb3NpdGlvbiwgZW5kUGFyYWdyYXBoUG9zaXRpb24pKTtcbiAgICB9XG5cbiAgICBpbnNlcnRUZXh0QnlEb2N1bWVudEluZGV4KGluZGV4OiBudW1iZXIsIHRleHQ6IHN0cmluZywgc3R5bGU/OiBUZXh0U3R5bGVNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0VGV4dChwYXJhZ3JhcGhQb3NpdGlvbiwgdGV4dCwgc3R5bGUpO1xuICAgIH1cblxuICAgIGluc2VydEVsZW1lbnRCeURvY3VtZW50SW5kZXgoaW5zZXJ0RWxlbWVudDogSW5zZXJ0RWxlbWVudE1vZGVsKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGluc2VydEVsZW1lbnQuZWxlbWVudC5pbnNlcnRJbmRleCk7XG4gICAgICAgIHJldHVybiB0aGlzLmluc2VydEVsZW1lbnQoZWxlbWVudFBvc2l0aW9uLCBpbnNlcnRFbGVtZW50LmVsZW1lbnQpO1xuICAgIH1cblxuICAgIGluc2VydEJyZWFrQnlEb2N1bWVudEluZGV4KGluc2VydEVsZW1lbnQ6IEluc2VydEJyZWFrTW9kZWwpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBlbGVtZW50UG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgaW5zZXJ0RWxlbWVudC5pbnNlcnRJbmRleCk7XG4gICAgICAgIHJldHVybiB0aGlzLmluc2VydEJyZWFrKGVsZW1lbnRQb3NpdGlvbiwgaW5zZXJ0RWxlbWVudC5icmVha1R5cGUgYXMgQnJlYWtUeXBlcyk7XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFiQnlEb2N1bWVudEluZGV4KGluc2VydEVsZW1lbnQ6IEluc2VydFRhYk1vZGVsKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGluc2VydEVsZW1lbnQuaW5zZXJ0SW5kZXgpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRUYWIoZWxlbWVudFBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBpbnNlcnRJbWFnZUJ5RG9jdW1lbnRJbmRleChpbnNlcnRFbGVtZW50OiBJbnNlcnRJbWFnZU1vZGVsKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGluc2VydEVsZW1lbnQuaW5zZXJ0SW5kZXgpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRJbWFnZShlbGVtZW50UG9zaXRpb24sIGluc2VydEVsZW1lbnQuaW1hZ2VEYXRhKTtcbiAgICB9XG5cbiAgICBpbnNlcnRUYWJsZUJ5RG9jdW1lbnRJbmRleChpbnNlcnRFbGVtZW50OiBJbnNlcnRUYWJsZU1vZGVsKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGluc2VydEVsZW1lbnQuaW5zZXJ0SW5kZXgpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRUYWJsZShlbGVtZW50UG9zaXRpb24sIGluc2VydEVsZW1lbnQpO1xuICAgIH1cblxuICAgIGluc2VydExpbmtCeURvY3VtZW50SW5kZXgoaW5zZXJ0RWxlbWVudDogSW5zZXJ0TGlua01vZGVsKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGluc2VydEVsZW1lbnQuaW5zZXJ0SW5kZXgpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRMaW5rKGVsZW1lbnRQb3NpdGlvbiwgaW5zZXJ0RWxlbWVudC5saW5rRGF0YU1vZGVsKTtcbiAgICB9XG5cbiAgICBpbnNlcnRQYXJhZ3JhcGhCeURvY3VtZW50SW5kZXgoaW5zZXJ0RWxlbWVudDogSW5zZXJ0UGFyYWdyYXBoTW9kZWwpOiBDdXJzb3JQYXJhZ3JhcGgge1xuICAgICAgICBjb25zdCBlbGVtZW50UG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgaW5zZXJ0RWxlbWVudC5pbnNlcnRJbmRleCk7XG4gICAgICAgIHJldHVybiB0aGlzLmluc2VydFBhcmFncmFwaChlbGVtZW50UG9zaXRpb24sIGluc2VydEVsZW1lbnQpO1xuICAgIH1cblxuICAgIGFwcGx5VGV4dFN0eWxlKHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlciwgdGV4dFN0eWxlOiBUZXh0U3R5bGVNb2RlbCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzdGFydFBhcmFncmFwaCA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBzdGFydEluZGV4KS5yb3c7XG4gICAgICAgIGNvbnN0IGVuZFBhcmFncmFwaCA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBlbmRJbmRleCkucm93O1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmFwcGx5VGV4dFN0eWxlKHRoaXMubW9kZWwsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCB0ZXh0U3R5bGUpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhzdGFydFBhcmFncmFwaCwgZW5kUGFyYWdyYXBoKTtcbiAgICAgICAgdGhpcy5zZXRUZXh0U3R5bGUodGV4dFN0eWxlKTtcbiAgICB9XG5cbiAgICBhcHBseVBhcmFncmFwaFN0eWxlKHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlciwgcGFyYWdyYXBoU3R5bGU6IFBhcmFncmFwaFN0eWxlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhcnRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgc3RhcnRJbmRleCkucm93O1xuICAgICAgICBjb25zdCBlbmRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgZW5kSW5kZXgpLnJvdztcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5hcHBseVBhcmFncmFwaFN0eWxlKHRoaXMubW9kZWwsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBwYXJhZ3JhcGhTdHlsZSk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHN0YXJ0UGFyYWdyYXBoLCBlbmRQYXJhZ3JhcGgpO1xuICAgICAgICB0aGlzLmFwcGx5VG9vbGJhclN0eWxlcygpO1xuICAgIH1cblxuICAgIGFwcGx5RWxlbWVudFN0eWxlKG1vZGVsOiBBcHBseUVsZW1lbnRTdHlsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuYXBwbHlFbGVtZW50U3R5bGUodGhpcy5tb2RlbCwgbW9kZWwpO1xuICAgICAgICBjb25zdCBpbWFnZUNvbXBvbmVudFJlZiA9IHRoaXMuY3VzdG9tQ29tcG9uZW50cy5jdXN0b21FbGVtZW50cy5maW5kKHggPT4geC5pbnN0YW5jZS5pbnNlcnRJbmRleCA9PT0gbW9kZWwuaW5zZXJ0SW5kZXgpO1xuICAgICAgICBpbWFnZUNvbXBvbmVudFJlZi5pbnN0YW5jZS5pbml0aWFsaXplKCk7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaCA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBtb2RlbC5pbnNlcnRJbmRleCkucm93O1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhwYXJhZ3JhcGgsIHBhcmFncmFwaCk7XG4gICAgfVxuXG4gICAgYWRkTnVtYmVyaW5nKGxldmVsczogTnVtYmVyaW5nTGV2ZWxNb2RlbFtdLCBzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhcnRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgc3RhcnRJbmRleCkucm93O1xuICAgICAgICBjb25zdCBlbmRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgZW5kSW5kZXgpLnJvdztcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5hZGROdW1iZXJpbmcodGhpcy5tb2RlbCwgdGhpcy5nZW5lcmFsUHJvcGVydGllcy5udW1iZXJpbmdzLCBzdGFydEluZGV4LCBlbmRJbmRleCwgbGV2ZWxzKTtcbiAgICAgICAgdGhpcy5nZW5lcmFsUHJvcGVydGllcy5udW1iZXJpbmdJbmZvID0ge307XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHN0YXJ0UGFyYWdyYXBoLCBlbmRQYXJhZ3JhcGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRQYXJhZ3JhcGg7IGkgPD0gZW5kUGFyYWdyYXBoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3BsYXlEYXRhLmdldFBhcmFncmFwaFNldHRpbmdzKGkpLm51bWJlcmluZ0RhdGEubnVtYmVyaW5nSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU51bWJlcmluZ3NEYXRhT25DaGFuZ2UoZW5kUGFyYWdyYXBoICsgMSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFwcGx5VG9vbGJhclN0eWxlcygpO1xuICAgIH1cblxuICAgIHJlbW92ZU51bWJlcmluZ3Moc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGFyYWdyYXBoID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHN0YXJ0SW5kZXgpLnJvdztcbiAgICAgICAgY29uc3QgZW5kUGFyYWdyYXBoID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGVuZEluZGV4KS5yb3c7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIucmVtb3ZlTnVtYmVyaW5ncyh0aGlzLm1vZGVsLCB0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLm51bWJlcmluZ3MsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS5yZXNldEFsbE51bWJlcmluZ0luZm8oc3RhcnRQYXJhZ3JhcGgpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhzdGFydFBhcmFncmFwaCwgZW5kUGFyYWdyYXBoKTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKGVuZFBhcmFncmFwaCk7XG5cbiAgICAgICAgdGhpcy5hcHBseVRvb2xiYXJTdHlsZXMoKTtcbiAgICB9XG5cbiAgICByZXN0b3JlTnVtYmVyaW5ncyhwYXJhZ3JhcGhzOiBQYXJhZ3JhcGhNb2RlbFtdLCBudW1iZXJpbmdzOiBOdW1iZXJpbmdNb2RlbFtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBwYXJhZ3JhcGhzWzBdLmluc2VydEluZGV4O1xuICAgICAgICBjb25zdCBlbmRJbmRleCA9IHBhcmFncmFwaHNbcGFyYWdyYXBocy5sZW5ndGggLSAxXS5pbnNlcnRJbmRleDtcbiAgICAgICAgY29uc3Qgc3RhcnRQYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgc3RhcnRJbmRleCkucm93O1xuICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoV2l0aE9mZnNldCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGVuZEluZGV4KTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZXN0b3JlTnVtYmVyaW5ncyh0aGlzLm1vZGVsLCB0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLm51bWJlcmluZ3MsIHBhcmFncmFwaHMsIG51bWJlcmluZ3MpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnJlc2V0QWxsTnVtYmVyaW5nSW5mbyhzdGFydFBhcmFncmFwaCk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHN0YXJ0UGFyYWdyYXBoLCBlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICBmb3IgKGNvbnN0IHBhcmFncmFwaCBvZiBwYXJhZ3JhcGhzKSB7XG4gICAgICAgICAgICBpZiAocGFyYWdyYXBoLnBhcmFncmFwaFN0eWxlLm51bWJlcmluZ0lkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKGVuZFBvc2l0aW9uLnJvdyArIDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoZW5kUG9zaXRpb24pO1xuICAgICAgICB0aGlzLmFwcGx5VG9vbGJhclN0eWxlcygpO1xuICAgIH1cblxuICAgIGFwcGx5SW1hZ2VTdHlsZShhcHBseUltYWdlOiBBcHBseUltYWdlU3R5bGVNb2RlbCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbWFnZUNvbXBvbmVudFJlZiA9IHRoaXMuY3VzdG9tQ29tcG9uZW50cy5pbWFnZXMuZmluZCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPT09IGFwcGx5SW1hZ2UuaW5zZXJ0SW5kZXgpO1xuICAgICAgICBpbWFnZUNvbXBvbmVudFJlZi5pbnN0YW5jZS5yZXNpemUoeyB3aWR0aDogYXBwbHlJbWFnZS53aWR0aCwgaGVpZ2h0OiBhcHBseUltYWdlLmhlaWdodCB9KTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5hcHBseUltYWdlU3R5bGUodGhpcy5tb2RlbCwgYXBwbHlJbWFnZSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5kaXNwbGF5RGF0YS5pbmRleFRvUG9zaXRpb24oYXBwbHlJbWFnZS5pbnNlcnRJbmRleCwgMCk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHN0YXJ0LnJvdywgdGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLmxlbmd0aCAtIDEpO1xuICAgIH1cblxuICAgIHJlc3RvcmVUZXh0U3R5bGVzKGZvcm1hdHM6IEZvcm1hdE1vZGVsW10sIGxpbmtGb3JtYXRzOiBGb3JtYXRNb2RlbFtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBmb3JtYXRzWzBdLnN0YXJ0SW5kZXg7XG4gICAgICAgIGNvbnN0IGVuZEluZGV4ID0gZm9ybWF0c1tmb3JtYXRzLmxlbmd0aCAtIDFdLmVuZEluZGV4O1xuICAgICAgICBjb25zdCBzdGFydFBhcmFncmFwaCA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBzdGFydEluZGV4KS5yb3c7XG4gICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhXaXRoT2Zmc2V0KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgZW5kSW5kZXgpO1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLnJlc3RvcmVUZXh0U3R5bGVzKHRoaXMubW9kZWwsIGZvcm1hdHMsIGxpbmtGb3JtYXRzKTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOZXh0TGluZUluZGV4ZXMoc3RhcnRQYXJhZ3JhcGgsIGVuZFBvc2l0aW9uLnJvdyk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvc2l0aW9uKTtcbiAgICAgICAgdGhpcy5hcHBseVRvb2xiYXJTdHlsZXMoKTtcbiAgICB9XG5cbiAgICByZXN0b3JlUGFyYWdyYXBoU3R5bGVzKHBhcmFncmFwaHM6IFBhcmFncmFwaE1vZGVsW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IHBhcmFncmFwaHNbMF0uaW5zZXJ0SW5kZXg7XG4gICAgICAgIGNvbnN0IGVuZEluZGV4ID0gcGFyYWdyYXBoc1twYXJhZ3JhcGhzLmxlbmd0aCAtIDFdLmluc2VydEluZGV4O1xuICAgICAgICBjb25zdCBzdGFydFBhcmFncmFwaCA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBzdGFydEluZGV4KS5yb3c7XG4gICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhXaXRoT2Zmc2V0KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgZW5kSW5kZXgpO1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLnJlc3RvcmVQYXJhZ3JhcGhTdHlsZXModGhpcy5tb2RlbCwgcGFyYWdyYXBocyk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHN0YXJ0UGFyYWdyYXBoLCBlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb3NpdGlvbik7XG4gICAgICAgIHRoaXMuYXBwbHlUb29sYmFyU3R5bGVzKCk7XG4gICAgfVxuXG4gICAgc2V0VGV4dFN0eWxlKHRleHRTdHlsZTogVGV4dFN0eWxlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBJVG9vbGJhclN0eWxlcyA9IHsgLi4udGhpcy5lZGl0b3JTZXJ2aWNlLnN0eWxlcyB9O1xuICAgICAgICBmb3IgKGxldCBrZXkgb2YgT2JqZWN0LmtleXModGV4dFN0eWxlKSkge1xuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB0ZXh0U3R5bGVba2V5XTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRvclNlcnZpY2Uuc3R5bGVzID0gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGByYW5nZWAgZnJvbSB0aGUgZG9jdW1lbnQuXG4gICAgICogSWYgYHJhbmdlYCBpcyBlbXB0eSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB1bm1vZGlmaWVkIHZhbHVlIG9mIGByYW5nZS5zdGFydGAuXG4gICAgICovXG4gICAgcmVtb3ZlKHJhbmdlOiBSYW5nZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYXJ0SW5kZXhlcyA9IENvbnRlbnRIZWxwZXIuZ2V0U2VsZWN0ZWRQYXJ0RG9jdW1lbnRJbmRleGVzKHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgcmFuZ2UpO1xuXG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEucmVtb3ZlUmFuZ2UocmFuZ2UpO1xuXG4gICAgICAgIEN1c3RvbUNvbXBvbmVudEhlbHBlci5hcHBseVJlbW92aW5nQ29tcG9uZW50cyh0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFibGVzLCBwYXJ0SW5kZXhlcy5zdGFydEluZGV4LCBwYXJ0SW5kZXhlcy5lbmRJbmRleCk7XG4gICAgICAgIEN1c3RvbUNvbXBvbmVudEhlbHBlci5hcHBseVJlbW92aW5nQ29tcG9uZW50cyh0aGlzLmN1c3RvbUNvbXBvbmVudHMuaW1hZ2VzLCBwYXJ0SW5kZXhlcy5zdGFydEluZGV4LCBwYXJ0SW5kZXhlcy5lbmRJbmRleCk7XG4gICAgICAgIEN1c3RvbUNvbXBvbmVudEhlbHBlci5hcHBseVJlbW92aW5nQ29tcG9uZW50cyh0aGlzLmN1c3RvbUNvbXBvbmVudHMuY3VzdG9tRWxlbWVudHMsIHBhcnRJbmRleGVzLnN0YXJ0SW5kZXgsIHBhcnRJbmRleGVzLmVuZEluZGV4KTtcbiAgICAgICAgQ3VzdG9tQ29tcG9uZW50SGVscGVyLmFwcGx5UmVtb3ZpbmdDb21wb25lbnRzKHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJzLCBwYXJ0SW5kZXhlcy5zdGFydEluZGV4LCBwYXJ0SW5kZXhlcy5lbmRJbmRleCk7XG5cbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5kZWxldGUodGhpcy5tb2RlbCwgcGFydEluZGV4ZXMuc3RhcnRJbmRleCwgcGFydEluZGV4ZXMuZW5kSW5kZXggLSBwYXJ0SW5kZXhlcy5zdGFydEluZGV4ICsgMSk7XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IocmFuZ2Uuc3RhcnQpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnJlc2V0QWxsTnVtYmVyaW5nSW5mbyhyYW5nZS5zdGFydC5yb3cpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhyYW5nZS5zdGFydC5yb3csIHJhbmdlLnN0YXJ0LnJvdyk7XG4gICAgICAgIGlmIChyYW5nZS5lbmQucm93IC0gcmFuZ2Uuc3RhcnQucm93ICYmIHRoaXMudHlwZSAhPT0gJ2NlbGwnKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU51bWJlcmluZ3NEYXRhT25DaGFuZ2UocmFuZ2Uuc3RhcnQucm93ICsgMSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFwcGx5VG9vbGJhclN0eWxlcygpO1xuICAgIH1cblxuICAgIHJlcGxhY2UobW9kZWw6IFJlcGxhY2VNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIHRoaXMucmVtb3ZlQnlEb2N1bWVudEluZGV4ZXMobW9kZWwuZGVsZXRlLnN0YXJ0SW5kZXgsIG1vZGVsLmRlbGV0ZS5zdGFydEluZGV4ICsgbW9kZWwuZGVsZXRlLmNvdW50KTtcbiAgICAgICAgbGV0IGVuZFBvaW50OiBDdXJzb3JQYXJhZ3JhcGg7XG4gICAgICAgIGlmIChtb2RlbC5pbnNlcnRUZXh0KSB7XG4gICAgICAgICAgICBlbmRQb2ludCA9IHRoaXMuaW5zZXJ0VGV4dEJ5RG9jdW1lbnRJbmRleChtb2RlbC5pbnNlcnRUZXh0Lmluc2VydEluZGV4LCBtb2RlbC5pbnNlcnRUZXh0LnRleHQpO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluc2VydFBhcmFncmFwaCkge1xuICAgICAgICAgICAgZW5kUG9pbnQgPSB0aGlzLmluc2VydFBhcmFncmFwaEJ5RG9jdW1lbnRJbmRleChtb2RlbC5pbnNlcnRQYXJhZ3JhcGgpO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluc2VydEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGVuZFBvaW50ID0gdGhpcy5pbnNlcnRFbGVtZW50QnlEb2N1bWVudEluZGV4KG1vZGVsLmluc2VydEVsZW1lbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluc2VydEJyZWFrKSB7XG4gICAgICAgICAgICBlbmRQb2ludCA9IHRoaXMuaW5zZXJ0QnJlYWtCeURvY3VtZW50SW5kZXgobW9kZWwuaW5zZXJ0QnJlYWspO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluc2VydFRhYikge1xuICAgICAgICAgICAgZW5kUG9pbnQgPSB0aGlzLmluc2VydFRhYkJ5RG9jdW1lbnRJbmRleChtb2RlbC5pbnNlcnRUYWIpO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluc2VydEltYWdlKSB7XG4gICAgICAgICAgICBlbmRQb2ludCA9IHRoaXMuaW5zZXJ0SW1hZ2VCeURvY3VtZW50SW5kZXgobW9kZWwuaW5zZXJ0SW1hZ2UpO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluc2VydFRhYmxlKSB7XG4gICAgICAgICAgICBlbmRQb2ludCA9IHRoaXMuaW5zZXJ0VGFibGVCeURvY3VtZW50SW5kZXgobW9kZWwuaW5zZXJ0VGFibGUpO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluc2VydExpbmspIHtcbiAgICAgICAgICAgIGVuZFBvaW50ID0gdGhpcy5pbnNlcnRMaW5rQnlEb2N1bWVudEluZGV4KG1vZGVsLmluc2VydExpbmspO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVuZFBvaW50O1xuICAgIH1cblxuICAgIGluc2VydFRleHQocG9zaXRpb246IEN1cnNvclBhcmFncmFwaCwgdGV4dDogc3RyaW5nLCBjdXJzb3JTdHlsZT86IFRleHRTdHlsZU1vZGVsKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgaW5zZXJ0SW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFBvc2l0aW9uVG9Eb2N1bWVudEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgcG9zaXRpb24pO1xuICAgICAgICBpZiAoY3Vyc29yU3R5bGUpIHtcbiAgICAgICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuaW5zZXJ0U3R5bGVkVGV4dCh0aGlzLm1vZGVsLCB0ZXh0LCBpbnNlcnRJbmRleCwgY3Vyc29yU3R5bGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5pbnNlcnRUZXh0KHRoaXMubW9kZWwsIHRleHQsIGluc2VydEluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IHRoaXMuZGlzcGxheURhdGEuaW5zZXJ0VGV4dChwb3NpdGlvbiwgdGV4dCk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEucmVzZXRBbGxOdW1iZXJpbmdJbmZvKHBvc2l0aW9uLnJvdyk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHBvc2l0aW9uLnJvdywgZW5kUG9zaXRpb24ucm93KTtcbiAgICAgICAgaWYgKGVuZFBvc2l0aW9uLnJvdyAtIHBvc2l0aW9uLnJvdyAmJiB0aGlzLnR5cGUgIT09ICdjZWxsJykge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKGVuZFBvc2l0aW9uLnJvdyArIDEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvc2l0aW9uKTtcbiAgICAgICAgcmV0dXJuIGVuZFBvc2l0aW9uO1xuICAgIH1cblxuICAgIGluc2VydEVsZW1lbnQocG9zaXRpb246IEN1cnNvclBhcmFncmFwaCwgZWxlbWVudDogRWxlbWVudERhdGFNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgaW5zZXJ0RWxlbWVudCA9IG5ldyBJbnNlcnRFbGVtZW50TW9kZWwoeyBlbGVtZW50OiBuZXcgRWxlbWVudE1vZGVsKHsgaW5zZXJ0SW5kZXgsIC4uLmVsZW1lbnQgfSkgfSk7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuaW5zZXJ0RWxlbWVudCh0aGlzLm1vZGVsLCBpbnNlcnRFbGVtZW50KTtcblxuICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWwuZWxlbWVudHMuZmluZCh4ID0+IHguaW5zZXJ0SW5kZXggPT09IGluc2VydEluZGV4KTtcbiAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMuY3VzdG9tQ29udGVudFNlcnZpY2UuZmluZENvbXBvbmVudFR5cGUobW9kZWwudHlwZSk7XG4gICAgICAgIHRoaXMuYWRkQ29tcG9uZW50KHRoaXMuY3VzdG9tQ29tcG9uZW50cy5jdXN0b21FbGVtZW50cywgbW9kZWwsIHR5cGUpO1xuXG4gICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gdGhpcy5kaXNwbGF5RGF0YS5pbnNlcnRUZXh0KHBvc2l0aW9uLCBDVVNUT01fRUxFTUVOVF9NQVJLRVIpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhwb3NpdGlvbi5yb3csIGVuZFBvc2l0aW9uLnJvdyk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvc2l0aW9uKTtcbiAgICAgICAgcmV0dXJuIGVuZFBvc2l0aW9uO1xuICAgIH1cblxuICAgIGluc2VydEJyZWFrKHBvc2l0aW9uOiBDdXJzb3JQYXJhZ3JhcGgsIGJyZWFrVHlwZTogQnJlYWtUeXBlcyk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgaXNPbk5ld1BhcmFncmFwaCA9XG4gICAgICAgICAgICBicmVha1R5cGUgPT09IEJyZWFrVHlwZXMuUGFnZSAmJlxuICAgICAgICAgICAgQnJlYWtIZWxwZXIuZ2V0QnJlYWtUeXBlKHRoaXMubW9kZWwsIENVU1RPTV9FTEVNRU5UX01BUktFUiwgaW5zZXJ0SW5kZXggLSAxKSAhPT0gQnJlYWtUeXBlcy5QYWdlO1xuICAgICAgICBjb25zdCB0ZXh0ID0gaXNPbk5ld1BhcmFncmFwaCA/IGAke05FV19MSU5FX01BUktVUH0ke0NVU1RPTV9FTEVNRU5UX01BUktFUn1gIDogQ1VTVE9NX0VMRU1FTlRfTUFSS0VSO1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydEJyZWFrKHRoaXMubW9kZWwsIHRleHQsIGluc2VydEluZGV4LCBicmVha1R5cGUpO1xuXG4gICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gdGhpcy5kaXNwbGF5RGF0YS5pbnNlcnRUZXh0KHBvc2l0aW9uLCB0ZXh0KTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOZXh0TGluZUluZGV4ZXMocG9zaXRpb24ucm93LCBlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICBpZiAoaXNPbk5ld1BhcmFncmFwaCAmJiBlbmRQb3NpdGlvbi5yb3cgLSBwb3NpdGlvbi5yb3cpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTnVtYmVyaW5nc0RhdGFPbkNoYW5nZShlbmRQb3NpdGlvbi5yb3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSB0aGlzLmRpc3BsYXlEYXRhLmdldFBvc2l0aW9uQWZ0ZXJCcmVhayhlbmRQb3NpdGlvbiwgYnJlYWtUeXBlKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoY3Vyc29yUG9zaXRpb24pO1xuXG4gICAgICAgIHJldHVybiBlbmRQb3NpdGlvbjtcbiAgICB9XG5cbiAgICBpbnNlcnRUYWIocG9zaXRpb246IEN1cnNvclBhcmFncmFwaCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHBvc2l0aW9uKTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5pbnNlcnRUYWIodGhpcy5tb2RlbCwgaW5zZXJ0SW5kZXgpO1xuXG4gICAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbC50YWJzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4ID09PSBpbnNlcnRJbmRleCk7XG4gICAgICAgIHRoaXMuYWRkQ29tcG9uZW50KHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJzLCBtb2RlbCwgTm9kZXJUYWJDb21wb25lbnQpO1xuXG4gICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gdGhpcy5kaXNwbGF5RGF0YS5pbnNlcnRUZXh0KHBvc2l0aW9uLCBDVVNUT01fRUxFTUVOVF9NQVJLRVIpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhwb3NpdGlvbi5yb3csIHBvc2l0aW9uLnJvdyk7XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoZW5kUG9zaXRpb24pO1xuICAgICAgICByZXR1cm4gZW5kUG9zaXRpb247XG4gICAgfVxuXG4gICAgaW5zZXJ0SW1hZ2UocG9zaXRpb246IEN1cnNvclBhcmFncmFwaCwgaW1hZ2VEYXRhOiBJbWFnZURhdGFNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHBvc2l0aW9uKTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5pbnNlcnRJbWFnZSh0aGlzLm1vZGVsLCBpbnNlcnRJbmRleCwgaW1hZ2VEYXRhKTtcblxuICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWwuaW1hZ2VzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4ID09PSBpbnNlcnRJbmRleCk7XG4gICAgICAgIHRoaXMuYWRkQ29tcG9uZW50KHRoaXMuY3VzdG9tQ29tcG9uZW50cy5pbWFnZXMsIG1vZGVsLCBOb2RlckltYWdlQ29tcG9uZW50KTtcblxuICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IHRoaXMuZGlzcGxheURhdGEuaW5zZXJ0VGV4dChwb3NpdGlvbiwgQ1VTVE9NX0VMRU1FTlRfTUFSS0VSKTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOZXh0TGluZUluZGV4ZXMocG9zaXRpb24ucm93LCBwb3NpdGlvbi5yb3cpO1xuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvc2l0aW9uKTtcblxuICAgICAgICByZXR1cm4gZW5kUG9zaXRpb247XG4gICAgfVxuXG4gICAgaW5zZXJ0TGluayhwb3NpdGlvbjogQ3Vyc29yUGFyYWdyYXBoLCBsaW5rRGF0YTogTGlua0RhdGFNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHBvc2l0aW9uKTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5pbnNlcnRMaW5rKHRoaXMubW9kZWwsIGxpbmtEYXRhLnRleHQsIGxpbmtEYXRhLmxpbmssIGluc2VydEluZGV4KTtcblxuICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IHRoaXMuZGlzcGxheURhdGEuaW5zZXJ0VGV4dChwb3NpdGlvbiwgbGlua0RhdGEudGV4dCk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHBvc2l0aW9uLnJvdywgcG9zaXRpb24ucm93KTtcblxuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb3NpdGlvbik7XG4gICAgICAgIHJldHVybiBlbmRQb3NpdGlvbjtcbiAgICB9XG5cbiAgICBpbnNlcnRUYWJsZShwb3NpdGlvbjogQ3Vyc29yUGFyYWdyYXBoLCB0YWJsZU1vZGVsOiBJbnNlcnRUYWJsZU1vZGVsKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgaW5zZXJ0SW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFBvc2l0aW9uVG9Eb2N1bWVudEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgcG9zaXRpb24pO1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydFRhYmxlKHRoaXMubW9kZWwsIGluc2VydEluZGV4LCB0YWJsZU1vZGVsLCB0aGlzLmRpc3BsYXlEYXRhLmNvbnRlbnRXaWR0aCk7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbC50YWJsZXMuZmluZCh4ID0+IHguaW5zZXJ0SW5kZXggPT09IHRhYmxlTW9kZWwuaW5zZXJ0VGFibGVJbmRleCk7XG4gICAgICAgIHRoaXMuYWRkQ29tcG9uZW50KHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMsIG1vZGVsLCBOb2RlclRhYmxlQ29tcG9uZW50KTtcbiAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSB0aGlzLmRpc3BsYXlEYXRhLmluc2VydFRleHQocG9zaXRpb24sIHRhYmxlTW9kZWwuY29udGVudCk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHBvc2l0aW9uLnJvdywgZW5kUG9zaXRpb24ucm93KTtcbiAgICAgICAgaWYgKGVuZFBvc2l0aW9uLnJvdyAtIHBvc2l0aW9uLnJvdykge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKGVuZFBvc2l0aW9uLnJvdyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoZW5kUG9zaXRpb24pO1xuICAgICAgICByZXR1cm4gZW5kUG9zaXRpb247XG4gICAgfVxuXG4gICAgaW5zZXJ0UGFyYWdyYXBoKHBvc2l0aW9uOiBDdXJzb3JQYXJhZ3JhcGgsIHBhcmFncmFwaE1vZGVsOiBJbnNlcnRQYXJhZ3JhcGhNb2RlbCk6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgdGV4dCA9IE9wZXJhdGlvbnNIZWxwZXIuaW5zZXJ0UGFyYWdyYXBoKHRoaXMubW9kZWwsIGluc2VydEluZGV4LCBwYXJhZ3JhcGhNb2RlbCwgdGhpcy5kaXNwbGF5RGF0YS5jb250ZW50V2lkdGgpO1xuICAgICAgICBjb25zdCBlbmRQb3NpdGlvbiA9IHRoaXMuZGlzcGxheURhdGEuaW5zZXJ0VGV4dChwb3NpdGlvbiwgdGV4dCk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHBvc2l0aW9uLnJvdywgZW5kUG9zaXRpb24ucm93KTtcbiAgICAgICAgaWYgKGVuZFBvc2l0aW9uLnJvdyAtIHBvc2l0aW9uLnJvdykge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKGVuZFBvc2l0aW9uLnJvdyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGVuZFBvaW50OiBDdXJzb3JQYXJhZ3JhcGg7XG4gICAgICAgIGlmIChwYXJhZ3JhcGhNb2RlbC5pbnNlcnRUZXh0KSB7XG4gICAgICAgICAgICBjb25zdCBwYXJhZ3JhcGhQb3NpdGlvbiA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgoXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLFxuICAgICAgICAgICAgICAgIHBhcmFncmFwaE1vZGVsLmluc2VydFRleHQuaW5zZXJ0SW5kZXhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBlbmRQb2ludCA9IHRoaXMuZGlzcGxheURhdGEuaW5zZXJ0VGV4dChwYXJhZ3JhcGhQb3NpdGlvbiwgdGV4dCk7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhwYXJhZ3JhcGhQb3NpdGlvbi5yb3csIGVuZFBvaW50LnJvdyk7XG4gICAgICAgICAgICBpZiAoZW5kUG9pbnQucm93IC0gcGFyYWdyYXBoUG9zaXRpb24ucm93KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKGVuZFBvaW50LnJvdyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb2ludCk7XG4gICAgICAgIH0gZWxzZSBpZiAocGFyYWdyYXBoTW9kZWwuaW5zZXJ0SW1hZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFncmFwaFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleChcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsXG4gICAgICAgICAgICAgICAgcGFyYWdyYXBoTW9kZWwuaW5zZXJ0SW1hZ2UuaW5zZXJ0SW5kZXhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBpbWFnZUluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbC5pbWFnZXMuZmluZCh4ID0+IHguaW5zZXJ0SW5kZXggPT09IGltYWdlSW5zZXJ0SW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5hZGRDb21wb25lbnQodGhpcy5jdXN0b21Db21wb25lbnRzLmltYWdlcywgbW9kZWwsIE5vZGVySW1hZ2VDb21wb25lbnQpO1xuICAgICAgICAgICAgZW5kUG9pbnQgPSB0aGlzLmRpc3BsYXlEYXRhLmluc2VydFRleHQocGFyYWdyYXBoUG9zaXRpb24sIENVU1RPTV9FTEVNRU5UX01BUktFUik7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU5leHRMaW5lSW5kZXhlcyhwYXJhZ3JhcGhQb3NpdGlvbi5yb3csIHBhcmFncmFwaFBvc2l0aW9uLnJvdyk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihlbmRQb2ludCk7XG4gICAgICAgIH0gZWxzZSBpZiAocGFyYWdyYXBoTW9kZWwuaW5zZXJ0VGFibGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFncmFwaFBvc2l0aW9uID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleChcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsXG4gICAgICAgICAgICAgICAgcGFyYWdyYXBoTW9kZWwuaW5zZXJ0VGFibGUuaW5zZXJ0SW5kZXhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWwudGFibGVzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4ID09PSBwYXJhZ3JhcGhNb2RlbC5pbnNlcnRUYWJsZS5pbnNlcnRUYWJsZUluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuYWRkQ29tcG9uZW50KHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMsIG1vZGVsLCBOb2RlclRhYmxlQ29tcG9uZW50KTtcbiAgICAgICAgICAgIGVuZFBvaW50ID0gdGhpcy5kaXNwbGF5RGF0YS5pbnNlcnRUZXh0KHBhcmFncmFwaFBvc2l0aW9uLCBwYXJhZ3JhcGhNb2RlbC5pbnNlcnRUYWJsZS5jb250ZW50KTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHBhcmFncmFwaFBvc2l0aW9uLnJvdywgZW5kUG9pbnQucm93KTtcbiAgICAgICAgICAgIGlmIChlbmRQb2ludC5yb3cgLSBwYXJhZ3JhcGhQb3NpdGlvbi5yb3cpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnVwZGF0ZU51bWJlcmluZ3NEYXRhT25DaGFuZ2UoZW5kUG9pbnQucm93KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGVuZFBvaW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW5kUG9pbnQ7XG4gICAgfVxuXG4gICAgYWRkQ29tcG9uZW50PFQgZXh0ZW5kcyBCYXNlTm9kZXJDb21wb25lbnQ+KGN1c3RvbUVsZW1lbnRzOiBDb21wb25lbnRSZWY8VD5bXSwgbW9kZWw6IEN1c3RvbUNvbnRlbnQsIGNvbXBvbmVudFR5cGU6IFR5cGU8VD4pIHtcbiAgICAgICAgY29uc3QgY3VzdG9tRWxlbWVudCA9IHRoaXMuY3VzdG9tQ29udGVudFNlcnZpY2UuY29tcG9uZW50U2VydmljZS5nZW5lcmF0ZUNvbXBvbmVudChjb21wb25lbnRUeXBlLCB7XG4gICAgICAgICAgICBjb250ZW50OiBtb2RlbCxcbiAgICAgICAgICAgIHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICAgICAgICBnZW5lcmFsUHJvcGVydGllczogdGhpcy5nZW5lcmFsUHJvcGVydGllcyxcbiAgICAgICAgICAgIGNvbnRlbnRXaWR0aDogdGhpcy5kaXNwbGF5RGF0YS5jb250ZW50V2lkdGhcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG5ld0VsZW1lbnRQb3NpdGlvbiA9IGN1c3RvbUVsZW1lbnRzLmZpbmRJbmRleCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPiBtb2RlbC5pbnNlcnRJbmRleCk7XG4gICAgICAgIGlmIChuZXdFbGVtZW50UG9zaXRpb24gPj0gMCkge1xuICAgICAgICAgICAgY3VzdG9tRWxlbWVudHMuc3BsaWNlKG5ld0VsZW1lbnRQb3NpdGlvbiwgMCwgY3VzdG9tRWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXN0b21FbGVtZW50cy5wdXNoKGN1c3RvbUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXBwbHlUb29sYmFyU3R5bGVzKCk6IHZvaWQge1xuICAgICAgICAvLyB1bmRlZmluZWQgLSB2YWx1ZSB3YXNuJ3Qgc2V0XG4gICAgICAgIC8vIG51bGwgLSBjb2xsaXNpb24gKGRpZmZlcmVudCB2YWx1ZXMgYXQgdGhlIHNhbWUgdGltZSlcbiAgICAgICAgLy8gdmFsdWUgLSB2YWx1ZSB3YXMgc2V0IHdpdGhvdXQgY29sbGlzaW9uc1xuICAgICAgICBsZXQgc3RhcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCB0aGlzLnNlbGVjdGlvbi5yYW5nZS5zdGFydCk7XG4gICAgICAgIGxldCBlbmRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCB0aGlzLnNlbGVjdGlvbi5yYW5nZS5lbmQpO1xuICAgICAgICBpZiAoc3RhcnRJbmRleCAhPT0gZW5kSW5kZXgpIHtcbiAgICAgICAgICAgIGVuZEluZGV4LS07XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb24uY3Vyc29yLmNvbHVtbiA+IDApIHtcbiAgICAgICAgICAgIHN0YXJ0SW5kZXgtLTtcbiAgICAgICAgICAgIGVuZEluZGV4LS07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyYWdyYXBoU3R5bGVzID0gUGFyYWdyYXBoU3R5bGVIZWxwZXIuZ2V0UGFyYWdyYXBoc0F0UmFuZ2UodGhpcy5tb2RlbC5wYXJhZ3JhcGhzLCBzdGFydEluZGV4LCBlbmRJbmRleCkubWFwKHggPT5cbiAgICAgICAgICAgIHgucGFyYWdyYXBoU3R5bGUubnVtYmVyaW5nSWRcbiAgICAgICAgICAgICAgICA/IE51bWJlcmluZ0hlbHBlci5nZXRTdHlsZXMoeC5wYXJhZ3JhcGhTdHlsZSwgdGhpcy5nZW5lcmFsUHJvcGVydGllcy5udW1iZXJpbmdzKVxuICAgICAgICAgICAgICAgIDogbmV3IE51bWJlcmluZ1BhcmFncmFwaFN0eWxlTW9kZWwoeC5wYXJhZ3JhcGhTdHlsZSlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgc3R5bGVzID0gdGhpcy5zZWxlY3Rpb24uaXNFbXB0eVxuICAgICAgICAgICAgPyB0aGlzLmdldFN0eWxlRm9yQ3Vyc29yKHN0YXJ0SW5kZXgpXG4gICAgICAgICAgICA6IEZvcm1hdFN0eWxlSGVscGVyLmNvbWJpbmVTZWN0aW9uKHRoaXMubW9kZWwuZm9ybWF0cywgdGhpcy5tb2RlbC5saW5rcywgc3RhcnRJbmRleCwgZW5kSW5kZXgpLm1hcCh4ID0+IHgudGV4dFN0eWxlKTtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBJVG9vbGJhclN0eWxlcyA9IHt9O1xuICAgICAgICBmb3IgKGxldCBzdHlsZSBvZiBbLi4uc3R5bGVzLCAuLi5wYXJhZ3JhcGhTdHlsZXNdKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgb2YgT2JqZWN0LmtleXMoc3R5bGUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdFtrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBzdHlsZVtrZXldO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0W2tleV0gIT09IHN0eWxlW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRvclNlcnZpY2Uuc3R5bGVzID0gcmVzdWx0O1xuICAgIH1cblxuICAgIGdldFN0eWxlRm9yQ3Vyc29yKGluZGV4OiBudW1iZXIpOiBUZXh0U3R5bGVNb2RlbFtdIHtcbiAgICAgICAgY29uc3QgbGluayA9IHRoaXMubW9kZWwubGlua3MuZmluZCh4ID0+IHguc3RhcnRJbmRleCA8PSBpbmRleCAmJiB4LmVuZEluZGV4ID4gaW5kZXgpO1xuICAgICAgICBpZiAobGluayAmJiAhdGhpcy5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLnNvbWUoeCA9PiB4LnN0YXJ0SW5kZXggPT09IGluZGV4KSkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXhJbkxpbmsgPSBpbmRleCAtIGxpbmsuc3RhcnRJbmRleDtcbiAgICAgICAgICAgIGNvbnN0IGxpbmtGb3JtYXQgPSBsaW5rLmZvcm1hdHMuZmluZCh4ID0+IHguc3RhcnRJbmRleCA8PSBpbmRleEluTGluayAmJiB4LmVuZEluZGV4ID49IGluZGV4SW5MaW5rKTtcbiAgICAgICAgICAgIHJldHVybiBbbGlua0Zvcm1hdC50ZXh0U3R5bGVdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9ybWF0ID0gRm9ybWF0U3R5bGVIZWxwZXIuZ2V0Rm9ybWF0QXRJbmRleCh0aGlzLm1vZGVsLmZvcm1hdHMsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIFtmb3JtYXQudGV4dFN0eWxlXTtcbiAgICB9XG5cbiAgICByZXN0b3JlKG1vZGVsOiBSZXN0b3JlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoUG9zaXRpb24gPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuZGlzcGxheURhdGEucGFyYWdyYXBocywgbW9kZWwuc3RhcnRJbmRleCk7XG4gICAgICAgIGlmIChtb2RlbC5zdGFydEluZGV4ICE9PSBtb2RlbC5lbmRJbmRleCkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVCeURvY3VtZW50SW5kZXhlcyhtb2RlbC5zdGFydEluZGV4LCBtb2RlbC5lbmRJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICBPcGVyYXRpb25zSGVscGVyLnJlc3RvcmUodGhpcy5tb2RlbCwgbW9kZWwpO1xuXG4gICAgICAgIGNvbnN0IHJlc3RvcmVFbmRJbmRleCA9IG1vZGVsLnN0YXJ0SW5kZXggKyBtb2RlbC50ZXh0Lmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXN0b3JlQ29tcG9uZW50cyh0aGlzLm1vZGVsLnRhYmxlcywgdGhpcy5jdXN0b21Db21wb25lbnRzLnRhYmxlcywgTm9kZXJUYWJsZUNvbXBvbmVudCwgbW9kZWwuc3RhcnRJbmRleCwgcmVzdG9yZUVuZEluZGV4KTtcbiAgICAgICAgdGhpcy5yZXN0b3JlQ29tcG9uZW50cyh0aGlzLm1vZGVsLmltYWdlcywgdGhpcy5jdXN0b21Db21wb25lbnRzLmltYWdlcywgTm9kZXJJbWFnZUNvbXBvbmVudCwgbW9kZWwuc3RhcnRJbmRleCwgcmVzdG9yZUVuZEluZGV4KTtcbiAgICAgICAgdGhpcy5yZXN0b3JlQ29tcG9uZW50cyh0aGlzLm1vZGVsLnRhYnMsIHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJzLCBOb2RlclRhYkNvbXBvbmVudCwgbW9kZWwuc3RhcnRJbmRleCwgcmVzdG9yZUVuZEluZGV4KTtcbiAgICAgICAgdGhpcy5yZXN0b3JlRWxlbWVudENvbXBvbmVudHModGhpcy5tb2RlbC5lbGVtZW50cywgbW9kZWwuc3RhcnRJbmRleCwgcmVzdG9yZUVuZEluZGV4KTtcblxuICAgICAgICBjb25zdCBlbmRQb2ludCA9IHRoaXMuZGlzcGxheURhdGEuaW5zZXJ0VGV4dChwYXJhZ3JhcGhQb3NpdGlvbiwgbW9kZWwudGV4dCk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEucmVzZXRBbGxOdW1iZXJpbmdJbmZvKHBhcmFncmFwaFBvc2l0aW9uLnJvdyk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHBhcmFncmFwaFBvc2l0aW9uLnJvdywgZW5kUG9pbnQucm93KTtcbiAgICAgICAgaWYgKGVuZFBvaW50LnJvdyAtIHBhcmFncmFwaFBvc2l0aW9uLnJvdyAmJiB0aGlzLnR5cGUgIT09ICdjZWxsJykge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS51cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKGVuZFBvaW50LnJvdyArIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoZW5kUG9pbnQpO1xuICAgICAgICB0aGlzLmFwcGx5VG9vbGJhclN0eWxlcygpO1xuICAgIH1cblxuICAgIHJlc3RvcmVDb21wb25lbnRzPFQgZXh0ZW5kcyBCYXNlTm9kZXJDb21wb25lbnQ+KFxuICAgICAgICBtb2RlbHM6IEN1c3RvbUNvbnRlbnRbXSxcbiAgICAgICAgY29tcG9uZW50czogQ29tcG9uZW50UmVmPEJhc2VOb2RlckNvbXBvbmVudD5bXSxcbiAgICAgICAgY29tcG9uZW50VHlwZTogVHlwZTxUPixcbiAgICAgICAgcmVzdG9yZUluZGV4OiBudW1iZXIsXG4gICAgICAgIHJlc3RvcmVFbmRJbmRleDogbnVtYmVyXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgbW9kZWwgb2YgbW9kZWxzKSB7XG4gICAgICAgICAgICBpZiAobW9kZWwuaW5zZXJ0SW5kZXggPCByZXN0b3JlSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobW9kZWwuaW5zZXJ0SW5kZXggPj0gcmVzdG9yZUVuZEluZGV4KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFkZENvbXBvbmVudChjb21wb25lbnRzLCBtb2RlbCwgY29tcG9uZW50VHlwZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXN0b3JlRWxlbWVudENvbXBvbmVudHMoZWxlbWVudHM6IEVsZW1lbnRNb2RlbFtdLCByZXN0b3JlSW5kZXg6IG51bWJlciwgcmVzdG9yZUVuZEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBtb2RlbCBvZiBlbGVtZW50cykge1xuICAgICAgICAgICAgaWYgKG1vZGVsLmluc2VydEluZGV4IDwgcmVzdG9yZUluZGV4KSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluc2VydEluZGV4ID49IHJlc3RvcmVFbmRJbmRleCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMuY3VzdG9tQ29udGVudFNlcnZpY2UuZmluZENvbXBvbmVudFR5cGUobW9kZWwudHlwZSk7XG4gICAgICAgICAgICB0aGlzLmFkZENvbXBvbmVudCh0aGlzLmN1c3RvbUNvbXBvbmVudHMuY3VzdG9tRWxlbWVudHMsIG1vZGVsLCB0eXBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldExpbmtNb2RlbChjdXJzb3I6IEN1cnNvclBhcmFncmFwaCk6IExpbmtNb2RlbCB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGN1cnNvcik7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsLmxpbmtzLmZpbmQoeCA9PiB4LnN0YXJ0SW5kZXggPD0gaW5kZXggJiYgeC5lbmRJbmRleCA+PSBpbmRleCk7XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFibGVSb3dzKGluc2VydEluZGV4OiBudW1iZXIsIHJvd3NDb3VudDogbnVtYmVyLCB0YXJnZXRJbmRleDogbnVtYmVyLCBpbmhlcml0SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuY3VzdG9tQ29tcG9uZW50cy50YWJsZXMuZmluZCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPT09IGluc2VydEluZGV4KTtcbiAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS5yZXNldE51bWJlcmluZ0luZm9CeVRhYmxlQ2VsbCh0YWJsZSk7XG4gICAgICAgIE9wZXJhdGlvbnNIZWxwZXIuaW5zZXJ0VGFibGVSb3dzKHRoaXMubW9kZWwsIGluc2VydEluZGV4LCByb3dzQ291bnQsIHRhcmdldEluZGV4LCBpbmhlcml0SW5kZXgpO1xuICAgICAgICB0YWJsZS5pbnN0YW5jZS51cGRhdGVUYWJsZSgpO1xuICAgIH1cblxuICAgIGluc2VydFRhYmxlQ29sdW1ucyhpbnNlcnRJbmRleDogbnVtYmVyLCBjb2x1bW5zQ291bnQ6IG51bWJlciwgdGFyZ2V0SW5kZXg6IG51bWJlciwgaW5oZXJpdEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFibGVzLmZpbmQoeCA9PiB4Lmluc3RhbmNlLmluc2VydEluZGV4ID09PSBpbnNlcnRJbmRleCk7XG4gICAgICAgIHRoaXMuZGlzcGxheURhdGEucmVzZXROdW1iZXJpbmdJbmZvQnlUYWJsZUNlbGwodGFibGUpO1xuICAgICAgICBPcGVyYXRpb25zSGVscGVyLmluc2VydFRhYmxlQ29sdW1ucyhcbiAgICAgICAgICAgIHRoaXMubW9kZWwsXG4gICAgICAgICAgICBpbnNlcnRJbmRleCxcbiAgICAgICAgICAgIGNvbHVtbnNDb3VudCxcbiAgICAgICAgICAgIHRhcmdldEluZGV4LFxuICAgICAgICAgICAgaW5oZXJpdEluZGV4LFxuICAgICAgICAgICAgdGhpcy5kaXNwbGF5RGF0YS5jb250ZW50V2lkdGhcbiAgICAgICAgKTtcbiAgICAgICAgdGFibGUuaW5zdGFuY2UudXBkYXRlVGFibGUoKTtcbiAgICB9XG5cbiAgICByZW1vdmVUYWJsZVJvd3MoaW5zZXJ0SW5kZXg6IG51bWJlciwgc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5jdXN0b21Db21wb25lbnRzLnRhYmxlcy5maW5kKHggPT4geC5pbnN0YW5jZS5pbnNlcnRJbmRleCA9PT0gaW5zZXJ0SW5kZXgpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnJlc2V0TnVtYmVyaW5nSW5mb0J5VGFibGVDZWxsKHRhYmxlKTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZW1vdmVUYWJsZVJvd3ModGhpcy5tb2RlbCwgaW5zZXJ0SW5kZXgsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgdGFibGUuaW5zdGFuY2UudXBkYXRlVGFibGUoKTtcbiAgICB9XG5cbiAgICByZW1vdmVUYWJsZUNvbHVtbnMoaW5zZXJ0SW5kZXg6IG51bWJlciwgc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5jdXN0b21Db21wb25lbnRzLnRhYmxlcy5maW5kKHggPT4geC5pbnN0YW5jZS5pbnNlcnRJbmRleCA9PT0gaW5zZXJ0SW5kZXgpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnJlc2V0TnVtYmVyaW5nSW5mb0J5VGFibGVDZWxsKHRhYmxlKTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZW1vdmVUYWJsZUNvbHVtbnModGhpcy5tb2RlbCwgaW5zZXJ0SW5kZXgsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCB0aGlzLmRpc3BsYXlEYXRhLmNvbnRlbnRXaWR0aCk7XG4gICAgICAgIHRhYmxlLmluc3RhbmNlLnVwZGF0ZVRhYmxlKCk7XG4gICAgfVxuXG4gICAgcmVzaXplVGFibGVDb2x1bW5zKHJlc2l6ZVRhYmxlQ29sdW1uczogUmVzaXplVGFibGVDb2x1bW5zTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFibGVzLmZpbmQoeCA9PiB4Lmluc3RhbmNlLmluc2VydEluZGV4ID09PSByZXNpemVUYWJsZUNvbHVtbnMuaW5zZXJ0SW5kZXgpO1xuICAgICAgICB0aGlzLmRpc3BsYXlEYXRhLnJlc2V0TnVtYmVyaW5nSW5mb0J5VGFibGVDZWxsKHRhYmxlKTtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZXNpemVUYWJsZUNvbHVtbnModGhpcy5tb2RlbCwgcmVzaXplVGFibGVDb2x1bW5zKTtcbiAgICAgICAgdGFibGUuaW5zdGFuY2UudXBkYXRlVGFibGUoKTtcbiAgICB9XG5cbiAgICByZXN0b3JlVGFibGUoaW5zZXJ0SW5kZXg6IG51bWJlciwgdGFibGU6IFRhYmxlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb2xkVGFibGUgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRhYmxlKSkgYXMgVGFibGVNb2RlbDtcbiAgICAgICAgT3BlcmF0aW9uc0hlbHBlci5yZXN0b3JlVGFibGUodGhpcy5tb2RlbCwgaW5zZXJ0SW5kZXgsIG9sZFRhYmxlKTtcbiAgICAgICAgY29uc3QgdGFibGVDb21wb25lbnQgPSB0aGlzLmN1c3RvbUNvbXBvbmVudHMudGFibGVzLmZpbmQoeCA9PiB4Lmluc3RhbmNlLmluc2VydEluZGV4ID09PSBpbnNlcnRJbmRleCk7XG4gICAgICAgIHRhYmxlQ29tcG9uZW50Lmluc3RhbmNlLnVwZGF0ZVRhYmxlKCk7XG4gICAgfVxufVxuIl19