@jax-data-science/sci-image-visualizer 0.16.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/esm2022/lib/contracts/display-types.mjs +4 -2
  2. package/esm2022/lib/contracts/image.contract.mjs +1 -1
  3. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +1 -1
  4. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  5. package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
  6. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +1 -1
  7. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  8. package/esm2022/lib/geometry/cell-meshes.mjs +37 -0
  9. package/esm2022/lib/geometry/place.mjs +47 -0
  10. package/esm2022/lib/implementations/napari-js/napari-camera-depth.mjs +93 -0
  11. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +1 -1
  12. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +2 -2
  13. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
  14. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +86 -18
  15. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-cells.mjs +746 -0
  16. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +343 -18
  17. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-transcripts.mjs +427 -0
  18. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +11 -4
  19. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +95 -5
  20. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +15 -1
  21. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +35 -8
  22. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +40 -1
  23. package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +136 -28
  24. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +19 -3
  25. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +188 -52
  26. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +35 -11
  27. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +2 -2
  28. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +10 -1
  29. package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +30 -3
  30. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +15 -3
  31. package/esm2022/lib/region-editor/region-editor.component.mjs +24 -4
  32. package/esm2022/lib/region-source/region-source-ops.mjs +7 -1
  33. package/esm2022/lib/region-source/region-tiles.mjs +1 -1
  34. package/esm2022/lib/region-source/worker-region-source.mjs +24 -1
  35. package/esm2022/lib/routing-visualizer.service.mjs +404 -7
  36. package/esm2022/lib/spatial/observations-in-selection.mjs +83 -0
  37. package/esm2022/lib/spatial/plane-cells.mjs +119 -0
  38. package/esm2022/lib/spatial/spatial-controls.facade.mjs +304 -8
  39. package/esm2022/lib/spatial/spatial-encoding.mjs +52 -3
  40. package/esm2022/lib/spatial/spatial-hover.mjs +34 -1
  41. package/esm2022/lib/spatial/spatial-planes.mjs +49 -0
  42. package/esm2022/lib/spatial/spatial-selection.mjs +2 -2
  43. package/esm2022/lib/spatial/spatial-tile-merge.mjs +38 -1
  44. package/esm2022/lib/spatial/transcripts-in-selection.mjs +208 -0
  45. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +42 -65
  46. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +6 -2
  47. package/esm2022/lib/spatial-controls/spatial-color-by/spatial-color-by.component.mjs +187 -0
  48. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +51 -12
  49. package/esm2022/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.mjs +7 -3
  50. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +21 -6
  51. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +94 -13
  52. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +3 -3
  53. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +3 -3
  54. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +79 -57
  55. package/esm2022/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.mjs +101 -0
  56. package/esm2022/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.mjs +94 -0
  57. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +9 -3
  58. package/esm2022/lib/store/region-source-scope.mjs +10 -1
  59. package/esm2022/lib/store/region-store.service.mjs +33 -2
  60. package/esm2022/lib/toolbar/toolbar.component.mjs +10 -3
  61. package/esm2022/lib/visualizer/spatial-region-set.mjs +95 -0
  62. package/esm2022/lib/visualizer.component.mjs +40 -4
  63. package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CYsPzX3J.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CBiLcnE6.mjs} +4838 -656
  64. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CBiLcnE6.mjs.map +1 -0
  65. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-DaZVXq1s.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-BXHjv4PE.mjs} +2 -2
  66. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-DaZVXq1s.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-BXHjv4PE.mjs.map} +1 -1
  67. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1 -1
  68. package/fesm2022/region-source.worker.js +84 -2
  69. package/lib/contracts/display-types.d.ts +99 -6
  70. package/lib/contracts/image.contract.d.ts +6 -0
  71. package/lib/contracts/ports/spatial-data.port.d.ts +7 -0
  72. package/lib/contracts/region-editor-api.contract.d.ts +9 -0
  73. package/lib/contracts/region-store.contract.d.ts +6 -0
  74. package/lib/contracts/spatial-dataset.contract.d.ts +7 -1
  75. package/lib/contracts/visualizer.contract.d.ts +43 -1
  76. package/lib/geometry/cell-meshes.d.ts +27 -0
  77. package/lib/geometry/place.d.ts +45 -0
  78. package/lib/implementations/napari-js/napari-camera-depth.d.ts +23 -0
  79. package/lib/implementations/napari-js/napari-loading-state.d.ts +1 -1
  80. package/lib/implementations/napari-js/napari-scene.d.ts +12 -0
  81. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +19 -3
  82. package/lib/implementations/napari-js/napari-spatial-3d-cells.d.ts +141 -0
  83. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +89 -0
  84. package/lib/implementations/napari-js/napari-spatial-3d-transcripts.d.ts +103 -0
  85. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +9 -2
  86. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +22 -0
  87. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +12 -0
  88. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +20 -6
  89. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +27 -1
  90. package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +48 -16
  91. package/lib/implementations/napari-js/napari-volume-scene.d.ts +2 -0
  92. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +54 -1
  93. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +11 -2
  94. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +7 -0
  95. package/lib/region-editor/class-tree/class-tree.component.d.ts +16 -1
  96. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +10 -1
  97. package/lib/region-editor/region-editor.component.d.ts +4 -0
  98. package/lib/region-source/region-source-ops.d.ts +12 -0
  99. package/lib/region-source/region-tiles.d.ts +8 -0
  100. package/lib/region-source/worker-region-source.d.ts +18 -0
  101. package/lib/routing-visualizer.service.d.ts +140 -1
  102. package/lib/spatial/observations-in-selection.d.ts +43 -0
  103. package/lib/spatial/plane-cells.d.ts +37 -0
  104. package/lib/spatial/spatial-controls.facade.d.ts +59 -0
  105. package/lib/spatial/spatial-encoding.d.ts +24 -1
  106. package/lib/spatial/spatial-hover.d.ts +23 -0
  107. package/lib/spatial/spatial-planes.d.ts +22 -0
  108. package/lib/spatial/spatial-selection.d.ts +2 -1
  109. package/lib/spatial/spatial-tile-merge.d.ts +9 -0
  110. package/lib/spatial/transcripts-in-selection.d.ts +95 -0
  111. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +19 -28
  112. package/lib/spatial-controls/spatial-color-by/spatial-color-by.component.d.ts +64 -0
  113. package/lib/spatial-controls/spatial-controls.component.d.ts +19 -2
  114. package/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.d.ts +3 -1
  115. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +7 -0
  116. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +28 -7
  117. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +26 -23
  118. package/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.d.ts +48 -0
  119. package/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.d.ts +43 -0
  120. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +3 -1
  121. package/lib/store/region-source-scope.d.ts +4 -0
  122. package/lib/store/region-store.service.d.ts +21 -0
  123. package/lib/toolbar/toolbar.component.d.ts +6 -1
  124. package/lib/visualizer/spatial-region-set.d.ts +55 -0
  125. package/lib/visualizer.component.d.ts +14 -0
  126. package/package.json +2 -2
  127. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CYsPzX3J.mjs.map +0 -1
@@ -210,6 +210,10 @@ export class RegionEditorComponent {
210
210
  /** Physical pixel size (µm/pixel) of the active image, for region areas in
211
211
  * µm²; empty when the format reports no physical size. */
212
212
  this.mpp = {};
213
+ /** Hide (or show again) these classes' regions, wherever they are drawn. */
214
+ /** Classes that can be drawn as individual cells in spatial 3D, and those that are. */
215
+ this.cellableClasses = new Set();
216
+ this.individualClasses = new Set();
213
217
  /** In a volume view, each class's volume over the whole stack, for the table (null: areas). */
214
218
  this.tableVolumes = null;
215
219
  /** Bumped when the regions change, so a volume computed before is dropped. */
@@ -331,6 +335,20 @@ export class RegionEditorComponent {
331
335
  this.hiddenClasses = hidden;
332
336
  this.changed();
333
337
  });
338
+ this.regionApi
339
+ .getCellableClasses3d$?.()
340
+ ?.pipe(takeUntilDestroyed(this.destroyRef))
341
+ .subscribe((classes) => {
342
+ this.cellableClasses = classes;
343
+ this.changed();
344
+ });
345
+ this.regionApi
346
+ .getIndividualClasses3d$?.()
347
+ ?.pipe(takeUntilDestroyed(this.destroyRef))
348
+ .subscribe((classes) => {
349
+ this.individualClasses = classes;
350
+ this.changed();
351
+ });
334
352
  // A surface clicked in the volume view (with the selection tool) picks its class.
335
353
  this.regionApi
336
354
  .getRegionPicked3d$?.()
@@ -520,7 +538,9 @@ export class RegionEditorComponent {
520
538
  this.show3d(this.groups3d());
521
539
  this.updateSelectionHighlight();
522
540
  }
523
- /** Hide (or show again) these classes' regions, wherever they are drawn. */
541
+ setClassesIndividual3d(classes, individual) {
542
+ this.regionApi.setClassesIndividual3d?.(classes, individual);
543
+ }
524
544
  setClassesHidden(classes, hidden) {
525
545
  this.regionApi.setClassesHidden?.(classes, hidden);
526
546
  }
@@ -1539,7 +1559,7 @@ export class RegionEditorComponent {
1539
1559
  this.messageService.add({ key: VIZ_TOAST_KEY, severity, summary, detail });
1540
1560
  }
1541
1561
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: RegionEditorComponent, deps: [{ token: REGION_EDITOR_API }, { token: i1.MessageService }, { token: i1.ConfirmationService }, { token: i2.RegionPersistenceService }, { token: i3.MaskExportService }], target: i0.ɵɵFactoryTarget.Component }); }
1542
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: RegionEditorComponent, isStandalone: true, selector: "region-editor", inputs: { active: "active" }, providers: [RegionPersistenceService], viewQueries: [{ propertyName: "overlayPanel", first: true, predicate: ["op"], descendants: true }], ngImport: i0, template: "<p-toolbar styleClass=\"region-toolbar\">\n <div class=\"p-toolbar-group-start align-items-center flex-wrap gap-1\">\n <p-button\n icon=\"pi pi-tag\"\n size=\"small\"\n [text]=\"!showShapeLabel\"\n pTooltip=\"Show region labels.\"\n tooltipPosition=\"bottom\"\n (onClick)=\"showShapeLabel = !showShapeLabel; changeShowShapeLabel(showShapeLabel)\"\n >\n </p-button>\n <p-button\n icon=\"pi pi-stop-circle\"\n size=\"small\"\n [text]=\"!regionsFilled\"\n pTooltip=\"Fill regions in their colour (an atlas's look); labels sit inside.\"\n tooltipPosition=\"bottom\"\n ariaLabel=\"Fill regions\"\n (onClick)=\"toggleFill()\"\n >\n </p-button>\n <p-button\n *ngIf=\"volumeView\"\n icon=\"pi pi-eye\"\n size=\"small\"\n [text]=\"!regionsThroughVolume\"\n [attr.aria-pressed]=\"regionsThroughVolume\"\n pTooltip=\"See the regions through the volume. Off, the volume hides the parts of them behind what it shows; on, none (layers traced inside bright structures, such as an OCT's).\"\n tooltipPosition=\"bottom\"\n ariaLabel=\"Regions through volume\"\n (onClick)=\"toggleThroughVolume()\"\n >\n </p-button>\n <span class=\"toolbar-separator\"></span>\n <!-- New regions are now created from the diagram toolbar\n (rectangle, polyline, freeform, wand). -->\n <p-button\n icon=\"pi pi-upload\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Import regions: a GeoJSON file, or a label volume (.nii, .nii.gz, .nrrd) chosen with its ontology JSON for the class tree.\"\n tooltipPosition=\"bottom\"\n (click)=\"roiFileInput.click()\"\n >\n </p-button>\n <input\n #roiFileInput\n type=\"file\"\n accept=\".geojson,.json,.nii,.gz,.nrrd\"\n multiple\n hidden\n (change)=\"importRois($event); roiFileInput.value = ''\"\n />\n <p-button\n icon=\"pi pi-folder-open\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Import a folder of per-slice GeoJSON files (one per slice, in name order, with its regionset.json class tree).\"\n tooltipPosition=\"bottom\"\n ariaLabel=\"Import a folder of regions\"\n (click)=\"roiFolderInput.click()\"\n >\n </p-button>\n <input\n #roiFolderInput\n type=\"file\"\n webkitdirectory\n multiple\n hidden\n (change)=\"importRois($event); roiFolderInput.value = ''\"\n />\n <p-button\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Download regions as geojson file.\"\n tooltipPosition=\"bottom\"\n icon=\"pi pi-download\"\n (click)=\"exportRois()\"\n >\n </p-button>\n <p-button\n icon=\"pi pi-save\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Save regions to server.\"\n tooltipPosition=\"bottom\"\n (click)=\"persistRegions()\"\n [disabled]=\"(!regions || !regions.length) && !hasRegionSource\"\n >\n </p-button>\n <p-button\n *ngIf=\"canImportFromServer\"\n icon=\"pi pi-cloud-download\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Import regions from server: a GeoJSON file, a folder of per-slice GeoJSON files or a label volume (.nii, .nii.gz, .nrrd).\"\n tooltipPosition=\"bottom\"\n ariaLabel=\"Import regions from server\"\n [loading]=\"importing\"\n (click)=\"importFromServer()\"\n >\n </p-button>\n <p-button\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Download mask of the regions as PNG\"\n tooltipPosition=\"bottom\"\n (click)=\"openSaveMaskDialog()\"\n [disabled]=\"!regions || !regions.length\"\n >\n <!-- References the file so Inkscape edits to mask.svg show up directly\n (the lib's assets/** are served at assets/plotting/). The\n toolbar-icon-dark filter recolours the black SVG to the theme blue,\n same as region-editor.svg and the other SVG toolbar icons. -->\n <img\n src=\"assets/plotting/mask.svg\"\n class=\"toolbar-icon-dark\"\n style=\"width: 1rem; height: 1rem; vertical-align: middle\"\n alt=\"Download mask\"\n />\n </p-button>\n <p-button\n label=\"x512\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Round all rectangle regions\n to width and height that are multiple of 512\"\n tooltipPosition=\"bottom\"\n (click)=\"roundRectangleLengths()\"\n >\n </p-button>\n <p-button\n icon=\"pi pi-check-square\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Select all regions\"\n tooltipPosition=\"bottom\"\n (click)=\"selectAllRegions()\"\n [disabled]=\"!regions || !regions.length\"\n >\n </p-button>\n <p-button\n icon=\"pi pi-tags\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Edit class on selected rows\"\n tooltipPosition=\"bottom\"\n (click)=\"!selectedRegions || !selectedRegions.length ? op.hide() : op.toggle($event)\"\n [disabled]=\"!selectedRegions || !selectedRegions.length\"\n >\n </p-button>\n <p-button\n icon=\"pi pi-palette\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Edit colour of selected regions\"\n tooltipPosition=\"bottom\"\n (click)=\"openColorDialog()\"\n [disabled]=\"!selectedRegions || !selectedRegions.length\"\n >\n </p-button>\n <p-overlayPanel #op (onHide)=\"bulkClass = ''; newBulkClass = ''\">\n <div class=\"flex flex-column gap-2\" style=\"width: 18rem\">\n <span class=\"font-medium text-900\"\n >Set class on {{ selectedRegions?.length || 0 }} selected region(s)</span\n >\n <!-- Selecting a class applies it immediately (choosing an option closes the\n overlay, so there's no separate Apply button). -->\n <p-dropdown\n styleClass=\"w-full\"\n appendTo=\"body\"\n [options]=\"presetSet.classes\"\n optionLabel=\"name\"\n optionValue=\"name\"\n [(ngModel)]=\"bulkClass\"\n placeholder=\"Choose a class\u2026\"\n [filter]=\"presetSet.classes.length > 8\"\n filterBy=\"name\"\n (onChange)=\"applyBulkClass()\"\n >\n <ng-template let-c pTemplate=\"item\">\n <span class=\"dd-value\"\n ><span class=\"chip-swatch\" [style.background]=\"c.color\"></span>{{ c.name }}</span\n >\n </ng-template>\n </p-dropdown>\n <div class=\"p-inputgroup\">\n <input\n type=\"text\"\n pInputText\n placeholder=\"\u2026or a new class\"\n [(ngModel)]=\"newBulkClass\"\n (keydown.enter)=\"addAndApplyBulkClass()\"\n />\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-plus\"\n pTooltip=\"Add class &amp; set it\"\n tooltipPosition=\"bottom\"\n [disabled]=\"!newBulkClass.trim()\"\n (click)=\"addAndApplyBulkClass()\"\n ></button>\n </div>\n </div>\n </p-overlayPanel>\n <p-button\n icon=\"pi pi-trash\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n (click)=\"deleteSelectedRegions()\"\n pTooltip=\"Delete selected regions\"\n tooltipPosition=\"bottom\"\n [disabled]=\"!selectedRegions || !selectedRegions.length\"\n ></p-button>\n <p-button\n icon=\"pi pi-times-circle\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n (click)=\"clearAllRegions()\"\n pTooltip=\"Delete all regions\"\n tooltipPosition=\"bottom\"\n [disabled]=\"(!regions || !regions.length) && !hasRegionSource\"\n ></p-button>\n <p-button\n icon=\"pi pi-question\"\n size=\"small\"\n [text]=\"true\"\n (click)=\"showHelp()\"\n pTooltip=\"Help\"\n tooltipPosition=\"bottom\"\n ></p-button>\n </div>\n</p-toolbar>\n\n<region-classes-panel\n [classes]=\"displayClasses\"\n [counts]=\"classCounts\"\n [matchMode]=\"presetSet.matchMode\"\n [activeClass]=\"activeClass\"\n [picked]=\"pickedClass\"\n [marked]=\"markedClasses\"\n [selectedCount]=\"selectedRegions?.length || 0\"\n [defaultClassName]=\"defaultClassName\"\n (pick)=\"selectActiveClass($event)\"\n (recolor)=\"setClassColor($event.name, $event.color)\"\n (remove)=\"deleteClass($event)\"\n (manage)=\"openManageDialog()\"\n [volume]=\"volumeView\"\n [shown3d]=\"shown3dNames\"\n (toggle3d)=\"toggleClass3d($event)\"\n [hidden]=\"hiddenClasses\"\n (toggleHidden)=\"setClassesHidden([$event], !hiddenClasses.has($event))\"\n [treeView]=\"classHierarchy ? classTreeView : null\"\n (treeViewChange)=\"classTreeView = $event\"\n>\n <!-- A region set with a class hierarchy (an atlas ontology) can show its classes as a tree. -->\n <region-class-tree\n *ngIf=\"classHierarchy as hierarchy\"\n [nodes]=\"hierarchy\"\n [counts]=\"treeCounts\"\n [colorOf]=\"treeColor\"\n [picked]=\"pickedClass\"\n [marked]=\"markedClasses\"\n [volume]=\"volumeView\"\n [shown3d]=\"shown3dNames\"\n (pick)=\"pickClasses($event)\"\n (recolor)=\"setClassColor($event.name, $event.color)\"\n (toggle3d)=\"toggleClass3d($event.name, $event.classes)\"\n [hidden]=\"hiddenClasses\"\n (toggleHidden)=\"setClassesHidden($event.classes, $event.hidden)\"\n >\n </region-class-tree>\n</region-classes-panel>\n\n<region-table\n [page]=\"pagedRegions\"\n [total]=\"tableTotal\"\n [first]=\"paginatorFirst\"\n [rows]=\"paginatorRows\"\n [rowsPerPageOptions]=\"rowsPerPageOptions\"\n [metaKey]=\"metaKey\"\n [selection]=\"selectedRegions\"\n (selectionChange)=\"selectedRegions = $event\"\n (rowSelect)=\"onSelectionChanged()\"\n [presetSet]=\"tablePresetSet\"\n [defaultColor]=\"shapeColor\"\n [mpp]=\"mpp\"\n [volumes]=\"tableVolumes\"\n [labelDrafts]=\"editingLabelRegions\"\n (labelEditStart)=\"startEditLabel($event)\"\n (labelDraftChange)=\"setLabelDraft($event.region, $event.value)\"\n (labelEditStop)=\"stopEditLabel($event.region, $event.commit)\"\n (classPick)=\"applyPresetToRegion($event.region, $event.name)\"\n (deleteRow)=\"deleteRegion($event)\"\n (pageChange)=\"onPageChange($event)\"\n>\n</region-table>\n\n<!-- Live-edit mode: no Save/Cancel \u2014 every edit commits immediately to the\n active image's region cache. -->\n\n<p-confirmDialog\n #cd\n [style]=\"{ width: '24rem', height: '14rem' }\"\n key=\"positionDialog\"\n [baseZIndex]=\"10000\"\n rejectButtonStyleClass=\"p-button-outlined\"\n>\n <ng-template pTemplate=\"footer\">\n <button type=\"button\" pButton icon=\"pi pi-check\" label=\"Yes\" (click)=\"cd.accept()\"></button>\n <button\n type=\"button\"\n class=\"p-button-outlined\"\n pButton\n icon=\"pi pi-times\"\n label=\"No\"\n (click)=\"cd.reject()\"\n ></button>\n </ng-template>\n</p-confirmDialog>\n\n<region-save-regions-dialog\n [(visible)]=\"showSaveAsDialog\"\n [filename]=\"saveAsFilename\"\n (filenameChange)=\"saveAsFilename = $event; checkSaveAsFileExists()\"\n [fileExists]=\"saveAsFileExists\"\n [busy]=\"saveAsBusy\"\n (confirm)=\"confirmSaveAs()\"\n (cancelSave)=\"cancelSaveAs()\"\n>\n</region-save-regions-dialog>\n\n<region-save-regions-dialog\n header=\"Export Regions\"\n confirmLabel=\"Export\"\n confirmIcon=\"pi pi-download\"\n inputId=\"export-filename\"\n [(visible)]=\"showExportDialog\"\n [(filename)]=\"exportFilename\"\n (confirm)=\"confirmExport()\"\n>\n</region-save-regions-dialog>\n\n<region-save-mask-dialog\n [(visible)]=\"showSaveMaskDialog\"\n [(filename)]=\"saveMaskFilename\"\n [(mode)]=\"maskMode\"\n [busy]=\"maskBusy\"\n [progress]=\"maskProgress\"\n [encoding]=\"maskEncoding\"\n (confirm)=\"confirmSaveMask()\"\n (cancelExport)=\"cancelSaveMask()\"\n>\n</region-save-mask-dialog>\n\n<region-color-dialog\n [(visible)]=\"showColorDialog\"\n [edits]=\"classColorEdits\"\n [selectedCount]=\"selectedRegions?.length || 0\"\n (apply)=\"applyColorToSelected($event)\"\n>\n</region-color-dialog>\n\n<!-- Manage annotation classes (jit-ui#70): edits a working copy, committed on Apply. -->\n<region-manage-classes-dialog\n [(visible)]=\"showManageDialog\"\n [(draft)]=\"presetDraft\"\n (apply)=\"applyManageDialog(true)\"\n (resetDefaults)=\"resetPresetsToDefaults()\"\n (importFile)=\"importPresets($event)\"\n (export)=\"exportPresets()\"\n>\n</region-manage-classes-dialog>\n\n<region-editor-help [(visible)]=\"displayHelpDialog\"></region-editor-help>\n", styles: ["@charset \"UTF-8\";.chip-swatch{display:inline-block;width:.75rem;height:.75rem;border-radius:50%;border:1px solid rgba(0,0,0,.2);flex:0 0 auto}.dd-value{display:inline-flex;align-items:center;gap:.4rem;min-width:0}.dd-value .class-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host{display:flex;flex-direction:column;height:100%;min-height:0;overflow:hidden}::ng-deep region-editor .p-toolbar.region-toolbar{padding:.25rem .5rem;border-radius:0;border-left:none;border-right:none;border-top:none}::ng-deep region-editor .p-toolbar.region-toolbar .p-button.p-button-icon-only{width:auto;padding:.25rem .5rem}::ng-deep region-editor .p-toolbar.region-toolbar .p-button{padding:.25rem .5rem}.toolbar-icon-dark{filter:brightness(0) invert(47%) sepia(98%) saturate(567%) hue-rotate(181deg) brightness(103%) contrast(98%)}.toolbar-separator{border-left:1px solid var(--surface-border);height:1.5rem;margin:0 .25rem;align-self:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SharedModule }, { kind: "directive", type: i1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i6.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: i6.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: ConfirmDialogModule }, { kind: "component", type: i7.ConfirmDialog, selector: "p-confirmDialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "visible", "position"], outputs: ["onHide"] }, { kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i8.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "autoShowPanelOnPrintableCharacterKeyDown", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i9.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "ngmodule", type: OverlayPanelModule }, { kind: "component", type: i10.OverlayPanel, selector: "p-overlayPanel", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "ngmodule", type: ToolbarModule }, { kind: "component", type: i11.Toolbar, selector: "p-toolbar", inputs: ["style", "styleClass", "ariaLabelledBy"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i12.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: ClassesPanelComponent, selector: "region-classes-panel", inputs: ["classes", "counts", "matchMode", "activeClass", "picked", "marked", "selectedCount", "defaultClassName", "volume", "shown3d", "hidden", "treeView"], outputs: ["toggleHidden", "toggle3d", "treeViewChange", "pick", "recolor", "remove", "manage"] }, { kind: "component", type: RegionTableComponent, selector: "region-table", inputs: ["page", "total", "first", "rows", "rowsPerPageOptions", "metaKey", "selection", "presetSet", "defaultColor", "mpp", "volumes", "labelDrafts"], outputs: ["selectionChange", "rowSelect", "labelEditStart", "labelDraftChange", "labelEditStop", "classPick", "deleteRow", "pageChange"] }, { kind: "component", type: ClassTreeComponent, selector: "region-class-tree", inputs: ["nodes", "counts", "colorOf", "picked", "marked", "volume", "shown3d", "hidden"], outputs: ["pick", "recolor", "toggle3d", "toggleHidden"] }, { kind: "component", type: SaveRegionsDialogComponent, selector: "region-save-regions-dialog", inputs: ["header", "confirmLabel", "confirmIcon", "inputId", "visible", "filename", "fileExists", "busy"], outputs: ["visibleChange", "filenameChange", "confirm", "cancelSave"] }, { kind: "component", type: SaveMaskDialogComponent, selector: "region-save-mask-dialog", inputs: ["visible", "filename", "mode", "busy", "progress", "encoding"], outputs: ["visibleChange", "filenameChange", "modeChange", "confirm", "cancelExport"] }, { kind: "component", type: RegionColorDialogComponent, selector: "region-color-dialog", inputs: ["visible", "selectedCount", "edits"], outputs: ["visibleChange", "apply"] }, { kind: "component", type: ManageClassesDialogComponent, selector: "region-manage-classes-dialog", inputs: ["visible", "draft"], outputs: ["visibleChange", "draftChange", "apply", "resetDefaults", "importFile", "export"] }, { kind: "component", type: RegionEditorHelpComponent, selector: "region-editor-help", inputs: ["visible"], outputs: ["visibleChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1562
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: RegionEditorComponent, isStandalone: true, selector: "region-editor", inputs: { active: "active" }, providers: [RegionPersistenceService], viewQueries: [{ propertyName: "overlayPanel", first: true, predicate: ["op"], descendants: true }], ngImport: i0, template: "<p-toolbar styleClass=\"region-toolbar\">\n <div class=\"p-toolbar-group-start align-items-center flex-wrap gap-1\">\n <p-button\n icon=\"pi pi-tag\"\n size=\"small\"\n [text]=\"!showShapeLabel\"\n pTooltip=\"Show region labels.\"\n tooltipPosition=\"bottom\"\n (onClick)=\"showShapeLabel = !showShapeLabel; changeShowShapeLabel(showShapeLabel)\"\n >\n </p-button>\n <p-button\n icon=\"pi pi-stop-circle\"\n size=\"small\"\n [text]=\"!regionsFilled\"\n pTooltip=\"Fill regions in their colour (an atlas's look); labels sit inside.\"\n tooltipPosition=\"bottom\"\n ariaLabel=\"Fill regions\"\n (onClick)=\"toggleFill()\"\n >\n </p-button>\n <p-button\n *ngIf=\"volumeView\"\n icon=\"pi pi-eye\"\n size=\"small\"\n [text]=\"!regionsThroughVolume\"\n [attr.aria-pressed]=\"regionsThroughVolume\"\n pTooltip=\"See the regions through the volume. Off, the volume hides the parts of them behind what it shows; on, none (layers traced inside bright structures, such as an OCT's).\"\n tooltipPosition=\"bottom\"\n ariaLabel=\"Regions through volume\"\n (onClick)=\"toggleThroughVolume()\"\n >\n </p-button>\n <span class=\"toolbar-separator\"></span>\n <!-- New regions are now created from the diagram toolbar\n (rectangle, polyline, freeform, wand). -->\n <p-button\n icon=\"pi pi-upload\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Import regions: a GeoJSON file, or a label volume (.nii, .nii.gz, .nrrd) chosen with its ontology JSON for the class tree.\"\n tooltipPosition=\"bottom\"\n (click)=\"roiFileInput.click()\"\n >\n </p-button>\n <input\n #roiFileInput\n type=\"file\"\n accept=\".geojson,.json,.nii,.gz,.nrrd\"\n multiple\n hidden\n (change)=\"importRois($event); roiFileInput.value = ''\"\n />\n <p-button\n icon=\"pi pi-folder-open\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Import a folder of per-slice GeoJSON files (one per slice, in name order, with its regionset.json class tree).\"\n tooltipPosition=\"bottom\"\n ariaLabel=\"Import a folder of regions\"\n (click)=\"roiFolderInput.click()\"\n >\n </p-button>\n <input\n #roiFolderInput\n type=\"file\"\n webkitdirectory\n multiple\n hidden\n (change)=\"importRois($event); roiFolderInput.value = ''\"\n />\n <p-button\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Download regions as geojson file.\"\n tooltipPosition=\"bottom\"\n icon=\"pi pi-download\"\n (click)=\"exportRois()\"\n >\n </p-button>\n <p-button\n icon=\"pi pi-save\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Save regions to server.\"\n tooltipPosition=\"bottom\"\n (click)=\"persistRegions()\"\n [disabled]=\"(!regions || !regions.length) && !hasRegionSource\"\n >\n </p-button>\n <p-button\n *ngIf=\"canImportFromServer\"\n icon=\"pi pi-cloud-download\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Import regions from server: a GeoJSON file, a folder of per-slice GeoJSON files or a label volume (.nii, .nii.gz, .nrrd).\"\n tooltipPosition=\"bottom\"\n ariaLabel=\"Import regions from server\"\n [loading]=\"importing\"\n (click)=\"importFromServer()\"\n >\n </p-button>\n <p-button\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Download mask of the regions as PNG\"\n tooltipPosition=\"bottom\"\n (click)=\"openSaveMaskDialog()\"\n [disabled]=\"!regions || !regions.length\"\n >\n <!-- References the file so Inkscape edits to mask.svg show up directly\n (the lib's assets/** are served at assets/plotting/). The\n toolbar-icon-dark filter recolours the black SVG to the theme blue,\n same as region-editor.svg and the other SVG toolbar icons. -->\n <img\n src=\"assets/plotting/mask.svg\"\n class=\"toolbar-icon-dark\"\n style=\"width: 1rem; height: 1rem; vertical-align: middle\"\n alt=\"Download mask\"\n />\n </p-button>\n <p-button\n label=\"x512\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Round all rectangle regions\n to width and height that are multiple of 512\"\n tooltipPosition=\"bottom\"\n (click)=\"roundRectangleLengths()\"\n >\n </p-button>\n <p-button\n icon=\"pi pi-check-square\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Select all regions\"\n tooltipPosition=\"bottom\"\n (click)=\"selectAllRegions()\"\n [disabled]=\"!regions || !regions.length\"\n >\n </p-button>\n <p-button\n icon=\"pi pi-tags\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Edit class on selected rows\"\n tooltipPosition=\"bottom\"\n (click)=\"!selectedRegions || !selectedRegions.length ? op.hide() : op.toggle($event)\"\n [disabled]=\"!selectedRegions || !selectedRegions.length\"\n >\n </p-button>\n <p-button\n icon=\"pi pi-palette\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Edit colour of selected regions\"\n tooltipPosition=\"bottom\"\n (click)=\"openColorDialog()\"\n [disabled]=\"!selectedRegions || !selectedRegions.length\"\n >\n </p-button>\n <p-overlayPanel #op (onHide)=\"bulkClass = ''; newBulkClass = ''\">\n <div class=\"flex flex-column gap-2\" style=\"width: 18rem\">\n <span class=\"font-medium text-900\"\n >Set class on {{ selectedRegions?.length || 0 }} selected region(s)</span\n >\n <!-- Selecting a class applies it immediately (choosing an option closes the\n overlay, so there's no separate Apply button). -->\n <p-dropdown\n styleClass=\"w-full\"\n appendTo=\"body\"\n [options]=\"presetSet.classes\"\n optionLabel=\"name\"\n optionValue=\"name\"\n [(ngModel)]=\"bulkClass\"\n placeholder=\"Choose a class\u2026\"\n [filter]=\"presetSet.classes.length > 8\"\n filterBy=\"name\"\n (onChange)=\"applyBulkClass()\"\n >\n <ng-template let-c pTemplate=\"item\">\n <span class=\"dd-value\"\n ><span class=\"chip-swatch\" [style.background]=\"c.color\"></span>{{ c.name }}</span\n >\n </ng-template>\n </p-dropdown>\n <div class=\"p-inputgroup\">\n <input\n type=\"text\"\n pInputText\n placeholder=\"\u2026or a new class\"\n [(ngModel)]=\"newBulkClass\"\n (keydown.enter)=\"addAndApplyBulkClass()\"\n />\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-plus\"\n pTooltip=\"Add class &amp; set it\"\n tooltipPosition=\"bottom\"\n [disabled]=\"!newBulkClass.trim()\"\n (click)=\"addAndApplyBulkClass()\"\n ></button>\n </div>\n </div>\n </p-overlayPanel>\n <p-button\n icon=\"pi pi-trash\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n (click)=\"deleteSelectedRegions()\"\n pTooltip=\"Delete selected regions\"\n tooltipPosition=\"bottom\"\n [disabled]=\"!selectedRegions || !selectedRegions.length\"\n ></p-button>\n <p-button\n icon=\"pi pi-times-circle\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n (click)=\"clearAllRegions()\"\n pTooltip=\"Delete all regions\"\n tooltipPosition=\"bottom\"\n [disabled]=\"(!regions || !regions.length) && !hasRegionSource\"\n ></p-button>\n <p-button\n icon=\"pi pi-question\"\n size=\"small\"\n [text]=\"true\"\n (click)=\"showHelp()\"\n pTooltip=\"Help\"\n tooltipPosition=\"bottom\"\n ></p-button>\n </div>\n</p-toolbar>\n\n<region-classes-panel\n [classes]=\"displayClasses\"\n [counts]=\"classCounts\"\n [matchMode]=\"presetSet.matchMode\"\n [activeClass]=\"activeClass\"\n [picked]=\"pickedClass\"\n [marked]=\"markedClasses\"\n [selectedCount]=\"selectedRegions?.length || 0\"\n [defaultClassName]=\"defaultClassName\"\n (pick)=\"selectActiveClass($event)\"\n (recolor)=\"setClassColor($event.name, $event.color)\"\n (remove)=\"deleteClass($event)\"\n (manage)=\"openManageDialog()\"\n [volume]=\"volumeView\"\n [shown3d]=\"shown3dNames\"\n (toggle3d)=\"toggleClass3d($event)\"\n [cellable]=\"cellableClasses\"\n [individual]=\"individualClasses\"\n (toggleCells)=\"setClassesIndividual3d($event.classes, $event.individual)\"\n [hidden]=\"hiddenClasses\"\n (toggleHidden)=\"setClassesHidden([$event], !hiddenClasses.has($event))\"\n [treeView]=\"classHierarchy ? classTreeView : null\"\n (treeViewChange)=\"classTreeView = $event\"\n>\n <!-- A region set with a class hierarchy (an atlas ontology) can show its classes as a tree. -->\n <region-class-tree\n *ngIf=\"classHierarchy as hierarchy\"\n [nodes]=\"hierarchy\"\n [counts]=\"treeCounts\"\n [colorOf]=\"treeColor\"\n [picked]=\"pickedClass\"\n [marked]=\"markedClasses\"\n [volume]=\"volumeView\"\n [shown3d]=\"shown3dNames\"\n [cellable]=\"cellableClasses\"\n [individual]=\"individualClasses\"\n (toggleCells)=\"setClassesIndividual3d($event.classes, $event.individual)\"\n (pick)=\"pickClasses($event)\"\n (recolor)=\"setClassColor($event.name, $event.color)\"\n (toggle3d)=\"toggleClass3d($event.name, $event.classes)\"\n [hidden]=\"hiddenClasses\"\n (toggleHidden)=\"setClassesHidden($event.classes, $event.hidden)\"\n >\n </region-class-tree>\n</region-classes-panel>\n\n<region-table\n [page]=\"pagedRegions\"\n [total]=\"tableTotal\"\n [first]=\"paginatorFirst\"\n [rows]=\"paginatorRows\"\n [rowsPerPageOptions]=\"rowsPerPageOptions\"\n [metaKey]=\"metaKey\"\n [selection]=\"selectedRegions\"\n (selectionChange)=\"selectedRegions = $event\"\n (rowSelect)=\"onSelectionChanged()\"\n [presetSet]=\"tablePresetSet\"\n [defaultColor]=\"shapeColor\"\n [mpp]=\"mpp\"\n [volumes]=\"tableVolumes\"\n [labelDrafts]=\"editingLabelRegions\"\n (labelEditStart)=\"startEditLabel($event)\"\n (labelDraftChange)=\"setLabelDraft($event.region, $event.value)\"\n (labelEditStop)=\"stopEditLabel($event.region, $event.commit)\"\n (classPick)=\"applyPresetToRegion($event.region, $event.name)\"\n (deleteRow)=\"deleteRegion($event)\"\n (pageChange)=\"onPageChange($event)\"\n>\n</region-table>\n\n<!-- Live-edit mode: no Save/Cancel \u2014 every edit commits immediately to the\n active image's region cache. -->\n\n<p-confirmDialog\n #cd\n [style]=\"{ width: '24rem', height: '14rem' }\"\n key=\"positionDialog\"\n [baseZIndex]=\"10000\"\n rejectButtonStyleClass=\"p-button-outlined\"\n>\n <ng-template pTemplate=\"footer\">\n <button type=\"button\" pButton icon=\"pi pi-check\" label=\"Yes\" (click)=\"cd.accept()\"></button>\n <button\n type=\"button\"\n class=\"p-button-outlined\"\n pButton\n icon=\"pi pi-times\"\n label=\"No\"\n (click)=\"cd.reject()\"\n ></button>\n </ng-template>\n</p-confirmDialog>\n\n<region-save-regions-dialog\n [(visible)]=\"showSaveAsDialog\"\n [filename]=\"saveAsFilename\"\n (filenameChange)=\"saveAsFilename = $event; checkSaveAsFileExists()\"\n [fileExists]=\"saveAsFileExists\"\n [busy]=\"saveAsBusy\"\n (confirm)=\"confirmSaveAs()\"\n (cancelSave)=\"cancelSaveAs()\"\n>\n</region-save-regions-dialog>\n\n<region-save-regions-dialog\n header=\"Export Regions\"\n confirmLabel=\"Export\"\n confirmIcon=\"pi pi-download\"\n inputId=\"export-filename\"\n [(visible)]=\"showExportDialog\"\n [(filename)]=\"exportFilename\"\n (confirm)=\"confirmExport()\"\n>\n</region-save-regions-dialog>\n\n<region-save-mask-dialog\n [(visible)]=\"showSaveMaskDialog\"\n [(filename)]=\"saveMaskFilename\"\n [(mode)]=\"maskMode\"\n [busy]=\"maskBusy\"\n [progress]=\"maskProgress\"\n [encoding]=\"maskEncoding\"\n (confirm)=\"confirmSaveMask()\"\n (cancelExport)=\"cancelSaveMask()\"\n>\n</region-save-mask-dialog>\n\n<region-color-dialog\n [(visible)]=\"showColorDialog\"\n [edits]=\"classColorEdits\"\n [selectedCount]=\"selectedRegions?.length || 0\"\n (apply)=\"applyColorToSelected($event)\"\n>\n</region-color-dialog>\n\n<!-- Manage annotation classes (jit-ui#70): edits a working copy, committed on Apply. -->\n<region-manage-classes-dialog\n [(visible)]=\"showManageDialog\"\n [(draft)]=\"presetDraft\"\n (apply)=\"applyManageDialog(true)\"\n (resetDefaults)=\"resetPresetsToDefaults()\"\n (importFile)=\"importPresets($event)\"\n (export)=\"exportPresets()\"\n>\n</region-manage-classes-dialog>\n\n<region-editor-help [(visible)]=\"displayHelpDialog\"></region-editor-help>\n", styles: ["@charset \"UTF-8\";.chip-swatch{display:inline-block;width:.75rem;height:.75rem;border-radius:50%;border:1px solid rgba(0,0,0,.2);flex:0 0 auto}.dd-value{display:inline-flex;align-items:center;gap:.4rem;min-width:0}.dd-value .class-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host{display:flex;flex-direction:column;height:100%;min-height:0;overflow:hidden}::ng-deep region-editor .p-toolbar.region-toolbar{padding:.25rem .5rem;border-radius:0;border-left:none;border-right:none;border-top:none}::ng-deep region-editor .p-toolbar.region-toolbar .p-button.p-button-icon-only{width:auto;padding:.25rem .5rem}::ng-deep region-editor .p-toolbar.region-toolbar .p-button{padding:.25rem .5rem}.toolbar-icon-dark{filter:brightness(0) invert(47%) sepia(98%) saturate(567%) hue-rotate(181deg) brightness(103%) contrast(98%)}.toolbar-separator{border-left:1px solid var(--surface-border);height:1.5rem;margin:0 .25rem;align-self:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SharedModule }, { kind: "directive", type: i1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i6.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: i6.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: ConfirmDialogModule }, { kind: "component", type: i7.ConfirmDialog, selector: "p-confirmDialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "visible", "position"], outputs: ["onHide"] }, { kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i8.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "autoShowPanelOnPrintableCharacterKeyDown", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i9.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "ngmodule", type: OverlayPanelModule }, { kind: "component", type: i10.OverlayPanel, selector: "p-overlayPanel", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "ngmodule", type: ToolbarModule }, { kind: "component", type: i11.Toolbar, selector: "p-toolbar", inputs: ["style", "styleClass", "ariaLabelledBy"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i12.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: ClassesPanelComponent, selector: "region-classes-panel", inputs: ["classes", "counts", "matchMode", "activeClass", "picked", "marked", "selectedCount", "defaultClassName", "volume", "shown3d", "cellable", "individual", "hidden", "treeView"], outputs: ["toggleCells", "toggleHidden", "toggle3d", "treeViewChange", "pick", "recolor", "remove", "manage"] }, { kind: "component", type: RegionTableComponent, selector: "region-table", inputs: ["page", "total", "first", "rows", "rowsPerPageOptions", "metaKey", "selection", "presetSet", "defaultColor", "mpp", "volumes", "labelDrafts"], outputs: ["selectionChange", "rowSelect", "labelEditStart", "labelDraftChange", "labelEditStop", "classPick", "deleteRow", "pageChange"] }, { kind: "component", type: ClassTreeComponent, selector: "region-class-tree", inputs: ["nodes", "counts", "colorOf", "picked", "marked", "volume", "shown3d", "cellable", "individual", "hidden"], outputs: ["toggleCells", "pick", "recolor", "toggle3d", "toggleHidden"] }, { kind: "component", type: SaveRegionsDialogComponent, selector: "region-save-regions-dialog", inputs: ["header", "confirmLabel", "confirmIcon", "inputId", "visible", "filename", "fileExists", "busy"], outputs: ["visibleChange", "filenameChange", "confirm", "cancelSave"] }, { kind: "component", type: SaveMaskDialogComponent, selector: "region-save-mask-dialog", inputs: ["visible", "filename", "mode", "busy", "progress", "encoding"], outputs: ["visibleChange", "filenameChange", "modeChange", "confirm", "cancelExport"] }, { kind: "component", type: RegionColorDialogComponent, selector: "region-color-dialog", inputs: ["visible", "selectedCount", "edits"], outputs: ["visibleChange", "apply"] }, { kind: "component", type: ManageClassesDialogComponent, selector: "region-manage-classes-dialog", inputs: ["visible", "draft"], outputs: ["visibleChange", "draftChange", "apply", "resetDefaults", "importFile", "export"] }, { kind: "component", type: RegionEditorHelpComponent, selector: "region-editor-help", inputs: ["visible"], outputs: ["visibleChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1543
1563
  }
1544
1564
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: RegionEditorComponent, decorators: [{
1545
1565
  type: Component,
@@ -1562,7 +1582,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
1562
1582
  RegionColorDialogComponent,
1563
1583
  ManageClassesDialogComponent,
1564
1584
  RegionEditorHelpComponent,
1565
- ], changeDetection: ChangeDetectionStrategy.OnPush, providers: [RegionPersistenceService], template: "<p-toolbar styleClass=\"region-toolbar\">\n <div class=\"p-toolbar-group-start align-items-center flex-wrap gap-1\">\n <p-button\n icon=\"pi pi-tag\"\n size=\"small\"\n [text]=\"!showShapeLabel\"\n pTooltip=\"Show region labels.\"\n tooltipPosition=\"bottom\"\n (onClick)=\"showShapeLabel = !showShapeLabel; changeShowShapeLabel(showShapeLabel)\"\n >\n </p-button>\n <p-button\n icon=\"pi pi-stop-circle\"\n size=\"small\"\n [text]=\"!regionsFilled\"\n pTooltip=\"Fill regions in their colour (an atlas's look); labels sit inside.\"\n tooltipPosition=\"bottom\"\n ariaLabel=\"Fill regions\"\n (onClick)=\"toggleFill()\"\n >\n </p-button>\n <p-button\n *ngIf=\"volumeView\"\n icon=\"pi pi-eye\"\n size=\"small\"\n [text]=\"!regionsThroughVolume\"\n [attr.aria-pressed]=\"regionsThroughVolume\"\n pTooltip=\"See the regions through the volume. Off, the volume hides the parts of them behind what it shows; on, none (layers traced inside bright structures, such as an OCT's).\"\n tooltipPosition=\"bottom\"\n ariaLabel=\"Regions through volume\"\n (onClick)=\"toggleThroughVolume()\"\n >\n </p-button>\n <span class=\"toolbar-separator\"></span>\n <!-- New regions are now created from the diagram toolbar\n (rectangle, polyline, freeform, wand). -->\n <p-button\n icon=\"pi pi-upload\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Import regions: a GeoJSON file, or a label volume (.nii, .nii.gz, .nrrd) chosen with its ontology JSON for the class tree.\"\n tooltipPosition=\"bottom\"\n (click)=\"roiFileInput.click()\"\n >\n </p-button>\n <input\n #roiFileInput\n type=\"file\"\n accept=\".geojson,.json,.nii,.gz,.nrrd\"\n multiple\n hidden\n (change)=\"importRois($event); roiFileInput.value = ''\"\n />\n <p-button\n icon=\"pi pi-folder-open\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Import a folder of per-slice GeoJSON files (one per slice, in name order, with its regionset.json class tree).\"\n tooltipPosition=\"bottom\"\n ariaLabel=\"Import a folder of regions\"\n (click)=\"roiFolderInput.click()\"\n >\n </p-button>\n <input\n #roiFolderInput\n type=\"file\"\n webkitdirectory\n multiple\n hidden\n (change)=\"importRois($event); roiFolderInput.value = ''\"\n />\n <p-button\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Download regions as geojson file.\"\n tooltipPosition=\"bottom\"\n icon=\"pi pi-download\"\n (click)=\"exportRois()\"\n >\n </p-button>\n <p-button\n icon=\"pi pi-save\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Save regions to server.\"\n tooltipPosition=\"bottom\"\n (click)=\"persistRegions()\"\n [disabled]=\"(!regions || !regions.length) && !hasRegionSource\"\n >\n </p-button>\n <p-button\n *ngIf=\"canImportFromServer\"\n icon=\"pi pi-cloud-download\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Import regions from server: a GeoJSON file, a folder of per-slice GeoJSON files or a label volume (.nii, .nii.gz, .nrrd).\"\n tooltipPosition=\"bottom\"\n ariaLabel=\"Import regions from server\"\n [loading]=\"importing\"\n (click)=\"importFromServer()\"\n >\n </p-button>\n <p-button\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Download mask of the regions as PNG\"\n tooltipPosition=\"bottom\"\n (click)=\"openSaveMaskDialog()\"\n [disabled]=\"!regions || !regions.length\"\n >\n <!-- References the file so Inkscape edits to mask.svg show up directly\n (the lib's assets/** are served at assets/plotting/). The\n toolbar-icon-dark filter recolours the black SVG to the theme blue,\n same as region-editor.svg and the other SVG toolbar icons. -->\n <img\n src=\"assets/plotting/mask.svg\"\n class=\"toolbar-icon-dark\"\n style=\"width: 1rem; height: 1rem; vertical-align: middle\"\n alt=\"Download mask\"\n />\n </p-button>\n <p-button\n label=\"x512\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Round all rectangle regions\n to width and height that are multiple of 512\"\n tooltipPosition=\"bottom\"\n (click)=\"roundRectangleLengths()\"\n >\n </p-button>\n <p-button\n icon=\"pi pi-check-square\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Select all regions\"\n tooltipPosition=\"bottom\"\n (click)=\"selectAllRegions()\"\n [disabled]=\"!regions || !regions.length\"\n >\n </p-button>\n <p-button\n icon=\"pi pi-tags\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Edit class on selected rows\"\n tooltipPosition=\"bottom\"\n (click)=\"!selectedRegions || !selectedRegions.length ? op.hide() : op.toggle($event)\"\n [disabled]=\"!selectedRegions || !selectedRegions.length\"\n >\n </p-button>\n <p-button\n icon=\"pi pi-palette\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Edit colour of selected regions\"\n tooltipPosition=\"bottom\"\n (click)=\"openColorDialog()\"\n [disabled]=\"!selectedRegions || !selectedRegions.length\"\n >\n </p-button>\n <p-overlayPanel #op (onHide)=\"bulkClass = ''; newBulkClass = ''\">\n <div class=\"flex flex-column gap-2\" style=\"width: 18rem\">\n <span class=\"font-medium text-900\"\n >Set class on {{ selectedRegions?.length || 0 }} selected region(s)</span\n >\n <!-- Selecting a class applies it immediately (choosing an option closes the\n overlay, so there's no separate Apply button). -->\n <p-dropdown\n styleClass=\"w-full\"\n appendTo=\"body\"\n [options]=\"presetSet.classes\"\n optionLabel=\"name\"\n optionValue=\"name\"\n [(ngModel)]=\"bulkClass\"\n placeholder=\"Choose a class\u2026\"\n [filter]=\"presetSet.classes.length > 8\"\n filterBy=\"name\"\n (onChange)=\"applyBulkClass()\"\n >\n <ng-template let-c pTemplate=\"item\">\n <span class=\"dd-value\"\n ><span class=\"chip-swatch\" [style.background]=\"c.color\"></span>{{ c.name }}</span\n >\n </ng-template>\n </p-dropdown>\n <div class=\"p-inputgroup\">\n <input\n type=\"text\"\n pInputText\n placeholder=\"\u2026or a new class\"\n [(ngModel)]=\"newBulkClass\"\n (keydown.enter)=\"addAndApplyBulkClass()\"\n />\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-plus\"\n pTooltip=\"Add class &amp; set it\"\n tooltipPosition=\"bottom\"\n [disabled]=\"!newBulkClass.trim()\"\n (click)=\"addAndApplyBulkClass()\"\n ></button>\n </div>\n </div>\n </p-overlayPanel>\n <p-button\n icon=\"pi pi-trash\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n (click)=\"deleteSelectedRegions()\"\n pTooltip=\"Delete selected regions\"\n tooltipPosition=\"bottom\"\n [disabled]=\"!selectedRegions || !selectedRegions.length\"\n ></p-button>\n <p-button\n icon=\"pi pi-times-circle\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n (click)=\"clearAllRegions()\"\n pTooltip=\"Delete all regions\"\n tooltipPosition=\"bottom\"\n [disabled]=\"(!regions || !regions.length) && !hasRegionSource\"\n ></p-button>\n <p-button\n icon=\"pi pi-question\"\n size=\"small\"\n [text]=\"true\"\n (click)=\"showHelp()\"\n pTooltip=\"Help\"\n tooltipPosition=\"bottom\"\n ></p-button>\n </div>\n</p-toolbar>\n\n<region-classes-panel\n [classes]=\"displayClasses\"\n [counts]=\"classCounts\"\n [matchMode]=\"presetSet.matchMode\"\n [activeClass]=\"activeClass\"\n [picked]=\"pickedClass\"\n [marked]=\"markedClasses\"\n [selectedCount]=\"selectedRegions?.length || 0\"\n [defaultClassName]=\"defaultClassName\"\n (pick)=\"selectActiveClass($event)\"\n (recolor)=\"setClassColor($event.name, $event.color)\"\n (remove)=\"deleteClass($event)\"\n (manage)=\"openManageDialog()\"\n [volume]=\"volumeView\"\n [shown3d]=\"shown3dNames\"\n (toggle3d)=\"toggleClass3d($event)\"\n [hidden]=\"hiddenClasses\"\n (toggleHidden)=\"setClassesHidden([$event], !hiddenClasses.has($event))\"\n [treeView]=\"classHierarchy ? classTreeView : null\"\n (treeViewChange)=\"classTreeView = $event\"\n>\n <!-- A region set with a class hierarchy (an atlas ontology) can show its classes as a tree. -->\n <region-class-tree\n *ngIf=\"classHierarchy as hierarchy\"\n [nodes]=\"hierarchy\"\n [counts]=\"treeCounts\"\n [colorOf]=\"treeColor\"\n [picked]=\"pickedClass\"\n [marked]=\"markedClasses\"\n [volume]=\"volumeView\"\n [shown3d]=\"shown3dNames\"\n (pick)=\"pickClasses($event)\"\n (recolor)=\"setClassColor($event.name, $event.color)\"\n (toggle3d)=\"toggleClass3d($event.name, $event.classes)\"\n [hidden]=\"hiddenClasses\"\n (toggleHidden)=\"setClassesHidden($event.classes, $event.hidden)\"\n >\n </region-class-tree>\n</region-classes-panel>\n\n<region-table\n [page]=\"pagedRegions\"\n [total]=\"tableTotal\"\n [first]=\"paginatorFirst\"\n [rows]=\"paginatorRows\"\n [rowsPerPageOptions]=\"rowsPerPageOptions\"\n [metaKey]=\"metaKey\"\n [selection]=\"selectedRegions\"\n (selectionChange)=\"selectedRegions = $event\"\n (rowSelect)=\"onSelectionChanged()\"\n [presetSet]=\"tablePresetSet\"\n [defaultColor]=\"shapeColor\"\n [mpp]=\"mpp\"\n [volumes]=\"tableVolumes\"\n [labelDrafts]=\"editingLabelRegions\"\n (labelEditStart)=\"startEditLabel($event)\"\n (labelDraftChange)=\"setLabelDraft($event.region, $event.value)\"\n (labelEditStop)=\"stopEditLabel($event.region, $event.commit)\"\n (classPick)=\"applyPresetToRegion($event.region, $event.name)\"\n (deleteRow)=\"deleteRegion($event)\"\n (pageChange)=\"onPageChange($event)\"\n>\n</region-table>\n\n<!-- Live-edit mode: no Save/Cancel \u2014 every edit commits immediately to the\n active image's region cache. -->\n\n<p-confirmDialog\n #cd\n [style]=\"{ width: '24rem', height: '14rem' }\"\n key=\"positionDialog\"\n [baseZIndex]=\"10000\"\n rejectButtonStyleClass=\"p-button-outlined\"\n>\n <ng-template pTemplate=\"footer\">\n <button type=\"button\" pButton icon=\"pi pi-check\" label=\"Yes\" (click)=\"cd.accept()\"></button>\n <button\n type=\"button\"\n class=\"p-button-outlined\"\n pButton\n icon=\"pi pi-times\"\n label=\"No\"\n (click)=\"cd.reject()\"\n ></button>\n </ng-template>\n</p-confirmDialog>\n\n<region-save-regions-dialog\n [(visible)]=\"showSaveAsDialog\"\n [filename]=\"saveAsFilename\"\n (filenameChange)=\"saveAsFilename = $event; checkSaveAsFileExists()\"\n [fileExists]=\"saveAsFileExists\"\n [busy]=\"saveAsBusy\"\n (confirm)=\"confirmSaveAs()\"\n (cancelSave)=\"cancelSaveAs()\"\n>\n</region-save-regions-dialog>\n\n<region-save-regions-dialog\n header=\"Export Regions\"\n confirmLabel=\"Export\"\n confirmIcon=\"pi pi-download\"\n inputId=\"export-filename\"\n [(visible)]=\"showExportDialog\"\n [(filename)]=\"exportFilename\"\n (confirm)=\"confirmExport()\"\n>\n</region-save-regions-dialog>\n\n<region-save-mask-dialog\n [(visible)]=\"showSaveMaskDialog\"\n [(filename)]=\"saveMaskFilename\"\n [(mode)]=\"maskMode\"\n [busy]=\"maskBusy\"\n [progress]=\"maskProgress\"\n [encoding]=\"maskEncoding\"\n (confirm)=\"confirmSaveMask()\"\n (cancelExport)=\"cancelSaveMask()\"\n>\n</region-save-mask-dialog>\n\n<region-color-dialog\n [(visible)]=\"showColorDialog\"\n [edits]=\"classColorEdits\"\n [selectedCount]=\"selectedRegions?.length || 0\"\n (apply)=\"applyColorToSelected($event)\"\n>\n</region-color-dialog>\n\n<!-- Manage annotation classes (jit-ui#70): edits a working copy, committed on Apply. -->\n<region-manage-classes-dialog\n [(visible)]=\"showManageDialog\"\n [(draft)]=\"presetDraft\"\n (apply)=\"applyManageDialog(true)\"\n (resetDefaults)=\"resetPresetsToDefaults()\"\n (importFile)=\"importPresets($event)\"\n (export)=\"exportPresets()\"\n>\n</region-manage-classes-dialog>\n\n<region-editor-help [(visible)]=\"displayHelpDialog\"></region-editor-help>\n", styles: ["@charset \"UTF-8\";.chip-swatch{display:inline-block;width:.75rem;height:.75rem;border-radius:50%;border:1px solid rgba(0,0,0,.2);flex:0 0 auto}.dd-value{display:inline-flex;align-items:center;gap:.4rem;min-width:0}.dd-value .class-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host{display:flex;flex-direction:column;height:100%;min-height:0;overflow:hidden}::ng-deep region-editor .p-toolbar.region-toolbar{padding:.25rem .5rem;border-radius:0;border-left:none;border-right:none;border-top:none}::ng-deep region-editor .p-toolbar.region-toolbar .p-button.p-button-icon-only{width:auto;padding:.25rem .5rem}::ng-deep region-editor .p-toolbar.region-toolbar .p-button{padding:.25rem .5rem}.toolbar-icon-dark{filter:brightness(0) invert(47%) sepia(98%) saturate(567%) hue-rotate(181deg) brightness(103%) contrast(98%)}.toolbar-separator{border-left:1px solid var(--surface-border);height:1.5rem;margin:0 .25rem;align-self:center}\n"] }]
1585
+ ], changeDetection: ChangeDetectionStrategy.OnPush, providers: [RegionPersistenceService], template: "<p-toolbar styleClass=\"region-toolbar\">\n <div class=\"p-toolbar-group-start align-items-center flex-wrap gap-1\">\n <p-button\n icon=\"pi pi-tag\"\n size=\"small\"\n [text]=\"!showShapeLabel\"\n pTooltip=\"Show region labels.\"\n tooltipPosition=\"bottom\"\n (onClick)=\"showShapeLabel = !showShapeLabel; changeShowShapeLabel(showShapeLabel)\"\n >\n </p-button>\n <p-button\n icon=\"pi pi-stop-circle\"\n size=\"small\"\n [text]=\"!regionsFilled\"\n pTooltip=\"Fill regions in their colour (an atlas's look); labels sit inside.\"\n tooltipPosition=\"bottom\"\n ariaLabel=\"Fill regions\"\n (onClick)=\"toggleFill()\"\n >\n </p-button>\n <p-button\n *ngIf=\"volumeView\"\n icon=\"pi pi-eye\"\n size=\"small\"\n [text]=\"!regionsThroughVolume\"\n [attr.aria-pressed]=\"regionsThroughVolume\"\n pTooltip=\"See the regions through the volume. Off, the volume hides the parts of them behind what it shows; on, none (layers traced inside bright structures, such as an OCT's).\"\n tooltipPosition=\"bottom\"\n ariaLabel=\"Regions through volume\"\n (onClick)=\"toggleThroughVolume()\"\n >\n </p-button>\n <span class=\"toolbar-separator\"></span>\n <!-- New regions are now created from the diagram toolbar\n (rectangle, polyline, freeform, wand). -->\n <p-button\n icon=\"pi pi-upload\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Import regions: a GeoJSON file, or a label volume (.nii, .nii.gz, .nrrd) chosen with its ontology JSON for the class tree.\"\n tooltipPosition=\"bottom\"\n (click)=\"roiFileInput.click()\"\n >\n </p-button>\n <input\n #roiFileInput\n type=\"file\"\n accept=\".geojson,.json,.nii,.gz,.nrrd\"\n multiple\n hidden\n (change)=\"importRois($event); roiFileInput.value = ''\"\n />\n <p-button\n icon=\"pi pi-folder-open\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Import a folder of per-slice GeoJSON files (one per slice, in name order, with its regionset.json class tree).\"\n tooltipPosition=\"bottom\"\n ariaLabel=\"Import a folder of regions\"\n (click)=\"roiFolderInput.click()\"\n >\n </p-button>\n <input\n #roiFolderInput\n type=\"file\"\n webkitdirectory\n multiple\n hidden\n (change)=\"importRois($event); roiFolderInput.value = ''\"\n />\n <p-button\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Download regions as geojson file.\"\n tooltipPosition=\"bottom\"\n icon=\"pi pi-download\"\n (click)=\"exportRois()\"\n >\n </p-button>\n <p-button\n icon=\"pi pi-save\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Save regions to server.\"\n tooltipPosition=\"bottom\"\n (click)=\"persistRegions()\"\n [disabled]=\"(!regions || !regions.length) && !hasRegionSource\"\n >\n </p-button>\n <p-button\n *ngIf=\"canImportFromServer\"\n icon=\"pi pi-cloud-download\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Import regions from server: a GeoJSON file, a folder of per-slice GeoJSON files or a label volume (.nii, .nii.gz, .nrrd).\"\n tooltipPosition=\"bottom\"\n ariaLabel=\"Import regions from server\"\n [loading]=\"importing\"\n (click)=\"importFromServer()\"\n >\n </p-button>\n <p-button\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Download mask of the regions as PNG\"\n tooltipPosition=\"bottom\"\n (click)=\"openSaveMaskDialog()\"\n [disabled]=\"!regions || !regions.length\"\n >\n <!-- References the file so Inkscape edits to mask.svg show up directly\n (the lib's assets/** are served at assets/plotting/). The\n toolbar-icon-dark filter recolours the black SVG to the theme blue,\n same as region-editor.svg and the other SVG toolbar icons. -->\n <img\n src=\"assets/plotting/mask.svg\"\n class=\"toolbar-icon-dark\"\n style=\"width: 1rem; height: 1rem; vertical-align: middle\"\n alt=\"Download mask\"\n />\n </p-button>\n <p-button\n label=\"x512\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Round all rectangle regions\n to width and height that are multiple of 512\"\n tooltipPosition=\"bottom\"\n (click)=\"roundRectangleLengths()\"\n >\n </p-button>\n <p-button\n icon=\"pi pi-check-square\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Select all regions\"\n tooltipPosition=\"bottom\"\n (click)=\"selectAllRegions()\"\n [disabled]=\"!regions || !regions.length\"\n >\n </p-button>\n <p-button\n icon=\"pi pi-tags\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Edit class on selected rows\"\n tooltipPosition=\"bottom\"\n (click)=\"!selectedRegions || !selectedRegions.length ? op.hide() : op.toggle($event)\"\n [disabled]=\"!selectedRegions || !selectedRegions.length\"\n >\n </p-button>\n <p-button\n icon=\"pi pi-palette\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n pTooltip=\"Edit colour of selected regions\"\n tooltipPosition=\"bottom\"\n (click)=\"openColorDialog()\"\n [disabled]=\"!selectedRegions || !selectedRegions.length\"\n >\n </p-button>\n <p-overlayPanel #op (onHide)=\"bulkClass = ''; newBulkClass = ''\">\n <div class=\"flex flex-column gap-2\" style=\"width: 18rem\">\n <span class=\"font-medium text-900\"\n >Set class on {{ selectedRegions?.length || 0 }} selected region(s)</span\n >\n <!-- Selecting a class applies it immediately (choosing an option closes the\n overlay, so there's no separate Apply button). -->\n <p-dropdown\n styleClass=\"w-full\"\n appendTo=\"body\"\n [options]=\"presetSet.classes\"\n optionLabel=\"name\"\n optionValue=\"name\"\n [(ngModel)]=\"bulkClass\"\n placeholder=\"Choose a class\u2026\"\n [filter]=\"presetSet.classes.length > 8\"\n filterBy=\"name\"\n (onChange)=\"applyBulkClass()\"\n >\n <ng-template let-c pTemplate=\"item\">\n <span class=\"dd-value\"\n ><span class=\"chip-swatch\" [style.background]=\"c.color\"></span>{{ c.name }}</span\n >\n </ng-template>\n </p-dropdown>\n <div class=\"p-inputgroup\">\n <input\n type=\"text\"\n pInputText\n placeholder=\"\u2026or a new class\"\n [(ngModel)]=\"newBulkClass\"\n (keydown.enter)=\"addAndApplyBulkClass()\"\n />\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-plus\"\n pTooltip=\"Add class &amp; set it\"\n tooltipPosition=\"bottom\"\n [disabled]=\"!newBulkClass.trim()\"\n (click)=\"addAndApplyBulkClass()\"\n ></button>\n </div>\n </div>\n </p-overlayPanel>\n <p-button\n icon=\"pi pi-trash\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n (click)=\"deleteSelectedRegions()\"\n pTooltip=\"Delete selected regions\"\n tooltipPosition=\"bottom\"\n [disabled]=\"!selectedRegions || !selectedRegions.length\"\n ></p-button>\n <p-button\n icon=\"pi pi-times-circle\"\n size=\"small\"\n [text]=\"true\"\n styleClass=\"mr-2\"\n (click)=\"clearAllRegions()\"\n pTooltip=\"Delete all regions\"\n tooltipPosition=\"bottom\"\n [disabled]=\"(!regions || !regions.length) && !hasRegionSource\"\n ></p-button>\n <p-button\n icon=\"pi pi-question\"\n size=\"small\"\n [text]=\"true\"\n (click)=\"showHelp()\"\n pTooltip=\"Help\"\n tooltipPosition=\"bottom\"\n ></p-button>\n </div>\n</p-toolbar>\n\n<region-classes-panel\n [classes]=\"displayClasses\"\n [counts]=\"classCounts\"\n [matchMode]=\"presetSet.matchMode\"\n [activeClass]=\"activeClass\"\n [picked]=\"pickedClass\"\n [marked]=\"markedClasses\"\n [selectedCount]=\"selectedRegions?.length || 0\"\n [defaultClassName]=\"defaultClassName\"\n (pick)=\"selectActiveClass($event)\"\n (recolor)=\"setClassColor($event.name, $event.color)\"\n (remove)=\"deleteClass($event)\"\n (manage)=\"openManageDialog()\"\n [volume]=\"volumeView\"\n [shown3d]=\"shown3dNames\"\n (toggle3d)=\"toggleClass3d($event)\"\n [cellable]=\"cellableClasses\"\n [individual]=\"individualClasses\"\n (toggleCells)=\"setClassesIndividual3d($event.classes, $event.individual)\"\n [hidden]=\"hiddenClasses\"\n (toggleHidden)=\"setClassesHidden([$event], !hiddenClasses.has($event))\"\n [treeView]=\"classHierarchy ? classTreeView : null\"\n (treeViewChange)=\"classTreeView = $event\"\n>\n <!-- A region set with a class hierarchy (an atlas ontology) can show its classes as a tree. -->\n <region-class-tree\n *ngIf=\"classHierarchy as hierarchy\"\n [nodes]=\"hierarchy\"\n [counts]=\"treeCounts\"\n [colorOf]=\"treeColor\"\n [picked]=\"pickedClass\"\n [marked]=\"markedClasses\"\n [volume]=\"volumeView\"\n [shown3d]=\"shown3dNames\"\n [cellable]=\"cellableClasses\"\n [individual]=\"individualClasses\"\n (toggleCells)=\"setClassesIndividual3d($event.classes, $event.individual)\"\n (pick)=\"pickClasses($event)\"\n (recolor)=\"setClassColor($event.name, $event.color)\"\n (toggle3d)=\"toggleClass3d($event.name, $event.classes)\"\n [hidden]=\"hiddenClasses\"\n (toggleHidden)=\"setClassesHidden($event.classes, $event.hidden)\"\n >\n </region-class-tree>\n</region-classes-panel>\n\n<region-table\n [page]=\"pagedRegions\"\n [total]=\"tableTotal\"\n [first]=\"paginatorFirst\"\n [rows]=\"paginatorRows\"\n [rowsPerPageOptions]=\"rowsPerPageOptions\"\n [metaKey]=\"metaKey\"\n [selection]=\"selectedRegions\"\n (selectionChange)=\"selectedRegions = $event\"\n (rowSelect)=\"onSelectionChanged()\"\n [presetSet]=\"tablePresetSet\"\n [defaultColor]=\"shapeColor\"\n [mpp]=\"mpp\"\n [volumes]=\"tableVolumes\"\n [labelDrafts]=\"editingLabelRegions\"\n (labelEditStart)=\"startEditLabel($event)\"\n (labelDraftChange)=\"setLabelDraft($event.region, $event.value)\"\n (labelEditStop)=\"stopEditLabel($event.region, $event.commit)\"\n (classPick)=\"applyPresetToRegion($event.region, $event.name)\"\n (deleteRow)=\"deleteRegion($event)\"\n (pageChange)=\"onPageChange($event)\"\n>\n</region-table>\n\n<!-- Live-edit mode: no Save/Cancel \u2014 every edit commits immediately to the\n active image's region cache. -->\n\n<p-confirmDialog\n #cd\n [style]=\"{ width: '24rem', height: '14rem' }\"\n key=\"positionDialog\"\n [baseZIndex]=\"10000\"\n rejectButtonStyleClass=\"p-button-outlined\"\n>\n <ng-template pTemplate=\"footer\">\n <button type=\"button\" pButton icon=\"pi pi-check\" label=\"Yes\" (click)=\"cd.accept()\"></button>\n <button\n type=\"button\"\n class=\"p-button-outlined\"\n pButton\n icon=\"pi pi-times\"\n label=\"No\"\n (click)=\"cd.reject()\"\n ></button>\n </ng-template>\n</p-confirmDialog>\n\n<region-save-regions-dialog\n [(visible)]=\"showSaveAsDialog\"\n [filename]=\"saveAsFilename\"\n (filenameChange)=\"saveAsFilename = $event; checkSaveAsFileExists()\"\n [fileExists]=\"saveAsFileExists\"\n [busy]=\"saveAsBusy\"\n (confirm)=\"confirmSaveAs()\"\n (cancelSave)=\"cancelSaveAs()\"\n>\n</region-save-regions-dialog>\n\n<region-save-regions-dialog\n header=\"Export Regions\"\n confirmLabel=\"Export\"\n confirmIcon=\"pi pi-download\"\n inputId=\"export-filename\"\n [(visible)]=\"showExportDialog\"\n [(filename)]=\"exportFilename\"\n (confirm)=\"confirmExport()\"\n>\n</region-save-regions-dialog>\n\n<region-save-mask-dialog\n [(visible)]=\"showSaveMaskDialog\"\n [(filename)]=\"saveMaskFilename\"\n [(mode)]=\"maskMode\"\n [busy]=\"maskBusy\"\n [progress]=\"maskProgress\"\n [encoding]=\"maskEncoding\"\n (confirm)=\"confirmSaveMask()\"\n (cancelExport)=\"cancelSaveMask()\"\n>\n</region-save-mask-dialog>\n\n<region-color-dialog\n [(visible)]=\"showColorDialog\"\n [edits]=\"classColorEdits\"\n [selectedCount]=\"selectedRegions?.length || 0\"\n (apply)=\"applyColorToSelected($event)\"\n>\n</region-color-dialog>\n\n<!-- Manage annotation classes (jit-ui#70): edits a working copy, committed on Apply. -->\n<region-manage-classes-dialog\n [(visible)]=\"showManageDialog\"\n [(draft)]=\"presetDraft\"\n (apply)=\"applyManageDialog(true)\"\n (resetDefaults)=\"resetPresetsToDefaults()\"\n (importFile)=\"importPresets($event)\"\n (export)=\"exportPresets()\"\n>\n</region-manage-classes-dialog>\n\n<region-editor-help [(visible)]=\"displayHelpDialog\"></region-editor-help>\n", styles: ["@charset \"UTF-8\";.chip-swatch{display:inline-block;width:.75rem;height:.75rem;border-radius:50%;border:1px solid rgba(0,0,0,.2);flex:0 0 auto}.dd-value{display:inline-flex;align-items:center;gap:.4rem;min-width:0}.dd-value .class-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host{display:flex;flex-direction:column;height:100%;min-height:0;overflow:hidden}::ng-deep region-editor .p-toolbar.region-toolbar{padding:.25rem .5rem;border-radius:0;border-left:none;border-right:none;border-top:none}::ng-deep region-editor .p-toolbar.region-toolbar .p-button.p-button-icon-only{width:auto;padding:.25rem .5rem}::ng-deep region-editor .p-toolbar.region-toolbar .p-button{padding:.25rem .5rem}.toolbar-icon-dark{filter:brightness(0) invert(47%) sepia(98%) saturate(567%) hue-rotate(181deg) brightness(103%) contrast(98%)}.toolbar-separator{border-left:1px solid var(--surface-border);height:1.5rem;margin:0 .25rem;align-self:center}\n"] }]
1566
1586
  }], ctorParameters: () => [{ type: undefined, decorators: [{
1567
1587
  type: Inject,
1568
1588
  args: [REGION_EDITOR_API]
@@ -1584,4 +1604,4 @@ function onePlane(text) {
1584
1604
  return true;
1585
1605
  }
1586
1606
  }
1587
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLWVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1lZGl0b3IvcmVnaW9uLWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1lZGl0b3IvcmVnaW9uLWVkaXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBR0wsU0FBUyxFQUNULE1BQU0sRUFDTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFB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QUFxQjt3QkFDckIsb0JBQW9CO3dCQUNwQixrQkFBa0I7d0JBQ2xCLDBCQUEwQjt3QkFDMUIsdUJBQXVCO3dCQUN2QiwwQkFBMEI7d0JBQzFCLDRCQUE0Qjt3QkFDNUIseUJBQXlCO3FCQUMxQixtQkFHZ0IsdUJBQXVCLENBQUMsTUFBTSxhQUNwQyxDQUFDLHdCQUF3QixDQUFDOzswQkFvS2xDLE1BQU07MkJBQUMsaUJBQWlCOytLQWpLRixZQUFZO3NCQUFwQyxTQUFTO3VCQUFDLElBQUk7Z0JBUUYsTUFBTTtzQkFBbEIsS0FBSzs7QUF5Z0RSOzs7R0FHRztBQUNILFNBQVMsUUFBUSxDQUFDLElBQVk7SUFDNUIsSUFBSSxDQUFDO1FBQ0gsT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBEZXN0cm95UmVmLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgVmlld0NoaWxkLFxuICBpbmplY3QsXG4gIE5nWm9uZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBtYXJrRm9yQ2hlY2tJblpvbmUgfSBmcm9tICcuLi91dGlsL21hcmstZm9yLWNoZWNrJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYnV0dG9uJztcbmltcG9ydCB7IENvbmZpcm1EaWFsb2dNb2R1bGUgfSBmcm9tICdwcmltZW5nL2NvbmZpcm1kaWFsb2cnO1xuaW1wb3J0IHsgRHJvcGRvd25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2Ryb3Bkb3duJztcbmltcG9ydCB7IElucHV0VGV4dE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvaW5wdXR0ZXh0JztcbmltcG9ydCB7IE92ZXJsYXlQYW5lbCwgT3ZlcmxheVBhbmVsTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9vdmVybGF5cGFuZWwnO1xuaW1wb3J0IHsgVG9vbGJhck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdG9vbGJhcic7XG5pbXBvcnQgeyBUb29sdGlwTW9kdWxlIH0gZnJvbSAncHJpbWVuZy90b29sdGlwJztcbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gJ2ZpbGUtc2F2ZXInO1xuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFJlY3RhbmdsZSwgUmVnaW9uIH0gZnJvbSAnLi4vbW9kZWxzL3JlZ2lvbic7XG5pbXBvcnQgeyB3aXRoUmVnaW9uUGF0Y2ggfSBmcm9tICcuLi9tb2RlbHMvcmVnaW9uLWNsb25lJztcbmltcG9ydCB7IFByZXNldFNldCwgQ2xhc3NQcmVzZXQsIGRlZmF1bHRQcmVzZXRTZXQsIHBhcnNlUHJlc2V0U2V0IH0gZnJvbSAnLi4vbW9kZWxzL2NsYXNzLXByZXNldCc7XG5pbXBvcnQgeyBjb2xvckZvckxhYmVsLCBwcmVzZXRLZXkgfSBmcm9tICcuLi9zdG9yZS9jbGFzcy1jb2xvci51dGlsJztcbmltcG9ydCB7IENvbmZpcm1hdGlvblNlcnZpY2UsIE1lc3NhZ2VTZXJ2aWNlLCBTaGFyZWRNb2R1bGUgfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQgeyBJUmVnaW9uRWRpdG9yQXBpLCBSRUdJT05fRURJVE9SX0FQSSB9IGZyb20gJy4uL2NvbnRyYWN0cy9yZWdpb24tZWRpdG9yLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBWSVpfVE9BU1RfS0VZIH0gZnJvbSAnLi4vdG9hc3Qtb3V0bGV0cyc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgb3Blbkh0dHBSZWdpb25Tb3VyY2UgfSBmcm9tICcuLi9yZWdpb24tc291cmNlL2h0dHAtcmVnaW9uLXNvdXJjZSc7XG5pbXBvcnQgeyBSZWdpb25JbXBvcnRGaWxlLCBpbXBvcnRGaWxlLCBwbGFuUmVnaW9uSW1wb3J0IH0gZnJvbSAnLi4vcmVnaW9uLWltcG9ydC9yZWdpb24taW1wb3J0JztcbmltcG9ydCB7IHJlYWRBbm5vdGF0aW9uU2xpY2VzLCBzcGxpdEJ5UGxhbmUgfSBmcm9tICcuLi9yZWdpb24taW1wb3J0L29wZW4tYW5ub3RhdGlvbnMnO1xuaW1wb3J0IHsgaXNaaXBOYW1lIH0gZnJvbSAnLi4vcmVnaW9uLWltcG9ydC96aXAnO1xuaW1wb3J0IHsgUmVnaW9uUGVyc2lzdGVuY2VTZXJ2aWNlLCBTbGljZUdlb0pzb24gfSBmcm9tICcuL3JlZ2lvbi1wZXJzaXN0ZW5jZS5zZXJ2aWNlJztcbmltcG9ydCB7IENsYXNzQ29sb3JFZGl0LCBSZWdpb25Db2xvckRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vcmVnaW9uLWNvbG9yLWRpYWxvZy9yZWdpb24tY29sb3ItZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDbGFzc2VzUGFuZWxDb21wb25lbnQgfSBmcm9tICcuL2NsYXNzZXMtcGFuZWwvY2xhc3Nlcy1wYW5lbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVnaW9uVGFibGVDb21wb25lbnQgfSBmcm9tICcuL3JlZ2lvbi10YWJsZS9yZWdpb24tdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IENsYXNzVHJlZUNvbXBvbmVudCwgQ2xhc3NUcmVlUGljayB9IGZyb20gJy4vY2xhc3MtdHJlZS9jbGFzcy10cmVlLmNvbXBvbmVudCc7XG5pbXBvcnQgdHlwZSB7IFJlZ2lvblNvdXJjZVZpZXcgfSBmcm9tICcuLi9yZWdpb24tc291cmNlL3JlZ2lvbi1zb3VyY2UnO1xuaW1wb3J0IHR5cGUgeyBSZWdpb25DbGFzc05vZGUsIFJlZ2lvbkluZGV4Um93IH0gZnJvbSAnLi4vcmVnaW9uLXNvdXJjZS9yZWdpb24tdGlsZXMnO1xuaW1wb3J0IHsgU2F2ZVJlZ2lvbnNEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL3NhdmUtcmVnaW9ucy1kaWFsb2cvc2F2ZS1yZWdpb25zLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2F2ZU1hc2tEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL3NhdmUtbWFzay1kaWFsb2cvc2F2ZS1tYXNrLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWFuYWdlQ2xhc3Nlc0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vbWFuYWdlLWNsYXNzZXMtZGlhbG9nL21hbmFnZS1jbGFzc2VzLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVnaW9uRWRpdG9ySGVscENvbXBvbmVudCB9IGZyb20gJy4vcmVnaW9uLWVkaXRvci1oZWxwL3JlZ2lvbi1lZGl0b3ItaGVscC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWFza0V4cG9ydFNlcnZpY2UsIE1hc2tNb2RlIH0gZnJvbSAnLi9tYXNrLWV4cG9ydC5zZXJ2aWNlJztcbmltcG9ydCB7IFBpeGVsU2l6ZSwgZm9ybWF0QXJlYSwgcGlja01wcCwgcmVnaW9uQXJlYVB4IH0gZnJvbSAnLi9yZWdpb24tbWV0cmljcyc7XG5cbi8qKlxuICogVGhlIFJlZ2lvbiBFZGl0b3IgKGA8cmVnaW9uLWVkaXRvcj5gKTogdGhlIHRhYmxlIG9mIHRoZSBhY3RpdmUgaW1hZ2Unc1xuICogYW5ub3RhdGlvbiByZWdpb25zIHdpdGggY2xhc3MgcHJlc2V0cywgY29sb3VycywgbGFiZWxzLCBHZW9KU09OIGltcG9ydCAvXG4gKiBleHBvcnQgLyBzZXJ2ZXIgc2F2ZSBhbmQgbWFzayBleHBvcnQuIFNlbGYtY29udGFpbmVkOiBpdCB0YWxrcyB0byB0aGUgdmlld2VyXG4gKiBvbmx5IHRocm91Z2gge0BsaW5rIFJFR0lPTl9FRElUT1JfQVBJfSAoYW5kIHRoZSBob3N0J3MgUkVHSU9OX0lPX1BPUlQpLCBzbyBpdFxuICogaGFzIG5vIGlucHV0cyBvciBvdXRwdXRzLlxuICpcbiAqIE9uUHVzaDogdGVtcGxhdGUgZXZlbnRzIHJlLXJlbmRlciBpdDsgc3RhdGUgdGhhdCBsYW5kcyBhc3luY2hyb25vdXNseSAodGhlXG4gKiBBUEkncyByZWdpb24gLyBzZWxlY3Rpb24gLyBwcmVzZXQgLyBpbWFnZS1tZXRhIHN0cmVhbXMsIHNhdmUgYW5kIG1hc2stZXhwb3J0XG4gKiBwcm9ncmVzcywgZmlsZSByZWFkcykgbWFya3MgaXQgZm9yIGNoZWNrLlxuICovXG4vKiogVGhlIG9wYWNpdHkgdGhlIGZpbGwgdG9nZ2xlIGZpbGxzIHJlZ2lvbnMgYXQuICovXG5jb25zdCBSRUdJT05fRklMTF9PUEFDSVRZID0gMC42O1xuXG4vKiogXCJTZWxlY3QgYWxsXCIgdGFrZXMgYXQgbW9zdCB0aGlzIG1hbnkgcmVnaW9uLXNvdXJjZSBmZWF0dXJlcyBpbnRvIHRoZSByZWdpb25zLiAqL1xuY29uc3QgU0VMRUNUX0FMTF9TT1VSQ0VfTElNSVQgPSA1MDAwO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyZWdpb24tZWRpdG9yJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBTaGFyZWRNb2R1bGUsXG4gICAgQnV0dG9uTW9kdWxlLFxuICAgIENvbmZpcm1EaWFsb2dNb2R1bGUsXG4gICAgRHJvcGRvd25Nb2R1bGUsXG4gICAgSW5wdXRUZXh0TW9kdWxlLFxuICAgIE92ZXJsYXlQYW5lbE1vZHVsZSxcbiAgICBUb29sYmFyTW9kdWxlLFxuICAgIFRvb2x0aXBNb2R1bGUsXG4gICAgQ2xhc3Nlc1BhbmVsQ29tcG9uZW50LFxuICAgIFJlZ2lvblRhYmxlQ29tcG9uZW50LFxuICAgIENsYXNzVHJlZUNvbXBvbmVudCxcbiAgICBTYXZlUmVnaW9uc0RpYWxvZ0NvbXBvbmVudCxcbiAgICBTYXZlTWFza0RpYWxvZ0NvbXBvbmVudCxcbiAgICBSZWdpb25Db2xvckRpYWxvZ0NvbXBvbmVudCxcbiAgICBNYW5hZ2VDbGFzc2VzRGlhbG9nQ29tcG9uZW50LFxuICAgIFJlZ2lvbkVkaXRvckhlbHBDb21wb25lbnQsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9yZWdpb24tZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcmVnaW9uLWVkaXRvci5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgcHJvdmlkZXJzOiBbUmVnaW9uUGVyc2lzdGVuY2VTZXJ2aWNlXSxcbn0pXG5leHBvcnQgY2xhc3MgUmVnaW9uRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKCdvcCcpIHByaXZhdGUgb3ZlcmxheVBhbmVsITogT3ZlcmxheVBhbmVsO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBlZGl0b3IgaXMgb24gc2NyZWVuIChpdHMgZGlhbG9nIG9wZW4pLiBDbG9zZWQsIGl0IGFza3MgdGhlIHJlZ2lvbiBzb3VyY2Ugbm90aGluZzpcbiAgICogaXRzIHBhZ2Ugb2YgZmVhdHVyZXMsIGl0cyBjbGFzcyBjb3VudHMgYW5kLCBpbiBhIHZvbHVtZSB2aWV3LCBpdHMgY2xhc3Nlcycgdm9sdW1lcyBhcmUgZWFjaCBhXG4gICAqIHJlcXVlc3Qgb3ZlciB0aGUgd2hvbGUgc2V0IChhIHN0YWNrJ3MgZXZlcnkgc2xpY2UpLCBhbmQgdGhleSBjb21wZXRlZCB3aXRoIHRoZSB2b2x1bWUncyBvd25cbiAgICogc2xpY2UgbG9hZGluZyBmb3Igbm90aGluZyBhbnlvbmUgY291bGQgc2VlLiBPcGVuZWQsIGl0IHJlYWRzIHRoZW0gYWdhaW4uXG4gICAqL1xuICBASW5wdXQoKSBzZXQgYWN0aXZlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgY29uc3Qgd2FzID0gdGhpcy5pc0FjdGl2ZTtcbiAgICB0aGlzLmlzQWN0aXZlID0gdmFsdWU7XG4gICAgaWYgKHZhbHVlICYmICF3YXMpIHtcbiAgICAgIHZvaWQgdGhpcy5yZWZyZXNoU291cmNlKCk7XG4gICAgICB0aGlzLnJlc2V0Vm9sdW1lcygpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGlzQWN0aXZlID0gdHJ1ZTtcbiAgLyoqIFRoZSBob3N0J3MgSHR0cENsaWVudDogYSBzZXJ2ZWQgcmVnaW9uIHNldCdzIHJlcXVlc3RzIGdvIHRocm91Z2ggaXQgKGl0cyBhdXRoKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBodHRwID0gaW5qZWN0KEh0dHBDbGllbnQsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgcHJvdGVjdGVkIHJlZ2lvbnM6IFJlZ2lvbltdID0gW107XG4gIHByb3RlY3RlZCBzZWxlY3RlZFJlZ2lvbnM6IFJlZ2lvbltdID0gW107XG4gIHByb3RlY3RlZCBzaG93U2hhcGVMYWJlbCE6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBzaGFwZUNvbG9yITogc3RyaW5nO1xuICBwcm90ZWN0ZWQgZmlsbENvbG9yITogc3RyaW5nO1xuICBwcm90ZWN0ZWQgZGlzcGxheUhlbHBEaWFsb2cgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHNob3dDb2xvckRpYWxvZyA9IGZhbHNlO1xuICAvKiogT25lIGNvbG91ciBlZGl0b3IgcGVyIHVuaXF1ZSBjbGFzcyBhbW9uZyB0aGUgc2VsZWN0ZWQgcmVnaW9ucywgc2hvd24gaW4gdGhlXG4gICAqICBcImVkaXQgY29sb3VyIG9mIHNlbGVjdGVkIHJlZ2lvbnNcIiBkaWFsb2cuIFVuY2xhc3NpZmllZCByZWdpb25zIChubyBsYWJlbClcbiAgICogIGFyZSBncm91cGVkIHVuZGVyIGEgc2luZ2xlIGVudHJ5IHdpdGggYW4gZW1wdHkgYGxhYmVsYC4gKi9cbiAgcHJvdGVjdGVkIGNsYXNzQ29sb3JFZGl0czogQ2xhc3NDb2xvckVkaXRbXSA9IFtdO1xuICAvKiogXCJFZGl0IGNsYXNzIG9uIHNlbGVjdGVkIHJvd3NcIiBwb3B1cDogY2hvc2VuIGV4aXN0aW5nIGNsYXNzLCBhbmQgYSBuZXctY2xhc3MgbmFtZS4gKi9cbiAgcHJvdGVjdGVkIGJ1bGtDbGFzcyA9ICcnO1xuICBwcm90ZWN0ZWQgbmV3QnVsa0NsYXNzID0gJyc7XG5cbiAgLy8g4pSA4pSAIGFubm90YXRpb24tY2xhc3MgcHJlc2V0cyAoaml0LXVpIzcwKSDilIDilIBcbiAgLyoqIExvY2FsIG1pcnJvciBvZiB0aGUgcGVyLXVzZXIgcHJlc2V0IHNldCAoY2hpcCBzdHJpcCwgQ2xhc3MgZHJvcGRvd24sIGRpYWxvZykuICovXG4gIHByb3RlY3RlZCBwcmVzZXRTZXQ6IFByZXNldFNldCA9IGRlZmF1bHRQcmVzZXRTZXQoKTtcbiAgLyoqIFRoZSBjbGFzcyBsYXN0IHBpY2tlZCBpbiB0aGUgcGFuZWw7IGEgY2hpcC1jbGljayBhcHBsaWVzIGl0IHRvIHRoZSBzZWxlY3RlZCByb3dzLiAqL1xuICBwcm90ZWN0ZWQgYWN0aXZlQ2xhc3M6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcm90ZWN0ZWQgc2hvd01hbmFnZURpYWxvZyA9IGZhbHNlO1xuICAvKiogV29ya2luZyBjb3B5IGVkaXRlZCBpbnNpZGUgdGhlIE1hbmFnZS1jbGFzc2VzIGRpYWxvZzsgY29tbWl0dGVkIG9uIEFwcGx5L0RvbmUuICovXG4gIHByb3RlY3RlZCBwcmVzZXREcmFmdDogUHJlc2V0U2V0IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBjbGFzcyBuYW1lIChtYXRjaC1tb2RlIGtleWVkKSDihpIgbnVtYmVyIG9mIHJlZ2lvbnMgY3VycmVudGx5IHVzaW5nIGl0LiAqL1xuICBwcm90ZWN0ZWQgY2xhc3NDb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAvKiogRmFsbGJhY2sgY2xhc3MgdGhhdCBhIHJlZ2lvbiByZXZlcnRzIHRvIHdoZW4gaXRzIGNsYXNzIGlzIGRlbGV0ZWQgKGppdC11aSM3MCkuICovXG4gIHByb3RlY3RlZCByZWFkb25seSBkZWZhdWx0Q2xhc3NOYW1lID0gJ1JlZ2lvbic7XG4gIC8qKiBDbGFzc2VzIGFzIHNob3duIGluIHRoZSBwYW5lbDogc29ydGVkIGJ5IHJlZ2lvbiBjb3VudCAoZGVzYyksIHRoZW4gbmFtZS4gKi9cbiAgcHJvdGVjdGVkIGRpc3BsYXlDbGFzc2VzOiBDbGFzc1ByZXNldFtdID0gW107XG5cbiAgcHJvdGVjdGVkIHBhZ2luYXRvckZpcnN0ID0gMDtcbiAgcHJvdGVjdGVkIHBhZ2luYXRvclJvd3MgPSAxMDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJvd3NQZXJQYWdlT3B0aW9ucyA9IFsxMCwgMjUsIDUwXTtcbiAgLyoqIFJlZ2lvbnMgd2hvc2UgQ2xhc3MgY2VsbCBpcyBjdXJyZW50bHkgaW4gZWRpdCBtb2RlIOKGkiB0aGUgbGFiZWwgYmVpbmcgdHlwZWQuXG4gICAqICBUaGUgZHJhZnQgaXMgY29tbWl0dGVkIG9uIEVudGVyIGFuZCBkaXNjYXJkZWQgb24gRXNjYXBlL+KclSwgc28gdHlwaW5nIG5ldmVyXG4gICAqICB3cml0ZXMgaW50byB0aGUgc3RvcmUncyByZWdpb24gKFJULTE4KS4gS2V5ZWQgYnkgb2JqZWN0IGlkZW50aXR5LCB3aGljaFxuICAgKiAgYXZvaWRzIG5lZWRpbmcgYSB1bmlxdWUgaWQgZmllbGQuICovXG4gIHByb3RlY3RlZCBlZGl0aW5nTGFiZWxSZWdpb25zID0gbmV3IE1hcDxSZWdpb24sIHN0cmluZz4oKTtcblxuICBwcm90ZWN0ZWQgc2hvd1NhdmVBc0RpYWxvZyA9IGZhbHNlO1xuICAvKipcbiAgICogVGhlIHNsaWNlJ3MgcmVnaW9uIHNvdXJjZSAoYSBsYXJnZSByZWdpb24gc2V0IGRyYXduIGJ5IGxldmVsIG9mIGRldGFpbCksIG9yIG51bGwuIEl0c1xuICAgKiBmZWF0dXJlcyBhcmUgcm93cyBvZiB0aGUgdGFibGUgYWZ0ZXIgdGhlIHJlZ2lvbnMg4oCUIHN0YW5kLWlucyB1bnRpbCBvbmUgaXMgc2VsZWN0ZWQgb3IgZWRpdGVkLFxuICAgKiB3aGljaCB0YWtlcyBpdCBpbnRvIHRoZSByZWdpb25zIOKAlCBhbmQgaXRzIGNsYXNzZXMgY291bnQgaW4gdGhlIGNsYXNzZXMgcGFuZWwuXG4gICAqL1xuICBwcm90ZWN0ZWQgc291cmNlVmlldzogUmVnaW9uU291cmNlVmlldyB8IG51bGwgPSBudWxsO1xuICAvKiogRmVhdHVyZXMgc3RpbGwgaW4gdGhlIHNvdXJjZSAodGhlIHRhYmxlJ3Mgcm93cyBhZnRlciB0aGUgcmVnaW9ucykuICovXG4gIHByaXZhdGUgc291cmNlVG90YWwgPSAwO1xuICAvKiogU3RhbmQtaW4gcm93cyBmb3IgdGhlIHNvdXJjZSBmZWF0dXJlcyBvbiB0aGUgY3VycmVudCBwYWdlLiAqL1xuICBwcml2YXRlIHNvdXJjZVJvd3M6IFJlZ2lvbltdID0gW107XG4gIC8qKiBGZWF0dXJlcyBwZXIgY2xhc3Mgc3RpbGwgaW4gdGhlIHNvdXJjZS4gKi9cbiAgcHJpdmF0ZSBzb3VyY2VDbGFzc0NvdW50czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAvKiogVGhlIHN0YW5kLWluIHJvd3MgKHJvd3Mgb2YgYSBzb3VyY2UgZmVhdHVyZSwgbm90IG9mIGEgcmVnaW9uKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzdGFuZElucyA9IG5ldyBXZWFrU2V0PFJlZ2lvbj4oKTtcbiAgcHJpdmF0ZSBzdGFuZEluU2VxID0gMDtcbiAgLyoqIEJ1bXBlZCBwZXIgc291cmNlIHJlZnJlc2gsIHNvIGEgbGF0ZSBhbnN3ZXIgaXMgZHJvcHBlZC4gKi9cbiAgcHJpdmF0ZSBzb3VyY2VSZXF1ZXN0ID0gMDtcbiAgLyoqIFRoZSBjbGFzc2VzIHRoZSB0YWJsZSdzIENsYXNzIGNvbHVtbiBvZmZlcnM6IHRoZSBwcmVzZXRzIGFuZCB0aGUgcmVnaW9uIHNvdXJjZSdzIGNsYXNzZXNcbiAgICogIChhIGRyb3Bkb3duIGNhbiBvbmx5IHNob3cgYSB2YWx1ZSB0aGF0IGlzIG9uZSBvZiBpdHMgb3B0aW9ucykuICovXG4gIHByb3RlY3RlZCB0YWJsZVByZXNldFNldDogUHJlc2V0U2V0ID0gZGVmYXVsdFByZXNldFNldCgpO1xuICAvKiogV2hldGhlciByZWdpb25zIGFyZSBkcmF3biBmaWxsZWQgKHRoZSBhdGxhcyBsb29rKSByYXRoZXIgdGhhbiBvdXRsaW5lZC4gKi9cbiAgcHJvdGVjdGVkIHJlZ2lvbnNGaWxsZWQgPSBmYWxzZTtcbiAgLyoqIFdoZXRoZXIgYSB2b2x1bWUgdmlldyBpcyBvbiBzY3JlZW4gKGNsYXNzZXMgY2FuIHRoZW4gYmUgc2hvd24gaW4gM0QpLiAqL1xuICBwcm90ZWN0ZWQgdm9sdW1lVmlldyA9IGZhbHNlO1xuICAvKiogV2hldGhlciB0aGUgdm9sdW1lIHZpZXcncyBzbGljZSBwYW5lIGlzIHdhbnRlZCAob25lIHNsaWNlIGVkaXRlZCBiZXNpZGUgdGhlIDNEIHZpZXcpLiAqL1xuICBwcml2YXRlIHNsaWNlUGFuZSA9IGZhbHNlO1xuICAvKiogV2hldGhlciB0aGUgdm9sdW1lIHZpZXcgZHJhd3MgdGhlIHJlZ2lvbnMgdGhyb3VnaCB0aGUgdm9sdW1lIChzZWUgdG9nZ2xlVGhyb3VnaFZvbHVtZSkuICovXG4gIHByb3RlY3RlZCByZWdpb25zVGhyb3VnaFZvbHVtZSA9IGZhbHNlO1xuICAvKiogQ2xhc3NlcyBzaG93biBpbiAzRCBpbiB0aGUgdm9sdW1lIHZpZXcsIGVhY2ggd2l0aCB0aGUgY2xhc3NlcyBpdHMgc3VyZmFjZSBjb3ZlcnMuICovXG4gIHByb3RlY3RlZCBzaG93bjNkID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICAvKiogVGhlIGNsYXNzZXMgb2YgdGhlIGNsYXNzIHRyZWUncyBwaWNrIChpdCBhbmQgaXRzIHN1YnRyZWUpLCBhcyBsb25nIGFzIHRoZSBwaWNrIGhvbGRzLiAqL1xuICBwcml2YXRlIHBpY2tlZENsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW107XG4gIC8qKiBUaGUgc2VsZWN0ZWQgcm93cycgY2xhc3NlcywgbWFya2VkIGluIHRoZSBjbGFzcyBsaXN0cy4gKi9cbiAgcHJvdGVjdGVkIG1hcmtlZENsYXNzZXM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIC8qKiBUaGUgc3VyZmFjZXMgaGlnaGxpZ2h0ZWQgaW4gdGhlIHZvbHVtZSB2aWV3ICh0aGVpciBrZXlzLCBqb2luZWQpLiAqL1xuICBwcml2YXRlIGhpZ2hsaWdodGVkM2QgPSAnJztcbiAgLyoqIFRoZSBjb2xvdXIgZWFjaCBzaG93biBzdXJmYWNlIHdhcyBsYXN0IGRyYXduIGluLiAqL1xuICBwcml2YXRlIGNvbG9yczNkID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgLyoqIFRoZWlyIG5hbWVzLCBmb3IgdGhlIGNsYXNzIGxpc3RzJyB0b2dnbGVzIChhIG5ldyBzZXQgcGVyIGNoYW5nZSwgZm9yIE9uUHVzaCkuICovXG4gIHByb3RlY3RlZCBzaG93bjNkTmFtZXM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIC8qKiBUaGUgY2xhc3NlcyBoaWRkZW4gZnJvbSB2aWV3ICh0aGVpciByZWdpb25zLCBzb3VyY2UgZmVhdHVyZXMgYW5kIHN1cmZhY2VzKS4gKi9cbiAgcHJvdGVjdGVkIGhpZGRlbkNsYXNzZXM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIC8qKiBXaGV0aGVyIGEgcmVnaW9uIHNldCdzIGNsYXNzIGhpZXJhcmNoeSBpcyBzaG93biBhcyBhIHRyZWUgKHJhdGhlciB0aGFuIHRoZSBjbGFzcyBsaXN0KS4gKi9cbiAgcHJvdGVjdGVkIGNsYXNzVHJlZVZpZXcgPSB0cnVlO1xuICAvKiogVGhlIGNsYXNzIHBpY2tlZCBsYXN0IGluIHRoZSBjbGFzcyB0cmVlLiAqL1xuICBwcm90ZWN0ZWQgcGlja2VkQ2xhc3M6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogUmVnaW9ucyBwZXIgY2xhc3MgKHRoZSByZWdpb25zJyBhbmQgdGhlIHNvdXJjZSdzKSwgZm9yIHRoZSBjbGFzcyB0cmVlLiAqL1xuICBwcm90ZWN0ZWQgdHJlZUNvdW50cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIC8qKiBBIGNsYXNzJ3MgY29sb3VyLCBmb3IgdGhlIGNsYXNzIHRyZWU6IGEgbmV3IGZ1bmN0aW9uIHBlciBjb2xvdXIgY2hhbmdlLCBzbyB0aGUgdHJlZSByZXBhaW50cy4gKi9cbiAgcHJvdGVjdGVkIHRyZWVDb2xvciA9IChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4gY29sb3JGb3JMYWJlbChuYW1lLCB0aGlzLnByZXNldFNldCk7XG4gIHByb3RlY3RlZCBzYXZlQXNGaWxlbmFtZSA9ICcnO1xuICBwcm90ZWN0ZWQgc2F2ZUFzRmlsZUV4aXN0cyA9IGZhbHNlO1xuICAvKiogVHJ1ZSB3aGlsZSBhIEdlb0pTT04gcGVyc2lzdCBpcyBzZXJpYWxpemluZy91cGxvYWRpbmcg4oCUIGRyaXZlcyB0aGUgZGlhbG9nJ3NcbiAgICogIHByb2dyZXNzIGJhciBhbmQgQ2FuY2VsIGJ1dHRvbiAocGFyaXR5IHdpdGggdGhlIFNhdmUtbWFzayBkaWFsb2cpLiAqL1xuICBwcm90ZWN0ZWQgc2F2ZUFzQnVzeSA9IGZhbHNlO1xuICAvKiogVGhlIHJ1bm5pbmcgR2VvSlNPTiBzYXZlOyB1bnN1YnNjcmliaW5nIGNhbmNlbHMgaXQgKENhbmNlbCAvIGRlc3Ryb3kpLiAqL1xuICBwcml2YXRlIF9zYXZlQXNTdWI/OiBTdWJzY3JpcHRpb247XG4gIC8qKiBTYXZlLWFzIGZpbGUgbmFtZXMgdG8gY2hlY2sgZm9yIGFuIGV4aXN0aW5nIGZpbGUgKGRlYm91bmNlZCkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2F2ZUFzQ2hlY2skID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gIHByb3RlY3RlZCBzaG93RXhwb3J0RGlhbG9nID0gZmFsc2U7XG4gIHByb3RlY3RlZCBleHBvcnRGaWxlbmFtZSA9ICcnO1xuXG4gIHByb3RlY3RlZCBzaG93U2F2ZU1hc2tEaWFsb2cgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHNhdmVNYXNrRmlsZW5hbWUgPSAnJztcbiAgLyoqIE1hc2sgdHlwZSBjaG9zZW4gaW4gdGhlIFNhdmUtbWFzayBkaWFsb2c6IGEgYmluYXJ5IGZvcmVncm91bmQvYmFja2dyb3VuZFxuICAgKiAgbWFzaywgb3IgYSBtdWx0aS1jbGFzcyBtYXNrIHdpdGggYSBkaXN0aW5jdCBpZCBwZXIgcmVnaW9uLiAqL1xuICBwcm90ZWN0ZWQgbWFza01vZGU6IE1hc2tNb2RlID0gJ2JpbmFyeSc7XG4gIC8qKiBUcnVlIHdoaWxlIHRoZSBtYXNrIHdvcmtlciBpcyByYXN0ZXJpemluZy9lbmNvZGluZyDigJQgZHJpdmVzIHRoZSBwcm9ncmVzc1xuICAgKiAgYmFyIGFuZCB0aGUgQ2FuY2VsIGJ1dHRvbiBpbiB0aGUgZGlhbG9nLiAqL1xuICBwcm90ZWN0ZWQgbWFza0J1c3kgPSBmYWxzZTtcbiAgLyoqIDDigJMxMDAgcmFzdGVyaXphdGlvbiBwcm9ncmVzczsgc3dpdGNoZXMgdG8gaW5kZXRlcm1pbmF0ZSBkdXJpbmcgZW5jb2RpbmcuICovXG4gIHByb3RlY3RlZCBtYXNrUHJvZ3Jlc3MgPSAwO1xuICBwcm90ZWN0ZWQgbWFza0VuY29kaW5nID0gZmFsc2U7XG4gIC8qKiBUaGUgcnVubmluZyBtYXNrIGV4cG9ydDsgdW5zdWJzY3JpYmluZyBjYW5jZWxzIGl0ICh0ZXJtaW5hdGVzIGl0cyB3b3JrZXIpLiAqL1xuICBwcml2YXRlIG1hc2tKb2I/OiBTdWJzY3JpcHRpb247XG5cbiAgLyoqXG4gICAqIFByaW1lTkcgcC10YWJsZSBtdWx0aS1zZWxlY3Rpb24gbW9kZSB0b2dnbGUuIFdoZW4gdHJ1ZSwgc2luZ2xlLWNsaWNrXG4gICAqIHNlbGVjdHMgb25lIHJvdyAocmVwbGFjaW5nIHByaW9yKTsgbWV0YS9jdHJsLWNsaWNrIHRvZ2dsZXMgYSByb3cgaW4vb3V0XG4gICAqIG9mIHRoZSBzZWxlY3Rpb24uIFdoZW4gZmFsc2UsIGV2ZXJ5IGNsaWNrIHRvZ2dsZXMuIERlZmF1bHQgdHJ1ZSB0b1xuICAgKiBtYXRjaCB0aGUgbW9zdCBjb21tb24gc3ByZWFkc2hlZXQtbGlrZSBVWC5cbiAgICovXG4gIHByb3RlY3RlZCBtZXRhS2V5ID0gdHJ1ZTtcblxuICBwcml2YXRlIF91cGRhdGluZ0Zyb21FZGl0b3IgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc3VwcHJlc3NTZWxlY3Rpb25TeW5jVG9QbG90ID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IHpvbmUgPSBpbmplY3QoTmdab25lKTtcblxuICAvKiogUmUtcmVuZGVyIHRoaXMgT25QdXNoIHZpZXcsIHJlLWVudGVyaW5nIHRoZSB6b25lIHdoZW4gdGhlIGNoYW5nZSBjYW1lIGZyb20gb3V0c2lkZSBpdC4gKi9cbiAgcHJpdmF0ZSBjaGFuZ2VkKCk6IHZvaWQge1xuICAgIG1hcmtGb3JDaGVja0luWm9uZSh0aGlzLmNkciwgdGhpcy56b25lKTtcbiAgfVxuXG4gIC8qKiBQaHlzaWNhbCBwaXhlbCBzaXplICjCtW0vcGl4ZWwpIG9mIHRoZSBhY3RpdmUgaW1hZ2UsIGZvciByZWdpb24gYXJlYXMgaW5cbiAgICogIMK1bcKyOyBlbXB0eSB3aGVuIHRoZSBmb3JtYXQgcmVwb3J0cyBubyBwaHlzaWNhbCBzaXplLiAqL1xuICBwcm90ZWN0ZWQgbXBwOiBQaXhlbFNpemUgPSB7fTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KFJFR0lPTl9FRElUT1JfQVBJKSBwcml2YXRlIHJlZ2lvbkFwaTogSVJlZ2lvbkVkaXRvckFwaSxcbiAgICBwcml2YXRlIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcbiAgICBwcml2YXRlIGNvbmZpcm1hdGlvblNlcnZpY2U6IENvbmZpcm1hdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwZXJzaXN0ZW5jZTogUmVnaW9uUGVyc2lzdGVuY2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWFza0V4cG9ydDogTWFza0V4cG9ydFNlcnZpY2UsXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnNob3dTaGFwZUxhYmVsID0gdGhpcy5yZWdpb25BcGkuZ2V0U2hvd1NoYXBlTGFiZWwoKTtcbiAgICB0aGlzLnNoYXBlQ29sb3IgPSB0aGlzLnJlZ2lvbkFwaS5nZXRTaGFwZUNvbG9yKCk7XG4gICAgdGhpcy5maWxsQ29sb3IgPSB0aGlzLnJlZ2lvbkFwaS5nZXRGaWxsQ29sb3IoKTtcblxuICAgIC8vIEFubm90YXRpb24tY2xhc3MgcHJlc2V0cyAoaml0LXVpIzcwKTogbWlycm9yIHRoZSBzZXQgZm9yIHRoZSBjaGlwIHN0cmlwLFxuICAgIC8vIHRoZSBDbGFzcyBkcm9wZG93biBhbmQgdGhlIG1hbmFnZSBkaWFsb2cuIEd1YXJkZWQgd2l0aCBvcHRpb25hbCBjYWxscyBzb1xuICAgIC8vIHBhcnRpYWwgQVBJIG1vY2tzIGluIHRlc3RzICh3aGljaCBvbWl0IHRoZSBwcmVzZXQgbWV0aG9kcykgZG9uJ3QgdGhyb3cuXG4gICAgY29uc3QgaW5pdGlhbFByZXNldHMgPSB0aGlzLnJlZ2lvbkFwaS5nZXRQcmVzZXRTZXQ/LigpO1xuICAgIGlmIChpbml0aWFsUHJlc2V0cykgdGhpcy5wcmVzZXRTZXQgPSBpbml0aWFsUHJlc2V0cztcbiAgICBjb25zdCBwcmVzZXRzJCA9IHRoaXMucmVnaW9uQXBpLmdldFByZXNldFNldCQ/LigpO1xuICAgIGlmIChwcmVzZXRzJCkge1xuICAgICAgcHJlc2V0cyQucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSkuc3Vic2NyaWJlKChzZXQpID0+IHtcbiAgICAgICAgaWYgKHNldCkgdGhpcy5wcmVzZXRTZXQgPSBzZXQ7XG4gICAgICAgIHRoaXMudHJlZUNvbG9yID0gKG5hbWU6IHN0cmluZyk6IHN0cmluZyA9PiBjb2xvckZvckxhYmVsKG5hbWUsIHRoaXMucHJlc2V0U2V0KTtcbiAgICAgICAgdGhpcy51cGRhdGVEaXNwbGF5Q2xhc3NlcygpO1xuICAgICAgICB0aGlzLnJlY29sb3IzZCgpO1xuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBTZWVkIGZyb20gdGhlIHZpc3VhbGl6ZXIncyBjdXJyZW50IHJlZ2lvbnMg4oCUIGFscmVhZHkgc2NvcGVkIHRvIHRoZVxuICAgIC8vIGFjdGl2ZSBpbWFnZSBieSB0aGUgcGVyLWltYWdlIGNhY2hlLCBhbmQgaGFuZGVkIGJhY2sgYXMgbmV1dHJhbCBSZWdpb25cbiAgICAvLyBvYmplY3RzIChubyBiYWNrZW5kIHNoYXBlIGZvcm1hdCBpbnZvbHZlZCkuXG4gICAgLy8gQW5ub3RhdGlvbiByZWdpb25zIG9ubHkg4oCUIGludGVuc2l0eS1wcm9maWxlIGxpbmVzIGFyZSBvd25lZCBieSB0aGVcbiAgICAvLyBpbnRlbnNpdHkgdG9vbCBhbmQgZXhjbHVkZWQgYnkgdGhlIGNvbnRyYWN0LCBzbyB0aGUgZWRpdG9yIG5ldmVyIHNlZXMgdGhlbS5cbiAgICB0aGlzLnJlZ2lvbnMgPSB0aGlzLmFwcGx5UmVnaW9uQ29sb3JzKHRoaXMucmVnaW9uQXBpLmdldEFubm90YXRpb25SZWdpb25zKCkpO1xuICAgIHRoaXMuc3luY0NsYXNzZXNGcm9tUmVnaW9ucyh0aGlzLnJlZ2lvbnMpO1xuICAgIHRoaXMucmVjb21wdXRlQ2xhc3NDb3VudHMoKTtcblxuICAgIC8vIFRoZSB1cGRhdGUgZXZlbnQgaXMganVzdCBhIGNoYW5nZSBzaWduYWw7IHJlLXJlYWQgdGhlIHJlZ2lvbnMgZnJvbSB0aGVcbiAgICAvLyB2aXN1YWxpemVyIHJhdGhlciB0aGFuIHBhcnNpbmcgd2hhdGV2ZXIgcGF5bG9hZCBpdCBjYXJyaWVzLlxuICAgIHRoaXMucmVnaW9uQXBpXG4gICAgICAuZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3VwZGF0aW5nRnJvbUVkaXRvcikgcmV0dXJuO1xuICAgICAgICBjb25zdCB1cGRhdGVkID0gdGhpcy5hcHBseVJlZ2lvbkNvbG9ycyh0aGlzLnJlZ2lvbkFwaS5nZXRBbm5vdGF0aW9uUmVnaW9ucygpKTtcbiAgICAgICAgLy8gcHJlc2VydmUgc2VsZWN0aW9uIGZvciByZWdpb25zIHRoYXQgc3RpbGwgZXhpc3QgKGJ5IGlkLCBzaW5jZSBuYW1lXG4gICAgICAgIC8vIGlzIGEgdXNlci1lZGl0YWJsZSBkaXNwbGF5IGxhYmVsIGFuZCBtYXkgY29sbGlkZSlcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJZHMgPSBuZXcgU2V0KHRoaXMuc2VsZWN0ZWRSZWdpb25zLm1hcCgocikgPT4gci5pZCkpO1xuICAgICAgICB0aGlzLnJlZ2lvbnMgPSB1cGRhdGVkO1xuICAgICAgICB0aGlzLnNlbGVjdGVkUmVnaW9ucyA9IHVwZGF0ZWQuZmlsdGVyKChyKSA9PiBzZWxlY3RlZElkcy5oYXMoci5pZCkpO1xuICAgICAgICB0aGlzLmNsYW1wUGFnaW5hdG9yRmlyc3QoKTtcbiAgICAgICAgdGhpcy5zeW5jQ2xhc3Nlc0Zyb21SZWdpb25zKHVwZGF0ZWQpO1xuICAgICAgICB0aGlzLnJlY29tcHV0ZUNsYXNzQ291bnRzKCk7XG4gICAgICAgIGlmICh0aGlzLnZvbHVtZVZpZXcpIHRoaXMucmVzZXRWb2x1bWVzKCk7XG4gICAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgICB2b2lkIHRoaXMucmVmcmVzaFNvdXJjZSgpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lvbkFwaVxuICAgICAgLmdldFJlZ2lvblNvdXJjZVZpZXckPy4oKVxuICAgICAgPy5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgodmlldykgPT4ge1xuICAgICAgICBpZiAodmlldz8uc291cmNlICE9PSB0aGlzLnNvdXJjZVZpZXc/LnNvdXJjZSkgdGhpcy5waWNrZWRDbGFzcyA9IG51bGw7XG4gICAgICAgIHRoaXMuc291cmNlVmlldyA9IHZpZXc7XG4gICAgICAgIHZvaWQgdGhpcy5yZWZyZXNoU291cmNlKCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMucmVnaW9uQXBpXG4gICAgICAuZ2V0UmVnaW9uU3R5bGUkPy4oKVxuICAgICAgPy5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoc3R5bGUpID0+IHtcbiAgICAgICAgdGhpcy5yZWdpb25zRmlsbGVkID0gc3R5bGUuZmlsbE9wYWNpdHkgPiAwO1xuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpb25BcGlcbiAgICAgIC5nZXRWb2x1bWVWaWV3JD8uKClcbiAgICAgID8ucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKHZvbHVtZSkgPT4ge1xuICAgICAgICBjb25zdCBjb3VudGluZyA9IHRoaXMuc3RhY2tDb3VudHM7XG4gICAgICAgIHRoaXMudm9sdW1lVmlldyA9IHZvbHVtZTtcbiAgICAgICAgdGhpcy5yZXNldFZvbHVtZXMoKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICAgIGlmICh0aGlzLnN0YWNrQ291bnRzICE9PSBjb3VudGluZykgdm9pZCB0aGlzLnJlZnJlc2hTb3VyY2UoKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpb25BcGlcbiAgICAgIC5nZXRSZWdpb25zVGhyb3VnaFZvbHVtZSQ/LigpXG4gICAgICA/LnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCh0aHJvdWdoKSA9PiB7XG4gICAgICAgIHRoaXMucmVnaW9uc1Rocm91Z2hWb2x1bWUgPSB0aHJvdWdoO1xuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpb25BcGlcbiAgICAgIC5nZXRTbGljZUVkaXRvciQ/LigpXG4gICAgICA/LnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChwYW5lKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvdW50aW5nID0gdGhpcy5zdGFja0NvdW50cztcbiAgICAgICAgdGhpcy5zbGljZVBhbmUgPSBwYW5lO1xuICAgICAgICBpZiAodGhpcy5zdGFja0NvdW50cyAhPT0gY291bnRpbmcpIHZvaWQgdGhpcy5yZWZyZXNoU291cmNlKCk7XG4gICAgICB9KTtcblxuICAgIC8vIFdoYXQgaXMgc2hvd24gaW4gM0Q6IHRoZSByb3V0ZXIgY2xlYXJzIGl0IHdoZW4gYW5vdGhlciBpbWFnZSBpcyBwbG90dGVkLlxuICAgIHRoaXMucmVnaW9uQXBpXG4gICAgICAuZ2V0UmVnaW9uQ2xhc3NlczNkJD8uKClcbiAgICAgID8ucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKGdyb3VwcykgPT4ge1xuICAgICAgICB0aGlzLnNob3duM2QgPSBuZXcgTWFwKGdyb3Vwcy5tYXAoKGcpID0+IFtnLmtleSwgWy4uLmcuY2xhc3Nlc11dKSk7XG4gICAgICAgIHRoaXMuc2hvd24zZE5hbWVzID0gbmV3IFNldCh0aGlzLnNob3duM2Qua2V5cygpKTtcbiAgICAgICAgdGhpcy5oaWdobGlnaHRlZDNkID0gJyc7XG4gICAgICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uSGlnaGxpZ2h0KCk7XG4gICAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lvbkFwaVxuICAgICAgLmdldEhpZGRlbkNsYXNzZXMkPy4oKVxuICAgICAgPy5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoaGlkZGVuKSA9PiB7XG4gICAgICAgIHRoaXMuaGlkZGVuQ2xhc3NlcyA9IGhpZGRlbjtcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICB9KTtcblxuICAgIC8vIEEgc3VyZmFjZSBjbGlja2VkIGluIHRoZSB2b2x1bWUgdmlldyAod2l0aCB0aGUgc2VsZWN0aW9uIHRvb2wpIHBpY2tzIGl0cyBjbGFzcy5cbiAgICB0aGlzLnJlZ2lvbkFwaVxuICAgICAgLmdldFJlZ2lvblBpY2tlZDNkJD8uKClcbiAgICAgID8ucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKHsga2V5LCBhZGRpdGl2ZSB9KSA9PiB0aGlzLm9uUGlja2VkM2Qoa2V5LCBhZGRpdGl2ZSkpO1xuXG4gICAgLy8gQW5vdGhlciBzZWxlY3Rpb24gcmVwbGFjZWQgdGhlIGNsYXNzIHRyZWUncyBwaWNrIChhIHJlZ2lvbiBkcmF3biBvciBjbGlja2VkIG9uIHRoZSBjYW52YXMpLlxuICAgIHRoaXMucmVnaW9uQXBpXG4gICAgICAuZ2V0UGlja2VkUmVnaW9uQ2xhc3NlcyQ/LigpXG4gICAgICA/LnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChjbGFzc2VzKSA9PiB7XG4gICAgICAgIGlmIChjbGFzc2VzLmxlbmd0aCB8fCAhdGhpcy5waWNrZWRDbGFzc2VzLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICB0aGlzLnBpY2tlZENsYXNzID0gbnVsbDtcbiAgICAgICAgdGhpcy5waWNrZWRDbGFzc2VzID0gW107XG4gICAgICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uSGlnaGxpZ2h0KCk7XG4gICAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnBlcnNpc3RlbmNlXG4gICAgICAuZmlsZUV4aXN0cyh0aGlzLnNhdmVBc0NoZWNrJClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoZXhpc3RzKSA9PiB7XG4gICAgICAgIHRoaXMuc2F2ZUFzRmlsZUV4aXN0cyA9IGV4aXN0cztcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICB9KTtcblxuICAgIC8vIFBoeXNpY2FsIHBpeGVsIHNpemUgb2YgdGhlIGFjdGl2ZSBpbWFnZSAoZm9yIHJlZ2lvbiBhcmVhcyBpbiDCtW3Csi9tbcKyKS5cbiAgICB0aGlzLnJlZ2lvbkFwaVxuICAgICAgLmdldEltYWdlTWV0YSgpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKG1ldGEpID0+IHtcbiAgICAgICAgdGhpcy5tcHAgPSBwaWNrTXBwKG1ldGEpO1xuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpb25BcGlcbiAgICAgIC5nZXRTZWxlY3RlZFJlZ2lvbnMkKClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoc2VsZWN0ZWQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3N1cHByZXNzU2VsZWN0aW9uU3luY1RvUGxvdCkgcmV0dXJuO1xuICAgICAgICAvLyBNYXAgdGhlIGNvbnRyYWN0J3Mgc2VsZWN0ZWQgcmVnaW9ucyB0byB0aGUgZWRpdG9yJ3Mgb3duIGluc3RhbmNlcyBieSBpZC5cbiAgICAgICAgY29uc3QgbmV4dCA9IHNlbGVjdGVkLm1hcCgocykgPT4gdGhpcy5yZWdpb25zLmZpbmQoKHIpID0+IHIuaWQgPT09IHMuaWQpKS5maWx0ZXIoKHIpOiByIGlzIFJlZ2lvbiA9PiAhIXIpO1xuICAgICAgICBjb25zdCBzYW1lID1cbiAgICAgICAgICBuZXh0Lmxlbmd0aCA9PT0gdGhpcy5zZWxlY3RlZFJlZ2lvbnMubGVuZ3RoICYmXG4gICAgICAgICAgbmV4dC5ldmVyeSgociwgaSkgPT4gci5pZCA9PT0gdGhpcy5zZWxlY3RlZFJlZ2lvbnNbaV0/LmlkKTtcbiAgICAgICAgaWYgKCFzYW1lKSB0aGlzLnNlbGVjdGVkUmVnaW9ucyA9IG5leHQ7XG4gICAgICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uSGlnaGxpZ2h0KCk7XG4gICAgICAgIC8vIFNjcm9sbCB0aGUgcGFnaW5hdG9yIHNvIHRoZSBtb3N0LXJlY2VudGx5LXNlbGVjdGVkIHJvdyBpcyB2aXNpYmxlLlxuICAgICAgICBpZiAobmV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgbGFzdElkeCA9IHRoaXMucmVnaW9ucy5maW5kSW5kZXgoKHIpID0+IHIuaWQgPT09IG5leHRbbmV4dC5sZW5ndGggLSAxXS5pZCk7XG4gICAgICAgICAgaWYgKGxhc3RJZHggPj0gMCkge1xuICAgICAgICAgICAgY29uc3QgcGFnZVN0YXJ0ID0gTWF0aC5mbG9vcihsYXN0SWR4IC8gdGhpcy5wYWdpbmF0b3JSb3dzKSAqIHRoaXMucGFnaW5hdG9yUm93cztcbiAgICAgICAgICAgIGlmIChwYWdlU3RhcnQgIT09IHRoaXMucGFnaW5hdG9yRmlyc3QpIHRoaXMucGFnaW5hdG9yRmlyc3QgPSBwYWdlU3RhcnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgfSk7XG4gIH1cblxuICAvKiogQ2FuY2VscyBhIHJ1bm5pbmcgR2VvSlNPTiBzYXZlIChhYm9ydHMgaXRzIHVwbG9hZCkgYW5kIG1hc2sgZXhwb3J0ICh0ZXJtaW5hdGVzXG4gICAqICBpdHMgd29ya2VyKTsgdGhlIEFQSSBzdWJzY3JpcHRpb25zIGVuZCB0aHJvdWdoIGB0YWtlVW50aWxEZXN0cm95ZWRgLiAqL1xuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9zYXZlQXNTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5tYXNrSm9iPy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRhYmxlIOKGkiBQbG90OiBQcmltZU5HIGZpcmVzIG9uUm93U2VsZWN0L29uUm93VW5zZWxlY3QgYWZ0ZXIgdXBkYXRpbmdcbiAgICogYHNlbGVjdGVkUmVnaW9uc2AuIFB1c2ggdGhlIHNlbGVjdGVkIHJlZ2lvbnMgdG8gdGhlIGNvbnRyYWN0IGJ5IGlkZW50aXR5IOKAlFxuICAgKiB0aGUgcGFja2FnZSBtYXBzIHRoZW0gdG8gaXRzIGludGVybmFsIGluZGV4IHNwYWNlICh3aGljaCBpbmNsdWRlcyB0aGVcbiAgICogaW50ZW5zaXR5LXByb2ZpbGUgbGluZXMgdGhlIGVkaXRvciBuZXZlciBzZWVzKS5cbiAgICovXG4gIHByb3RlY3RlZCBvblNlbGVjdGlvbkNoYW5nZWQoKSB7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkUmVnaW9ucyA/PyBbXTtcbiAgICAvLyBSb3dzIHBpY2tlZCBpbiB0aGUgdGFibGUgcmVwbGFjZSB0aGUgY2xhc3MgdHJlZSdzIHBpY2suXG4gICAgdGhpcy5waWNrZWRDbGFzc2VzID0gW107XG4gICAgdGhpcy51cGRhdGVTZWxlY3Rpb25IaWdobGlnaHQoKTtcbiAgICBjb25zdCBmcm9tU291cmNlID0gc2VsZWN0ZWQuZmlsdGVyKChyKSA9PiB0aGlzLnN0YW5kSW5zLmhhcyhyKSk7XG4gICAgdGhpcy5fc3VwcHJlc3NTZWxlY3Rpb25TeW5jVG9QbG90ID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5yZWdpb25BcGkuc2V0U2VsZWN0ZWRSZWdpb25zKHNlbGVjdGVkLmZpbHRlcigocikgPT4gIXRoaXMuc3RhbmRJbnMuaGFzKHIpKSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX3N1cHByZXNzU2VsZWN0aW9uU3luY1RvUGxvdCA9IGZhbHNlO1xuICAgIH1cbiAgICAvLyBBIHNlbGVjdGVkIHNvdXJjZSByb3cgaXMgdGFrZW4gaW50byB0aGUgcmVnaW9ucyAoYW5kIHNvIHNlbGVjdGVkIG9uIHRoZSBpbWFnZSB0b28pLlxuICAgIGlmIChmcm9tU291cmNlLmxlbmd0aCkgdm9pZCB0aGlzLnJlZ2lvbkFwaS5zZWxlY3RTb3VyY2VGZWF0dXJlcz8uKHRoaXMuc291cmNlSWRzKGZyb21Tb3VyY2UpLCB0cnVlKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUaGUgcmVnaW9uIHNvdXJjZSdzIGZlYXR1cmVzIGFzIHRhYmxlIHJvd3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFdoZXRoZXIgdGhlIHNsaWNlIGhhcyBhIHJlZ2lvbiBzb3VyY2U6IGl0IHRoZW4gaGFzIHJlZ2lvbnMgdG8gc2F2ZSBldmVuIHdpdGggYW4gZW1wdHkgdGFibGUuICovXG4gIHByb3RlY3RlZCBnZXQgaGFzUmVnaW9uU291cmNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuc291cmNlVmlldztcbiAgfVxuXG4gIC8qKiBSb3dzIGluIHRoZSB0YWJsZTogdGhlIHJlZ2lvbnMsIHRoZW4gdGhlIGZlYXR1cmVzIHN0aWxsIGluIHRoZSByZWdpb24gc291cmNlLiAqL1xuICBwcm90ZWN0ZWQgZ2V0IHRhYmxlVG90YWwoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25zLmxlbmd0aCArIHRoaXMuc291cmNlVG90YWw7XG4gIH1cblxuICAvKiogVGhlIGNsYXNzIGhpZXJhcmNoeSBvZiB0aGUgc2xpY2UncyByZWdpb24gc291cmNlLCB3aGVuIGl0IGhhcyBvbmUgKHRoZSBjbGFzc2VzIGFzIGEgdHJlZSkuICovXG4gIHByb3RlY3RlZCBnZXQgY2xhc3NIaWVyYXJjaHkoKTogUmVnaW9uQ2xhc3NOb2RlW10gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2VWaWV3Py5zb3VyY2UuaW5mby5oaWVyYXJjaHkgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIGByb3dgIGlzIGEgcmVnaW9uLXNvdXJjZSBmZWF0dXJlJ3Mgc3RhbmQtaW4gcmF0aGVyIHRoYW4gYSByZWdpb24uICovXG4gIHByb3RlY3RlZCBpc1NvdXJjZVJvdyhyb3c6IFJlZ2lvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN0YW5kSW5zLmhhcyhyb3cpO1xuICB9XG5cbiAgcHJpdmF0ZSBzb3VyY2VJZHMocm93czogUmVnaW9uW10pOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHJvd3MubWFwKChyKSA9PiByLnNvdXJjZUlkKS5maWx0ZXIoKGlkKTogaWQgaXMgc3RyaW5nID0+ICEhaWQpO1xuICB9XG5cbiAgLyoqIEEgdGFibGUgcm93IGZvciBhIHNvdXJjZSBmZWF0dXJlOiBubyBnZW9tZXRyeSB1bnRpbCBpdCBpcyB0YWtlbi4gKi9cbiAgcHJpdmF0ZSBzdGFuZEluKHJvdzogUmVnaW9uSW5kZXhSb3cpOiBSZWdpb24ge1xuICAgIGNvbnN0IHIgPSBPYmplY3QuYXNzaWduKG5ldyBSZWdpb24oKSwge1xuICAgICAgaWQ6IC0rK3RoaXMuc3RhbmRJblNlcSxcbiAgICAgIG5hbWU6IHJvdy5sYWJlbCA/PyByb3cuaWQsXG4gICAgICBsYWJlbDogcm93LmxhYmVsID8/IHVuZGVmaW5lZCxcbiAgICAgIGNvbG9yOiB0aGlzLnNvdXJjZVZpZXc/LmNvbG9yT2Yocm93KSA/PyByb3cuY29sb3IgPz8gdGhpcy5zaGFwZUNvbG9yLFxuICAgICAgc291cmNlSWQ6IHJvdy5pZCxcbiAgICAgIHNvdXJjZUFyZWE6IHJvdy5hcmVhLFxuICAgICAgYm91bmRzOiBudWxsLFxuICAgIH0pO1xuICAgIHRoaXMuc3RhbmRJbnMuYWRkKHIpO1xuICAgIHJldHVybiByO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlLXJlYWQgdGhlIHNvdXJjZSBwYXJ0IG9mIHRoZSB0YWJsZSAodGhlIHN0YW5kLWlucyBvbiB0aGUgY3VycmVudCBwYWdlLCB0aGUgY291bnQpIGFuZCB0aGVcbiAgICogc291cmNlJ3MgY2xhc3MgY291bnRzLiBUaGUgcGFnZSBob2xkcyByZWdpb25zIGZpcnN0LCBzbyBpdHMgc291cmNlIHJvd3Mgc3RhcnQgYXRcbiAgICogYG1heChmaXJzdCwgcmVnaW9ucylgIOKIkiByZWdpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoU291cmNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5pc0FjdGl2ZSkgcmV0dXJuO1xuICAgIGNvbnN0IHJlcXVlc3QgPSArK3RoaXMuc291cmNlUmVxdWVzdDtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5zb3VyY2VWaWV3O1xuICAgIGxldCByb3dzOiBSZWdpb25JbmRleFJvd1tdID0gW107XG4gICAgbGV0IHRvdGFsID0gMDtcbiAgICBsZXQgY291bnRzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgaWYgKHZpZXcgJiYgdGhpcy5yZWdpb25BcGkuZ2V0UmVnaW9uU291cmNlSW5kZXgpIHtcbiAgICAgIGNvbnN0IG93biA9IHRoaXMucmVnaW9ucy5sZW5ndGg7XG4gICAgICBjb25zdCBzdGFydCA9IE1hdGgubWF4KHRoaXMucGFnaW5hdG9yRmlyc3QsIG93bik7XG4gICAgICBjb25zdCBsaW1pdCA9IE1hdGgubWF4KDAsIHRoaXMucGFnaW5hdG9yRmlyc3QgKyB0aGlzLnBhZ2luYXRvclJvd3MgLSBzdGFydCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBbcGFnZSwgcGVyQ2xhc3NdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIHRoaXMucmVnaW9uQXBpLmdldFJlZ2lvblNvdXJjZUluZGV4KHsgb2Zmc2V0OiBzdGFydCAtIG93biwgbGltaXQgfSksXG4gICAgICAgICAgdGhpcy5yZWdpb25BcGkuZ2V0UmVnaW9uU291cmNlQ2xhc3NDb3VudHM/Lih0aGlzLnN0YWNrQ291bnRzKSxcbiAgICAgICAgXSk7XG4gICAgICAgIHJvd3MgPSBwYWdlPy5yb3dzID8/IFtdO1xuICAgICAgICB0b3RhbCA9IHBhZ2U/LnRvdGFsID8/IDA7XG4gICAgICAgIGNvdW50cyA9IHBlckNsYXNzID8/IHt9O1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW3JlZ2lvbnNdIGNvdWxkIG5vdCBsaXN0IHRoZSByZWdpb24gc291cmNlJywgZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlcXVlc3QgIT09IHRoaXMuc291cmNlUmVxdWVzdCkgcmV0dXJuO1xuICAgIHRoaXMuc291cmNlVG90YWwgPSB0b3RhbDtcbiAgICB0aGlzLnNvdXJjZVJvd3MgPSByb3dzLm1hcCgocikgPT4gdGhpcy5zdGFuZEluKHIpKTtcbiAgICB0aGlzLnNvdXJjZUNsYXNzQ291bnRzID0gY291bnRzO1xuICAgIHRoaXMucmVjb21wdXRlQ2xhc3NDb3VudHMoKTtcbiAgICB0aGlzLmNoYW5nZWQoKTtcbiAgfVxuXG4gIC8qKiBUYWtlIGEgc291cmNlIHJvdydzIGZlYXR1cmUgaW50byB0aGUgcmVnaW9ucywgdGhlbiBydW4gYHRoZW5gIG9uIHRoZSByZWdpb24gaXQgYmVjYW1lLiAqL1xuICBwcml2YXRlIGFzeW5jIHRha2VUaGVuKHJvdzogUmVnaW9uLCB0aGVuOiAocmVnaW9uOiBSZWdpb24pID0+IHZvaWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBbaWRdID0gKGF3YWl0IHRoaXMucmVnaW9uQXBpLnNlbGVjdFNvdXJjZUZlYXR1cmVzPy4odGhpcy5zb3VyY2VJZHMoW3Jvd10pKSkgPz8gW107XG4gICAgY29uc3QgcmVnaW9uID0gdGhpcy5yZWdpb25zLmZpbmQoKHIpID0+IHIuaWQgPT09IGlkKTtcbiAgICBpZiAocmVnaW9uKSB0aGVuKHJlZ2lvbik7XG4gIH1cblxuICAvKiogVG9nZ2xlIHRoZSBmaWxsZWQgKGF0bGFzKSBsb29rOiBlYWNoIHJlZ2lvbiBmaWxsZWQgaW4gaXRzIGNvbG91ciwgbGFiZWxzIGluc2lkZS4gKi9cbiAgLyoqIEluIGEgdm9sdW1lIHZpZXc6IHRoZSByZWdpb25zIGRyYXduIHRocm91Z2ggdGhlIHZvbHVtZSwgb3IgaGlkZGVuIGJlaGluZCB3aGF0IGl0IHNob3dzLiAqL1xuICBwcm90ZWN0ZWQgdG9nZ2xlVGhyb3VnaFZvbHVtZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkFwaS5zZXRSZWdpb25zVGhyb3VnaFZvbHVtZT8uKCF0aGlzLnJlZ2lvbnNUaHJvdWdoVm9sdW1lKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0b2dnbGVGaWxsKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQXBpLnNldFJlZ2lvblN0eWxlPy4oeyBmaWxsT3BhY2l0eTogdGhpcy5yZWdpb25zRmlsbGVkID8gMCA6IFJFR0lPTl9GSUxMX09QQUNJVFkgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2hvdyBvciBoaWRlIGEgY2xhc3MgaW4gdGhlIHZvbHVtZSB2aWV3IGFzIGEgM0QgcmVjb25zdHJ1Y3Rpb24g4oCUIGEgdHJlZSBub2RlIHdpdGggZXZlcnkgY2xhc3NcbiAgICogdW5kZXIgaXQsIGFzIG9uZSBzdXJmYWNlIGluIGl0cyBjb2xvdXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgdG9nZ2xlQ2xhc3MzZChuYW1lOiBzdHJpbmcsIGNsYXNzZXM6IHN0cmluZ1tdID0gW25hbWVdKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IG5ldyBNYXAodGhpcy5zaG93bjNkKTtcbiAgICBpZiAobmV4dC5oYXMobmFtZSkpIG5leHQuZGVsZXRlKG5hbWUpO1xuICAgIGVsc2UgbmV4dC5zZXQobmFtZSwgY2xhc3Nlcyk7XG4gICAgdGhpcy5zaG93bjNkID0gbmV4dDtcbiAgICB0aGlzLnNob3duM2ROYW1lcyA9IG5ldyBTZXQobmV4dC5rZXlzKCkpO1xuICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgIHRoaXMuc2hvdzNkKHRoaXMuZ3JvdXBzM2QoKSk7XG4gICAgdGhpcy51cGRhdGVTZWxlY3Rpb25IaWdobGlnaHQoKTtcbiAgfVxuXG4gIC8qKiBIaWRlIChvciBzaG93IGFnYWluKSB0aGVzZSBjbGFzc2VzJyByZWdpb25zLCB3aGVyZXZlciB0aGV5IGFyZSBkcmF3bi4gKi9cbiAgcHJvdGVjdGVkIHNldENsYXNzZXNIaWRkZW4oY2xhc3NlczogcmVhZG9ubHkgc3RyaW5nW10sIGhpZGRlbjogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQXBpLnNldENsYXNzZXNIaWRkZW4/LihjbGFzc2VzLCBoaWRkZW4pO1xuICB9XG5cbiAgLyoqIFRoZSBzdXJmYWNlcyBzaG93biBpbiAzRCwgaW4gdGhlaXIgY2xhc3NlcycgY29sb3VycyBub3cuICovXG4gIHByaXZhdGUgZ3JvdXBzM2QoKTogQXJyYXk8eyBrZXk6IHN0cmluZzsgY2xhc3Nlczogc3RyaW5nW107IGNvbG9yOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IHRpdGxlcyA9IG5ldyBNYXAoKHRoaXMuY2xhc3NIaWVyYXJjaHkgPz8gW10pLm1hcCgobikgPT4gW24ubmFtZSwgbi50aXRsZV0pKTtcbiAgICByZXR1cm4gWy4uLnRoaXMuc2hvd24zZF0ubWFwKChba2V5LCBjbGFzc2VzXSkgPT4ge1xuICAgICAgY29uc3QgdGl0bGUgPSB0aXRsZXMuZ2V0KGtleSk7XG4gICAgICByZXR1cm4geyBrZXksIGNsYXNzZXMsIGNvbG9yOiB0aGlzLnRyZWVDb2xvcihrZXkpLCBsYWJlbDogdGl0bGUgPyBgJHtrZXl9IMK3ICR7dGl0bGV9YCA6IGtleSB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFRoZSBjbGFzc2VzIHNlbGVjdGVkIG5vdzogdGhlIGNsYXNzIHRyZWUncyBwaWNrICh3aXRoIGl0cyBzdWJ0cmVlKSBhbmQgdGhlIHNlbGVjdGVkIHJvd3MnLiAqL1xuICBwcml2YXRlIHNlbGVjdGVkQ2xhc3NOYW1lcygpOiBTZXQ8c3RyaW5nPiB7XG4gICAgY29uc3QgbmFtZXMgPSBuZXcgU2V0KHRoaXMucGlja2VkQ2xhc3Nlcyk7XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuc2VsZWN0ZWRSZWdpb25zID8/IFtdKSBpZiAoci5sYWJlbCkgbmFtZXMuYWRkKHIubGFiZWwpO1xuICAgIHJldHVybiBuYW1lcztcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWdobGlnaHQsIGluIHRoZSB2b2x1bWUgdmlldywgdGhlIHN1cmZhY2VzIGhvbGRpbmcgYSBzZWxlY3RlZCBjbGFzcyAoZm9jdXMgKyBjb250ZXh0OiB0aGV5XG4gICAqIHR1cm4gbmVhciBvcGFxdWUsIHRoZSBvdGhlcnMgZmFkZSksIGFuZCBtYXJrIHRoZSBzZWxlY3RlZCByb3dzJyBjbGFzc2VzIGluIHRoZSBjbGFzcyBsaXN0cy5cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlU2VsZWN0aW9uSGlnaGxpZ2h0KCk6IHZvaWQge1xuICAgIGNvbnN0IG5hbWVzID0gdGhpcy5zZWxlY3RlZENsYXNzTmFtZXMoKTtcbiAgICBjb25zdCBtYXJrZWQgPSBuZXcgU2V0KCh0aGlzLnNlbGVjdGVkUmVnaW9ucyA/PyBbXSkubWFwKChyKSA9PiByLmxhYmVsKS5maWx0ZXIoKGwpOiBsIGlzIHN0cmluZyA9PiAhIWwpKTtcbiAgICBpZiAoWy4uLm1hcmtlZF0uam9pbignXFxuJykgIT09IFsuLi50aGlzLm1hcmtlZENsYXNzZXNdLmpvaW4oJ1xcbicpKSB0aGlzLm1hcmtlZENsYXNzZXMgPSBtYXJrZWQ7XG4gICAgY29uc3Qga2V5cyA9IFsuLi50aGlzLnNob3duM2RdLmZpbHRlcigoWywgY2xhc3Nlc10pID0+IGNsYXNzZXMuc29tZSgoYykgPT4gbmFtZXMuaGFzKGMpKSkubWFwKChba10pID0+IGspO1xuICAgIGNvbnN0IGlkID0ga2V5cy5qb2luKCdcXG4nKTtcbiAgICBpZiAoaWQgPT09IHRoaXMuaGlnaGxpZ2h0ZWQzZCkgcmV0dXJuO1xuICAgIHRoaXMuaGlnaGxpZ2h0ZWQzZCA9IGlkO1xuICAgIHRoaXMucmVnaW9uQXBpLmhpZ2hsaWdodFJlZ2lvbkNsYXNzZXMzZD8uKGtleXMpO1xuICB9XG5cbiAgLyoqIEEgc3VyZmFjZSBjbGlja2VkIGluIHRoZSB2b2x1bWUgdmlldzogcGljayBpdHMgY2xhc3MgYXMgdGhlIHRyZWUgd291bGQ7IGJlc2lkZSB0aGVtLCBjbGVhci4gKi9cbiAgcHJpdmF0ZSBvblBpY2tlZDNkKGtleTogc3RyaW5nIHwgbnVsbCwgYWRkaXRpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoa2V5ID09PSBudWxsKSB7XG4gICAgICBpZiAoYWRkaXRpdmUpIHJldHVybjtcbiAgICAgIHRoaXMucGlja2VkQ2xhc3MgPSBudWxsO1xuICAgICAgdGhpcy5waWNrZWRDbGFzc2VzID0gW107XG4gICAgICB0aGlzLnNlbGVjdGVkUmVnaW9ucyA9IFtdO1xuICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZWQoKTtcbiAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2b2lkIHRoaXMucGlja0NsYXNzZXMoeyBuYW1lOiBrZXksIGNsYXNzZXM6IHRoaXMuc2hvd24zZC5nZXQoa2V5KSA/PyBba2V5XSwgYWRkaXRpdmUgfSk7XG4gIH1cblxuICAvKiogQSBjbGFzcyBjb2xvdXIgY2hhbmdlZCAoaXRzIHN3YXRjaCwgb3IgTWFuYWdlKTogcmVwYWludCB0aGUgc3VyZmFjZXMgc2hvd24gaW4gM0Qgd2hvc2UgY29sb3VyIGl0IGNoYW5nZWQuICovXG4gIHByaXZhdGUgcmVjb2xvcjNkKCk6IHZvaWQge1xuICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMuZ3JvdXBzM2QoKTtcbiAgICBpZiAoIWdyb3Vwcy5zb21lKChnKSA9PiBnLmNvbG9yICE9PSB0aGlzLmNvbG9yczNkLmdldChnLmtleSkpKSByZXR1cm47XG4gICAgdGhpcy5zaG93M2QoZ3JvdXBzKTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdzNkKGdyb3VwczogQXJyYXk8eyBrZXk6IHN0cmluZzsgY2xhc3Nlczogc3RyaW5nW107IGNvbG9yOiBzdHJpbmcgfT4pOiB2b2lkIHtcbiAgICB0aGlzLmNvbG9yczNkID0gbmV3IE1hcChncm91cHMubWFwKChnKSA9PiBbZy5rZXksIGcuY29sb3JdKSk7XG4gICAgdGhpcy5yZWdpb25BcGkuc2hvd1JlZ2lvbkNsYXNzZXMzZD8uKGdyb3VwcykuY2F0Y2goKGVycikgPT4ge1xuICAgICAgdGhpcy50b2FzdCgnZXJyb3InLCAnQ291bGQgbm90IHNob3cgdGhlIHJlZ2lvbiBpbiAzRCcsIGAkeyhlcnIgYXMgRXJyb3IpPy5tZXNzYWdlID8/IGVycn1gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBQaWNrIGEgY2xhc3MgaW4gdGhlIGNsYXNzIHRyZWU6IHNlbGVjdCBpdHMgcmVnaW9ucyBhbmQgaXRzIHN1YmNsYXNzZXMnLCB0aGUgc291cmNlJ3MgdGFrZW4uICovXG4gIHByb3RlY3RlZCBhc3luYyBwaWNrQ2xhc3NlcyhwaWNrOiBDbGFzc1RyZWVQaWNrKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5waWNrZWRDbGFzcyA9IHBpY2submFtZTtcbiAgICB0aGlzLnBpY2tlZENsYXNzZXMgPSBwaWNrLmFkZGl0aXZlID8gWy4uLm5ldyBTZXQoWy4uLnRoaXMucGlja2VkQ2xhc3NlcywgLi4ucGljay5jbGFzc2VzXSldIDogcGljay5jbGFzc2VzO1xuICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uSGlnaGxpZ2h0KCk7XG4gICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgYXdhaXQgdGhpcy5yZWdpb25BcGkuc2VsZWN0UmVnaW9uQ2xhc3Nlcz8uKHBpY2suY2xhc3NlcywgcGljay5hZGRpdGl2ZSk7XG4gIH1cblxuICAvKipcbiAgICogUm93cyBmb3IgcmVnaW9ucyBjb21pbmcgZnJvbSB0aGUgdmlzdWFsaXplcjogbmV1dHJhbCBgUmVnaW9uYHMgd2l0aCBib3VuZHMsXG4gICAqIGNvbG91ciBhbmQgbGFiZWwgYWxyZWFkeSBwb3B1bGF0ZWQuIEEgcmVnaW9uIHdpdGhvdXQgYSBjb2xvdXIgaXMgc2hvd24gd2l0aFxuICAgKiBpdHMgY2xhc3NpZmljYXRpb24gY29sb3VyIChvciB0aGUgZGVmYXVsdCBzaGFwZSBjb2xvdXIpIOKAlCBhcyBhIGNvcHk6IHRoZVxuICAgKiBzdG9yZSdzIGluc3RhbmNlcyBhcmUgc2hhcmVkIHdpdGggaXRzIHVuZG8gaGlzdG9yeSBhbmQgbXVzdCBub3QgYmUgY2hhbmdlZFxuICAgKiBpbiBwbGFjZSAoUlQtMSkuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5UmVnaW9uQ29sb3JzKHJlZ2lvbnM6IFJlZ2lvbltdKTogUmVnaW9uW10ge1xuICAgIGNvbnN0IGNsYXNzQ29sb3JzID0gdGhpcy5yZWdpb25BcGkuZ2V0Q2xhc3NpZmljYXRpb25Db2xvcnMoKTtcbiAgICByZXR1cm4gcmVnaW9ucy5tYXAoKHJlZ2lvbikgPT5cbiAgICAgIHJlZ2lvbi5jb2xvclxuICAgICAgICA/IHJlZ2lvblxuICAgICAgICA6IHdpdGhSZWdpb25QYXRjaChyZWdpb24sIHsgY29sb3I6IGNsYXNzQ29sb3JzLmdldChyZWdpb24ubGFiZWwgPz8gJycpIHx8IHRoaXMuc2hhcGVDb2xvciB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBlZGl0b3IncyBvbmUgd3JpdGUgcGF0aCAoUlQtMSk6IG1ha2UgYG5leHRgIHRoZSB0YWJsZSdzIHJvd3MgYW5kIGNvbW1pdFxuICAgKiB0aGVtIHRvIHRoZSBzdG9yZSDigJQgbGl2ZSwgYXMgb25lIHVuZG9hYmxlIHN0ZXAgKGlzUmVnaW9uU2F2ZU9uPXRydWU7IHRoZVxuICAgKiByb3V0ZXIga2VlcHMgdGhlIGludGVuc2l0eS1wcm9maWxlIGxpbmVzKS4gUm93cyBhcmUgdGhlIHN0b3JlJ3MgaW5zdGFuY2VzLFxuICAgKiBzbyBhbiBlZGl0IHBhc3NlcyBjb3BpZXMgKHtAbGluayBwYXRjaFJlZ2lvbnN9KSwgbmV2ZXIgY2hhbmdlZCByb3dzLiBUaGVcbiAgICogcmVzdWx0aW5nIHJlZ2lvbi11cGRhdGUgZXZlbnQgaXMgaWdub3JlZCAoYF91cGRhdGluZ0Zyb21FZGl0b3JgKSwgc28gdGhlXG4gICAqIGNsYXNzIGxpc3QgYW5kIGNvdW50cyBhcmUgcmVmcmVzaGVkIGhlcmUgKGEgdHlwZWQgY2xhc3MgaXMgYWRkZWQ7IGppdC11aSM3MCkuXG4gICAqL1xuICBwcml2YXRlIGNvbW1pdChuZXh0OiBSZWdpb25bXSA9IHRoaXMucmVnaW9ucyk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9ucyA9IG5leHQ7XG4gICAgdGhpcy5fdXBkYXRpbmdGcm9tRWRpdG9yID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5yZWdpb25BcGkuc2V0QW5ub3RhdGlvblJlZ2lvbnMobmV4dCwgdGhpcy5zaG93U2hhcGVMYWJlbCwgdHJ1ZSwgdGhpcy5maWxsQ29sb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl91cGRhdGluZ0Zyb21FZGl0b3IgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5zeW5jQ2xhc3Nlc0Zyb21SZWdpb25zKG5leHQpO1xuICAgIHRoaXMucmVjb21wdXRlQ2xhc3NDb3VudHMoKTtcbiAgICB0aGlzLmNoYW5nZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5LW9uLXdyaXRlIGVkaXQgKHJldmlldyBSVC0xKS4gVGhlIGVkaXRvcidzIHJvd3MgYXJlIHRoZSByZWdpb24gc3RvcmUnc1xuICAgKiBsaXZlIGluc3RhbmNlcywgYW5kIHRoZSBzdG9yZSB0YWtlcyBpdHMgdW5kbyBzbmFwc2hvdCBvbmx5IHdoZW4gdGhlIGVkaXQgaXNcbiAgICogY29tbWl0dGVkIOKAlCBzbyBhbiBlZGl0IG11c3QgcmVwbGFjZSBhIHJlZ2lvbiB3aXRoIGEgcGF0Y2hlZCBjb3B5IChhbmQgYW55XG4gICAqIGJvdW5kcyBpdCBjaGFuZ2VzIHdpdGggbmV3IGJvdW5kcyksIG5ldmVyIG11dGF0ZSB0aGUgaW5zdGFuY2UgdGhlIHN0b3JlXG4gICAqIGhvbGRzLiBSZXR1cm5zIHRoZSBjb3BpZXMgYnkgb3JpZ2luYWw7IHRoZSBzZWxlY3Rpb24gYW5kIGFuIG9wZW4gbGFiZWwgZWRpdFxuICAgKiBmb2xsb3cgdGhlbS5cbiAgICovXG4gIHByaXZhdGUgcGF0Y2hSZWdpb25zKHBhdGNoRm9yOiAocjogUmVnaW9uKSA9PiBQYXJ0aWFsPFJlZ2lvbj4gfCBudWxsKTogTWFwPFJlZ2lvbiwgUmVnaW9uPiB7XG4gICAgY29uc3QgY29waWVzID0gbmV3IE1hcDxSZWdpb24sIFJlZ2lvbj4oKTtcbiAgICB0aGlzLnJlZ2lvbnMgPSB0aGlzLnJlZ2lvbnMubWFwKChyKSA9PiB7XG4gICAgICBjb25zdCBwYXRjaCA9IHBhdGNoRm9yKHIpO1xuICAgICAgaWYgKCFwYXRjaCkgcmV0dXJuIHI7XG4gICAgICBjb25zdCBjb3B5ID0gd2l0aFJlZ2lvblBhdGNoKHIsIHBhdGNoKTtcbiAgICAgIGNvcGllcy5zZXQociwgY29weSk7XG4gICAgICByZXR1cm4gY29weTtcbiAgICB9KTtcbiAgICBpZiAoY29waWVzLnNpemUpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSZWdpb25zID0gKHRoaXMuc2VsZWN0ZWRSZWdpb25zID8/IFtdKS5tYXAoKHIpID0+IGNvcGllcy5nZXQocikgPz8gcik7XG4gICAgICBpZiAoWy4uLmNvcGllcy5rZXlzKCldLnNvbWUoKHIpID0+IHRoaXMuZWRpdGluZ0xhYmVsUmVnaW9ucy5oYXMocikpKSB7XG4gICAgICAgIHRoaXMuZWRpdGluZ0xhYmVsUmVnaW9ucyA9IG5ldyBNYXAoWy4uLnRoaXMuZWRpdGluZ0xhYmVsUmVnaW9uc10ubWFwKChbciwgZF0pID0+IFtjb3BpZXMuZ2V0KHIpID8/IHIsIGRdKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb3BpZXM7XG4gIH1cblxuICAvKiogU2V0IG9uZSByZWdpb24ncyBvdXRsaW5lIGNvbG91ciAoYW4gZXhwbGljaXQgb3ZlcnJpZGUpIGFuZCBjb21taXQgbGl2ZS4gKi9cbiAgcHJvdGVjdGVkIGNoYW5nZVJlZ2lvbkNvbG9yKHJlZ2lvbjogUmVnaW9uLCBjb2xvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFjb2xvciB8fCByZWdpb24uY29sb3IgPT09IGNvbG9yKSByZXR1cm47XG4gICAgLy8gY29sb3JPdmVycmlkZGVuOiBleHBsaWNpdCBwZXItcmVnaW9uIGNvbG91ciDigJQgcHJlc2VydmUgaXQgYWdhaW5zdCBwcmVzZXQgKHJlKWFwcGx5IChqaXQtdWkjNzApXG4gICAgdGhpcy5wYXRjaFJlZ2lvbnMoKHIpID0+IChyID09PSByZWdpb24gPyB7IGNvbG9yLCBjb2xvck92ZXJyaWRkZW46IHRydWUgfSA6IG51bGwpKTtcbiAgICB0aGlzLmNvbW1pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFmdGVyIGEgbGFiZWwgZWRpdCBvbiBgcmVnaW9uYDogZ2l2ZSBldmVyeSBsYWJlbGxlZCByb3cgd2l0aG91dCBhIGNvbG91ciBpdHNcbiAgICogY2xhc3MgY29sb3VyIChwcmVzZXQgb3IgZmFsbGJhY2ssIGFzIHRoZSBzdG9yZSB3aWxsKSwgYW5kIGNvbW1pdCB3aGVuXG4gICAqIGBjb21taXRgIGlzIHNldC5cbiAgICovXG4gIHByb3RlY3RlZCBsYWJlbFJlZ2lvblVwZGF0ZShyZWdpb246IFJlZ2lvbiwgY29tbWl0ID0gZmFsc2UpIHtcbiAgICB0aGlzLmZpbGxDbGFzc0NvbG9ycygpO1xuICAgIGlmIChjb21taXQpIHRoaXMuY29tbWl0KCk7XG4gIH1cblxuICAvKiogTGFiZWxsZWQgcm93cyB3aXRob3V0IGEgY29sb3VyIGdldCB0aGVpciBjbGFzcyBjb2xvdXIgKGNvcGllcykuICovXG4gIHByaXZhdGUgZmlsbENsYXNzQ29sb3JzKCk6IHZvaWQge1xuICAgIHRoaXMucGF0Y2hSZWdpb25zKChyKSA9PiAoIXIuY29sb3IgJiYgci5sYWJlbCA/IHsgY29sb3I6IHRoaXMuY29sb3JGb3JOYW1lKHIubGFiZWwpIH0gOiBudWxsKSk7XG4gIH1cblxuICAvKiogVGhlIGN1cnJlbnQgcGFnZSBvZiB0aGUgdGFibGUuIE1lbW9pemVkIG9uIChyZWdpb25zLCBmaXJzdCwgcm93cyksIHNvXG4gICAqICBjaGFuZ2UgZGV0ZWN0aW9uIGRvZXNuJ3QgaGFuZCBwLXRhYmxlIGEgbmV3IGFycmF5IGV2ZXJ5IHRpY2sgKFJULTIwKS4gKi9cbiAgcHJvdGVjdGVkIGdldCBwYWdlZFJlZ2lvbnMoKTogUmVnaW9uW10ge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuX3BhZ2VLZXk7XG4gICAgaWYgKFxuICAgICAga2V5LnJlZ2lvbnMgIT09IHRoaXMucmVnaW9ucyB8fFxuICAgICAga2V5LnNvdXJjZSAhPT0gdGhpcy5zb3VyY2VSb3dzIHx8XG4gICAgICBrZXkuZmlyc3QgIT09IHRoaXMucGFnaW5hdG9yRmlyc3QgfHxcbiAgICAgIGtleS5yb3dzICE9PSB0aGlzLnBhZ2luYXRvclJvd3NcbiAgICApIHtcbiAgICAgIHRoaXMuX3BhZ2VLZXkgPSB7XG4gICAgICAgIHJlZ2lvbnM6IHRoaXMucmVnaW9ucyxcbiAgICAgICAgc291cmNlOiB0aGlzLnNvdXJjZVJvd3MsXG4gICAgICAgIGZpcnN0OiB0aGlzLnBhZ2luYXRvckZpcnN0LFxuICAgICAgICByb3dzOiB0aGlzLnBhZ2luYXRvclJvd3MsXG4gICAgICB9O1xuICAgICAgY29uc3Qgb3duID0gdGhpcy5yZWdpb25zLnNsaWNlKHRoaXMucGFnaW5hdG9yRmlyc3QsIHRoaXMucGFnaW5hdG9yRmlyc3QgKyB0aGlzLnBhZ2luYXRvclJvd3MpO1xuICAgICAgdGhpcy5fcGFnZSA9XG4gICAgICAgIG93bi5sZW5ndGggPj0gdGhpcy5wYWdpbmF0b3JSb3dzXG4gICAgICAgICAgPyBvd25cbiAgICAgICAgICA6IFsuLi5vd24sIC4uLnRoaXMuc291cmNlUm93cy5zbGljZSgwLCB0aGlzLnBhZ2luYXRvclJvd3MgLSBvd24ubGVuZ3RoKV07XG4gICAgICAvLyBBIG5ldyBwYWdlIG1heSBzaG93IGNsYXNzZXMgd2hvc2Ugdm9sdW1lIGlzIG5vdCBrbm93biB5ZXQgKGFmdGVyIHRoaXMgY2hlY2spLlxuICAgICAgaWYgKHRoaXMudm9sdW1lVmlldykgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5yZXF1ZXN0Vm9sdW1lcygpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2U7XG4gIH1cblxuICAvKiogSW4gYSB2b2x1bWUgdmlldywgZWFjaCBjbGFzcydzIHZvbHVtZSBvdmVyIHRoZSB3aG9sZSBzdGFjaywgZm9yIHRoZSB0YWJsZSAobnVsbDogYXJlYXMpLiAqL1xuICBwcm90ZWN0ZWQgdGFibGVWb2x1bWVzOiBSZWFkb25seU1hcDxzdHJpbmcsIG51bWJlciB8IG51bGw+IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBCdW1wZWQgd2hlbiB0aGUgcmVnaW9ucyBjaGFuZ2UsIHNvIGEgdm9sdW1lIGNvbXB1dGVkIGJlZm9yZSBpcyBkcm9wcGVkLiAqL1xuICBwcml2YXRlIHZvbHVtZVJlcXVlc3QgPSAwO1xuXG4gIC8qKiBDb21wdXRlIHRoZSB2b2x1bWVzIG9mIHRoZSBjbGFzc2VzIG9uIHRoZSB0YWJsZSdzIHBhZ2UgdGhhdCBhcmUgbm90IGtub3duIHlldC4gKi9cbiAgcHJpdmF0ZSByZXF1ZXN0Vm9sdW1lcygpOiB2b2lkIHtcbiAgICBjb25zdCBhcGkgPSB0aGlzLnJlZ2lvbkFwaS5nZXRDbGFzc1ZvbHVtZXM/LmJpbmQodGhpcy5yZWdpb25BcGkpO1xuICAgIC8vIENsb3NlZDogYXNrZWQgZm9yIGFnYWluIHdoZW4gaXQgb3BlbnMgKHNlZSBhY3RpdmUpLlxuICAgIGlmICghdGhpcy5pc0FjdGl2ZSkgcmV0dXJuO1xuICAgIGlmICghdGhpcy52b2x1bWVWaWV3IHx8ICFhcGkpIHtcbiAgICAgIGlmICh0aGlzLnRhYmxlVm9sdW1lcykge1xuICAgICAgICB0aGlzLnRhYmxlVm9sdW1lcyA9IG51bGw7XG4gICAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBrbm93biA9IHRoaXMudGFibGVWb2x1bWVzID8/IG5ldyBNYXA8c3RyaW5nLCBudW1iZXIgfCBudWxsPigpO1xuICAgIGNvbnN0IGxhYmVscyA9IG5ldyBTZXQodGhpcy5wYWdlZFJlZ2lvbnMubWFwKChyKSA9PiByLmxhYmVsKS5maWx0ZXIoKGwpOiBsIGlzIHN0cmluZyA9PiAhIWwpKTtcbiAgICBjb25zdCBtaXNzaW5nID0gWy4uLmxhYmVsc10uZmlsdGVyKChsKSA9PiAha25vd24uaGFzKGwpKTtcbiAgICBpZiAoIW1pc3NpbmcubGVuZ3RoICYmIHRoaXMudGFibGVWb2x1bWVzKSByZXR1cm47XG4gICAgdGhpcy50YWJsZVZvbHVtZXMgPSBuZXcgTWFwKFsuLi5rbm93biwgLi4ubWlzc2luZy5tYXAoKGwpOiBbc3RyaW5nLCBudWxsXSA9PiBbbCwgbnVsbF0pXSk7XG4gICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgaWYgKCFtaXNzaW5nLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnZvbHVtZVJlcXVlc3Q7XG4gICAgYXBpKG1pc3NpbmcpLnRoZW4oXG4gICAgICAodm9sdW1lcykgPT4ge1xuICAgICAgICBpZiAocmVxdWVzdCAhPT0gdGhpcy52b2x1bWVSZXF1ZXN0IHx8ICF0aGlzLnRhYmxlVm9sdW1lcykgcmV0dXJuO1xuICAgICAgICB0aGlzLnRhYmxlVm9sdW1lcyA9IG5ldyBNYXAoWy4uLnRoaXMudGFibGVWb2x1bWVzLCAuLi5PYmplY3QuZW50cmllcyh2b2x1bWVzKV0pO1xuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgIH0sXG4gICAgICAoZXJyKSA9PiB7XG4gICAgICAgIGlmIChyZXF1ZXN0ICE9PSB0aGlzLnZvbHVtZVJlcXVlc3QgfHwgIXRoaXMudGFibGVWb2x1bWVzKSByZXR1cm47XG4gICAgICAgIC8vIExlYXZlIHRoZW0gdW5rbm93biAoJ+KAlCcpIHJhdGhlciB0aGFuIGNvbXB1dGluZyBmb3JldmVyLlxuICAgICAgICBjb25zdCBuZXh0ID0gbmV3IE1hcCh0aGlzLnRhYmxlVm9sdW1lcyk7XG4gICAgICAgIGZvciAoY29uc3QgbCBvZiBtaXNzaW5nKSBuZXh0LmRlbGV0ZShsKTtcbiAgICAgICAgdGhpcy50YWJsZVZvbHVtZXMgPSBuZXh0O1xuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgICAgY29uc29sZS53YXJuKCdbcmVnaW9uc10gY291bGQgbm90IGNvbXB1dGUgY2xhc3Mgdm9sdW1lcycsIGVycik7XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvKiogVGhlIHJlZ2lvbnMgY2hhbmdlZCAob3IgdGhlIHZpZXcgZGlkKTogZm9yZ2V0IHRoZSB2b2x1bWVzIGFuZCBjb21wdXRlIHRoZSBwYWdlJ3MgYWdhaW4uICovXG4gIHByaXZhdGUgcmVzZXRWb2x1bWVzKCk6IHZvaWQge1xuICAgIHRoaXMudm9sdW1lUmVxdWVzdCsrO1xuICAgIHRoaXMudGFibGVWb2x1bWVzID0gbnVsbDtcbiAgICB0aGlzLnJlcXVlc3RWb2x1bWVzKCk7XG4gIH1cbiAgcHJpdmF0ZSBfcGFnZUtleTogeyByZWdpb25zPzogUmVnaW9uW107IHNvdXJjZT86IFJlZ2lvbltdOyBmaXJzdD86IG51bWJlcjsgcm93cz86IG51bWJlciB9ID0ge307XG4gIHByaXZhdGUgX3BhZ2U6IFJlZ2lvbltdID0gW107XG5cbiAgcHJvdGVjdGVkIG9uUGFnZUNoYW5nZShldmVudDogeyBmaXJzdD86IG51bWJlcjsgcm93cz86IG51bWJlciB9KSB7XG4gICAgdGhpcy5wYWdpbmF0b3JGaXJzdCA9IGV2ZW50LmZpcnN0ID8/IDA7XG4gICAgdGhpcy5wYWdpbmF0b3JSb3dzID0gZXZlbnQucm93cyA/PyB0aGlzLnBhZ2luYXRvclJvd3M7XG4gICAgdm9pZCB0aGlzLnJlZnJlc2hTb3VyY2UoKTtcbiAgfVxuXG4gIC8qKiBTZWxlY3QgZXZlcnkgcmVnaW9uIGluIHRoZSB0YWJsZSAoYW5kIGhpZ2hsaWdodCB0aGVtIG9uIHRoZSBkaWFncmFtKSwgdGhlIHNvdXJjZSdzIHRha2VuLiAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2VsZWN0QWxsUmVnaW9ucygpIHtcbiAgICB0aGlzLnNlbGVjdGVkUmVnaW9ucyA9IFsuLi50aGlzLnJlZ2lvbnNdO1xuICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2VkKCk7XG4gICAgaWYgKCF0aGlzLnNvdXJjZVRvdGFsIHx8ICF0aGlzLnJlZ2lvbkFwaS5nZXRSZWdpb25Tb3VyY2VJbmRleCkgcmV0dXJuO1xuICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCB0aGlzLnJlZ2lvbkFwaS5nZXRSZWdpb25Tb3VyY2VJbmRleCh7IG9mZnNldDogMCwgbGltaXQ6IFNFTEVDVF9BTExfU09VUkNFX0xJTUlUIH0pO1xuICAgIGNvbnN0IGlkcyA9IChwYWdlPy5yb3dzID8/IFtdKS5tYXAoKHIpID0+IHIuaWQpO1xuICAgIGlmIChpZHMubGVuZ3RoKSBhd2FpdCB0aGlzLnJlZ2lvbkFwaS5zZWxlY3RTb3VyY2VGZWF0dXJlcz8uKGlkcywgdHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVsZXRlU2VsZWN0ZWRSZWdpb25zKCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkUmVnaW9ucyAmJiB0aGlzLnNlbGVjdGVkUmVnaW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmcm9tU291cmNlID0gdGhpcy5zZWxlY3RlZFJlZ2lvbnMuZmlsdGVyKChyKSA9PiB0aGlzLnN0YW5kSW5zLmhhcyhyKSk7XG4gICAgICBpZiAoZnJvbVNvdXJjZS5sZW5ndGgpIHRoaXMucmVnaW9uQXBpLmRlbGV0ZVNvdXJjZUZlYXR1cmVzPy4odGhpcy5zb3VyY2VJZHMoZnJvbVNvdXJjZSkpO1xuICAgICAgLy8gRmlsdGVyIGJ5IGlkIOKAlCBvYmplY3QgaWRlbnRpdHkgaXNuJ3QgcmVsaWFibGUgYWNyb3NzIHJlLXBhcnNlcyxcbiAgICAgIC8vIGFuZCBuYW1lIGlzIGEgdXNlci1lZGl0YWJsZSBsYWJlbCB0aGF0IG1heSBjb2xsaWRlLlxuICAgICAgY29uc3QgcmVtb3ZlZCA9IG5ldyBTZXQodGhpcy5zZWxlY3RlZFJlZ2lvbnMubWFwKChyKSA9PiByLmlkKSk7XG4gICAgICB0aGlzLnNlbGVjdGVkUmVnaW9ucyA9IFtdO1xuICAgICAgdGhpcy5jb21taXQodGhpcy5yZWdpb25zLmZpbHRlcigocikgPT4gIXJlbW92ZWQuaGFzKHIuaWQpKSk7XG4gICAgICB0aGlzLmNsYW1wUGFnaW5hdG9yRmlyc3QoKTtcbiAgICAgIC8vIFN5bmMgdGhlIGNsZWFyZWQgc2VsZWN0aW9uIHdpdGggdGhlIHBsb3QncyBoaWdobGlnaHQgc3RhdGUuXG4gICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhckFsbFJlZ2lvbnMoKSB7XG4gICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0oe1xuICAgICAga2V5OiAncG9zaXRpb25EaWFsb2cnLFxuICAgICAgbWVzc2FnZTogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgYWxsIHJlZ2lvbnM/JyxcbiAgICAgIGFjY2VwdDogKCkgPT4ge1xuICAgICAgICB0aGlzLnNlbGVjdGVkUmVnaW9ucyA9IFtdO1xuICAgICAgICB0aGlzLnBhZ2luYXRvckZpcnN0ID0gMDtcbiAgICAgICAgdGhpcy5jb21taXQoW10pO1xuICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlZCgpO1xuICAgICAgICBpZiAodGhpcy5oYXNSZWdpb25Tb3VyY2UpIHZvaWQgdGhpcy5kZWxldGVBbGxTb3VyY2VGZWF0dXJlcygpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgZXZlcnkgZmVhdHVyZSBzdGlsbCBpbiB0aGUgc2xpY2UncyByZWdpb24gc291cmNlICh3aXRoIFwiRGVsZXRlIGFsbCByZWdpb25zXCIpLiAqL1xuICBwcml2YXRlIGFzeW5jIGRlbGV0ZUFsbFNvdXJjZUZlYXR1cmVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZWdpb25BcGkuZ2V0UmVnaW9uU291cmNlSW5kZXg7XG4gICAgaWYgKCFpbmRleCB8fCAhdGhpcy5yZWdpb25BcGkuZGVsZXRlU291cmNlRmVhdHVyZXMpIHJldHVybjtcbiAgICBjb25zdCBwYWdlID0gYXdhaXQgaW5kZXguY2FsbCh0aGlzLnJlZ2lvbkFwaSwgeyBvZmZzZXQ6IDAsIGxpbWl0OiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB9KTtcbiAgICBpZiAocGFnZT8ucm93cy5sZW5ndGgpIHRoaXMucmVnaW9uQXBpLmRlbGV0ZVNvdXJjZUZlYXR1cmVzKHBhZ2Uucm93cy5tYXAoKHIpID0+IHIuaWQpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZWxldGVSZWdpb24oc2hhcGVJZHg6IG51bWJlcikge1xuICAgIC8vIEEgcm93IHBhc3QgdGhlIHJlZ2lvbnMgaXMgYSBzb3VyY2UgZmVhdHVyZTogZGVsZXRlIGl0IGZyb20gdGhlIHNvdXJjZS5cbiAgICBpZiAoc2hhcGVJZHggPj0gdGhpcy5yZWdpb25zLmxlbmd0aCkge1xuICAgICAgY29uc3Qgcm93ID0gdGhpcy5zb3VyY2VSb3dzW3NoYXBlSWR4IC0gTWF0aC5tYXgodGhpcy5wYWdpbmF0b3JGaXJzdCwgdGhpcy5yZWdpb25zLmxlbmd0aCldO1xuICAgICAgaWYgKHJvdykgdGhpcy5yZWdpb25BcGkuZGVsZXRlU291cmNlRmVhdHVyZXM/Lih0aGlzLnNvdXJjZUlkcyhbcm93XSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZW1vdmVkID0gdGhpcy5yZWdpb25zW3NoYXBlSWR4XTtcbiAgICBpZiAocmVtb3ZlZCkge1xuICAgICAgdGhpcy5zZWxlY3RlZFJlZ2lvbnMgPSB0aGlzLnNlbGVjdGVkUmVnaW9ucy5maWx0ZXIoKHIpID0+IHIuaWQgIT09IHJlbW92ZWQuaWQpO1xuICAgIH1cbiAgICB0aGlzLmNvbW1pdCh0aGlzLnJlZ2lvbnMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBzaGFwZUlkeCkpO1xuICAgIHRoaXMuY2xhbXBQYWdpbmF0b3JGaXJzdCgpO1xuICAgIC8vIFJlLWVtaXQgdGhlIChwb3NzaWJseSB0cmltbWVkKSBzZWxlY3Rpb24gc28gdGhlIHBsb3QncyBoaWdobGlnaHQgc3RheXNcbiAgICAvLyBpbiBzeW5jIHdpdGggd2hhdCdzIHN0aWxsIGluIHRoZSB0YWJsZS5cbiAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGFtcFBhZ2luYXRvckZpcnN0KCkge1xuICAgIGNvbnN0IG1heEZpcnN0ID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcigodGhpcy50YWJsZVRvdGFsIC0gMSkgLyB0aGlzLnBhZ2luYXRvclJvd3MpICogdGhpcy5wYWdpbmF0b3JSb3dzKTtcbiAgICBpZiAodGhpcy5wYWdpbmF0b3JGaXJzdCA+IG1heEZpcnN0KSB7XG4gICAgICB0aGlzLnBhZ2luYXRvckZpcnN0ID0gbWF4Rmlyc3Q7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBjaGFuZ2VTaG93U2hhcGVMYWJlbChzaG93TGFiZWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmNvbW1pdCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzRWRpdGluZ0xhYmVsKHJlZ2lvbjogUmVnaW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdGluZ0xhYmVsUmVnaW9ucy5oYXMocmVnaW9uKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGFydEVkaXRMYWJlbChyZWdpb246IFJlZ2lvbiwgZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTsgLy8gZG9uJ3QgdG9nZ2xlIHJvdyBzZWxlY3Rpb25cbiAgICBpZiAodGhpcy5zdGFuZElucy5oYXMocmVnaW9uKSkge1xuICAgICAgdm9pZCB0aGlzLnRha2VUaGVuKHJlZ2lvbiwgKHIpID0+IHRoaXMuc3RhcnRFZGl0TGFiZWwocikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBBIG5ldyBtYXAgcGVyIHN0YXJ0L3N0b3AsIHNvIHRoZSBPblB1c2ggdGFibGUgc2VlcyB0aGUgY2hhbmdlLlxuICAgIHRoaXMuZWRpdGluZ0xhYmVsUmVnaW9ucyA9IG5ldyBNYXAodGhpcy5lZGl0aW5nTGFiZWxSZWdpb25zKS5zZXQocmVnaW9uLCByZWdpb24ubGFiZWwgPz8gJycpO1xuICB9XG5cbiAgLyoqIFRoZSBsYWJlbCB0eXBlZCBzbyBmYXIgZm9yIGEgcm93IGluIGVkaXQgbW9kZSAobm8gcmUtcmVuZGVyIG5lZWRlZCkuICovXG4gIHByb3RlY3RlZCBzZXRMYWJlbERyYWZ0KHJlZ2lvbjogUmVnaW9uLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZWRpdGluZ0xhYmVsUmVnaW9ucy5oYXMocmVnaW9uKSkgdGhpcy5lZGl0aW5nTGFiZWxSZWdpb25zLnNldChyZWdpb24sIHZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdG9wRWRpdExhYmVsKHJlZ2lvbjogUmVnaW9uLCBjb21taXQ6IGJvb2xlYW4sIGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgZHJhZnQgPSB0aGlzLmVkaXRpbmdMYWJlbFJlZ2lvbnMuZ2V0KHJlZ2lvbik7XG4gICAgaWYgKHRoaXMuZWRpdGluZ0xhYmVsUmVnaW9ucy5oYXMocmVnaW9uKSkge1xuICAgICAgY29uc3QgbmV4dCA9IG5ldyBNYXAodGhpcy5lZGl0aW5nTGFiZWxSZWdpb25zKTtcbiAgICAgIG5leHQuZGVsZXRlKHJlZ2lvbik7XG4gICAgICB0aGlzLmVkaXRpbmdMYWJlbFJlZ2lvbnMgPSBuZXh0O1xuICAgIH1cbiAgICBpZiAoY29tbWl0KSB7XG4gICAgICAvLyBBIGNoYW5nZWQgbGFiZWwgY29tbWl0cyBhcyBhIHJlcGxhY2VtZW50IHJlZ2lvbiwgc28gaXQgaXMgdW5kb2FibGUgKFJULTEpLlxuICAgICAgY29uc3QgZWRpdGVkID1cbiAgICAgICAgZHJhZnQgIT09IHVuZGVmaW5lZCAmJiBkcmFmdCAhPT0gcmVnaW9uLmxhYmVsXG4gICAgICAgICAgPyAodGhpcy5wYXRjaFJlZ2lvbnMoKHIpID0+IChyID09PSByZWdpb24gPyB7IGxhYmVsOiBkcmFmdCB9IDogbnVsbCkpLmdldChyZWdpb24pID8/IHJlZ2lvbilcbiAgICAgICAgICA6IHJlZ2lvbjtcbiAgICAgIHRoaXMubGFiZWxSZWdpb25VcGRhdGUoZWRpdGVkLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICAvKiogUmVnaW9uIGFyZWEgZm9yIGRpc3BsYXkgKMK1bcKyL21twrIgd2hlbiB0aGUgaW1hZ2UgaXMgc2NhbGVkLCBlbHNlIHB4wrIpO1xuICAgKiAgZW1wdHkgZm9yIGEgZGVnZW5lcmF0ZSByZWdpb24uIFNlZSBgcmVnaW9uLW1ldHJpY3NgLiAqL1xuICBwcm90ZWN0ZWQgcmVnaW9uQXJlYShyZWdpb246IFJlZ2lvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZvcm1hdEFyZWEocmVnaW9uQXJlYVB4KHJlZ2lvbiksIHRoaXMubXBwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCByb3VuZHMgYWxsIHRoZSByZWN0YW5nbGUgcmVnaW9ucyBsZW5ndGhzIHRvIG11bHRpcGxlIG9mIDUxMlxuICAgKi9cbiAgcHJvdGVjdGVkIHJvdW5kUmVjdGFuZ2xlTGVuZ3RocygpIHtcbiAgICB0aGlzLnBhdGNoUmVnaW9ucygocmVnaW9uKSA9PiB7XG4gICAgICBjb25zdCByZWN0ID0gcmVnaW9uLmJvdW5kcztcbiAgICAgIGlmICghKHJlY3QgaW5zdGFuY2VvZiBSZWN0YW5nbGUpKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJvdW5kczogT2JqZWN0LmFzc2lnbihuZXcgUmVjdGFuZ2xlKCksIHJlY3QsIHtcbiAgICAgICAgICBoZWlnaHQ6IE1hdGgucm91bmQocmVjdC5oZWlnaHQgLyA1MTIpICogNTEyLFxuICAgICAgICAgIHdpZHRoOiBNYXRoLnJvdW5kKHJlY3Qud2lkdGggLyA1MTIpICogNTEyLFxuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgdGhpcy5jb21taXQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG93SGVscCgpIHtcbiAgICB0aGlzLmRpc3BsYXlIZWxwRGlhbG9nID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBPcGVuIHRoZSBjb2xvdXIgZGlhbG9nIGZvciB0aGUgY3VycmVudGx5LXNlbGVjdGVkIHJlZ2lvbihzKSwgYnVpbGRpbmcgb25lXG4gICAqICBjb2xvdXIgcGlja2VyIHBlciB1bmlxdWUgY2xhc3MgaW4gdGhlIHNlbGVjdGlvbi4gRWFjaCBwaWNrZXIgaXMgc2VlZGVkIHdpdGhcbiAgICogIHRoZSBmaXJzdCBzZWxlY3RlZCByZWdpb24gb2YgdGhhdCBjbGFzcydzIGNvbG91ciAoZWxzZSB0aGUgY2xhc3MgY29sb3VyKS4gKi9cbiAgcHJvdGVjdGVkIG9wZW5Db2xvckRpYWxvZygpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRSZWdpb25zPy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBzZWVkQnlMYWJlbCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCByZWdpb24gb2YgdGhpcy5zZWxlY3RlZFJlZ2lvbnMpIHtcbiAgICAgIGNvbnN0IGxhYmVsID0gcmVnaW9uLmxhYmVsPy50cmltKCkgPz8gJyc7XG4gICAgICBpZiAoc2VlZEJ5TGFiZWwuaGFzKGxhYmVsKSkgY29udGludWU7XG4gICAgICBzZWVkQnlMYWJlbC5zZXQobGFiZWwsIHJlZ2lvbi5jb2xvciA/PyAobGFiZWwgPyB0aGlzLmNvbG9yRm9yTmFtZShsYWJlbCkgOiB0aGlzLnNoYXBlQ29sb3IpKTtcbiAgICB9XG4gICAgdGhpcy5jbGFzc0NvbG9yRWRpdHMgPSBbLi4uc2VlZEJ5TGFiZWxdLm1hcCgoW2xhYmVsLCBjb2xvcl0pID0+ICh7IGxhYmVsLCBjb2xvciB9KSk7XG4gICAgdGhpcy5zaG93Q29sb3JEaWFsb2cgPSB0cnVlO1xuICB9XG5cbiAgLyoqIEFwcGx5IGVhY2ggY2xhc3MncyBjaG9zZW4gY29sb3VyIHRvIHRoZSBzZWxlY3RlZCByZWdpb25zIG9mIHRoYXQgY2xhc3MgKGFuXG4gICAqICBleHBsaWNpdCBvdmVycmlkZSkgYW5kIGNvbW1pdCBsaXZlLiAqL1xuICBwcm90ZWN0ZWQgYXBwbHlDb2xvclRvU2VsZWN0ZWQoZWRpdHM6IENsYXNzQ29sb3JFZGl0W10gPSB0aGlzLmNsYXNzQ29sb3JFZGl0cykge1xuICAgIGNvbnN0IGNvbG9yQnlMYWJlbCA9IG5ldyBNYXAoZWRpdHMubWFwKChlKSA9PiBbZS5sYWJlbCwgZS5jb2xvcl0pKTtcbiAgICBjb25zdCBzZWxlY3RlZCA9IG5ldyBTZXQodGhpcy5zZWxlY3RlZFJlZ2lvbnMgPz8gW10pO1xuICAgIHRoaXMucGF0Y2hSZWdpb25zKChyZWdpb24pID0+IHtcbiAgICAgIGlmICghc2VsZWN0ZWQuaGFzKHJlZ2lvbikpIHJldHVybiBudWxsO1xuICAgICAgY29uc3QgbGFiZWwgPSByZWdpb24ubGFiZWw/LnRyaW0oKSA/PyAnJztcbiAgICAgIGNvbnN0IGNvbG9yID0gY29sb3JCeUxhYmVsLmdldChsYWJlbCk7XG4gICAgICBpZiAoIWNvbG9yKSByZXR1cm4gbnVsbDtcbiAgICAgIC8vIGV4cGxpY2l0IGNvbG91ciDigJQgcHJlc2VydmUgYWdhaW5zdCBwcmVzZXQgKHJlKWFwcGx5IChqaXQtdWkjNzApXG4gICAgICByZXR1cm4geyBjb2xvciwgY29sb3JPdmVycmlkZGVuOiB0cnVlIH07XG4gICAgfSk7XG4gICAgdGhpcy5jb21taXQoKTtcbiAgICB0aGlzLnNob3dDb2xvckRpYWxvZyA9IGZhbHNlO1xuICB9XG5cbiAgLy8g4pSA4pSAIGFubm90YXRpb24tY2xhc3MgcHJlc2V0cyAoaml0LXVpIzcwKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogUmVzb2x2ZSB0aGUgZGlzcGxheSBjb2xvdXIgZm9yIGEgY2xhc3MgbmFtZSAocHJlc2V0IGNvbG91ciBvciBkZXRlcm1pbmlzdGljIGZhbGxiYWNrKS4gKi9cbiAgcHJvdGVjdGVkIGNvbG9yRm9yTmFtZShuYW1lPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmFtZSA/IGNvbG9yRm9yTGFiZWwobmFtZSwgdGhpcy5wcmVzZXRTZXQpIDogdGhpcy5zaGFwZUNvbG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZSBldmVyeSBjbGFzcyBsYWJlbCBwcmVzZW50IGluIHRoZSBsb2FkZWQgcmVnaW9ucyBleGlzdHMgaW4gdGhlIHByZXNldFxuICAgKiBsaXN0LCBhdXRvLWFkZGluZyBhbnkgdGhhdCBhcmUgbWlzc2luZyAodXNpbmcgdGhlIHJlZ2lvbidzIGFscmVhZHktcmVzb2x2ZWRcbiAgICogY29sb3VyKS4gVGhpcyBtYWtlcyBjbGFzc2VzIGNhcnJpZWQgaW4gYSBsb2FkZWQvaW1wb3J0ZWQgR2VvSlNPTiBzaG93IHVwIGFzXG4gICAqIGNoaXBzICsgQ2xhc3MtZHJvcGRvd24gb3B0aW9ucyAoYSBwLWRyb3Bkb3duIGNhbid0IGRpc3BsYXkgYSB2YWx1ZSB0aGF0IGlzbid0XG4gICAqIGFuIG9wdGlvbikgYW5kIGxldHMgdGhlIHVzZXIgbWFuYWdlIHRoZW0uIFRoZSBwbGFjZWhvbGRlciAnbGVnZW5kJyBhbmQgZW1wdHlcbiAgICogbGFiZWxzIGFyZSBpZ25vcmVkLiAoaml0LXVpIzcwKVxuICAgKi9cbiAgcHJpdmF0ZSBzeW5jQ2xhc3Nlc0Zyb21SZWdpb25zKHJlZ2lvbnM6IFJlZ2lvbltdKTogdm9pZCB7XG4gICAgY29uc3Qga2V5T2YgPSAobDogc3RyaW5nKSA9PiBwcmVzZXRLZXkodGhpcy5wcmVzZXRTZXQsIGwpO1xuICAgIGNvbnN0IGtub3duID0gbmV3IFNldCh0aGlzLnByZXNldFNldC5jbGFzc2VzLm1hcCgoYykgPT4ga2V5T2YoYy5uYW1lKSkpO1xuICAgIGNvbnN0IGFkZGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCByIG9mIHJlZ2lvbnMpIHtcbiAgICAgIGNvbnN0IGxhYmVsID0gci5sYWJlbD8udHJpbSgpO1xuICAgICAgaWYgKCFsYWJlbCB8fCBsYWJlbCA9PT0gJ2xlZ2VuZCcpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgayA9IGtleU9mKGxhYmVsKTtcbiAgICAgIGlmIChrbm93bi5oYXMoaykgfHwgYWRkZWQuaGFzKGspKSBjb250aW51ZTtcbiAgICAgIGFkZGVkLmFkZChrKTtcbiAgICAgIHRoaXMucmVnaW9uQXBpLnVwc2VydENsYXNzKHtcbiAgICAgICAgbmFtZTogbGFiZWwsXG4gICAgICAgIGNvbG9yOiByLmNvbG9yIHx8IGNvbG9yRm9yTGFiZWwobGFiZWwsIHRoaXMucHJlc2V0U2V0KSxcbiAgICAgICAgc291cmNlOiAnYXV0bycsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgRG9ja2VkIENsYXNzZXMgcGFuZWwgKGppdC11aSM3MCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNsYXNzZXMgY291bnQgZXZlcnkgc2xpY2Ugb2YgdGhlIHN0YWNrOiBpbiBhIHZvbHVtZSB2aWV3ICh0aGUgd2hvbGUgc3RhY2sgb25cbiAgICogc2NyZWVuKSwgdW5sZXNzIGl0cyBzbGljZSBwYW5lIHNob3dzIG9uZSBzbGljZS4gVGhlIHRhYmxlIGxpc3RzIHRoZSBzbGljZSdzIHJlZ2lvbnMgYW55d2F5LlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgc3RhY2tDb3VudHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudm9sdW1lVmlldyAmJiAhdGhpcy5zbGljZVBhbmU7XG4gIH1cblxuICAvKiogUmVidWlsZCB0aGUgcGVyLWNsYXNzIHJlZ2lvbiBjb3VudHMgc2hvd24gaW4gdGhlIHBhbmVsICh0aGUgc3RhY2sncywgc2VlIHN0YWNrQ291bnRzKS4gKi9cbiAgcHJpdmF0ZSByZWNvbXB1dGVDbGFzc0NvdW50cygpOiB2b2lkIHtcbiAgICBjb25zdCBjb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGNvbnN0IHRyZWUgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGNvbnN0IGFkZCA9IChsYWJlbDogc3RyaW5nLCBuOiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IGsgPSBwcmVzZXRLZXkodGhpcy5wcmVzZXRTZXQsIGxhYmVsKTtcbiAgICAgIGNvdW50cy5zZXQoaywgKGNvdW50cy5nZXQoaykgPz8gMCkgKyBuKTtcbiAgICAgIHRyZWUuc2V0KGxhYmVsLCAodHJlZS5nZXQobGFiZWwpID8/IDApICsgbik7XG4gICAgfTtcbiAgICBjb25zdCByZWdpb25zID0gdGhpcy5zdGFja0NvdW50cyA/IHRoaXMucmVnaW9uQXBpLmdldFNsaWNlQW5ub3RhdGlvblJlZ2lvbnMoKSA6IHRoaXMucmVnaW9ucztcbiAgICBmb3IgKGNvbnN0IHIgb2YgcmVnaW9ucykgaWYgKHIubGFiZWwpIGFkZChyLmxhYmVsLCAxKTtcbiAgICAvLyBUaGUgcmVnaW9uIHNvdXJjZSdzIGNsYXNzZXMgY291bnQgdG9vIChpdHMgZmVhdHVyZXMgYXJlIHJvd3Mgb2YgdGhlIHRhYmxlKS5cbiAgICBmb3IgKGNvbnN0IFtsYWJlbCwgbl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zb3VyY2VDbGFzc0NvdW50cykpIGFkZChsYWJlbCwgbik7XG4gICAgdGhpcy5jbGFzc0NvdW50cyA9IGNvdW50cztcbiAgICB0aGlzLnRyZWVDb3VudHMgPSB0cmVlO1xuICAgIHRoaXMudXBkYXRlRGlzcGxheUNsYXNzZXMoKTtcbiAgfVxuXG4gIC8qKiBSZWJ1aWxkIHRoZSBwYW5lbCdzIGRpc3BsYXkgb3JkZXIg4oCUIG1vc3QtdXNlZCBjbGFzc2VzIGZpcnN0LCB0aGVuIGJ5IG5hbWUuIEEgY2xhc3Mgb25seVxuICAgKiAgdGhlIHJlZ2lvbiBzb3VyY2UgaGFzIGlzIGxpc3RlZCB0b28sIGluIGl0cyBjb2xvdXIuICovXG4gIHByaXZhdGUgdXBkYXRlRGlzcGxheUNsYXNzZXMoKTogdm9pZCB7XG4gICAgY29uc3Qga25vd24gPSBuZXcgU2V0KHRoaXMucHJlc2V0U2V0LmNsYXNzZXMubWFwKChjKSA9PiBwcmVzZXRLZXkodGhpcy5wcmVzZXRTZXQsIGMubmFtZSkpKTtcbiAgICBjb25zdCBmcm9tU291cmNlOiBDbGFzc1ByZXNldFtdID0gW107XG4gICAgZm9yIChjb25zdCBsYWJlbCBvZiBPYmplY3Qua2V5cyh0aGlzLnNvdXJjZUNsYXNzQ291bnRzKSkge1xuICAgICAgY29uc3QgayA9IHByZXNldEtleSh0aGlzLnByZXNldFNldCwgbGFiZWwpO1xuICAgICAgaWYgKGtub3duLmhhcyhrKSkgY29udGludWU7XG4gICAgICBrbm93bi5hZGQoayk7XG4gICAgICBmcm9tU291cmNlLnB1c2goeyBuYW1lOiBsYWJlbCwgY29sb3I6IGNvbG9yRm9yTGFiZWwobGFiZWwsIHRoaXMucHJlc2V0U2V0KSB9KTtcbiAgICB9XG4gICAgdGhpcy50YWJsZVByZXNldFNldCA9IGZyb21Tb3VyY2UubGVuZ3RoXG4gICAgICA/IHsgLi4udGhpcy5wcmVzZXRTZXQsIGNsYXNzZXM6IFsuLi50aGlzLnByZXNldFNldC5jbGFzc2VzLCAuLi5mcm9tU291cmNlXSB9XG4gICAgICA6IHRoaXMucHJlc2V0U2V0O1xuICAgIHRoaXMuZGlzcGxheUNsYXNzZXMgPSBbLi4udGhpcy5wcmVzZXRTZXQuY2xhc3NlcywgLi4uZnJvbVNvdXJjZV0uc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgZCA9IHRoaXMuY2xhc3NDb3VudChiLm5hbWUpIC0gdGhpcy5jbGFzc0NvdW50KGEubmFtZSk7XG4gICAgICByZXR1cm4gZCAhPT0gMCA/IGQgOiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIE51bWJlciBvZiByZWdpb25zIGN1cnJlbnRseSB1c2luZyBhIGNsYXNzIChrZXllZCBieSB0aGUgYWN0aXZlIG1hdGNoIG1vZGUpLiAqL1xuICBwcm90ZWN0ZWQgY2xhc3NDb3VudChuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNsYXNzQ291bnRzLmdldChwcmVzZXRLZXkodGhpcy5wcmVzZXRTZXQsIG5hbWUpKSA/PyAwO1xuICB9XG5cbiAgLyoqIFJlY29sb3VyIGEgY2xhc3MgZnJvbSBpdHMgcGFuZWwgc3dhdGNoIGFuZCByZXBhaW50IGl0cyAobm9uLW92ZXJyaWRkZW4pIHJlZ2lvbnMuICovXG4gIHByb3RlY3RlZCBzZXRDbGFzc0NvbG9yKG5hbWU6IHN0cmluZywgY29sb3I6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghY29sb3IpIHJldHVybjtcbiAgICB0aGlzLnJlZ2lvbkFwaS5zZXRDbGFzc2lmaWNhdGlvbkNvbG9yKG5hbWUsIGNvbG9yKTtcbiAgICB0aGlzLmNvbW1pdCgpO1xuICB9XG5cbiAgLyoqIFJlbW92ZSBhIGNsYXNzLiBBbnkgcmVnaW9ucyBzdGlsbCB1c2luZyBpdCBmYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHRcbiAgICogIFwiUmVnaW9uXCIgY2xhc3MsIHNvIHRoZXkgYXJlbid0IG9ycGhhbmVkIChhbmQgdGhlIGNsYXNzIGlzbid0IGltbWVkaWF0ZWx5XG4gICAqICByZS1hZGRlZCBmcm9tIGl0cyByZWdpb25zIGJ5IHN5bmNDbGFzc2VzRnJvbVJlZ2lvbnMpLiAqL1xuICBwcm90ZWN0ZWQgZGVsZXRlQ2xhc3MobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yZWFzc2lnblJlZ2lvbnNUb0RlZmF1bHRDbGFzcyhbbmFtZV0pO1xuICAgIHRoaXMucmVnaW9uQXBpLnJlbW92ZUNsYXNzKG5hbWUpO1xuICAgIGlmICh0aGlzLmFjdGl2ZUNsYXNzID09PSBuYW1lKSB0aGlzLmFjdGl2ZUNsYXNzID0gbnVsbDtcbiAgICB0aGlzLmNvbW1pdCgpO1xuICB9XG5cbiAgLyoqIFJlZ2lvbnMgbGFiZWxsZWQgd2l0aCBhbnkgb2YgYHJlbW92ZWROYW1lc2AgcmV2ZXJ0IHRvIHRoZSBkZWZhdWx0XG4gICAqICB7QGxpbmsgZGVmYXVsdENsYXNzTmFtZX0gKFwiUmVnaW9uXCIpOiBpdHMgY2xhc3MgY29sb3VyLCBvdmVycmlkZSBjbGVhcmVkLlxuICAgKiAgU2tpcHMgdGhlIGRlZmF1bHQgaXRzZWxmIHNvIGRlbGV0aW5nIFwiUmVnaW9uXCIgY2FuJ3Qgc2VsZi1yZWFzc2lnbi4gKGppdC11aSM3MCkgKi9cbiAgcHJpdmF0ZSByZWFzc2lnblJlZ2lvbnNUb0RlZmF1bHRDbGFzcyhyZW1vdmVkTmFtZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgY29uc3Qga2V5T2YgPSAoczogc3RyaW5nKSA9PiBwcmVzZXRLZXkodGhpcy5wcmVzZXRTZXQsIHMpO1xuICAgIGNvbnN0IHJlbW92ZWQgPSBuZXcgU2V0KHJlbW92ZWROYW1lcy5tYXAoa2V5T2YpKTtcbiAgICByZW1vdmVkLmRlbGV0ZShrZXlPZih0aGlzLmRlZmF1bHRDbGFzc05hbWUpKTtcbiAgICBpZiAoIXJlbW92ZWQuc2l6ZSkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbG9yID0gY29sb3JGb3JMYWJlbCh0aGlzLmRlZmF1bHRDbGFzc05hbWUsIHRoaXMucHJlc2V0U2V0KTtcbiAgICB0aGlzLnBhdGNoUmVnaW9ucygocikgPT5cbiAgICAgIHIubGFiZWwgJiYgcmVtb3ZlZC5oYXMoa2V5T2Yoci5sYWJlbCkpXG4gICAgICAgID8geyBsYWJlbDogdGhpcy5kZWZhdWx0Q2xhc3NOYW1lLCBjb2xvck92ZXJyaWRkZW46IGZhbHNlLCBjb2xvciB9XG4gICAgICAgIDogbnVsbCxcbiAgICApO1xuICB9XG5cbiAgLyoqIFN0YW1wIGEgY2xhc3MgKGFuZCBpdHMgcHJlc2V0L2ZhbGxiYWNrIGNvbG91cikgb250byBvbmUgcmVnaW9uIGZyb20gdGhlIENsYXNzXG4gICAqICBkcm9wZG93bjsgY2hvb3NpbmcgYSBjbGFzcyBvcHRzIHRoZSByZWdpb24gYmFjayBpbnRvIHRoZSBwcmVzZXQgY29sb3VyLiAqL1xuICBwcm90ZWN0ZWQgYXBwbHlQcmVzZXRUb1JlZ2lvbihyZWdpb246IFJlZ2lvbiwgY2xhc3NOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdGFuZElucy5oYXMocmVnaW9uKSkge1xuICAgICAgdm9pZCB0aGlzLnRha2VUaGVuKHJlZ2lvbiwgKHIpID0+IHRoaXMuYXBwbHlQcmVzZXRUb1JlZ2lvbihyLCBjbGFzc05hbWUpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IChjbGFzc05hbWUgPz8gJycpLnRyaW0oKTtcbiAgICBjb25zdCBwYXRjaDogUGFydGlhbDxSZWdpb24+ID0geyBsYWJlbDogbmFtZSwgY29sb3JPdmVycmlkZGVuOiBmYWxzZSB9O1xuICAgIGlmIChuYW1lKSBwYXRjaC5jb2xvciA9IGNvbG9yRm9yTGFiZWwobmFtZSwgdGhpcy5wcmVzZXRTZXQpO1xuICAgIHRoaXMucGF0Y2hSZWdpb25zKChyKSA9PiAociA9PT0gcmVnaW9uID8gcGF0Y2ggOiBudWxsKSk7XG4gICAgdGhpcy5jb21taXQoKTtcbiAgfVxuXG4gIC8qKiBNYWtlIGEgY2xhc3MgYWN0aXZlICh1c2VkIGZvciBuZXcgcmVnaW9ucykgYW5kLCBpZiByb3dzIGFyZSBzZWxlY3RlZCwgYXBwbHlcbiAgICogIGl0IHRvIHRoZW0gaW4gb25lIGNvbW1pdC4gKi9cbiAgcHJvdGVjdGVkIHNlbGVjdEFjdGl2ZUNsYXNzKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlQ2xhc3MgPSBuYW1lO1xuICAgIHRoaXMuYXBwbHlDbGFzc1RvU2VsZWN0ZWQobmFtZSk7XG4gIH1cblxuICAvKiogQXBwbHkgYSBjbGFzcyAobGFiZWwgKyBwcmVzZXQvZmFsbGJhY2sgY29sb3VyKSB0byB0aGUgY3VycmVudCBzZWxlY3Rpb24gYW5kIGNvbW1pdC4gKi9cbiAgcHJpdmF0ZSBhcHBseUNsYXNzVG9TZWxlY3RlZChuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IG5ldyBTZXQodGhpcy5zZWxlY3RlZFJlZ2lvbnMgPz8gW10pO1xuICAgIGlmICghc2VsZWN0ZWQuc2l6ZSkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbG9yID0gY29sb3JGb3JMYWJlbChuYW1lLCB0aGlzLnByZXNldFNldCk7XG4gICAgdGhpcy5wYXRjaFJlZ2lvbnMoKHIpID0+IChzZWxlY3RlZC5oYXMocikgPyB7IGxhYmVsOiBuYW1lLCBjb2xvck92ZXJyaWRkZW46IGZhbHNlLCBjb2xvciB9IDogbnVsbCkpO1xuICAgIHRoaXMuY29tbWl0KCk7XG4gIH1cblxuICAvKiogXCJFZGl0IGNsYXNzIG9uIHNlbGVjdGVkIHJvd3NcIiBwb3B1cCDigJQgYXBwbHkgdGhlIGNob3NlbiBleGlzdGluZyBjbGFzcy4gKi9cbiAgcHJvdGVjdGVkIGFwcGx5QnVsa0NsYXNzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5idWxrQ2xhc3MpIHJldHVybjtcbiAgICB0aGlzLmFwcGx5Q2xhc3NUb1NlbGVjdGVkKHRoaXMuYnVsa0NsYXNzKTtcbiAgICB0aGlzLm92ZXJsYXlQYW5lbD8uaGlkZSgpO1xuICB9XG5cbiAgLyoqIFwiRWRpdCBjbGFzcyBvbiBzZWxlY3RlZCByb3dzXCIgcG9wdXAg4oCUIGFkZCBhIG5ldyBjbGFzcyBhbmQgc2V0IGl0IG9uIHRoZSBzZWxlY3Rpb24uICovXG4gIHByb3RlY3RlZCBhZGRBbmRBcHBseUJ1bGtDbGFzcygpOiB2b2lkIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5uZXdCdWxrQ2xhc3MudHJpbSgpO1xuICAgIGlmICghbmFtZSkgcmV0dXJuO1xuICAgIGNvbnN0IGtleSA9IHByZXNldEtleSh0aGlzLnByZXNldFNldCwgbmFtZSk7XG4gICAgY29uc3QgZXhpc3RzID0gdGhpcy5wcmVzZXRTZXQuY2xhc3Nlcy5zb21lKChjKSA9PiBwcmVzZXRLZXkodGhpcy5wcmVzZXRTZXQsIGMubmFtZSkgPT09IGtleSk7XG4gICAgaWYgKCFleGlzdHMpIHtcbiAgICAgIHRoaXMucmVnaW9uQXBpLnVwc2VydENsYXNzKHsgbmFtZSwgY29sb3I6IGNvbG9yRm9yTGFiZWwobmFtZSwgdGhpcy5wcmVzZXRTZXQpLCBzb3VyY2U6ICd1c2VyJyB9KTtcbiAgICB9XG4gICAgdGhpcy5hcHBseUNsYXNzVG9TZWxlY3RlZChuYW1lKTtcbiAgICB0aGlzLmJ1bGtDbGFzcyA9IG5hbWU7XG4gICAgdGhpcy5uZXdCdWxrQ2xhc3MgPSAnJztcbiAgICB0aGlzLm92ZXJsYXlQYW5lbD8uaGlkZSgpO1xuICB9XG5cbiAgLy8g4pSA4pSAIE1hbmFnZS1jbGFzc2VzIGRpYWxvZyDilIDilIBcbiAgcHJvdGVjdGVkIG9wZW5NYW5hZ2VEaWFsb2coKTogdm9pZCB7XG4gICAgdGhpcy5wcmVzZXREcmFmdCA9IHRoaXMuY2xvbmVQcmVzZXRTZXQodGhpcy5wcmVzZXRTZXQpO1xuICAgIHRoaXMuc2hvd01hbmFnZURpYWxvZyA9IHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBjbG9uZVByZXNldFNldChzOiBQcmVzZXRTZXQpOiBQcmVzZXRTZXQge1xuICAgIHJldHVybiB7XG4gICAgICBjbGFzc2VzOiAocy5jbGFzc2VzID8/IFtdKS5tYXAoKGMpID0+ICh7IC4uLmMgfSkpLFxuICAgICAgZmFsbGJhY2tQYWxldHRlOiBbLi4uKHMuZmFsbGJhY2tQYWxldHRlID8/IFtdKV0sXG4gICAgICBhdXRvUHJvbW90ZTogISFzLmF1dG9Qcm9tb3RlLFxuICAgICAgbWF0Y2hNb2RlOiBzLm1hdGNoTW9kZSA9PT0gJ25vcm1hbGl6ZWQnID8gJ25vcm1hbGl6ZWQnIDogJ2V4YWN0JyxcbiAgICB9O1xuICB9XG4gIC8qKiBDb21taXQgdGhlIGRyYWZ0OiBkcm9wIGJsYW5rL2R1cGxpY2F0ZSBuYW1lcywgcGVyc2lzdCwgYW5kIHJlY29sb3VyXG4gICAqICBub24tb3ZlcnJpZGRlbiByZWdpb25zIHdpdGggdGhlIHVwZGF0ZWQgcHJlc2V0cy4gKi9cbiAgcHJvdGVjdGVkIGFwcGx5TWFuYWdlRGlhbG9nKGNsb3NlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnByZXNldERyYWZ0KSByZXR1cm47XG4gICAgLy8gRGUtZHVwbGljYXRlIHVzaW5nIHRoZSBhY3RpdmUgbWF0Y2ggbW9kZSdzIGtleSBzbyBub3JtYWxpemVkIG1vZGUgY2FuJ3Qga2VlcFxuICAgIC8vIGJvdGggXCJUdW1vclwiIGFuZCBcInR1bW9yXCIgKHdoaWNoIHdvdWxkIGNvbGxpZGUgYXQgcnVudGltZSBpbiBmaW5kUHJlc2V0KCkpLlxuICAgIGNvbnN0IGRyYWZ0ID0gdGhpcy5wcmVzZXREcmFmdDtcbiAgICBjb25zdCBrZXlPZiA9IChzOiBzdHJpbmcpID0+IHByZXNldEtleShkcmFmdCwgcyk7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IGNsYXNzZXM6IENsYXNzUHJlc2V0W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGMgb2YgZHJhZnQuY2xhc3Nlcykge1xuICAgICAgY29uc3QgbmFtZSA9IChjLm5hbWUgPz8gJycpLnRyaW0oKTtcbiAgICAgIGNvbnN0IGtleSA9IGtleU9mKG5hbWUpO1xuICAgICAgaWYgKCFuYW1lIHx8IHNlZW4uaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgc2Vlbi5hZGQoa2V5KTtcbiAgICAgIGNsYXNzZXMucHVzaCh7IC4uLmMsIG5hbWUgfSk7XG4gICAgfVxuICAgIHRoaXMucHJlc2V0RHJhZnQgPSB7IC4uLmRyYWZ0LCBjbGFzc2VzIH07XG4gICAgLy8gQ2xhc3NlcyBkcm9wcGVkIGluIHRoZSBkaWFsb2c6IHRoZWlyIHJlZ2lvbnMgcmV2ZXJ0IHRvIHRoZSBkZWZhdWx0IFwiUmVnaW9uXCJcbiAgICAvLyBjbGFzcyAoZWxzZSBzeW5jQ2xhc3Nlc0Zyb21SZWdpb25zIHdvdWxkIGp1c3QgcmUtYWRkIHRoZW0pIChqaXQtdWkjNzApLlxuICAgIGNvbnN0IGtlcHQgPSBuZXcgU2V0KGNsYXNzZXMubWFwKChjKSA9PiBrZXlPZihjLm5hbWUpKSk7XG4gICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMucHJlc2V0U2V0LmNsYXNzZXMubWFwKChjKSA9PiBjLm5hbWUpLmZpbHRlcigobikgPT4gIWtlcHQuaGFzKGtleU9mKG4pKSk7XG4gICAgdGhpcy5yZWFzc2lnblJlZ2lvbnNUb0RlZmF1bHRDbGFzcyhyZW1vdmVkKTtcbiAgICB0aGlzLnJlZ2lvbkFwaS5zZXRQcmVzZXRTZXQodGhpcy5wcmVzZXREcmFmdCk7XG4gICAgdGhpcy5jb21taXQoKTsgLy8gcmVjb2xvdXIgZXhpc3RpbmcgKG5vbi1vdmVycmlkZGVuKSByZWdpb25zIGZyb20gdGhlIG5ldyBwcmVzZXRzXG4gICAgaWYgKGNsb3NlKSB0aGlzLnNob3dNYW5hZ2VEaWFsb2cgPSBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVzZXRQcmVzZXRzVG9EZWZhdWx0cygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkFwaS5yZXNldFByZXNldHMoKTtcbiAgICB0aGlzLnByZXNldERyYWZ0ID0gdGhpcy5jbG9uZVByZXNldFNldCh0aGlzLnJlZ2lvbkFwaS5nZXRQcmVzZXRTZXQoKSk7XG4gICAgdGhpcy5jb21taXQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZXhwb3J0UHJlc2V0cygpOiB2b2lkIHtcbiAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkodGhpcy5jbG9uZVByZXNldFNldCh0aGlzLnJlZ2lvbkFwaS5nZXRQcmVzZXRTZXQoKSksIG51bGwsIDIpO1xuICAgIHNhdmVBcyhuZXcgQmxvYihbanNvbl0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0pLCAnYW5ub3RhdGlvbi1jbGFzc2VzLmpzb24nKTtcbiAgfVxuICBwcm90ZWN0ZWQgaW1wb3J0UHJlc2V0cyhldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLnBlcnNpc3RlbmNlLnJlYWRDaG9zZW5GaWxlKGV2ZW50LCAodGV4dCkgPT4gdGhpcy5hcHBseUltcG9ydGVkUHJlc2V0cyh0ZXh0KSk7XG4gIH1cblxuICAvKiogVmFsaWRhdGUgYW5kIGFwcGx5IGFuIGltcG9ydGVkIGFubm90YXRpb24tY2xhc3NlcyBKU09OIGZpbGUuICovXG4gIHByaXZhdGUgYXBwbHlJbXBvcnRlZFByZXNldHModGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNldCA9IHBhcnNlUHJlc2V0U2V0KEpTT04ucGFyc2UodGV4dCkpO1xuICAgICAgaWYgKCFzZXQpIHRocm93IG5ldyBFcnJvcignVGhlIGZpbGUgaXMgbm90IGFuIGFubm90YXRpb24tY2xhc3MgbGlzdCAobm8gdmFsaWQgY2xhc3NlcykuJyk7XG4gICAgICB0aGlzLnJlZ2lvbkFwaS5zZXRQcmVzZXRTZXQoc2V0KTtcbiAgICAgIHRoaXMucHJlc2V0RHJhZnQgPSB0aGlzLmNsb25lUHJlc2V0U2V0KHRoaXMucmVnaW9uQXBpLmdldFByZXNldFNldCgpKTtcbiAgICAgIHRoaXMuY29tbWl0KCk7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgIGtleTogVklaX1RPQVNUX0tFWSxcbiAgICAgICAgc2V2ZXJpdHk6ICdzdWNjZXNzJyxcbiAgICAgICAgc3VtbWFyeTogJ0NsYXNzZXMgaW1wb3J0ZWQnLFxuICAgICAgICBkZXRhaWw6ICdBbm5vdGF0aW9uIGNsYXNzZXMgbG9hZGVkLicsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAga2V5OiBWSVpfVE9BU1RfS0VZLFxuICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgc3VtbWFyeTogJ0ltcG9ydCBmYWlsZWQnLFxuICAgICAgICBkZXRhaWw6IGAkeyhlcnIgYXMgRXJyb3IpPy5tZXNzYWdlID8/IGVycn1gLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlZCgpO1xuICB9XG5cbiAgLyoqIFRoZSBmaWxlcyBjaG9zZW4gaW4gdGhlIGltcG9ydCBpbnB1dHM6IG9uZSBHZW9KU09OLCBhIGxhYmVsIHZvbHVtZSB3aXRoIGl0cyBvbnRvbG9neSwgb3IgYVxuICAgKiAgZm9sZGVyIG9mIHBlci1zbGljZSBHZW9KU09OIGZpbGVzLiAqL1xuICBwcm90ZWN0ZWQgaW1wb3J0Um9pcyhldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBmaWxlcyA9IEFycmF5LmZyb20oKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5maWxlcyA/PyBbXSk7XG4gICAgaWYgKGZpbGVzLmxlbmd0aCkgdm9pZCB0aGlzLmltcG9ydFJlZ2lvbkZpbGVzKGZpbGVzLm1hcCgoZikgPT4gaW1wb3J0RmlsZShmLCBmLndlYmtpdFJlbGF0aXZlUGF0aCB8fCBmLm5hbWUpKSk7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgaG9zdCBjYW4gcGljayByZWdpb25zIG9uIGl0cyBzZXJ2ZXIgKFwiSW1wb3J0IHJlZ2lvbnMgZnJvbSBzZXJ2ZXJcIikuICovXG4gIHByb3RlY3RlZCBnZXQgY2FuSW1wb3J0RnJvbVNlcnZlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZS5jYW5QaWNrU2VydmVyUmVnaW9ucygpO1xuICB9XG4gIC8qKiBBbiBpbXBvcnQgZnJvbSB0aGUgc2VydmVyIGlzIGluIGZsaWdodC4gKi9cbiAgcHJvdGVjdGVkIGltcG9ydGluZyA9IGZhbHNlO1xuXG4gIC8qKiBcIkltcG9ydCByZWdpb25zIGZyb20gc2VydmVyXCI6IHRoZSBob3N0IHBpY2tzIGZpbGVzIG9yIGEgc2VydmVkIHJlZ2lvbiBzZXQ7IHRoZXkgaW1wb3J0IGFzIGNob3NlbiBmaWxlcyBkby4gKi9cbiAgcHJvdGVjdGVkIGltcG9ydEZyb21TZXJ2ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5pbXBvcnRpbmcgPSB0cnVlO1xuICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgIHRoaXMucGVyc2lzdGVuY2UucGlja1NlcnZlclJlZ2lvbnMoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHBpY2spID0+IHtcbiAgICAgICAgaWYgKCFwaWNrKSByZXR1cm47XG4gICAgICAgIGlmIChwaWNrLmtpbmQgPT09ICdmaWxlcycpIHtcbiAgICAgICAgICB2b2lkIHRoaXMuaW1wb3J0UmVnaW9uRmlsZXMocGljay5maWxlcy5tYXAoKGYpID0+IGltcG9ydEZpbGUoZi5kYXRhLCBmLm5hbWUpKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZvaWQgdGhpcy5pbXBvcnRTZXJ2ZWRSZWdpb25TZXQocGljay51cmwsIHBpY2submFtZSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnIpID0+IHRoaXMuaW1wb3J0RmFpbGVkKGVyciksXG4gICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICB0aGlzLmltcG9ydGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGBmaWxlc2A6IG9uZSBHZW9KU09OIGZpbGUgYXMgYmVmb3JlIChpdHMgcmVnaW9ucywgZWRpdGFibGUpOyBhbnl0aGluZyBlbHNlIChzZWVcbiAgICogcmVhZEFubm90YXRpb25TbGljZXMpIGFzIG9uZSByZWdpb24gc291cmNlIHBlciBzbGljZSwgcmVwbGFjaW5nIHRoZSByZWdpb25zIGFuZCBzb3VyY2VzIG9mXG4gICAqIGV2ZXJ5IHNsaWNlOiBhIGxhYmVsIHZvbHVtZSBvciBhbiBPTUUtWmFyciBsYWJlbCBpbWFnZSB0cmFjZWQgdGhlIGZpcnN0IHRpbWUgYSBzbGljZSBpcyBzaG93bixcbiAgICogaXRzIGNsYXNzZXMgbmFtZWQgKGFuZCB0cmVlZCkgYnkgaXRzIG9udG9sb2d5OyBhIGZvbGRlciBhcyBvbmUgc291cmNlIHBlciBzbGljZSBmaWxlOyBhXG4gICAqIHotaW5kZXhlZCBHZW9KU09OIG9uZSBwZXIgcGxhbmU7IGEgemlwIG9mIGFueSBvZiB0aGVzZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaW1wb3J0UmVnaW9uRmlsZXMoZmlsZXM6IFJlZ2lvbkltcG9ydEZpbGVbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEV2ZXJ5IHN0ZXAsIHJlYWRpbmcgdGhlIGZpbGVzIGluY2x1ZGVkLCByZXBvcnRzIGl0cyBmYWlsdXJlIGhlcmUgcmF0aGVyIHRoYW4gcmVqZWN0aW5nOlxuICAgIC8vIHRoZSBpbnB1dHMgY2FsbCB0aGlzIHdpdGhvdXQgd2FpdGluZyBvbiBpdC5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcGxhbiA9IGZpbGVzLnNvbWUoKGYpID0+IGlzWmlwTmFtZShmLm5hbWUpKSA/IG51bGwgOiBwbGFuUmVnaW9uSW1wb3J0KGZpbGVzKTtcbiAgICAgIGlmIChwbGFuPy5raW5kID09PSAnc2luZ2xlJykge1xuICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcGxhbi5maWxlLnRleHQoKTtcbiAgICAgICAgaWYgKG9uZVBsYW5lKHRleHQpKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hcHBseUltcG9ydGVkUm9pcyh0ZXh0KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGF0dGFjaCA9IHRoaXMucmVnaW9uQXBpLmltcG9ydFNsaWNlUmVnaW9uU291cmNlcz8uYmluZCh0aGlzLnJlZ2lvbkFwaSk7XG4gICAgICBpZiAoIWF0dGFjaCkge1xuICAgICAgICB0aGlzLmltcG9ydEZhaWxlZChuZXcgRXJyb3IoJ1RoaXMgdmlld2VyIGNhbm5vdCBob2xkIHJlZ2lvbiBzb3VyY2VzLicpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gVGFrZW4gYmVmb3JlIHRoZSBmaWxlcyBhcmUgcmVhZDogZGVjb2RpbmcgYSB2b2x1bWUgdGFrZXMgYSB3aGlsZSwgYW5kIHRoZSBpbXBvcnQgbXVzdCBsYW5kXG4gICAgICAvLyBvbiB0aGUgaW1hZ2UgaXQgd2FzIHN0YXJ0ZWQgZm9yLCBub3Qgb24gb25lIHNob3duIG1lYW53aGlsZS5cbiAgICAgIGNvbnN0IHRpY2tldCA9IHRoaXMucmVnaW9uQXBpLnJlZ2lvbkltcG9ydFRpY2tldD8uKCk7XG4gICAgICBjb25zdCBzZXQgPSBhd2FpdCByZWFkQW5ub3RhdGlvblNsaWNlcyhmaWxlcyk7XG4gICAgICBpZiAoIXNldCkge1xuICAgICAgICB0aGlzLmltcG9ydEZhaWxlZChcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnQ2hvb3NlIGEgR2VvSlNPTiBmaWxlLCBhIGZvbGRlciBvZiBHZW9KU09OIGZpbGVzLCBhIC5uaWksIC5uaWkuZ3ogb3IgLm5ycmQgbGFiZWwgdm9sdW1lLCAnICtcbiAgICAgICAgICAgICAgJ2FuIE9NRS1aYXJyIHN0b3JlLCBvciBhIC56aXAgb2YgYW55IG9mIHRoZXNlLicsXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHNldC5zaXplKSB0aGlzLndhcm5JZlNpemVEaWZmZXJzKHNldC5zaXplWzBdLCBzZXQuc2l6ZVsxXSk7XG4gICAgICBjb25zdCBhdHRhY2hlZCA9IGF0dGFjaChzZXQub3BlbmVycywgdGlja2V0KTtcbiAgICAgIGlmIChhdHRhY2hlZCA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLmltcG9ydFN0YWxlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWZ0ZXJTb3VyY2VJbXBvcnQoKTtcbiAgICAgIHRoaXMudG9hc3QoXG4gICAgICAgICdzdWNjZXNzJyxcbiAgICAgICAgJ1JlZ2lvbnMgaW1wb3J0ZWQnLFxuICAgICAgICBgJHtzZXQuc3VtbWFyeX07ICR7YXR0YWNoZWR9IHNsaWNlJHthdHRhY2hlZCA9PT0gMSA/ICcnIDogJ3MnfSBhbm5vdGF0ZWQuYCxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmltcG9ydEZhaWxlZChlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBBIHJlZ2lvbiBzZXQgdGhlIGhvc3QncyBzZXJ2ZXIgc2VydmVzIChqaXQtc2VydmljZSdzIC9yZWdpb25zL3tpZH0vKSwgcmVhZCB0aHJvdWdoIGl0cyBIdHRwQ2xpZW50LiAqL1xuICBwcml2YXRlIGFzeW5jIGltcG9ydFNlcnZlZFJlZ2lvblNldCh1cmw6IHN0cmluZywgbmFtZT86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGltcG9ydFNvdXJjZSA9IHRoaXMucmVnaW9uQXBpLmltcG9ydFJlZ2lvblNvdXJjZU9wZW5lcj8uYmluZCh0aGlzLnJlZ2lvbkFwaSk7XG4gICAgaWYgKCFpbXBvcnRTb3VyY2UpIHtcbiAgICAgIHRoaXMuaW1wb3J0RmFpbGVkKG5ldyBFcnJvcignVGhpcyB2aWV3ZXIgY2Fubm90IGhvbGQgcmVnaW9uIHNvdXJjZXMuJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0aWNrZXQgPSB0aGlzLnJlZ2lvbkFwaS5yZWdpb25JbXBvcnRUaWNrZXQ/LigpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhcHBsaWVkID0gYXdhaXQgaW1wb3J0U291cmNlKFxuICAgICAgICAoKSA9PiBvcGVuSHR0cFJlZ2lvblNvdXJjZSh1cmwsIHsgaHR0cDogdGhpcy5odHRwID8/IHVuZGVmaW5lZCB9KSxcbiAgICAgICAgdGlja2V0LFxuICAgICAgKTtcbiAgICAgIGlmIChhcHBsaWVkID09PSBmYWxzZSkge1xuICAgICAgICB0aGlzLmltcG9ydFN0YWxlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWZ0ZXJTb3VyY2VJbXBvcnQoKTtcbiAgICAgIHRoaXMudG9hc3QoJ3N1Y2Nlc3MnLCAnUmVnaW9ucyBpbXBvcnRlZCcsIG5hbWUgPz8gdXJsKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuaW1wb3J0RmFpbGVkKGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqIEFuIGltcG9ydCB0aGF0IGZpbmlzaGVkIGFmdGVyIGFub3RoZXIgaW1hZ2Ugd2FzIHNob3duIChvciBhbm90aGVyIGltcG9ydCBiZWdhbik6IGRyb3BwZWQuICovXG4gIHByaXZhdGUgaW1wb3J0U3RhbGUoKTogdm9pZCB7XG4gICAgdGhpcy50b2FzdCgnaW5mbycsICdJbXBvcnQgZGlzY2FyZGVkJywgJ1RoZSBpbWFnZSBjaGFuZ2VkIHdoaWxlIHRoZSByZWdpb25zIHdlcmUgYmVpbmcgcmVhZC4nKTtcbiAgICB0aGlzLmNoYW5nZWQoKTtcbiAgfVxuXG4gIC8qKiBUaGUgdGFibGUgYW5kIHNlbGVjdGlvbiBhZnRlciB0aGUgcmVnaW9ucyB3ZXJlIHJlcGxhY2VkIGJ5IGltcG9ydGVkIHNvdXJjZXMuICovXG4gIHByaXZhdGUgYWZ0ZXJTb3VyY2VJbXBvcnQoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZFJlZ2lvbnMgPSBbXTtcbiAgICB0aGlzLnBhZ2luYXRvckZpcnN0ID0gMDtcbiAgICB0aGlzLmNvbW1pdChbXSk7XG4gICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZWQoKTtcbiAgfVxuXG4gIC8qKiBXYXJuIHdoZW4gYW4gaW1wb3J0ZWQgdm9sdW1lJ3Mgc2xpY2VzIGFyZSBub3QgdGhlIGltYWdlJ3Mgc2l6ZTogaXRzIG91dGxpbmVzIHdvdWxkIG5vdCBmaXQuICovXG4gIHByaXZhdGUgd2FybklmU2l6ZURpZmZlcnMod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5yZWdpb25BcGkuZ2V0TWFza0ltYWdlU2l6ZSgpO1xuICAgIGlmIChtZXRhICYmIChtZXRhLndpZHRoICE9PSB3aWR0aCB8fCBtZXRhLmhlaWdodCAhPT0gaGVpZ2h0KSkge1xuICAgICAgdGhpcy50b2FzdChcbiAgICAgICAgJ2luZm8nLFxuICAgICAgICAnRGlmZmVyZW50IHNpemUnLFxuICAgICAgICBgVGhlIHZvbHVtZSdzIHNsaWNlcyBhcmUgJHt3aWR0aH0gw5cgJHtoZWlnaHR9OyB0aGUgaW1hZ2UgaXMgJHttZXRhLndpZHRofSDDlyAke21ldGEuaGVpZ2h0fS5gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGltcG9ydEZhaWxlZChlcnI6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLmltcG9ydGluZyA9IGZhbHNlO1xuICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgIGtleTogVklaX1RPQVNUX0tFWSxcbiAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgc3VtbWFyeTogJ0Vycm9yIGltcG9ydGluZyByZWdpb25zJyxcbiAgICAgIGRldGFpbDogYCR7KGVyciBhcyBFcnJvcik/Lm1lc3NhZ2UgPz8gZXJyfWAsXG4gICAgfSk7XG4gICAgY29uc29sZS5lcnJvcignRXJyb3IgaW1wb3J0aW5nIHJlZ2lvbnM6JywgZXJyKTtcbiAgICB0aGlzLmNoYW5nZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIHRoZSByZWdpb25zIHdpdGggYW4gaW1wb3J0ZWQgR2VvSlNPTiBmaWxlJ3MsIGFuZCB0aGUgc2xpY2UncyByZWdpb24gc291cmNlIHdpdGggdGhlbS5cbiAgICogQSBsYXJnZSBmaWxlIGJlY29tZXMgdGhlIHNsaWNlJ3MgcmVnaW9uIHNvdXJjZSBpbnN0ZWFkIChkcmF3biBieSBsZXZlbCBvZiBkZXRhaWw7IGxpc3RlZCBhYm92ZVxuICAgKiB0aGUgdGFibGUpLCB0aGUgdGFibGUgZW1wdGllZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXBwbHlJbXBvcnRlZFJvaXModGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLnJlZ2lvbkFwaS5pbXBvcnRSZWdpb25Tb3VyY2U/Lih0ZXh0KSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkUmVnaW9ucyA9IFtdO1xuICAgICAgICB0aGlzLnBhZ2luYXRvckZpcnN0ID0gMDtcbiAgICAgICAgdGhpcy5jb21taXQoW10pO1xuICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlZCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBQYXJzZWQgZmlyc3Q6IGEgZmlsZSB0aGF0IGlzIG5vdCBHZW9KU09OIGxlYXZlcyB0aGUgc291cmNlIGFsb25lLlxuICAgICAgY29uc3QgcmVnaW9ucyA9IHRoaXMucmVnaW9uQXBpLmltcG9ydFJlZ2lvbnModGV4dCk7XG4gICAgICBhd2FpdCB0aGlzLnJlZ2lvbkFwaS5kcm9wUmVnaW9uU291cmNlPy4oKTtcbiAgICAgIHRoaXMucmVnaW9ucyA9IHJlZ2lvbnM7XG4gICAgICB0aGlzLmZpbGxDbGFzc0NvbG9ycygpO1xuICAgICAgdGhpcy5jb21taXQoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAga2V5OiBWSVpfVE9BU1RfS0VZLFxuICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgc3VtbWFyeTogJ0Vycm9yIGltcG9ydGluZyB0aGUgZmlsZScsXG4gICAgICAgIGRldGFpbDogYCR7KGVyciBhcyBFcnJvcik/Lm1lc3NhZ2UgPz8gZXJyfWAsXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHJlYWRpbmcgdGhlIGZpbGU6JywgZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKiogUmVnaW9ucyB0byBzZXJpYWxpemUgb24gc2F2ZS9leHBvcnQgKGV2ZXJ5IHNsaWNlIGZvciBhIGNvbWJpbmVkIHotc3RhY2spLiAqL1xuICBwcml2YXRlIHJlZ2lvbnNGb3JTYXZlKCk6IFJlZ2lvbltdIHtcbiAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZS5yZWdpb25zRm9yU2F2ZSh0aGlzLnJlZ2lvbnMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGV4cG9ydFJvaXMoKSB7XG4gICAgaWYgKCF0aGlzLnJlZ2lvbnNGb3JTYXZlKCkubGVuZ3RoICYmICF0aGlzLmhhc1JlZ2lvblNvdXJjZSkgcmV0dXJuO1xuICAgIHRoaXMuZXhwb3J0RmlsZW5hbWUgPSB0aGlzLnBlcnNpc3RlbmNlLmRlZmF1bHRFeHBvcnROYW1lKCk7XG4gICAgdGhpcy5zaG93RXhwb3J0RGlhbG9nID0gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25maXJtRXhwb3J0KCkge1xuICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5leHBvcnRGaWxlbmFtZS50cmltKCk7XG4gICAgY29uc3QgcmVnaW9ucyA9IHRoaXMucmVnaW9uc0ZvclNhdmUoKTtcbiAgICBpZiAoIWZpbGVuYW1lIHx8ICghcmVnaW9ucy5sZW5ndGggJiYgIXRoaXMuaGFzUmVnaW9uU291cmNlKSkgcmV0dXJuO1xuICAgIHRoaXMuc2hvd0V4cG9ydERpYWxvZyA9IGZhbHNlO1xuICAgIHRoaXMucGVyc2lzdGVuY2VcbiAgICAgIC5kb3dubG9hZChyZWdpb25zLCBmaWxlbmFtZSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiB0aGlzLnRvYXN0KCdlcnJvcicsICdFcnJvciBleHBvcnRpbmcgcmVnaW9ucycsIGAkeyhlcnIgYXMgRXJyb3IpPy5tZXNzYWdlID8/IGVycn1gKSk7XG4gIH1cblxuICAvKiogT3BlbiB0aGUgXCJTYXZlIG1hc2tcIiBkaWFsb2csIHNlZWRlZCB3aXRoIGA8aW1hZ2Utc3RlbT5fbWFzay5wbmdgLiAqL1xuICBwcm90ZWN0ZWQgb3BlblNhdmVNYXNrRGlhbG9nKCkge1xuICAgIGlmICghdGhpcy5yZWdpb25zLmxlbmd0aCkgcmV0dXJuO1xuICAgIHRoaXMuc2F2ZU1hc2tGaWxlbmFtZSA9IHRoaXMucGVyc2lzdGVuY2UuZGVmYXVsdE1hc2tOYW1lKCk7XG4gICAgdGhpcy5tYXNrTW9kZSA9ICdiaW5hcnknO1xuICAgIHRoaXMuc2hvd1NhdmVNYXNrRGlhbG9nID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSYXN0ZXJpemUgdGhlIHJlZ2lvbnMgdG8gdGhlIGNob3NlbiBtYXNrIHR5cGUgYW5kIGRvd25sb2FkIGFzIGEgUE5HLiBUaGVcbiAgICogaGVhdnkgd29yayBydW5zIGluIGEgV2ViIFdvcmtlciAoe0BsaW5rIE1hc2tFeHBvcnRTZXJ2aWNlfSkgc28gdGhlIFVJIG5ldmVyXG4gICAqIGZyZWV6ZXMgb24gd2hvbGUtc2xpZGUgaW1hZ2VzIGFuZCB0aGUgam9iIGNhbiBiZSBjYW5jZWxsZWQgKGppdC11aSM5NSk7XG4gICAqIHRoZSBkaWFsb2cgc3RheXMgb3BlbiB3aXRoIGEgcHJvZ3Jlc3MgYmFyIHVudGlsIGRvbmUuXG4gICAqL1xuICBwcm90ZWN0ZWQgY29uZmlybVNhdmVNYXNrKCkge1xuICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5zYXZlTWFza0ZpbGVuYW1lLnRyaW0oKTtcbiAgICBpZiAoIWZpbGVuYW1lIHx8ICF0aGlzLnJlZ2lvbnMubGVuZ3RoIHx8IHRoaXMubWFza0J1c3kpIHJldHVybjtcblxuICAgIGNvbnN0IHNpemUgPSB0aGlzLnJlZ2lvbkFwaS5nZXRNYXNrSW1hZ2VTaXplKCk7XG4gICAgaWYgKCFzaXplKSB7XG4gICAgICB0aGlzLm1hc2tFcnJvcignTm8gaW1hZ2Ugc2l6ZSBpcyBhdmFpbGFibGUsIHNvIHRoZSBtYXNrIGNhbm5vdCBiZSBzaXplZC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5tYXNrQnVzeSA9IHRydWU7XG4gICAgdGhpcy5tYXNrRW5jb2RpbmcgPSBmYWxzZTtcbiAgICB0aGlzLm1hc2tQcm9ncmVzcyA9IDA7XG4gICAgdGhpcy5tYXNrSm9iID0gdGhpcy5tYXNrRXhwb3J0XG4gICAgICAuZXhwb3J0KHtcbiAgICAgICAgcmVnaW9uczogdGhpcy5yZWdpb25zLFxuICAgICAgICBpbWFnZVNpemU6IHNpemUsXG4gICAgICAgIG1vZGU6IHRoaXMubWFza01vZGUsXG4gICAgICAgIHNvdXJjZU5hbWU6IHRoaXMucGVyc2lzdGVuY2Uuc2VsZWN0ZWRGaWxlTmFtZSgpLFxuICAgICAgfSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoZSkgPT4ge1xuICAgICAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgICAgIHN3aXRjaCAoZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdwbGFubmVkJzpcbiAgICAgICAgICAgICAgaWYgKGUuc2NhbGUgPCAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgICAgICAgICAga2V5OiBWSVpfVE9BU1RfS0VZLFxuICAgICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdpbmZvJyxcbiAgICAgICAgICAgICAgICAgIHN1bW1hcnk6ICdNYXNrIGRvd25zY2FsZWQnLFxuICAgICAgICAgICAgICAgICAgZGV0YWlsOiBgSW1hZ2UgdG9vIGxhcmdlIGZvciBhIGZ1bGwtcmVzb2x1dGlvbiBtYXNrOyBzYXZpbmcgYXQgJHtlLndpZHRofcOXJHtlLmhlaWdodH0uYCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3Byb2dyZXNzJzpcbiAgICAgICAgICAgICAgdGhpcy5tYXNrUHJvZ3Jlc3MgPSBlLnBlcmNlbnQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZW5jb2RpbmcnOlxuICAgICAgICAgICAgICB0aGlzLm1hc2tFbmNvZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZG9uZSc6XG4gICAgICAgICAgICAgIHRoaXMuZmluaXNoTWFzayhlLmJsb2IsIGZpbGVuYW1lKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycjogRXJyb3IpID0+IHtcbiAgICAgICAgICB0aGlzLm1hc2tFcnJvcihlcnIubWVzc2FnZSk7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKiBDYW5jZWwgYW4gaW4tcHJvZ3Jlc3MgbWFzayBleHBvcnQgKHRlcm1pbmF0ZXMgaXRzIHdvcmtlcikgYW5kIHJlc2V0IHN0YXRlLiAqL1xuICBwcm90ZWN0ZWQgY2FuY2VsU2F2ZU1hc2soKSB7XG4gICAgdGhpcy5tYXNrSm9iPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMubWFza0pvYiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm1hc2tCdXN5ID0gZmFsc2U7XG4gICAgdGhpcy5tYXNrRW5jb2RpbmcgPSBmYWxzZTtcbiAgICB0aGlzLm1hc2tQcm9ncmVzcyA9IDA7XG4gIH1cblxuICBwcml2YXRlIGZpbmlzaE1hc2soYmxvYjogQmxvYiwgZmlsZW5hbWU6IHN0cmluZykge1xuICAgIHRoaXMubWFza0pvYiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm1hc2tCdXN5ID0gZmFsc2U7XG4gICAgdGhpcy5tYXNrRW5jb2RpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnNob3dTYXZlTWFza0RpYWxvZyA9IGZhbHNlO1xuICAgIHNhdmVBcyhibG9iLCBmaWxlbmFtZSk7XG4gIH1cblxuICBwcml2YXRlIG1hc2tFcnJvcihkZXRhaWw6IHN0cmluZykge1xuICAgIHRoaXMubWFza0pvYiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm1hc2tCdXN5ID0gZmFsc2U7XG4gICAgdGhpcy5tYXNrRW5jb2RpbmcgPSBmYWxzZTtcbiAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICBrZXk6IFZJWl9UT0FTVF9LRVksXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIHN1bW1hcnk6ICdDb3VsZCBub3QgY3JlYXRlIG1hc2snLFxuICAgICAgZGV0YWlsLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBlcnNpc3RSZWdpb25zKCkge1xuICAgIC8vIEZvbGRlciBzdGFjazogd3JpdGUgZWFjaCBzbGljZSdzIHJlZ2lvbnMgYmFjayB0byBpdHMgb3duIHNsaWNlLWZpbGUnc1xuICAgIC8vIHNpYmxpbmcgZ2VvanNvbiDigJQgbm8gc2luZ2xlLWZpbGVuYW1lIHByb21wdCAoaml0LXVpIzkzKS5cbiAgICBpZiAodGhpcy5wZXJzaXN0ZW5jZS5zYXZlc1BlclNsaWNlKCkpIHtcbiAgICAgIHRoaXMuc2F2ZVN0YWNrU2xpY2VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5wZXJzaXN0ZW5jZS5kZWZhdWx0U2F2ZU5hbWUoKTtcbiAgICBpZiAoIWZpbGVuYW1lIHx8ICghdGhpcy5yZWdpb25zRm9yU2F2ZSgpLmxlbmd0aCAmJiAhdGhpcy5oYXNSZWdpb25Tb3VyY2UpKSByZXR1cm47XG5cbiAgICB0aGlzLnNhdmVBc0ZpbGVuYW1lID0gZmlsZW5hbWU7XG4gICAgdGhpcy5zYXZlQXNGaWxlRXhpc3RzID0gZmFsc2U7XG4gICAgdGhpcy5zaG93U2F2ZUFzRGlhbG9nID0gdHJ1ZTtcbiAgICB0aGlzLnNhdmVBc0NoZWNrJC5uZXh0KHRoaXMuc2F2ZUFzRmlsZW5hbWUpO1xuICB9XG5cbiAgLyoqIFNhdmUgYSBmb2xkZXIgc3RhY2sncyByZWdpb25zIGFzIG9uZSBnZW9qc29uIHBlciBzbGljZS1maWxlIChqaXQtdWkjOTMpLlxuICAgKiAgTm8gZGlhbG9nIGNvdmVycyB0aGUgdG9vbGJhciBtZWFud2hpbGUsIHNvIGEgU2F2ZSB3aGlsZSBvbmUgaXMgdXBsb2FkaW5nXG4gICAqICBpcyBpZ25vcmVkIHJhdGhlciB0aGFuIHN0YXJ0aW5nIGEgc2Vjb25kIHdyaXRlIChhbmQgb3JwaGFuaW5nIHRoZSBmaXJzdCkuICovXG4gIHByaXZhdGUgYXN5bmMgc2F2ZVN0YWNrU2xpY2VzKCkge1xuICAgIGlmICh0aGlzLnNhdmVBc0J1c3kpIHJldHVybjtcbiAgICB0aGlzLnNhdmVBc0J1c3kgPSB0cnVlO1xuICAgIGxldCBzbGljZXM6IFNsaWNlR2VvSnNvbltdO1xuICAgIHRyeSB7XG4gICAgICBzbGljZXMgPSBhd2FpdCB0aGlzLnBlcnNpc3RlbmNlLnNsaWNlR2VvSnNvbnMoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuc2F2ZUFzQnVzeSA9IGZhbHNlO1xuICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICB0aGlzLnRvYXN0KCdlcnJvcicsICdFcnJvciBzYXZpbmcgcmVnaW9ucycsIGAkeyhlcnIgYXMgRXJyb3IpPy5tZXNzYWdlID8/IGVycn1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQ2FuY2VsbGVkIHdoaWxlIHRoZSBzbGljZXMgc2VyaWFsaXplZCwgb3Igbm90aGluZyB0byB3cml0ZS5cbiAgICBpZiAoIXRoaXMuc2F2ZUFzQnVzeSB8fCAhc2xpY2VzLmxlbmd0aCkge1xuICAgICAgdGhpcy5zYXZlQXNCdXN5ID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3NhdmVBc1N1YiA9IHRoaXMucGVyc2lzdGVuY2Uuc2F2ZVNsaWNlcyhzbGljZXMpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2F2ZUFzQnVzeSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgICAgdGhpcy50b2FzdChcbiAgICAgICAgICAnc3VjY2VzcycsXG4gICAgICAgICAgJ1JlZ2lvbnMgc2F2ZWQnLFxuICAgICAgICAgIGBTYXZlZCBST0lzIGZvciAke3NsaWNlcy5sZW5ndGh9IHNsaWNlJHtzbGljZXMubGVuZ3RoID09PSAxID8gJycgOiAncyd9YCxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICB0aGlzLnNhdmVBc0J1c3kgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICAgIHRoaXMudG9hc3QoJ2Vycm9yJywgJ0Vycm9yIHNhdmluZyByZWdpb25zJywgYCR7KGVyciBhcyBFcnJvcik/Lm1lc3NhZ2UgPz8gZXJyfWApO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja1NhdmVBc0ZpbGVFeGlzdHMoKSB7XG4gICAgdGhpcy5zYXZlQXNDaGVjayQubmV4dCh0aGlzLnNhdmVBc0ZpbGVuYW1lKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25maXJtU2F2ZUFzKCkge1xuICAgIGlmICghdGhpcy5wZXJzaXN0ZW5jZS5zZWxlY3RlZEZpbGVOYW1lKCkpIHJldHVybjtcblxuICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5zYXZlQXNGaWxlbmFtZS50cmltKCk7XG4gICAgaWYgKCFmaWxlbmFtZSkgcmV0dXJuO1xuXG4gICAgLy8gS2VlcCB0aGUgZGlhbG9nIG9wZW4gc2hvd2luZyBhbiAoaW5kZXRlcm1pbmF0ZSkgcHJvZ3Jlc3MgYmFyIHdoaWxlIHRoZVxuICAgIC8vIHJlZ2lvbnMgc2VyaWFsaXplIGFuZCB1cGxvYWQsIHRoZW4gY2xvc2Ugb24gc3VjY2Vzcy5cbiAgICBjb25zdCBkb1NhdmUgPSAoKSA9PiB7XG4gICAgICB0aGlzLnNhdmVBc0J1c3kgPSB0cnVlO1xuICAgICAgLy8gQWxzbyBydW4gZnJvbSB0aGUgb3ZlcndyaXRlIGNvbmZpcm1hdGlvbiwgd2hpY2ggdGhlIGhvc3QncyBkaWFsb2cgbWF5IGFuc3dlci5cbiAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgdGhpcy5fc2F2ZUFzU3ViID0gdGhpcy5wZXJzaXN0ZW5jZVxuICAgICAgICAuc2F2ZSgoKSA9PiB0aGlzLnJlZ2lvbnNGb3JTYXZlKCksIGZpbGVuYW1lKVxuICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNhdmVBc0J1c3kgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc2hvd1NhdmVBc0RpYWxvZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICAgICAgICB0aGlzLnRvYXN0KCdzdWNjZXNzJywgJ1JlZ2lvbnMgc2F2ZWQnLCBgU2F2ZWQgYXMgJHtmaWxlbmFtZX1gKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNhdmVBc0J1c3kgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgICAgICAgdGhpcy50b2FzdCgnZXJyb3InLCAnRXJyb3Igc2F2aW5nIHJlZ2lvbnMnLCBgJHsoZXJyIGFzIEVycm9yKT8ubWVzc2FnZSB8fCBlcnJ9YCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGlmICh0aGlzLnNhdmVBc0ZpbGVFeGlzdHMpIHtcbiAgICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcbiAgICAgICAgbWVzc2FnZTogYFwiJHtmaWxlbmFtZX1cIiBhbHJlYWR5IGV4aXN0cy4gRG8geW91IHdhbnQgdG8gb3ZlcndyaXRlIGl0P2AsXG4gICAgICAgIGhlYWRlcjogJ0NvbmZpcm0gT3ZlcndyaXRlJyxcbiAgICAgICAgaWNvbjogJ3BpIHBpLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJyxcbiAgICAgICAgYWNjZXB0OiBkb1NhdmUsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9TYXZlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENhbmNlbCBhbiBpbi1wcm9ncmVzcyBHZW9KU09OIHBlcnNpc3Q6IGFib3J0IHRoZSBkZWZlcnJlZCBzZXJpYWxpemUgYW5kL29yXG4gICAqICB0aGUgaW4tZmxpZ2h0IHVwbG9hZCwgYW5kIHJlc2V0IHN0YXRlLiAqL1xuICBwcm90ZWN0ZWQgY2FuY2VsU2F2ZUFzKCkge1xuICAgIHRoaXMuX3NhdmVBc1N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9zYXZlQXNTdWIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5zYXZlQXNCdXN5ID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHRvYXN0KHNldmVyaXR5OiAnc3VjY2VzcycgfCAnZXJyb3InIHwgJ2luZm8nLCBzdW1tYXJ5OiBzdHJpbmcsIGRldGFpbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBrZXk6IFZJWl9UT0FTVF9LRVksIHNldmVyaXR5LCBzdW1tYXJ5LCBkZXRhaWwgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIG9uZSBHZW9KU09OIGZpbGUgaG9sZHMgYSBzaW5nbGUgcGxhbmUgKGl0cyByZWdpb25zIGltcG9ydGVkIGFzIHRoZXkgYWx3YXlzIHdlcmUpLiBPbmVcbiAqIHRoYXQgZG9lcyBub3QgcGFyc2UgaXMgdGFrZW4gYXMgb25lIHRvbywgc28gdGhlIHJlZ2lvbnMgaW1wb3J0IHJlcG9ydHMgaXQgYXMgaXQgYWx3YXlzIGhhcy5cbiAqL1xuZnVuY3Rpb24gb25lUGxhbmUodGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHNwbGl0QnlQbGFuZSh0ZXh0KS5sZW5ndGggPT09IDE7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iLCI8cC10b29sYmFyIHN0eWxlQ2xhc3M9XCJyZWdpb24tdG9vbGJhclwiPlxuICA8ZGl2IGNsYXNzPVwicC10b29sYmFyLWdyb3VwLXN0YXJ0IGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LXdyYXAgZ2FwLTFcIj5cbiAgICA8cC1idXR0b25cbiAgICAgIGljb249XCJwaSBwaS10YWdcIlxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgIFt0ZXh0XT1cIiFzaG93U2hhcGVMYWJlbFwiXG4gICAgICBwVG9vbHRpcD1cIlNob3cgcmVnaW9uIGxhYmVscy5cIlxuICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgIChvbkNsaWNrKT1cInNob3dTaGFwZUxhYmVsID0gIXNob3dTaGFwZUxhYmVsOyBjaGFuZ2VTaG93U2hhcGVMYWJlbChzaG93U2hhcGVMYWJlbClcIlxuICAgID5cbiAgICA8L3AtYnV0dG9uPlxuICAgIDxwLWJ1dHRvblxuICAgICAgaWNvbj1cInBpIHBpLXN0b3AtY2lyY2xlXCJcbiAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICBbdGV4dF09XCIhcmVnaW9uc0ZpbGxlZFwiXG4gICAgICBwVG9vbHRpcD1cIkZpbGwgcmVnaW9ucyBpbiB0aGVpciBjb2xvdXIgKGFuIGF0bGFzJ3MgbG9vayk7IGxhYmVscyBzaXQgaW5zaWRlLlwiXG4gICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxuICAgICAgYXJpYUxhYmVsPVwiRmlsbCByZWdpb25zXCJcbiAgICAgIChvbkNsaWNrKT1cInRvZ2dsZUZpbGwoKVwiXG4gICAgPlxuICAgIDwvcC1idXR0b24+XG4gICAgPHAtYnV0dG9uXG4gICAgICAqbmdJZj1cInZvbHVtZVZpZXdcIlxuICAgICAgaWNvbj1cInBpIHBpLWV5ZVwiXG4gICAgICBzaXplPVwic21hbGxcIlxuICAgICAgW3RleHRdPVwiIXJlZ2lvbnNUaHJvdWdoVm9sdW1lXCJcbiAgICAgIFthdHRyLmFyaWEtcHJlc3NlZF09XCJyZWdpb25zVGhyb3VnaFZvbHVtZVwiXG4gICAgICBwVG9vbHRpcD1cIlNlZSB0aGUgcmVnaW9ucyB0aHJvdWdoIHRoZSB2b2x1bWUuIE9mZiwgdGhlIHZvbHVtZSBoaWRlcyB0aGUgcGFydHMgb2YgdGhlbSBiZWhpbmQgd2hhdCBpdCBzaG93czsgb24sIG5vbmUgKGxheWVycyB0cmFjZWQgaW5zaWRlIGJyaWdodCBzdHJ1Y3R1cmVzLCBzdWNoIGFzIGFuIE9DVCdzKS5cIlxuICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgIGFyaWFMYWJlbD1cIlJlZ2lvbnMgdGhyb3VnaCB2b2x1bWVcIlxuICAgICAgKG9uQ2xpY2spPVwidG9nZ2xlVGhyb3VnaFZvbHVtZSgpXCJcbiAgICA+XG4gICAgPC9wLWJ1dHRvbj5cbiAgICA8c3BhbiBjbGFzcz1cInRvb2xiYXItc2VwYXJhdG9yXCI+PC9zcGFuPlxuICAgIDwhLS0gTmV3IHJlZ2lvbnMgYXJlIG5vdyBjcmVhdGVkIGZyb20gdGhlIGRpYWdyYW0gdG9vbGJhclxuICAgICAgICAgKHJlY3RhbmdsZSwgcG9seWxpbmUsIGZyZWVmb3JtLCB3YW5kKS4gLS0+XG4gICAgPHAtYnV0dG9uXG4gICAgICBpY29uPVwicGkgcGktdXBsb2FkXCJcbiAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICBbdGV4dF09XCJ0cnVlXCJcbiAgICAgIHN0eWxlQ2xhc3M9XCJtci0yXCJcbiAgICAgIHBUb29sdGlwPVwiSW1wb3J0IHJlZ2lvbnM6IGEgR2VvSlNPTiBmaWxlLCBvciBhIGxhYmVsIHZvbHVtZSAoLm5paSwgLm5paS5neiwgLm5ycmQpIGNob3NlbiB3aXRoIGl0cyBvbnRvbG9neSBKU09OIGZvciB0aGUgY2xhc3MgdHJlZS5cIlxuICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgIChjbGljayk9XCJyb2lGaWxlSW5wdXQuY2xpY2soKVwiXG4gICAgPlxuICAgIDwvcC1idXR0b24+XG4gICAgPGlucHV0XG4gICAgICAjcm9pRmlsZUlucHV0XG4gICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICBhY2NlcHQ9XCIuZ2VvanNvbiwuanNvbiwubmlpLC5neiwubnJyZFwiXG4gICAgICBtdWx0aXBsZVxuICAgICAgaGlkZGVuXG4gICAgICAoY2hhbmdlKT1cImltcG9ydFJvaXMoJGV2ZW50KTsgcm9pRmlsZUlucHV0LnZhbHVlID0gJydcIlxuICAgIC8+XG4gICAgPHAtYnV0dG9uXG4gICAgICBpY29uPVwicGkgcGktZm9sZGVyLW9wZW5cIlxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgIFt0ZXh0XT1cInRydWVcIlxuICAgICAgc3R5bGVDbGFzcz1cIm1yLTJcIlxuICAgICAgcFRvb2x0aXA9XCJJbXBvcnQgYSBmb2xkZXIgb2YgcGVyLXNsaWNlIEdlb0pTT04gZmlsZXMgKG9uZSBwZXIgc2xpY2UsIGluIG5hbWUgb3JkZXIsIHdpdGggaXRzIHJlZ2lvbnNldC5qc29uIGNsYXNzIHRyZWUpLlwiXG4gICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxuICAgICAgYXJpYUxhYmVsPVwiSW1wb3J0IGEgZm9sZGVyIG9mIHJlZ2lvbnNcIlxuICAgICAgKGNsaWNrKT1cInJvaUZvbGRlcklucHV0LmNsaWNrKClcIlxuICAgID5cbiAgICA8L3AtYnV0dG9uPlxuICAgIDxpbnB1dFxuICAgICAgI3JvaUZvbGRlcklucHV0XG4gICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICB3ZWJraXRkaXJlY3RvcnlcbiAgICAgIG11bHRpcGxlXG4gICAgICBoaWRkZW5cbiAgICAgIChjaGFuZ2UpPVwiaW1wb3J0Um9pcygkZXZlbnQpOyByb2lGb2xkZXJJbnB1dC52YWx1ZSA9ICcnXCJcbiAgICAvPlxuICAgIDxwLWJ1dHRvblxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgIFt0ZXh0XT1cInRydWVcIlxuICAgICAgc3R5bGVDbGFzcz1cIm1yLTJcIlxuICAgICAgcFRvb2x0aXA9XCJEb3dubG9hZCByZWdpb25zIGFzIGdlb2pzb24gZmlsZS5cIlxuICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgIGljb249XCJwaSBwaS1kb3dubG9hZFwiXG4gICAgICAoY2xpY2spPVwiZXhwb3J0Um9pcygpXCJcbiAgICA+XG4gICAgPC9wLWJ1dHRvbj5cbiAgICA8cC1idXR0b25cbiAgICAgIGljb249XCJwaSBwaS1zYXZlXCJcbiAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICBbdGV4dF09XCJ0cnVlXCJcbiAgICAgIHN0eWxlQ2xhc3M9XCJtci0yXCJcbiAgICAgIHBUb29sdGlwPVwiU2F2ZSByZWdpb25zIHRvIHNlcnZlci5cIlxuICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgIChjbGljayk9XCJwZXJzaXN0UmVnaW9ucygpXCJcbiAgICAgIFtkaXNhYmxlZF09XCIoIXJlZ2lvbnMgfHwgIXJlZ2lvbnMubGVuZ3RoKSAmJiAhaGFzUmVnaW9uU291cmNlXCJcbiAgICA+XG4gICAgPC9wLWJ1dHRvbj5cbiAgICA8cC1idXR0b25cbiAgICAgICpuZ0lmPVwiY2FuSW1wb3J0RnJvbVNlcnZlclwiXG4gICAgICBpY29uPVwicGkgcGktY2xvdWQtZG93bmxvYWRcIlxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgIFt0ZXh0XT1cInRydWVcIlxuICAgICAgc3R5bGVDbGFzcz1cIm1yLTJcIlxuICAgICAgcFRvb2x0aXA9XCJJbXBvcnQgcmVnaW9ucyBmcm9tIHNlcnZlcjogYSBHZW9KU09OIGZpbGUsIGEgZm9sZGVyIG9mIHBlci1zbGljZSBHZW9KU09OIGZpbGVzIG9yIGEgbGFiZWwgdm9sdW1lICgubmlpLCAubmlpLmd6LCAubnJyZCkuXCJcbiAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXG4gICAgICBhcmlhTGFiZWw9XCJJbXBvcnQgcmVnaW9ucyBmcm9tIHNlcnZlclwiXG4gICAgICBbbG9hZGluZ109XCJpbXBvcnRpbmdcIlxuICAgICAgKGNsaWNrKT1cImltcG9ydEZyb21TZXJ2ZXIoKVwiXG4gICAgPlxuICAgIDwvcC1idXR0b24+XG4gICAgPHAtYnV0dG9uXG4gICAgICBzaXplPVwic21hbGxcIlxuICAgICAgW3RleHRdPVwidHJ1ZVwiXG4gICAgICBzdHlsZUNsYXNzPVwibXItMlwiXG4gICAgICBwVG9vbHRpcD1cIkRvd25sb2FkIG1hc2sgb2YgdGhlIHJlZ2lvbnMgYXMgUE5HXCJcbiAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXG4gICAgICAoY2xpY2spPVwib3BlblNhdmVNYXNrRGlhbG9nKClcIlxuICAgICAgW2Rpc2FibGVkXT1cIiFyZWdpb25zIHx8ICFyZWdpb25zLmxlbmd0aFwiXG4gICAgPlxuICAgICAgPCEtLSBSZWZlcmVuY2VzIHRoZSBmaWxlIHNvIElua3NjYXBlIGVkaXRzIHRvIG1hc2suc3ZnIHNob3cgdXAgZGlyZWN0bHlcbiAgICAgICAgICAgKHRoZSBsaWIncyBhc3NldHMvKiogYXJlIHNlcnZlZCBhdCBhc3NldHMvcGxvdHRpbmcvKS4gVGhlXG4gICAgICAgICAgIHRvb2xiYXItaWNvbi1kYXJrIGZpbHRlciByZWNvbG91cnMgdGhlIGJsYWNrIFNWRyB0byB0aGUgdGhlbWUgYmx1ZSxcbiAgICAgICAgICAgc2FtZSBhcyByZWdpb24tZWRpdG9yLnN2ZyBhbmQgdGhlIG90aGVyIFNWRyB0b29sYmFyIGljb25zLiAtLT5cbiAgICAgIDxpbWdcbiAgICAgICAgc3JjPVwiYXNzZXRzL3Bsb3R0aW5nL21hc2suc3ZnXCJcbiAgICAgICAgY2xhc3M9XCJ0b29sYmFyLWljb24tZGFya1wiXG4gICAgICAgIHN0eWxlPVwid2lkdGg6IDFyZW07IGhlaWdodDogMXJlbTsgdmVydGljYWwtYWxpZ246IG1pZGRsZVwiXG4gICAgICAgIGFsdD1cIkRvd25sb2FkIG1hc2tcIlxuICAgICAgLz5cbiAgICA8L3AtYnV0dG9uPlxuICAgIDxwLWJ1dHRvblxuICAgICAgbGFiZWw9XCJ4NTEyXCJcbiAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICBbdGV4dF09XCJ0cnVlXCJcbiAgICAgIHN0eWxlQ2xhc3M9XCJtci0yXCJcbiAgICAgIHBUb29sdGlwPVwiUm91bmQgYWxsIHJlY3RhbmdsZSByZWdpb25zXG4gICAgICAgICAgICAgICAgICAgIHRvIHdpZHRoIGFuZCBoZWlnaHQgdGhhdCBhcmUgbXVsdGlwbGUgb2YgNTEyXCJcbiAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXG4gICAgICAoY2xpY2spPVwicm91bmRSZWN0YW5nbGVMZW5ndGhzKClcIlxuICAgID5cbiAgICA8L3AtYnV0dG9uPlxuICAgIDxwLWJ1dHRvblxuICAgICAgaWNvbj1cInBpIHBpLWNoZWNrLXNxdWFyZVwiXG4gICAgICBzaXplPVwic21hbGxcIlxuICAgICAgW3RleHRdPVwidHJ1ZVwiXG4gICAgICBzdHlsZUNsYXNzPVwibXItMlwiXG4gICAgICBwVG9vbHRpcD1cIlNlbGVjdCBhbGwgcmVnaW9uc1wiXG4gICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxuICAgICAgKGNsaWNrKT1cInNlbGVjdEFsbFJlZ2lvbnMoKVwiXG4gICAgICBbZGlzYWJsZWRdPVwiIXJlZ2lvbnMgfHwgIXJlZ2lvbnMubGVuZ3RoXCJcbiAgICA+XG4gICAgPC9wLWJ1dHRvbj5cbiAgICA8cC1idXR0b25cbiAgICAgIGljb249XCJwaSBwaS10YWdzXCJcbiAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICBbdGV4dF09XCJ0cnVlXCJcbiAgICAgIHN0eWxlQ2xhc3M9XCJtci0yXCJcbiAgICAgIHBUb29sdGlwPVwiRWRpdCBjbGFzcyBvbiBzZWxlY3RlZCByb3dzXCJcbiAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXG4gICAgICAoY2xpY2spPVwiIXNlbGVjdGVkUmVnaW9ucyB8fCAhc2VsZWN0ZWRSZWdpb25zLmxlbmd0aCA/IG9wLmhpZGUoKSA6IG9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWRSZWdpb25zIHx8ICFzZWxlY3RlZFJlZ2lvbnMubGVuZ3RoXCJcbiAgICA+XG4gICAgPC9wLWJ1dHRvbj5cbiAgICA8cC1idXR0b25cbiAgICAgIGljb249XCJwaSBwaS1wYWxldHRlXCJcbiAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICBbdGV4dF09XCJ0cnVlXCJcbiAgICAgIHN0eWxlQ2xhc3M9XCJtci0yXCJcbiAgICAgIHBUb29sdGlwPVwiRWRpdCBjb2xvdXIgb2Ygc2VsZWN0ZWQgcmVnaW9uc1wiXG4gICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxuICAgICAgKGNsaWNrKT1cIm9wZW5Db2xvckRpYWxvZygpXCJcbiAgICAgIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWRSZWdpb25zIHx8ICFzZWxlY3RlZFJlZ2lvbnMubGVuZ3RoXCJcbiAgICA+XG4gICAgPC9wLWJ1dHRvbj5cbiAgICA8cC1vdmVybGF5UGFuZWwgI29wIChvbkhpZGUpPVwiYnVsa0NsYXNzID0gJyc7IG5ld0J1bGtDbGFzcyA9ICcnXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtbiBnYXAtMlwiIHN0eWxlPVwid2lkdGg6IDE4cmVtXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1tZWRpdW0gdGV4dC05MDBcIlxuICAgICAgICAgID5TZXQgY2xhc3Mgb24ge3sgc2VsZWN0ZWRSZWdpb25zPy5sZW5ndGggfHwgMCB9fSBzZWxlY3RlZCByZWdpb24ocyk8L3NwYW5cbiAgICAgICAgPlxuICAgICAgICA8IS0tIFNlbGVjdGluZyBhIGNsYXNzIGFwcGxpZXMgaXQgaW1tZWRpYXRlbHkgKGNob29zaW5nIGFuIG9wdGlvbiBjbG9zZXMgdGhlXG4gICAgICAgICAgICAgb3ZlcmxheSwgc28gdGhlcmUncyBubyBzZXBhcmF0ZSBBcHBseSBidXR0b24pLiAtLT5cbiAgICAgICAgPHAtZHJvcGRvd25cbiAgICAgICAgICBzdHlsZUNsYXNzPVwidy1mdWxsXCJcbiAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgICAgIFtvcHRpb25zXT1cInByZXNldFNldC5jbGFzc2VzXCJcbiAgICAgICAgICBvcHRpb25MYWJlbD1cIm5hbWVcIlxuICAgICAgICAgIG9wdGlvblZhbHVlPVwibmFtZVwiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJidWxrQ2xhc3NcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ2hvb3NlIGEgY2xhc3PigKZcIlxuICAgICAgICAgIFtmaWx0ZXJdPVwicHJlc2V0U2V0LmNsYXNzZXMubGVuZ3RoID4gOFwiXG4gICAgICAgICAgZmlsdGVyQnk9XCJuYW1lXCJcbiAgICAgICAgICAob25DaGFuZ2UpPVwiYXBwbHlCdWxrQ2xhc3MoKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LWMgcFRlbXBsYXRlPVwiaXRlbVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZC12YWx1ZVwiXG4gICAgICAgICAgICAgID48c3BhbiBjbGFzcz1cImNoaXAtc3dhdGNoXCIgW3N0eWxlLmJhY2tncm91bmRdPVwiYy5jb2xvclwiPjwvc3Bhbj57eyBjLm5hbWUgfX08L3NwYW5cbiAgICAgICAgICAgID5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3AtZHJvcGRvd24+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwLWlucHV0Z3JvdXBcIj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwi4oCmb3IgYSBuZXcgY2xhc3NcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJuZXdCdWxrQ2xhc3NcIlxuICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiYWRkQW5kQXBwbHlCdWxrQ2xhc3MoKVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGljb249XCJwaSBwaS1wbHVzXCJcbiAgICAgICAgICAgIHBUb29sdGlwPVwiQWRkIGNsYXNzICZhbXA7IHNldCBpdFwiXG4gICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFuZXdCdWxrQ2xhc3MudHJpbSgpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJhZGRBbmRBcHBseUJ1bGtDbGFzcygpXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9wLW92ZXJsYXlQYW5lbD5cbiAgICA8cC1idXR0b25cbiAgICAgIGljb249XCJwaSBwaS10cmFzaFwiXG4gICAgICBzaXplPVwic21hbGxcIlxuICAgICAgW3RleHRdPVwidHJ1ZVwiXG4gICAgICBzdHlsZUNsYXNzPVwibXItMlwiXG4gICAgICAoY2xpY2spPVwiZGVsZXRlU2VsZWN0ZWRSZWdpb25zKClcIlxuICAgICAgcFRvb2x0aXA9XCJEZWxldGUgc2VsZWN0ZWQgcmVnaW9uc1wiXG4gICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxuICAgICAgW2Rpc2FibGVkXT1cIiFzZWxlY3RlZFJlZ2lvbnMgfHwgIXNlbGVjdGVkUmVnaW9ucy5sZW5ndGhcIlxuICAgID48L3AtYnV0dG9uPlxuICAgIDxwLWJ1dHRvblxuICAgICAgaWNvbj1cInBpIHBpLXRpbWVzLWNpcmNsZVwiXG4gICAgICBzaXplPVwic21hbGxcIlxuICAgICAgW3RleHRdPVwidHJ1ZVwiXG4gICAgICBzdHlsZUNsYXNzPVwibXItMlwiXG4gICAgICAoY2xpY2spPVwiY2xlYXJBbGxSZWdpb25zKClcIlxuICAgICAgcFRvb2x0aXA9XCJEZWxldGUgYWxsIHJlZ2lvbnNcIlxuICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgIFtkaXNhYmxlZF09XCIoIXJlZ2lvbnMgfHwgIXJlZ2lvbnMubGVuZ3RoKSAmJiAhaGFzUmVnaW9uU291cmNlXCJcbiAgICA+PC9wLWJ1dHRvbj5cbiAgICA8cC1idXR0b25cbiAgICAgIGljb249XCJwaSBwaS1xdWVzdGlvblwiXG4gICAgICBzaXplPVwic21hbGxcIlxuICAgICAgW3RleHRdPVwidHJ1ZVwiXG4gICAgICAoY2xpY2spPVwic2hvd0hlbHAoKVwiXG4gICAgICBwVG9vbHRpcD1cIkhlbHBcIlxuICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICA+PC9wLWJ1dHRvbj5cbiAgPC9kaXY+XG48L3AtdG9vbGJhcj5cblxuPHJlZ2lvbi1jbGFzc2VzLXBhbmVsXG4gIFtjbGFzc2VzXT1cImRpc3BsYXlDbGFzc2VzXCJcbiAgW2NvdW50c109XCJjbGFzc0NvdW50c1wiXG4gIFttYXRjaE1vZGVdPVwicHJlc2V0U2V0Lm1hdGNoTW9kZVwiXG4gIFthY3RpdmVDbGFzc109XCJhY3RpdmVDbGFzc1wiXG4gIFtwaWNrZWRdPVwicGlja2VkQ2xhc3NcIlxuICBbbWFya2VkXT1cIm1hcmtlZENsYXNzZXNcIlxuICBbc2VsZWN0ZWRDb3VudF09XCJzZWxlY3RlZFJlZ2lvbnM/Lmxlbmd0aCB8fCAwXCJcbiAgW2RlZmF1bHRDbGFzc05hbWVdPVwiZGVmYXVsdENsYXNzTmFtZVwiXG4gIChwaWNrKT1cInNlbGVjdEFjdGl2ZUNsYXNzKCRldmVudClcIlxuICAocmVjb2xvcik9XCJzZXRDbGFzc0NvbG9yKCRldmVudC5uYW1lLCAkZXZlbnQuY29sb3IpXCJcbiAgKHJlbW92ZSk9XCJkZWxldGVDbGFzcygkZXZlbnQpXCJcbiAgKG1hbmFnZSk9XCJvcGVuTWFuYWdlRGlhbG9nKClcIlxuICBbdm9sdW1lXT1cInZvbHVtZVZpZXdcIlxuICBbc2hvd24zZF09XCJzaG93bjNkTmFtZXNcIlxuICAodG9nZ2xlM2QpPVwidG9nZ2xlQ2xhc3MzZCgkZXZlbnQpXCJcbiAgW2hpZGRlbl09XCJoaWRkZW5DbGFzc2VzXCJcbiAgKHRvZ2dsZUhpZGRlbik9XCJzZXRDbGFzc2VzSGlkZGVuKFskZXZlbnRdLCAhaGlkZGVuQ2xhc3Nlcy5oYXMoJGV2ZW50KSlcIlxuICBbdHJlZVZpZXddPVwiY2xhc3NIaWVyYXJjaHkgPyBjbGFzc1RyZWVWaWV3IDogbnVsbFwiXG4gICh0cmVlVmlld0NoYW5nZSk9XCJjbGFzc1RyZWVWaWV3ID0gJGV2ZW50XCJcbj5cbiAgPCEtLSBBIHJlZ2lvbiBzZXQgd2l0aCBhIGNsYXNzIGhpZXJhcmNoeSAoYW4gYXRsYXMgb250b2xvZ3kpIGNhbiBzaG93IGl0cyBjbGFzc2VzIGFzIGEgdHJlZS4gLS0+XG4gIDxyZWdpb24tY2xhc3MtdHJlZVxuICAgICpuZ0lmPVwiY2xhc3NIaWVyYXJjaHkgYXMgaGllcmFyY2h5XCJcbiAgICBbbm9kZXNdPVwiaGllcmFyY2h5XCJcbiAgICBbY291bnRzXT1cInRyZWVDb3VudHNcIlxuICAgIFtjb2xvck9mXT1cInRyZWVDb2xvclwiXG4gICAgW3BpY2tlZF09XCJwaWNrZWRDbGFzc1wiXG4gICAgW21hcmtlZF09XCJtYXJrZWRDbGFzc2VzXCJcbiAgICBbdm9sdW1lXT1cInZvbHVtZVZpZXdcIlxuICAgIFtzaG93bjNkXT1cInNob3duM2ROYW1lc1wiXG4gICAgKHBpY2spPVwicGlja0NsYXNzZXMoJGV2ZW50KVwiXG4gICAgKHJlY29sb3IpPVwic2V0Q2xhc3NDb2xvcigkZXZlbnQubmFtZSwgJGV2ZW50LmNvbG9yKVwiXG4gICAgKHRvZ2dsZTNkKT1cInRvZ2dsZUNsYXNzM2QoJGV2ZW50Lm5hbWUsICRldmVudC5jbGFzc2VzKVwiXG4gICAgW2hpZGRlbl09XCJoaWRkZW5DbGFzc2VzXCJcbiAgICAodG9nZ2xlSGlkZGVuKT1cInNldENsYXNzZXNIaWRkZW4oJGV2ZW50LmNsYXNzZXMsICRldmVudC5oaWRkZW4pXCJcbiAgPlxuICA8L3JlZ2lvbi1jbGFzcy10cmVlPlxuPC9yZWdpb24tY2xhc3Nlcy1wYW5lbD5cblxuPHJlZ2lvbi10YWJsZVxuICBbcGFnZV09XCJwYWdlZFJlZ2lvbnNcIlxuICBbdG90YWxdPVwidGFibGVUb3RhbFwiXG4gIFtmaXJzdF09XCJwYWdpbmF0b3JGaXJzdFwiXG4gIFtyb3dzXT1cInBhZ2luYXRvclJvd3NcIlxuICBbcm93c1BlclBhZ2VPcHRpb25zXT1cInJvd3NQZXJQYWdlT3B0aW9uc1wiXG4gIFttZXRhS2V5XT1cIm1ldGFLZXlcIlxuICBbc2VsZWN0aW9uXT1cInNlbGVjdGVkUmVnaW9uc1wiXG4gIChzZWxlY3Rpb25DaGFuZ2UpPVwic2VsZWN0ZWRSZWdpb25zID0gJGV2ZW50XCJcbiAgKHJvd1NlbGVjdCk9XCJvblNlbGVjdGlvbkNoYW5nZWQoKVwiXG4gIFtwcmVzZXRTZXRdPVwidGFibGVQcmVzZXRTZXRcIlxuICBbZGVmYXVsdENvbG9yXT1cInNoYXBlQ29sb3JcIlxuICBbbXBwXT1cIm1wcFwiXG4gIFt2b2x1bWVzXT1cInRhYmxlVm9sdW1lc1wiXG4gIFtsYWJlbERyYWZ0c109XCJlZGl0aW5nTGFiZWxSZWdpb25zXCJcbiAgKGxhYmVsRWRpdFN0YXJ0KT1cInN0YXJ0RWRpdExhYmVsKCRldmVudClcIlxuICAobGFiZWxEcmFmdENoYW5nZSk9XCJzZXRMYWJlbERyYWZ0KCRldmVudC5yZWdpb24sICRldmVudC52YWx1ZSlcIlxuICAobGFiZWxFZGl0U3RvcCk9XCJzdG9wRWRpdExhYmVsKCRldmVudC5yZWdpb24sICRldmVudC5jb21taXQpXCJcbiAgKGNsYXNzUGljayk9XCJhcHBseVByZXNldFRvUmVnaW9uKCRldmVudC5yZWdpb24sICRldmVudC5uYW1lKVwiXG4gIChkZWxldGVSb3cpPVwiZGVsZXRlUmVnaW9uKCRldmVudClcIlxuICAocGFnZUNoYW5nZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiXG4+XG48L3JlZ2lvbi10YWJsZT5cblxuPCEtLSBMaXZlLWVkaXQgbW9kZTogbm8gU2F2ZS9DYW5jZWwg4oCUIGV2ZXJ5IGVkaXQgY29tbWl0cyBpbW1lZGlhdGVseSB0byB0aGVcbiAgICAgYWN0aXZlIGltYWdlJ3MgcmVnaW9uIGNhY2hlLiAtLT5cblxuPHAtY29uZmlybURpYWxvZ1xuICAjY2RcbiAgW3N0eWxlXT1cInsgd2lkdGg6ICcyNHJlbScsIGhlaWdodDogJzE0cmVtJyB9XCJcbiAga2V5PVwicG9zaXRpb25EaWFsb2dcIlxuICBbYmFzZVpJbmRleF09XCIxMDAwMFwiXG4gIHJlamVjdEJ1dHRvblN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1vdXRsaW5lZFwiXG4+XG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJmb290ZXJcIj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIGljb249XCJwaSBwaS1jaGVja1wiIGxhYmVsPVwiWWVzXCIgKGNsaWNrKT1cImNkLmFjY2VwdCgpXCI+PC9idXR0b24+XG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cInAtYnV0dG9uLW91dGxpbmVkXCJcbiAgICAgIHBCdXR0b25cbiAgICAgIGljb249XCJwaSBwaS10aW1lc1wiXG4gICAgICBsYWJlbD1cIk5vXCJcbiAgICAgIChjbGljayk9XCJjZC5yZWplY3QoKVwiXG4gICAgPjwvYnV0dG9uPlxuICA8L25nLXRlbXBsYXRlPlxuPC9wLWNvbmZpcm1EaWFsb2c+XG5cbjxyZWdpb24tc2F2ZS1yZWdpb25zLWRpYWxvZ1xuICBbKHZpc2libGUpXT1cInNob3dTYXZlQXNEaWFsb2dcIlxuICBbZmlsZW5hbWVdPVwic2F2ZUFzRmlsZW5hbWVcIlxuICAoZmlsZW5hbWVDaGFuZ2UpPVwic2F2ZUFzRmlsZW5hbWUgPSAkZXZlbnQ7IGNoZWNrU2F2ZUFzRmlsZUV4aXN0cygpXCJcbiAgW2ZpbGVFeGlzdHNdPVwic2F2ZUFzRmlsZUV4aXN0c1wiXG4gIFtidXN5XT1cInNhdmVBc0J1c3lcIlxuICAoY29uZmlybSk9XCJjb25maXJtU2F2ZUFzKClcIlxuICAoY2FuY2VsU2F2ZSk9XCJjYW5jZWxTYXZlQXMoKVwiXG4+XG48L3JlZ2lvbi1zYXZlLXJlZ2lvbnMtZGlhbG9nPlxuXG48cmVnaW9uLXNhdmUtcmVnaW9ucy1kaWFsb2dcbiAgaGVhZGVyPVwiRXhwb3J0IFJlZ2lvbnNcIlxuICBjb25maXJtTGFiZWw9XCJFeHBvcnRcIlxuICBjb25maXJtSWNvbj1cInBpIHBpLWRvd25sb2FkXCJcbiAgaW5wdXRJZD1cImV4cG9ydC1maWxlbmFtZVwiXG4gIFsodmlzaWJsZSldPVwic2hvd0V4cG9ydERpYWxvZ1wiXG4gIFsoZmlsZW5hbWUpXT1cImV4cG9ydEZpbGVuYW1lXCJcbiAgKGNvbmZpcm0pPVwiY29uZmlybUV4cG9ydCgpXCJcbj5cbjwvcmVnaW9uLXNhdmUtcmVnaW9ucy1kaWFsb2c+XG5cbjxyZWdpb24tc2F2ZS1tYXNrLWRpYWxvZ1xuICBbKHZpc2libGUpXT1cInNob3dTYXZlTWFza0RpYWxvZ1wiXG4gIFsoZmlsZW5hbWUpXT1cInNhdmVNYXNrRmlsZW5hbWVcIlxuICBbKG1vZGUpXT1cIm1hc2tNb2RlXCJcbiAgW2J1c3ldPVwibWFza0J1c3lcIlxuICBbcHJvZ3Jlc3NdPVwibWFza1Byb2dyZXNzXCJcbiAgW2VuY29kaW5nXT1cIm1hc2tFbmNvZGluZ1wiXG4gIChjb25maXJtKT1cImNvbmZpcm1TYXZlTWFzaygpXCJcbiAgKGNhbmNlbEV4cG9ydCk9XCJjYW5jZWxTYXZlTWFzaygpXCJcbj5cbjwvcmVnaW9uLXNhdmUtbWFzay1kaWFsb2c+XG5cbjxyZWdpb24tY29sb3ItZGlhbG9nXG4gIFsodmlzaWJsZSldPVwic2hvd0NvbG9yRGlhbG9nXCJcbiAgW2VkaXRzXT1cImNsYXNzQ29sb3JFZGl0c1wiXG4gIFtzZWxlY3RlZENvdW50XT1cInNlbGVjdGVkUmVnaW9ucz8ubGVuZ3RoIHx8IDBcIlxuICAoYXBwbHkpPVwiYXBwbHlDb2xvclRvU2VsZWN0ZWQoJGV2ZW50KVwiXG4+XG48L3JlZ2lvbi1jb2xvci1kaWFsb2c+XG5cbjwhLS0gTWFuYWdlIGFubm90YXRpb24gY2xhc3NlcyAoaml0LXVpIzcwKTogZWRpdHMgYSB3b3JraW5nIGNvcHksIGNvbW1pdHRlZCBvbiBBcHBseS4gLS0+XG48cmVnaW9uLW1hbmFnZS1jbGFzc2VzLWRpYWxvZ1xuICBbKHZpc2libGUpXT1cInNob3dNYW5hZ2VEaWFsb2dcIlxuICBbKGRyYWZ0KV09XCJwcmVzZXREcmFmdFwiXG4gIChhcHBseSk9XCJhcHBseU1hbmFnZURpYWxvZyh0cnVlKVwiXG4gIChyZXNldERlZmF1bHRzKT1cInJlc2V0UHJlc2V0c1RvRGVmYXVsdHMoKVwiXG4gIChpbXBvcnRGaWxlKT1cImltcG9ydFByZXNldHMoJGV2ZW50KVwiXG4gIChleHBvcnQpPVwiZXhwb3J0UHJlc2V0cygpXCJcbj5cbjwvcmVnaW9uLW1hbmFnZS1jbGFzc2VzLWRpYWxvZz5cblxuPHJlZ2lvbi1lZGl0b3ItaGVscCBbKHZpc2libGUpXT1cImRpc3BsYXlIZWxwRGlhbG9nXCI+PC9yZWdpb24tZWRpdG9yLWhlbHA+XG4iXX0=
1607
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLWVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1lZGl0b3IvcmVnaW9uLWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1lZGl0b3IvcmVnaW9uLWVkaXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBR0wsU0FBUyxFQUNULE1BQU0sRUFDTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFB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aERSOzs7R0FHRztBQUNILFNBQVMsUUFBUSxDQUFDLElBQVk7SUFDNUIsSUFBSSxDQUFDO1FBQ0gsT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBEZXN0cm95UmVmLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgVmlld0NoaWxkLFxuICBpbmplY3QsXG4gIE5nWm9uZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBtYXJrRm9yQ2hlY2tJblpvbmUgfSBmcm9tICcuLi91dGlsL21hcmstZm9yLWNoZWNrJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYnV0dG9uJztcbmltcG9ydCB7IENvbmZpcm1EaWFsb2dNb2R1bGUgfSBmcm9tICdwcmltZW5nL2NvbmZpcm1kaWFsb2cnO1xuaW1wb3J0IHsgRHJvcGRvd25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2Ryb3Bkb3duJztcbmltcG9ydCB7IElucHV0VGV4dE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvaW5wdXR0ZXh0JztcbmltcG9ydCB7IE92ZXJsYXlQYW5lbCwgT3ZlcmxheVBhbmVsTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9vdmVybGF5cGFuZWwnO1xuaW1wb3J0IHsgVG9vbGJhck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdG9vbGJhcic7XG5pbXBvcnQgeyBUb29sdGlwTW9kdWxlIH0gZnJvbSAncHJpbWVuZy90b29sdGlwJztcbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gJ2ZpbGUtc2F2ZXInO1xuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFJlY3RhbmdsZSwgUmVnaW9uIH0gZnJvbSAnLi4vbW9kZWxzL3JlZ2lvbic7XG5pbXBvcnQgeyB3aXRoUmVnaW9uUGF0Y2ggfSBmcm9tICcuLi9tb2RlbHMvcmVnaW9uLWNsb25lJztcbmltcG9ydCB7IFByZXNldFNldCwgQ2xhc3NQcmVzZXQsIGRlZmF1bHRQcmVzZXRTZXQsIHBhcnNlUHJlc2V0U2V0IH0gZnJvbSAnLi4vbW9kZWxzL2NsYXNzLXByZXNldCc7XG5pbXBvcnQgeyBjb2xvckZvckxhYmVsLCBwcmVzZXRLZXkgfSBmcm9tICcuLi9zdG9yZS9jbGFzcy1jb2xvci51dGlsJztcbmltcG9ydCB7IENvbmZpcm1hdGlvblNlcnZpY2UsIE1lc3NhZ2VTZXJ2aWNlLCBTaGFyZWRNb2R1bGUgfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQgeyBJUmVnaW9uRWRpdG9yQXBpLCBSRUdJT05fRURJVE9SX0FQSSB9IGZyb20gJy4uL2NvbnRyYWN0cy9yZWdpb24tZWRpdG9yLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBWSVpfVE9BU1RfS0VZIH0gZnJvbSAnLi4vdG9hc3Qtb3V0bGV0cyc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgb3Blbkh0dHBSZWdpb25Tb3VyY2UgfSBmcm9tICcuLi9yZWdpb24tc291cmNlL2h0dHAtcmVnaW9uLXNvdXJjZSc7XG5pbXBvcnQgeyBSZWdpb25JbXBvcnRGaWxlLCBpbXBvcnRGaWxlLCBwbGFuUmVnaW9uSW1wb3J0IH0gZnJvbSAnLi4vcmVnaW9uLWltcG9ydC9yZWdpb24taW1wb3J0JztcbmltcG9ydCB7IHJlYWRBbm5vdGF0aW9uU2xpY2VzLCBzcGxpdEJ5UGxhbmUgfSBmcm9tICcuLi9yZWdpb24taW1wb3J0L29wZW4tYW5ub3RhdGlvbnMnO1xuaW1wb3J0IHsgaXNaaXBOYW1lIH0gZnJvbSAnLi4vcmVnaW9uLWltcG9ydC96aXAnO1xuaW1wb3J0IHsgUmVnaW9uUGVyc2lzdGVuY2VTZXJ2aWNlLCBTbGljZUdlb0pzb24gfSBmcm9tICcuL3JlZ2lvbi1wZXJzaXN0ZW5jZS5zZXJ2aWNlJztcbmltcG9ydCB7IENsYXNzQ29sb3JFZGl0LCBSZWdpb25Db2xvckRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vcmVnaW9uLWNvbG9yLWRpYWxvZy9yZWdpb24tY29sb3ItZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDbGFzc2VzUGFuZWxDb21wb25lbnQgfSBmcm9tICcuL2NsYXNzZXMtcGFuZWwvY2xhc3Nlcy1wYW5lbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVnaW9uVGFibGVDb21wb25lbnQgfSBmcm9tICcuL3JlZ2lvbi10YWJsZS9yZWdpb24tdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IENsYXNzVHJlZUNvbXBvbmVudCwgQ2xhc3NUcmVlUGljayB9IGZyb20gJy4vY2xhc3MtdHJlZS9jbGFzcy10cmVlLmNvbXBvbmVudCc7XG5pbXBvcnQgdHlwZSB7IFJlZ2lvblNvdXJjZVZpZXcgfSBmcm9tICcuLi9yZWdpb24tc291cmNlL3JlZ2lvbi1zb3VyY2UnO1xuaW1wb3J0IHR5cGUgeyBSZWdpb25DbGFzc05vZGUsIFJlZ2lvbkluZGV4Um93IH0gZnJvbSAnLi4vcmVnaW9uLXNvdXJjZS9yZWdpb24tdGlsZXMnO1xuaW1wb3J0IHsgU2F2ZVJlZ2lvbnNEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL3NhdmUtcmVnaW9ucy1kaWFsb2cvc2F2ZS1yZWdpb25zLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2F2ZU1hc2tEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL3NhdmUtbWFzay1kaWFsb2cvc2F2ZS1tYXNrLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWFuYWdlQ2xhc3Nlc0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vbWFuYWdlLWNsYXNzZXMtZGlhbG9nL21hbmFnZS1jbGFzc2VzLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVnaW9uRWRpdG9ySGVscENvbXBvbmVudCB9IGZyb20gJy4vcmVnaW9uLWVkaXRvci1oZWxwL3JlZ2lvbi1lZGl0b3ItaGVscC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWFza0V4cG9ydFNlcnZpY2UsIE1hc2tNb2RlIH0gZnJvbSAnLi9tYXNrLWV4cG9ydC5zZXJ2aWNlJztcbmltcG9ydCB7IFBpeGVsU2l6ZSwgZm9ybWF0QXJlYSwgcGlja01wcCwgcmVnaW9uQXJlYVB4IH0gZnJvbSAnLi9yZWdpb24tbWV0cmljcyc7XG5cbi8qKlxuICogVGhlIFJlZ2lvbiBFZGl0b3IgKGA8cmVnaW9uLWVkaXRvcj5gKTogdGhlIHRhYmxlIG9mIHRoZSBhY3RpdmUgaW1hZ2Unc1xuICogYW5ub3RhdGlvbiByZWdpb25zIHdpdGggY2xhc3MgcHJlc2V0cywgY29sb3VycywgbGFiZWxzLCBHZW9KU09OIGltcG9ydCAvXG4gKiBleHBvcnQgLyBzZXJ2ZXIgc2F2ZSBhbmQgbWFzayBleHBvcnQuIFNlbGYtY29udGFpbmVkOiBpdCB0YWxrcyB0byB0aGUgdmlld2VyXG4gKiBvbmx5IHRocm91Z2gge0BsaW5rIFJFR0lPTl9FRElUT1JfQVBJfSAoYW5kIHRoZSBob3N0J3MgUkVHSU9OX0lPX1BPUlQpLCBzbyBpdFxuICogaGFzIG5vIGlucHV0cyBvciBvdXRwdXRzLlxuICpcbiAqIE9uUHVzaDogdGVtcGxhdGUgZXZlbnRzIHJlLXJlbmRlciBpdDsgc3RhdGUgdGhhdCBsYW5kcyBhc3luY2hyb25vdXNseSAodGhlXG4gKiBBUEkncyByZWdpb24gLyBzZWxlY3Rpb24gLyBwcmVzZXQgLyBpbWFnZS1tZXRhIHN0cmVhbXMsIHNhdmUgYW5kIG1hc2stZXhwb3J0XG4gKiBwcm9ncmVzcywgZmlsZSByZWFkcykgbWFya3MgaXQgZm9yIGNoZWNrLlxuICovXG4vKiogVGhlIG9wYWNpdHkgdGhlIGZpbGwgdG9nZ2xlIGZpbGxzIHJlZ2lvbnMgYXQuICovXG5jb25zdCBSRUdJT05fRklMTF9PUEFDSVRZID0gMC42O1xuXG4vKiogXCJTZWxlY3QgYWxsXCIgdGFrZXMgYXQgbW9zdCB0aGlzIG1hbnkgcmVnaW9uLXNvdXJjZSBmZWF0dXJlcyBpbnRvIHRoZSByZWdpb25zLiAqL1xuY29uc3QgU0VMRUNUX0FMTF9TT1VSQ0VfTElNSVQgPSA1MDAwO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyZWdpb24tZWRpdG9yJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBTaGFyZWRNb2R1bGUsXG4gICAgQnV0dG9uTW9kdWxlLFxuICAgIENvbmZpcm1EaWFsb2dNb2R1bGUsXG4gICAgRHJvcGRvd25Nb2R1bGUsXG4gICAgSW5wdXRUZXh0TW9kdWxlLFxuICAgIE92ZXJsYXlQYW5lbE1vZHVsZSxcbiAgICBUb29sYmFyTW9kdWxlLFxuICAgIFRvb2x0aXBNb2R1bGUsXG4gICAgQ2xhc3Nlc1BhbmVsQ29tcG9uZW50LFxuICAgIFJlZ2lvblRhYmxlQ29tcG9uZW50LFxuICAgIENsYXNzVHJlZUNvbXBvbmVudCxcbiAgICBTYXZlUmVnaW9uc0RpYWxvZ0NvbXBvbmVudCxcbiAgICBTYXZlTWFza0RpYWxvZ0NvbXBvbmVudCxcbiAgICBSZWdpb25Db2xvckRpYWxvZ0NvbXBvbmVudCxcbiAgICBNYW5hZ2VDbGFzc2VzRGlhbG9nQ29tcG9uZW50LFxuICAgIFJlZ2lvbkVkaXRvckhlbHBDb21wb25lbnQsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9yZWdpb24tZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcmVnaW9uLWVkaXRvci5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgcHJvdmlkZXJzOiBbUmVnaW9uUGVyc2lzdGVuY2VTZXJ2aWNlXSxcbn0pXG5leHBvcnQgY2xhc3MgUmVnaW9uRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKCdvcCcpIHByaXZhdGUgb3ZlcmxheVBhbmVsITogT3ZlcmxheVBhbmVsO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBlZGl0b3IgaXMgb24gc2NyZWVuIChpdHMgZGlhbG9nIG9wZW4pLiBDbG9zZWQsIGl0IGFza3MgdGhlIHJlZ2lvbiBzb3VyY2Ugbm90aGluZzpcbiAgICogaXRzIHBhZ2Ugb2YgZmVhdHVyZXMsIGl0cyBjbGFzcyBjb3VudHMgYW5kLCBpbiBhIHZvbHVtZSB2aWV3LCBpdHMgY2xhc3Nlcycgdm9sdW1lcyBhcmUgZWFjaCBhXG4gICAqIHJlcXVlc3Qgb3ZlciB0aGUgd2hvbGUgc2V0IChhIHN0YWNrJ3MgZXZlcnkgc2xpY2UpLCBhbmQgdGhleSBjb21wZXRlZCB3aXRoIHRoZSB2b2x1bWUncyBvd25cbiAgICogc2xpY2UgbG9hZGluZyBmb3Igbm90aGluZyBhbnlvbmUgY291bGQgc2VlLiBPcGVuZWQsIGl0IHJlYWRzIHRoZW0gYWdhaW4uXG4gICAqL1xuICBASW5wdXQoKSBzZXQgYWN0aXZlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgY29uc3Qgd2FzID0gdGhpcy5pc0FjdGl2ZTtcbiAgICB0aGlzLmlzQWN0aXZlID0gdmFsdWU7XG4gICAgaWYgKHZhbHVlICYmICF3YXMpIHtcbiAgICAgIHZvaWQgdGhpcy5yZWZyZXNoU291cmNlKCk7XG4gICAgICB0aGlzLnJlc2V0Vm9sdW1lcygpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGlzQWN0aXZlID0gdHJ1ZTtcbiAgLyoqIFRoZSBob3N0J3MgSHR0cENsaWVudDogYSBzZXJ2ZWQgcmVnaW9uIHNldCdzIHJlcXVlc3RzIGdvIHRocm91Z2ggaXQgKGl0cyBhdXRoKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBodHRwID0gaW5qZWN0KEh0dHBDbGllbnQsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgcHJvdGVjdGVkIHJlZ2lvbnM6IFJlZ2lvbltdID0gW107XG4gIHByb3RlY3RlZCBzZWxlY3RlZFJlZ2lvbnM6IFJlZ2lvbltdID0gW107XG4gIHByb3RlY3RlZCBzaG93U2hhcGVMYWJlbCE6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBzaGFwZUNvbG9yITogc3RyaW5nO1xuICBwcm90ZWN0ZWQgZmlsbENvbG9yITogc3RyaW5nO1xuICBwcm90ZWN0ZWQgZGlzcGxheUhlbHBEaWFsb2cgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHNob3dDb2xvckRpYWxvZyA9IGZhbHNlO1xuICAvKiogT25lIGNvbG91ciBlZGl0b3IgcGVyIHVuaXF1ZSBjbGFzcyBhbW9uZyB0aGUgc2VsZWN0ZWQgcmVnaW9ucywgc2hvd24gaW4gdGhlXG4gICAqICBcImVkaXQgY29sb3VyIG9mIHNlbGVjdGVkIHJlZ2lvbnNcIiBkaWFsb2cuIFVuY2xhc3NpZmllZCByZWdpb25zIChubyBsYWJlbClcbiAgICogIGFyZSBncm91cGVkIHVuZGVyIGEgc2luZ2xlIGVudHJ5IHdpdGggYW4gZW1wdHkgYGxhYmVsYC4gKi9cbiAgcHJvdGVjdGVkIGNsYXNzQ29sb3JFZGl0czogQ2xhc3NDb2xvckVkaXRbXSA9IFtdO1xuICAvKiogXCJFZGl0IGNsYXNzIG9uIHNlbGVjdGVkIHJvd3NcIiBwb3B1cDogY2hvc2VuIGV4aXN0aW5nIGNsYXNzLCBhbmQgYSBuZXctY2xhc3MgbmFtZS4gKi9cbiAgcHJvdGVjdGVkIGJ1bGtDbGFzcyA9ICcnO1xuICBwcm90ZWN0ZWQgbmV3QnVsa0NsYXNzID0gJyc7XG5cbiAgLy8g4pSA4pSAIGFubm90YXRpb24tY2xhc3MgcHJlc2V0cyAoaml0LXVpIzcwKSDilIDilIBcbiAgLyoqIExvY2FsIG1pcnJvciBvZiB0aGUgcGVyLXVzZXIgcHJlc2V0IHNldCAoY2hpcCBzdHJpcCwgQ2xhc3MgZHJvcGRvd24sIGRpYWxvZykuICovXG4gIHByb3RlY3RlZCBwcmVzZXRTZXQ6IFByZXNldFNldCA9IGRlZmF1bHRQcmVzZXRTZXQoKTtcbiAgLyoqIFRoZSBjbGFzcyBsYXN0IHBpY2tlZCBpbiB0aGUgcGFuZWw7IGEgY2hpcC1jbGljayBhcHBsaWVzIGl0IHRvIHRoZSBzZWxlY3RlZCByb3dzLiAqL1xuICBwcm90ZWN0ZWQgYWN0aXZlQ2xhc3M6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcm90ZWN0ZWQgc2hvd01hbmFnZURpYWxvZyA9IGZhbHNlO1xuICAvKiogV29ya2luZyBjb3B5IGVkaXRlZCBpbnNpZGUgdGhlIE1hbmFnZS1jbGFzc2VzIGRpYWxvZzsgY29tbWl0dGVkIG9uIEFwcGx5L0RvbmUuICovXG4gIHByb3RlY3RlZCBwcmVzZXREcmFmdDogUHJlc2V0U2V0IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBjbGFzcyBuYW1lIChtYXRjaC1tb2RlIGtleWVkKSDihpIgbnVtYmVyIG9mIHJlZ2lvbnMgY3VycmVudGx5IHVzaW5nIGl0LiAqL1xuICBwcm90ZWN0ZWQgY2xhc3NDb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAvKiogRmFsbGJhY2sgY2xhc3MgdGhhdCBhIHJlZ2lvbiByZXZlcnRzIHRvIHdoZW4gaXRzIGNsYXNzIGlzIGRlbGV0ZWQgKGppdC11aSM3MCkuICovXG4gIHByb3RlY3RlZCByZWFkb25seSBkZWZhdWx0Q2xhc3NOYW1lID0gJ1JlZ2lvbic7XG4gIC8qKiBDbGFzc2VzIGFzIHNob3duIGluIHRoZSBwYW5lbDogc29ydGVkIGJ5IHJlZ2lvbiBjb3VudCAoZGVzYyksIHRoZW4gbmFtZS4gKi9cbiAgcHJvdGVjdGVkIGRpc3BsYXlDbGFzc2VzOiBDbGFzc1ByZXNldFtdID0gW107XG5cbiAgcHJvdGVjdGVkIHBhZ2luYXRvckZpcnN0ID0gMDtcbiAgcHJvdGVjdGVkIHBhZ2luYXRvclJvd3MgPSAxMDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJvd3NQZXJQYWdlT3B0aW9ucyA9IFsxMCwgMjUsIDUwXTtcbiAgLyoqIFJlZ2lvbnMgd2hvc2UgQ2xhc3MgY2VsbCBpcyBjdXJyZW50bHkgaW4gZWRpdCBtb2RlIOKGkiB0aGUgbGFiZWwgYmVpbmcgdHlwZWQuXG4gICAqICBUaGUgZHJhZnQgaXMgY29tbWl0dGVkIG9uIEVudGVyIGFuZCBkaXNjYXJkZWQgb24gRXNjYXBlL+KclSwgc28gdHlwaW5nIG5ldmVyXG4gICAqICB3cml0ZXMgaW50byB0aGUgc3RvcmUncyByZWdpb24gKFJULTE4KS4gS2V5ZWQgYnkgb2JqZWN0IGlkZW50aXR5LCB3aGljaFxuICAgKiAgYXZvaWRzIG5lZWRpbmcgYSB1bmlxdWUgaWQgZmllbGQuICovXG4gIHByb3RlY3RlZCBlZGl0aW5nTGFiZWxSZWdpb25zID0gbmV3IE1hcDxSZWdpb24sIHN0cmluZz4oKTtcblxuICBwcm90ZWN0ZWQgc2hvd1NhdmVBc0RpYWxvZyA9IGZhbHNlO1xuICAvKipcbiAgICogVGhlIHNsaWNlJ3MgcmVnaW9uIHNvdXJjZSAoYSBsYXJnZSByZWdpb24gc2V0IGRyYXduIGJ5IGxldmVsIG9mIGRldGFpbCksIG9yIG51bGwuIEl0c1xuICAgKiBmZWF0dXJlcyBhcmUgcm93cyBvZiB0aGUgdGFibGUgYWZ0ZXIgdGhlIHJlZ2lvbnMg4oCUIHN0YW5kLWlucyB1bnRpbCBvbmUgaXMgc2VsZWN0ZWQgb3IgZWRpdGVkLFxuICAgKiB3aGljaCB0YWtlcyBpdCBpbnRvIHRoZSByZWdpb25zIOKAlCBhbmQgaXRzIGNsYXNzZXMgY291bnQgaW4gdGhlIGNsYXNzZXMgcGFuZWwuXG4gICAqL1xuICBwcm90ZWN0ZWQgc291cmNlVmlldzogUmVnaW9uU291cmNlVmlldyB8IG51bGwgPSBudWxsO1xuICAvKiogRmVhdHVyZXMgc3RpbGwgaW4gdGhlIHNvdXJjZSAodGhlIHRhYmxlJ3Mgcm93cyBhZnRlciB0aGUgcmVnaW9ucykuICovXG4gIHByaXZhdGUgc291cmNlVG90YWwgPSAwO1xuICAvKiogU3RhbmQtaW4gcm93cyBmb3IgdGhlIHNvdXJjZSBmZWF0dXJlcyBvbiB0aGUgY3VycmVudCBwYWdlLiAqL1xuICBwcml2YXRlIHNvdXJjZVJvd3M6IFJlZ2lvbltdID0gW107XG4gIC8qKiBGZWF0dXJlcyBwZXIgY2xhc3Mgc3RpbGwgaW4gdGhlIHNvdXJjZS4gKi9cbiAgcHJpdmF0ZSBzb3VyY2VDbGFzc0NvdW50czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAvKiogVGhlIHN0YW5kLWluIHJvd3MgKHJvd3Mgb2YgYSBzb3VyY2UgZmVhdHVyZSwgbm90IG9mIGEgcmVnaW9uKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzdGFuZElucyA9IG5ldyBXZWFrU2V0PFJlZ2lvbj4oKTtcbiAgcHJpdmF0ZSBzdGFuZEluU2VxID0gMDtcbiAgLyoqIEJ1bXBlZCBwZXIgc291cmNlIHJlZnJlc2gsIHNvIGEgbGF0ZSBhbnN3ZXIgaXMgZHJvcHBlZC4gKi9cbiAgcHJpdmF0ZSBzb3VyY2VSZXF1ZXN0ID0gMDtcbiAgLyoqIFRoZSBjbGFzc2VzIHRoZSB0YWJsZSdzIENsYXNzIGNvbHVtbiBvZmZlcnM6IHRoZSBwcmVzZXRzIGFuZCB0aGUgcmVnaW9uIHNvdXJjZSdzIGNsYXNzZXNcbiAgICogIChhIGRyb3Bkb3duIGNhbiBvbmx5IHNob3cgYSB2YWx1ZSB0aGF0IGlzIG9uZSBvZiBpdHMgb3B0aW9ucykuICovXG4gIHByb3RlY3RlZCB0YWJsZVByZXNldFNldDogUHJlc2V0U2V0ID0gZGVmYXVsdFByZXNldFNldCgpO1xuICAvKiogV2hldGhlciByZWdpb25zIGFyZSBkcmF3biBmaWxsZWQgKHRoZSBhdGxhcyBsb29rKSByYXRoZXIgdGhhbiBvdXRsaW5lZC4gKi9cbiAgcHJvdGVjdGVkIHJlZ2lvbnNGaWxsZWQgPSBmYWxzZTtcbiAgLyoqIFdoZXRoZXIgYSB2b2x1bWUgdmlldyBpcyBvbiBzY3JlZW4gKGNsYXNzZXMgY2FuIHRoZW4gYmUgc2hvd24gaW4gM0QpLiAqL1xuICBwcm90ZWN0ZWQgdm9sdW1lVmlldyA9IGZhbHNlO1xuICAvKiogV2hldGhlciB0aGUgdm9sdW1lIHZpZXcncyBzbGljZSBwYW5lIGlzIHdhbnRlZCAob25lIHNsaWNlIGVkaXRlZCBiZXNpZGUgdGhlIDNEIHZpZXcpLiAqL1xuICBwcml2YXRlIHNsaWNlUGFuZSA9IGZhbHNlO1xuICAvKiogV2hldGhlciB0aGUgdm9sdW1lIHZpZXcgZHJhd3MgdGhlIHJlZ2lvbnMgdGhyb3VnaCB0aGUgdm9sdW1lIChzZWUgdG9nZ2xlVGhyb3VnaFZvbHVtZSkuICovXG4gIHByb3RlY3RlZCByZWdpb25zVGhyb3VnaFZvbHVtZSA9IGZhbHNlO1xuICAvKiogQ2xhc3NlcyBzaG93biBpbiAzRCBpbiB0aGUgdm9sdW1lIHZpZXcsIGVhY2ggd2l0aCB0aGUgY2xhc3NlcyBpdHMgc3VyZmFjZSBjb3ZlcnMuICovXG4gIHByb3RlY3RlZCBzaG93bjNkID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICAvKiogVGhlIGNsYXNzZXMgb2YgdGhlIGNsYXNzIHRyZWUncyBwaWNrIChpdCBhbmQgaXRzIHN1YnRyZWUpLCBhcyBsb25nIGFzIHRoZSBwaWNrIGhvbGRzLiAqL1xuICBwcml2YXRlIHBpY2tlZENsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW107XG4gIC8qKiBUaGUgc2VsZWN0ZWQgcm93cycgY2xhc3NlcywgbWFya2VkIGluIHRoZSBjbGFzcyBsaXN0cy4gKi9cbiAgcHJvdGVjdGVkIG1hcmtlZENsYXNzZXM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIC8qKiBUaGUgc3VyZmFjZXMgaGlnaGxpZ2h0ZWQgaW4gdGhlIHZvbHVtZSB2aWV3ICh0aGVpciBrZXlzLCBqb2luZWQpLiAqL1xuICBwcml2YXRlIGhpZ2hsaWdodGVkM2QgPSAnJztcbiAgLyoqIFRoZSBjb2xvdXIgZWFjaCBzaG93biBzdXJmYWNlIHdhcyBsYXN0IGRyYXduIGluLiAqL1xuICBwcml2YXRlIGNvbG9yczNkID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgLyoqIFRoZWlyIG5hbWVzLCBmb3IgdGhlIGNsYXNzIGxpc3RzJyB0b2dnbGVzIChhIG5ldyBzZXQgcGVyIGNoYW5nZSwgZm9yIE9uUHVzaCkuICovXG4gIHByb3RlY3RlZCBzaG93bjNkTmFtZXM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIC8qKiBUaGUgY2xhc3NlcyBoaWRkZW4gZnJvbSB2aWV3ICh0aGVpciByZWdpb25zLCBzb3VyY2UgZmVhdHVyZXMgYW5kIHN1cmZhY2VzKS4gKi9cbiAgcHJvdGVjdGVkIGhpZGRlbkNsYXNzZXM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIC8qKiBXaGV0aGVyIGEgcmVnaW9uIHNldCdzIGNsYXNzIGhpZXJhcmNoeSBpcyBzaG93biBhcyBhIHRyZWUgKHJhdGhlciB0aGFuIHRoZSBjbGFzcyBsaXN0KS4gKi9cbiAgcHJvdGVjdGVkIGNsYXNzVHJlZVZpZXcgPSB0cnVlO1xuICAvKiogVGhlIGNsYXNzIHBpY2tlZCBsYXN0IGluIHRoZSBjbGFzcyB0cmVlLiAqL1xuICBwcm90ZWN0ZWQgcGlja2VkQ2xhc3M6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogUmVnaW9ucyBwZXIgY2xhc3MgKHRoZSByZWdpb25zJyBhbmQgdGhlIHNvdXJjZSdzKSwgZm9yIHRoZSBjbGFzcyB0cmVlLiAqL1xuICBwcm90ZWN0ZWQgdHJlZUNvdW50cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIC8qKiBBIGNsYXNzJ3MgY29sb3VyLCBmb3IgdGhlIGNsYXNzIHRyZWU6IGEgbmV3IGZ1bmN0aW9uIHBlciBjb2xvdXIgY2hhbmdlLCBzbyB0aGUgdHJlZSByZXBhaW50cy4gKi9cbiAgcHJvdGVjdGVkIHRyZWVDb2xvciA9IChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4gY29sb3JGb3JMYWJlbChuYW1lLCB0aGlzLnByZXNldFNldCk7XG4gIHByb3RlY3RlZCBzYXZlQXNGaWxlbmFtZSA9ICcnO1xuICBwcm90ZWN0ZWQgc2F2ZUFzRmlsZUV4aXN0cyA9IGZhbHNlO1xuICAvKiogVHJ1ZSB3aGlsZSBhIEdlb0pTT04gcGVyc2lzdCBpcyBzZXJpYWxpemluZy91cGxvYWRpbmcg4oCUIGRyaXZlcyB0aGUgZGlhbG9nJ3NcbiAgICogIHByb2dyZXNzIGJhciBhbmQgQ2FuY2VsIGJ1dHRvbiAocGFyaXR5IHdpdGggdGhlIFNhdmUtbWFzayBkaWFsb2cpLiAqL1xuICBwcm90ZWN0ZWQgc2F2ZUFzQnVzeSA9IGZhbHNlO1xuICAvKiogVGhlIHJ1bm5pbmcgR2VvSlNPTiBzYXZlOyB1bnN1YnNjcmliaW5nIGNhbmNlbHMgaXQgKENhbmNlbCAvIGRlc3Ryb3kpLiAqL1xuICBwcml2YXRlIF9zYXZlQXNTdWI/OiBTdWJzY3JpcHRpb247XG4gIC8qKiBTYXZlLWFzIGZpbGUgbmFtZXMgdG8gY2hlY2sgZm9yIGFuIGV4aXN0aW5nIGZpbGUgKGRlYm91bmNlZCkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2F2ZUFzQ2hlY2skID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gIHByb3RlY3RlZCBzaG93RXhwb3J0RGlhbG9nID0gZmFsc2U7XG4gIHByb3RlY3RlZCBleHBvcnRGaWxlbmFtZSA9ICcnO1xuXG4gIHByb3RlY3RlZCBzaG93U2F2ZU1hc2tEaWFsb2cgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHNhdmVNYXNrRmlsZW5hbWUgPSAnJztcbiAgLyoqIE1hc2sgdHlwZSBjaG9zZW4gaW4gdGhlIFNhdmUtbWFzayBkaWFsb2c6IGEgYmluYXJ5IGZvcmVncm91bmQvYmFja2dyb3VuZFxuICAgKiAgbWFzaywgb3IgYSBtdWx0aS1jbGFzcyBtYXNrIHdpdGggYSBkaXN0aW5jdCBpZCBwZXIgcmVnaW9uLiAqL1xuICBwcm90ZWN0ZWQgbWFza01vZGU6IE1hc2tNb2RlID0gJ2JpbmFyeSc7XG4gIC8qKiBUcnVlIHdoaWxlIHRoZSBtYXNrIHdvcmtlciBpcyByYXN0ZXJpemluZy9lbmNvZGluZyDigJQgZHJpdmVzIHRoZSBwcm9ncmVzc1xuICAgKiAgYmFyIGFuZCB0aGUgQ2FuY2VsIGJ1dHRvbiBpbiB0aGUgZGlhbG9nLiAqL1xuICBwcm90ZWN0ZWQgbWFza0J1c3kgPSBmYWxzZTtcbiAgLyoqIDDigJMxMDAgcmFzdGVyaXphdGlvbiBwcm9ncmVzczsgc3dpdGNoZXMgdG8gaW5kZXRlcm1pbmF0ZSBkdXJpbmcgZW5jb2RpbmcuICovXG4gIHByb3RlY3RlZCBtYXNrUHJvZ3Jlc3MgPSAwO1xuICBwcm90ZWN0ZWQgbWFza0VuY29kaW5nID0gZmFsc2U7XG4gIC8qKiBUaGUgcnVubmluZyBtYXNrIGV4cG9ydDsgdW5zdWJzY3JpYmluZyBjYW5jZWxzIGl0ICh0ZXJtaW5hdGVzIGl0cyB3b3JrZXIpLiAqL1xuICBwcml2YXRlIG1hc2tKb2I/OiBTdWJzY3JpcHRpb247XG5cbiAgLyoqXG4gICAqIFByaW1lTkcgcC10YWJsZSBtdWx0aS1zZWxlY3Rpb24gbW9kZSB0b2dnbGUuIFdoZW4gdHJ1ZSwgc2luZ2xlLWNsaWNrXG4gICAqIHNlbGVjdHMgb25lIHJvdyAocmVwbGFjaW5nIHByaW9yKTsgbWV0YS9jdHJsLWNsaWNrIHRvZ2dsZXMgYSByb3cgaW4vb3V0XG4gICAqIG9mIHRoZSBzZWxlY3Rpb24uIFdoZW4gZmFsc2UsIGV2ZXJ5IGNsaWNrIHRvZ2dsZXMuIERlZmF1bHQgdHJ1ZSB0b1xuICAgKiBtYXRjaCB0aGUgbW9zdCBjb21tb24gc3ByZWFkc2hlZXQtbGlrZSBVWC5cbiAgICovXG4gIHByb3RlY3RlZCBtZXRhS2V5ID0gdHJ1ZTtcblxuICBwcml2YXRlIF91cGRhdGluZ0Zyb21FZGl0b3IgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc3VwcHJlc3NTZWxlY3Rpb25TeW5jVG9QbG90ID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IHpvbmUgPSBpbmplY3QoTmdab25lKTtcblxuICAvKiogUmUtcmVuZGVyIHRoaXMgT25QdXNoIHZpZXcsIHJlLWVudGVyaW5nIHRoZSB6b25lIHdoZW4gdGhlIGNoYW5nZSBjYW1lIGZyb20gb3V0c2lkZSBpdC4gKi9cbiAgcHJpdmF0ZSBjaGFuZ2VkKCk6IHZvaWQge1xuICAgIG1hcmtGb3JDaGVja0luWm9uZSh0aGlzLmNkciwgdGhpcy56b25lKTtcbiAgfVxuXG4gIC8qKiBQaHlzaWNhbCBwaXhlbCBzaXplICjCtW0vcGl4ZWwpIG9mIHRoZSBhY3RpdmUgaW1hZ2UsIGZvciByZWdpb24gYXJlYXMgaW5cbiAgICogIMK1bcKyOyBlbXB0eSB3aGVuIHRoZSBmb3JtYXQgcmVwb3J0cyBubyBwaHlzaWNhbCBzaXplLiAqL1xuICBwcm90ZWN0ZWQgbXBwOiBQaXhlbFNpemUgPSB7fTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KFJFR0lPTl9FRElUT1JfQVBJKSBwcml2YXRlIHJlZ2lvbkFwaTogSVJlZ2lvbkVkaXRvckFwaSxcbiAgICBwcml2YXRlIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcbiAgICBwcml2YXRlIGNvbmZpcm1hdGlvblNlcnZpY2U6IENvbmZpcm1hdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwZXJzaXN0ZW5jZTogUmVnaW9uUGVyc2lzdGVuY2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWFza0V4cG9ydDogTWFza0V4cG9ydFNlcnZpY2UsXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnNob3dTaGFwZUxhYmVsID0gdGhpcy5yZWdpb25BcGkuZ2V0U2hvd1NoYXBlTGFiZWwoKTtcbiAgICB0aGlzLnNoYXBlQ29sb3IgPSB0aGlzLnJlZ2lvbkFwaS5nZXRTaGFwZUNvbG9yKCk7XG4gICAgdGhpcy5maWxsQ29sb3IgPSB0aGlzLnJlZ2lvbkFwaS5nZXRGaWxsQ29sb3IoKTtcblxuICAgIC8vIEFubm90YXRpb24tY2xhc3MgcHJlc2V0cyAoaml0LXVpIzcwKTogbWlycm9yIHRoZSBzZXQgZm9yIHRoZSBjaGlwIHN0cmlwLFxuICAgIC8vIHRoZSBDbGFzcyBkcm9wZG93biBhbmQgdGhlIG1hbmFnZSBkaWFsb2cuIEd1YXJkZWQgd2l0aCBvcHRpb25hbCBjYWxscyBzb1xuICAgIC8vIHBhcnRpYWwgQVBJIG1vY2tzIGluIHRlc3RzICh3aGljaCBvbWl0IHRoZSBwcmVzZXQgbWV0aG9kcykgZG9uJ3QgdGhyb3cuXG4gICAgY29uc3QgaW5pdGlhbFByZXNldHMgPSB0aGlzLnJlZ2lvbkFwaS5nZXRQcmVzZXRTZXQ/LigpO1xuICAgIGlmIChpbml0aWFsUHJlc2V0cykgdGhpcy5wcmVzZXRTZXQgPSBpbml0aWFsUHJlc2V0cztcbiAgICBjb25zdCBwcmVzZXRzJCA9IHRoaXMucmVnaW9uQXBpLmdldFByZXNldFNldCQ/LigpO1xuICAgIGlmIChwcmVzZXRzJCkge1xuICAgICAgcHJlc2V0cyQucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSkuc3Vic2NyaWJlKChzZXQpID0+IHtcbiAgICAgICAgaWYgKHNldCkgdGhpcy5wcmVzZXRTZXQgPSBzZXQ7XG4gICAgICAgIHRoaXMudHJlZUNvbG9yID0gKG5hbWU6IHN0cmluZyk6IHN0cmluZyA9PiBjb2xvckZvckxhYmVsKG5hbWUsIHRoaXMucHJlc2V0U2V0KTtcbiAgICAgICAgdGhpcy51cGRhdGVEaXNwbGF5Q2xhc3NlcygpO1xuICAgICAgICB0aGlzLnJlY29sb3IzZCgpO1xuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBTZWVkIGZyb20gdGhlIHZpc3VhbGl6ZXIncyBjdXJyZW50IHJlZ2lvbnMg4oCUIGFscmVhZHkgc2NvcGVkIHRvIHRoZVxuICAgIC8vIGFjdGl2ZSBpbWFnZSBieSB0aGUgcGVyLWltYWdlIGNhY2hlLCBhbmQgaGFuZGVkIGJhY2sgYXMgbmV1dHJhbCBSZWdpb25cbiAgICAvLyBvYmplY3RzIChubyBiYWNrZW5kIHNoYXBlIGZvcm1hdCBpbnZvbHZlZCkuXG4gICAgLy8gQW5ub3RhdGlvbiByZWdpb25zIG9ubHkg4oCUIGludGVuc2l0eS1wcm9maWxlIGxpbmVzIGFyZSBvd25lZCBieSB0aGVcbiAgICAvLyBpbnRlbnNpdHkgdG9vbCBhbmQgZXhjbHVkZWQgYnkgdGhlIGNvbnRyYWN0LCBzbyB0aGUgZWRpdG9yIG5ldmVyIHNlZXMgdGhlbS5cbiAgICB0aGlzLnJlZ2lvbnMgPSB0aGlzLmFwcGx5UmVnaW9uQ29sb3JzKHRoaXMucmVnaW9uQXBpLmdldEFubm90YXRpb25SZWdpb25zKCkpO1xuICAgIHRoaXMuc3luY0NsYXNzZXNGcm9tUmVnaW9ucyh0aGlzLnJlZ2lvbnMpO1xuICAgIHRoaXMucmVjb21wdXRlQ2xhc3NDb3VudHMoKTtcblxuICAgIC8vIFRoZSB1cGRhdGUgZXZlbnQgaXMganVzdCBhIGNoYW5nZSBzaWduYWw7IHJlLXJlYWQgdGhlIHJlZ2lvbnMgZnJvbSB0aGVcbiAgICAvLyB2aXN1YWxpemVyIHJhdGhlciB0aGFuIHBhcnNpbmcgd2hhdGV2ZXIgcGF5bG9hZCBpdCBjYXJyaWVzLlxuICAgIHRoaXMucmVnaW9uQXBpXG4gICAgICAuZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3VwZGF0aW5nRnJvbUVkaXRvcikgcmV0dXJuO1xuICAgICAgICBjb25zdCB1cGRhdGVkID0gdGhpcy5hcHBseVJlZ2lvbkNvbG9ycyh0aGlzLnJlZ2lvbkFwaS5nZXRBbm5vdGF0aW9uUmVnaW9ucygpKTtcbiAgICAgICAgLy8gcHJlc2VydmUgc2VsZWN0aW9uIGZvciByZWdpb25zIHRoYXQgc3RpbGwgZXhpc3QgKGJ5IGlkLCBzaW5jZSBuYW1lXG4gICAgICAgIC8vIGlzIGEgdXNlci1lZGl0YWJsZSBkaXNwbGF5IGxhYmVsIGFuZCBtYXkgY29sbGlkZSlcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJZHMgPSBuZXcgU2V0KHRoaXMuc2VsZWN0ZWRSZWdpb25zLm1hcCgocikgPT4gci5pZCkpO1xuICAgICAgICB0aGlzLnJlZ2lvbnMgPSB1cGRhdGVkO1xuICAgICAgICB0aGlzLnNlbGVjdGVkUmVnaW9ucyA9IHVwZGF0ZWQuZmlsdGVyKChyKSA9PiBzZWxlY3RlZElkcy5oYXMoci5pZCkpO1xuICAgICAgICB0aGlzLmNsYW1wUGFnaW5hdG9yRmlyc3QoKTtcbiAgICAgICAgdGhpcy5zeW5jQ2xhc3Nlc0Zyb21SZWdpb25zKHVwZGF0ZWQpO1xuICAgICAgICB0aGlzLnJlY29tcHV0ZUNsYXNzQ291bnRzKCk7XG4gICAgICAgIGlmICh0aGlzLnZvbHVtZVZpZXcpIHRoaXMucmVzZXRWb2x1bWVzKCk7XG4gICAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgICB2b2lkIHRoaXMucmVmcmVzaFNvdXJjZSgpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lvbkFwaVxuICAgICAgLmdldFJlZ2lvblNvdXJjZVZpZXckPy4oKVxuICAgICAgPy5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgodmlldykgPT4ge1xuICAgICAgICBpZiAodmlldz8uc291cmNlICE9PSB0aGlzLnNvdXJjZVZpZXc/LnNvdXJjZSkgdGhpcy5waWNrZWRDbGFzcyA9IG51bGw7XG4gICAgICAgIHRoaXMuc291cmNlVmlldyA9IHZpZXc7XG4gICAgICAgIHZvaWQgdGhpcy5yZWZyZXNoU291cmNlKCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMucmVnaW9uQXBpXG4gICAgICAuZ2V0UmVnaW9uU3R5bGUkPy4oKVxuICAgICAgPy5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoc3R5bGUpID0+IHtcbiAgICAgICAgdGhpcy5yZWdpb25zRmlsbGVkID0gc3R5bGUuZmlsbE9wYWNpdHkgPiAwO1xuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpb25BcGlcbiAgICAgIC5nZXRWb2x1bWVWaWV3JD8uKClcbiAgICAgID8ucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKHZvbHVtZSkgPT4ge1xuICAgICAgICBjb25zdCBjb3VudGluZyA9IHRoaXMuc3RhY2tDb3VudHM7XG4gICAgICAgIHRoaXMudm9sdW1lVmlldyA9IHZvbHVtZTtcbiAgICAgICAgdGhpcy5yZXNldFZvbHVtZXMoKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICAgIGlmICh0aGlzLnN0YWNrQ291bnRzICE9PSBjb3VudGluZykgdm9pZCB0aGlzLnJlZnJlc2hTb3VyY2UoKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpb25BcGlcbiAgICAgIC5nZXRSZWdpb25zVGhyb3VnaFZvbHVtZSQ/LigpXG4gICAgICA/LnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCh0aHJvdWdoKSA9PiB7XG4gICAgICAgIHRoaXMucmVnaW9uc1Rocm91Z2hWb2x1bWUgPSB0aHJvdWdoO1xuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpb25BcGlcbiAgICAgIC5nZXRTbGljZUVkaXRvciQ/LigpXG4gICAgICA/LnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChwYW5lKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvdW50aW5nID0gdGhpcy5zdGFja0NvdW50cztcbiAgICAgICAgdGhpcy5zbGljZVBhbmUgPSBwYW5lO1xuICAgICAgICBpZiAodGhpcy5zdGFja0NvdW50cyAhPT0gY291bnRpbmcpIHZvaWQgdGhpcy5yZWZyZXNoU291cmNlKCk7XG4gICAgICB9KTtcblxuICAgIC8vIFdoYXQgaXMgc2hvd24gaW4gM0Q6IHRoZSByb3V0ZXIgY2xlYXJzIGl0IHdoZW4gYW5vdGhlciBpbWFnZSBpcyBwbG90dGVkLlxuICAgIHRoaXMucmVnaW9uQXBpXG4gICAgICAuZ2V0UmVnaW9uQ2xhc3NlczNkJD8uKClcbiAgICAgID8ucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKGdyb3VwcykgPT4ge1xuICAgICAgICB0aGlzLnNob3duM2QgPSBuZXcgTWFwKGdyb3Vwcy5tYXAoKGcpID0+IFtnLmtleSwgWy4uLmcuY2xhc3Nlc11dKSk7XG4gICAgICAgIHRoaXMuc2hvd24zZE5hbWVzID0gbmV3IFNldCh0aGlzLnNob3duM2Qua2V5cygpKTtcbiAgICAgICAgdGhpcy5oaWdobGlnaHRlZDNkID0gJyc7XG4gICAgICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uSGlnaGxpZ2h0KCk7XG4gICAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lvbkFwaVxuICAgICAgLmdldEhpZGRlbkNsYXNzZXMkPy4oKVxuICAgICAgPy5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoaGlkZGVuKSA9PiB7XG4gICAgICAgIHRoaXMuaGlkZGVuQ2xhc3NlcyA9IGhpZGRlbjtcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICB9KTtcbiAgICB0aGlzLnJlZ2lvbkFwaVxuICAgICAgLmdldENlbGxhYmxlQ2xhc3NlczNkJD8uKClcbiAgICAgID8ucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKGNsYXNzZXMpID0+IHtcbiAgICAgICAgdGhpcy5jZWxsYWJsZUNsYXNzZXMgPSBjbGFzc2VzO1xuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgIH0pO1xuICAgIHRoaXMucmVnaW9uQXBpXG4gICAgICAuZ2V0SW5kaXZpZHVhbENsYXNzZXMzZCQ/LigpXG4gICAgICA/LnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChjbGFzc2VzKSA9PiB7XG4gICAgICAgIHRoaXMuaW5kaXZpZHVhbENsYXNzZXMgPSBjbGFzc2VzO1xuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgLy8gQSBzdXJmYWNlIGNsaWNrZWQgaW4gdGhlIHZvbHVtZSB2aWV3ICh3aXRoIHRoZSBzZWxlY3Rpb24gdG9vbCkgcGlja3MgaXRzIGNsYXNzLlxuICAgIHRoaXMucmVnaW9uQXBpXG4gICAgICAuZ2V0UmVnaW9uUGlja2VkM2QkPy4oKVxuICAgICAgPy5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoeyBrZXksIGFkZGl0aXZlIH0pID0+IHRoaXMub25QaWNrZWQzZChrZXksIGFkZGl0aXZlKSk7XG5cbiAgICAvLyBBbm90aGVyIHNlbGVjdGlvbiByZXBsYWNlZCB0aGUgY2xhc3MgdHJlZSdzIHBpY2sgKGEgcmVnaW9uIGRyYXduIG9yIGNsaWNrZWQgb24gdGhlIGNhbnZhcykuXG4gICAgdGhpcy5yZWdpb25BcGlcbiAgICAgIC5nZXRQaWNrZWRSZWdpb25DbGFzc2VzJD8uKClcbiAgICAgID8ucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKGNsYXNzZXMpID0+IHtcbiAgICAgICAgaWYgKGNsYXNzZXMubGVuZ3RoIHx8ICF0aGlzLnBpY2tlZENsYXNzZXMubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIHRoaXMucGlja2VkQ2xhc3MgPSBudWxsO1xuICAgICAgICB0aGlzLnBpY2tlZENsYXNzZXMgPSBbXTtcbiAgICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb25IaWdobGlnaHQoKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMucGVyc2lzdGVuY2VcbiAgICAgIC5maWxlRXhpc3RzKHRoaXMuc2F2ZUFzQ2hlY2skKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChleGlzdHMpID0+IHtcbiAgICAgICAgdGhpcy5zYXZlQXNGaWxlRXhpc3RzID0gZXhpc3RzO1xuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgLy8gUGh5c2ljYWwgcGl4ZWwgc2l6ZSBvZiB0aGUgYWN0aXZlIGltYWdlIChmb3IgcmVnaW9uIGFyZWFzIGluIMK1bcKyL21twrIpLlxuICAgIHRoaXMucmVnaW9uQXBpXG4gICAgICAuZ2V0SW1hZ2VNZXRhKClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgobWV0YSkgPT4ge1xuICAgICAgICB0aGlzLm1wcCA9IHBpY2tNcHAobWV0YSk7XG4gICAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lvbkFwaVxuICAgICAgLmdldFNlbGVjdGVkUmVnaW9ucyQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChzZWxlY3RlZCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fc3VwcHJlc3NTZWxlY3Rpb25TeW5jVG9QbG90KSByZXR1cm47XG4gICAgICAgIC8vIE1hcCB0aGUgY29udHJhY3QncyBzZWxlY3RlZCByZWdpb25zIHRvIHRoZSBlZGl0b3IncyBvd24gaW5zdGFuY2VzIGJ5IGlkLlxuICAgICAgICBjb25zdCBuZXh0ID0gc2VsZWN0ZWQubWFwKChzKSA9PiB0aGlzLnJlZ2lvbnMuZmluZCgocikgPT4gci5pZCA9PT0gcy5pZCkpLmZpbHRlcigocik6IHIgaXMgUmVnaW9uID0+ICEhcik7XG4gICAgICAgIGNvbnN0IHNhbWUgPVxuICAgICAgICAgIG5leHQubGVuZ3RoID09PSB0aGlzLnNlbGVjdGVkUmVnaW9ucy5sZW5ndGggJiZcbiAgICAgICAgICBuZXh0LmV2ZXJ5KChyLCBpKSA9PiByLmlkID09PSB0aGlzLnNlbGVjdGVkUmVnaW9uc1tpXT8uaWQpO1xuICAgICAgICBpZiAoIXNhbWUpIHRoaXMuc2VsZWN0ZWRSZWdpb25zID0gbmV4dDtcbiAgICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb25IaWdobGlnaHQoKTtcbiAgICAgICAgLy8gU2Nyb2xsIHRoZSBwYWdpbmF0b3Igc28gdGhlIG1vc3QtcmVjZW50bHktc2VsZWN0ZWQgcm93IGlzIHZpc2libGUuXG4gICAgICAgIGlmIChuZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBsYXN0SWR4ID0gdGhpcy5yZWdpb25zLmZpbmRJbmRleCgocikgPT4gci5pZCA9PT0gbmV4dFtuZXh0Lmxlbmd0aCAtIDFdLmlkKTtcbiAgICAgICAgICBpZiAobGFzdElkeCA+PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBwYWdlU3RhcnQgPSBNYXRoLmZsb29yKGxhc3RJZHggLyB0aGlzLnBhZ2luYXRvclJvd3MpICogdGhpcy5wYWdpbmF0b3JSb3dzO1xuICAgICAgICAgICAgaWYgKHBhZ2VTdGFydCAhPT0gdGhpcy5wYWdpbmF0b3JGaXJzdCkgdGhpcy5wYWdpbmF0b3JGaXJzdCA9IHBhZ2VTdGFydDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKiBDYW5jZWxzIGEgcnVubmluZyBHZW9KU09OIHNhdmUgKGFib3J0cyBpdHMgdXBsb2FkKSBhbmQgbWFzayBleHBvcnQgKHRlcm1pbmF0ZXNcbiAgICogIGl0cyB3b3JrZXIpOyB0aGUgQVBJIHN1YnNjcmlwdGlvbnMgZW5kIHRocm91Z2ggYHRha2VVbnRpbERlc3Ryb3llZGAuICovXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX3NhdmVBc1N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm1hc2tKb2I/LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvKipcbiAgICogVGFibGUg4oaSIFBsb3Q6IFByaW1lTkcgZmlyZXMgb25Sb3dTZWxlY3Qvb25Sb3dVbnNlbGVjdCBhZnRlciB1cGRhdGluZ1xuICAgKiBgc2VsZWN0ZWRSZWdpb25zYC4gUHVzaCB0aGUgc2VsZWN0ZWQgcmVnaW9ucyB0byB0aGUgY29udHJhY3QgYnkgaWRlbnRpdHkg4oCUXG4gICAqIHRoZSBwYWNrYWdlIG1hcHMgdGhlbSB0byBpdHMgaW50ZXJuYWwgaW5kZXggc3BhY2UgKHdoaWNoIGluY2x1ZGVzIHRoZVxuICAgKiBpbnRlbnNpdHktcHJvZmlsZSBsaW5lcyB0aGUgZWRpdG9yIG5ldmVyIHNlZXMpLlxuICAgKi9cbiAgcHJvdGVjdGVkIG9uU2VsZWN0aW9uQ2hhbmdlZCgpIHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRSZWdpb25zID8/IFtdO1xuICAgIC8vIFJvd3MgcGlja2VkIGluIHRoZSB0YWJsZSByZXBsYWNlIHRoZSBjbGFzcyB0cmVlJ3MgcGljay5cbiAgICB0aGlzLnBpY2tlZENsYXNzZXMgPSBbXTtcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbkhpZ2hsaWdodCgpO1xuICAgIGNvbnN0IGZyb21Tb3VyY2UgPSBzZWxlY3RlZC5maWx0ZXIoKHIpID0+IHRoaXMuc3RhbmRJbnMuaGFzKHIpKTtcbiAgICB0aGlzLl9zdXBwcmVzc1NlbGVjdGlvblN5bmNUb1Bsb3QgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnJlZ2lvbkFwaS5zZXRTZWxlY3RlZFJlZ2lvbnMoc2VsZWN0ZWQuZmlsdGVyKChyKSA9PiAhdGhpcy5zdGFuZElucy5oYXMocikpKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fc3VwcHJlc3NTZWxlY3Rpb25TeW5jVG9QbG90ID0gZmFsc2U7XG4gICAgfVxuICAgIC8vIEEgc2VsZWN0ZWQgc291cmNlIHJvdyBpcyB0YWtlbiBpbnRvIHRoZSByZWdpb25zIChhbmQgc28gc2VsZWN0ZWQgb24gdGhlIGltYWdlIHRvbykuXG4gICAgaWYgKGZyb21Tb3VyY2UubGVuZ3RoKSB2b2lkIHRoaXMucmVnaW9uQXBpLnNlbGVjdFNvdXJjZUZlYXR1cmVzPy4odGhpcy5zb3VyY2VJZHMoZnJvbVNvdXJjZSksIHRydWUpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRoZSByZWdpb24gc291cmNlJ3MgZmVhdHVyZXMgYXMgdGFibGUgcm93cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogV2hldGhlciB0aGUgc2xpY2UgaGFzIGEgcmVnaW9uIHNvdXJjZTogaXQgdGhlbiBoYXMgcmVnaW9ucyB0byBzYXZlIGV2ZW4gd2l0aCBhbiBlbXB0eSB0YWJsZS4gKi9cbiAgcHJvdGVjdGVkIGdldCBoYXNSZWdpb25Tb3VyY2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5zb3VyY2VWaWV3O1xuICB9XG5cbiAgLyoqIFJvd3MgaW4gdGhlIHRhYmxlOiB0aGUgcmVnaW9ucywgdGhlbiB0aGUgZmVhdHVyZXMgc3RpbGwgaW4gdGhlIHJlZ2lvbiBzb3VyY2UuICovXG4gIHByb3RlY3RlZCBnZXQgdGFibGVUb3RhbCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvbnMubGVuZ3RoICsgdGhpcy5zb3VyY2VUb3RhbDtcbiAgfVxuXG4gIC8qKiBUaGUgY2xhc3MgaGllcmFyY2h5IG9mIHRoZSBzbGljZSdzIHJlZ2lvbiBzb3VyY2UsIHdoZW4gaXQgaGFzIG9uZSAodGhlIGNsYXNzZXMgYXMgYSB0cmVlKS4gKi9cbiAgcHJvdGVjdGVkIGdldCBjbGFzc0hpZXJhcmNoeSgpOiBSZWdpb25DbGFzc05vZGVbXSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnNvdXJjZVZpZXc/LnNvdXJjZS5pbmZvLmhpZXJhcmNoeSA/PyBudWxsO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYHJvd2AgaXMgYSByZWdpb24tc291cmNlIGZlYXR1cmUncyBzdGFuZC1pbiByYXRoZXIgdGhhbiBhIHJlZ2lvbi4gKi9cbiAgcHJvdGVjdGVkIGlzU291cmNlUm93KHJvdzogUmVnaW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhbmRJbnMuaGFzKHJvdyk7XG4gIH1cblxuICBwcml2YXRlIHNvdXJjZUlkcyhyb3dzOiBSZWdpb25bXSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gcm93cy5tYXAoKHIpID0+IHIuc291cmNlSWQpLmZpbHRlcigoaWQpOiBpZCBpcyBzdHJpbmcgPT4gISFpZCk7XG4gIH1cblxuICAvKiogQSB0YWJsZSByb3cgZm9yIGEgc291cmNlIGZlYXR1cmU6IG5vIGdlb21ldHJ5IHVudGlsIGl0IGlzIHRha2VuLiAqL1xuICBwcml2YXRlIHN0YW5kSW4ocm93OiBSZWdpb25JbmRleFJvdyk6IFJlZ2lvbiB7XG4gICAgY29uc3QgciA9IE9iamVjdC5hc3NpZ24obmV3IFJlZ2lvbigpLCB7XG4gICAgICBpZDogLSsrdGhpcy5zdGFuZEluU2VxLFxuICAgICAgbmFtZTogcm93LmxhYmVsID8/IHJvdy5pZCxcbiAgICAgIGxhYmVsOiByb3cubGFiZWwgPz8gdW5kZWZpbmVkLFxuICAgICAgY29sb3I6IHRoaXMuc291cmNlVmlldz8uY29sb3JPZihyb3cpID8/IHJvdy5jb2xvciA/PyB0aGlzLnNoYXBlQ29sb3IsXG4gICAgICBzb3VyY2VJZDogcm93LmlkLFxuICAgICAgc291cmNlQXJlYTogcm93LmFyZWEsXG4gICAgICBib3VuZHM6IG51bGwsXG4gICAgfSk7XG4gICAgdGhpcy5zdGFuZElucy5hZGQocik7XG4gICAgcmV0dXJuIHI7XG4gIH1cblxuICAvKipcbiAgICogUmUtcmVhZCB0aGUgc291cmNlIHBhcnQgb2YgdGhlIHRhYmxlICh0aGUgc3RhbmQtaW5zIG9uIHRoZSBjdXJyZW50IHBhZ2UsIHRoZSBjb3VudCkgYW5kIHRoZVxuICAgKiBzb3VyY2UncyBjbGFzcyBjb3VudHMuIFRoZSBwYWdlIGhvbGRzIHJlZ2lvbnMgZmlyc3QsIHNvIGl0cyBzb3VyY2Ugcm93cyBzdGFydCBhdFxuICAgKiBgbWF4KGZpcnN0LCByZWdpb25zKWAg4oiSIHJlZ2lvbnMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hTb3VyY2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmlzQWN0aXZlKSByZXR1cm47XG4gICAgY29uc3QgcmVxdWVzdCA9ICsrdGhpcy5zb3VyY2VSZXF1ZXN0O1xuICAgIGNvbnN0IHZpZXcgPSB0aGlzLnNvdXJjZVZpZXc7XG4gICAgbGV0IHJvd3M6IFJlZ2lvbkluZGV4Um93W10gPSBbXTtcbiAgICBsZXQgdG90YWwgPSAwO1xuICAgIGxldCBjb3VudHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBpZiAodmlldyAmJiB0aGlzLnJlZ2lvbkFwaS5nZXRSZWdpb25Tb3VyY2VJbmRleCkge1xuICAgICAgY29uc3Qgb3duID0gdGhpcy5yZWdpb25zLmxlbmd0aDtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgodGhpcy5wYWdpbmF0b3JGaXJzdCwgb3duKTtcbiAgICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5tYXgoMCwgdGhpcy5wYWdpbmF0b3JGaXJzdCArIHRoaXMucGFnaW5hdG9yUm93cyAtIHN0YXJ0KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IFtwYWdlLCBwZXJDbGFzc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgdGhpcy5yZWdpb25BcGkuZ2V0UmVnaW9uU291cmNlSW5kZXgoeyBvZmZzZXQ6IHN0YXJ0IC0gb3duLCBsaW1pdCB9KSxcbiAgICAgICAgICB0aGlzLnJlZ2lvbkFwaS5nZXRSZWdpb25Tb3VyY2VDbGFzc0NvdW50cz8uKHRoaXMuc3RhY2tDb3VudHMpLFxuICAgICAgICBdKTtcbiAgICAgICAgcm93cyA9IHBhZ2U/LnJvd3MgPz8gW107XG4gICAgICAgIHRvdGFsID0gcGFnZT8udG90YWwgPz8gMDtcbiAgICAgICAgY291bnRzID0gcGVyQ2xhc3MgPz8ge307XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbcmVnaW9uc10gY291bGQgbm90IGxpc3QgdGhlIHJlZ2lvbiBzb3VyY2UnLCBlcnIpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVxdWVzdCAhPT0gdGhpcy5zb3VyY2VSZXF1ZXN0KSByZXR1cm47XG4gICAgdGhpcy5zb3VyY2VUb3RhbCA9IHRvdGFsO1xuICAgIHRoaXMuc291cmNlUm93cyA9IHJvd3MubWFwKChyKSA9PiB0aGlzLnN0YW5kSW4ocikpO1xuICAgIHRoaXMuc291cmNlQ2xhc3NDb3VudHMgPSBjb3VudHM7XG4gICAgdGhpcy5yZWNvbXB1dGVDbGFzc0NvdW50cygpO1xuICAgIHRoaXMuY2hhbmdlZCgpO1xuICB9XG5cbiAgLyoqIFRha2UgYSBzb3VyY2Ugcm93J3MgZmVhdHVyZSBpbnRvIHRoZSByZWdpb25zLCB0aGVuIHJ1biBgdGhlbmAgb24gdGhlIHJlZ2lvbiBpdCBiZWNhbWUuICovXG4gIHByaXZhdGUgYXN5bmMgdGFrZVRoZW4ocm93OiBSZWdpb24sIHRoZW46IChyZWdpb246IFJlZ2lvbikgPT4gdm9pZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IFtpZF0gPSAoYXdhaXQgdGhpcy5yZWdpb25BcGkuc2VsZWN0U291cmNlRmVhdHVyZXM/Lih0aGlzLnNvdXJjZUlkcyhbcm93XSkpKSA/PyBbXTtcbiAgICBjb25zdCByZWdpb24gPSB0aGlzLnJlZ2lvbnMuZmluZCgocikgPT4gci5pZCA9PT0gaWQpO1xuICAgIGlmIChyZWdpb24pIHRoZW4ocmVnaW9uKTtcbiAgfVxuXG4gIC8qKiBUb2dnbGUgdGhlIGZpbGxlZCAoYXRsYXMpIGxvb2s6IGVhY2ggcmVnaW9uIGZpbGxlZCBpbiBpdHMgY29sb3VyLCBsYWJlbHMgaW5zaWRlLiAqL1xuICAvKiogSW4gYSB2b2x1bWUgdmlldzogdGhlIHJlZ2lvbnMgZHJhd24gdGhyb3VnaCB0aGUgdm9sdW1lLCBvciBoaWRkZW4gYmVoaW5kIHdoYXQgaXQgc2hvd3MuICovXG4gIHByb3RlY3RlZCB0b2dnbGVUaHJvdWdoVm9sdW1lKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQXBpLnNldFJlZ2lvbnNUaHJvdWdoVm9sdW1lPy4oIXRoaXMucmVnaW9uc1Rocm91Z2hWb2x1bWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRvZ2dsZUZpbGwoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25BcGkuc2V0UmVnaW9uU3R5bGU/Lih7IGZpbGxPcGFjaXR5OiB0aGlzLnJlZ2lvbnNGaWxsZWQgPyAwIDogUkVHSU9OX0ZJTExfT1BBQ0lUWSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IG9yIGhpZGUgYSBjbGFzcyBpbiB0aGUgdm9sdW1lIHZpZXcgYXMgYSAzRCByZWNvbnN0cnVjdGlvbiDigJQgYSB0cmVlIG5vZGUgd2l0aCBldmVyeSBjbGFzc1xuICAgKiB1bmRlciBpdCwgYXMgb25lIHN1cmZhY2UgaW4gaXRzIGNvbG91ci5cbiAgICovXG4gIHByb3RlY3RlZCB0b2dnbGVDbGFzczNkKG5hbWU6IHN0cmluZywgY2xhc3Nlczogc3RyaW5nW10gPSBbbmFtZV0pOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gbmV3IE1hcCh0aGlzLnNob3duM2QpO1xuICAgIGlmIChuZXh0LmhhcyhuYW1lKSkgbmV4dC5kZWxldGUobmFtZSk7XG4gICAgZWxzZSBuZXh0LnNldChuYW1lLCBjbGFzc2VzKTtcbiAgICB0aGlzLnNob3duM2QgPSBuZXh0O1xuICAgIHRoaXMuc2hvd24zZE5hbWVzID0gbmV3IFNldChuZXh0LmtleXMoKSk7XG4gICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgdGhpcy5zaG93M2QodGhpcy5ncm91cHMzZCgpKTtcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbkhpZ2hsaWdodCgpO1xuICB9XG5cbiAgLyoqIEhpZGUgKG9yIHNob3cgYWdhaW4pIHRoZXNlIGNsYXNzZXMnIHJlZ2lvbnMsIHdoZXJldmVyIHRoZXkgYXJlIGRyYXduLiAqL1xuICAvKiogQ2xhc3NlcyB0aGF0IGNhbiBiZSBkcmF3biBhcyBpbmRpdmlkdWFsIGNlbGxzIGluIHNwYXRpYWwgM0QsIGFuZCB0aG9zZSB0aGF0IGFyZS4gKi9cbiAgcHJvdGVjdGVkIGNlbGxhYmxlQ2xhc3NlczogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgcHJvdGVjdGVkIGluZGl2aWR1YWxDbGFzc2VzOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG4gIHByb3RlY3RlZCBzZXRDbGFzc2VzSW5kaXZpZHVhbDNkKGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdLCBpbmRpdmlkdWFsOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25BcGkuc2V0Q2xhc3Nlc0luZGl2aWR1YWwzZD8uKGNsYXNzZXMsIGluZGl2aWR1YWwpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldENsYXNzZXNIaWRkZW4oY2xhc3NlczogcmVhZG9ubHkgc3RyaW5nW10sIGhpZGRlbjogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQXBpLnNldENsYXNzZXNIaWRkZW4/LihjbGFzc2VzLCBoaWRkZW4pO1xuICB9XG5cbiAgLyoqIFRoZSBzdXJmYWNlcyBzaG93biBpbiAzRCwgaW4gdGhlaXIgY2xhc3NlcycgY29sb3VycyBub3cuICovXG4gIHByaXZhdGUgZ3JvdXBzM2QoKTogQXJyYXk8eyBrZXk6IHN0cmluZzsgY2xhc3Nlczogc3RyaW5nW107IGNvbG9yOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IHRpdGxlcyA9IG5ldyBNYXAoKHRoaXMuY2xhc3NIaWVyYXJjaHkgPz8gW10pLm1hcCgobikgPT4gW24ubmFtZSwgbi50aXRsZV0pKTtcbiAgICByZXR1cm4gWy4uLnRoaXMuc2hvd24zZF0ubWFwKChba2V5LCBjbGFzc2VzXSkgPT4ge1xuICAgICAgY29uc3QgdGl0bGUgPSB0aXRsZXMuZ2V0KGtleSk7XG4gICAgICByZXR1cm4geyBrZXksIGNsYXNzZXMsIGNvbG9yOiB0aGlzLnRyZWVDb2xvcihrZXkpLCBsYWJlbDogdGl0bGUgPyBgJHtrZXl9IMK3ICR7dGl0bGV9YCA6IGtleSB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFRoZSBjbGFzc2VzIHNlbGVjdGVkIG5vdzogdGhlIGNsYXNzIHRyZWUncyBwaWNrICh3aXRoIGl0cyBzdWJ0cmVlKSBhbmQgdGhlIHNlbGVjdGVkIHJvd3MnLiAqL1xuICBwcml2YXRlIHNlbGVjdGVkQ2xhc3NOYW1lcygpOiBTZXQ8c3RyaW5nPiB7XG4gICAgY29uc3QgbmFtZXMgPSBuZXcgU2V0KHRoaXMucGlja2VkQ2xhc3Nlcyk7XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuc2VsZWN0ZWRSZWdpb25zID8/IFtdKSBpZiAoci5sYWJlbCkgbmFtZXMuYWRkKHIubGFiZWwpO1xuICAgIHJldHVybiBuYW1lcztcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWdobGlnaHQsIGluIHRoZSB2b2x1bWUgdmlldywgdGhlIHN1cmZhY2VzIGhvbGRpbmcgYSBzZWxlY3RlZCBjbGFzcyAoZm9jdXMgKyBjb250ZXh0OiB0aGV5XG4gICAqIHR1cm4gbmVhciBvcGFxdWUsIHRoZSBvdGhlcnMgZmFkZSksIGFuZCBtYXJrIHRoZSBzZWxlY3RlZCByb3dzJyBjbGFzc2VzIGluIHRoZSBjbGFzcyBsaXN0cy5cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlU2VsZWN0aW9uSGlnaGxpZ2h0KCk6IHZvaWQge1xuICAgIGNvbnN0IG5hbWVzID0gdGhpcy5zZWxlY3RlZENsYXNzTmFtZXMoKTtcbiAgICBjb25zdCBtYXJrZWQgPSBuZXcgU2V0KCh0aGlzLnNlbGVjdGVkUmVnaW9ucyA/PyBbXSkubWFwKChyKSA9PiByLmxhYmVsKS5maWx0ZXIoKGwpOiBsIGlzIHN0cmluZyA9PiAhIWwpKTtcbiAgICBpZiAoWy4uLm1hcmtlZF0uam9pbignXFxuJykgIT09IFsuLi50aGlzLm1hcmtlZENsYXNzZXNdLmpvaW4oJ1xcbicpKSB0aGlzLm1hcmtlZENsYXNzZXMgPSBtYXJrZWQ7XG4gICAgY29uc3Qga2V5cyA9IFsuLi50aGlzLnNob3duM2RdLmZpbHRlcigoWywgY2xhc3Nlc10pID0+IGNsYXNzZXMuc29tZSgoYykgPT4gbmFtZXMuaGFzKGMpKSkubWFwKChba10pID0+IGspO1xuICAgIGNvbnN0IGlkID0ga2V5cy5qb2luKCdcXG4nKTtcbiAgICBpZiAoaWQgPT09IHRoaXMuaGlnaGxpZ2h0ZWQzZCkgcmV0dXJuO1xuICAgIHRoaXMuaGlnaGxpZ2h0ZWQzZCA9IGlkO1xuICAgIHRoaXMucmVnaW9uQXBpLmhpZ2hsaWdodFJlZ2lvbkNsYXNzZXMzZD8uKGtleXMpO1xuICB9XG5cbiAgLyoqIEEgc3VyZmFjZSBjbGlja2VkIGluIHRoZSB2b2x1bWUgdmlldzogcGljayBpdHMgY2xhc3MgYXMgdGhlIHRyZWUgd291bGQ7IGJlc2lkZSB0aGVtLCBjbGVhci4gKi9cbiAgcHJpdmF0ZSBvblBpY2tlZDNkKGtleTogc3RyaW5nIHwgbnVsbCwgYWRkaXRpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoa2V5ID09PSBudWxsKSB7XG4gICAgICBpZiAoYWRkaXRpdmUpIHJldHVybjtcbiAgICAgIHRoaXMucGlja2VkQ2xhc3MgPSBudWxsO1xuICAgICAgdGhpcy5waWNrZWRDbGFzc2VzID0gW107XG4gICAgICB0aGlzLnNlbGVjdGVkUmVnaW9ucyA9IFtdO1xuICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZWQoKTtcbiAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2b2lkIHRoaXMucGlja0NsYXNzZXMoeyBuYW1lOiBrZXksIGNsYXNzZXM6IHRoaXMuc2hvd24zZC5nZXQoa2V5KSA/PyBba2V5XSwgYWRkaXRpdmUgfSk7XG4gIH1cblxuICAvKiogQSBjbGFzcyBjb2xvdXIgY2hhbmdlZCAoaXRzIHN3YXRjaCwgb3IgTWFuYWdlKTogcmVwYWludCB0aGUgc3VyZmFjZXMgc2hvd24gaW4gM0Qgd2hvc2UgY29sb3VyIGl0IGNoYW5nZWQuICovXG4gIHByaXZhdGUgcmVjb2xvcjNkKCk6IHZvaWQge1xuICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMuZ3JvdXBzM2QoKTtcbiAgICBpZiAoIWdyb3Vwcy5zb21lKChnKSA9PiBnLmNvbG9yICE9PSB0aGlzLmNvbG9yczNkLmdldChnLmtleSkpKSByZXR1cm47XG4gICAgdGhpcy5zaG93M2QoZ3JvdXBzKTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdzNkKGdyb3VwczogQXJyYXk8eyBrZXk6IHN0cmluZzsgY2xhc3Nlczogc3RyaW5nW107IGNvbG9yOiBzdHJpbmcgfT4pOiB2b2lkIHtcbiAgICB0aGlzLmNvbG9yczNkID0gbmV3IE1hcChncm91cHMubWFwKChnKSA9PiBbZy5rZXksIGcuY29sb3JdKSk7XG4gICAgdGhpcy5yZWdpb25BcGkuc2hvd1JlZ2lvbkNsYXNzZXMzZD8uKGdyb3VwcykuY2F0Y2goKGVycikgPT4ge1xuICAgICAgdGhpcy50b2FzdCgnZXJyb3InLCAnQ291bGQgbm90IHNob3cgdGhlIHJlZ2lvbiBpbiAzRCcsIGAkeyhlcnIgYXMgRXJyb3IpPy5tZXNzYWdlID8/IGVycn1gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBQaWNrIGEgY2xhc3MgaW4gdGhlIGNsYXNzIHRyZWU6IHNlbGVjdCBpdHMgcmVnaW9ucyBhbmQgaXRzIHN1YmNsYXNzZXMnLCB0aGUgc291cmNlJ3MgdGFrZW4uICovXG4gIHByb3RlY3RlZCBhc3luYyBwaWNrQ2xhc3NlcyhwaWNrOiBDbGFzc1RyZWVQaWNrKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5waWNrZWRDbGFzcyA9IHBpY2submFtZTtcbiAgICB0aGlzLnBpY2tlZENsYXNzZXMgPSBwaWNrLmFkZGl0aXZlID8gWy4uLm5ldyBTZXQoWy4uLnRoaXMucGlja2VkQ2xhc3NlcywgLi4ucGljay5jbGFzc2VzXSldIDogcGljay5jbGFzc2VzO1xuICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uSGlnaGxpZ2h0KCk7XG4gICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgYXdhaXQgdGhpcy5yZWdpb25BcGkuc2VsZWN0UmVnaW9uQ2xhc3Nlcz8uKHBpY2suY2xhc3NlcywgcGljay5hZGRpdGl2ZSk7XG4gIH1cblxuICAvKipcbiAgICogUm93cyBmb3IgcmVnaW9ucyBjb21pbmcgZnJvbSB0aGUgdmlzdWFsaXplcjogbmV1dHJhbCBgUmVnaW9uYHMgd2l0aCBib3VuZHMsXG4gICAqIGNvbG91ciBhbmQgbGFiZWwgYWxyZWFkeSBwb3B1bGF0ZWQuIEEgcmVnaW9uIHdpdGhvdXQgYSBjb2xvdXIgaXMgc2hvd24gd2l0aFxuICAgKiBpdHMgY2xhc3NpZmljYXRpb24gY29sb3VyIChvciB0aGUgZGVmYXVsdCBzaGFwZSBjb2xvdXIpIOKAlCBhcyBhIGNvcHk6IHRoZVxuICAgKiBzdG9yZSdzIGluc3RhbmNlcyBhcmUgc2hhcmVkIHdpdGggaXRzIHVuZG8gaGlzdG9yeSBhbmQgbXVzdCBub3QgYmUgY2hhbmdlZFxuICAgKiBpbiBwbGFjZSAoUlQtMSkuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5UmVnaW9uQ29sb3JzKHJlZ2lvbnM6IFJlZ2lvbltdKTogUmVnaW9uW10ge1xuICAgIGNvbnN0IGNsYXNzQ29sb3JzID0gdGhpcy5yZWdpb25BcGkuZ2V0Q2xhc3NpZmljYXRpb25Db2xvcnMoKTtcbiAgICByZXR1cm4gcmVnaW9ucy5tYXAoKHJlZ2lvbikgPT5cbiAgICAgIHJlZ2lvbi5jb2xvclxuICAgICAgICA/IHJlZ2lvblxuICAgICAgICA6IHdpdGhSZWdpb25QYXRjaChyZWdpb24sIHsgY29sb3I6IGNsYXNzQ29sb3JzLmdldChyZWdpb24ubGFiZWwgPz8gJycpIHx8IHRoaXMuc2hhcGVDb2xvciB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBlZGl0b3IncyBvbmUgd3JpdGUgcGF0aCAoUlQtMSk6IG1ha2UgYG5leHRgIHRoZSB0YWJsZSdzIHJvd3MgYW5kIGNvbW1pdFxuICAgKiB0aGVtIHRvIHRoZSBzdG9yZSDigJQgbGl2ZSwgYXMgb25lIHVuZG9hYmxlIHN0ZXAgKGlzUmVnaW9uU2F2ZU9uPXRydWU7IHRoZVxuICAgKiByb3V0ZXIga2VlcHMgdGhlIGludGVuc2l0eS1wcm9maWxlIGxpbmVzKS4gUm93cyBhcmUgdGhlIHN0b3JlJ3MgaW5zdGFuY2VzLFxuICAgKiBzbyBhbiBlZGl0IHBhc3NlcyBjb3BpZXMgKHtAbGluayBwYXRjaFJlZ2lvbnN9KSwgbmV2ZXIgY2hhbmdlZCByb3dzLiBUaGVcbiAgICogcmVzdWx0aW5nIHJlZ2lvbi11cGRhdGUgZXZlbnQgaXMgaWdub3JlZCAoYF91cGRhdGluZ0Zyb21FZGl0b3JgKSwgc28gdGhlXG4gICAqIGNsYXNzIGxpc3QgYW5kIGNvdW50cyBhcmUgcmVmcmVzaGVkIGhlcmUgKGEgdHlwZWQgY2xhc3MgaXMgYWRkZWQ7IGppdC11aSM3MCkuXG4gICAqL1xuICBwcml2YXRlIGNvbW1pdChuZXh0OiBSZWdpb25bXSA9IHRoaXMucmVnaW9ucyk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9ucyA9IG5leHQ7XG4gICAgdGhpcy5fdXBkYXRpbmdGcm9tRWRpdG9yID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5yZWdpb25BcGkuc2V0QW5ub3RhdGlvblJlZ2lvbnMobmV4dCwgdGhpcy5zaG93U2hhcGVMYWJlbCwgdHJ1ZSwgdGhpcy5maWxsQ29sb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl91cGRhdGluZ0Zyb21FZGl0b3IgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5zeW5jQ2xhc3Nlc0Zyb21SZWdpb25zKG5leHQpO1xuICAgIHRoaXMucmVjb21wdXRlQ2xhc3NDb3VudHMoKTtcbiAgICB0aGlzLmNoYW5nZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5LW9uLXdyaXRlIGVkaXQgKHJldmlldyBSVC0xKS4gVGhlIGVkaXRvcidzIHJvd3MgYXJlIHRoZSByZWdpb24gc3RvcmUnc1xuICAgKiBsaXZlIGluc3RhbmNlcywgYW5kIHRoZSBzdG9yZSB0YWtlcyBpdHMgdW5kbyBzbmFwc2hvdCBvbmx5IHdoZW4gdGhlIGVkaXQgaXNcbiAgICogY29tbWl0dGVkIOKAlCBzbyBhbiBlZGl0IG11c3QgcmVwbGFjZSBhIHJlZ2lvbiB3aXRoIGEgcGF0Y2hlZCBjb3B5IChhbmQgYW55XG4gICAqIGJvdW5kcyBpdCBjaGFuZ2VzIHdpdGggbmV3IGJvdW5kcyksIG5ldmVyIG11dGF0ZSB0aGUgaW5zdGFuY2UgdGhlIHN0b3JlXG4gICAqIGhvbGRzLiBSZXR1cm5zIHRoZSBjb3BpZXMgYnkgb3JpZ2luYWw7IHRoZSBzZWxlY3Rpb24gYW5kIGFuIG9wZW4gbGFiZWwgZWRpdFxuICAgKiBmb2xsb3cgdGhlbS5cbiAgICovXG4gIHByaXZhdGUgcGF0Y2hSZWdpb25zKHBhdGNoRm9yOiAocjogUmVnaW9uKSA9PiBQYXJ0aWFsPFJlZ2lvbj4gfCBudWxsKTogTWFwPFJlZ2lvbiwgUmVnaW9uPiB7XG4gICAgY29uc3QgY29waWVzID0gbmV3IE1hcDxSZWdpb24sIFJlZ2lvbj4oKTtcbiAgICB0aGlzLnJlZ2lvbnMgPSB0aGlzLnJlZ2lvbnMubWFwKChyKSA9PiB7XG4gICAgICBjb25zdCBwYXRjaCA9IHBhdGNoRm9yKHIpO1xuICAgICAgaWYgKCFwYXRjaCkgcmV0dXJuIHI7XG4gICAgICBjb25zdCBjb3B5ID0gd2l0aFJlZ2lvblBhdGNoKHIsIHBhdGNoKTtcbiAgICAgIGNvcGllcy5zZXQociwgY29weSk7XG4gICAgICByZXR1cm4gY29weTtcbiAgICB9KTtcbiAgICBpZiAoY29waWVzLnNpemUpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSZWdpb25zID0gKHRoaXMuc2VsZWN0ZWRSZWdpb25zID8/IFtdKS5tYXAoKHIpID0+IGNvcGllcy5nZXQocikgPz8gcik7XG4gICAgICBpZiAoWy4uLmNvcGllcy5rZXlzKCldLnNvbWUoKHIpID0+IHRoaXMuZWRpdGluZ0xhYmVsUmVnaW9ucy5oYXMocikpKSB7XG4gICAgICAgIHRoaXMuZWRpdGluZ0xhYmVsUmVnaW9ucyA9IG5ldyBNYXAoWy4uLnRoaXMuZWRpdGluZ0xhYmVsUmVnaW9uc10ubWFwKChbciwgZF0pID0+IFtjb3BpZXMuZ2V0KHIpID8/IHIsIGRdKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb3BpZXM7XG4gIH1cblxuICAvKiogU2V0IG9uZSByZWdpb24ncyBvdXRsaW5lIGNvbG91ciAoYW4gZXhwbGljaXQgb3ZlcnJpZGUpIGFuZCBjb21taXQgbGl2ZS4gKi9cbiAgcHJvdGVjdGVkIGNoYW5nZVJlZ2lvbkNvbG9yKHJlZ2lvbjogUmVnaW9uLCBjb2xvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFjb2xvciB8fCByZWdpb24uY29sb3IgPT09IGNvbG9yKSByZXR1cm47XG4gICAgLy8gY29sb3JPdmVycmlkZGVuOiBleHBsaWNpdCBwZXItcmVnaW9uIGNvbG91ciDigJQgcHJlc2VydmUgaXQgYWdhaW5zdCBwcmVzZXQgKHJlKWFwcGx5IChqaXQtdWkjNzApXG4gICAgdGhpcy5wYXRjaFJlZ2lvbnMoKHIpID0+IChyID09PSByZWdpb24gPyB7IGNvbG9yLCBjb2xvck92ZXJyaWRkZW46IHRydWUgfSA6IG51bGwpKTtcbiAgICB0aGlzLmNvbW1pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFmdGVyIGEgbGFiZWwgZWRpdCBvbiBgcmVnaW9uYDogZ2l2ZSBldmVyeSBsYWJlbGxlZCByb3cgd2l0aG91dCBhIGNvbG91ciBpdHNcbiAgICogY2xhc3MgY29sb3VyIChwcmVzZXQgb3IgZmFsbGJhY2ssIGFzIHRoZSBzdG9yZSB3aWxsKSwgYW5kIGNvbW1pdCB3aGVuXG4gICAqIGBjb21taXRgIGlzIHNldC5cbiAgICovXG4gIHByb3RlY3RlZCBsYWJlbFJlZ2lvblVwZGF0ZShyZWdpb246IFJlZ2lvbiwgY29tbWl0ID0gZmFsc2UpIHtcbiAgICB0aGlzLmZpbGxDbGFzc0NvbG9ycygpO1xuICAgIGlmIChjb21taXQpIHRoaXMuY29tbWl0KCk7XG4gIH1cblxuICAvKiogTGFiZWxsZWQgcm93cyB3aXRob3V0IGEgY29sb3VyIGdldCB0aGVpciBjbGFzcyBjb2xvdXIgKGNvcGllcykuICovXG4gIHByaXZhdGUgZmlsbENsYXNzQ29sb3JzKCk6IHZvaWQge1xuICAgIHRoaXMucGF0Y2hSZWdpb25zKChyKSA9PiAoIXIuY29sb3IgJiYgci5sYWJlbCA/IHsgY29sb3I6IHRoaXMuY29sb3JGb3JOYW1lKHIubGFiZWwpIH0gOiBudWxsKSk7XG4gIH1cblxuICAvKiogVGhlIGN1cnJlbnQgcGFnZSBvZiB0aGUgdGFibGUuIE1lbW9pemVkIG9uIChyZWdpb25zLCBmaXJzdCwgcm93cyksIHNvXG4gICAqICBjaGFuZ2UgZGV0ZWN0aW9uIGRvZXNuJ3QgaGFuZCBwLXRhYmxlIGEgbmV3IGFycmF5IGV2ZXJ5IHRpY2sgKFJULTIwKS4gKi9cbiAgcHJvdGVjdGVkIGdldCBwYWdlZFJlZ2lvbnMoKTogUmVnaW9uW10ge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuX3BhZ2VLZXk7XG4gICAgaWYgKFxuICAgICAga2V5LnJlZ2lvbnMgIT09IHRoaXMucmVnaW9ucyB8fFxuICAgICAga2V5LnNvdXJjZSAhPT0gdGhpcy5zb3VyY2VSb3dzIHx8XG4gICAgICBrZXkuZmlyc3QgIT09IHRoaXMucGFnaW5hdG9yRmlyc3QgfHxcbiAgICAgIGtleS5yb3dzICE9PSB0aGlzLnBhZ2luYXRvclJvd3NcbiAgICApIHtcbiAgICAgIHRoaXMuX3BhZ2VLZXkgPSB7XG4gICAgICAgIHJlZ2lvbnM6IHRoaXMucmVnaW9ucyxcbiAgICAgICAgc291cmNlOiB0aGlzLnNvdXJjZVJvd3MsXG4gICAgICAgIGZpcnN0OiB0aGlzLnBhZ2luYXRvckZpcnN0LFxuICAgICAgICByb3dzOiB0aGlzLnBhZ2luYXRvclJvd3MsXG4gICAgICB9O1xuICAgICAgY29uc3Qgb3duID0gdGhpcy5yZWdpb25zLnNsaWNlKHRoaXMucGFnaW5hdG9yRmlyc3QsIHRoaXMucGFnaW5hdG9yRmlyc3QgKyB0aGlzLnBhZ2luYXRvclJvd3MpO1xuICAgICAgdGhpcy5fcGFnZSA9XG4gICAgICAgIG93bi5sZW5ndGggPj0gdGhpcy5wYWdpbmF0b3JSb3dzXG4gICAgICAgICAgPyBvd25cbiAgICAgICAgICA6IFsuLi5vd24sIC4uLnRoaXMuc291cmNlUm93cy5zbGljZSgwLCB0aGlzLnBhZ2luYXRvclJvd3MgLSBvd24ubGVuZ3RoKV07XG4gICAgICAvLyBBIG5ldyBwYWdlIG1heSBzaG93IGNsYXNzZXMgd2hvc2Ugdm9sdW1lIGlzIG5vdCBrbm93biB5ZXQgKGFmdGVyIHRoaXMgY2hlY2spLlxuICAgICAgaWYgKHRoaXMudm9sdW1lVmlldykgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5yZXF1ZXN0Vm9sdW1lcygpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2U7XG4gIH1cblxuICAvKiogSW4gYSB2b2x1bWUgdmlldywgZWFjaCBjbGFzcydzIHZvbHVtZSBvdmVyIHRoZSB3aG9sZSBzdGFjaywgZm9yIHRoZSB0YWJsZSAobnVsbDogYXJlYXMpLiAqL1xuICBwcm90ZWN0ZWQgdGFibGVWb2x1bWVzOiBSZWFkb25seU1hcDxzdHJpbmcsIG51bWJlciB8IG51bGw+IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBCdW1wZWQgd2hlbiB0aGUgcmVnaW9ucyBjaGFuZ2UsIHNvIGEgdm9sdW1lIGNvbXB1dGVkIGJlZm9yZSBpcyBkcm9wcGVkLiAqL1xuICBwcml2YXRlIHZvbHVtZVJlcXVlc3QgPSAwO1xuXG4gIC8qKiBDb21wdXRlIHRoZSB2b2x1bWVzIG9mIHRoZSBjbGFzc2VzIG9uIHRoZSB0YWJsZSdzIHBhZ2UgdGhhdCBhcmUgbm90IGtub3duIHlldC4gKi9cbiAgcHJpdmF0ZSByZXF1ZXN0Vm9sdW1lcygpOiB2b2lkIHtcbiAgICBjb25zdCBhcGkgPSB0aGlzLnJlZ2lvbkFwaS5nZXRDbGFzc1ZvbHVtZXM/LmJpbmQodGhpcy5yZWdpb25BcGkpO1xuICAgIC8vIENsb3NlZDogYXNrZWQgZm9yIGFnYWluIHdoZW4gaXQgb3BlbnMgKHNlZSBhY3RpdmUpLlxuICAgIGlmICghdGhpcy5pc0FjdGl2ZSkgcmV0dXJuO1xuICAgIGlmICghdGhpcy52b2x1bWVWaWV3IHx8ICFhcGkpIHtcbiAgICAgIGlmICh0aGlzLnRhYmxlVm9sdW1lcykge1xuICAgICAgICB0aGlzLnRhYmxlVm9sdW1lcyA9IG51bGw7XG4gICAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBrbm93biA9IHRoaXMudGFibGVWb2x1bWVzID8/IG5ldyBNYXA8c3RyaW5nLCBudW1iZXIgfCBudWxsPigpO1xuICAgIGNvbnN0IGxhYmVscyA9IG5ldyBTZXQodGhpcy5wYWdlZFJlZ2lvbnMubWFwKChyKSA9PiByLmxhYmVsKS5maWx0ZXIoKGwpOiBsIGlzIHN0cmluZyA9PiAhIWwpKTtcbiAgICBjb25zdCBtaXNzaW5nID0gWy4uLmxhYmVsc10uZmlsdGVyKChsKSA9PiAha25vd24uaGFzKGwpKTtcbiAgICBpZiAoIW1pc3NpbmcubGVuZ3RoICYmIHRoaXMudGFibGVWb2x1bWVzKSByZXR1cm47XG4gICAgdGhpcy50YWJsZVZvbHVtZXMgPSBuZXcgTWFwKFsuLi5rbm93biwgLi4ubWlzc2luZy5tYXAoKGwpOiBbc3RyaW5nLCBudWxsXSA9PiBbbCwgbnVsbF0pXSk7XG4gICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgaWYgKCFtaXNzaW5nLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnZvbHVtZVJlcXVlc3Q7XG4gICAgYXBpKG1pc3NpbmcpLnRoZW4oXG4gICAgICAodm9sdW1lcykgPT4ge1xuICAgICAgICBpZiAocmVxdWVzdCAhPT0gdGhpcy52b2x1bWVSZXF1ZXN0IHx8ICF0aGlzLnRhYmxlVm9sdW1lcykgcmV0dXJuO1xuICAgICAgICB0aGlzLnRhYmxlVm9sdW1lcyA9IG5ldyBNYXAoWy4uLnRoaXMudGFibGVWb2x1bWVzLCAuLi5PYmplY3QuZW50cmllcyh2b2x1bWVzKV0pO1xuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgIH0sXG4gICAgICAoZXJyKSA9PiB7XG4gICAgICAgIGlmIChyZXF1ZXN0ICE9PSB0aGlzLnZvbHVtZVJlcXVlc3QgfHwgIXRoaXMudGFibGVWb2x1bWVzKSByZXR1cm47XG4gICAgICAgIC8vIExlYXZlIHRoZW0gdW5rbm93biAoJ+KAlCcpIHJhdGhlciB0aGFuIGNvbXB1dGluZyBmb3JldmVyLlxuICAgICAgICBjb25zdCBuZXh0ID0gbmV3IE1hcCh0aGlzLnRhYmxlVm9sdW1lcyk7XG4gICAgICAgIGZvciAoY29uc3QgbCBvZiBtaXNzaW5nKSBuZXh0LmRlbGV0ZShsKTtcbiAgICAgICAgdGhpcy50YWJsZVZvbHVtZXMgPSBuZXh0O1xuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgICAgY29uc29sZS53YXJuKCdbcmVnaW9uc10gY291bGQgbm90IGNvbXB1dGUgY2xhc3Mgdm9sdW1lcycsIGVycik7XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvKiogVGhlIHJlZ2lvbnMgY2hhbmdlZCAob3IgdGhlIHZpZXcgZGlkKTogZm9yZ2V0IHRoZSB2b2x1bWVzIGFuZCBjb21wdXRlIHRoZSBwYWdlJ3MgYWdhaW4uICovXG4gIHByaXZhdGUgcmVzZXRWb2x1bWVzKCk6IHZvaWQge1xuICAgIHRoaXMudm9sdW1lUmVxdWVzdCsrO1xuICAgIHRoaXMudGFibGVWb2x1bWVzID0gbnVsbDtcbiAgICB0aGlzLnJlcXVlc3RWb2x1bWVzKCk7XG4gIH1cbiAgcHJpdmF0ZSBfcGFnZUtleTogeyByZWdpb25zPzogUmVnaW9uW107IHNvdXJjZT86IFJlZ2lvbltdOyBmaXJzdD86IG51bWJlcjsgcm93cz86IG51bWJlciB9ID0ge307XG4gIHByaXZhdGUgX3BhZ2U6IFJlZ2lvbltdID0gW107XG5cbiAgcHJvdGVjdGVkIG9uUGFnZUNoYW5nZShldmVudDogeyBmaXJzdD86IG51bWJlcjsgcm93cz86IG51bWJlciB9KSB7XG4gICAgdGhpcy5wYWdpbmF0b3JGaXJzdCA9IGV2ZW50LmZpcnN0ID8/IDA7XG4gICAgdGhpcy5wYWdpbmF0b3JSb3dzID0gZXZlbnQucm93cyA/PyB0aGlzLnBhZ2luYXRvclJvd3M7XG4gICAgdm9pZCB0aGlzLnJlZnJlc2hTb3VyY2UoKTtcbiAgfVxuXG4gIC8qKiBTZWxlY3QgZXZlcnkgcmVnaW9uIGluIHRoZSB0YWJsZSAoYW5kIGhpZ2hsaWdodCB0aGVtIG9uIHRoZSBkaWFncmFtKSwgdGhlIHNvdXJjZSdzIHRha2VuLiAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2VsZWN0QWxsUmVnaW9ucygpIHtcbiAgICB0aGlzLnNlbGVjdGVkUmVnaW9ucyA9IFsuLi50aGlzLnJlZ2lvbnNdO1xuICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2VkKCk7XG4gICAgaWYgKCF0aGlzLnNvdXJjZVRvdGFsIHx8ICF0aGlzLnJlZ2lvbkFwaS5nZXRSZWdpb25Tb3VyY2VJbmRleCkgcmV0dXJuO1xuICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCB0aGlzLnJlZ2lvbkFwaS5nZXRSZWdpb25Tb3VyY2VJbmRleCh7IG9mZnNldDogMCwgbGltaXQ6IFNFTEVDVF9BTExfU09VUkNFX0xJTUlUIH0pO1xuICAgIGNvbnN0IGlkcyA9IChwYWdlPy5yb3dzID8/IFtdKS5tYXAoKHIpID0+IHIuaWQpO1xuICAgIGlmIChpZHMubGVuZ3RoKSBhd2FpdCB0aGlzLnJlZ2lvbkFwaS5zZWxlY3RTb3VyY2VGZWF0dXJlcz8uKGlkcywgdHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVsZXRlU2VsZWN0ZWRSZWdpb25zKCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkUmVnaW9ucyAmJiB0aGlzLnNlbGVjdGVkUmVnaW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmcm9tU291cmNlID0gdGhpcy5zZWxlY3RlZFJlZ2lvbnMuZmlsdGVyKChyKSA9PiB0aGlzLnN0YW5kSW5zLmhhcyhyKSk7XG4gICAgICBpZiAoZnJvbVNvdXJjZS5sZW5ndGgpIHRoaXMucmVnaW9uQXBpLmRlbGV0ZVNvdXJjZUZlYXR1cmVzPy4odGhpcy5zb3VyY2VJZHMoZnJvbVNvdXJjZSkpO1xuICAgICAgLy8gRmlsdGVyIGJ5IGlkIOKAlCBvYmplY3QgaWRlbnRpdHkgaXNuJ3QgcmVsaWFibGUgYWNyb3NzIHJlLXBhcnNlcyxcbiAgICAgIC8vIGFuZCBuYW1lIGlzIGEgdXNlci1lZGl0YWJsZSBsYWJlbCB0aGF0IG1heSBjb2xsaWRlLlxuICAgICAgY29uc3QgcmVtb3ZlZCA9IG5ldyBTZXQodGhpcy5zZWxlY3RlZFJlZ2lvbnMubWFwKChyKSA9PiByLmlkKSk7XG4gICAgICB0aGlzLnNlbGVjdGVkUmVnaW9ucyA9IFtdO1xuICAgICAgdGhpcy5jb21taXQodGhpcy5yZWdpb25zLmZpbHRlcigocikgPT4gIXJlbW92ZWQuaGFzKHIuaWQpKSk7XG4gICAgICB0aGlzLmNsYW1wUGFnaW5hdG9yRmlyc3QoKTtcbiAgICAgIC8vIFN5bmMgdGhlIGNsZWFyZWQgc2VsZWN0aW9uIHdpdGggdGhlIHBsb3QncyBoaWdobGlnaHQgc3RhdGUuXG4gICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhckFsbFJlZ2lvbnMoKSB7XG4gICAgdGhpcy5jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0oe1xuICAgICAga2V5OiAncG9zaXRpb25EaWFsb2cnLFxuICAgICAgbWVzc2FnZTogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgYWxsIHJlZ2lvbnM/JyxcbiAgICAgIGFjY2VwdDogKCkgPT4ge1xuICAgICAgICB0aGlzLnNlbGVjdGVkUmVnaW9ucyA9IFtdO1xuICAgICAgICB0aGlzLnBhZ2luYXRvckZpcnN0ID0gMDtcbiAgICAgICAgdGhpcy5jb21taXQoW10pO1xuICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlZCgpO1xuICAgICAgICBpZiAodGhpcy5oYXNSZWdpb25Tb3VyY2UpIHZvaWQgdGhpcy5kZWxldGVBbGxTb3VyY2VGZWF0dXJlcygpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgZXZlcnkgZmVhdHVyZSBzdGlsbCBpbiB0aGUgc2xpY2UncyByZWdpb24gc291cmNlICh3aXRoIFwiRGVsZXRlIGFsbCByZWdpb25zXCIpLiAqL1xuICBwcml2YXRlIGFzeW5jIGRlbGV0ZUFsbFNvdXJjZUZlYXR1cmVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZWdpb25BcGkuZ2V0UmVnaW9uU291cmNlSW5kZXg7XG4gICAgaWYgKCFpbmRleCB8fCAhdGhpcy5yZWdpb25BcGkuZGVsZXRlU291cmNlRmVhdHVyZXMpIHJldHVybjtcbiAgICBjb25zdCBwYWdlID0gYXdhaXQgaW5kZXguY2FsbCh0aGlzLnJlZ2lvbkFwaSwgeyBvZmZzZXQ6IDAsIGxpbWl0OiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB9KTtcbiAgICBpZiAocGFnZT8ucm93cy5sZW5ndGgpIHRoaXMucmVnaW9uQXBpLmRlbGV0ZVNvdXJjZUZlYXR1cmVzKHBhZ2Uucm93cy5tYXAoKHIpID0+IHIuaWQpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZWxldGVSZWdpb24oc2hhcGVJZHg6IG51bWJlcikge1xuICAgIC8vIEEgcm93IHBhc3QgdGhlIHJlZ2lvbnMgaXMgYSBzb3VyY2UgZmVhdHVyZTogZGVsZXRlIGl0IGZyb20gdGhlIHNvdXJjZS5cbiAgICBpZiAoc2hhcGVJZHggPj0gdGhpcy5yZWdpb25zLmxlbmd0aCkge1xuICAgICAgY29uc3Qgcm93ID0gdGhpcy5zb3VyY2VSb3dzW3NoYXBlSWR4IC0gTWF0aC5tYXgodGhpcy5wYWdpbmF0b3JGaXJzdCwgdGhpcy5yZWdpb25zLmxlbmd0aCldO1xuICAgICAgaWYgKHJvdykgdGhpcy5yZWdpb25BcGkuZGVsZXRlU291cmNlRmVhdHVyZXM/Lih0aGlzLnNvdXJjZUlkcyhbcm93XSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZW1vdmVkID0gdGhpcy5yZWdpb25zW3NoYXBlSWR4XTtcbiAgICBpZiAocmVtb3ZlZCkge1xuICAgICAgdGhpcy5zZWxlY3RlZFJlZ2lvbnMgPSB0aGlzLnNlbGVjdGVkUmVnaW9ucy5maWx0ZXIoKHIpID0+IHIuaWQgIT09IHJlbW92ZWQuaWQpO1xuICAgIH1cbiAgICB0aGlzLmNvbW1pdCh0aGlzLnJlZ2lvbnMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBzaGFwZUlkeCkpO1xuICAgIHRoaXMuY2xhbXBQYWdpbmF0b3JGaXJzdCgpO1xuICAgIC8vIFJlLWVtaXQgdGhlIChwb3NzaWJseSB0cmltbWVkKSBzZWxlY3Rpb24gc28gdGhlIHBsb3QncyBoaWdobGlnaHQgc3RheXNcbiAgICAvLyBpbiBzeW5jIHdpdGggd2hhdCdzIHN0aWxsIGluIHRoZSB0YWJsZS5cbiAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGFtcFBhZ2luYXRvckZpcnN0KCkge1xuICAgIGNvbnN0IG1heEZpcnN0ID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcigodGhpcy50YWJsZVRvdGFsIC0gMSkgLyB0aGlzLnBhZ2luYXRvclJvd3MpICogdGhpcy5wYWdpbmF0b3JSb3dzKTtcbiAgICBpZiAodGhpcy5wYWdpbmF0b3JGaXJzdCA+IG1heEZpcnN0KSB7XG4gICAgICB0aGlzLnBhZ2luYXRvckZpcnN0ID0gbWF4Rmlyc3Q7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBjaGFuZ2VTaG93U2hhcGVMYWJlbChzaG93TGFiZWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmNvbW1pdCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzRWRpdGluZ0xhYmVsKHJlZ2lvbjogUmVnaW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdGluZ0xhYmVsUmVnaW9ucy5oYXMocmVnaW9uKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGFydEVkaXRMYWJlbChyZWdpb246IFJlZ2lvbiwgZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTsgLy8gZG9uJ3QgdG9nZ2xlIHJvdyBzZWxlY3Rpb25cbiAgICBpZiAodGhpcy5zdGFuZElucy5oYXMocmVnaW9uKSkge1xuICAgICAgdm9pZCB0aGlzLnRha2VUaGVuKHJlZ2lvbiwgKHIpID0+IHRoaXMuc3RhcnRFZGl0TGFiZWwocikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBBIG5ldyBtYXAgcGVyIHN0YXJ0L3N0b3AsIHNvIHRoZSBPblB1c2ggdGFibGUgc2VlcyB0aGUgY2hhbmdlLlxuICAgIHRoaXMuZWRpdGluZ0xhYmVsUmVnaW9ucyA9IG5ldyBNYXAodGhpcy5lZGl0aW5nTGFiZWxSZWdpb25zKS5zZXQocmVnaW9uLCByZWdpb24ubGFiZWwgPz8gJycpO1xuICB9XG5cbiAgLyoqIFRoZSBsYWJlbCB0eXBlZCBzbyBmYXIgZm9yIGEgcm93IGluIGVkaXQgbW9kZSAobm8gcmUtcmVuZGVyIG5lZWRlZCkuICovXG4gIHByb3RlY3RlZCBzZXRMYWJlbERyYWZ0KHJlZ2lvbjogUmVnaW9uLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZWRpdGluZ0xhYmVsUmVnaW9ucy5oYXMocmVnaW9uKSkgdGhpcy5lZGl0aW5nTGFiZWxSZWdpb25zLnNldChyZWdpb24sIHZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdG9wRWRpdExhYmVsKHJlZ2lvbjogUmVnaW9uLCBjb21taXQ6IGJvb2xlYW4sIGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgZHJhZnQgPSB0aGlzLmVkaXRpbmdMYWJlbFJlZ2lvbnMuZ2V0KHJlZ2lvbik7XG4gICAgaWYgKHRoaXMuZWRpdGluZ0xhYmVsUmVnaW9ucy5oYXMocmVnaW9uKSkge1xuICAgICAgY29uc3QgbmV4dCA9IG5ldyBNYXAodGhpcy5lZGl0aW5nTGFiZWxSZWdpb25zKTtcbiAgICAgIG5leHQuZGVsZXRlKHJlZ2lvbik7XG4gICAgICB0aGlzLmVkaXRpbmdMYWJlbFJlZ2lvbnMgPSBuZXh0O1xuICAgIH1cbiAgICBpZiAoY29tbWl0KSB7XG4gICAgICAvLyBBIGNoYW5nZWQgbGFiZWwgY29tbWl0cyBhcyBhIHJlcGxhY2VtZW50IHJlZ2lvbiwgc28gaXQgaXMgdW5kb2FibGUgKFJULTEpLlxuICAgICAgY29uc3QgZWRpdGVkID1cbiAgICAgICAgZHJhZnQgIT09IHVuZGVmaW5lZCAmJiBkcmFmdCAhPT0gcmVnaW9uLmxhYmVsXG4gICAgICAgICAgPyAodGhpcy5wYXRjaFJlZ2lvbnMoKHIpID0+IChyID09PSByZWdpb24gPyB7IGxhYmVsOiBkcmFmdCB9IDogbnVsbCkpLmdldChyZWdpb24pID8/IHJlZ2lvbilcbiAgICAgICAgICA6IHJlZ2lvbjtcbiAgICAgIHRoaXMubGFiZWxSZWdpb25VcGRhdGUoZWRpdGVkLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICAvKiogUmVnaW9uIGFyZWEgZm9yIGRpc3BsYXkgKMK1bcKyL21twrIgd2hlbiB0aGUgaW1hZ2UgaXMgc2NhbGVkLCBlbHNlIHB4wrIpO1xuICAgKiAgZW1wdHkgZm9yIGEgZGVnZW5lcmF0ZSByZWdpb24uIFNlZSBgcmVnaW9uLW1ldHJpY3NgLiAqL1xuICBwcm90ZWN0ZWQgcmVnaW9uQXJlYShyZWdpb246IFJlZ2lvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZvcm1hdEFyZWEocmVnaW9uQXJlYVB4KHJlZ2lvbiksIHRoaXMubXBwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCByb3VuZHMgYWxsIHRoZSByZWN0YW5nbGUgcmVnaW9ucyBsZW5ndGhzIHRvIG11bHRpcGxlIG9mIDUxMlxuICAgKi9cbiAgcHJvdGVjdGVkIHJvdW5kUmVjdGFuZ2xlTGVuZ3RocygpIHtcbiAgICB0aGlzLnBhdGNoUmVnaW9ucygocmVnaW9uKSA9PiB7XG4gICAgICBjb25zdCByZWN0ID0gcmVnaW9uLmJvdW5kcztcbiAgICAgIGlmICghKHJlY3QgaW5zdGFuY2VvZiBSZWN0YW5nbGUpKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJvdW5kczogT2JqZWN0LmFzc2lnbihuZXcgUmVjdGFuZ2xlKCksIHJlY3QsIHtcbiAgICAgICAgICBoZWlnaHQ6IE1hdGgucm91bmQocmVjdC5oZWlnaHQgLyA1MTIpICogNTEyLFxuICAgICAgICAgIHdpZHRoOiBNYXRoLnJvdW5kKHJlY3Qud2lkdGggLyA1MTIpICogNTEyLFxuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgdGhpcy5jb21taXQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG93SGVscCgpIHtcbiAgICB0aGlzLmRpc3BsYXlIZWxwRGlhbG9nID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBPcGVuIHRoZSBjb2xvdXIgZGlhbG9nIGZvciB0aGUgY3VycmVudGx5LXNlbGVjdGVkIHJlZ2lvbihzKSwgYnVpbGRpbmcgb25lXG4gICAqICBjb2xvdXIgcGlja2VyIHBlciB1bmlxdWUgY2xhc3MgaW4gdGhlIHNlbGVjdGlvbi4gRWFjaCBwaWNrZXIgaXMgc2VlZGVkIHdpdGhcbiAgICogIHRoZSBmaXJzdCBzZWxlY3RlZCByZWdpb24gb2YgdGhhdCBjbGFzcydzIGNvbG91ciAoZWxzZSB0aGUgY2xhc3MgY29sb3VyKS4gKi9cbiAgcHJvdGVjdGVkIG9wZW5Db2xvckRpYWxvZygpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRSZWdpb25zPy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBzZWVkQnlMYWJlbCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCByZWdpb24gb2YgdGhpcy5zZWxlY3RlZFJlZ2lvbnMpIHtcbiAgICAgIGNvbnN0IGxhYmVsID0gcmVnaW9uLmxhYmVsPy50cmltKCkgPz8gJyc7XG4gICAgICBpZiAoc2VlZEJ5TGFiZWwuaGFzKGxhYmVsKSkgY29udGludWU7XG4gICAgICBzZWVkQnlMYWJlbC5zZXQobGFiZWwsIHJlZ2lvbi5jb2xvciA/PyAobGFiZWwgPyB0aGlzLmNvbG9yRm9yTmFtZShsYWJlbCkgOiB0aGlzLnNoYXBlQ29sb3IpKTtcbiAgICB9XG4gICAgdGhpcy5jbGFzc0NvbG9yRWRpdHMgPSBbLi4uc2VlZEJ5TGFiZWxdLm1hcCgoW2xhYmVsLCBjb2xvcl0pID0+ICh7IGxhYmVsLCBjb2xvciB9KSk7XG4gICAgdGhpcy5zaG93Q29sb3JEaWFsb2cgPSB0cnVlO1xuICB9XG5cbiAgLyoqIEFwcGx5IGVhY2ggY2xhc3MncyBjaG9zZW4gY29sb3VyIHRvIHRoZSBzZWxlY3RlZCByZWdpb25zIG9mIHRoYXQgY2xhc3MgKGFuXG4gICAqICBleHBsaWNpdCBvdmVycmlkZSkgYW5kIGNvbW1pdCBsaXZlLiAqL1xuICBwcm90ZWN0ZWQgYXBwbHlDb2xvclRvU2VsZWN0ZWQoZWRpdHM6IENsYXNzQ29sb3JFZGl0W10gPSB0aGlzLmNsYXNzQ29sb3JFZGl0cykge1xuICAgIGNvbnN0IGNvbG9yQnlMYWJlbCA9IG5ldyBNYXAoZWRpdHMubWFwKChlKSA9PiBbZS5sYWJlbCwgZS5jb2xvcl0pKTtcbiAgICBjb25zdCBzZWxlY3RlZCA9IG5ldyBTZXQodGhpcy5zZWxlY3RlZFJlZ2lvbnMgPz8gW10pO1xuICAgIHRoaXMucGF0Y2hSZWdpb25zKChyZWdpb24pID0+IHtcbiAgICAgIGlmICghc2VsZWN0ZWQuaGFzKHJlZ2lvbikpIHJldHVybiBudWxsO1xuICAgICAgY29uc3QgbGFiZWwgPSByZWdpb24ubGFiZWw/LnRyaW0oKSA/PyAnJztcbiAgICAgIGNvbnN0IGNvbG9yID0gY29sb3JCeUxhYmVsLmdldChsYWJlbCk7XG4gICAgICBpZiAoIWNvbG9yKSByZXR1cm4gbnVsbDtcbiAgICAgIC8vIGV4cGxpY2l0IGNvbG91ciDigJQgcHJlc2VydmUgYWdhaW5zdCBwcmVzZXQgKHJlKWFwcGx5IChqaXQtdWkjNzApXG4gICAgICByZXR1cm4geyBjb2xvciwgY29sb3JPdmVycmlkZGVuOiB0cnVlIH07XG4gICAgfSk7XG4gICAgdGhpcy5jb21taXQoKTtcbiAgICB0aGlzLnNob3dDb2xvckRpYWxvZyA9IGZhbHNlO1xuICB9XG5cbiAgLy8g4pSA4pSAIGFubm90YXRpb24tY2xhc3MgcHJlc2V0cyAoaml0LXVpIzcwKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogUmVzb2x2ZSB0aGUgZGlzcGxheSBjb2xvdXIgZm9yIGEgY2xhc3MgbmFtZSAocHJlc2V0IGNvbG91ciBvciBkZXRlcm1pbmlzdGljIGZhbGxiYWNrKS4gKi9cbiAgcHJvdGVjdGVkIGNvbG9yRm9yTmFtZShuYW1lPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmFtZSA/IGNvbG9yRm9yTGFiZWwobmFtZSwgdGhpcy5wcmVzZXRTZXQpIDogdGhpcy5zaGFwZUNvbG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZSBldmVyeSBjbGFzcyBsYWJlbCBwcmVzZW50IGluIHRoZSBsb2FkZWQgcmVnaW9ucyBleGlzdHMgaW4gdGhlIHByZXNldFxuICAgKiBsaXN0LCBhdXRvLWFkZGluZyBhbnkgdGhhdCBhcmUgbWlzc2luZyAodXNpbmcgdGhlIHJlZ2lvbidzIGFscmVhZHktcmVzb2x2ZWRcbiAgICogY29sb3VyKS4gVGhpcyBtYWtlcyBjbGFzc2VzIGNhcnJpZWQgaW4gYSBsb2FkZWQvaW1wb3J0ZWQgR2VvSlNPTiBzaG93IHVwIGFzXG4gICAqIGNoaXBzICsgQ2xhc3MtZHJvcGRvd24gb3B0aW9ucyAoYSBwLWRyb3Bkb3duIGNhbid0IGRpc3BsYXkgYSB2YWx1ZSB0aGF0IGlzbid0XG4gICAqIGFuIG9wdGlvbikgYW5kIGxldHMgdGhlIHVzZXIgbWFuYWdlIHRoZW0uIFRoZSBwbGFjZWhvbGRlciAnbGVnZW5kJyBhbmQgZW1wdHlcbiAgICogbGFiZWxzIGFyZSBpZ25vcmVkLiAoaml0LXVpIzcwKVxuICAgKi9cbiAgcHJpdmF0ZSBzeW5jQ2xhc3Nlc0Zyb21SZWdpb25zKHJlZ2lvbnM6IFJlZ2lvbltdKTogdm9pZCB7XG4gICAgY29uc3Qga2V5T2YgPSAobDogc3RyaW5nKSA9PiBwcmVzZXRLZXkodGhpcy5wcmVzZXRTZXQsIGwpO1xuICAgIGNvbnN0IGtub3duID0gbmV3IFNldCh0aGlzLnByZXNldFNldC5jbGFzc2VzLm1hcCgoYykgPT4ga2V5T2YoYy5uYW1lKSkpO1xuICAgIGNvbnN0IGFkZGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCByIG9mIHJlZ2lvbnMpIHtcbiAgICAgIGNvbnN0IGxhYmVsID0gci5sYWJlbD8udHJpbSgpO1xuICAgICAgaWYgKCFsYWJlbCB8fCBsYWJlbCA9PT0gJ2xlZ2VuZCcpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgayA9IGtleU9mKGxhYmVsKTtcbiAgICAgIGlmIChrbm93bi5oYXMoaykgfHwgYWRkZWQuaGFzKGspKSBjb250aW51ZTtcbiAgICAgIGFkZGVkLmFkZChrKTtcbiAgICAgIHRoaXMucmVnaW9uQXBpLnVwc2VydENsYXNzKHtcbiAgICAgICAgbmFtZTogbGFiZWwsXG4gICAgICAgIGNvbG9yOiByLmNvbG9yIHx8IGNvbG9yRm9yTGFiZWwobGFiZWwsIHRoaXMucHJlc2V0U2V0KSxcbiAgICAgICAgc291cmNlOiAnYXV0bycsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgRG9ja2VkIENsYXNzZXMgcGFuZWwgKGppdC11aSM3MCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNsYXNzZXMgY291bnQgZXZlcnkgc2xpY2Ugb2YgdGhlIHN0YWNrOiBpbiBhIHZvbHVtZSB2aWV3ICh0aGUgd2hvbGUgc3RhY2sgb25cbiAgICogc2NyZWVuKSwgdW5sZXNzIGl0cyBzbGljZSBwYW5lIHNob3dzIG9uZSBzbGljZS4gVGhlIHRhYmxlIGxpc3RzIHRoZSBzbGljZSdzIHJlZ2lvbnMgYW55d2F5LlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgc3RhY2tDb3VudHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudm9sdW1lVmlldyAmJiAhdGhpcy5zbGljZVBhbmU7XG4gIH1cblxuICAvKiogUmVidWlsZCB0aGUgcGVyLWNsYXNzIHJlZ2lvbiBjb3VudHMgc2hvd24gaW4gdGhlIHBhbmVsICh0aGUgc3RhY2sncywgc2VlIHN0YWNrQ291bnRzKS4gKi9cbiAgcHJpdmF0ZSByZWNvbXB1dGVDbGFzc0NvdW50cygpOiB2b2lkIHtcbiAgICBjb25zdCBjb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGNvbnN0IHRyZWUgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGNvbnN0IGFkZCA9IChsYWJlbDogc3RyaW5nLCBuOiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IGsgPSBwcmVzZXRLZXkodGhpcy5wcmVzZXRTZXQsIGxhYmVsKTtcbiAgICAgIGNvdW50cy5zZXQoaywgKGNvdW50cy5nZXQoaykgPz8gMCkgKyBuKTtcbiAgICAgIHRyZWUuc2V0KGxhYmVsLCAodHJlZS5nZXQobGFiZWwpID8/IDApICsgbik7XG4gICAgfTtcbiAgICBjb25zdCByZWdpb25zID0gdGhpcy5zdGFja0NvdW50cyA/IHRoaXMucmVnaW9uQXBpLmdldFNsaWNlQW5ub3RhdGlvblJlZ2lvbnMoKSA6IHRoaXMucmVnaW9ucztcbiAgICBmb3IgKGNvbnN0IHIgb2YgcmVnaW9ucykgaWYgKHIubGFiZWwpIGFkZChyLmxhYmVsLCAxKTtcbiAgICAvLyBUaGUgcmVnaW9uIHNvdXJjZSdzIGNsYXNzZXMgY291bnQgdG9vIChpdHMgZmVhdHVyZXMgYXJlIHJvd3Mgb2YgdGhlIHRhYmxlKS5cbiAgICBmb3IgKGNvbnN0IFtsYWJlbCwgbl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zb3VyY2VDbGFzc0NvdW50cykpIGFkZChsYWJlbCwgbik7XG4gICAgdGhpcy5jbGFzc0NvdW50cyA9IGNvdW50cztcbiAgICB0aGlzLnRyZWVDb3VudHMgPSB0cmVlO1xuICAgIHRoaXMudXBkYXRlRGlzcGxheUNsYXNzZXMoKTtcbiAgfVxuXG4gIC8qKiBSZWJ1aWxkIHRoZSBwYW5lbCdzIGRpc3BsYXkgb3JkZXIg4oCUIG1vc3QtdXNlZCBjbGFzc2VzIGZpcnN0LCB0aGVuIGJ5IG5hbWUuIEEgY2xhc3Mgb25seVxuICAgKiAgdGhlIHJlZ2lvbiBzb3VyY2UgaGFzIGlzIGxpc3RlZCB0b28sIGluIGl0cyBjb2xvdXIuICovXG4gIHByaXZhdGUgdXBkYXRlRGlzcGxheUNsYXNzZXMoKTogdm9pZCB7XG4gICAgY29uc3Qga25vd24gPSBuZXcgU2V0KHRoaXMucHJlc2V0U2V0LmNsYXNzZXMubWFwKChjKSA9PiBwcmVzZXRLZXkodGhpcy5wcmVzZXRTZXQsIGMubmFtZSkpKTtcbiAgICBjb25zdCBmcm9tU291cmNlOiBDbGFzc1ByZXNldFtdID0gW107XG4gICAgZm9yIChjb25zdCBsYWJlbCBvZiBPYmplY3Qua2V5cyh0aGlzLnNvdXJjZUNsYXNzQ291bnRzKSkge1xuICAgICAgY29uc3QgayA9IHByZXNldEtleSh0aGlzLnByZXNldFNldCwgbGFiZWwpO1xuICAgICAgaWYgKGtub3duLmhhcyhrKSkgY29udGludWU7XG4gICAgICBrbm93bi5hZGQoayk7XG4gICAgICBmcm9tU291cmNlLnB1c2goeyBuYW1lOiBsYWJlbCwgY29sb3I6IGNvbG9yRm9yTGFiZWwobGFiZWwsIHRoaXMucHJlc2V0U2V0KSB9KTtcbiAgICB9XG4gICAgdGhpcy50YWJsZVByZXNldFNldCA9IGZyb21Tb3VyY2UubGVuZ3RoXG4gICAgICA/IHsgLi4udGhpcy5wcmVzZXRTZXQsIGNsYXNzZXM6IFsuLi50aGlzLnByZXNldFNldC5jbGFzc2VzLCAuLi5mcm9tU291cmNlXSB9XG4gICAgICA6IHRoaXMucHJlc2V0U2V0O1xuICAgIHRoaXMuZGlzcGxheUNsYXNzZXMgPSBbLi4udGhpcy5wcmVzZXRTZXQuY2xhc3NlcywgLi4uZnJvbVNvdXJjZV0uc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgZCA9IHRoaXMuY2xhc3NDb3VudChiLm5hbWUpIC0gdGhpcy5jbGFzc0NvdW50KGEubmFtZSk7XG4gICAgICByZXR1cm4gZCAhPT0gMCA/IGQgOiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIE51bWJlciBvZiByZWdpb25zIGN1cnJlbnRseSB1c2luZyBhIGNsYXNzIChrZXllZCBieSB0aGUgYWN0aXZlIG1hdGNoIG1vZGUpLiAqL1xuICBwcm90ZWN0ZWQgY2xhc3NDb3VudChuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNsYXNzQ291bnRzLmdldChwcmVzZXRLZXkodGhpcy5wcmVzZXRTZXQsIG5hbWUpKSA/PyAwO1xuICB9XG5cbiAgLyoqIFJlY29sb3VyIGEgY2xhc3MgZnJvbSBpdHMgcGFuZWwgc3dhdGNoIGFuZCByZXBhaW50IGl0cyAobm9uLW92ZXJyaWRkZW4pIHJlZ2lvbnMuICovXG4gIHByb3RlY3RlZCBzZXRDbGFzc0NvbG9yKG5hbWU6IHN0cmluZywgY29sb3I6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghY29sb3IpIHJldHVybjtcbiAgICB0aGlzLnJlZ2lvbkFwaS5zZXRDbGFzc2lmaWNhdGlvbkNvbG9yKG5hbWUsIGNvbG9yKTtcbiAgICB0aGlzLmNvbW1pdCgpO1xuICB9XG5cbiAgLyoqIFJlbW92ZSBhIGNsYXNzLiBBbnkgcmVnaW9ucyBzdGlsbCB1c2luZyBpdCBmYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHRcbiAgICogIFwiUmVnaW9uXCIgY2xhc3MsIHNvIHRoZXkgYXJlbid0IG9ycGhhbmVkIChhbmQgdGhlIGNsYXNzIGlzbid0IGltbWVkaWF0ZWx5XG4gICAqICByZS1hZGRlZCBmcm9tIGl0cyByZWdpb25zIGJ5IHN5bmNDbGFzc2VzRnJvbVJlZ2lvbnMpLiAqL1xuICBwcm90ZWN0ZWQgZGVsZXRlQ2xhc3MobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yZWFzc2lnblJlZ2lvbnNUb0RlZmF1bHRDbGFzcyhbbmFtZV0pO1xuICAgIHRoaXMucmVnaW9uQXBpLnJlbW92ZUNsYXNzKG5hbWUpO1xuICAgIGlmICh0aGlzLmFjdGl2ZUNsYXNzID09PSBuYW1lKSB0aGlzLmFjdGl2ZUNsYXNzID0gbnVsbDtcbiAgICB0aGlzLmNvbW1pdCgpO1xuICB9XG5cbiAgLyoqIFJlZ2lvbnMgbGFiZWxsZWQgd2l0aCBhbnkgb2YgYHJlbW92ZWROYW1lc2AgcmV2ZXJ0IHRvIHRoZSBkZWZhdWx0XG4gICAqICB7QGxpbmsgZGVmYXVsdENsYXNzTmFtZX0gKFwiUmVnaW9uXCIpOiBpdHMgY2xhc3MgY29sb3VyLCBvdmVycmlkZSBjbGVhcmVkLlxuICAgKiAgU2tpcHMgdGhlIGRlZmF1bHQgaXRzZWxmIHNvIGRlbGV0aW5nIFwiUmVnaW9uXCIgY2FuJ3Qgc2VsZi1yZWFzc2lnbi4gKGppdC11aSM3MCkgKi9cbiAgcHJpdmF0ZSByZWFzc2lnblJlZ2lvbnNUb0RlZmF1bHRDbGFzcyhyZW1vdmVkTmFtZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgY29uc3Qga2V5T2YgPSAoczogc3RyaW5nKSA9PiBwcmVzZXRLZXkodGhpcy5wcmVzZXRTZXQsIHMpO1xuICAgIGNvbnN0IHJlbW92ZWQgPSBuZXcgU2V0KHJlbW92ZWROYW1lcy5tYXAoa2V5T2YpKTtcbiAgICByZW1vdmVkLmRlbGV0ZShrZXlPZih0aGlzLmRlZmF1bHRDbGFzc05hbWUpKTtcbiAgICBpZiAoIXJlbW92ZWQuc2l6ZSkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbG9yID0gY29sb3JGb3JMYWJlbCh0aGlzLmRlZmF1bHRDbGFzc05hbWUsIHRoaXMucHJlc2V0U2V0KTtcbiAgICB0aGlzLnBhdGNoUmVnaW9ucygocikgPT5cbiAgICAgIHIubGFiZWwgJiYgcmVtb3ZlZC5oYXMoa2V5T2Yoci5sYWJlbCkpXG4gICAgICAgID8geyBsYWJlbDogdGhpcy5kZWZhdWx0Q2xhc3NOYW1lLCBjb2xvck92ZXJyaWRkZW46IGZhbHNlLCBjb2xvciB9XG4gICAgICAgIDogbnVsbCxcbiAgICApO1xuICB9XG5cbiAgLyoqIFN0YW1wIGEgY2xhc3MgKGFuZCBpdHMgcHJlc2V0L2ZhbGxiYWNrIGNvbG91cikgb250byBvbmUgcmVnaW9uIGZyb20gdGhlIENsYXNzXG4gICAqICBkcm9wZG93bjsgY2hvb3NpbmcgYSBjbGFzcyBvcHRzIHRoZSByZWdpb24gYmFjayBpbnRvIHRoZSBwcmVzZXQgY29sb3VyLiAqL1xuICBwcm90ZWN0ZWQgYXBwbHlQcmVzZXRUb1JlZ2lvbihyZWdpb246IFJlZ2lvbiwgY2xhc3NOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdGFuZElucy5oYXMocmVnaW9uKSkge1xuICAgICAgdm9pZCB0aGlzLnRha2VUaGVuKHJlZ2lvbiwgKHIpID0+IHRoaXMuYXBwbHlQcmVzZXRUb1JlZ2lvbihyLCBjbGFzc05hbWUpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IChjbGFzc05hbWUgPz8gJycpLnRyaW0oKTtcbiAgICBjb25zdCBwYXRjaDogUGFydGlhbDxSZWdpb24+ID0geyBsYWJlbDogbmFtZSwgY29sb3JPdmVycmlkZGVuOiBmYWxzZSB9O1xuICAgIGlmIChuYW1lKSBwYXRjaC5jb2xvciA9IGNvbG9yRm9yTGFiZWwobmFtZSwgdGhpcy5wcmVzZXRTZXQpO1xuICAgIHRoaXMucGF0Y2hSZWdpb25zKChyKSA9PiAociA9PT0gcmVnaW9uID8gcGF0Y2ggOiBudWxsKSk7XG4gICAgdGhpcy5jb21taXQoKTtcbiAgfVxuXG4gIC8qKiBNYWtlIGEgY2xhc3MgYWN0aXZlICh1c2VkIGZvciBuZXcgcmVnaW9ucykgYW5kLCBpZiByb3dzIGFyZSBzZWxlY3RlZCwgYXBwbHlcbiAgICogIGl0IHRvIHRoZW0gaW4gb25lIGNvbW1pdC4gKi9cbiAgcHJvdGVjdGVkIHNlbGVjdEFjdGl2ZUNsYXNzKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlQ2xhc3MgPSBuYW1lO1xuICAgIHRoaXMuYXBwbHlDbGFzc1RvU2VsZWN0ZWQobmFtZSk7XG4gIH1cblxuICAvKiogQXBwbHkgYSBjbGFzcyAobGFiZWwgKyBwcmVzZXQvZmFsbGJhY2sgY29sb3VyKSB0byB0aGUgY3VycmVudCBzZWxlY3Rpb24gYW5kIGNvbW1pdC4gKi9cbiAgcHJpdmF0ZSBhcHBseUNsYXNzVG9TZWxlY3RlZChuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IG5ldyBTZXQodGhpcy5zZWxlY3RlZFJlZ2lvbnMgPz8gW10pO1xuICAgIGlmICghc2VsZWN0ZWQuc2l6ZSkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbG9yID0gY29sb3JGb3JMYWJlbChuYW1lLCB0aGlzLnByZXNldFNldCk7XG4gICAgdGhpcy5wYXRjaFJlZ2lvbnMoKHIpID0+IChzZWxlY3RlZC5oYXMocikgPyB7IGxhYmVsOiBuYW1lLCBjb2xvck92ZXJyaWRkZW46IGZhbHNlLCBjb2xvciB9IDogbnVsbCkpO1xuICAgIHRoaXMuY29tbWl0KCk7XG4gIH1cblxuICAvKiogXCJFZGl0IGNsYXNzIG9uIHNlbGVjdGVkIHJvd3NcIiBwb3B1cCDigJQgYXBwbHkgdGhlIGNob3NlbiBleGlzdGluZyBjbGFzcy4gKi9cbiAgcHJvdGVjdGVkIGFwcGx5QnVsa0NsYXNzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5idWxrQ2xhc3MpIHJldHVybjtcbiAgICB0aGlzLmFwcGx5Q2xhc3NUb1NlbGVjdGVkKHRoaXMuYnVsa0NsYXNzKTtcbiAgICB0aGlzLm92ZXJsYXlQYW5lbD8uaGlkZSgpO1xuICB9XG5cbiAgLyoqIFwiRWRpdCBjbGFzcyBvbiBzZWxlY3RlZCByb3dzXCIgcG9wdXAg4oCUIGFkZCBhIG5ldyBjbGFzcyBhbmQgc2V0IGl0IG9uIHRoZSBzZWxlY3Rpb24uICovXG4gIHByb3RlY3RlZCBhZGRBbmRBcHBseUJ1bGtDbGFzcygpOiB2b2lkIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5uZXdCdWxrQ2xhc3MudHJpbSgpO1xuICAgIGlmICghbmFtZSkgcmV0dXJuO1xuICAgIGNvbnN0IGtleSA9IHByZXNldEtleSh0aGlzLnByZXNldFNldCwgbmFtZSk7XG4gICAgY29uc3QgZXhpc3RzID0gdGhpcy5wcmVzZXRTZXQuY2xhc3Nlcy5zb21lKChjKSA9PiBwcmVzZXRLZXkodGhpcy5wcmVzZXRTZXQsIGMubmFtZSkgPT09IGtleSk7XG4gICAgaWYgKCFleGlzdHMpIHtcbiAgICAgIHRoaXMucmVnaW9uQXBpLnVwc2VydENsYXNzKHsgbmFtZSwgY29sb3I6IGNvbG9yRm9yTGFiZWwobmFtZSwgdGhpcy5wcmVzZXRTZXQpLCBzb3VyY2U6ICd1c2VyJyB9KTtcbiAgICB9XG4gICAgdGhpcy5hcHBseUNsYXNzVG9TZWxlY3RlZChuYW1lKTtcbiAgICB0aGlzLmJ1bGtDbGFzcyA9IG5hbWU7XG4gICAgdGhpcy5uZXdCdWxrQ2xhc3MgPSAnJztcbiAgICB0aGlzLm92ZXJsYXlQYW5lbD8uaGlkZSgpO1xuICB9XG5cbiAgLy8g4pSA4pSAIE1hbmFnZS1jbGFzc2VzIGRpYWxvZyDilIDilIBcbiAgcHJvdGVjdGVkIG9wZW5NYW5hZ2VEaWFsb2coKTogdm9pZCB7XG4gICAgdGhpcy5wcmVzZXREcmFmdCA9IHRoaXMuY2xvbmVQcmVzZXRTZXQodGhpcy5wcmVzZXRTZXQpO1xuICAgIHRoaXMuc2hvd01hbmFnZURpYWxvZyA9IHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBjbG9uZVByZXNldFNldChzOiBQcmVzZXRTZXQpOiBQcmVzZXRTZXQge1xuICAgIHJldHVybiB7XG4gICAgICBjbGFzc2VzOiAocy5jbGFzc2VzID8/IFtdKS5tYXAoKGMpID0+ICh7IC4uLmMgfSkpLFxuICAgICAgZmFsbGJhY2tQYWxldHRlOiBbLi4uKHMuZmFsbGJhY2tQYWxldHRlID8/IFtdKV0sXG4gICAgICBhdXRvUHJvbW90ZTogISFzLmF1dG9Qcm9tb3RlLFxuICAgICAgbWF0Y2hNb2RlOiBzLm1hdGNoTW9kZSA9PT0gJ25vcm1hbGl6ZWQnID8gJ25vcm1hbGl6ZWQnIDogJ2V4YWN0JyxcbiAgICB9O1xuICB9XG4gIC8qKiBDb21taXQgdGhlIGRyYWZ0OiBkcm9wIGJsYW5rL2R1cGxpY2F0ZSBuYW1lcywgcGVyc2lzdCwgYW5kIHJlY29sb3VyXG4gICAqICBub24tb3ZlcnJpZGRlbiByZWdpb25zIHdpdGggdGhlIHVwZGF0ZWQgcHJlc2V0cy4gKi9cbiAgcHJvdGVjdGVkIGFwcGx5TWFuYWdlRGlhbG9nKGNsb3NlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnByZXNldERyYWZ0KSByZXR1cm47XG4gICAgLy8gRGUtZHVwbGljYXRlIHVzaW5nIHRoZSBhY3RpdmUgbWF0Y2ggbW9kZSdzIGtleSBzbyBub3JtYWxpemVkIG1vZGUgY2FuJ3Qga2VlcFxuICAgIC8vIGJvdGggXCJUdW1vclwiIGFuZCBcInR1bW9yXCIgKHdoaWNoIHdvdWxkIGNvbGxpZGUgYXQgcnVudGltZSBpbiBmaW5kUHJlc2V0KCkpLlxuICAgIGNvbnN0IGRyYWZ0ID0gdGhpcy5wcmVzZXREcmFmdDtcbiAgICBjb25zdCBrZXlPZiA9IChzOiBzdHJpbmcpID0+IHByZXNldEtleShkcmFmdCwgcyk7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IGNsYXNzZXM6IENsYXNzUHJlc2V0W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGMgb2YgZHJhZnQuY2xhc3Nlcykge1xuICAgICAgY29uc3QgbmFtZSA9IChjLm5hbWUgPz8gJycpLnRyaW0oKTtcbiAgICAgIGNvbnN0IGtleSA9IGtleU9mKG5hbWUpO1xuICAgICAgaWYgKCFuYW1lIHx8IHNlZW4uaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgc2Vlbi5hZGQoa2V5KTtcbiAgICAgIGNsYXNzZXMucHVzaCh7IC4uLmMsIG5hbWUgfSk7XG4gICAgfVxuICAgIHRoaXMucHJlc2V0RHJhZnQgPSB7IC4uLmRyYWZ0LCBjbGFzc2VzIH07XG4gICAgLy8gQ2xhc3NlcyBkcm9wcGVkIGluIHRoZSBkaWFsb2c6IHRoZWlyIHJlZ2lvbnMgcmV2ZXJ0IHRvIHRoZSBkZWZhdWx0IFwiUmVnaW9uXCJcbiAgICAvLyBjbGFzcyAoZWxzZSBzeW5jQ2xhc3Nlc0Zyb21SZWdpb25zIHdvdWxkIGp1c3QgcmUtYWRkIHRoZW0pIChqaXQtdWkjNzApLlxuICAgIGNvbnN0IGtlcHQgPSBuZXcgU2V0KGNsYXNzZXMubWFwKChjKSA9PiBrZXlPZihjLm5hbWUpKSk7XG4gICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMucHJlc2V0U2V0LmNsYXNzZXMubWFwKChjKSA9PiBjLm5hbWUpLmZpbHRlcigobikgPT4gIWtlcHQuaGFzKGtleU9mKG4pKSk7XG4gICAgdGhpcy5yZWFzc2lnblJlZ2lvbnNUb0RlZmF1bHRDbGFzcyhyZW1vdmVkKTtcbiAgICB0aGlzLnJlZ2lvbkFwaS5zZXRQcmVzZXRTZXQodGhpcy5wcmVzZXREcmFmdCk7XG4gICAgdGhpcy5jb21taXQoKTsgLy8gcmVjb2xvdXIgZXhpc3RpbmcgKG5vbi1vdmVycmlkZGVuKSByZWdpb25zIGZyb20gdGhlIG5ldyBwcmVzZXRzXG4gICAgaWYgKGNsb3NlKSB0aGlzLnNob3dNYW5hZ2VEaWFsb2cgPSBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVzZXRQcmVzZXRzVG9EZWZhdWx0cygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkFwaS5yZXNldFByZXNldHMoKTtcbiAgICB0aGlzLnByZXNldERyYWZ0ID0gdGhpcy5jbG9uZVByZXNldFNldCh0aGlzLnJlZ2lvbkFwaS5nZXRQcmVzZXRTZXQoKSk7XG4gICAgdGhpcy5jb21taXQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZXhwb3J0UHJlc2V0cygpOiB2b2lkIHtcbiAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkodGhpcy5jbG9uZVByZXNldFNldCh0aGlzLnJlZ2lvbkFwaS5nZXRQcmVzZXRTZXQoKSksIG51bGwsIDIpO1xuICAgIHNhdmVBcyhuZXcgQmxvYihbanNvbl0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0pLCAnYW5ub3RhdGlvbi1jbGFzc2VzLmpzb24nKTtcbiAgfVxuICBwcm90ZWN0ZWQgaW1wb3J0UHJlc2V0cyhldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLnBlcnNpc3RlbmNlLnJlYWRDaG9zZW5GaWxlKGV2ZW50LCAodGV4dCkgPT4gdGhpcy5hcHBseUltcG9ydGVkUHJlc2V0cyh0ZXh0KSk7XG4gIH1cblxuICAvKiogVmFsaWRhdGUgYW5kIGFwcGx5IGFuIGltcG9ydGVkIGFubm90YXRpb24tY2xhc3NlcyBKU09OIGZpbGUuICovXG4gIHByaXZhdGUgYXBwbHlJbXBvcnRlZFByZXNldHModGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNldCA9IHBhcnNlUHJlc2V0U2V0KEpTT04ucGFyc2UodGV4dCkpO1xuICAgICAgaWYgKCFzZXQpIHRocm93IG5ldyBFcnJvcignVGhlIGZpbGUgaXMgbm90IGFuIGFubm90YXRpb24tY2xhc3MgbGlzdCAobm8gdmFsaWQgY2xhc3NlcykuJyk7XG4gICAgICB0aGlzLnJlZ2lvbkFwaS5zZXRQcmVzZXRTZXQoc2V0KTtcbiAgICAgIHRoaXMucHJlc2V0RHJhZnQgPSB0aGlzLmNsb25lUHJlc2V0U2V0KHRoaXMucmVnaW9uQXBpLmdldFByZXNldFNldCgpKTtcbiAgICAgIHRoaXMuY29tbWl0KCk7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgIGtleTogVklaX1RPQVNUX0tFWSxcbiAgICAgICAgc2V2ZXJpdHk6ICdzdWNjZXNzJyxcbiAgICAgICAgc3VtbWFyeTogJ0NsYXNzZXMgaW1wb3J0ZWQnLFxuICAgICAgICBkZXRhaWw6ICdBbm5vdGF0aW9uIGNsYXNzZXMgbG9hZGVkLicsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAga2V5OiBWSVpfVE9BU1RfS0VZLFxuICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgc3VtbWFyeTogJ0ltcG9ydCBmYWlsZWQnLFxuICAgICAgICBkZXRhaWw6IGAkeyhlcnIgYXMgRXJyb3IpPy5tZXNzYWdlID8/IGVycn1gLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlZCgpO1xuICB9XG5cbiAgLyoqIFRoZSBmaWxlcyBjaG9zZW4gaW4gdGhlIGltcG9ydCBpbnB1dHM6IG9uZSBHZW9KU09OLCBhIGxhYmVsIHZvbHVtZSB3aXRoIGl0cyBvbnRvbG9neSwgb3IgYVxuICAgKiAgZm9sZGVyIG9mIHBlci1zbGljZSBHZW9KU09OIGZpbGVzLiAqL1xuICBwcm90ZWN0ZWQgaW1wb3J0Um9pcyhldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBmaWxlcyA9IEFycmF5LmZyb20oKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5maWxlcyA/PyBbXSk7XG4gICAgaWYgKGZpbGVzLmxlbmd0aCkgdm9pZCB0aGlzLmltcG9ydFJlZ2lvbkZpbGVzKGZpbGVzLm1hcCgoZikgPT4gaW1wb3J0RmlsZShmLCBmLndlYmtpdFJlbGF0aXZlUGF0aCB8fCBmLm5hbWUpKSk7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgaG9zdCBjYW4gcGljayByZWdpb25zIG9uIGl0cyBzZXJ2ZXIgKFwiSW1wb3J0IHJlZ2lvbnMgZnJvbSBzZXJ2ZXJcIikuICovXG4gIHByb3RlY3RlZCBnZXQgY2FuSW1wb3J0RnJvbVNlcnZlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZS5jYW5QaWNrU2VydmVyUmVnaW9ucygpO1xuICB9XG4gIC8qKiBBbiBpbXBvcnQgZnJvbSB0aGUgc2VydmVyIGlzIGluIGZsaWdodC4gKi9cbiAgcHJvdGVjdGVkIGltcG9ydGluZyA9IGZhbHNlO1xuXG4gIC8qKiBcIkltcG9ydCByZWdpb25zIGZyb20gc2VydmVyXCI6IHRoZSBob3N0IHBpY2tzIGZpbGVzIG9yIGEgc2VydmVkIHJlZ2lvbiBzZXQ7IHRoZXkgaW1wb3J0IGFzIGNob3NlbiBmaWxlcyBkby4gKi9cbiAgcHJvdGVjdGVkIGltcG9ydEZyb21TZXJ2ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5pbXBvcnRpbmcgPSB0cnVlO1xuICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgIHRoaXMucGVyc2lzdGVuY2UucGlja1NlcnZlclJlZ2lvbnMoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHBpY2spID0+IHtcbiAgICAgICAgaWYgKCFwaWNrKSByZXR1cm47XG4gICAgICAgIGlmIChwaWNrLmtpbmQgPT09ICdmaWxlcycpIHtcbiAgICAgICAgICB2b2lkIHRoaXMuaW1wb3J0UmVnaW9uRmlsZXMocGljay5maWxlcy5tYXAoKGYpID0+IGltcG9ydEZpbGUoZi5kYXRhLCBmLm5hbWUpKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZvaWQgdGhpcy5pbXBvcnRTZXJ2ZWRSZWdpb25TZXQocGljay51cmwsIHBpY2submFtZSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnIpID0+IHRoaXMuaW1wb3J0RmFpbGVkKGVyciksXG4gICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICB0aGlzLmltcG9ydGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGBmaWxlc2A6IG9uZSBHZW9KU09OIGZpbGUgYXMgYmVmb3JlIChpdHMgcmVnaW9ucywgZWRpdGFibGUpOyBhbnl0aGluZyBlbHNlIChzZWVcbiAgICogcmVhZEFubm90YXRpb25TbGljZXMpIGFzIG9uZSByZWdpb24gc291cmNlIHBlciBzbGljZSwgcmVwbGFjaW5nIHRoZSByZWdpb25zIGFuZCBzb3VyY2VzIG9mXG4gICAqIGV2ZXJ5IHNsaWNlOiBhIGxhYmVsIHZvbHVtZSBvciBhbiBPTUUtWmFyciBsYWJlbCBpbWFnZSB0cmFjZWQgdGhlIGZpcnN0IHRpbWUgYSBzbGljZSBpcyBzaG93bixcbiAgICogaXRzIGNsYXNzZXMgbmFtZWQgKGFuZCB0cmVlZCkgYnkgaXRzIG9udG9sb2d5OyBhIGZvbGRlciBhcyBvbmUgc291cmNlIHBlciBzbGljZSBmaWxlOyBhXG4gICAqIHotaW5kZXhlZCBHZW9KU09OIG9uZSBwZXIgcGxhbmU7IGEgemlwIG9mIGFueSBvZiB0aGVzZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaW1wb3J0UmVnaW9uRmlsZXMoZmlsZXM6IFJlZ2lvbkltcG9ydEZpbGVbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEV2ZXJ5IHN0ZXAsIHJlYWRpbmcgdGhlIGZpbGVzIGluY2x1ZGVkLCByZXBvcnRzIGl0cyBmYWlsdXJlIGhlcmUgcmF0aGVyIHRoYW4gcmVqZWN0aW5nOlxuICAgIC8vIHRoZSBpbnB1dHMgY2FsbCB0aGlzIHdpdGhvdXQgd2FpdGluZyBvbiBpdC5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcGxhbiA9IGZpbGVzLnNvbWUoKGYpID0+IGlzWmlwTmFtZShmLm5hbWUpKSA/IG51bGwgOiBwbGFuUmVnaW9uSW1wb3J0KGZpbGVzKTtcbiAgICAgIGlmIChwbGFuPy5raW5kID09PSAnc2luZ2xlJykge1xuICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcGxhbi5maWxlLnRleHQoKTtcbiAgICAgICAgaWYgKG9uZVBsYW5lKHRleHQpKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hcHBseUltcG9ydGVkUm9pcyh0ZXh0KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGF0dGFjaCA9IHRoaXMucmVnaW9uQXBpLmltcG9ydFNsaWNlUmVnaW9uU291cmNlcz8uYmluZCh0aGlzLnJlZ2lvbkFwaSk7XG4gICAgICBpZiAoIWF0dGFjaCkge1xuICAgICAgICB0aGlzLmltcG9ydEZhaWxlZChuZXcgRXJyb3IoJ1RoaXMgdmlld2VyIGNhbm5vdCBob2xkIHJlZ2lvbiBzb3VyY2VzLicpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gVGFrZW4gYmVmb3JlIHRoZSBmaWxlcyBhcmUgcmVhZDogZGVjb2RpbmcgYSB2b2x1bWUgdGFrZXMgYSB3aGlsZSwgYW5kIHRoZSBpbXBvcnQgbXVzdCBsYW5kXG4gICAgICAvLyBvbiB0aGUgaW1hZ2UgaXQgd2FzIHN0YXJ0ZWQgZm9yLCBub3Qgb24gb25lIHNob3duIG1lYW53aGlsZS5cbiAgICAgIGNvbnN0IHRpY2tldCA9IHRoaXMucmVnaW9uQXBpLnJlZ2lvbkltcG9ydFRpY2tldD8uKCk7XG4gICAgICBjb25zdCBzZXQgPSBhd2FpdCByZWFkQW5ub3RhdGlvblNsaWNlcyhmaWxlcyk7XG4gICAgICBpZiAoIXNldCkge1xuICAgICAgICB0aGlzLmltcG9ydEZhaWxlZChcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnQ2hvb3NlIGEgR2VvSlNPTiBmaWxlLCBhIGZvbGRlciBvZiBHZW9KU09OIGZpbGVzLCBhIC5uaWksIC5uaWkuZ3ogb3IgLm5ycmQgbGFiZWwgdm9sdW1lLCAnICtcbiAgICAgICAgICAgICAgJ2FuIE9NRS1aYXJyIHN0b3JlLCBvciBhIC56aXAgb2YgYW55IG9mIHRoZXNlLicsXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHNldC5zaXplKSB0aGlzLndhcm5JZlNpemVEaWZmZXJzKHNldC5zaXplWzBdLCBzZXQuc2l6ZVsxXSk7XG4gICAgICBjb25zdCBhdHRhY2hlZCA9IGF0dGFjaChzZXQub3BlbmVycywgdGlja2V0KTtcbiAgICAgIGlmIChhdHRhY2hlZCA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLmltcG9ydFN0YWxlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWZ0ZXJTb3VyY2VJbXBvcnQoKTtcbiAgICAgIHRoaXMudG9hc3QoXG4gICAgICAgICdzdWNjZXNzJyxcbiAgICAgICAgJ1JlZ2lvbnMgaW1wb3J0ZWQnLFxuICAgICAgICBgJHtzZXQuc3VtbWFyeX07ICR7YXR0YWNoZWR9IHNsaWNlJHthdHRhY2hlZCA9PT0gMSA/ICcnIDogJ3MnfSBhbm5vdGF0ZWQuYCxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmltcG9ydEZhaWxlZChlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBBIHJlZ2lvbiBzZXQgdGhlIGhvc3QncyBzZXJ2ZXIgc2VydmVzIChqaXQtc2VydmljZSdzIC9yZWdpb25zL3tpZH0vKSwgcmVhZCB0aHJvdWdoIGl0cyBIdHRwQ2xpZW50LiAqL1xuICBwcml2YXRlIGFzeW5jIGltcG9ydFNlcnZlZFJlZ2lvblNldCh1cmw6IHN0cmluZywgbmFtZT86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGltcG9ydFNvdXJjZSA9IHRoaXMucmVnaW9uQXBpLmltcG9ydFJlZ2lvblNvdXJjZU9wZW5lcj8uYmluZCh0aGlzLnJlZ2lvbkFwaSk7XG4gICAgaWYgKCFpbXBvcnRTb3VyY2UpIHtcbiAgICAgIHRoaXMuaW1wb3J0RmFpbGVkKG5ldyBFcnJvcignVGhpcyB2aWV3ZXIgY2Fubm90IGhvbGQgcmVnaW9uIHNvdXJjZXMuJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0aWNrZXQgPSB0aGlzLnJlZ2lvbkFwaS5yZWdpb25JbXBvcnRUaWNrZXQ/LigpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhcHBsaWVkID0gYXdhaXQgaW1wb3J0U291cmNlKFxuICAgICAgICAoKSA9PiBvcGVuSHR0cFJlZ2lvblNvdXJjZSh1cmwsIHsgaHR0cDogdGhpcy5odHRwID8/IHVuZGVmaW5lZCB9KSxcbiAgICAgICAgdGlja2V0LFxuICAgICAgKTtcbiAgICAgIGlmIChhcHBsaWVkID09PSBmYWxzZSkge1xuICAgICAgICB0aGlzLmltcG9ydFN0YWxlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWZ0ZXJTb3VyY2VJbXBvcnQoKTtcbiAgICAgIHRoaXMudG9hc3QoJ3N1Y2Nlc3MnLCAnUmVnaW9ucyBpbXBvcnRlZCcsIG5hbWUgPz8gdXJsKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuaW1wb3J0RmFpbGVkKGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqIEFuIGltcG9ydCB0aGF0IGZpbmlzaGVkIGFmdGVyIGFub3RoZXIgaW1hZ2Ugd2FzIHNob3duIChvciBhbm90aGVyIGltcG9ydCBiZWdhbik6IGRyb3BwZWQuICovXG4gIHByaXZhdGUgaW1wb3J0U3RhbGUoKTogdm9pZCB7XG4gICAgdGhpcy50b2FzdCgnaW5mbycsICdJbXBvcnQgZGlzY2FyZGVkJywgJ1RoZSBpbWFnZSBjaGFuZ2VkIHdoaWxlIHRoZSByZWdpb25zIHdlcmUgYmVpbmcgcmVhZC4nKTtcbiAgICB0aGlzLmNoYW5nZWQoKTtcbiAgfVxuXG4gIC8qKiBUaGUgdGFibGUgYW5kIHNlbGVjdGlvbiBhZnRlciB0aGUgcmVnaW9ucyB3ZXJlIHJlcGxhY2VkIGJ5IGltcG9ydGVkIHNvdXJjZXMuICovXG4gIHByaXZhdGUgYWZ0ZXJTb3VyY2VJbXBvcnQoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZFJlZ2lvbnMgPSBbXTtcbiAgICB0aGlzLnBhZ2luYXRvckZpcnN0ID0gMDtcbiAgICB0aGlzLmNvbW1pdChbXSk7XG4gICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZWQoKTtcbiAgfVxuXG4gIC8qKiBXYXJuIHdoZW4gYW4gaW1wb3J0ZWQgdm9sdW1lJ3Mgc2xpY2VzIGFyZSBub3QgdGhlIGltYWdlJ3Mgc2l6ZTogaXRzIG91dGxpbmVzIHdvdWxkIG5vdCBmaXQuICovXG4gIHByaXZhdGUgd2FybklmU2l6ZURpZmZlcnMod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5yZWdpb25BcGkuZ2V0TWFza0ltYWdlU2l6ZSgpO1xuICAgIGlmIChtZXRhICYmIChtZXRhLndpZHRoICE9PSB3aWR0aCB8fCBtZXRhLmhlaWdodCAhPT0gaGVpZ2h0KSkge1xuICAgICAgdGhpcy50b2FzdChcbiAgICAgICAgJ2luZm8nLFxuICAgICAgICAnRGlmZmVyZW50IHNpemUnLFxuICAgICAgICBgVGhlIHZvbHVtZSdzIHNsaWNlcyBhcmUgJHt3aWR0aH0gw5cgJHtoZWlnaHR9OyB0aGUgaW1hZ2UgaXMgJHttZXRhLndpZHRofSDDlyAke21ldGEuaGVpZ2h0fS5gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGltcG9ydEZhaWxlZChlcnI6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLmltcG9ydGluZyA9IGZhbHNlO1xuICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgIGtleTogVklaX1RPQVNUX0tFWSxcbiAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgc3VtbWFyeTogJ0Vycm9yIGltcG9ydGluZyByZWdpb25zJyxcbiAgICAgIGRldGFpbDogYCR7KGVyciBhcyBFcnJvcik/Lm1lc3NhZ2UgPz8gZXJyfWAsXG4gICAgfSk7XG4gICAgY29uc29sZS5lcnJvcignRXJyb3IgaW1wb3J0aW5nIHJlZ2lvbnM6JywgZXJyKTtcbiAgICB0aGlzLmNoYW5nZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIHRoZSByZWdpb25zIHdpdGggYW4gaW1wb3J0ZWQgR2VvSlNPTiBmaWxlJ3MsIGFuZCB0aGUgc2xpY2UncyByZWdpb24gc291cmNlIHdpdGggdGhlbS5cbiAgICogQSBsYXJnZSBmaWxlIGJlY29tZXMgdGhlIHNsaWNlJ3MgcmVnaW9uIHNvdXJjZSBpbnN0ZWFkIChkcmF3biBieSBsZXZlbCBvZiBkZXRhaWw7IGxpc3RlZCBhYm92ZVxuICAgKiB0aGUgdGFibGUpLCB0aGUgdGFibGUgZW1wdGllZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXBwbHlJbXBvcnRlZFJvaXModGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLnJlZ2lvbkFwaS5pbXBvcnRSZWdpb25Tb3VyY2U/Lih0ZXh0KSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkUmVnaW9ucyA9IFtdO1xuICAgICAgICB0aGlzLnBhZ2luYXRvckZpcnN0ID0gMDtcbiAgICAgICAgdGhpcy5jb21taXQoW10pO1xuICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlZCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBQYXJzZWQgZmlyc3Q6IGEgZmlsZSB0aGF0IGlzIG5vdCBHZW9KU09OIGxlYXZlcyB0aGUgc291cmNlIGFsb25lLlxuICAgICAgY29uc3QgcmVnaW9ucyA9IHRoaXMucmVnaW9uQXBpLmltcG9ydFJlZ2lvbnModGV4dCk7XG4gICAgICBhd2FpdCB0aGlzLnJlZ2lvbkFwaS5kcm9wUmVnaW9uU291cmNlPy4oKTtcbiAgICAgIHRoaXMucmVnaW9ucyA9IHJlZ2lvbnM7XG4gICAgICB0aGlzLmZpbGxDbGFzc0NvbG9ycygpO1xuICAgICAgdGhpcy5jb21taXQoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAga2V5OiBWSVpfVE9BU1RfS0VZLFxuICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgc3VtbWFyeTogJ0Vycm9yIGltcG9ydGluZyB0aGUgZmlsZScsXG4gICAgICAgIGRldGFpbDogYCR7KGVyciBhcyBFcnJvcik/Lm1lc3NhZ2UgPz8gZXJyfWAsXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHJlYWRpbmcgdGhlIGZpbGU6JywgZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKiogUmVnaW9ucyB0byBzZXJpYWxpemUgb24gc2F2ZS9leHBvcnQgKGV2ZXJ5IHNsaWNlIGZvciBhIGNvbWJpbmVkIHotc3RhY2spLiAqL1xuICBwcml2YXRlIHJlZ2lvbnNGb3JTYXZlKCk6IFJlZ2lvbltdIHtcbiAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZS5yZWdpb25zRm9yU2F2ZSh0aGlzLnJlZ2lvbnMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGV4cG9ydFJvaXMoKSB7XG4gICAgaWYgKCF0aGlzLnJlZ2lvbnNGb3JTYXZlKCkubGVuZ3RoICYmICF0aGlzLmhhc1JlZ2lvblNvdXJjZSkgcmV0dXJuO1xuICAgIHRoaXMuZXhwb3J0RmlsZW5hbWUgPSB0aGlzLnBlcnNpc3RlbmNlLmRlZmF1bHRFeHBvcnROYW1lKCk7XG4gICAgdGhpcy5zaG93RXhwb3J0RGlhbG9nID0gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25maXJtRXhwb3J0KCkge1xuICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5leHBvcnRGaWxlbmFtZS50cmltKCk7XG4gICAgY29uc3QgcmVnaW9ucyA9IHRoaXMucmVnaW9uc0ZvclNhdmUoKTtcbiAgICBpZiAoIWZpbGVuYW1lIHx8ICghcmVnaW9ucy5sZW5ndGggJiYgIXRoaXMuaGFzUmVnaW9uU291cmNlKSkgcmV0dXJuO1xuICAgIHRoaXMuc2hvd0V4cG9ydERpYWxvZyA9IGZhbHNlO1xuICAgIHRoaXMucGVyc2lzdGVuY2VcbiAgICAgIC5kb3dubG9hZChyZWdpb25zLCBmaWxlbmFtZSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiB0aGlzLnRvYXN0KCdlcnJvcicsICdFcnJvciBleHBvcnRpbmcgcmVnaW9ucycsIGAkeyhlcnIgYXMgRXJyb3IpPy5tZXNzYWdlID8/IGVycn1gKSk7XG4gIH1cblxuICAvKiogT3BlbiB0aGUgXCJTYXZlIG1hc2tcIiBkaWFsb2csIHNlZWRlZCB3aXRoIGA8aW1hZ2Utc3RlbT5fbWFzay5wbmdgLiAqL1xuICBwcm90ZWN0ZWQgb3BlblNhdmVNYXNrRGlhbG9nKCkge1xuICAgIGlmICghdGhpcy5yZWdpb25zLmxlbmd0aCkgcmV0dXJuO1xuICAgIHRoaXMuc2F2ZU1hc2tGaWxlbmFtZSA9IHRoaXMucGVyc2lzdGVuY2UuZGVmYXVsdE1hc2tOYW1lKCk7XG4gICAgdGhpcy5tYXNrTW9kZSA9ICdiaW5hcnknO1xuICAgIHRoaXMuc2hvd1NhdmVNYXNrRGlhbG9nID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSYXN0ZXJpemUgdGhlIHJlZ2lvbnMgdG8gdGhlIGNob3NlbiBtYXNrIHR5cGUgYW5kIGRvd25sb2FkIGFzIGEgUE5HLiBUaGVcbiAgICogaGVhdnkgd29yayBydW5zIGluIGEgV2ViIFdvcmtlciAoe0BsaW5rIE1hc2tFeHBvcnRTZXJ2aWNlfSkgc28gdGhlIFVJIG5ldmVyXG4gICAqIGZyZWV6ZXMgb24gd2hvbGUtc2xpZGUgaW1hZ2VzIGFuZCB0aGUgam9iIGNhbiBiZSBjYW5jZWxsZWQgKGppdC11aSM5NSk7XG4gICAqIHRoZSBkaWFsb2cgc3RheXMgb3BlbiB3aXRoIGEgcHJvZ3Jlc3MgYmFyIHVudGlsIGRvbmUuXG4gICAqL1xuICBwcm90ZWN0ZWQgY29uZmlybVNhdmVNYXNrKCkge1xuICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5zYXZlTWFza0ZpbGVuYW1lLnRyaW0oKTtcbiAgICBpZiAoIWZpbGVuYW1lIHx8ICF0aGlzLnJlZ2lvbnMubGVuZ3RoIHx8IHRoaXMubWFza0J1c3kpIHJldHVybjtcblxuICAgIGNvbnN0IHNpemUgPSB0aGlzLnJlZ2lvbkFwaS5nZXRNYXNrSW1hZ2VTaXplKCk7XG4gICAgaWYgKCFzaXplKSB7XG4gICAgICB0aGlzLm1hc2tFcnJvcignTm8gaW1hZ2Ugc2l6ZSBpcyBhdmFpbGFibGUsIHNvIHRoZSBtYXNrIGNhbm5vdCBiZSBzaXplZC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5tYXNrQnVzeSA9IHRydWU7XG4gICAgdGhpcy5tYXNrRW5jb2RpbmcgPSBmYWxzZTtcbiAgICB0aGlzLm1hc2tQcm9ncmVzcyA9IDA7XG4gICAgdGhpcy5tYXNrSm9iID0gdGhpcy5tYXNrRXhwb3J0XG4gICAgICAuZXhwb3J0KHtcbiAgICAgICAgcmVnaW9uczogdGhpcy5yZWdpb25zLFxuICAgICAgICBpbWFnZVNpemU6IHNpemUsXG4gICAgICAgIG1vZGU6IHRoaXMubWFza01vZGUsXG4gICAgICAgIHNvdXJjZU5hbWU6IHRoaXMucGVyc2lzdGVuY2Uuc2VsZWN0ZWRGaWxlTmFtZSgpLFxuICAgICAgfSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoZSkgPT4ge1xuICAgICAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgICAgIHN3aXRjaCAoZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdwbGFubmVkJzpcbiAgICAgICAgICAgICAgaWYgKGUuc2NhbGUgPCAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgICAgICAgICAga2V5OiBWSVpfVE9BU1RfS0VZLFxuICAgICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdpbmZvJyxcbiAgICAgICAgICAgICAgICAgIHN1bW1hcnk6ICdNYXNrIGRvd25zY2FsZWQnLFxuICAgICAgICAgICAgICAgICAgZGV0YWlsOiBgSW1hZ2UgdG9vIGxhcmdlIGZvciBhIGZ1bGwtcmVzb2x1dGlvbiBtYXNrOyBzYXZpbmcgYXQgJHtlLndpZHRofcOXJHtlLmhlaWdodH0uYCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3Byb2dyZXNzJzpcbiAgICAgICAgICAgICAgdGhpcy5tYXNrUHJvZ3Jlc3MgPSBlLnBlcmNlbnQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZW5jb2RpbmcnOlxuICAgICAgICAgICAgICB0aGlzLm1hc2tFbmNvZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZG9uZSc6XG4gICAgICAgICAgICAgIHRoaXMuZmluaXNoTWFzayhlLmJsb2IsIGZpbGVuYW1lKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycjogRXJyb3IpID0+IHtcbiAgICAgICAgICB0aGlzLm1hc2tFcnJvcihlcnIubWVzc2FnZSk7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKiBDYW5jZWwgYW4gaW4tcHJvZ3Jlc3MgbWFzayBleHBvcnQgKHRlcm1pbmF0ZXMgaXRzIHdvcmtlcikgYW5kIHJlc2V0IHN0YXRlLiAqL1xuICBwcm90ZWN0ZWQgY2FuY2VsU2F2ZU1hc2soKSB7XG4gICAgdGhpcy5tYXNrSm9iPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMubWFza0pvYiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm1hc2tCdXN5ID0gZmFsc2U7XG4gICAgdGhpcy5tYXNrRW5jb2RpbmcgPSBmYWxzZTtcbiAgICB0aGlzLm1hc2tQcm9ncmVzcyA9IDA7XG4gIH1cblxuICBwcml2YXRlIGZpbmlzaE1hc2soYmxvYjogQmxvYiwgZmlsZW5hbWU6IHN0cmluZykge1xuICAgIHRoaXMubWFza0pvYiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm1hc2tCdXN5ID0gZmFsc2U7XG4gICAgdGhpcy5tYXNrRW5jb2RpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnNob3dTYXZlTWFza0RpYWxvZyA9IGZhbHNlO1xuICAgIHNhdmVBcyhibG9iLCBmaWxlbmFtZSk7XG4gIH1cblxuICBwcml2YXRlIG1hc2tFcnJvcihkZXRhaWw6IHN0cmluZykge1xuICAgIHRoaXMubWFza0pvYiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm1hc2tCdXN5ID0gZmFsc2U7XG4gICAgdGhpcy5tYXNrRW5jb2RpbmcgPSBmYWxzZTtcbiAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICBrZXk6IFZJWl9UT0FTVF9LRVksXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIHN1bW1hcnk6ICdDb3VsZCBub3QgY3JlYXRlIG1hc2snLFxuICAgICAgZGV0YWlsLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBlcnNpc3RSZWdpb25zKCkge1xuICAgIC8vIEZvbGRlciBzdGFjazogd3JpdGUgZWFjaCBzbGljZSdzIHJlZ2lvbnMgYmFjayB0byBpdHMgb3duIHNsaWNlLWZpbGUnc1xuICAgIC8vIHNpYmxpbmcgZ2VvanNvbiDigJQgbm8gc2luZ2xlLWZpbGVuYW1lIHByb21wdCAoaml0LXVpIzkzKS5cbiAgICBpZiAodGhpcy5wZXJzaXN0ZW5jZS5zYXZlc1BlclNsaWNlKCkpIHtcbiAgICAgIHRoaXMuc2F2ZVN0YWNrU2xpY2VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5wZXJzaXN0ZW5jZS5kZWZhdWx0U2F2ZU5hbWUoKTtcbiAgICBpZiAoIWZpbGVuYW1lIHx8ICghdGhpcy5yZWdpb25zRm9yU2F2ZSgpLmxlbmd0aCAmJiAhdGhpcy5oYXNSZWdpb25Tb3VyY2UpKSByZXR1cm47XG5cbiAgICB0aGlzLnNhdmVBc0ZpbGVuYW1lID0gZmlsZW5hbWU7XG4gICAgdGhpcy5zYXZlQXNGaWxlRXhpc3RzID0gZmFsc2U7XG4gICAgdGhpcy5zaG93U2F2ZUFzRGlhbG9nID0gdHJ1ZTtcbiAgICB0aGlzLnNhdmVBc0NoZWNrJC5uZXh0KHRoaXMuc2F2ZUFzRmlsZW5hbWUpO1xuICB9XG5cbiAgLyoqIFNhdmUgYSBmb2xkZXIgc3RhY2sncyByZWdpb25zIGFzIG9uZSBnZW9qc29uIHBlciBzbGljZS1maWxlIChqaXQtdWkjOTMpLlxuICAgKiAgTm8gZGlhbG9nIGNvdmVycyB0aGUgdG9vbGJhciBtZWFud2hpbGUsIHNvIGEgU2F2ZSB3aGlsZSBvbmUgaXMgdXBsb2FkaW5nXG4gICAqICBpcyBpZ25vcmVkIHJhdGhlciB0aGFuIHN0YXJ0aW5nIGEgc2Vjb25kIHdyaXRlIChhbmQgb3JwaGFuaW5nIHRoZSBmaXJzdCkuICovXG4gIHByaXZhdGUgYXN5bmMgc2F2ZVN0YWNrU2xpY2VzKCkge1xuICAgIGlmICh0aGlzLnNhdmVBc0J1c3kpIHJldHVybjtcbiAgICB0aGlzLnNhdmVBc0J1c3kgPSB0cnVlO1xuICAgIGxldCBzbGljZXM6IFNsaWNlR2VvSnNvbltdO1xuICAgIHRyeSB7XG4gICAgICBzbGljZXMgPSBhd2FpdCB0aGlzLnBlcnNpc3RlbmNlLnNsaWNlR2VvSnNvbnMoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuc2F2ZUFzQnVzeSA9IGZhbHNlO1xuICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICB0aGlzLnRvYXN0KCdlcnJvcicsICdFcnJvciBzYXZpbmcgcmVnaW9ucycsIGAkeyhlcnIgYXMgRXJyb3IpPy5tZXNzYWdlID8/IGVycn1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQ2FuY2VsbGVkIHdoaWxlIHRoZSBzbGljZXMgc2VyaWFsaXplZCwgb3Igbm90aGluZyB0byB3cml0ZS5cbiAgICBpZiAoIXRoaXMuc2F2ZUFzQnVzeSB8fCAhc2xpY2VzLmxlbmd0aCkge1xuICAgICAgdGhpcy5zYXZlQXNCdXN5ID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3NhdmVBc1N1YiA9IHRoaXMucGVyc2lzdGVuY2Uuc2F2ZVNsaWNlcyhzbGljZXMpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2F2ZUFzQnVzeSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgICAgdGhpcy50b2FzdChcbiAgICAgICAgICAnc3VjY2VzcycsXG4gICAgICAgICAgJ1JlZ2lvbnMgc2F2ZWQnLFxuICAgICAgICAgIGBTYXZlZCBST0lzIGZvciAke3NsaWNlcy5sZW5ndGh9IHNsaWNlJHtzbGljZXMubGVuZ3RoID09PSAxID8gJycgOiAncyd9YCxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICB0aGlzLnNhdmVBc0J1c3kgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICAgIHRoaXMudG9hc3QoJ2Vycm9yJywgJ0Vycm9yIHNhdmluZyByZWdpb25zJywgYCR7KGVyciBhcyBFcnJvcik/Lm1lc3NhZ2UgPz8gZXJyfWApO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja1NhdmVBc0ZpbGVFeGlzdHMoKSB7XG4gICAgdGhpcy5zYXZlQXNDaGVjayQubmV4dCh0aGlzLnNhdmVBc0ZpbGVuYW1lKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25maXJtU2F2ZUFzKCkge1xuICAgIGlmICghdGhpcy5wZXJzaXN0ZW5jZS5zZWxlY3RlZEZpbGVOYW1lKCkpIHJldHVybjtcblxuICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5zYXZlQXNGaWxlbmFtZS50cmltKCk7XG4gICAgaWYgKCFmaWxlbmFtZSkgcmV0dXJuO1xuXG4gICAgLy8gS2VlcCB0aGUgZGlhbG9nIG9wZW4gc2hvd2luZyBhbiAoaW5kZXRlcm1pbmF0ZSkgcHJvZ3Jlc3MgYmFyIHdoaWxlIHRoZVxuICAgIC8vIHJlZ2lvbnMgc2VyaWFsaXplIGFuZCB1cGxvYWQsIHRoZW4gY2xvc2Ugb24gc3VjY2Vzcy5cbiAgICBjb25zdCBkb1NhdmUgPSAoKSA9PiB7XG4gICAgICB0aGlzLnNhdmVBc0J1c3kgPSB0cnVlO1xuICAgICAgLy8gQWxzbyBydW4gZnJvbSB0aGUgb3ZlcndyaXRlIGNvbmZpcm1hdGlvbiwgd2hpY2ggdGhlIGhvc3QncyBkaWFsb2cgbWF5IGFuc3dlci5cbiAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgdGhpcy5fc2F2ZUFzU3ViID0gdGhpcy5wZXJzaXN0ZW5jZVxuICAgICAgICAuc2F2ZSgoKSA9PiB0aGlzLnJlZ2lvbnNGb3JTYXZlKCksIGZpbGVuYW1lKVxuICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNhdmVBc0J1c3kgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc2hvd1NhdmVBc0RpYWxvZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICAgICAgICB0aGlzLnRvYXN0KCdzdWNjZXNzJywgJ1JlZ2lvbnMgc2F2ZWQnLCBgU2F2ZWQgYXMgJHtmaWxlbmFtZX1gKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNhdmVBc0J1c3kgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgICAgICAgdGhpcy50b2FzdCgnZXJyb3InLCAnRXJyb3Igc2F2aW5nIHJlZ2lvbnMnLCBgJHsoZXJyIGFzIEVycm9yKT8ubWVzc2FnZSB8fCBlcnJ9YCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGlmICh0aGlzLnNhdmVBc0ZpbGVFeGlzdHMpIHtcbiAgICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcbiAgICAgICAgbWVzc2FnZTogYFwiJHtmaWxlbmFtZX1cIiBhbHJlYWR5IGV4aXN0cy4gRG8geW91IHdhbnQgdG8gb3ZlcndyaXRlIGl0P2AsXG4gICAgICAgIGhlYWRlcjogJ0NvbmZpcm0gT3ZlcndyaXRlJyxcbiAgICAgICAgaWNvbjogJ3BpIHBpLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJyxcbiAgICAgICAgYWNjZXB0OiBkb1NhdmUsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9TYXZlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENhbmNlbCBhbiBpbi1wcm9ncmVzcyBHZW9KU09OIHBlcnNpc3Q6IGFib3J0IHRoZSBkZWZlcnJlZCBzZXJpYWxpemUgYW5kL29yXG4gICAqICB0aGUgaW4tZmxpZ2h0IHVwbG9hZCwgYW5kIHJlc2V0IHN0YXRlLiAqL1xuICBwcm90ZWN0ZWQgY2FuY2VsU2F2ZUFzKCkge1xuICAgIHRoaXMuX3NhdmVBc1N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9zYXZlQXNTdWIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5zYXZlQXNCdXN5ID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHRvYXN0KHNldmVyaXR5OiAnc3VjY2VzcycgfCAnZXJyb3InIHwgJ2luZm8nLCBzdW1tYXJ5OiBzdHJpbmcsIGRldGFpbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBrZXk6IFZJWl9UT0FTVF9LRVksIHNldmVyaXR5LCBzdW1tYXJ5LCBkZXRhaWwgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIG9uZSBHZW9KU09OIGZpbGUgaG9sZHMgYSBzaW5nbGUgcGxhbmUgKGl0cyByZWdpb25zIGltcG9ydGVkIGFzIHRoZXkgYWx3YXlzIHdlcmUpLiBPbmVcbiAqIHRoYXQgZG9lcyBub3QgcGFyc2UgaXMgdGFrZW4gYXMgb25lIHRvbywgc28gdGhlIHJlZ2lvbnMgaW1wb3J0IHJlcG9ydHMgaXQgYXMgaXQgYWx3YXlzIGhhcy5cbiAqL1xuZnVuY3Rpb24gb25lUGxhbmUodGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHNwbGl0QnlQbGFuZSh0ZXh0KS5sZW5ndGggPT09IDE7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iLCI8cC10b29sYmFyIHN0eWxlQ2xhc3M9XCJyZWdpb24tdG9vbGJhclwiPlxuICA8ZGl2IGNsYXNzPVwicC10b29sYmFyLWdyb3VwLXN0YXJ0IGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LXdyYXAgZ2FwLTFcIj5cbiAgICA8cC1idXR0b25cbiAgICAgIGljb249XCJwaSBwaS10YWdcIlxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgIFt0ZXh0XT1cIiFzaG93U2hhcGVMYWJlbFwiXG4gICAgICBwVG9vbHRpcD1cIlNob3cgcmVnaW9uIGxhYmVscy5cIlxuICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgIChvbkNsaWNrKT1cInNob3dTaGFwZUxhYmVsID0gIXNob3dTaGFwZUxhYmVsOyBjaGFuZ2VTaG93U2hhcGVMYWJlbChzaG93U2hhcGVMYWJlbClcIlxuICAgID5cbiAgICA8L3AtYnV0dG9uPlxuICAgIDxwLWJ1dHRvblxuICAgICAgaWNvbj1cInBpIHBpLXN0b3AtY2lyY2xlXCJcbiAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICBbdGV4dF09XCIhcmVnaW9uc0ZpbGxlZFwiXG4gICAgICBwVG9vbHRpcD1cIkZpbGwgcmVnaW9ucyBpbiB0aGVpciBjb2xvdXIgKGFuIGF0bGFzJ3MgbG9vayk7IGxhYmVscyBzaXQgaW5zaWRlLlwiXG4gICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxuICAgICAgYXJpYUxhYmVsPVwiRmlsbCByZWdpb25zXCJcbiAgICAgIChvbkNsaWNrKT1cInRvZ2dsZUZpbGwoKVwiXG4gICAgPlxuICAgIDwvcC1idXR0b24+XG4gICAgPHAtYnV0dG9uXG4gICAgICAqbmdJZj1cInZvbHVtZVZpZXdcIlxuICAgICAgaWNvbj1cInBpIHBpLWV5ZVwiXG4gICAgICBzaXplPVwic21hbGxcIlxuICAgICAgW3RleHRdPVwiIXJlZ2lvbnNUaHJvdWdoVm9sdW1lXCJcbiAgICAgIFthdHRyLmFyaWEtcHJlc3NlZF09XCJyZWdpb25zVGhyb3VnaFZvbHVtZVwiXG4gICAgICBwVG9vbHRpcD1cIlNlZSB0aGUgcmVnaW9ucyB0aHJvdWdoIHRoZSB2b2x1bWUuIE9mZiwgdGhlIHZvbHVtZSBoaWRlcyB0aGUgcGFydHMgb2YgdGhlbSBiZWhpbmQgd2hhdCBpdCBzaG93czsgb24sIG5vbmUgKGxheWVycyB0cmFjZWQgaW5zaWRlIGJyaWdodCBzdHJ1Y3R1cmVzLCBzdWNoIGFzIGFuIE9DVCdzKS5cIlxuICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgIGFyaWFMYWJlbD1cIlJlZ2lvbnMgdGhyb3VnaCB2b2x1bWVcIlxuICAgICAgKG9uQ2xpY2spPVwidG9nZ2xlVGhyb3VnaFZvbHVtZSgpXCJcbiAgICA+XG4gICAgPC9wLWJ1dHRvbj5cbiAgICA8c3BhbiBjbGFzcz1cInRvb2xiYXItc2VwYXJhdG9yXCI+PC9zcGFuPlxuICAgIDwhLS0gTmV3IHJlZ2lvbnMgYXJlIG5vdyBjcmVhdGVkIGZyb20gdGhlIGRpYWdyYW0gdG9vbGJhclxuICAgICAgICAgKHJlY3RhbmdsZSwgcG9seWxpbmUsIGZyZWVmb3JtLCB3YW5kKS4gLS0+XG4gICAgPHAtYnV0dG9uXG4gICAgICBpY29uPVwicGkgcGktdXBsb2FkXCJcbiAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICBbdGV4dF09XCJ0cnVlXCJcbiAgICAgIHN0eWxlQ2xhc3M9XCJtci0yXCJcbiAgICAgIHBUb29sdGlwPVwiSW1wb3J0IHJlZ2lvbnM6IGEgR2VvSlNPTiBmaWxlLCBvciBhIGxhYmVsIHZvbHVtZSAoLm5paSwgLm5paS5neiwgLm5ycmQpIGNob3NlbiB3aXRoIGl0cyBvbnRvbG9neSBKU09OIGZvciB0aGUgY2xhc3MgdHJlZS5cIlxuICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgIChjbGljayk9XCJyb2lGaWxlSW5wdXQuY2xpY2soKVwiXG4gICAgPlxuICAgIDwvcC1idXR0b24+XG4gICAgPGlucHV0XG4gICAgICAjcm9pRmlsZUlucHV0XG4gICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICBhY2NlcHQ9XCIuZ2VvanNvbiwuanNvbiwubmlpLC5neiwubnJyZFwiXG4gICAgICBtdWx0aXBsZVxuICAgICAgaGlkZGVuXG4gICAgICAoY2hhbmdlKT1cImltcG9ydFJvaXMoJGV2ZW50KTsgcm9pRmlsZUlucHV0LnZhbHVlID0gJydcIlxuICAgIC8+XG4gICAgPHAtYnV0dG9uXG4gICAgICBpY29uPVwicGkgcGktZm9sZGVyLW9wZW5cIlxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgIFt0ZXh0XT1cInRydWVcIlxuICAgICAgc3R5bGVDbGFzcz1cIm1yLTJcIlxuICAgICAgcFRvb2x0aXA9XCJJbXBvcnQgYSBmb2xkZXIgb2YgcGVyLXNsaWNlIEdlb0pTT04gZmlsZXMgKG9uZSBwZXIgc2xpY2UsIGluIG5hbWUgb3JkZXIsIHdpdGggaXRzIHJlZ2lvbnNldC5qc29uIGNsYXNzIHRyZWUpLlwiXG4gICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxuICAgICAgYXJpYUxhYmVsPVwiSW1wb3J0IGEgZm9sZGVyIG9mIHJlZ2lvbnNcIlxuICAgICAgKGNsaWNrKT1cInJvaUZvbGRlcklucHV0LmNsaWNrKClcIlxuICAgID5cbiAgICA8L3AtYnV0dG9uPlxuICAgIDxpbnB1dFxuICAgICAgI3JvaUZvbGRlcklucHV0XG4gICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICB3ZWJraXRkaXJlY3RvcnlcbiAgICAgIG11bHRpcGxlXG4gICAgICBoaWRkZW5cbiAgICAgIChjaGFuZ2UpPVwiaW1wb3J0Um9pcygkZXZlbnQpOyByb2lGb2xkZXJJbnB1dC52YWx1ZSA9ICcnXCJcbiAgICAvPlxuICAgIDxwLWJ1dHRvblxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgIFt0ZXh0XT1cInRydWVcIlxuICAgICAgc3R5bGVDbGFzcz1cIm1yLTJcIlxuICAgICAgcFRvb2x0aXA9XCJEb3dubG9hZCByZWdpb25zIGFzIGdlb2pzb24gZmlsZS5cIlxuICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgIGljb249XCJwaSBwaS1kb3dubG9hZFwiXG4gICAgICAoY2xpY2spPVwiZXhwb3J0Um9pcygpXCJcbiAgICA+XG4gICAgPC9wLWJ1dHRvbj5cbiAgICA8cC1idXR0b25cbiAgICAgIGljb249XCJwaSBwaS1zYXZlXCJcbiAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICBbdGV4dF09XCJ0cnVlXCJcbiAgICAgIHN0eWxlQ2xhc3M9XCJtci0yXCJcbiAgICAgIHBUb29sdGlwPVwiU2F2ZSByZWdpb25zIHRvIHNlcnZlci5cIlxuICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgIChjbGljayk9XCJwZXJzaXN0UmVnaW9ucygpXCJcbiAgICAgIFtkaXNhYmxlZF09XCIoIXJlZ2lvbnMgfHwgIXJlZ2lvbnMubGVuZ3RoKSAmJiAhaGFzUmVnaW9uU291cmNlXCJcbiAgICA+XG4gICAgPC9wLWJ1dHRvbj5cbiAgICA8cC1idXR0b25cbiAgICAgICpuZ0lmPVwiY2FuSW1wb3J0RnJvbVNlcnZlclwiXG4gICAgICBpY29uPVwicGkgcGktY2xvdWQtZG93bmxvYWRcIlxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgIFt0ZXh0XT1cInRydWVcIlxuICAgICAgc3R5bGVDbGFzcz1cIm1yLTJcIlxuICAgICAgcFRvb2x0aXA9XCJJbXBvcnQgcmVnaW9ucyBmcm9tIHNlcnZlcjogYSBHZW9KU09OIGZpbGUsIGEgZm9sZGVyIG9mIHBlci1zbGljZSBHZW9KU09OIGZpbGVzIG9yIGEgbGFiZWwgdm9sdW1lICgubmlpLCAubmlpLmd6LCAubnJyZCkuXCJcbiAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXG4gICAgICBhcmlhTGFiZWw9XCJJbXBvcnQgcmVnaW9ucyBmcm9tIHNlcnZlclwiXG4gICAgICBbbG9hZGluZ109XCJpbXBvcnRpbmdcIlxuICAgICAgKGNsaWNrKT1cImltcG9ydEZyb21TZXJ2ZXIoKVwiXG4gICAgPlxuICAgIDwvcC1idXR0b24+XG4gICAgPHAtYnV0dG9uXG4gICAgICBzaXplPVwic21hbGxcIlxuICAgICAgW3RleHRdPVwidHJ1ZVwiXG4gICAgICBzdHlsZUNsYXNzPVwibXItMlwiXG4gICAgICBwVG9vbHRpcD1cIkRvd25sb2FkIG1hc2sgb2YgdGhlIHJlZ2lvbnMgYXMgUE5HXCJcbiAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXG4gICAgICAoY2xpY2spPVwib3BlblNhdmVNYXNrRGlhbG9nKClcIlxuICAgICAgW2Rpc2FibGVkXT1cIiFyZWdpb25zIHx8ICFyZWdpb25zLmxlbmd0aFwiXG4gICAgPlxuICAgICAgPCEtLSBSZWZlcmVuY2VzIHRoZSBmaWxlIHNvIElua3NjYXBlIGVkaXRzIHRvIG1hc2suc3ZnIHNob3cgdXAgZGlyZWN0bHlcbiAgICAgICAgICAgKHRoZSBsaWIncyBhc3NldHMvKiogYXJlIHNlcnZlZCBhdCBhc3NldHMvcGxvdHRpbmcvKS4gVGhlXG4gICAgICAgICAgIHRvb2xiYXItaWNvbi1kYXJrIGZpbHRlciByZWNvbG91cnMgdGhlIGJsYWNrIFNWRyB0byB0aGUgdGhlbWUgYmx1ZSxcbiAgICAgICAgICAgc2FtZSBhcyByZWdpb24tZWRpdG9yLnN2ZyBhbmQgdGhlIG90aGVyIFNWRyB0b29sYmFyIGljb25zLiAtLT5cbiAgICAgIDxpbWdcbiAgICAgICAgc3JjPVwiYXNzZXRzL3Bsb3R0aW5nL21hc2suc3ZnXCJcbiAgICAgICAgY2xhc3M9XCJ0b29sYmFyLWljb24tZGFya1wiXG4gICAgICAgIHN0eWxlPVwid2lkdGg6IDFyZW07IGhlaWdodDogMXJlbTsgdmVydGljYWwtYWxpZ246IG1pZGRsZVwiXG4gICAgICAgIGFsdD1cIkRvd25sb2FkIG1hc2tcIlxuICAgICAgLz5cbiAgICA8L3AtYnV0dG9uPlxuICAgIDxwLWJ1dHRvblxuICAgICAgbGFiZWw9XCJ4NTEyXCJcbiAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICBbdGV4dF09XCJ0cnVlXCJcbiAgICAgIHN0eWxlQ2xhc3M9XCJtci0yXCJcbiAgICAgIHBUb29sdGlwPVwiUm91bmQgYWxsIHJlY3RhbmdsZSByZWdpb25zXG4gICAgICAgICAgICAgICAgICAgIHRvIHdpZHRoIGFuZCBoZWlnaHQgdGhhdCBhcmUgbXVsdGlwbGUgb2YgNTEyXCJcbiAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXG4gICAgICAoY2xpY2spPVwicm91bmRSZWN0YW5nbGVMZW5ndGhzKClcIlxuICAgID5cbiAgICA8L3AtYnV0dG9uPlxuICAgIDxwLWJ1dHRvblxuICAgICAgaWNvbj1cInBpIHBpLWNoZWNrLXNxdWFyZVwiXG4gICAgICBzaXplPVwic21hbGxcIlxuICAgICAgW3RleHRdPVwidHJ1ZVwiXG4gICAgICBzdHlsZUNsYXNzPVwibXItMlwiXG4gICAgICBwVG9vbHRpcD1cIlNlbGVjdCBhbGwgcmVnaW9uc1wiXG4gICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxuICAgICAgKGNsaWNrKT1cInNlbGVjdEFsbFJlZ2lvbnMoKVwiXG4gICAgICBbZGlzYWJsZWRdPVwiIXJlZ2lvbnMgfHwgIXJlZ2lvbnMubGVuZ3RoXCJcbiAgICA+XG4gICAgPC9wLWJ1dHRvbj5cbiAgICA8cC1idXR0b25cbiAgICAgIGljb249XCJwaSBwaS10YWdzXCJcbiAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICBbdGV4dF09XCJ0cnVlXCJcbiAgICAgIHN0eWxlQ2xhc3M9XCJtci0yXCJcbiAgICAgIHBUb29sdGlwPVwiRWRpdCBjbGFzcyBvbiBzZWxlY3RlZCByb3dzXCJcbiAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXG4gICAgICAoY2xpY2spPVwiIXNlbGVjdGVkUmVnaW9ucyB8fCAhc2VsZWN0ZWRSZWdpb25zLmxlbmd0aCA/IG9wLmhpZGUoKSA6IG9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWRSZWdpb25zIHx8ICFzZWxlY3RlZFJlZ2lvbnMubGVuZ3RoXCJcbiAgICA+XG4gICAgPC9wLWJ1dHRvbj5cbiAgICA8cC1idXR0b25cbiAgICAgIGljb249XCJwaSBwaS1wYWxldHRlXCJcbiAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICBbdGV4dF09XCJ0cnVlXCJcbiAgICAgIHN0eWxlQ2xhc3M9XCJtci0yXCJcbiAgICAgIHBUb29sdGlwPVwiRWRpdCBjb2xvdXIgb2Ygc2VsZWN0ZWQgcmVnaW9uc1wiXG4gICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxuICAgICAgKGNsaWNrKT1cIm9wZW5Db2xvckRpYWxvZygpXCJcbiAgICAgIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWRSZWdpb25zIHx8ICFzZWxlY3RlZFJlZ2lvbnMubGVuZ3RoXCJcbiAgICA+XG4gICAgPC9wLWJ1dHRvbj5cbiAgICA8cC1vdmVybGF5UGFuZWwgI29wIChvbkhpZGUpPVwiYnVsa0NsYXNzID0gJyc7IG5ld0J1bGtDbGFzcyA9ICcnXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtbiBnYXAtMlwiIHN0eWxlPVwid2lkdGg6IDE4cmVtXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1tZWRpdW0gdGV4dC05MDBcIlxuICAgICAgICAgID5TZXQgY2xhc3Mgb24ge3sgc2VsZWN0ZWRSZWdpb25zPy5sZW5ndGggfHwgMCB9fSBzZWxlY3RlZCByZWdpb24ocyk8L3NwYW5cbiAgICAgICAgPlxuICAgICAgICA8IS0tIFNlbGVjdGluZyBhIGNsYXNzIGFwcGxpZXMgaXQgaW1tZWRpYXRlbHkgKGNob29zaW5nIGFuIG9wdGlvbiBjbG9zZXMgdGhlXG4gICAgICAgICAgICAgb3ZlcmxheSwgc28gdGhlcmUncyBubyBzZXBhcmF0ZSBBcHBseSBidXR0b24pLiAtLT5cbiAgICAgICAgPHAtZHJvcGRvd25cbiAgICAgICAgICBzdHlsZUNsYXNzPVwidy1mdWxsXCJcbiAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgICAgIFtvcHRpb25zXT1cInByZXNldFNldC5jbGFzc2VzXCJcbiAgICAgICAgICBvcHRpb25MYWJlbD1cIm5hbWVcIlxuICAgICAgICAgIG9wdGlvblZhbHVlPVwibmFtZVwiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJidWxrQ2xhc3NcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ2hvb3NlIGEgY2xhc3PigKZcIlxuICAgICAgICAgIFtmaWx0ZXJdPVwicHJlc2V0U2V0LmNsYXNzZXMubGVuZ3RoID4gOFwiXG4gICAgICAgICAgZmlsdGVyQnk9XCJuYW1lXCJcbiAgICAgICAgICAob25DaGFuZ2UpPVwiYXBwbHlCdWxrQ2xhc3MoKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LWMgcFRlbXBsYXRlPVwiaXRlbVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZC12YWx1ZVwiXG4gICAgICAgICAgICAgID48c3BhbiBjbGFzcz1cImNoaXAtc3dhdGNoXCIgW3N0eWxlLmJhY2tncm91bmRdPVwiYy5jb2xvclwiPjwvc3Bhbj57eyBjLm5hbWUgfX08L3NwYW5cbiAgICAgICAgICAgID5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3AtZHJvcGRvd24+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwLWlucHV0Z3JvdXBcIj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwi4oCmb3IgYSBuZXcgY2xhc3NcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJuZXdCdWxrQ2xhc3NcIlxuICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiYWRkQW5kQXBwbHlCdWxrQ2xhc3MoKVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGljb249XCJwaSBwaS1wbHVzXCJcbiAgICAgICAgICAgIHBUb29sdGlwPVwiQWRkIGNsYXNzICZhbXA7IHNldCBpdFwiXG4gICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFuZXdCdWxrQ2xhc3MudHJpbSgpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJhZGRBbmRBcHBseUJ1bGtDbGFzcygpXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9wLW92ZXJsYXlQYW5lbD5cbiAgICA8cC1idXR0b25cbiAgICAgIGljb249XCJwaSBwaS10cmFzaFwiXG4gICAgICBzaXplPVwic21hbGxcIlxuICAgICAgW3RleHRdPVwidHJ1ZVwiXG4gICAgICBzdHlsZUNsYXNzPVwibXItMlwiXG4gICAgICAoY2xpY2spPVwiZGVsZXRlU2VsZWN0ZWRSZWdpb25zKClcIlxuICAgICAgcFRvb2x0aXA9XCJEZWxldGUgc2VsZWN0ZWQgcmVnaW9uc1wiXG4gICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxuICAgICAgW2Rpc2FibGVkXT1cIiFzZWxlY3RlZFJlZ2lvbnMgfHwgIXNlbGVjdGVkUmVnaW9ucy5sZW5ndGhcIlxuICAgID48L3AtYnV0dG9uPlxuICAgIDxwLWJ1dHRvblxuICAgICAgaWNvbj1cInBpIHBpLXRpbWVzLWNpcmNsZVwiXG4gICAgICBzaXplPVwic21hbGxcIlxuICAgICAgW3RleHRdPVwidHJ1ZVwiXG4gICAgICBzdHlsZUNsYXNzPVwibXItMlwiXG4gICAgICAoY2xpY2spPVwiY2xlYXJBbGxSZWdpb25zKClcIlxuICAgICAgcFRvb2x0aXA9XCJEZWxldGUgYWxsIHJlZ2lvbnNcIlxuICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgIFtkaXNhYmxlZF09XCIoIXJlZ2lvbnMgfHwgIXJlZ2lvbnMubGVuZ3RoKSAmJiAhaGFzUmVnaW9uU291cmNlXCJcbiAgICA+PC9wLWJ1dHRvbj5cbiAgICA8cC1idXR0b25cbiAgICAgIGljb249XCJwaSBwaS1xdWVzdGlvblwiXG4gICAgICBzaXplPVwic21hbGxcIlxuICAgICAgW3RleHRdPVwidHJ1ZVwiXG4gICAgICAoY2xpY2spPVwic2hvd0hlbHAoKVwiXG4gICAgICBwVG9vbHRpcD1cIkhlbHBcIlxuICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICA+PC9wLWJ1dHRvbj5cbiAgPC9kaXY+XG48L3AtdG9vbGJhcj5cblxuPHJlZ2lvbi1jbGFzc2VzLXBhbmVsXG4gIFtjbGFzc2VzXT1cImRpc3BsYXlDbGFzc2VzXCJcbiAgW2NvdW50c109XCJjbGFzc0NvdW50c1wiXG4gIFttYXRjaE1vZGVdPVwicHJlc2V0U2V0Lm1hdGNoTW9kZVwiXG4gIFthY3RpdmVDbGFzc109XCJhY3RpdmVDbGFzc1wiXG4gIFtwaWNrZWRdPVwicGlja2VkQ2xhc3NcIlxuICBbbWFya2VkXT1cIm1hcmtlZENsYXNzZXNcIlxuICBbc2VsZWN0ZWRDb3VudF09XCJzZWxlY3RlZFJlZ2lvbnM/Lmxlbmd0aCB8fCAwXCJcbiAgW2RlZmF1bHRDbGFzc05hbWVdPVwiZGVmYXVsdENsYXNzTmFtZVwiXG4gIChwaWNrKT1cInNlbGVjdEFjdGl2ZUNsYXNzKCRldmVudClcIlxuICAocmVjb2xvcik9XCJzZXRDbGFzc0NvbG9yKCRldmVudC5uYW1lLCAkZXZlbnQuY29sb3IpXCJcbiAgKHJlbW92ZSk9XCJkZWxldGVDbGFzcygkZXZlbnQpXCJcbiAgKG1hbmFnZSk9XCJvcGVuTWFuYWdlRGlhbG9nKClcIlxuICBbdm9sdW1lXT1cInZvbHVtZVZpZXdcIlxuICBbc2hvd24zZF09XCJzaG93bjNkTmFtZXNcIlxuICAodG9nZ2xlM2QpPVwidG9nZ2xlQ2xhc3MzZCgkZXZlbnQpXCJcbiAgW2NlbGxhYmxlXT1cImNlbGxhYmxlQ2xhc3Nlc1wiXG4gIFtpbmRpdmlkdWFsXT1cImluZGl2aWR1YWxDbGFzc2VzXCJcbiAgKHRvZ2dsZUNlbGxzKT1cInNldENsYXNzZXNJbmRpdmlkdWFsM2QoJGV2ZW50LmNsYXNzZXMsICRldmVudC5pbmRpdmlkdWFsKVwiXG4gIFtoaWRkZW5dPVwiaGlkZGVuQ2xhc3Nlc1wiXG4gICh0b2dnbGVIaWRkZW4pPVwic2V0Q2xhc3Nlc0hpZGRlbihbJGV2ZW50XSwgIWhpZGRlbkNsYXNzZXMuaGFzKCRldmVudCkpXCJcbiAgW3RyZWVWaWV3XT1cImNsYXNzSGllcmFyY2h5ID8gY2xhc3NUcmVlVmlldyA6IG51bGxcIlxuICAodHJlZVZpZXdDaGFuZ2UpPVwiY2xhc3NUcmVlVmlldyA9ICRldmVudFwiXG4+XG4gIDwhLS0gQSByZWdpb24gc2V0IHdpdGggYSBjbGFzcyBoaWVyYXJjaHkgKGFuIGF0bGFzIG9udG9sb2d5KSBjYW4gc2hvdyBpdHMgY2xhc3NlcyBhcyBhIHRyZWUuIC0tPlxuICA8cmVnaW9uLWNsYXNzLXRyZWVcbiAgICAqbmdJZj1cImNsYXNzSGllcmFyY2h5IGFzIGhpZXJhcmNoeVwiXG4gICAgW25vZGVzXT1cImhpZXJhcmNoeVwiXG4gICAgW2NvdW50c109XCJ0cmVlQ291bnRzXCJcbiAgICBbY29sb3JPZl09XCJ0cmVlQ29sb3JcIlxuICAgIFtwaWNrZWRdPVwicGlja2VkQ2xhc3NcIlxuICAgIFttYXJrZWRdPVwibWFya2VkQ2xhc3Nlc1wiXG4gICAgW3ZvbHVtZV09XCJ2b2x1bWVWaWV3XCJcbiAgICBbc2hvd24zZF09XCJzaG93bjNkTmFtZXNcIlxuICAgIFtjZWxsYWJsZV09XCJjZWxsYWJsZUNsYXNzZXNcIlxuICAgIFtpbmRpdmlkdWFsXT1cImluZGl2aWR1YWxDbGFzc2VzXCJcbiAgICAodG9nZ2xlQ2VsbHMpPVwic2V0Q2xhc3Nlc0luZGl2aWR1YWwzZCgkZXZlbnQuY2xhc3NlcywgJGV2ZW50LmluZGl2aWR1YWwpXCJcbiAgICAocGljayk9XCJwaWNrQ2xhc3NlcygkZXZlbnQpXCJcbiAgICAocmVjb2xvcik9XCJzZXRDbGFzc0NvbG9yKCRldmVudC5uYW1lLCAkZXZlbnQuY29sb3IpXCJcbiAgICAodG9nZ2xlM2QpPVwidG9nZ2xlQ2xhc3MzZCgkZXZlbnQubmFtZSwgJGV2ZW50LmNsYXNzZXMpXCJcbiAgICBbaGlkZGVuXT1cImhpZGRlbkNsYXNzZXNcIlxuICAgICh0b2dnbGVIaWRkZW4pPVwic2V0Q2xhc3Nlc0hpZGRlbigkZXZlbnQuY2xhc3NlcywgJGV2ZW50LmhpZGRlbilcIlxuICA+XG4gIDwvcmVnaW9uLWNsYXNzLXRyZWU+XG48L3JlZ2lvbi1jbGFzc2VzLXBhbmVsPlxuXG48cmVnaW9uLXRhYmxlXG4gIFtwYWdlXT1cInBhZ2VkUmVnaW9uc1wiXG4gIFt0b3RhbF09XCJ0YWJsZVRvdGFsXCJcbiAgW2ZpcnN0XT1cInBhZ2luYXRvckZpcnN0XCJcbiAgW3Jvd3NdPVwicGFnaW5hdG9yUm93c1wiXG4gIFtyb3dzUGVyUGFnZU9wdGlvbnNdPVwicm93c1BlclBhZ2VPcHRpb25zXCJcbiAgW21ldGFLZXldPVwibWV0YUtleVwiXG4gIFtzZWxlY3Rpb25dPVwic2VsZWN0ZWRSZWdpb25zXCJcbiAgKHNlbGVjdGlvbkNoYW5nZSk9XCJzZWxlY3RlZFJlZ2lvbnMgPSAkZXZlbnRcIlxuICAocm93U2VsZWN0KT1cIm9uU2VsZWN0aW9uQ2hhbmdlZCgpXCJcbiAgW3ByZXNldFNldF09XCJ0YWJsZVByZXNldFNldFwiXG4gIFtkZWZhdWx0Q29sb3JdPVwic2hhcGVDb2xvclwiXG4gIFttcHBdPVwibXBwXCJcbiAgW3ZvbHVtZXNdPVwidGFibGVWb2x1bWVzXCJcbiAgW2xhYmVsRHJhZnRzXT1cImVkaXRpbmdMYWJlbFJlZ2lvbnNcIlxuICAobGFiZWxFZGl0U3RhcnQpPVwic3RhcnRFZGl0TGFiZWwoJGV2ZW50KVwiXG4gIChsYWJlbERyYWZ0Q2hhbmdlKT1cInNldExhYmVsRHJhZnQoJGV2ZW50LnJlZ2lvbiwgJGV2ZW50LnZhbHVlKVwiXG4gIChsYWJlbEVkaXRTdG9wKT1cInN0b3BFZGl0TGFiZWwoJGV2ZW50LnJlZ2lvbiwgJGV2ZW50LmNvbW1pdClcIlxuICAoY2xhc3NQaWNrKT1cImFwcGx5UHJlc2V0VG9SZWdpb24oJGV2ZW50LnJlZ2lvbiwgJGV2ZW50Lm5hbWUpXCJcbiAgKGRlbGV0ZVJvdyk9XCJkZWxldGVSZWdpb24oJGV2ZW50KVwiXG4gIChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCJcbj5cbjwvcmVnaW9uLXRhYmxlPlxuXG48IS0tIExpdmUtZWRpdCBtb2RlOiBubyBTYXZlL0NhbmNlbCDigJQgZXZlcnkgZWRpdCBjb21taXRzIGltbWVkaWF0ZWx5IHRvIHRoZVxuICAgICBhY3RpdmUgaW1hZ2UncyByZWdpb24gY2FjaGUuIC0tPlxuXG48cC1jb25maXJtRGlhbG9nXG4gICNjZFxuICBbc3R5bGVdPVwieyB3aWR0aDogJzI0cmVtJywgaGVpZ2h0OiAnMTRyZW0nIH1cIlxuICBrZXk9XCJwb3NpdGlvbkRpYWxvZ1wiXG4gIFtiYXNlWkluZGV4XT1cIjEwMDAwXCJcbiAgcmVqZWN0QnV0dG9uU3R5bGVDbGFzcz1cInAtYnV0dG9uLW91dGxpbmVkXCJcbj5cbiAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZvb3RlclwiPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHBCdXR0b24gaWNvbj1cInBpIHBpLWNoZWNrXCIgbGFiZWw9XCJZZXNcIiAoY2xpY2spPVwiY2QuYWNjZXB0KClcIj48L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzPVwicC1idXR0b24tb3V0bGluZWRcIlxuICAgICAgcEJ1dHRvblxuICAgICAgaWNvbj1cInBpIHBpLXRpbWVzXCJcbiAgICAgIGxhYmVsPVwiTm9cIlxuICAgICAgKGNsaWNrKT1cImNkLnJlamVjdCgpXCJcbiAgICA+PC9idXR0b24+XG4gIDwvbmctdGVtcGxhdGU+XG48L3AtY29uZmlybURpYWxvZz5cblxuPHJlZ2lvbi1zYXZlLXJlZ2lvbnMtZGlhbG9nXG4gIFsodmlzaWJsZSldPVwic2hvd1NhdmVBc0RpYWxvZ1wiXG4gIFtmaWxlbmFtZV09XCJzYXZlQXNGaWxlbmFtZVwiXG4gIChmaWxlbmFtZUNoYW5nZSk9XCJzYXZlQXNGaWxlbmFtZSA9ICRldmVudDsgY2hlY2tTYXZlQXNGaWxlRXhpc3RzKClcIlxuICBbZmlsZUV4aXN0c109XCJzYXZlQXNGaWxlRXhpc3RzXCJcbiAgW2J1c3ldPVwic2F2ZUFzQnVzeVwiXG4gIChjb25maXJtKT1cImNvbmZpcm1TYXZlQXMoKVwiXG4gIChjYW5jZWxTYXZlKT1cImNhbmNlbFNhdmVBcygpXCJcbj5cbjwvcmVnaW9uLXNhdmUtcmVnaW9ucy1kaWFsb2c+XG5cbjxyZWdpb24tc2F2ZS1yZWdpb25zLWRpYWxvZ1xuICBoZWFkZXI9XCJFeHBvcnQgUmVnaW9uc1wiXG4gIGNvbmZpcm1MYWJlbD1cIkV4cG9ydFwiXG4gIGNvbmZpcm1JY29uPVwicGkgcGktZG93bmxvYWRcIlxuICBpbnB1dElkPVwiZXhwb3J0LWZpbGVuYW1lXCJcbiAgWyh2aXNpYmxlKV09XCJzaG93RXhwb3J0RGlhbG9nXCJcbiAgWyhmaWxlbmFtZSldPVwiZXhwb3J0RmlsZW5hbWVcIlxuICAoY29uZmlybSk9XCJjb25maXJtRXhwb3J0KClcIlxuPlxuPC9yZWdpb24tc2F2ZS1yZWdpb25zLWRpYWxvZz5cblxuPHJlZ2lvbi1zYXZlLW1hc2stZGlhbG9nXG4gIFsodmlzaWJsZSldPVwic2hvd1NhdmVNYXNrRGlhbG9nXCJcbiAgWyhmaWxlbmFtZSldPVwic2F2ZU1hc2tGaWxlbmFtZVwiXG4gIFsobW9kZSldPVwibWFza01vZGVcIlxuICBbYnVzeV09XCJtYXNrQnVzeVwiXG4gIFtwcm9ncmVzc109XCJtYXNrUHJvZ3Jlc3NcIlxuICBbZW5jb2RpbmddPVwibWFza0VuY29kaW5nXCJcbiAgKGNvbmZpcm0pPVwiY29uZmlybVNhdmVNYXNrKClcIlxuICAoY2FuY2VsRXhwb3J0KT1cImNhbmNlbFNhdmVNYXNrKClcIlxuPlxuPC9yZWdpb24tc2F2ZS1tYXNrLWRpYWxvZz5cblxuPHJlZ2lvbi1jb2xvci1kaWFsb2dcbiAgWyh2aXNpYmxlKV09XCJzaG93Q29sb3JEaWFsb2dcIlxuICBbZWRpdHNdPVwiY2xhc3NDb2xvckVkaXRzXCJcbiAgW3NlbGVjdGVkQ291bnRdPVwic2VsZWN0ZWRSZWdpb25zPy5sZW5ndGggfHwgMFwiXG4gIChhcHBseSk9XCJhcHBseUNvbG9yVG9TZWxlY3RlZCgkZXZlbnQpXCJcbj5cbjwvcmVnaW9uLWNvbG9yLWRpYWxvZz5cblxuPCEtLSBNYW5hZ2UgYW5ub3RhdGlvbiBjbGFzc2VzIChqaXQtdWkjNzApOiBlZGl0cyBhIHdvcmtpbmcgY29weSwgY29tbWl0dGVkIG9uIEFwcGx5LiAtLT5cbjxyZWdpb24tbWFuYWdlLWNsYXNzZXMtZGlhbG9nXG4gIFsodmlzaWJsZSldPVwic2hvd01hbmFnZURpYWxvZ1wiXG4gIFsoZHJhZnQpXT1cInByZXNldERyYWZ0XCJcbiAgKGFwcGx5KT1cImFwcGx5TWFuYWdlRGlhbG9nKHRydWUpXCJcbiAgKHJlc2V0RGVmYXVsdHMpPVwicmVzZXRQcmVzZXRzVG9EZWZhdWx0cygpXCJcbiAgKGltcG9ydEZpbGUpPVwiaW1wb3J0UHJlc2V0cygkZXZlbnQpXCJcbiAgKGV4cG9ydCk9XCJleHBvcnRQcmVzZXRzKClcIlxuPlxuPC9yZWdpb24tbWFuYWdlLWNsYXNzZXMtZGlhbG9nPlxuXG48cmVnaW9uLWVkaXRvci1oZWxwIFsodmlzaWJsZSldPVwiZGlzcGxheUhlbHBEaWFsb2dcIj48L3JlZ2lvbi1lZGl0b3ItaGVscD5cbiJdfQ==