@jax-data-science/sci-image-visualizer 0.10.0 → 0.12.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 (58) hide show
  1. package/esm2022/index.mjs +7 -1
  2. package/esm2022/lib/contracts/image.contract.mjs +1 -1
  3. package/esm2022/lib/contracts/ports/region-io.port.mjs +1 -1
  4. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  5. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +70 -2
  6. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +2 -2
  7. package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +11 -1
  8. package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +18 -2
  9. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +9 -1
  10. package/esm2022/lib/implementations/osd/osd-tile-loading.mjs +71 -0
  11. package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +1 -1
  12. package/esm2022/lib/implementations/osd/slice-cache.mjs +35 -6
  13. package/esm2022/lib/region-editor/region-editor.component.mjs +152 -4
  14. package/esm2022/lib/region-editor/region-persistence.service.mjs +9 -1
  15. package/esm2022/lib/region-import/label-classes.mjs +149 -0
  16. package/esm2022/lib/region-import/label-volume.mjs +225 -0
  17. package/esm2022/lib/region-import/ome-zarr-labels.mjs +253 -0
  18. package/esm2022/lib/region-import/open-annotations.mjs +289 -0
  19. package/esm2022/lib/region-import/region-import.mjs +71 -0
  20. package/esm2022/lib/region-import/zarr-codecs.mjs +167 -0
  21. package/esm2022/lib/region-import/zip.mjs +157 -0
  22. package/esm2022/lib/routing-visualizer.service.mjs +112 -7
  23. package/esm2022/lib/store/region-source-scope.mjs +19 -4
  24. package/esm2022/lib/store/region-store.service.mjs +64 -14
  25. package/esm2022/lib/visualizer/region-load.mjs +16 -1
  26. package/esm2022/lib/visualizer.component.mjs +28 -2
  27. package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-a68Hw5rw.mjs} +2057 -196
  28. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-a68Hw5rw.mjs.map +1 -0
  29. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-CvadfzjS.mjs} +4 -2
  30. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-CvadfzjS.mjs.map} +1 -1
  31. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +3 -1
  32. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  33. package/index.d.ts +12 -0
  34. package/lib/contracts/image.contract.d.ts +7 -0
  35. package/lib/contracts/ports/region-io.port.d.ts +24 -0
  36. package/lib/contracts/region-editor-api.contract.d.ts +19 -1
  37. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +40 -1
  38. package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +5 -0
  39. package/lib/implementations/osd/openseadragon-viewer-options.d.ts +2 -0
  40. package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +2 -0
  41. package/lib/implementations/osd/osd-tile-loading.d.ts +43 -0
  42. package/lib/implementations/osd/osd-viewer-like.d.ts +14 -0
  43. package/lib/implementations/osd/slice-cache.d.ts +13 -3
  44. package/lib/region-editor/region-editor.component.d.ts +27 -0
  45. package/lib/region-editor/region-persistence.service.d.ts +5 -1
  46. package/lib/region-import/label-classes.d.ts +39 -0
  47. package/lib/region-import/label-volume.d.ts +35 -0
  48. package/lib/region-import/ome-zarr-labels.d.ts +36 -0
  49. package/lib/region-import/open-annotations.d.ts +73 -0
  50. package/lib/region-import/region-import.d.ts +46 -0
  51. package/lib/region-import/zarr-codecs.d.ts +14 -0
  52. package/lib/region-import/zip.d.ts +31 -0
  53. package/lib/routing-visualizer.service.d.ts +39 -1
  54. package/lib/store/region-source-scope.d.ts +8 -2
  55. package/lib/store/region-store.service.d.ts +15 -5
  56. package/lib/visualizer.component.d.ts +9 -0
  57. package/package.json +2 -1
  58. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs.map +0 -1
@@ -19,6 +19,11 @@ import { colorForLabel, presetKey } from '../store/class-color.util';
19
19
  import { ConfirmationService, MessageService, SharedModule } from 'primeng/api';
20
20
  import { REGION_EDITOR_API } from '../contracts/region-editor-api.contract';
21
21
  import { VIZ_TOAST_KEY } from '../toast-outlets';
22
+ import { HttpClient } from '@angular/common/http';
23
+ import { openHttpRegionSource } from '../region-source/http-region-source';
24
+ import { importFile, planRegionImport } from '../region-import/region-import';
25
+ import { readAnnotationSlices, splitByPlane } from '../region-import/open-annotations';
26
+ import { isZipName } from '../region-import/zip';
22
27
  import { RegionPersistenceService } from './region-persistence.service';
23
28
  import { RegionColorDialogComponent } from './region-color-dialog/region-color-dialog.component';
24
29
  import { ClassesPanelComponent } from './classes-panel/classes-panel.component';
@@ -84,6 +89,8 @@ export class RegionEditorComponent {
84
89
  this.persistence = persistence;
85
90
  this.maskExport = maskExport;
86
91
  this.isActive = true;
92
+ /** The host's HttpClient: a served region set's requests go through it (its auth). */
93
+ this.http = inject(HttpClient, { optional: true });
87
94
  this.regions = [];
88
95
  this.selectedRegions = [];
89
96
  this.displayHelpDialog = false;
@@ -209,6 +216,8 @@ export class RegionEditorComponent {
209
216
  this.volumeRequest = 0;
210
217
  this._pageKey = {};
211
218
  this._page = [];
219
+ /** An import from the server is in flight. */
220
+ this.importing = false;
212
221
  }
213
222
  ngOnInit() {
214
223
  this.showShapeLabel = this.regionApi.getShowShapeLabel();
@@ -1143,8 +1152,135 @@ export class RegionEditorComponent {
1143
1152
  }
1144
1153
  this.changed();
1145
1154
  }
1155
+ /** The files chosen in the import inputs: one GeoJSON, a label volume with its ontology, or a
1156
+ * folder of per-slice GeoJSON files. */
1146
1157
  importRois(event) {
1147
- this.persistence.readChosenFile(event, (text) => void this.applyImportedRois(text));
1158
+ const files = Array.from(event.target.files ?? []);
1159
+ if (files.length)
1160
+ void this.importRegionFiles(files.map((f) => importFile(f, f.webkitRelativePath || f.name)));
1161
+ }
1162
+ /** Whether the host can pick regions on its server ("Import regions from server"). */
1163
+ get canImportFromServer() {
1164
+ return this.persistence.canPickServerRegions();
1165
+ }
1166
+ /** "Import regions from server": the host picks files or a served region set; they import as chosen files do. */
1167
+ importFromServer() {
1168
+ this.importing = true;
1169
+ this.changed();
1170
+ this.persistence.pickServerRegions().subscribe({
1171
+ next: (pick) => {
1172
+ if (!pick)
1173
+ return;
1174
+ if (pick.kind === 'files') {
1175
+ void this.importRegionFiles(pick.files.map((f) => importFile(f.data, f.name)));
1176
+ return;
1177
+ }
1178
+ void this.importServedRegionSet(pick.url, pick.name);
1179
+ },
1180
+ error: (err) => this.importFailed(err),
1181
+ complete: () => {
1182
+ this.importing = false;
1183
+ this.changed();
1184
+ },
1185
+ });
1186
+ }
1187
+ /**
1188
+ * Import `files`: one GeoJSON file as before (its regions, editable); anything else (see
1189
+ * readAnnotationSlices) as one region source per slice, replacing the regions and sources of
1190
+ * every slice: a label volume or an OME-Zarr label image traced the first time a slice is shown,
1191
+ * its classes named (and treed) by its ontology; a folder as one source per slice file; a
1192
+ * z-indexed GeoJSON one per plane; a zip of any of these.
1193
+ */
1194
+ async importRegionFiles(files) {
1195
+ // Every step, reading the files included, reports its failure here rather than rejecting:
1196
+ // the inputs call this without waiting on it.
1197
+ try {
1198
+ const plan = files.some((f) => isZipName(f.name)) ? null : planRegionImport(files);
1199
+ if (plan?.kind === 'single') {
1200
+ const text = await plan.file.text();
1201
+ if (onePlane(text)) {
1202
+ await this.applyImportedRois(text);
1203
+ return;
1204
+ }
1205
+ }
1206
+ const attach = this.regionApi.importSliceRegionSources?.bind(this.regionApi);
1207
+ if (!attach) {
1208
+ this.importFailed(new Error('This viewer cannot hold region sources.'));
1209
+ return;
1210
+ }
1211
+ // Taken before the files are read: decoding a volume takes a while, and the import must land
1212
+ // on the image it was started for, not on one shown meanwhile.
1213
+ const ticket = this.regionApi.regionImportTicket?.();
1214
+ const set = await readAnnotationSlices(files);
1215
+ if (!set) {
1216
+ this.importFailed(new Error('Choose a GeoJSON file, a folder of GeoJSON files, a .nii, .nii.gz or .nrrd label volume, ' +
1217
+ 'an OME-Zarr store, or a .zip of any of these.'));
1218
+ return;
1219
+ }
1220
+ if (set.size)
1221
+ this.warnIfSizeDiffers(set.size[0], set.size[1]);
1222
+ const attached = attach(set.openers, ticket);
1223
+ if (attached === null) {
1224
+ this.importStale();
1225
+ return;
1226
+ }
1227
+ this.afterSourceImport();
1228
+ this.toast('success', 'Regions imported', `${set.summary}; ${attached} slice${attached === 1 ? '' : 's'} annotated.`);
1229
+ }
1230
+ catch (err) {
1231
+ this.importFailed(err);
1232
+ }
1233
+ }
1234
+ /** A region set the host's server serves (jit-service's /regions/{id}/), read through its HttpClient. */
1235
+ async importServedRegionSet(url, name) {
1236
+ const importSource = this.regionApi.importRegionSourceOpener?.bind(this.regionApi);
1237
+ if (!importSource) {
1238
+ this.importFailed(new Error('This viewer cannot hold region sources.'));
1239
+ return;
1240
+ }
1241
+ const ticket = this.regionApi.regionImportTicket?.();
1242
+ try {
1243
+ const applied = await importSource(() => openHttpRegionSource(url, { http: this.http ?? undefined }), ticket);
1244
+ if (applied === false) {
1245
+ this.importStale();
1246
+ return;
1247
+ }
1248
+ this.afterSourceImport();
1249
+ this.toast('success', 'Regions imported', name ?? url);
1250
+ }
1251
+ catch (err) {
1252
+ this.importFailed(err);
1253
+ }
1254
+ }
1255
+ /** An import that finished after another image was shown (or another import began): dropped. */
1256
+ importStale() {
1257
+ this.toast('info', 'Import discarded', 'The image changed while the regions were being read.');
1258
+ this.changed();
1259
+ }
1260
+ /** The table and selection after the regions were replaced by imported sources. */
1261
+ afterSourceImport() {
1262
+ this.selectedRegions = [];
1263
+ this.paginatorFirst = 0;
1264
+ this.commit([]);
1265
+ this.onSelectionChanged();
1266
+ }
1267
+ /** Warn when an imported volume's slices are not the image's size: its outlines would not fit. */
1268
+ warnIfSizeDiffers(width, height) {
1269
+ const meta = this.regionApi.getMaskImageSize();
1270
+ if (meta && (meta.width !== width || meta.height !== height)) {
1271
+ this.toast('info', 'Different size', `The volume's slices are ${width} × ${height}; the image is ${meta.width} × ${meta.height}.`);
1272
+ }
1273
+ }
1274
+ importFailed(err) {
1275
+ this.importing = false;
1276
+ this.messageService.add({
1277
+ key: VIZ_TOAST_KEY,
1278
+ severity: 'error',
1279
+ summary: 'Error importing regions',
1280
+ detail: `${err?.message ?? err}`,
1281
+ });
1282
+ console.error('Error importing regions:', err);
1283
+ this.changed();
1148
1284
  }
1149
1285
  /**
1150
1286
  * Replace the regions with an imported GeoJSON file's, and the slice's region source with them.
@@ -1391,7 +1527,7 @@ export class RegionEditorComponent {
1391
1527
  this.messageService.add({ key: VIZ_TOAST_KEY, severity, summary, detail });
1392
1528
  }
1393
1529
  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 }); }
1394
- 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=\"Upload and display regions from geojson file.\"\n tooltipPosition=\"bottom\"\n (click)=\"roiFileInput.click()\"\n >\n </p-button>\n <input\n #roiFileInput\n type=\"file\"\n accept=\".geojson,.json\"\n hidden\n (change)=\"importRois($event); roiFileInput.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 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 }); }
1530
+ 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 }); }
1395
1531
  }
1396
1532
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: RegionEditorComponent, decorators: [{
1397
1533
  type: Component,
@@ -1414,7 +1550,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
1414
1550
  RegionColorDialogComponent,
1415
1551
  ManageClassesDialogComponent,
1416
1552
  RegionEditorHelpComponent,
1417
- ], 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=\"Upload and display regions from geojson file.\"\n tooltipPosition=\"bottom\"\n (click)=\"roiFileInput.click()\"\n >\n </p-button>\n <input\n #roiFileInput\n type=\"file\"\n accept=\".geojson,.json\"\n hidden\n (change)=\"importRois($event); roiFileInput.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 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"] }]
1553
+ ], 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"] }]
1418
1554
  }], ctorParameters: () => [{ type: undefined, decorators: [{
1419
1555
  type: Inject,
1420
1556
  args: [REGION_EDITOR_API]
@@ -1424,4 +1560,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
1424
1560
  }], active: [{
1425
1561
  type: Input
1426
1562
  }] } });
1427
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLWVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1lZGl0b3IvcmVnaW9uLWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1lZGl0b3IvcmVnaW9uLWVkaXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBR0wsU0FBUyxFQUNULE1BQU0sRUFDTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFB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SSxZQUFZLGtJQUNaLFdBQVcsOG1CQUNYLFlBQVkscUlBQ1osWUFBWSwya0JBQ1osbUJBQW1CLG9tQkFDbkIsY0FBYyx1dENBQ2QsZUFBZSx3SEFDZixrQkFBa0IsbVdBQ2xCLGFBQWEsa0pBQ2IsYUFBYSx1WEFDYixxQkFBcUIsZ1VBQ3JCLG9CQUFvQiwyVkFDcEIsa0JBQWtCLG1OQUNsQiwwQkFBMEIseVBBQzFCLHVCQUF1QixvT0FDdkIsMEJBQTBCLG9KQUMxQiw0QkFBNEIsb01BQzVCLHlCQUF5Qjs7MkZBT2hCLHFCQUFxQjtrQkE1QmpDLFNBQVM7K0JBQ0UsZUFBZSxjQUNiLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsWUFBWTt3QkFDWixZQUFZO3dCQUNaLG1CQUFtQjt3QkFDbkIsY0FBYzt3QkFDZCxlQUFlO3dCQUNmLGtCQUFrQjt3QkFDbEIsYUFBYTt3QkFDYixhQUFhO3dCQUNiLHFCQUFxQjt3QkFDckIsb0JBQW9CO3dCQUNwQixrQkFBa0I7d0JBQ2xCLDBCQUEwQjt3QkFDMUIsdUJBQXVCO3dCQUN2QiwwQkFBMEI7d0JBQzFCLDRCQUE0Qjt3QkFDNUIseUJBQXlCO3FCQUMxQixtQkFHZ0IsdUJBQXVCLENBQUMsTUFBTSxhQUNwQyxDQUFDLHdCQUF3QixDQUFDOzswQkFrS2xDLE1BQU07MkJBQUMsaUJBQWlCOytLQS9KRixZQUFZO3NCQUFwQyxTQUFTO3VCQUFDLElBQUk7Z0JBUUYsTUFBTTtzQkFBbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBEZXN0cm95UmVmLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgVmlld0NoaWxkLFxuICBpbmplY3QsXG4gIE5nWm9uZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBtYXJrRm9yQ2hlY2tJblpvbmUgfSBmcm9tICcuLi91dGlsL21hcmstZm9yLWNoZWNrJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYnV0dG9uJztcbmltcG9ydCB7IENvbmZpcm1EaWFsb2dNb2R1bGUgfSBmcm9tICdwcmltZW5nL2NvbmZpcm1kaWFsb2cnO1xuaW1wb3J0IHsgRHJvcGRvd25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2Ryb3Bkb3duJztcbmltcG9ydCB7IElucHV0VGV4dE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvaW5wdXR0ZXh0JztcbmltcG9ydCB7IE92ZXJsYXlQYW5lbCwgT3ZlcmxheVBhbmVsTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9vdmVybGF5cGFuZWwnO1xuaW1wb3J0IHsgVG9vbGJhck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdG9vbGJhcic7XG5pbXBvcnQgeyBUb29sdGlwTW9kdWxlIH0gZnJvbSAncHJpbWVuZy90b29sdGlwJztcbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gJ2ZpbGUtc2F2ZXInO1xuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFJlY3RhbmdsZSwgUmVnaW9uIH0gZnJvbSAnLi4vbW9kZWxzL3JlZ2lvbic7XG5pbXBvcnQgeyB3aXRoUmVnaW9uUGF0Y2ggfSBmcm9tICcuLi9tb2RlbHMvcmVnaW9uLWNsb25lJztcbmltcG9ydCB7IFByZXNldFNldCwgQ2xhc3NQcmVzZXQsIGRlZmF1bHRQcmVzZXRTZXQsIHBhcnNlUHJlc2V0U2V0IH0gZnJvbSAnLi4vbW9kZWxzL2NsYXNzLXByZXNldCc7XG5pbXBvcnQgeyBjb2xvckZvckxhYmVsLCBwcmVzZXRLZXkgfSBmcm9tICcuLi9zdG9yZS9jbGFzcy1jb2xvci51dGlsJztcbmltcG9ydCB7IENvbmZpcm1hdGlvblNlcnZpY2UsIE1lc3NhZ2VTZXJ2aWNlLCBTaGFyZWRNb2R1bGUgfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQgeyBJUmVnaW9uRWRpdG9yQXBpLCBSRUdJT05fRURJVE9SX0FQSSB9IGZyb20gJy4uL2NvbnRyYWN0cy9yZWdpb24tZWRpdG9yLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBWSVpfVE9BU1RfS0VZIH0gZnJvbSAnLi4vdG9hc3Qtb3V0bGV0cyc7XG5pbXBvcnQgeyBSZWdpb25QZXJzaXN0ZW5jZVNlcnZpY2UsIFNsaWNlR2VvSnNvbiB9IGZyb20gJy4vcmVnaW9uLXBlcnNpc3RlbmNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2xhc3NDb2xvckVkaXQsIFJlZ2lvbkNvbG9yRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi9yZWdpb24tY29sb3ItZGlhbG9nL3JlZ2lvbi1jb2xvci1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IENsYXNzZXNQYW5lbENvbXBvbmVudCB9IGZyb20gJy4vY2xhc3Nlcy1wYW5lbC9jbGFzc2VzLXBhbmVsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZWdpb25UYWJsZUNvbXBvbmVudCB9IGZyb20gJy4vcmVnaW9uLXRhYmxlL3JlZ2lvbi10YWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ2xhc3NUcmVlQ29tcG9uZW50LCBDbGFzc1RyZWVQaWNrIH0gZnJvbSAnLi9jbGFzcy10cmVlL2NsYXNzLXRyZWUuY29tcG9uZW50JztcbmltcG9ydCB0eXBlIHsgUmVnaW9uU291cmNlVmlldyB9IGZyb20gJy4uL3JlZ2lvbi1zb3VyY2UvcmVnaW9uLXNvdXJjZSc7XG5pbXBvcnQgdHlwZSB7IFJlZ2lvbkNsYXNzTm9kZSwgUmVnaW9uSW5kZXhSb3cgfSBmcm9tICcuLi9yZWdpb24tc291cmNlL3JlZ2lvbi10aWxlcyc7XG5pbXBvcnQgeyBTYXZlUmVnaW9uc0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vc2F2ZS1yZWdpb25zLWRpYWxvZy9zYXZlLXJlZ2lvbnMtZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTYXZlTWFza0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vc2F2ZS1tYXNrLWRpYWxvZy9zYXZlLW1hc2stZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNYW5hZ2VDbGFzc2VzRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi9tYW5hZ2UtY2xhc3Nlcy1kaWFsb2cvbWFuYWdlLWNsYXNzZXMtZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZWdpb25FZGl0b3JIZWxwQ29tcG9uZW50IH0gZnJvbSAnLi9yZWdpb24tZWRpdG9yLWhlbHAvcmVnaW9uLWVkaXRvci1oZWxwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNYXNrRXhwb3J0U2VydmljZSwgTWFza01vZGUgfSBmcm9tICcuL21hc2stZXhwb3J0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUGl4ZWxTaXplLCBmb3JtYXRBcmVhLCBwaWNrTXBwLCByZWdpb25BcmVhUHggfSBmcm9tICcuL3JlZ2lvbi1tZXRyaWNzJztcblxuLyoqXG4gKiBUaGUgUmVnaW9uIEVkaXRvciAoYDxyZWdpb24tZWRpdG9yPmApOiB0aGUgdGFibGUgb2YgdGhlIGFjdGl2ZSBpbWFnZSdzXG4gKiBhbm5vdGF0aW9uIHJlZ2lvbnMgd2l0aCBjbGFzcyBwcmVzZXRzLCBjb2xvdXJzLCBsYWJlbHMsIEdlb0pTT04gaW1wb3J0IC9cbiAqIGV4cG9ydCAvIHNlcnZlciBzYXZlIGFuZCBtYXNrIGV4cG9ydC4gU2VsZi1jb250YWluZWQ6IGl0IHRhbGtzIHRvIHRoZSB2aWV3ZXJcbiAqIG9ubHkgdGhyb3VnaCB7QGxpbmsgUkVHSU9OX0VESVRPUl9BUEl9IChhbmQgdGhlIGhvc3QncyBSRUdJT05fSU9fUE9SVCksIHNvIGl0XG4gKiBoYXMgbm8gaW5wdXRzIG9yIG91dHB1dHMuXG4gKlxuICogT25QdXNoOiB0ZW1wbGF0ZSBldmVudHMgcmUtcmVuZGVyIGl0OyBzdGF0ZSB0aGF0IGxhbmRzIGFzeW5jaHJvbm91c2x5ICh0aGVcbiAqIEFQSSdzIHJlZ2lvbiAvIHNlbGVjdGlvbiAvIHByZXNldCAvIGltYWdlLW1ldGEgc3RyZWFtcywgc2F2ZSBhbmQgbWFzay1leHBvcnRcbiAqIHByb2dyZXNzLCBmaWxlIHJlYWRzKSBtYXJrcyBpdCBmb3IgY2hlY2suXG4gKi9cbi8qKiBUaGUgb3BhY2l0eSB0aGUgZmlsbCB0b2dnbGUgZmlsbHMgcmVnaW9ucyBhdC4gKi9cbmNvbnN0IFJFR0lPTl9GSUxMX09QQUNJVFkgPSAwLjY7XG5cbi8qKiBcIlNlbGVjdCBhbGxcIiB0YWtlcyBhdCBtb3N0IHRoaXMgbWFueSByZWdpb24tc291cmNlIGZlYXR1cmVzIGludG8gdGhlIHJlZ2lvbnMuICovXG5jb25zdCBTRUxFQ1RfQUxMX1NPVVJDRV9MSU1JVCA9IDUwMDA7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JlZ2lvbi1lZGl0b3InLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIFNoYXJlZE1vZHVsZSxcbiAgICBCdXR0b25Nb2R1bGUsXG4gICAgQ29uZmlybURpYWxvZ01vZHVsZSxcbiAgICBEcm9wZG93bk1vZHVsZSxcbiAgICBJbnB1dFRleHRNb2R1bGUsXG4gICAgT3ZlcmxheVBhbmVsTW9kdWxlLFxuICAgIFRvb2xiYXJNb2R1bGUsXG4gICAgVG9vbHRpcE1vZHVsZSxcbiAgICBDbGFzc2VzUGFuZWxDb21wb25lbnQsXG4gICAgUmVnaW9uVGFibGVDb21wb25lbnQsXG4gICAgQ2xhc3NUcmVlQ29tcG9uZW50LFxuICAgIFNhdmVSZWdpb25zRGlhbG9nQ29tcG9uZW50LFxuICAgIFNhdmVNYXNrRGlhbG9nQ29tcG9uZW50LFxuICAgIFJlZ2lvbkNvbG9yRGlhbG9nQ29tcG9uZW50LFxuICAgIE1hbmFnZUNsYXNzZXNEaWFsb2dDb21wb25lbnQsXG4gICAgUmVnaW9uRWRpdG9ySGVscENvbXBvbmVudCxcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3JlZ2lvbi1lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yZWdpb24tZWRpdG9yLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtSZWdpb25QZXJzaXN0ZW5jZVNlcnZpY2VdLFxufSlcbmV4cG9ydCBjbGFzcyBSZWdpb25FZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGQoJ29wJykgcHJpdmF0ZSBvdmVybGF5UGFuZWwhOiBPdmVybGF5UGFuZWw7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGVkaXRvciBpcyBvbiBzY3JlZW4gKGl0cyBkaWFsb2cgb3BlbikuIENsb3NlZCwgaXQgYXNrcyB0aGUgcmVnaW9uIHNvdXJjZSBub3RoaW5nOlxuICAgKiBpdHMgcGFnZSBvZiBmZWF0dXJlcywgaXRzIGNsYXNzIGNvdW50cyBhbmQsIGluIGEgdm9sdW1lIHZpZXcsIGl0cyBjbGFzc2VzJyB2b2x1bWVzIGFyZSBlYWNoIGFcbiAgICogcmVxdWVzdCBvdmVyIHRoZSB3aG9sZSBzZXQgKGEgc3RhY2sncyBldmVyeSBzbGljZSksIGFuZCB0aGV5IGNvbXBldGVkIHdpdGggdGhlIHZvbHVtZSdzIG93blxuICAgKiBzbGljZSBsb2FkaW5nIGZvciBub3RoaW5nIGFueW9uZSBjb3VsZCBzZWUuIE9wZW5lZCwgaXQgcmVhZHMgdGhlbSBhZ2Fpbi5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBhY3RpdmUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCB3YXMgPSB0aGlzLmlzQWN0aXZlO1xuICAgIHRoaXMuaXNBY3RpdmUgPSB2YWx1ZTtcbiAgICBpZiAodmFsdWUgJiYgIXdhcykge1xuICAgICAgdm9pZCB0aGlzLnJlZnJlc2hTb3VyY2UoKTtcbiAgICAgIHRoaXMucmVzZXRWb2x1bWVzKCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgaXNBY3RpdmUgPSB0cnVlO1xuXG4gIHByb3RlY3RlZCByZWdpb25zOiBSZWdpb25bXSA9IFtdO1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWRSZWdpb25zOiBSZWdpb25bXSA9IFtdO1xuICBwcm90ZWN0ZWQgc2hvd1NoYXBlTGFiZWwhOiBib29sZWFuO1xuICBwcm90ZWN0ZWQgc2hhcGVDb2xvciE6IHN0cmluZztcbiAgcHJvdGVjdGVkIGZpbGxDb2xvciE6IHN0cmluZztcbiAgcHJvdGVjdGVkIGRpc3BsYXlIZWxwRGlhbG9nID0gZmFsc2U7XG4gIHByb3RlY3RlZCBzaG93Q29sb3JEaWFsb2cgPSBmYWxzZTtcbiAgLyoqIE9uZSBjb2xvdXIgZWRpdG9yIHBlciB1bmlxdWUgY2xhc3MgYW1vbmcgdGhlIHNlbGVjdGVkIHJlZ2lvbnMsIHNob3duIGluIHRoZVxuICAgKiAgXCJlZGl0IGNvbG91ciBvZiBzZWxlY3RlZCByZWdpb25zXCIgZGlhbG9nLiBVbmNsYXNzaWZpZWQgcmVnaW9ucyAobm8gbGFiZWwpXG4gICAqICBhcmUgZ3JvdXBlZCB1bmRlciBhIHNpbmdsZSBlbnRyeSB3aXRoIGFuIGVtcHR5IGBsYWJlbGAuICovXG4gIHByb3RlY3RlZCBjbGFzc0NvbG9yRWRpdHM6IENsYXNzQ29sb3JFZGl0W10gPSBbXTtcbiAgLyoqIFwiRWRpdCBjbGFzcyBvbiBzZWxlY3RlZCByb3dzXCIgcG9wdXA6IGNob3NlbiBleGlzdGluZyBjbGFzcywgYW5kIGEgbmV3LWNsYXNzIG5hbWUuICovXG4gIHByb3RlY3RlZCBidWxrQ2xhc3MgPSAnJztcbiAgcHJvdGVjdGVkIG5ld0J1bGtDbGFzcyA9ICcnO1xuXG4gIC8vIOKUgOKUgCBhbm5vdGF0aW9uLWNsYXNzIHByZXNldHMgKGppdC11aSM3MCkg4pSA4pSAXG4gIC8qKiBMb2NhbCBtaXJyb3Igb2YgdGhlIHBlci11c2VyIHByZXNldCBzZXQgKGNoaXAgc3RyaXAsIENsYXNzIGRyb3Bkb3duLCBkaWFsb2cpLiAqL1xuICBwcm90ZWN0ZWQgcHJlc2V0U2V0OiBQcmVzZXRTZXQgPSBkZWZhdWx0UHJlc2V0U2V0KCk7XG4gIC8qKiBUaGUgY2xhc3MgbGFzdCBwaWNrZWQgaW4gdGhlIHBhbmVsOyBhIGNoaXAtY2xpY2sgYXBwbGllcyBpdCB0byB0aGUgc2VsZWN0ZWQgcm93cy4gKi9cbiAgcHJvdGVjdGVkIGFjdGl2ZUNsYXNzOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIHNob3dNYW5hZ2VEaWFsb2cgPSBmYWxzZTtcbiAgLyoqIFdvcmtpbmcgY29weSBlZGl0ZWQgaW5zaWRlIHRoZSBNYW5hZ2UtY2xhc3NlcyBkaWFsb2c7IGNvbW1pdHRlZCBvbiBBcHBseS9Eb25lLiAqL1xuICBwcm90ZWN0ZWQgcHJlc2V0RHJhZnQ6IFByZXNldFNldCB8IG51bGwgPSBudWxsO1xuICAvKiogY2xhc3MgbmFtZSAobWF0Y2gtbW9kZSBrZXllZCkg4oaSIG51bWJlciBvZiByZWdpb25zIGN1cnJlbnRseSB1c2luZyBpdC4gKi9cbiAgcHJvdGVjdGVkIGNsYXNzQ291bnRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgLyoqIEZhbGxiYWNrIGNsYXNzIHRoYXQgYSByZWdpb24gcmV2ZXJ0cyB0byB3aGVuIGl0cyBjbGFzcyBpcyBkZWxldGVkIChqaXQtdWkjNzApLiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVmYXVsdENsYXNzTmFtZSA9ICdSZWdpb24nO1xuICAvKiogQ2xhc3NlcyBhcyBzaG93biBpbiB0aGUgcGFuZWw6IHNvcnRlZCBieSByZWdpb24gY291bnQgKGRlc2MpLCB0aGVuIG5hbWUuICovXG4gIHByb3RlY3RlZCBkaXNwbGF5Q2xhc3NlczogQ2xhc3NQcmVzZXRbXSA9IFtdO1xuXG4gIHByb3RlY3RlZCBwYWdpbmF0b3JGaXJzdCA9IDA7XG4gIHByb3RlY3RlZCBwYWdpbmF0b3JSb3dzID0gMTA7XG4gIHByb3RlY3RlZCByZWFkb25seSByb3dzUGVyUGFnZU9wdGlvbnMgPSBbMTAsIDI1LCA1MF07XG4gIC8qKiBSZWdpb25zIHdob3NlIENsYXNzIGNlbGwgaXMgY3VycmVudGx5IGluIGVkaXQgbW9kZSDihpIgdGhlIGxhYmVsIGJlaW5nIHR5cGVkLlxuICAgKiAgVGhlIGRyYWZ0IGlzIGNvbW1pdHRlZCBvbiBFbnRlciBhbmQgZGlzY2FyZGVkIG9uIEVzY2FwZS/inJUsIHNvIHR5cGluZyBuZXZlclxuICAgKiAgd3JpdGVzIGludG8gdGhlIHN0b3JlJ3MgcmVnaW9uIChSVC0xOCkuIEtleWVkIGJ5IG9iamVjdCBpZGVudGl0eSwgd2hpY2hcbiAgICogIGF2b2lkcyBuZWVkaW5nIGEgdW5pcXVlIGlkIGZpZWxkLiAqL1xuICBwcm90ZWN0ZWQgZWRpdGluZ0xhYmVsUmVnaW9ucyA9IG5ldyBNYXA8UmVnaW9uLCBzdHJpbmc+KCk7XG5cbiAgcHJvdGVjdGVkIHNob3dTYXZlQXNEaWFsb2cgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFRoZSBzbGljZSdzIHJlZ2lvbiBzb3VyY2UgKGEgbGFyZ2UgcmVnaW9uIHNldCBkcmF3biBieSBsZXZlbCBvZiBkZXRhaWwpLCBvciBudWxsLiBJdHNcbiAgICogZmVhdHVyZXMgYXJlIHJvd3Mgb2YgdGhlIHRhYmxlIGFmdGVyIHRoZSByZWdpb25zIOKAlCBzdGFuZC1pbnMgdW50aWwgb25lIGlzIHNlbGVjdGVkIG9yIGVkaXRlZCxcbiAgICogd2hpY2ggdGFrZXMgaXQgaW50byB0aGUgcmVnaW9ucyDigJQgYW5kIGl0cyBjbGFzc2VzIGNvdW50IGluIHRoZSBjbGFzc2VzIHBhbmVsLlxuICAgKi9cbiAgcHJvdGVjdGVkIHNvdXJjZVZpZXc6IFJlZ2lvblNvdXJjZVZpZXcgfCBudWxsID0gbnVsbDtcbiAgLyoqIEZlYXR1cmVzIHN0aWxsIGluIHRoZSBzb3VyY2UgKHRoZSB0YWJsZSdzIHJvd3MgYWZ0ZXIgdGhlIHJlZ2lvbnMpLiAqL1xuICBwcml2YXRlIHNvdXJjZVRvdGFsID0gMDtcbiAgLyoqIFN0YW5kLWluIHJvd3MgZm9yIHRoZSBzb3VyY2UgZmVhdHVyZXMgb24gdGhlIGN1cnJlbnQgcGFnZS4gKi9cbiAgcHJpdmF0ZSBzb3VyY2VSb3dzOiBSZWdpb25bXSA9IFtdO1xuICAvKiogRmVhdHVyZXMgcGVyIGNsYXNzIHN0aWxsIGluIHRoZSBzb3VyY2UuICovXG4gIHByaXZhdGUgc291cmNlQ2xhc3NDb3VudHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgLyoqIFRoZSBzdGFuZC1pbiByb3dzIChyb3dzIG9mIGEgc291cmNlIGZlYXR1cmUsIG5vdCBvZiBhIHJlZ2lvbikuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhbmRJbnMgPSBuZXcgV2Vha1NldDxSZWdpb24+KCk7XG4gIHByaXZhdGUgc3RhbmRJblNlcSA9IDA7XG4gIC8qKiBCdW1wZWQgcGVyIHNvdXJjZSByZWZyZXNoLCBzbyBhIGxhdGUgYW5zd2VyIGlzIGRyb3BwZWQuICovXG4gIHByaXZhdGUgc291cmNlUmVxdWVzdCA9IDA7XG4gIC8qKiBUaGUgY2xhc3NlcyB0aGUgdGFibGUncyBDbGFzcyBjb2x1bW4gb2ZmZXJzOiB0aGUgcHJlc2V0cyBhbmQgdGhlIHJlZ2lvbiBzb3VyY2UncyBjbGFzc2VzXG4gICAqICAoYSBkcm9wZG93biBjYW4gb25seSBzaG93IGEgdmFsdWUgdGhhdCBpcyBvbmUgb2YgaXRzIG9wdGlvbnMpLiAqL1xuICBwcm90ZWN0ZWQgdGFibGVQcmVzZXRTZXQ6IFByZXNldFNldCA9IGRlZmF1bHRQcmVzZXRTZXQoKTtcbiAgLyoqIFdoZXRoZXIgcmVnaW9ucyBhcmUgZHJhd24gZmlsbGVkICh0aGUgYXRsYXMgbG9vaykgcmF0aGVyIHRoYW4gb3V0bGluZWQuICovXG4gIHByb3RlY3RlZCByZWdpb25zRmlsbGVkID0gZmFsc2U7XG4gIC8qKiBXaGV0aGVyIGEgdm9sdW1lIHZpZXcgaXMgb24gc2NyZWVuIChjbGFzc2VzIGNhbiB0aGVuIGJlIHNob3duIGluIDNEKS4gKi9cbiAgcHJvdGVjdGVkIHZvbHVtZVZpZXcgPSBmYWxzZTtcbiAgLyoqIFdoZXRoZXIgdGhlIHZvbHVtZSB2aWV3J3Mgc2xpY2UgcGFuZSBpcyB3YW50ZWQgKG9uZSBzbGljZSBlZGl0ZWQgYmVzaWRlIHRoZSAzRCB2aWV3KS4gKi9cbiAgcHJpdmF0ZSBzbGljZVBhbmUgPSBmYWxzZTtcbiAgLyoqIFdoZXRoZXIgdGhlIHZvbHVtZSB2aWV3IGRyYXdzIHRoZSByZWdpb25zIHRocm91Z2ggdGhlIHZvbHVtZSAoc2VlIHRvZ2dsZVRocm91Z2hWb2x1bWUpLiAqL1xuICBwcm90ZWN0ZWQgcmVnaW9uc1Rocm91Z2hWb2x1bWUgPSBmYWxzZTtcbiAgLyoqIENsYXNzZXMgc2hvd24gaW4gM0QgaW4gdGhlIHZvbHVtZSB2aWV3LCBlYWNoIHdpdGggdGhlIGNsYXNzZXMgaXRzIHN1cmZhY2UgY292ZXJzLiAqL1xuICBwcm90ZWN0ZWQgc2hvd24zZCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgLyoqIFRoZSBjbGFzc2VzIG9mIHRoZSBjbGFzcyB0cmVlJ3MgcGljayAoaXQgYW5kIGl0cyBzdWJ0cmVlKSwgYXMgbG9uZyBhcyB0aGUgcGljayBob2xkcy4gKi9cbiAgcHJpdmF0ZSBwaWNrZWRDbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSA9IFtdO1xuICAvKiogVGhlIHNlbGVjdGVkIHJvd3MnIGNsYXNzZXMsIG1hcmtlZCBpbiB0aGUgY2xhc3MgbGlzdHMuICovXG4gIHByb3RlY3RlZCBtYXJrZWRDbGFzc2VzOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICAvKiogVGhlIHN1cmZhY2VzIGhpZ2hsaWdodGVkIGluIHRoZSB2b2x1bWUgdmlldyAodGhlaXIga2V5cywgam9pbmVkKS4gKi9cbiAgcHJpdmF0ZSBoaWdobGlnaHRlZDNkID0gJyc7XG4gIC8qKiBUaGUgY29sb3VyIGVhY2ggc2hvd24gc3VyZmFjZSB3YXMgbGFzdCBkcmF3biBpbi4gKi9cbiAgcHJpdmF0ZSBjb2xvcnMzZCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIC8qKiBUaGVpciBuYW1lcywgZm9yIHRoZSBjbGFzcyBsaXN0cycgdG9nZ2xlcyAoYSBuZXcgc2V0IHBlciBjaGFuZ2UsIGZvciBPblB1c2gpLiAqL1xuICBwcm90ZWN0ZWQgc2hvd24zZE5hbWVzOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICAvKiogVGhlIGNsYXNzZXMgaGlkZGVuIGZyb20gdmlldyAodGhlaXIgcmVnaW9ucywgc291cmNlIGZlYXR1cmVzIGFuZCBzdXJmYWNlcykuICovXG4gIHByb3RlY3RlZCBoaWRkZW5DbGFzc2VzOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICAvKiogV2hldGhlciBhIHJlZ2lvbiBzZXQncyBjbGFzcyBoaWVyYXJjaHkgaXMgc2hvd24gYXMgYSB0cmVlIChyYXRoZXIgdGhhbiB0aGUgY2xhc3MgbGlzdCkuICovXG4gIHByb3RlY3RlZCBjbGFzc1RyZWVWaWV3ID0gdHJ1ZTtcbiAgLyoqIFRoZSBjbGFzcyBwaWNrZWQgbGFzdCBpbiB0aGUgY2xhc3MgdHJlZS4gKi9cbiAgcHJvdGVjdGVkIHBpY2tlZENsYXNzOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFJlZ2lvbnMgcGVyIGNsYXNzICh0aGUgcmVnaW9ucycgYW5kIHRoZSBzb3VyY2UncyksIGZvciB0aGUgY2xhc3MgdHJlZS4gKi9cbiAgcHJvdGVjdGVkIHRyZWVDb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAvKiogQSBjbGFzcydzIGNvbG91ciwgZm9yIHRoZSBjbGFzcyB0cmVlOiBhIG5ldyBmdW5jdGlvbiBwZXIgY29sb3VyIGNoYW5nZSwgc28gdGhlIHRyZWUgcmVwYWludHMuICovXG4gIHByb3RlY3RlZCB0cmVlQ29sb3IgPSAobmFtZTogc3RyaW5nKTogc3RyaW5nID0+IGNvbG9yRm9yTGFiZWwobmFtZSwgdGhpcy5wcmVzZXRTZXQpO1xuICBwcm90ZWN0ZWQgc2F2ZUFzRmlsZW5hbWUgPSAnJztcbiAgcHJvdGVjdGVkIHNhdmVBc0ZpbGVFeGlzdHMgPSBmYWxzZTtcbiAgLyoqIFRydWUgd2hpbGUgYSBHZW9KU09OIHBlcnNpc3QgaXMgc2VyaWFsaXppbmcvdXBsb2FkaW5nIOKAlCBkcml2ZXMgdGhlIGRpYWxvZydzXG4gICAqICBwcm9ncmVzcyBiYXIgYW5kIENhbmNlbCBidXR0b24gKHBhcml0eSB3aXRoIHRoZSBTYXZlLW1hc2sgZGlhbG9nKS4gKi9cbiAgcHJvdGVjdGVkIHNhdmVBc0J1c3kgPSBmYWxzZTtcbiAgLyoqIFRoZSBydW5uaW5nIEdlb0pTT04gc2F2ZTsgdW5zdWJzY3JpYmluZyBjYW5jZWxzIGl0IChDYW5jZWwgLyBkZXN0cm95KS4gKi9cbiAgcHJpdmF0ZSBfc2F2ZUFzU3ViPzogU3Vic2NyaXB0aW9uO1xuICAvKiogU2F2ZS1hcyBmaWxlIG5hbWVzIHRvIGNoZWNrIGZvciBhbiBleGlzdGluZyBmaWxlIChkZWJvdW5jZWQpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNhdmVBc0NoZWNrJCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcblxuICBwcm90ZWN0ZWQgc2hvd0V4cG9ydERpYWxvZyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgZXhwb3J0RmlsZW5hbWUgPSAnJztcblxuICBwcm90ZWN0ZWQgc2hvd1NhdmVNYXNrRGlhbG9nID0gZmFsc2U7XG4gIHByb3RlY3RlZCBzYXZlTWFza0ZpbGVuYW1lID0gJyc7XG4gIC8qKiBNYXNrIHR5cGUgY2hvc2VuIGluIHRoZSBTYXZlLW1hc2sgZGlhbG9nOiBhIGJpbmFyeSBmb3JlZ3JvdW5kL2JhY2tncm91bmRcbiAgICogIG1hc2ssIG9yIGEgbXVsdGktY2xhc3MgbWFzayB3aXRoIGEgZGlzdGluY3QgaWQgcGVyIHJlZ2lvbi4gKi9cbiAgcHJvdGVjdGVkIG1hc2tNb2RlOiBNYXNrTW9kZSA9ICdiaW5hcnknO1xuICAvKiogVHJ1ZSB3aGlsZSB0aGUgbWFzayB3b3JrZXIgaXMgcmFzdGVyaXppbmcvZW5jb2Rpbmcg4oCUIGRyaXZlcyB0aGUgcHJvZ3Jlc3NcbiAgICogIGJhciBhbmQgdGhlIENhbmNlbCBidXR0b24gaW4gdGhlIGRpYWxvZy4gKi9cbiAgcHJvdGVjdGVkIG1hc2tCdXN5ID0gZmFsc2U7XG4gIC8qKiAw4oCTMTAwIHJhc3Rlcml6YXRpb24gcHJvZ3Jlc3M7IHN3aXRjaGVzIHRvIGluZGV0ZXJtaW5hdGUgZHVyaW5nIGVuY29kaW5nLiAqL1xuICBwcm90ZWN0ZWQgbWFza1Byb2dyZXNzID0gMDtcbiAgcHJvdGVjdGVkIG1hc2tFbmNvZGluZyA9IGZhbHNlO1xuICAvKiogVGhlIHJ1bm5pbmcgbWFzayBleHBvcnQ7IHVuc3Vic2NyaWJpbmcgY2FuY2VscyBpdCAodGVybWluYXRlcyBpdHMgd29ya2VyKS4gKi9cbiAgcHJpdmF0ZSBtYXNrSm9iPzogU3Vic2NyaXB0aW9uO1xuXG4gIC8qKlxuICAgKiBQcmltZU5HIHAtdGFibGUgbXVsdGktc2VsZWN0aW9uIG1vZGUgdG9nZ2xlLiBXaGVuIHRydWUsIHNpbmdsZS1jbGlja1xuICAgKiBzZWxlY3RzIG9uZSByb3cgKHJlcGxhY2luZyBwcmlvcik7IG1ldGEvY3RybC1jbGljayB0b2dnbGVzIGEgcm93IGluL291dFxuICAgKiBvZiB0aGUgc2VsZWN0aW9uLiBXaGVuIGZhbHNlLCBldmVyeSBjbGljayB0b2dnbGVzLiBEZWZhdWx0IHRydWUgdG9cbiAgICogbWF0Y2ggdGhlIG1vc3QgY29tbW9uIHNwcmVhZHNoZWV0LWxpa2UgVVguXG4gICAqL1xuICBwcm90ZWN0ZWQgbWV0YUtleSA9IHRydWU7XG5cbiAgcHJpdmF0ZSBfdXBkYXRpbmdGcm9tRWRpdG9yID0gZmFsc2U7XG4gIHByaXZhdGUgX3N1cHByZXNzU2VsZWN0aW9uU3luY1RvUGxvdCA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSB6b25lID0gaW5qZWN0KE5nWm9uZSk7XG5cbiAgLyoqIFJlLXJlbmRlciB0aGlzIE9uUHVzaCB2aWV3LCByZS1lbnRlcmluZyB0aGUgem9uZSB3aGVuIHRoZSBjaGFuZ2UgY2FtZSBmcm9tIG91dHNpZGUgaXQuICovXG4gIHByaXZhdGUgY2hhbmdlZCgpOiB2b2lkIHtcbiAgICBtYXJrRm9yQ2hlY2tJblpvbmUodGhpcy5jZHIsIHRoaXMuem9uZSk7XG4gIH1cblxuICAvKiogUGh5c2ljYWwgcGl4ZWwgc2l6ZSAowrVtL3BpeGVsKSBvZiB0aGUgYWN0aXZlIGltYWdlLCBmb3IgcmVnaW9uIGFyZWFzIGluXG4gICAqICDCtW3CsjsgZW1wdHkgd2hlbiB0aGUgZm9ybWF0IHJlcG9ydHMgbm8gcGh5c2ljYWwgc2l6ZS4gKi9cbiAgcHJvdGVjdGVkIG1wcDogUGl4ZWxTaXplID0ge307XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChSRUdJT05fRURJVE9SX0FQSSkgcHJpdmF0ZSByZWdpb25BcGk6IElSZWdpb25FZGl0b3JBcGksXG4gICAgcHJpdmF0ZSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25maXJtYXRpb25TZXJ2aWNlOiBDb25maXJtYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcGVyc2lzdGVuY2U6IFJlZ2lvblBlcnNpc3RlbmNlU2VydmljZSxcbiAgICBwcml2YXRlIG1hc2tFeHBvcnQ6IE1hc2tFeHBvcnRTZXJ2aWNlLFxuICApIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zaG93U2hhcGVMYWJlbCA9IHRoaXMucmVnaW9uQXBpLmdldFNob3dTaGFwZUxhYmVsKCk7XG4gICAgdGhpcy5zaGFwZUNvbG9yID0gdGhpcy5yZWdpb25BcGkuZ2V0U2hhcGVDb2xvcigpO1xuICAgIHRoaXMuZmlsbENvbG9yID0gdGhpcy5yZWdpb25BcGkuZ2V0RmlsbENvbG9yKCk7XG5cbiAgICAvLyBBbm5vdGF0aW9uLWNsYXNzIHByZXNldHMgKGppdC11aSM3MCk6IG1pcnJvciB0aGUgc2V0IGZvciB0aGUgY2hpcCBzdHJpcCxcbiAgICAvLyB0aGUgQ2xhc3MgZHJvcGRvd24gYW5kIHRoZSBtYW5hZ2UgZGlhbG9nLiBHdWFyZGVkIHdpdGggb3B0aW9uYWwgY2FsbHMgc29cbiAgICAvLyBwYXJ0aWFsIEFQSSBtb2NrcyBpbiB0ZXN0cyAod2hpY2ggb21pdCB0aGUgcHJlc2V0IG1ldGhvZHMpIGRvbid0IHRocm93LlxuICAgIGNvbnN0IGluaXRpYWxQcmVzZXRzID0gdGhpcy5yZWdpb25BcGkuZ2V0UHJlc2V0U2V0Py4oKTtcbiAgICBpZiAoaW5pdGlhbFByZXNldHMpIHRoaXMucHJlc2V0U2V0ID0gaW5pdGlhbFByZXNldHM7XG4gICAgY29uc3QgcHJlc2V0cyQgPSB0aGlzLnJlZ2lvbkFwaS5nZXRQcmVzZXRTZXQkPy4oKTtcbiAgICBpZiAocHJlc2V0cyQpIHtcbiAgICAgIHByZXNldHMkLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpLnN1YnNjcmliZSgoc2V0KSA9PiB7XG4gICAgICAgIGlmIChzZXQpIHRoaXMucHJlc2V0U2V0ID0gc2V0O1xuICAgICAgICB0aGlzLnRyZWVDb2xvciA9IChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4gY29sb3JGb3JMYWJlbChuYW1lLCB0aGlzLnByZXNldFNldCk7XG4gICAgICAgIHRoaXMudXBkYXRlRGlzcGxheUNsYXNzZXMoKTtcbiAgICAgICAgdGhpcy5yZWNvbG9yM2QoKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gU2VlZCBmcm9tIHRoZSB2aXN1YWxpemVyJ3MgY3VycmVudCByZWdpb25zIOKAlCBhbHJlYWR5IHNjb3BlZCB0byB0aGVcbiAgICAvLyBhY3RpdmUgaW1hZ2UgYnkgdGhlIHBlci1pbWFnZSBjYWNoZSwgYW5kIGhhbmRlZCBiYWNrIGFzIG5ldXRyYWwgUmVnaW9uXG4gICAgLy8gb2JqZWN0cyAobm8gYmFja2VuZCBzaGFwZSBmb3JtYXQgaW52b2x2ZWQpLlxuICAgIC8vIEFubm90YXRpb24gcmVnaW9ucyBvbmx5IOKAlCBpbnRlbnNpdHktcHJvZmlsZSBsaW5lcyBhcmUgb3duZWQgYnkgdGhlXG4gICAgLy8gaW50ZW5zaXR5IHRvb2wgYW5kIGV4Y2x1ZGVkIGJ5IHRoZSBjb250cmFjdCwgc28gdGhlIGVkaXRvciBuZXZlciBzZWVzIHRoZW0uXG4gICAgdGhpcy5yZWdpb25zID0gdGhpcy5hcHBseVJlZ2lvbkNvbG9ycyh0aGlzLnJlZ2lvbkFwaS5nZXRBbm5vdGF0aW9uUmVnaW9ucygpKTtcbiAgICB0aGlzLnN5bmNDbGFzc2VzRnJvbVJlZ2lvbnModGhpcy5yZWdpb25zKTtcbiAgICB0aGlzLnJlY29tcHV0ZUNsYXNzQ291bnRzKCk7XG5cbiAgICAvLyBUaGUgdXBkYXRlIGV2ZW50IGlzIGp1c3QgYSBjaGFuZ2Ugc2lnbmFsOyByZS1yZWFkIHRoZSByZWdpb25zIGZyb20gdGhlXG4gICAgLy8gdmlzdWFsaXplciByYXRoZXIgdGhhbiBwYXJzaW5nIHdoYXRldmVyIHBheWxvYWQgaXQgY2Fycmllcy5cbiAgICB0aGlzLnJlZ2lvbkFwaVxuICAgICAgLmdldFJlZ2lvblVwZGF0ZUV2ZW50KClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl91cGRhdGluZ0Zyb21FZGl0b3IpIHJldHVybjtcbiAgICAgICAgY29uc3QgdXBkYXRlZCA9IHRoaXMuYXBwbHlSZWdpb25Db2xvcnModGhpcy5yZWdpb25BcGkuZ2V0QW5ub3RhdGlvblJlZ2lvbnMoKSk7XG4gICAgICAgIC8vIHByZXNlcnZlIHNlbGVjdGlvbiBmb3IgcmVnaW9ucyB0aGF0IHN0aWxsIGV4aXN0IChieSBpZCwgc2luY2UgbmFtZVxuICAgICAgICAvLyBpcyBhIHVzZXItZWRpdGFibGUgZGlzcGxheSBsYWJlbCBhbmQgbWF5IGNvbGxpZGUpXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSWRzID0gbmV3IFNldCh0aGlzLnNlbGVjdGVkUmVnaW9ucy5tYXAoKHIpID0+IHIuaWQpKTtcbiAgICAgICAgdGhpcy5yZWdpb25zID0gdXBkYXRlZDtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJlZ2lvbnMgPSB1cGRhdGVkLmZpbHRlcigocikgPT4gc2VsZWN0ZWRJZHMuaGFzKHIuaWQpKTtcbiAgICAgICAgdGhpcy5jbGFtcFBhZ2luYXRvckZpcnN0KCk7XG4gICAgICAgIHRoaXMuc3luY0NsYXNzZXNGcm9tUmVnaW9ucyh1cGRhdGVkKTtcbiAgICAgICAgdGhpcy5yZWNvbXB1dGVDbGFzc0NvdW50cygpO1xuICAgICAgICBpZiAodGhpcy52b2x1bWVWaWV3KSB0aGlzLnJlc2V0Vm9sdW1lcygpO1xuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgICAgdm9pZCB0aGlzLnJlZnJlc2hTb3VyY2UoKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpb25BcGlcbiAgICAgIC5nZXRSZWdpb25Tb3VyY2VWaWV3JD8uKClcbiAgICAgID8ucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKHZpZXcpID0+IHtcbiAgICAgICAgaWYgKHZpZXc/LnNvdXJjZSAhPT0gdGhpcy5zb3VyY2VWaWV3Py5zb3VyY2UpIHRoaXMucGlja2VkQ2xhc3MgPSBudWxsO1xuICAgICAgICB0aGlzLnNvdXJjZVZpZXcgPSB2aWV3O1xuICAgICAgICB2b2lkIHRoaXMucmVmcmVzaFNvdXJjZSgpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lvbkFwaVxuICAgICAgLmdldFJlZ2lvblN0eWxlJD8uKClcbiAgICAgID8ucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKHN0eWxlKSA9PiB7XG4gICAgICAgIHRoaXMucmVnaW9uc0ZpbGxlZCA9IHN0eWxlLmZpbGxPcGFjaXR5ID4gMDtcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMucmVnaW9uQXBpXG4gICAgICAuZ2V0Vm9sdW1lVmlldyQ/LigpXG4gICAgICA/LnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCh2b2x1bWUpID0+IHtcbiAgICAgICAgY29uc3QgY291bnRpbmcgPSB0aGlzLnN0YWNrQ291bnRzO1xuICAgICAgICB0aGlzLnZvbHVtZVZpZXcgPSB2b2x1bWU7XG4gICAgICAgIHRoaXMucmVzZXRWb2x1bWVzKCk7XG4gICAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgICBpZiAodGhpcy5zdGFja0NvdW50cyAhPT0gY291bnRpbmcpIHZvaWQgdGhpcy5yZWZyZXNoU291cmNlKCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMucmVnaW9uQXBpXG4gICAgICAuZ2V0UmVnaW9uc1Rocm91Z2hWb2x1bWUkPy4oKVxuICAgICAgPy5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgodGhyb3VnaCkgPT4ge1xuICAgICAgICB0aGlzLnJlZ2lvbnNUaHJvdWdoVm9sdW1lID0gdGhyb3VnaDtcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMucmVnaW9uQXBpXG4gICAgICAuZ2V0U2xpY2VFZGl0b3IkPy4oKVxuICAgICAgPy5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgocGFuZSkgPT4ge1xuICAgICAgICBjb25zdCBjb3VudGluZyA9IHRoaXMuc3RhY2tDb3VudHM7XG4gICAgICAgIHRoaXMuc2xpY2VQYW5lID0gcGFuZTtcbiAgICAgICAgaWYgKHRoaXMuc3RhY2tDb3VudHMgIT09IGNvdW50aW5nKSB2b2lkIHRoaXMucmVmcmVzaFNvdXJjZSgpO1xuICAgICAgfSk7XG5cbiAgICAvLyBXaGF0IGlzIHNob3duIGluIDNEOiB0aGUgcm91dGVyIGNsZWFycyBpdCB3aGVuIGFub3RoZXIgaW1hZ2UgaXMgcGxvdHRlZC5cbiAgICB0aGlzLnJlZ2lvbkFwaVxuICAgICAgLmdldFJlZ2lvbkNsYXNzZXMzZCQ/LigpXG4gICAgICA/LnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChncm91cHMpID0+IHtcbiAgICAgICAgdGhpcy5zaG93bjNkID0gbmV3IE1hcChncm91cHMubWFwKChnKSA9PiBbZy5rZXksIFsuLi5nLmNsYXNzZXNdXSkpO1xuICAgICAgICB0aGlzLnNob3duM2ROYW1lcyA9IG5ldyBTZXQodGhpcy5zaG93bjNkLmtleXMoKSk7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWQzZCA9ICcnO1xuICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbkhpZ2hsaWdodCgpO1xuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpb25BcGlcbiAgICAgIC5nZXRIaWRkZW5DbGFzc2VzJD8uKClcbiAgICAgID8ucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKGhpZGRlbikgPT4ge1xuICAgICAgICB0aGlzLmhpZGRlbkNsYXNzZXMgPSBoaWRkZW47XG4gICAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgfSk7XG5cbiAgICAvLyBBIHN1cmZhY2UgY2xpY2tlZCBpbiB0aGUgdm9sdW1lIHZpZXcgKHdpdGggdGhlIHNlbGVjdGlvbiB0b29sKSBwaWNrcyBpdHMgY2xhc3MuXG4gICAgdGhpcy5yZWdpb25BcGlcbiAgICAgIC5nZXRSZWdpb25QaWNrZWQzZCQ/LigpXG4gICAgICA/LnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCh7IGtleSwgYWRkaXRpdmUgfSkgPT4gdGhpcy5vblBpY2tlZDNkKGtleSwgYWRkaXRpdmUpKTtcblxuICAgIHRoaXMucGVyc2lzdGVuY2VcbiAgICAgIC5maWxlRXhpc3RzKHRoaXMuc2F2ZUFzQ2hlY2skKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChleGlzdHMpID0+IHtcbiAgICAgICAgdGhpcy5zYXZlQXNGaWxlRXhpc3RzID0gZXhpc3RzO1xuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgLy8gUGh5c2ljYWwgcGl4ZWwgc2l6ZSBvZiB0aGUgYWN0aXZlIGltYWdlIChmb3IgcmVnaW9uIGFyZWFzIGluIMK1bcKyL21twrIpLlxuICAgIHRoaXMucmVnaW9uQXBpXG4gICAgICAuZ2V0SW1hZ2VNZXRhKClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgobWV0YSkgPT4ge1xuICAgICAgICB0aGlzLm1wcCA9IHBpY2tNcHAobWV0YSk7XG4gICAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lvbkFwaVxuICAgICAgLmdldFNlbGVjdGVkUmVnaW9ucyQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChzZWxlY3RlZCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fc3VwcHJlc3NTZWxlY3Rpb25TeW5jVG9QbG90KSByZXR1cm47XG4gICAgICAgIC8vIE1hcCB0aGUgY29udHJhY3QncyBzZWxlY3RlZCByZWdpb25zIHRvIHRoZSBlZGl0b3IncyBvd24gaW5zdGFuY2VzIGJ5IGlkLlxuICAgICAgICBjb25zdCBuZXh0ID0gc2VsZWN0ZWQubWFwKChzKSA9PiB0aGlzLnJlZ2lvbnMuZmluZCgocikgPT4gci5pZCA9PT0gcy5pZCkpLmZpbHRlcigocik6IHIgaXMgUmVnaW9uID0+ICEhcik7XG4gICAgICAgIGNvbnN0IHNhbWUgPVxuICAgICAgICAgIG5leHQubGVuZ3RoID09PSB0aGlzLnNlbGVjdGVkUmVnaW9ucy5sZW5ndGggJiZcbiAgICAgICAgICBuZXh0LmV2ZXJ5KChyLCBpKSA9PiByLmlkID09PSB0aGlzLnNlbGVjdGVkUmVnaW9uc1tpXT8uaWQpO1xuICAgICAgICBpZiAoIXNhbWUpIHRoaXMuc2VsZWN0ZWRSZWdpb25zID0gbmV4dDtcbiAgICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb25IaWdobGlnaHQoKTtcbiAgICAgICAgLy8gU2Nyb2xsIHRoZSBwYWdpbmF0b3Igc28gdGhlIG1vc3QtcmVjZW50bHktc2VsZWN0ZWQgcm93IGlzIHZpc2libGUuXG4gICAgICAgIGlmIChuZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBsYXN0SWR4ID0gdGhpcy5yZWdpb25zLmZpbmRJbmRleCgocikgPT4gci5pZCA9PT0gbmV4dFtuZXh0Lmxlbmd0aCAtIDFdLmlkKTtcbiAgICAgICAgICBpZiAobGFzdElkeCA+PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBwYWdlU3RhcnQgPSBNYXRoLmZsb29yKGxhc3RJZHggLyB0aGlzLnBhZ2luYXRvclJvd3MpICogdGhpcy5wYWdpbmF0b3JSb3dzO1xuICAgICAgICAgICAgaWYgKHBhZ2VTdGFydCAhPT0gdGhpcy5wYWdpbmF0b3JGaXJzdCkgdGhpcy5wYWdpbmF0b3JGaXJzdCA9IHBhZ2VTdGFydDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKiBDYW5jZWxzIGEgcnVubmluZyBHZW9KU09OIHNhdmUgKGFib3J0cyBpdHMgdXBsb2FkKSBhbmQgbWFzayBleHBvcnQgKHRlcm1pbmF0ZXNcbiAgICogIGl0cyB3b3JrZXIpOyB0aGUgQVBJIHN1YnNjcmlwdGlvbnMgZW5kIHRocm91Z2ggYHRha2VVbnRpbERlc3Ryb3llZGAuICovXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX3NhdmVBc1N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm1hc2tKb2I/LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvKipcbiAgICogVGFibGUg4oaSIFBsb3Q6IFByaW1lTkcgZmlyZXMgb25Sb3dTZWxlY3Qvb25Sb3dVbnNlbGVjdCBhZnRlciB1cGRhdGluZ1xuICAgKiBgc2VsZWN0ZWRSZWdpb25zYC4gUHVzaCB0aGUgc2VsZWN0ZWQgcmVnaW9ucyB0byB0aGUgY29udHJhY3QgYnkgaWRlbnRpdHkg4oCUXG4gICAqIHRoZSBwYWNrYWdlIG1hcHMgdGhlbSB0byBpdHMgaW50ZXJuYWwgaW5kZXggc3BhY2UgKHdoaWNoIGluY2x1ZGVzIHRoZVxuICAgKiBpbnRlbnNpdHktcHJvZmlsZSBsaW5lcyB0aGUgZWRpdG9yIG5ldmVyIHNlZXMpLlxuICAgKi9cbiAgcHJvdGVjdGVkIG9uU2VsZWN0aW9uQ2hhbmdlZCgpIHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRSZWdpb25zID8/IFtdO1xuICAgIC8vIFJvd3MgcGlja2VkIGluIHRoZSB0YWJsZSByZXBsYWNlIHRoZSBjbGFzcyB0cmVlJ3MgcGljay5cbiAgICB0aGlzLnBpY2tlZENsYXNzZXMgPSBbXTtcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbkhpZ2hsaWdodCgpO1xuICAgIGNvbnN0IGZyb21Tb3VyY2UgPSBzZWxlY3RlZC5maWx0ZXIoKHIpID0+IHRoaXMuc3RhbmRJbnMuaGFzKHIpKTtcbiAgICB0aGlzLl9zdXBwcmVzc1NlbGVjdGlvblN5bmNUb1Bsb3QgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnJlZ2lvbkFwaS5zZXRTZWxlY3RlZFJlZ2lvbnMoc2VsZWN0ZWQuZmlsdGVyKChyKSA9PiAhdGhpcy5zdGFuZElucy5oYXMocikpKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fc3VwcHJlc3NTZWxlY3Rpb25TeW5jVG9QbG90ID0gZmFsc2U7XG4gICAgfVxuICAgIC8vIEEgc2VsZWN0ZWQgc291cmNlIHJvdyBpcyB0YWtlbiBpbnRvIHRoZSByZWdpb25zIChhbmQgc28gc2VsZWN0ZWQgb24gdGhlIGltYWdlIHRvbykuXG4gICAgaWYgKGZyb21Tb3VyY2UubGVuZ3RoKSB2b2lkIHRoaXMucmVnaW9uQXBpLnNlbGVjdFNvdXJjZUZlYXR1cmVzPy4odGhpcy5zb3VyY2VJZHMoZnJvbVNvdXJjZSksIHRydWUpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRoZSByZWdpb24gc291cmNlJ3MgZmVhdHVyZXMgYXMgdGFibGUgcm93cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogV2hldGhlciB0aGUgc2xpY2UgaGFzIGEgcmVnaW9uIHNvdXJjZTogaXQgdGhlbiBoYXMgcmVnaW9ucyB0byBzYXZlIGV2ZW4gd2l0aCBhbiBlbXB0eSB0YWJsZS4gKi9cbiAgcHJvdGVjdGVkIGdldCBoYXNSZWdpb25Tb3VyY2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5zb3VyY2VWaWV3O1xuICB9XG5cbiAgLyoqIFJvd3MgaW4gdGhlIHRhYmxlOiB0aGUgcmVnaW9ucywgdGhlbiB0aGUgZmVhdHVyZXMgc3RpbGwgaW4gdGhlIHJlZ2lvbiBzb3VyY2UuICovXG4gIHByb3RlY3RlZCBnZXQgdGFibGVUb3RhbCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvbnMubGVuZ3RoICsgdGhpcy5zb3VyY2VUb3RhbDtcbiAgfVxuXG4gIC8qKiBUaGUgY2xhc3MgaGllcmFyY2h5IG9mIHRoZSBzbGljZSdzIHJlZ2lvbiBzb3VyY2UsIHdoZW4gaXQgaGFzIG9uZSAodGhlIGNsYXNzZXMgYXMgYSB0cmVlKS4gKi9cbiAgcHJvdGVjdGVkIGdldCBjbGFzc0hpZXJhcmNoeSgpOiBSZWdpb25DbGFzc05vZGVbXSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnNvdXJjZVZpZXc/LnNvdXJjZS5pbmZvLmhpZXJhcmNoeSA/PyBudWxsO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYHJvd2AgaXMgYSByZWdpb24tc291cmNlIGZlYXR1cmUncyBzdGFuZC1pbiByYXRoZXIgdGhhbiBhIHJlZ2lvbi4gKi9cbiAgcHJvdGVjdGVkIGlzU291cmNlUm93KHJvdzogUmVnaW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhbmRJbnMuaGFzKHJvdyk7XG4gIH1cblxuICBwcml2YXRlIHNvdXJjZUlkcyhyb3dzOiBSZWdpb25bXSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gcm93cy5tYXAoKHIpID0+IHIuc291cmNlSWQpLmZpbHRlcigoaWQpOiBpZCBpcyBzdHJpbmcgPT4gISFpZCk7XG4gIH1cblxuICAvKiogQSB0YWJsZSByb3cgZm9yIGEgc291cmNlIGZlYXR1cmU6IG5vIGdlb21ldHJ5IHVudGlsIGl0IGlzIHRha2VuLiAqL1xuICBwcml2YXRlIHN0YW5kSW4ocm93OiBSZWdpb25JbmRleFJvdyk6IFJlZ2lvbiB7XG4gICAgY29uc3QgciA9IE9iamVjdC5hc3NpZ24obmV3IFJlZ2lvbigpLCB7XG4gICAgICBpZDogLSsrdGhpcy5zdGFuZEluU2VxLFxuICAgICAgbmFtZTogcm93LmxhYmVsID8/IHJvdy5pZCxcbiAgICAgIGxhYmVsOiByb3cubGFiZWwgPz8gdW5kZWZpbmVkLFxuICAgICAgY29sb3I6IHRoaXMuc291cmNlVmlldz8uY29sb3JPZihyb3cpID8/IHJvdy5jb2xvciA/PyB0aGlzLnNoYXBlQ29sb3IsXG4gICAgICBzb3VyY2VJZDogcm93LmlkLFxuICAgICAgc291cmNlQXJlYTogcm93LmFyZWEsXG4gICAgICBib3VuZHM6IG51bGwsXG4gICAgfSk7XG4gICAgdGhpcy5zdGFuZElucy5hZGQocik7XG4gICAgcmV0dXJuIHI7XG4gIH1cblxuICAvKipcbiAgICogUmUtcmVhZCB0aGUgc291cmNlIHBhcnQgb2YgdGhlIHRhYmxlICh0aGUgc3RhbmQtaW5zIG9uIHRoZSBjdXJyZW50IHBhZ2UsIHRoZSBjb3VudCkgYW5kIHRoZVxuICAgKiBzb3VyY2UncyBjbGFzcyBjb3VudHMuIFRoZSBwYWdlIGhvbGRzIHJlZ2lvbnMgZmlyc3QsIHNvIGl0cyBzb3VyY2Ugcm93cyBzdGFydCBhdFxuICAgKiBgbWF4KGZpcnN0LCByZWdpb25zKWAg4oiSIHJlZ2lvbnMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hTb3VyY2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmlzQWN0aXZlKSByZXR1cm47XG4gICAgY29uc3QgcmVxdWVzdCA9ICsrdGhpcy5zb3VyY2VSZXF1ZXN0O1xuICAgIGNvbnN0IHZpZXcgPSB0aGlzLnNvdXJjZVZpZXc7XG4gICAgbGV0IHJvd3M6IFJlZ2lvbkluZGV4Um93W10gPSBbXTtcbiAgICBsZXQgdG90YWwgPSAwO1xuICAgIGxldCBjb3VudHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBpZiAodmlldyAmJiB0aGlzLnJlZ2lvbkFwaS5nZXRSZWdpb25Tb3VyY2VJbmRleCkge1xuICAgICAgY29uc3Qgb3duID0gdGhpcy5yZWdpb25zLmxlbmd0aDtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgodGhpcy5wYWdpbmF0b3JGaXJzdCwgb3duKTtcbiAgICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5tYXgoMCwgdGhpcy5wYWdpbmF0b3JGaXJzdCArIHRoaXMucGFnaW5hdG9yUm93cyAtIHN0YXJ0KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IFtwYWdlLCBwZXJDbGFzc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgdGhpcy5yZWdpb25BcGkuZ2V0UmVnaW9uU291cmNlSW5kZXgoeyBvZmZzZXQ6IHN0YXJ0IC0gb3duLCBsaW1pdCB9KSxcbiAgICAgICAgICB0aGlzLnJlZ2lvbkFwaS5nZXRSZWdpb25Tb3VyY2VDbGFzc0NvdW50cz8uKHRoaXMuc3RhY2tDb3VudHMpLFxuICAgICAgICBdKTtcbiAgICAgICAgcm93cyA9IHBhZ2U/LnJvd3MgPz8gW107XG4gICAgICAgIHRvdGFsID0gcGFnZT8udG90YWwgPz8gMDtcbiAgICAgICAgY291bnRzID0gcGVyQ2xhc3MgPz8ge307XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbcmVnaW9uc10gY291bGQgbm90IGxpc3QgdGhlIHJlZ2lvbiBzb3VyY2UnLCBlcnIpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVxdWVzdCAhPT0gdGhpcy5zb3VyY2VSZXF1ZXN0KSByZXR1cm47XG4gICAgdGhpcy5zb3VyY2VUb3RhbCA9IHRvdGFsO1xuICAgIHRoaXMuc291cmNlUm93cyA9IHJvd3MubWFwKChyKSA9PiB0aGlzLnN0YW5kSW4ocikpO1xuICAgIHRoaXMuc291cmNlQ2xhc3NDb3VudHMgPSBjb3VudHM7XG4gICAgdGhpcy5yZWNvbXB1dGVDbGFzc0NvdW50cygpO1xuICAgIHRoaXMuY2hhbmdlZCgpO1xuICB9XG5cbiAgLyoqIFRha2UgYSBzb3VyY2Ugcm93J3MgZmVhdHVyZSBpbnRvIHRoZSByZWdpb25zLCB0aGVuIHJ1biBgdGhlbmAgb24gdGhlIHJlZ2lvbiBpdCBiZWNhbWUuICovXG4gIHByaXZhdGUgYXN5bmMgdGFrZVRoZW4ocm93OiBSZWdpb24sIHRoZW46IChyZWdpb246IFJlZ2lvbikgPT4gdm9pZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IFtpZF0gPSAoYXdhaXQgdGhpcy5yZWdpb25BcGkuc2VsZWN0U291cmNlRmVhdHVyZXM/Lih0aGlzLnNvdXJjZUlkcyhbcm93XSkpKSA/PyBbXTtcbiAgICBjb25zdCByZWdpb24gPSB0aGlzLnJlZ2lvbnMuZmluZCgocikgPT4gci5pZCA9PT0gaWQpO1xuICAgIGlmIChyZWdpb24pIHRoZW4ocmVnaW9uKTtcbiAgfVxuXG4gIC8qKiBUb2dnbGUgdGhlIGZpbGxlZCAoYXRsYXMpIGxvb2s6IGVhY2ggcmVnaW9uIGZpbGxlZCBpbiBpdHMgY29sb3VyLCBsYWJlbHMgaW5zaWRlLiAqL1xuICAvKiogSW4gYSB2b2x1bWUgdmlldzogdGhlIHJlZ2lvbnMgZHJhd24gdGhyb3VnaCB0aGUgdm9sdW1lLCBvciBoaWRkZW4gYmVoaW5kIHdoYXQgaXQgc2hvd3MuICovXG4gIHByb3RlY3RlZCB0b2dnbGVUaHJvdWdoVm9sdW1lKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQXBpLnNldFJlZ2lvbnNUaHJvdWdoVm9sdW1lPy4oIXRoaXMucmVnaW9uc1Rocm91Z2hWb2x1bWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRvZ2dsZUZpbGwoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25BcGkuc2V0UmVnaW9uU3R5bGU/Lih7IGZpbGxPcGFjaXR5OiB0aGlzLnJlZ2lvbnNGaWxsZWQgPyAwIDogUkVHSU9OX0ZJTExfT1BBQ0lUWSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IG9yIGhpZGUgYSBjbGFzcyBpbiB0aGUgdm9sdW1lIHZpZXcgYXMgYSAzRCByZWNvbnN0cnVjdGlvbiDigJQgYSB0cmVlIG5vZGUgd2l0aCBldmVyeSBjbGFzc1xuICAgKiB1bmRlciBpdCwgYXMgb25lIHN1cmZhY2UgaW4gaXRzIGNvbG91ci5cbiAgICovXG4gIHByb3RlY3RlZCB0b2dnbGVDbGFzczNkKG5hbWU6IHN0cmluZywgY2xhc3Nlczogc3RyaW5nW10gPSBbbmFtZV0pOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gbmV3IE1hcCh0aGlzLnNob3duM2QpO1xuICAgIGlmIChuZXh0LmhhcyhuYW1lKSkgbmV4dC5kZWxldGUobmFtZSk7XG4gICAgZWxzZSBuZXh0LnNldChuYW1lLCBjbGFzc2VzKTtcbiAgICB0aGlzLnNob3duM2QgPSBuZXh0O1xuICAgIHRoaXMuc2hvd24zZE5hbWVzID0gbmV3IFNldChuZXh0LmtleXMoKSk7XG4gICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgdGhpcy5zaG93M2QodGhpcy5ncm91cHMzZCgpKTtcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbkhpZ2hsaWdodCgpO1xuICB9XG5cbiAgLyoqIEhpZGUgKG9yIHNob3cgYWdhaW4pIHRoZXNlIGNsYXNzZXMnIHJlZ2lvbnMsIHdoZXJldmVyIHRoZXkgYXJlIGRyYXduLiAqL1xuICBwcm90ZWN0ZWQgc2V0Q2xhc3Nlc0hpZGRlbihjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSwgaGlkZGVuOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25BcGkuc2V0Q2xhc3Nlc0hpZGRlbj8uKGNsYXNzZXMsIGhpZGRlbik7XG4gIH1cblxuICAvKiogVGhlIHN1cmZhY2VzIHNob3duIGluIDNELCBpbiB0aGVpciBjbGFzc2VzJyBjb2xvdXJzIG5vdy4gKi9cbiAgcHJpdmF0ZSBncm91cHMzZCgpOiBBcnJheTx7IGtleTogc3RyaW5nOyBjbGFzc2VzOiBzdHJpbmdbXTsgY29sb3I6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgdGl0bGVzID0gbmV3IE1hcCgodGhpcy5jbGFzc0hpZXJhcmNoeSA/PyBbXSkubWFwKChuKSA9PiBbbi5uYW1lLCBuLnRpdGxlXSkpO1xuICAgIHJldHVybiBbLi4udGhpcy5zaG93bjNkXS5tYXAoKFtrZXksIGNsYXNzZXNdKSA9PiB7XG4gICAgICBjb25zdCB0aXRsZSA9IHRpdGxlcy5nZXQoa2V5KTtcbiAgICAgIHJldHVybiB7IGtleSwgY2xhc3NlcywgY29sb3I6IHRoaXMudHJlZUNvbG9yKGtleSksIGxhYmVsOiB0aXRsZSA/IGAke2tleX0gwrcgJHt0aXRsZX1gIDoga2V5IH07XG4gICAgfSk7XG4gIH1cblxuICAvKiogVGhlIGNsYXNzZXMgc2VsZWN0ZWQgbm93OiB0aGUgY2xhc3MgdHJlZSdzIHBpY2sgKHdpdGggaXRzIHN1YnRyZWUpIGFuZCB0aGUgc2VsZWN0ZWQgcm93cycuICovXG4gIHByaXZhdGUgc2VsZWN0ZWRDbGFzc05hbWVzKCk6IFNldDxzdHJpbmc+IHtcbiAgICBjb25zdCBuYW1lcyA9IG5ldyBTZXQodGhpcy5waWNrZWRDbGFzc2VzKTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5zZWxlY3RlZFJlZ2lvbnMgPz8gW10pIGlmIChyLmxhYmVsKSBuYW1lcy5hZGQoci5sYWJlbCk7XG4gICAgcmV0dXJuIG5hbWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZ2hsaWdodCwgaW4gdGhlIHZvbHVtZSB2aWV3LCB0aGUgc3VyZmFjZXMgaG9sZGluZyBhIHNlbGVjdGVkIGNsYXNzIChmb2N1cyArIGNvbnRleHQ6IHRoZXlcbiAgICogdHVybiBuZWFyIG9wYXF1ZSwgdGhlIG90aGVycyBmYWRlKSwgYW5kIG1hcmsgdGhlIHNlbGVjdGVkIHJvd3MnIGNsYXNzZXMgaW4gdGhlIGNsYXNzIGxpc3RzLlxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVTZWxlY3Rpb25IaWdobGlnaHQoKTogdm9pZCB7XG4gICAgY29uc3QgbmFtZXMgPSB0aGlzLnNlbGVjdGVkQ2xhc3NOYW1lcygpO1xuICAgIGNvbnN0IG1hcmtlZCA9IG5ldyBTZXQoKHRoaXMuc2VsZWN0ZWRSZWdpb25zID8/IFtdKS5tYXAoKHIpID0+IHIubGFiZWwpLmZpbHRlcigobCk6IGwgaXMgc3RyaW5nID0+ICEhbCkpO1xuICAgIGlmIChbLi4ubWFya2VkXS5qb2luKCdcXG4nKSAhPT0gWy4uLnRoaXMubWFya2VkQ2xhc3Nlc10uam9pbignXFxuJykpIHRoaXMubWFya2VkQ2xhc3NlcyA9IG1hcmtlZDtcbiAgICBjb25zdCBrZXlzID0gWy4uLnRoaXMuc2hvd24zZF0uZmlsdGVyKChbLCBjbGFzc2VzXSkgPT4gY2xhc3Nlcy5zb21lKChjKSA9PiBuYW1lcy5oYXMoYykpKS5tYXAoKFtrXSkgPT4gayk7XG4gICAgY29uc3QgaWQgPSBrZXlzLmpvaW4oJ1xcbicpO1xuICAgIGlmIChpZCA9PT0gdGhpcy5oaWdobGlnaHRlZDNkKSByZXR1cm47XG4gICAgdGhpcy5oaWdobGlnaHRlZDNkID0gaWQ7XG4gICAgdGhpcy5yZWdpb25BcGkuaGlnaGxpZ2h0UmVnaW9uQ2xhc3NlczNkPy4oa2V5cyk7XG4gIH1cblxuICAvKiogQSBzdXJmYWNlIGNsaWNrZWQgaW4gdGhlIHZvbHVtZSB2aWV3OiBwaWNrIGl0cyBjbGFzcyBhcyB0aGUgdHJlZSB3b3VsZDsgYmVzaWRlIHRoZW0sIGNsZWFyLiAqL1xuICBwcml2YXRlIG9uUGlja2VkM2Qoa2V5OiBzdHJpbmcgfCBudWxsLCBhZGRpdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChrZXkgPT09IG51bGwpIHtcbiAgICAgIGlmIChhZGRpdGl2ZSkgcmV0dXJuO1xuICAgICAgdGhpcy5waWNrZWRDbGFzcyA9IG51bGw7XG4gICAgICB0aGlzLnBpY2tlZENsYXNzZXMgPSBbXTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSZWdpb25zID0gW107XG4gICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlZCgpO1xuICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZvaWQgdGhpcy5waWNrQ2xhc3Nlcyh7IG5hbWU6IGtleSwgY2xhc3NlczogdGhpcy5zaG93bjNkLmdldChrZXkpID8/IFtrZXldLCBhZGRpdGl2ZSB9KTtcbiAgfVxuXG4gIC8qKiBBIGNsYXNzIGNvbG91ciBjaGFuZ2VkIChpdHMgc3dhdGNoLCBvciBNYW5hZ2UpOiByZXBhaW50IHRoZSBzdXJmYWNlcyBzaG93biBpbiAzRCB3aG9zZSBjb2xvdXIgaXQgY2hhbmdlZC4gKi9cbiAgcHJpdmF0ZSByZWNvbG9yM2QoKTogdm9pZCB7XG4gICAgY29uc3QgZ3JvdXBzID0gdGhpcy5ncm91cHMzZCgpO1xuICAgIGlmICghZ3JvdXBzLnNvbWUoKGcpID0+IGcuY29sb3IgIT09IHRoaXMuY29sb3JzM2QuZ2V0KGcua2V5KSkpIHJldHVybjtcbiAgICB0aGlzLnNob3czZChncm91cHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93M2QoZ3JvdXBzOiBBcnJheTx7IGtleTogc3RyaW5nOyBjbGFzc2VzOiBzdHJpbmdbXTsgY29sb3I6IHN0cmluZyB9Pik6IHZvaWQge1xuICAgIHRoaXMuY29sb3JzM2QgPSBuZXcgTWFwKGdyb3Vwcy5tYXAoKGcpID0+IFtnLmtleSwgZy5jb2xvcl0pKTtcbiAgICB0aGlzLnJlZ2lvbkFwaS5zaG93UmVnaW9uQ2xhc3NlczNkPy4oZ3JvdXBzKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICB0aGlzLnRvYXN0KCdlcnJvcicsICdDb3VsZCBub3Qgc2hvdyB0aGUgcmVnaW9uIGluIDNEJywgYCR7KGVyciBhcyBFcnJvcik/Lm1lc3NhZ2UgPz8gZXJyfWApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFBpY2sgYSBjbGFzcyBpbiB0aGUgY2xhc3MgdHJlZTogc2VsZWN0IGl0cyByZWdpb25zIGFuZCBpdHMgc3ViY2xhc3NlcycsIHRoZSBzb3VyY2UncyB0YWtlbi4gKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHBpY2tDbGFzc2VzKHBpY2s6IENsYXNzVHJlZVBpY2spOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnBpY2tlZENsYXNzID0gcGljay5uYW1lO1xuICAgIHRoaXMucGlja2VkQ2xhc3NlcyA9IHBpY2suYWRkaXRpdmUgPyBbLi4ubmV3IFNldChbLi4udGhpcy5waWNrZWRDbGFzc2VzLCAuLi5waWNrLmNsYXNzZXNdKV0gOiBwaWNrLmNsYXNzZXM7XG4gICAgdGhpcy51cGRhdGVTZWxlY3Rpb25IaWdobGlnaHQoKTtcbiAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICBhd2FpdCB0aGlzLnJlZ2lvbkFwaS5zZWxlY3RSZWdpb25DbGFzc2VzPy4ocGljay5jbGFzc2VzLCBwaWNrLmFkZGl0aXZlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb3dzIGZvciByZWdpb25zIGNvbWluZyBmcm9tIHRoZSB2aXN1YWxpemVyOiBuZXV0cmFsIGBSZWdpb25gcyB3aXRoIGJvdW5kcyxcbiAgICogY29sb3VyIGFuZCBsYWJlbCBhbHJlYWR5IHBvcHVsYXRlZC4gQSByZWdpb24gd2l0aG91dCBhIGNvbG91ciBpcyBzaG93biB3aXRoXG4gICAqIGl0cyBjbGFzc2lmaWNhdGlvbiBjb2xvdXIgKG9yIHRoZSBkZWZhdWx0IHNoYXBlIGNvbG91cikg4oCUIGFzIGEgY29weTogdGhlXG4gICAqIHN0b3JlJ3MgaW5zdGFuY2VzIGFyZSBzaGFyZWQgd2l0aCBpdHMgdW5kbyBoaXN0b3J5IGFuZCBtdXN0IG5vdCBiZSBjaGFuZ2VkXG4gICAqIGluIHBsYWNlIChSVC0xKS5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlSZWdpb25Db2xvcnMocmVnaW9uczogUmVnaW9uW10pOiBSZWdpb25bXSB7XG4gICAgY29uc3QgY2xhc3NDb2xvcnMgPSB0aGlzLnJlZ2lvbkFwaS5nZXRDbGFzc2lmaWNhdGlvbkNvbG9ycygpO1xuICAgIHJldHVybiByZWdpb25zLm1hcCgocmVnaW9uKSA9PlxuICAgICAgcmVnaW9uLmNvbG9yXG4gICAgICAgID8gcmVnaW9uXG4gICAgICAgIDogd2l0aFJlZ2lvblBhdGNoKHJlZ2lvbiwgeyBjb2xvcjogY2xhc3NDb2xvcnMuZ2V0KHJlZ2lvbi5sYWJlbCA/PyAnJykgfHwgdGhpcy5zaGFwZUNvbG9yIH0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGVkaXRvcidzIG9uZSB3cml0ZSBwYXRoIChSVC0xKTogbWFrZSBgbmV4dGAgdGhlIHRhYmxlJ3Mgcm93cyBhbmQgY29tbWl0XG4gICAqIHRoZW0gdG8gdGhlIHN0b3JlIOKAlCBsaXZlLCBhcyBvbmUgdW5kb2FibGUgc3RlcCAoaXNSZWdpb25TYXZlT249dHJ1ZTsgdGhlXG4gICAqIHJvdXRlciBrZWVwcyB0aGUgaW50ZW5zaXR5LXByb2ZpbGUgbGluZXMpLiBSb3dzIGFyZSB0aGUgc3RvcmUncyBpbnN0YW5jZXMsXG4gICAqIHNvIGFuIGVkaXQgcGFzc2VzIGNvcGllcyAoe0BsaW5rIHBhdGNoUmVnaW9uc30pLCBuZXZlciBjaGFuZ2VkIHJvd3MuIFRoZVxuICAgKiByZXN1bHRpbmcgcmVnaW9uLXVwZGF0ZSBldmVudCBpcyBpZ25vcmVkIChgX3VwZGF0aW5nRnJvbUVkaXRvcmApLCBzbyB0aGVcbiAgICogY2xhc3MgbGlzdCBhbmQgY291bnRzIGFyZSByZWZyZXNoZWQgaGVyZSAoYSB0eXBlZCBjbGFzcyBpcyBhZGRlZDsgaml0LXVpIzcwKS5cbiAgICovXG4gIHByaXZhdGUgY29tbWl0KG5leHQ6IFJlZ2lvbltdID0gdGhpcy5yZWdpb25zKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25zID0gbmV4dDtcbiAgICB0aGlzLl91cGRhdGluZ0Zyb21FZGl0b3IgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnJlZ2lvbkFwaS5zZXRBbm5vdGF0aW9uUmVnaW9ucyhuZXh0LCB0aGlzLnNob3dTaGFwZUxhYmVsLCB0cnVlLCB0aGlzLmZpbGxDb2xvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX3VwZGF0aW5nRnJvbUVkaXRvciA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnN5bmNDbGFzc2VzRnJvbVJlZ2lvbnMobmV4dCk7XG4gICAgdGhpcy5yZWNvbXB1dGVDbGFzc0NvdW50cygpO1xuICAgIHRoaXMuY2hhbmdlZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHktb24td3JpdGUgZWRpdCAocmV2aWV3IFJULTEpLiBUaGUgZWRpdG9yJ3Mgcm93cyBhcmUgdGhlIHJlZ2lvbiBzdG9yZSdzXG4gICAqIGxpdmUgaW5zdGFuY2VzLCBhbmQgdGhlIHN0b3JlIHRha2VzIGl0cyB1bmRvIHNuYXBzaG90IG9ubHkgd2hlbiB0aGUgZWRpdCBpc1xuICAgKiBjb21taXR0ZWQg4oCUIHNvIGFuIGVkaXQgbXVzdCByZXBsYWNlIGEgcmVnaW9uIHdpdGggYSBwYXRjaGVkIGNvcHkgKGFuZCBhbnlcbiAgICogYm91bmRzIGl0IGNoYW5nZXMgd2l0aCBuZXcgYm91bmRzKSwgbmV2ZXIgbXV0YXRlIHRoZSBpbnN0YW5jZSB0aGUgc3RvcmVcbiAgICogaG9sZHMuIFJldHVybnMgdGhlIGNvcGllcyBieSBvcmlnaW5hbDsgdGhlIHNlbGVjdGlvbiBhbmQgYW4gb3BlbiBsYWJlbCBlZGl0XG4gICAqIGZvbGxvdyB0aGVtLlxuICAgKi9cbiAgcHJpdmF0ZSBwYXRjaFJlZ2lvbnMocGF0Y2hGb3I6IChyOiBSZWdpb24pID0+IFBhcnRpYWw8UmVnaW9uPiB8IG51bGwpOiBNYXA8UmVnaW9uLCBSZWdpb24+IHtcbiAgICBjb25zdCBjb3BpZXMgPSBuZXcgTWFwPFJlZ2lvbiwgUmVnaW9uPigpO1xuICAgIHRoaXMucmVnaW9ucyA9IHRoaXMucmVnaW9ucy5tYXAoKHIpID0+IHtcbiAgICAgIGNvbnN0IHBhdGNoID0gcGF0Y2hGb3Iocik7XG4gICAgICBpZiAoIXBhdGNoKSByZXR1cm4gcjtcbiAgICAgIGNvbnN0IGNvcHkgPSB3aXRoUmVnaW9uUGF0Y2gociwgcGF0Y2gpO1xuICAgICAgY29waWVzLnNldChyLCBjb3B5KTtcbiAgICAgIHJldHVybiBjb3B5O1xuICAgIH0pO1xuICAgIGlmIChjb3BpZXMuc2l6ZSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFJlZ2lvbnMgPSAodGhpcy5zZWxlY3RlZFJlZ2lvbnMgPz8gW10pLm1hcCgocikgPT4gY29waWVzLmdldChyKSA/PyByKTtcbiAgICAgIGlmIChbLi4uY29waWVzLmtleXMoKV0uc29tZSgocikgPT4gdGhpcy5lZGl0aW5nTGFiZWxSZWdpb25zLmhhcyhyKSkpIHtcbiAgICAgICAgdGhpcy5lZGl0aW5nTGFiZWxSZWdpb25zID0gbmV3IE1hcChbLi4udGhpcy5lZGl0aW5nTGFiZWxSZWdpb25zXS5tYXAoKFtyLCBkXSkgPT4gW2NvcGllcy5nZXQocikgPz8gciwgZF0pKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvcGllcztcbiAgfVxuXG4gIC8qKiBTZXQgb25lIHJlZ2lvbidzIG91dGxpbmUgY29sb3VyIChhbiBleHBsaWNpdCBvdmVycmlkZSkgYW5kIGNvbW1pdCBsaXZlLiAqL1xuICBwcm90ZWN0ZWQgY2hhbmdlUmVnaW9uQ29sb3IocmVnaW9uOiBSZWdpb24sIGNvbG9yOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIWNvbG9yIHx8IHJlZ2lvbi5jb2xvciA9PT0gY29sb3IpIHJldHVybjtcbiAgICAvLyBjb2xvck92ZXJyaWRkZW46IGV4cGxpY2l0IHBlci1yZWdpb24gY29sb3VyIOKAlCBwcmVzZXJ2ZSBpdCBhZ2FpbnN0IHByZXNldCAocmUpYXBwbHkgKGppdC11aSM3MClcbiAgICB0aGlzLnBhdGNoUmVnaW9ucygocikgPT4gKHIgPT09IHJlZ2lvbiA/IHsgY29sb3IsIGNvbG9yT3ZlcnJpZGRlbjogdHJ1ZSB9IDogbnVsbCkpO1xuICAgIHRoaXMuY29tbWl0KCk7XG4gIH1cblxuICAvKipcbiAgICogQWZ0ZXIgYSBsYWJlbCBlZGl0IG9uIGByZWdpb25gOiBnaXZlIGV2ZXJ5IGxhYmVsbGVkIHJvdyB3aXRob3V0IGEgY29sb3VyIGl0c1xuICAgKiBjbGFzcyBjb2xvdXIgKHByZXNldCBvciBmYWxsYmFjaywgYXMgdGhlIHN0b3JlIHdpbGwpLCBhbmQgY29tbWl0IHdoZW5cbiAgICogYGNvbW1pdGAgaXMgc2V0LlxuICAgKi9cbiAgcHJvdGVjdGVkIGxhYmVsUmVnaW9uVXBkYXRlKHJlZ2lvbjogUmVnaW9uLCBjb21taXQgPSBmYWxzZSkge1xuICAgIHRoaXMuZmlsbENsYXNzQ29sb3JzKCk7XG4gICAgaWYgKGNvbW1pdCkgdGhpcy5jb21taXQoKTtcbiAgfVxuXG4gIC8qKiBMYWJlbGxlZCByb3dzIHdpdGhvdXQgYSBjb2xvdXIgZ2V0IHRoZWlyIGNsYXNzIGNvbG91ciAoY29waWVzKS4gKi9cbiAgcHJpdmF0ZSBmaWxsQ2xhc3NDb2xvcnMoKTogdm9pZCB7XG4gICAgdGhpcy5wYXRjaFJlZ2lvbnMoKHIpID0+ICghci5jb2xvciAmJiByLmxhYmVsID8geyBjb2xvcjogdGhpcy5jb2xvckZvck5hbWUoci5sYWJlbCkgfSA6IG51bGwpKTtcbiAgfVxuXG4gIC8qKiBUaGUgY3VycmVudCBwYWdlIG9mIHRoZSB0YWJsZS4gTWVtb2l6ZWQgb24gKHJlZ2lvbnMsIGZpcnN0LCByb3dzKSwgc29cbiAgICogIGNoYW5nZSBkZXRlY3Rpb24gZG9lc24ndCBoYW5kIHAtdGFibGUgYSBuZXcgYXJyYXkgZXZlcnkgdGljayAoUlQtMjApLiAqL1xuICBwcm90ZWN0ZWQgZ2V0IHBhZ2VkUmVnaW9ucygpOiBSZWdpb25bXSB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5fcGFnZUtleTtcbiAgICBpZiAoXG4gICAgICBrZXkucmVnaW9ucyAhPT0gdGhpcy5yZWdpb25zIHx8XG4gICAgICBrZXkuc291cmNlICE9PSB0aGlzLnNvdXJjZVJvd3MgfHxcbiAgICAgIGtleS5maXJzdCAhPT0gdGhpcy5wYWdpbmF0b3JGaXJzdCB8fFxuICAgICAga2V5LnJvd3MgIT09IHRoaXMucGFnaW5hdG9yUm93c1xuICAgICkge1xuICAgICAgdGhpcy5fcGFnZUtleSA9IHtcbiAgICAgICAgcmVnaW9uczogdGhpcy5yZWdpb25zLFxuICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlUm93cyxcbiAgICAgICAgZmlyc3Q6IHRoaXMucGFnaW5hdG9yRmlyc3QsXG4gICAgICAgIHJvd3M6IHRoaXMucGFnaW5hdG9yUm93cyxcbiAgICAgIH07XG4gICAgICBjb25zdCBvd24gPSB0aGlzLnJlZ2lvbnMuc2xpY2UodGhpcy5wYWdpbmF0b3JGaXJzdCwgdGhpcy5wYWdpbmF0b3JGaXJzdCArIHRoaXMucGFnaW5hdG9yUm93cyk7XG4gICAgICB0aGlzLl9wYWdlID1cbiAgICAgICAgb3duLmxlbmd0aCA+PSB0aGlzLnBhZ2luYXRvclJvd3NcbiAgICAgICAgICA/IG93blxuICAgICAgICAgIDogWy4uLm93biwgLi4udGhpcy5zb3VyY2VSb3dzLnNsaWNlKDAsIHRoaXMucGFnaW5hdG9yUm93cyAtIG93bi5sZW5ndGgpXTtcbiAgICAgIC8vIEEgbmV3IHBhZ2UgbWF5IHNob3cgY2xhc3NlcyB3aG9zZSB2b2x1bWUgaXMgbm90IGtub3duIHlldCAoYWZ0ZXIgdGhpcyBjaGVjaykuXG4gICAgICBpZiAodGhpcy52b2x1bWVWaWV3KSBxdWV1ZU1pY3JvdGFzaygoKSA9PiB0aGlzLnJlcXVlc3RWb2x1bWVzKCkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcGFnZTtcbiAgfVxuXG4gIC8qKiBJbiBhIHZvbHVtZSB2aWV3LCBlYWNoIGNsYXNzJ3Mgdm9sdW1lIG92ZXIgdGhlIHdob2xlIHN0YWNrLCBmb3IgdGhlIHRhYmxlIChudWxsOiBhcmVhcykuICovXG4gIHByb3RlY3RlZCB0YWJsZVZvbHVtZXM6IFJlYWRvbmx5TWFwPHN0cmluZywgbnVtYmVyIHwgbnVsbD4gfCBudWxsID0gbnVsbDtcbiAgLyoqIEJ1bXBlZCB3aGVuIHRoZSByZWdpb25zIGNoYW5nZSwgc28gYSB2b2x1bWUgY29tcHV0ZWQgYmVmb3JlIGlzIGRyb3BwZWQuICovXG4gIHByaXZhdGUgdm9sdW1lUmVxdWVzdCA9IDA7XG5cbiAgLyoqIENvbXB1dGUgdGhlIHZvbHVtZXMgb2YgdGhlIGNsYXNzZXMgb24gdGhlIHRhYmxlJ3MgcGFnZSB0aGF0IGFyZSBub3Qga25vd24geWV0LiAqL1xuICBwcml2YXRlIHJlcXVlc3RWb2x1bWVzKCk6IHZvaWQge1xuICAgIGNvbnN0IGFwaSA9IHRoaXMucmVnaW9uQXBpLmdldENsYXNzVm9sdW1lcz8uYmluZCh0aGlzLnJlZ2lvbkFwaSk7XG4gICAgLy8gQ2xvc2VkOiBhc2tlZCBmb3IgYWdhaW4gd2hlbiBpdCBvcGVucyAoc2VlIGFjdGl2ZSkuXG4gICAgaWYgKCF0aGlzLmlzQWN0aXZlKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLnZvbHVtZVZpZXcgfHwgIWFwaSkge1xuICAgICAgaWYgKHRoaXMudGFibGVWb2x1bWVzKSB7XG4gICAgICAgIHRoaXMudGFibGVWb2x1bWVzID0gbnVsbDtcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGtub3duID0gdGhpcy50YWJsZVZvbHVtZXMgPz8gbmV3IE1hcDxzdHJpbmcsIG51bWJlciB8IG51bGw+KCk7XG4gICAgY29uc3QgbGFiZWxzID0gbmV3IFNldCh0aGlzLnBhZ2VkUmVnaW9ucy5tYXAoKHIpID0+IHIubGFiZWwpLmZpbHRlcigobCk6IGwgaXMgc3RyaW5nID0+ICEhbCkpO1xuICAgIGNvbnN0IG1pc3NpbmcgPSBbLi4ubGFiZWxzXS5maWx0ZXIoKGwpID0+ICFrbm93bi5oYXMobCkpO1xuICAgIGlmICghbWlzc2luZy5sZW5ndGggJiYgdGhpcy50YWJsZVZvbHVtZXMpIHJldHVybjtcbiAgICB0aGlzLnRhYmxlVm9sdW1lcyA9IG5ldyBNYXAoWy4uLmtub3duLCAuLi5taXNzaW5nLm1hcCgobCk6IFtzdHJpbmcsIG51bGxdID0+IFtsLCBudWxsXSldKTtcbiAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICBpZiAoIW1pc3NpbmcubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMudm9sdW1lUmVxdWVzdDtcbiAgICBhcGkobWlzc2luZykudGhlbihcbiAgICAgICh2b2x1bWVzKSA9PiB7XG4gICAgICAgIGlmIChyZXF1ZXN0ICE9PSB0aGlzLnZvbHVtZVJlcXVlc3QgfHwgIXRoaXMudGFibGVWb2x1bWVzKSByZXR1cm47XG4gICAgICAgIHRoaXMudGFibGVWb2x1bWVzID0gbmV3IE1hcChbLi4udGhpcy50YWJsZVZvbHVtZXMsIC4uLk9iamVjdC5lbnRyaWVzKHZvbHVtZXMpXSk7XG4gICAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgfSxcbiAgICAgIChlcnIpID0+IHtcbiAgICAgICAgaWYgKHJlcXVlc3QgIT09IHRoaXMudm9sdW1lUmVxdWVzdCB8fCAhdGhpcy50YWJsZVZvbHVtZXMpIHJldHVybjtcbiAgICAgICAgLy8gTGVhdmUgdGhlbSB1bmtub3duICgn4oCUJykgcmF0aGVyIHRoYW4gY29tcHV0aW5nIGZvcmV2ZXIuXG4gICAgICAgIGNvbnN0IG5leHQgPSBuZXcgTWFwKHRoaXMudGFibGVWb2x1bWVzKTtcbiAgICAgICAgZm9yIChjb25zdCBsIG9mIG1pc3NpbmcpIG5leHQuZGVsZXRlKGwpO1xuICAgICAgICB0aGlzLnRhYmxlVm9sdW1lcyA9IG5leHQ7XG4gICAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tyZWdpb25zXSBjb3VsZCBub3QgY29tcHV0ZSBjbGFzcyB2b2x1bWVzJywgZXJyKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBUaGUgcmVnaW9ucyBjaGFuZ2VkIChvciB0aGUgdmlldyBkaWQpOiBmb3JnZXQgdGhlIHZvbHVtZXMgYW5kIGNvbXB1dGUgdGhlIHBhZ2UncyBhZ2Fpbi4gKi9cbiAgcHJpdmF0ZSByZXNldFZvbHVtZXMoKTogdm9pZCB7XG4gICAgdGhpcy52b2x1bWVSZXF1ZXN0Kys7XG4gICAgdGhpcy50YWJsZVZvbHVtZXMgPSBudWxsO1xuICAgIHRoaXMucmVxdWVzdFZvbHVtZXMoKTtcbiAgfVxuICBwcml2YXRlIF9wYWdlS2V5OiB7IHJlZ2lvbnM/OiBSZWdpb25bXTsgc291cmNlPzogUmVnaW9uW107IGZpcnN0PzogbnVtYmVyOyByb3dzPzogbnVtYmVyIH0gPSB7fTtcbiAgcHJpdmF0ZSBfcGFnZTogUmVnaW9uW10gPSBbXTtcblxuICBwcm90ZWN0ZWQgb25QYWdlQ2hhbmdlKGV2ZW50OiB7IGZpcnN0PzogbnVtYmVyOyByb3dzPzogbnVtYmVyIH0pIHtcbiAgICB0aGlzLnBhZ2luYXRvckZpcnN0ID0gZXZlbnQuZmlyc3QgPz8gMDtcbiAgICB0aGlzLnBhZ2luYXRvclJvd3MgPSBldmVudC5yb3dzID8/IHRoaXMucGFnaW5hdG9yUm93cztcbiAgICB2b2lkIHRoaXMucmVmcmVzaFNvdXJjZSgpO1xuICB9XG5cbiAgLyoqIFNlbGVjdCBldmVyeSByZWdpb24gaW4gdGhlIHRhYmxlIChhbmQgaGlnaGxpZ2h0IHRoZW0gb24gdGhlIGRpYWdyYW0pLCB0aGUgc291cmNlJ3MgdGFrZW4uICovXG4gIHByb3RlY3RlZCBhc3luYyBzZWxlY3RBbGxSZWdpb25zKCkge1xuICAgIHRoaXMuc2VsZWN0ZWRSZWdpb25zID0gWy4uLnRoaXMucmVnaW9uc107XG4gICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZWQoKTtcbiAgICBpZiAoIXRoaXMuc291cmNlVG90YWwgfHwgIXRoaXMucmVnaW9uQXBpLmdldFJlZ2lvblNvdXJjZUluZGV4KSByZXR1cm47XG4gICAgY29uc3QgcGFnZSA9IGF3YWl0IHRoaXMucmVnaW9uQXBpLmdldFJlZ2lvblNvdXJjZUluZGV4KHsgb2Zmc2V0OiAwLCBsaW1pdDogU0VMRUNUX0FMTF9TT1VSQ0VfTElNSVQgfSk7XG4gICAgY29uc3QgaWRzID0gKHBhZ2U/LnJvd3MgPz8gW10pLm1hcCgocikgPT4gci5pZCk7XG4gICAgaWYgKGlkcy5sZW5ndGgpIGF3YWl0IHRoaXMucmVnaW9uQXBpLnNlbGVjdFNvdXJjZUZlYXR1cmVzPy4oaWRzLCB0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZWxldGVTZWxlY3RlZFJlZ2lvbnMoKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRSZWdpb25zICYmIHRoaXMuc2VsZWN0ZWRSZWdpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGZyb21Tb3VyY2UgPSB0aGlzLnNlbGVjdGVkUmVnaW9ucy5maWx0ZXIoKHIpID0+IHRoaXMuc3RhbmRJbnMuaGFzKHIpKTtcbiAgICAgIGlmIChmcm9tU291cmNlLmxlbmd0aCkgdGhpcy5yZWdpb25BcGkuZGVsZXRlU291cmNlRmVhdHVyZXM/Lih0aGlzLnNvdXJjZUlkcyhmcm9tU291cmNlKSk7XG4gICAgICAvLyBGaWx0ZXIgYnkgaWQg4oCUIG9iamVjdCBpZGVudGl0eSBpc24ndCByZWxpYWJsZSBhY3Jvc3MgcmUtcGFyc2VzLFxuICAgICAgLy8gYW5kIG5hbWUgaXMgYSB1c2VyLWVkaXRhYmxlIGxhYmVsIHRoYXQgbWF5IGNvbGxpZGUuXG4gICAgICBjb25zdCByZW1vdmVkID0gbmV3IFNldCh0aGlzLnNlbGVjdGVkUmVnaW9ucy5tYXAoKHIpID0+IHIuaWQpKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSZWdpb25zID0gW107XG4gICAgICB0aGlzLmNvbW1pdCh0aGlzLnJlZ2lvbnMuZmlsdGVyKChyKSA9PiAhcmVtb3ZlZC5oYXMoci5pZCkpKTtcbiAgICAgIHRoaXMuY2xhbXBQYWdpbmF0b3JGaXJzdCgpO1xuICAgICAgLy8gU3luYyB0aGUgY2xlYXJlZCBzZWxlY3Rpb24gd2l0aCB0aGUgcGxvdCdzIGhpZ2hsaWdodCBzdGF0ZS5cbiAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2VkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyQWxsUmVnaW9ucygpIHtcbiAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XG4gICAgICBrZXk6ICdwb3NpdGlvbkRpYWxvZycsXG4gICAgICBtZXNzYWdlOiAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSBhbGwgcmVnaW9ucz8nLFxuICAgICAgYWNjZXB0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSZWdpb25zID0gW107XG4gICAgICAgIHRoaXMucGFnaW5hdG9yRmlyc3QgPSAwO1xuICAgICAgICB0aGlzLmNvbW1pdChbXSk7XG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2VkKCk7XG4gICAgICAgIGlmICh0aGlzLmhhc1JlZ2lvblNvdXJjZSkgdm9pZCB0aGlzLmRlbGV0ZUFsbFNvdXJjZUZlYXR1cmVzKCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIERlbGV0ZSBldmVyeSBmZWF0dXJlIHN0aWxsIGluIHRoZSBzbGljZSdzIHJlZ2lvbiBzb3VyY2UgKHdpdGggXCJEZWxldGUgYWxsIHJlZ2lvbnNcIikuICovXG4gIHByaXZhdGUgYXN5bmMgZGVsZXRlQWxsU291cmNlRmVhdHVyZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnJlZ2lvbkFwaS5nZXRSZWdpb25Tb3VyY2VJbmRleDtcbiAgICBpZiAoIWluZGV4IHx8ICF0aGlzLnJlZ2lvbkFwaS5kZWxldGVTb3VyY2VGZWF0dXJlcykgcmV0dXJuO1xuICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCBpbmRleC5jYWxsKHRoaXMucmVnaW9uQXBpLCB7IG9mZnNldDogMCwgbGltaXQ6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIH0pO1xuICAgIGlmIChwYWdlPy5yb3dzLmxlbmd0aCkgdGhpcy5yZWdpb25BcGkuZGVsZXRlU291cmNlRmVhdHVyZXMocGFnZS5yb3dzLm1hcCgocikgPT4gci5pZCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlbGV0ZVJlZ2lvbihzaGFwZUlkeDogbnVtYmVyKSB7XG4gICAgLy8gQSByb3cgcGFzdCB0aGUgcmVnaW9ucyBpcyBhIHNvdXJjZSBmZWF0dXJlOiBkZWxldGUgaXQgZnJvbSB0aGUgc291cmNlLlxuICAgIGlmIChzaGFwZUlkeCA+PSB0aGlzLnJlZ2lvbnMubGVuZ3RoKSB7XG4gICAgICBjb25zdCByb3cgPSB0aGlzLnNvdXJjZVJvd3Nbc2hhcGVJZHggLSBNYXRoLm1heCh0aGlzLnBhZ2luYXRvckZpcnN0LCB0aGlzLnJlZ2lvbnMubGVuZ3RoKV07XG4gICAgICBpZiAocm93KSB0aGlzLnJlZ2lvbkFwaS5kZWxldGVTb3VyY2VGZWF0dXJlcz8uKHRoaXMuc291cmNlSWRzKFtyb3ddKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnJlZ2lvbnNbc2hhcGVJZHhdO1xuICAgIGlmIChyZW1vdmVkKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUmVnaW9ucyA9IHRoaXMuc2VsZWN0ZWRSZWdpb25zLmZpbHRlcigocikgPT4gci5pZCAhPT0gcmVtb3ZlZC5pZCk7XG4gICAgfVxuICAgIHRoaXMuY29tbWl0KHRoaXMucmVnaW9ucy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IHNoYXBlSWR4KSk7XG4gICAgdGhpcy5jbGFtcFBhZ2luYXRvckZpcnN0KCk7XG4gICAgLy8gUmUtZW1pdCB0aGUgKHBvc3NpYmx5IHRyaW1tZWQpIHNlbGVjdGlvbiBzbyB0aGUgcGxvdCdzIGhpZ2hsaWdodCBzdGF5c1xuICAgIC8vIGluIHN5bmMgd2l0aCB3aGF0J3Mgc3RpbGwgaW4gdGhlIHRhYmxlLlxuICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2VkKCk7XG4gIH1cblxuICBwcml2YXRlIGNsYW1wUGFnaW5hdG9yRmlyc3QoKSB7XG4gICAgY29uc3QgbWF4Rmlyc3QgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKCh0aGlzLnRhYmxlVG90YWwgLSAxKSAvIHRoaXMucGFnaW5hdG9yUm93cykgKiB0aGlzLnBhZ2luYXRvclJvd3MpO1xuICAgIGlmICh0aGlzLnBhZ2luYXRvckZpcnN0ID4gbWF4Rmlyc3QpIHtcbiAgICAgIHRoaXMucGFnaW5hdG9yRmlyc3QgPSBtYXhGaXJzdDtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGNoYW5nZVNob3dTaGFwZUxhYmVsKHNob3dMYWJlbDogYm9vbGVhbikge1xuICAgIHRoaXMuY29tbWl0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNFZGl0aW5nTGFiZWwocmVnaW9uOiBSZWdpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0aW5nTGFiZWxSZWdpb25zLmhhcyhyZWdpb24pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXJ0RWRpdExhYmVsKHJlZ2lvbjogUmVnaW9uLCBldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpOyAvLyBkb24ndCB0b2dnbGUgcm93IHNlbGVjdGlvblxuICAgIGlmICh0aGlzLnN0YW5kSW5zLmhhcyhyZWdpb24pKSB7XG4gICAgICB2b2lkIHRoaXMudGFrZVRoZW4ocmVnaW9uLCAocikgPT4gdGhpcy5zdGFydEVkaXRMYWJlbChyKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEEgbmV3IG1hcCBwZXIgc3RhcnQvc3RvcCwgc28gdGhlIE9uUHVzaCB0YWJsZSBzZWVzIHRoZSBjaGFuZ2UuXG4gICAgdGhpcy5lZGl0aW5nTGFiZWxSZWdpb25zID0gbmV3IE1hcCh0aGlzLmVkaXRpbmdMYWJlbFJlZ2lvbnMpLnNldChyZWdpb24sIHJlZ2lvbi5sYWJlbCA/PyAnJyk7XG4gIH1cblxuICAvKiogVGhlIGxhYmVsIHR5cGVkIHNvIGZhciBmb3IgYSByb3cgaW4gZWRpdCBtb2RlIChubyByZS1yZW5kZXIgbmVlZGVkKS4gKi9cbiAgcHJvdGVjdGVkIHNldExhYmVsRHJhZnQocmVnaW9uOiBSZWdpb24sIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lZGl0aW5nTGFiZWxSZWdpb25zLmhhcyhyZWdpb24pKSB0aGlzLmVkaXRpbmdMYWJlbFJlZ2lvbnMuc2V0KHJlZ2lvbiwgdmFsdWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0b3BFZGl0TGFiZWwocmVnaW9uOiBSZWdpb24sIGNvbW1pdDogYm9vbGVhbiwgZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBkcmFmdCA9IHRoaXMuZWRpdGluZ0xhYmVsUmVnaW9ucy5nZXQocmVnaW9uKTtcbiAgICBpZiAodGhpcy5lZGl0aW5nTGFiZWxSZWdpb25zLmhhcyhyZWdpb24pKSB7XG4gICAgICBjb25zdCBuZXh0ID0gbmV3IE1hcCh0aGlzLmVkaXRpbmdMYWJlbFJlZ2lvbnMpO1xuICAgICAgbmV4dC5kZWxldGUocmVnaW9uKTtcbiAgICAgIHRoaXMuZWRpdGluZ0xhYmVsUmVnaW9ucyA9IG5leHQ7XG4gICAgfVxuICAgIGlmIChjb21taXQpIHtcbiAgICAgIC8vIEEgY2hhbmdlZCBsYWJlbCBjb21taXRzIGFzIGEgcmVwbGFjZW1lbnQgcmVnaW9uLCBzbyBpdCBpcyB1bmRvYWJsZSAoUlQtMSkuXG4gICAgICBjb25zdCBlZGl0ZWQgPVxuICAgICAgICBkcmFmdCAhPT0gdW5kZWZpbmVkICYmIGRyYWZ0ICE9PSByZWdpb24ubGFiZWxcbiAgICAgICAgICA/ICh0aGlzLnBhdGNoUmVnaW9ucygocikgPT4gKHIgPT09IHJlZ2lvbiA/IHsgbGFiZWw6IGRyYWZ0IH0gOiBudWxsKSkuZ2V0KHJlZ2lvbikgPz8gcmVnaW9uKVxuICAgICAgICAgIDogcmVnaW9uO1xuICAgICAgdGhpcy5sYWJlbFJlZ2lvblVwZGF0ZShlZGl0ZWQsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZWdpb24gYXJlYSBmb3IgZGlzcGxheSAowrVtwrIvbW3CsiB3aGVuIHRoZSBpbWFnZSBpcyBzY2FsZWQsIGVsc2UgcHjCsik7XG4gICAqICBlbXB0eSBmb3IgYSBkZWdlbmVyYXRlIHJlZ2lvbi4gU2VlIGByZWdpb24tbWV0cmljc2AuICovXG4gIHByb3RlY3RlZCByZWdpb25BcmVhKHJlZ2lvbjogUmVnaW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZm9ybWF0QXJlYShyZWdpb25BcmVhUHgocmVnaW9uKSwgdGhpcy5tcHApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHJvdW5kcyBhbGwgdGhlIHJlY3RhbmdsZSByZWdpb25zIGxlbmd0aHMgdG8gbXVsdGlwbGUgb2YgNTEyXG4gICAqL1xuICBwcm90ZWN0ZWQgcm91bmRSZWN0YW5nbGVMZW5ndGhzKCkge1xuICAgIHRoaXMucGF0Y2hSZWdpb25zKChyZWdpb24pID0+IHtcbiAgICAgIGNvbnN0IHJlY3QgPSByZWdpb24uYm91bmRzO1xuICAgICAgaWYgKCEocmVjdCBpbnN0YW5jZW9mIFJlY3RhbmdsZSkpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYm91bmRzOiBPYmplY3QuYXNzaWduKG5ldyBSZWN0YW5nbGUoKSwgcmVjdCwge1xuICAgICAgICAgIGhlaWdodDogTWF0aC5yb3VuZChyZWN0LmhlaWdodCAvIDUxMikgKiA1MTIsXG4gICAgICAgICAgd2lkdGg6IE1hdGgucm91bmQocmVjdC53aWR0aCAvIDUxMikgKiA1MTIsXG4gICAgICAgIH0pLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLmNvbW1pdCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNob3dIZWxwKCkge1xuICAgIHRoaXMuZGlzcGxheUhlbHBEaWFsb2cgPSB0cnVlO1xuICB9XG5cbiAgLyoqIE9wZW4gdGhlIGNvbG91ciBkaWFsb2cgZm9yIHRoZSBjdXJyZW50bHktc2VsZWN0ZWQgcmVnaW9uKHMpLCBidWlsZGluZyBvbmVcbiAgICogIGNvbG91ciBwaWNrZXIgcGVyIHVuaXF1ZSBjbGFzcyBpbiB0aGUgc2VsZWN0aW9uLiBFYWNoIHBpY2tlciBpcyBzZWVkZWQgd2l0aFxuICAgKiAgdGhlIGZpcnN0IHNlbGVjdGVkIHJlZ2lvbiBvZiB0aGF0IGNsYXNzJ3MgY29sb3VyIChlbHNlIHRoZSBjbGFzcyBjb2xvdXIpLiAqL1xuICBwcm90ZWN0ZWQgb3BlbkNvbG9yRGlhbG9nKCkge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZFJlZ2lvbnM/Lmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IHNlZWRCeUxhYmVsID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHJlZ2lvbiBvZiB0aGlzLnNlbGVjdGVkUmVnaW9ucykge1xuICAgICAgY29uc3QgbGFiZWwgPSByZWdpb24ubGFiZWw/LnRyaW0oKSA/PyAnJztcbiAgICAgIGlmIChzZWVkQnlMYWJlbC5oYXMobGFiZWwpKSBjb250aW51ZTtcbiAgICAgIHNlZWRCeUxhYmVsLnNldChsYWJlbCwgcmVnaW9uLmNvbG9yID8/IChsYWJlbCA/IHRoaXMuY29sb3JGb3JOYW1lKGxhYmVsKSA6IHRoaXMuc2hhcGVDb2xvcikpO1xuICAgIH1cbiAgICB0aGlzLmNsYXNzQ29sb3JFZGl0cyA9IFsuLi5zZWVkQnlMYWJlbF0ubWFwKChbbGFiZWwsIGNvbG9yXSkgPT4gKHsgbGFiZWwsIGNvbG9yIH0pKTtcbiAgICB0aGlzLnNob3dDb2xvckRpYWxvZyA9IHRydWU7XG4gIH1cblxuICAvKiogQXBwbHkgZWFjaCBjbGFzcydzIGNob3NlbiBjb2xvdXIgdG8gdGhlIHNlbGVjdGVkIHJlZ2lvbnMgb2YgdGhhdCBjbGFzcyAoYW5cbiAgICogIGV4cGxpY2l0IG92ZXJyaWRlKSBhbmQgY29tbWl0IGxpdmUuICovXG4gIHByb3RlY3RlZCBhcHBseUNvbG9yVG9TZWxlY3RlZChlZGl0czogQ2xhc3NDb2xvckVkaXRbXSA9IHRoaXMuY2xhc3NDb2xvckVkaXRzKSB7XG4gICAgY29uc3QgY29sb3JCeUxhYmVsID0gbmV3IE1hcChlZGl0cy5tYXAoKGUpID0+IFtlLmxhYmVsLCBlLmNvbG9yXSkpO1xuICAgIGNvbnN0IHNlbGVjdGVkID0gbmV3IFNldCh0aGlzLnNlbGVjdGVkUmVnaW9ucyA/PyBbXSk7XG4gICAgdGhpcy5wYXRjaFJlZ2lvbnMoKHJlZ2lvbikgPT4ge1xuICAgICAgaWYgKCFzZWxlY3RlZC5oYXMocmVnaW9uKSkgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCBsYWJlbCA9IHJlZ2lvbi5sYWJlbD8udHJpbSgpID8/ICcnO1xuICAgICAgY29uc3QgY29sb3IgPSBjb2xvckJ5TGFiZWwuZ2V0KGxhYmVsKTtcbiAgICAgIGlmICghY29sb3IpIHJldHVybiBudWxsO1xuICAgICAgLy8gZXhwbGljaXQgY29sb3VyIOKAlCBwcmVzZXJ2ZSBhZ2FpbnN0IHByZXNldCAocmUpYXBwbHkgKGppdC11aSM3MClcbiAgICAgIHJldHVybiB7IGNvbG9yLCBjb2xvck92ZXJyaWRkZW46IHRydWUgfTtcbiAgICB9KTtcbiAgICB0aGlzLmNvbW1pdCgpO1xuICAgIHRoaXMuc2hvd0NvbG9yRGlhbG9nID0gZmFsc2U7XG4gIH1cblxuICAvLyDilIDilIAgYW5ub3RhdGlvbi1jbGFzcyBwcmVzZXRzIChqaXQtdWkjNzApIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBSZXNvbHZlIHRoZSBkaXNwbGF5IGNvbG91ciBmb3IgYSBjbGFzcyBuYW1lIChwcmVzZXQgY29sb3VyIG9yIGRldGVybWluaXN0aWMgZmFsbGJhY2spLiAqL1xuICBwcm90ZWN0ZWQgY29sb3JGb3JOYW1lKG5hbWU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBuYW1lID8gY29sb3JGb3JMYWJlbChuYW1lLCB0aGlzLnByZXNldFNldCkgOiB0aGlzLnNoYXBlQ29sb3I7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIGV2ZXJ5IGNsYXNzIGxhYmVsIHByZXNlbnQgaW4gdGhlIGxvYWRlZCByZWdpb25zIGV4aXN0cyBpbiB0aGUgcHJlc2V0XG4gICAqIGxpc3QsIGF1dG8tYWRkaW5nIGFueSB0aGF0IGFyZSBtaXNzaW5nICh1c2luZyB0aGUgcmVnaW9uJ3MgYWxyZWFkeS1yZXNvbHZlZFxuICAgKiBjb2xvdXIpLiBUaGlzIG1ha2VzIGNsYXNzZXMgY2FycmllZCBpbiBhIGxvYWRlZC9pbXBvcnRlZCBHZW9KU09OIHNob3cgdXAgYXNcbiAgICogY2hpcHMgKyBDbGFzcy1kcm9wZG93biBvcHRpb25zIChhIHAtZHJvcGRvd24gY2FuJ3QgZGlzcGxheSBhIHZhbHVlIHRoYXQgaXNuJ3RcbiAgICogYW4gb3B0aW9uKSBhbmQgbGV0cyB0aGUgdXNlciBtYW5hZ2UgdGhlbS4gVGhlIHBsYWNlaG9sZGVyICdsZWdlbmQnIGFuZCBlbXB0eVxuICAgKiBsYWJlbHMgYXJlIGlnbm9yZWQuIChqaXQtdWkjNzApXG4gICAqL1xuICBwcml2YXRlIHN5bmNDbGFzc2VzRnJvbVJlZ2lvbnMocmVnaW9uczogUmVnaW9uW10pOiB2b2lkIHtcbiAgICBjb25zdCBrZXlPZiA9IChsOiBzdHJpbmcpID0+IHByZXNldEtleSh0aGlzLnByZXNldFNldCwgbCk7XG4gICAgY29uc3Qga25vd24gPSBuZXcgU2V0KHRoaXMucHJlc2V0U2V0LmNsYXNzZXMubWFwKChjKSA9PiBrZXlPZihjLm5hbWUpKSk7XG4gICAgY29uc3QgYWRkZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgcmVnaW9ucykge1xuICAgICAgY29uc3QgbGFiZWwgPSByLmxhYmVsPy50cmltKCk7XG4gICAgICBpZiAoIWxhYmVsIHx8IGxhYmVsID09PSAnbGVnZW5kJykgY29udGludWU7XG4gICAgICBjb25zdCBrID0ga2V5T2YobGFiZWwpO1xuICAgICAgaWYgKGtub3duLmhhcyhrKSB8fCBhZGRlZC5oYXMoaykpIGNvbnRpbnVlO1xuICAgICAgYWRkZWQuYWRkKGspO1xuICAgICAgdGhpcy5yZWdpb25BcGkudXBzZXJ0Q2xhc3Moe1xuICAgICAgICBuYW1lOiBsYWJlbCxcbiAgICAgICAgY29sb3I6IHIuY29sb3IgfHwgY29sb3JGb3JMYWJlbChsYWJlbCwgdGhpcy5wcmVzZXRTZXQpLFxuICAgICAgICBzb3VyY2U6ICdhdXRvJyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBEb2NrZWQgQ2xhc3NlcyBwYW5lbCAoaml0LXVpIzcwKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY2xhc3NlcyBjb3VudCBldmVyeSBzbGljZSBvZiB0aGUgc3RhY2s6IGluIGEgdm9sdW1lIHZpZXcgKHRoZSB3aG9sZSBzdGFjayBvblxuICAgKiBzY3JlZW4pLCB1bmxlc3MgaXRzIHNsaWNlIHBhbmUgc2hvd3Mgb25lIHNsaWNlLiBUaGUgdGFibGUgbGlzdHMgdGhlIHNsaWNlJ3MgcmVnaW9ucyBhbnl3YXkuXG4gICAqL1xuICBwcml2YXRlIGdldCBzdGFja0NvdW50cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52b2x1bWVWaWV3ICYmICF0aGlzLnNsaWNlUGFuZTtcbiAgfVxuXG4gIC8qKiBSZWJ1aWxkIHRoZSBwZXItY2xhc3MgcmVnaW9uIGNvdW50cyBzaG93biBpbiB0aGUgcGFuZWwgKHRoZSBzdGFjaydzLCBzZWUgc3RhY2tDb3VudHMpLiAqL1xuICBwcml2YXRlIHJlY29tcHV0ZUNsYXNzQ291bnRzKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvdW50cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgY29uc3QgdHJlZSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgY29uc3QgYWRkID0gKGxhYmVsOiBzdHJpbmcsIG46IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgayA9IHByZXNldEtleSh0aGlzLnByZXNldFNldCwgbGFiZWwpO1xuICAgICAgY291bnRzLnNldChrLCAoY291bnRzLmdldChrKSA/PyAwKSArIG4pO1xuICAgICAgdHJlZS5zZXQobGFiZWwsICh0cmVlLmdldChsYWJlbCkgPz8gMCkgKyBuKTtcbiAgICB9O1xuICAgIGNvbnN0IHJlZ2lvbnMgPSB0aGlzLnN0YWNrQ291bnRzID8gdGhpcy5yZWdpb25BcGkuZ2V0U2xpY2VBbm5vdGF0aW9uUmVnaW9ucygpIDogdGhpcy5yZWdpb25zO1xuICAgIGZvciAoY29uc3QgciBvZiByZWdpb25zKSBpZiAoci5sYWJlbCkgYWRkKHIubGFiZWwsIDEpO1xuICAgIC8vIFRoZSByZWdpb24gc291cmNlJ3MgY2xhc3NlcyBjb3VudCB0b28gKGl0cyBmZWF0dXJlcyBhcmUgcm93cyBvZiB0aGUgdGFibGUpLlxuICAgIGZvciAoY29uc3QgW2xhYmVsLCBuXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnNvdXJjZUNsYXNzQ291bnRzKSkgYWRkKGxhYmVsLCBuKTtcbiAgICB0aGlzLmNsYXNzQ291bnRzID0gY291bnRzO1xuICAgIHRoaXMudHJlZUNvdW50cyA9IHRyZWU7XG4gICAgdGhpcy51cGRhdGVEaXNwbGF5Q2xhc3NlcygpO1xuICB9XG5cbiAgLyoqIFJlYnVpbGQgdGhlIHBhbmVsJ3MgZGlzcGxheSBvcmRlciDigJQgbW9zdC11c2VkIGNsYXNzZXMgZmlyc3QsIHRoZW4gYnkgbmFtZS4gQSBjbGFzcyBvbmx5XG4gICAqICB0aGUgcmVnaW9uIHNvdXJjZSBoYXMgaXMgbGlzdGVkIHRvbywgaW4gaXRzIGNvbG91ci4gKi9cbiAgcHJpdmF0ZSB1cGRhdGVEaXNwbGF5Q2xhc3NlcygpOiB2b2lkIHtcbiAgICBjb25zdCBrbm93biA9IG5ldyBTZXQodGhpcy5wcmVzZXRTZXQuY2xhc3Nlcy5tYXAoKGMpID0+IHByZXNldEtleSh0aGlzLnByZXNldFNldCwgYy5uYW1lKSkpO1xuICAgIGNvbnN0IGZyb21Tb3VyY2U6IENsYXNzUHJlc2V0W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGxhYmVsIG9mIE9iamVjdC5rZXlzKHRoaXMuc291cmNlQ2xhc3NDb3VudHMpKSB7XG4gICAgICBjb25zdCBrID0gcHJlc2V0S2V5KHRoaXMucHJlc2V0U2V0LCBsYWJlbCk7XG4gICAgICBpZiAoa25vd24uaGFzKGspKSBjb250aW51ZTtcbiAgICAgIGtub3duLmFkZChrKTtcbiAgICAgIGZyb21Tb3VyY2UucHVzaCh7IG5hbWU6IGxhYmVsLCBjb2xvcjogY29sb3JGb3JMYWJlbChsYWJlbCwgdGhpcy5wcmVzZXRTZXQpIH0pO1xuICAgIH1cbiAgICB0aGlzLnRhYmxlUHJlc2V0U2V0ID0gZnJvbVNvdXJjZS5sZW5ndGhcbiAgICAgID8geyAuLi50aGlzLnByZXNldFNldCwgY2xhc3NlczogWy4uLnRoaXMucHJlc2V0U2V0LmNsYXNzZXMsIC4uLmZyb21Tb3VyY2VdIH1cbiAgICAgIDogdGhpcy5wcmVzZXRTZXQ7XG4gICAgdGhpcy5kaXNwbGF5Q2xhc3NlcyA9IFsuLi50aGlzLnByZXNldFNldC5jbGFzc2VzLCAuLi5mcm9tU291cmNlXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBkID0gdGhpcy5jbGFzc0NvdW50KGIubmFtZSkgLSB0aGlzLmNsYXNzQ291bnQoYS5uYW1lKTtcbiAgICAgIHJldHVybiBkICE9PSAwID8gZCA6IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogTnVtYmVyIG9mIHJlZ2lvbnMgY3VycmVudGx5IHVzaW5nIGEgY2xhc3MgKGtleWVkIGJ5IHRoZSBhY3RpdmUgbWF0Y2ggbW9kZSkuICovXG4gIHByb3RlY3RlZCBjbGFzc0NvdW50KG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3NDb3VudHMuZ2V0KHByZXNldEtleSh0aGlzLnByZXNldFNldCwgbmFtZSkpID8/IDA7XG4gIH1cblxuICAvKiogUmVjb2xvdXIgYSBjbGFzcyBmcm9tIGl0cyBwYW5lbCBzd2F0Y2ggYW5kIHJlcGFpbnQgaXRzIChub24tb3ZlcnJpZGRlbikgcmVnaW9ucy4gKi9cbiAgcHJvdGVjdGVkIHNldENsYXNzQ29sb3IobmFtZTogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFjb2xvcikgcmV0dXJuO1xuICAgIHRoaXMucmVnaW9uQXBpLnNldENsYXNzaWZpY2F0aW9uQ29sb3IobmFtZSwgY29sb3IpO1xuICAgIHRoaXMuY29tbWl0KCk7XG4gIH1cblxuICAvKiogUmVtb3ZlIGEgY2xhc3MuIEFueSByZWdpb25zIHN0aWxsIHVzaW5nIGl0IGZhbGwgYmFjayB0byB0aGUgZGVmYXVsdFxuICAgKiAgXCJSZWdpb25cIiBjbGFzcywgc28gdGhleSBhcmVuJ3Qgb3JwaGFuZWQgKGFuZCB0aGUgY2xhc3MgaXNuJ3QgaW1tZWRpYXRlbHlcbiAgICogIHJlLWFkZGVkIGZyb20gaXRzIHJlZ2lvbnMgYnkgc3luY0NsYXNzZXNGcm9tUmVnaW9ucykuICovXG4gIHByb3RlY3RlZCBkZWxldGVDbGFzcyhuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnJlYXNzaWduUmVnaW9uc1RvRGVmYXVsdENsYXNzKFtuYW1lXSk7XG4gICAgdGhpcy5yZWdpb25BcGkucmVtb3ZlQ2xhc3MobmFtZSk7XG4gICAgaWYgKHRoaXMuYWN0aXZlQ2xhc3MgPT09IG5hbWUpIHRoaXMuYWN0aXZlQ2xhc3MgPSBudWxsO1xuICAgIHRoaXMuY29tbWl0KCk7XG4gIH1cblxuICAvKiogUmVnaW9ucyBsYWJlbGxlZCB3aXRoIGFueSBvZiBgcmVtb3ZlZE5hbWVzYCByZXZlcnQgdG8gdGhlIGRlZmF1bHRcbiAgICogIHtAbGluayBkZWZhdWx0Q2xhc3NOYW1lfSAoXCJSZWdpb25cIik6IGl0cyBjbGFzcyBjb2xvdXIsIG92ZXJyaWRlIGNsZWFyZWQuXG4gICAqICBTa2lwcyB0aGUgZGVmYXVsdCBpdHNlbGYgc28gZGVsZXRpbmcgXCJSZWdpb25cIiBjYW4ndCBzZWxmLXJlYXNzaWduLiAoaml0LXVpIzcwKSAqL1xuICBwcml2YXRlIHJlYXNzaWduUmVnaW9uc1RvRGVmYXVsdENsYXNzKHJlbW92ZWROYW1lczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBjb25zdCBrZXlPZiA9IChzOiBzdHJpbmcpID0+IHByZXNldEtleSh0aGlzLnByZXNldFNldCwgcyk7XG4gICAgY29uc3QgcmVtb3ZlZCA9IG5ldyBTZXQocmVtb3ZlZE5hbWVzLm1hcChrZXlPZikpO1xuICAgIHJlbW92ZWQuZGVsZXRlKGtleU9mKHRoaXMuZGVmYXVsdENsYXNzTmFtZSkpO1xuICAgIGlmICghcmVtb3ZlZC5zaXplKSByZXR1cm47XG4gICAgY29uc3QgY29sb3IgPSBjb2xvckZvckxhYmVsKHRoaXMuZGVmYXVsdENsYXNzTmFtZSwgdGhpcy5wcmVzZXRTZXQpO1xuICAgIHRoaXMucGF0Y2hSZWdpb25zKChyKSA9PlxuICAgICAgci5sYWJlbCAmJiByZW1vdmVkLmhhcyhrZXlPZihyLmxhYmVsKSlcbiAgICAgICAgPyB7IGxhYmVsOiB0aGlzLmRlZmF1bHRDbGFzc05hbWUsIGNvbG9yT3ZlcnJpZGRlbjogZmFsc2UsIGNvbG9yIH1cbiAgICAgICAgOiBudWxsLFxuICAgICk7XG4gIH1cblxuICAvKiogU3RhbXAgYSBjbGFzcyAoYW5kIGl0cyBwcmVzZXQvZmFsbGJhY2sgY29sb3VyKSBvbnRvIG9uZSByZWdpb24gZnJvbSB0aGUgQ2xhc3NcbiAgICogIGRyb3Bkb3duOyBjaG9vc2luZyBhIGNsYXNzIG9wdHMgdGhlIHJlZ2lvbiBiYWNrIGludG8gdGhlIHByZXNldCBjb2xvdXIuICovXG4gIHByb3RlY3RlZCBhcHBseVByZXNldFRvUmVnaW9uKHJlZ2lvbjogUmVnaW9uLCBjbGFzc05hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0YW5kSW5zLmhhcyhyZWdpb24pKSB7XG4gICAgICB2b2lkIHRoaXMudGFrZVRoZW4ocmVnaW9uLCAocikgPT4gdGhpcy5hcHBseVByZXNldFRvUmVnaW9uKHIsIGNsYXNzTmFtZSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gKGNsYXNzTmFtZSA/PyAnJykudHJpbSgpO1xuICAgIGNvbnN0IHBhdGNoOiBQYXJ0aWFsPFJlZ2lvbj4gPSB7IGxhYmVsOiBuYW1lLCBjb2xvck92ZXJyaWRkZW46IGZhbHNlIH07XG4gICAgaWYgKG5hbWUpIHBhdGNoLmNvbG9yID0gY29sb3JGb3JMYWJlbChuYW1lLCB0aGlzLnByZXNldFNldCk7XG4gICAgdGhpcy5wYXRjaFJlZ2lvbnMoKHIpID0+IChyID09PSByZWdpb24gPyBwYXRjaCA6IG51bGwpKTtcbiAgICB0aGlzLmNvbW1pdCgpO1xuICB9XG5cbiAgLyoqIE1ha2UgYSBjbGFzcyBhY3RpdmUgKHVzZWQgZm9yIG5ldyByZWdpb25zKSBhbmQsIGlmIHJvd3MgYXJlIHNlbGVjdGVkLCBhcHBseVxuICAgKiAgaXQgdG8gdGhlbSBpbiBvbmUgY29tbWl0LiAqL1xuICBwcm90ZWN0ZWQgc2VsZWN0QWN0aXZlQ2xhc3MobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVDbGFzcyA9IG5hbWU7XG4gICAgdGhpcy5hcHBseUNsYXNzVG9TZWxlY3RlZChuYW1lKTtcbiAgfVxuXG4gIC8qKiBBcHBseSBhIGNsYXNzIChsYWJlbCArIHByZXNldC9mYWxsYmFjayBjb2xvdXIpIHRvIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBhbmQgY29tbWl0LiAqL1xuICBwcml2YXRlIGFwcGx5Q2xhc3NUb1NlbGVjdGVkKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gbmV3IFNldCh0aGlzLnNlbGVjdGVkUmVnaW9ucyA/PyBbXSk7XG4gICAgaWYgKCFzZWxlY3RlZC5zaXplKSByZXR1cm47XG4gICAgY29uc3QgY29sb3IgPSBjb2xvckZvckxhYmVsKG5hbWUsIHRoaXMucHJlc2V0U2V0KTtcbiAgICB0aGlzLnBhdGNoUmVnaW9ucygocikgPT4gKHNlbGVjdGVkLmhhcyhyKSA/IHsgbGFiZWw6IG5hbWUsIGNvbG9yT3ZlcnJpZGRlbjogZmFsc2UsIGNvbG9yIH0gOiBudWxsKSk7XG4gICAgdGhpcy5jb21taXQoKTtcbiAgfVxuXG4gIC8qKiBcIkVkaXQgY2xhc3Mgb24gc2VsZWN0ZWQgcm93c1wiIHBvcHVwIOKAlCBhcHBseSB0aGUgY2hvc2VuIGV4aXN0aW5nIGNsYXNzLiAqL1xuICBwcm90ZWN0ZWQgYXBwbHlCdWxrQ2xhc3MoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmJ1bGtDbGFzcykgcmV0dXJuO1xuICAgIHRoaXMuYXBwbHlDbGFzc1RvU2VsZWN0ZWQodGhpcy5idWxrQ2xhc3MpO1xuICAgIHRoaXMub3ZlcmxheVBhbmVsPy5oaWRlKCk7XG4gIH1cblxuICAvKiogXCJFZGl0IGNsYXNzIG9uIHNlbGVjdGVkIHJvd3NcIiBwb3B1cCDigJQgYWRkIGEgbmV3IGNsYXNzIGFuZCBzZXQgaXQgb24gdGhlIHNlbGVjdGlvbi4gKi9cbiAgcHJvdGVjdGVkIGFkZEFuZEFwcGx5QnVsa0NsYXNzKCk6IHZvaWQge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLm5ld0J1bGtDbGFzcy50cmltKCk7XG4gICAgaWYgKCFuYW1lKSByZXR1cm47XG4gICAgY29uc3Qga2V5ID0gcHJlc2V0S2V5KHRoaXMucHJlc2V0U2V0LCBuYW1lKTtcbiAgICBjb25zdCBleGlzdHMgPSB0aGlzLnByZXNldFNldC5jbGFzc2VzLnNvbWUoKGMpID0+IHByZXNldEtleSh0aGlzLnByZXNldFNldCwgYy5uYW1lKSA9PT0ga2V5KTtcbiAgICBpZiAoIWV4aXN0cykge1xuICAgICAgdGhpcy5yZWdpb25BcGkudXBzZXJ0Q2xhc3MoeyBuYW1lLCBjb2xvcjogY29sb3JGb3JMYWJlbChuYW1lLCB0aGlzLnByZXNldFNldCksIHNvdXJjZTogJ3VzZXInIH0pO1xuICAgIH1cbiAgICB0aGlzLmFwcGx5Q2xhc3NUb1NlbGVjdGVkKG5hbWUpO1xuICAgIHRoaXMuYnVsa0NsYXNzID0gbmFtZTtcbiAgICB0aGlzLm5ld0J1bGtDbGFzcyA9ICcnO1xuICAgIHRoaXMub3ZlcmxheVBhbmVsPy5oaWRlKCk7XG4gIH1cblxuICAvLyDilIDilIAgTWFuYWdlLWNsYXNzZXMgZGlhbG9nIOKUgOKUgFxuICBwcm90ZWN0ZWQgb3Blbk1hbmFnZURpYWxvZygpOiB2b2lkIHtcbiAgICB0aGlzLnByZXNldERyYWZ0ID0gdGhpcy5jbG9uZVByZXNldFNldCh0aGlzLnByZXNldFNldCk7XG4gICAgdGhpcy5zaG93TWFuYWdlRGlhbG9nID0gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIGNsb25lUHJlc2V0U2V0KHM6IFByZXNldFNldCk6IFByZXNldFNldCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsYXNzZXM6IChzLmNsYXNzZXMgPz8gW10pLm1hcCgoYykgPT4gKHsgLi4uYyB9KSksXG4gICAgICBmYWxsYmFja1BhbGV0dGU6IFsuLi4ocy5mYWxsYmFja1BhbGV0dGUgPz8gW10pXSxcbiAgICAgIGF1dG9Qcm9tb3RlOiAhIXMuYXV0b1Byb21vdGUsXG4gICAgICBtYXRjaE1vZGU6IHMubWF0Y2hNb2RlID09PSAnbm9ybWFsaXplZCcgPyAnbm9ybWFsaXplZCcgOiAnZXhhY3QnLFxuICAgIH07XG4gIH1cbiAgLyoqIENvbW1pdCB0aGUgZHJhZnQ6IGRyb3AgYmxhbmsvZHVwbGljYXRlIG5hbWVzLCBwZXJzaXN0LCBhbmQgcmVjb2xvdXJcbiAgICogIG5vbi1vdmVycmlkZGVuIHJlZ2lvbnMgd2l0aCB0aGUgdXBkYXRlZCBwcmVzZXRzLiAqL1xuICBwcm90ZWN0ZWQgYXBwbHlNYW5hZ2VEaWFsb2coY2xvc2U6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucHJlc2V0RHJhZnQpIHJldHVybjtcbiAgICAvLyBEZS1kdXBsaWNhdGUgdXNpbmcgdGhlIGFjdGl2ZSBtYXRjaCBtb2RlJ3Mga2V5IHNvIG5vcm1hbGl6ZWQgbW9kZSBjYW4ndCBrZWVwXG4gICAgLy8gYm90aCBcIlR1bW9yXCIgYW5kIFwidHVtb3JcIiAod2hpY2ggd291bGQgY29sbGlkZSBhdCBydW50aW1lIGluIGZpbmRQcmVzZXQoKSkuXG4gICAgY29uc3QgZHJhZnQgPSB0aGlzLnByZXNldERyYWZ0O1xuICAgIGNvbnN0IGtleU9mID0gKHM6IHN0cmluZykgPT4gcHJlc2V0S2V5KGRyYWZ0LCBzKTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgY2xhc3NlczogQ2xhc3NQcmVzZXRbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgYyBvZiBkcmFmdC5jbGFzc2VzKSB7XG4gICAgICBjb25zdCBuYW1lID0gKGMubmFtZSA/PyAnJykudHJpbSgpO1xuICAgICAgY29uc3Qga2V5ID0ga2V5T2YobmFtZSk7XG4gICAgICBpZiAoIW5hbWUgfHwgc2Vlbi5oYXMoa2V5KSkgY29udGludWU7XG4gICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgY2xhc3Nlcy5wdXNoKHsgLi4uYywgbmFtZSB9KTtcbiAgICB9XG4gICAgdGhpcy5wcmVzZXREcmFmdCA9IHsgLi4uZHJhZnQsIGNsYXNzZXMgfTtcbiAgICAvLyBDbGFzc2VzIGRyb3BwZWQgaW4gdGhlIGRpYWxvZzogdGhlaXIgcmVnaW9ucyByZXZlcnQgdG8gdGhlIGRlZmF1bHQgXCJSZWdpb25cIlxuICAgIC8vIGNsYXNzIChlbHNlIHN5bmNDbGFzc2VzRnJvbVJlZ2lvbnMgd291bGQganVzdCByZS1hZGQgdGhlbSkgKGppdC11aSM3MCkuXG4gICAgY29uc3Qga2VwdCA9IG5ldyBTZXQoY2xhc3Nlcy5tYXAoKGMpID0+IGtleU9mKGMubmFtZSkpKTtcbiAgICBjb25zdCByZW1vdmVkID0gdGhpcy5wcmVzZXRTZXQuY2xhc3Nlcy5tYXAoKGMpID0+IGMubmFtZSkuZmlsdGVyKChuKSA9PiAha2VwdC5oYXMoa2V5T2YobikpKTtcbiAgICB0aGlzLnJlYXNzaWduUmVnaW9uc1RvRGVmYXVsdENsYXNzKHJlbW92ZWQpO1xuICAgIHRoaXMucmVnaW9uQXBpLnNldFByZXNldFNldCh0aGlzLnByZXNldERyYWZ0KTtcbiAgICB0aGlzLmNvbW1pdCgpOyAvLyByZWNvbG91ciBleGlzdGluZyAobm9uLW92ZXJyaWRkZW4pIHJlZ2lvbnMgZnJvbSB0aGUgbmV3IHByZXNldHNcbiAgICBpZiAoY2xvc2UpIHRoaXMuc2hvd01hbmFnZURpYWxvZyA9IGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCByZXNldFByZXNldHNUb0RlZmF1bHRzKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQXBpLnJlc2V0UHJlc2V0cygpO1xuICAgIHRoaXMucHJlc2V0RHJhZnQgPSB0aGlzLmNsb25lUHJlc2V0U2V0KHRoaXMucmVnaW9uQXBpLmdldFByZXNldFNldCgpKTtcbiAgICB0aGlzLmNvbW1pdCgpO1xuICB9XG4gIHByb3RlY3RlZCBleHBvcnRQcmVzZXRzKCk6IHZvaWQge1xuICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeSh0aGlzLmNsb25lUHJlc2V0U2V0KHRoaXMucmVnaW9uQXBpLmdldFByZXNldFNldCgpKSwgbnVsbCwgMik7XG4gICAgc2F2ZUFzKG5ldyBCbG9iKFtqc29uXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vanNvbicgfSksICdhbm5vdGF0aW9uLWNsYXNzZXMuanNvbicpO1xuICB9XG4gIHByb3RlY3RlZCBpbXBvcnRQcmVzZXRzKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIHRoaXMucGVyc2lzdGVuY2UucmVhZENob3NlbkZpbGUoZXZlbnQsICh0ZXh0KSA9PiB0aGlzLmFwcGx5SW1wb3J0ZWRQcmVzZXRzKHRleHQpKTtcbiAgfVxuXG4gIC8qKiBWYWxpZGF0ZSBhbmQgYXBwbHkgYW4gaW1wb3J0ZWQgYW5ub3RhdGlvbi1jbGFzc2VzIEpTT04gZmlsZS4gKi9cbiAgcHJpdmF0ZSBhcHBseUltcG9ydGVkUHJlc2V0cyh0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2V0ID0gcGFyc2VQcmVzZXRTZXQoSlNPTi5wYXJzZSh0ZXh0KSk7XG4gICAgICBpZiAoIXNldCkgdGhyb3cgbmV3IEVycm9yKCdUaGUgZmlsZSBpcyBub3QgYW4gYW5ub3RhdGlvbi1jbGFzcyBsaXN0IChubyB2YWxpZCBjbGFzc2VzKS4nKTtcbiAgICAgIHRoaXMucmVnaW9uQXBpLnNldFByZXNldFNldChzZXQpO1xuICAgICAgdGhpcy5wcmVzZXREcmFmdCA9IHRoaXMuY2xvbmVQcmVzZXRTZXQodGhpcy5yZWdpb25BcGkuZ2V0UHJlc2V0U2V0KCkpO1xuICAgICAgdGhpcy5jb21taXQoKTtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAga2V5OiBWSVpfVE9BU1RfS0VZLFxuICAgICAgICBzZXZlcml0eTogJ3N1Y2Nlc3MnLFxuICAgICAgICBzdW1tYXJ5OiAnQ2xhc3NlcyBpbXBvcnRlZCcsXG4gICAgICAgIGRldGFpbDogJ0Fubm90YXRpb24gY2xhc3NlcyBsb2FkZWQuJyxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICBrZXk6IFZJWl9UT0FTVF9LRVksXG4gICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICBzdW1tYXJ5OiAnSW1wb3J0IGZhaWxlZCcsXG4gICAgICAgIGRldGFpbDogYCR7KGVyciBhcyBFcnJvcik/Lm1lc3NhZ2UgPz8gZXJyfWAsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5jaGFuZ2VkKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaW1wb3J0Um9pcyhldmVudDogRXZlbnQpIHtcbiAgICB0aGlzLnBlcnNpc3RlbmNlLnJlYWRDaG9zZW5GaWxlKGV2ZW50LCAodGV4dCkgPT4gdm9pZCB0aGlzLmFwcGx5SW1wb3J0ZWRSb2lzKHRleHQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIHRoZSByZWdpb25zIHdpdGggYW4gaW1wb3J0ZWQgR2VvSlNPTiBmaWxlJ3MsIGFuZCB0aGUgc2xpY2UncyByZWdpb24gc291cmNlIHdpdGggdGhlbS5cbiAgICogQSBsYXJnZSBmaWxlIGJlY29tZXMgdGhlIHNsaWNlJ3MgcmVnaW9uIHNvdXJjZSBpbnN0ZWFkIChkcmF3biBieSBsZXZlbCBvZiBkZXRhaWw7IGxpc3RlZCBhYm92ZVxuICAgKiB0aGUgdGFibGUpLCB0aGUgdGFibGUgZW1wdGllZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXBwbHlJbXBvcnRlZFJvaXModGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLnJlZ2lvbkFwaS5pbXBvcnRSZWdpb25Tb3VyY2U/Lih0ZXh0KSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkUmVnaW9ucyA9IFtdO1xuICAgICAgICB0aGlzLnBhZ2luYXRvckZpcnN0ID0gMDtcbiAgICAgICAgdGhpcy5jb21taXQoW10pO1xuICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlZCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBQYXJzZWQgZmlyc3Q6IGEgZmlsZSB0aGF0IGlzIG5vdCBHZW9KU09OIGxlYXZlcyB0aGUgc291cmNlIGFsb25lLlxuICAgICAgY29uc3QgcmVnaW9ucyA9IHRoaXMucmVnaW9uQXBpLmltcG9ydFJlZ2lvbnModGV4dCk7XG4gICAgICBhd2FpdCB0aGlzLnJlZ2lvbkFwaS5kcm9wUmVnaW9uU291cmNlPy4oKTtcbiAgICAgIHRoaXMucmVnaW9ucyA9IHJlZ2lvbnM7XG4gICAgICB0aGlzLmZpbGxDbGFzc0NvbG9ycygpO1xuICAgICAgdGhpcy5jb21taXQoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAga2V5OiBWSVpfVE9BU1RfS0VZLFxuICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgc3VtbWFyeTogJ0Vycm9yIGltcG9ydGluZyB0aGUgZmlsZScsXG4gICAgICAgIGRldGFpbDogYCR7KGVyciBhcyBFcnJvcik/Lm1lc3NhZ2UgPz8gZXJyfWAsXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHJlYWRpbmcgdGhlIGZpbGU6JywgZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKiogUmVnaW9ucyB0byBzZXJpYWxpemUgb24gc2F2ZS9leHBvcnQgKGV2ZXJ5IHNsaWNlIGZvciBhIGNvbWJpbmVkIHotc3RhY2spLiAqL1xuICBwcml2YXRlIHJlZ2lvbnNGb3JTYXZlKCk6IFJlZ2lvbltdIHtcbiAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZS5yZWdpb25zRm9yU2F2ZSh0aGlzLnJlZ2lvbnMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGV4cG9ydFJvaXMoKSB7XG4gICAgaWYgKCF0aGlzLnJlZ2lvbnNGb3JTYXZlKCkubGVuZ3RoICYmICF0aGlzLmhhc1JlZ2lvblNvdXJjZSkgcmV0dXJuO1xuICAgIHRoaXMuZXhwb3J0RmlsZW5hbWUgPSB0aGlzLnBlcnNpc3RlbmNlLmRlZmF1bHRFeHBvcnROYW1lKCk7XG4gICAgdGhpcy5zaG93RXhwb3J0RGlhbG9nID0gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25maXJtRXhwb3J0KCkge1xuICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5leHBvcnRGaWxlbmFtZS50cmltKCk7XG4gICAgY29uc3QgcmVnaW9ucyA9IHRoaXMucmVnaW9uc0ZvclNhdmUoKTtcbiAgICBpZiAoIWZpbGVuYW1lIHx8ICghcmVnaW9ucy5sZW5ndGggJiYgIXRoaXMuaGFzUmVnaW9uU291cmNlKSkgcmV0dXJuO1xuICAgIHRoaXMuc2hvd0V4cG9ydERpYWxvZyA9IGZhbHNlO1xuICAgIHRoaXMucGVyc2lzdGVuY2VcbiAgICAgIC5kb3dubG9hZChyZWdpb25zLCBmaWxlbmFtZSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiB0aGlzLnRvYXN0KCdlcnJvcicsICdFcnJvciBleHBvcnRpbmcgcmVnaW9ucycsIGAkeyhlcnIgYXMgRXJyb3IpPy5tZXNzYWdlID8/IGVycn1gKSk7XG4gIH1cblxuICAvKiogT3BlbiB0aGUgXCJTYXZlIG1hc2tcIiBkaWFsb2csIHNlZWRlZCB3aXRoIGA8aW1hZ2Utc3RlbT5fbWFzay5wbmdgLiAqL1xuICBwcm90ZWN0ZWQgb3BlblNhdmVNYXNrRGlhbG9nKCkge1xuICAgIGlmICghdGhpcy5yZWdpb25zLmxlbmd0aCkgcmV0dXJuO1xuICAgIHRoaXMuc2F2ZU1hc2tGaWxlbmFtZSA9IHRoaXMucGVyc2lzdGVuY2UuZGVmYXVsdE1hc2tOYW1lKCk7XG4gICAgdGhpcy5tYXNrTW9kZSA9ICdiaW5hcnknO1xuICAgIHRoaXMuc2hvd1NhdmVNYXNrRGlhbG9nID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSYXN0ZXJpemUgdGhlIHJlZ2lvbnMgdG8gdGhlIGNob3NlbiBtYXNrIHR5cGUgYW5kIGRvd25sb2FkIGFzIGEgUE5HLiBUaGVcbiAgICogaGVhdnkgd29yayBydW5zIGluIGEgV2ViIFdvcmtlciAoe0BsaW5rIE1hc2tFeHBvcnRTZXJ2aWNlfSkgc28gdGhlIFVJIG5ldmVyXG4gICAqIGZyZWV6ZXMgb24gd2hvbGUtc2xpZGUgaW1hZ2VzIGFuZCB0aGUgam9iIGNhbiBiZSBjYW5jZWxsZWQgKGppdC11aSM5NSk7XG4gICAqIHRoZSBkaWFsb2cgc3RheXMgb3BlbiB3aXRoIGEgcHJvZ3Jlc3MgYmFyIHVudGlsIGRvbmUuXG4gICAqL1xuICBwcm90ZWN0ZWQgY29uZmlybVNhdmVNYXNrKCkge1xuICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5zYXZlTWFza0ZpbGVuYW1lLnRyaW0oKTtcbiAgICBpZiAoIWZpbGVuYW1lIHx8ICF0aGlzLnJlZ2lvbnMubGVuZ3RoIHx8IHRoaXMubWFza0J1c3kpIHJldHVybjtcblxuICAgIGNvbnN0IHNpemUgPSB0aGlzLnJlZ2lvbkFwaS5nZXRNYXNrSW1hZ2VTaXplKCk7XG4gICAgaWYgKCFzaXplKSB7XG4gICAgICB0aGlzLm1hc2tFcnJvcignTm8gaW1hZ2Ugc2l6ZSBpcyBhdmFpbGFibGUsIHNvIHRoZSBtYXNrIGNhbm5vdCBiZSBzaXplZC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5tYXNrQnVzeSA9IHRydWU7XG4gICAgdGhpcy5tYXNrRW5jb2RpbmcgPSBmYWxzZTtcbiAgICB0aGlzLm1hc2tQcm9ncmVzcyA9IDA7XG4gICAgdGhpcy5tYXNrSm9iID0gdGhpcy5tYXNrRXhwb3J0XG4gICAgICAuZXhwb3J0KHtcbiAgICAgICAgcmVnaW9uczogdGhpcy5yZWdpb25zLFxuICAgICAgICBpbWFnZVNpemU6IHNpemUsXG4gICAgICAgIG1vZGU6IHRoaXMubWFza01vZGUsXG4gICAgICAgIHNvdXJjZU5hbWU6IHRoaXMucGVyc2lzdGVuY2Uuc2VsZWN0ZWRGaWxlTmFtZSgpLFxuICAgICAgfSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoZSkgPT4ge1xuICAgICAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgICAgIHN3aXRjaCAoZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdwbGFubmVkJzpcbiAgICAgICAgICAgICAgaWYgKGUuc2NhbGUgPCAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgICAgICAgICAga2V5OiBWSVpfVE9BU1RfS0VZLFxuICAgICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdpbmZvJyxcbiAgICAgICAgICAgICAgICAgIHN1bW1hcnk6ICdNYXNrIGRvd25zY2FsZWQnLFxuICAgICAgICAgICAgICAgICAgZGV0YWlsOiBgSW1hZ2UgdG9vIGxhcmdlIGZvciBhIGZ1bGwtcmVzb2x1dGlvbiBtYXNrOyBzYXZpbmcgYXQgJHtlLndpZHRofcOXJHtlLmhlaWdodH0uYCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3Byb2dyZXNzJzpcbiAgICAgICAgICAgICAgdGhpcy5tYXNrUHJvZ3Jlc3MgPSBlLnBlcmNlbnQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZW5jb2RpbmcnOlxuICAgICAgICAgICAgICB0aGlzLm1hc2tFbmNvZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZG9uZSc6XG4gICAgICAgICAgICAgIHRoaXMuZmluaXNoTWFzayhlLmJsb2IsIGZpbGVuYW1lKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycjogRXJyb3IpID0+IHtcbiAgICAgICAgICB0aGlzLm1hc2tFcnJvcihlcnIubWVzc2FnZSk7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKiBDYW5jZWwgYW4gaW4tcHJvZ3Jlc3MgbWFzayBleHBvcnQgKHRlcm1pbmF0ZXMgaXRzIHdvcmtlcikgYW5kIHJlc2V0IHN0YXRlLiAqL1xuICBwcm90ZWN0ZWQgY2FuY2VsU2F2ZU1hc2soKSB7XG4gICAgdGhpcy5tYXNrSm9iPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMubWFza0pvYiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm1hc2tCdXN5ID0gZmFsc2U7XG4gICAgdGhpcy5tYXNrRW5jb2RpbmcgPSBmYWxzZTtcbiAgICB0aGlzLm1hc2tQcm9ncmVzcyA9IDA7XG4gIH1cblxuICBwcml2YXRlIGZpbmlzaE1hc2soYmxvYjogQmxvYiwgZmlsZW5hbWU6IHN0cmluZykge1xuICAgIHRoaXMubWFza0pvYiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm1hc2tCdXN5ID0gZmFsc2U7XG4gICAgdGhpcy5tYXNrRW5jb2RpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnNob3dTYXZlTWFza0RpYWxvZyA9IGZhbHNlO1xuICAgIHNhdmVBcyhibG9iLCBmaWxlbmFtZSk7XG4gIH1cblxuICBwcml2YXRlIG1hc2tFcnJvcihkZXRhaWw6IHN0cmluZykge1xuICAgIHRoaXMubWFza0pvYiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm1hc2tCdXN5ID0gZmFsc2U7XG4gICAgdGhpcy5tYXNrRW5jb2RpbmcgPSBmYWxzZTtcbiAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICBrZXk6IFZJWl9UT0FTVF9LRVksXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIHN1bW1hcnk6ICdDb3VsZCBub3QgY3JlYXRlIG1hc2snLFxuICAgICAgZGV0YWlsLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBlcnNpc3RSZWdpb25zKCkge1xuICAgIC8vIEZvbGRlciBzdGFjazogd3JpdGUgZWFjaCBzbGljZSdzIHJlZ2lvbnMgYmFjayB0byBpdHMgb3duIHNsaWNlLWZpbGUnc1xuICAgIC8vIHNpYmxpbmcgZ2VvanNvbiDigJQgbm8gc2luZ2xlLWZpbGVuYW1lIHByb21wdCAoaml0LXVpIzkzKS5cbiAgICBpZiAodGhpcy5wZXJzaXN0ZW5jZS5zYXZlc1BlclNsaWNlKCkpIHtcbiAgICAgIHRoaXMuc2F2ZVN0YWNrU2xpY2VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5wZXJzaXN0ZW5jZS5kZWZhdWx0U2F2ZU5hbWUoKTtcbiAgICBpZiAoIWZpbGVuYW1lIHx8ICghdGhpcy5yZWdpb25zRm9yU2F2ZSgpLmxlbmd0aCAmJiAhdGhpcy5oYXNSZWdpb25Tb3VyY2UpKSByZXR1cm47XG5cbiAgICB0aGlzLnNhdmVBc0ZpbGVuYW1lID0gZmlsZW5hbWU7XG4gICAgdGhpcy5zYXZlQXNGaWxlRXhpc3RzID0gZmFsc2U7XG4gICAgdGhpcy5zaG93U2F2ZUFzRGlhbG9nID0gdHJ1ZTtcbiAgICB0aGlzLnNhdmVBc0NoZWNrJC5uZXh0KHRoaXMuc2F2ZUFzRmlsZW5hbWUpO1xuICB9XG5cbiAgLyoqIFNhdmUgYSBmb2xkZXIgc3RhY2sncyByZWdpb25zIGFzIG9uZSBnZW9qc29uIHBlciBzbGljZS1maWxlIChqaXQtdWkjOTMpLlxuICAgKiAgTm8gZGlhbG9nIGNvdmVycyB0aGUgdG9vbGJhciBtZWFud2hpbGUsIHNvIGEgU2F2ZSB3aGlsZSBvbmUgaXMgdXBsb2FkaW5nXG4gICAqICBpcyBpZ25vcmVkIHJhdGhlciB0aGFuIHN0YXJ0aW5nIGEgc2Vjb25kIHdyaXRlIChhbmQgb3JwaGFuaW5nIHRoZSBmaXJzdCkuICovXG4gIHByaXZhdGUgYXN5bmMgc2F2ZVN0YWNrU2xpY2VzKCkge1xuICAgIGlmICh0aGlzLnNhdmVBc0J1c3kpIHJldHVybjtcbiAgICB0aGlzLnNhdmVBc0J1c3kgPSB0cnVlO1xuICAgIGxldCBzbGljZXM6IFNsaWNlR2VvSnNvbltdO1xuICAgIHRyeSB7XG4gICAgICBzbGljZXMgPSBhd2FpdCB0aGlzLnBlcnNpc3RlbmNlLnNsaWNlR2VvSnNvbnMoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuc2F2ZUFzQnVzeSA9IGZhbHNlO1xuICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICB0aGlzLnRvYXN0KCdlcnJvcicsICdFcnJvciBzYXZpbmcgcmVnaW9ucycsIGAkeyhlcnIgYXMgRXJyb3IpPy5tZXNzYWdlID8/IGVycn1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQ2FuY2VsbGVkIHdoaWxlIHRoZSBzbGljZXMgc2VyaWFsaXplZCwgb3Igbm90aGluZyB0byB3cml0ZS5cbiAgICBpZiAoIXRoaXMuc2F2ZUFzQnVzeSB8fCAhc2xpY2VzLmxlbmd0aCkge1xuICAgICAgdGhpcy5zYXZlQXNCdXN5ID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3NhdmVBc1N1YiA9IHRoaXMucGVyc2lzdGVuY2Uuc2F2ZVNsaWNlcyhzbGljZXMpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2F2ZUFzQnVzeSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgICAgdGhpcy50b2FzdChcbiAgICAgICAgICAnc3VjY2VzcycsXG4gICAgICAgICAgJ1JlZ2lvbnMgc2F2ZWQnLFxuICAgICAgICAgIGBTYXZlZCBST0lzIGZvciAke3NsaWNlcy5sZW5ndGh9IHNsaWNlJHtzbGljZXMubGVuZ3RoID09PSAxID8gJycgOiAncyd9YCxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICB0aGlzLnNhdmVBc0J1c3kgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICAgIHRoaXMudG9hc3QoJ2Vycm9yJywgJ0Vycm9yIHNhdmluZyByZWdpb25zJywgYCR7KGVyciBhcyBFcnJvcik/Lm1lc3NhZ2UgPz8gZXJyfWApO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja1NhdmVBc0ZpbGVFeGlzdHMoKSB7XG4gICAgdGhpcy5zYXZlQXNDaGVjayQubmV4dCh0aGlzLnNhdmVBc0ZpbGVuYW1lKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25maXJtU2F2ZUFzKCkge1xuICAgIGlmICghdGhpcy5wZXJzaXN0ZW5jZS5zZWxlY3RlZEZpbGVOYW1lKCkpIHJldHVybjtcblxuICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5zYXZlQXNGaWxlbmFtZS50cmltKCk7XG4gICAgaWYgKCFmaWxlbmFtZSkgcmV0dXJuO1xuXG4gICAgLy8gS2VlcCB0aGUgZGlhbG9nIG9wZW4gc2hvd2luZyBhbiAoaW5kZXRlcm1pbmF0ZSkgcHJvZ3Jlc3MgYmFyIHdoaWxlIHRoZVxuICAgIC8vIHJlZ2lvbnMgc2VyaWFsaXplIGFuZCB1cGxvYWQsIHRoZW4gY2xvc2Ugb24gc3VjY2Vzcy5cbiAgICBjb25zdCBkb1NhdmUgPSAoKSA9PiB7XG4gICAgICB0aGlzLnNhdmVBc0J1c3kgPSB0cnVlO1xuICAgICAgLy8gQWxzbyBydW4gZnJvbSB0aGUgb3ZlcndyaXRlIGNvbmZpcm1hdGlvbiwgd2hpY2ggdGhlIGhvc3QncyBkaWFsb2cgbWF5IGFuc3dlci5cbiAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgdGhpcy5fc2F2ZUFzU3ViID0gdGhpcy5wZXJzaXN0ZW5jZVxuICAgICAgICAuc2F2ZSgoKSA9PiB0aGlzLnJlZ2lvbnNGb3JTYXZlKCksIGZpbGVuYW1lKVxuICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNhdmVBc0J1c3kgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc2hvd1NhdmVBc0RpYWxvZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICAgICAgICB0aGlzLnRvYXN0KCdzdWNjZXNzJywgJ1JlZ2lvbnMgc2F2ZWQnLCBgU2F2ZWQgYXMgJHtmaWxlbmFtZX1gKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNhdmVBc0J1c3kgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgICAgICAgdGhpcy50b2FzdCgnZXJyb3InLCAnRXJyb3Igc2F2aW5nIHJlZ2lvbnMnLCBgJHsoZXJyIGFzIEVycm9yKT8ubWVzc2FnZSB8fCBlcnJ9YCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGlmICh0aGlzLnNhdmVBc0ZpbGVFeGlzdHMpIHtcbiAgICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcbiAgICAgICAgbWVzc2FnZTogYFwiJHtmaWxlbmFtZX1cIiBhbHJlYWR5IGV4aXN0cy4gRG8geW91IHdhbnQgdG8gb3ZlcndyaXRlIGl0P2AsXG4gICAgICAgIGhlYWRlcjogJ0NvbmZpcm0gT3ZlcndyaXRlJyxcbiAgICAgICAgaWNvbjogJ3BpIHBpLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJyxcbiAgICAgICAgYWNjZXB0OiBkb1NhdmUsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9TYXZlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENhbmNlbCBhbiBpbi1wcm9ncmVzcyBHZW9KU09OIHBlcnNpc3Q6IGFib3J0IHRoZSBkZWZlcnJlZCBzZXJpYWxpemUgYW5kL29yXG4gICAqICB0aGUgaW4tZmxpZ2h0IHVwbG9hZCwgYW5kIHJlc2V0IHN0YXRlLiAqL1xuICBwcm90ZWN0ZWQgY2FuY2VsU2F2ZUFzKCkge1xuICAgIHRoaXMuX3NhdmVBc1N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9zYXZlQXNTdWIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5zYXZlQXNCdXN5ID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHRvYXN0KHNldmVyaXR5OiAnc3VjY2VzcycgfCAnZXJyb3InIHwgJ2luZm8nLCBzdW1tYXJ5OiBzdHJpbmcsIGRldGFpbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBrZXk6IFZJWl9UT0FTVF9LRVksIHNldmVyaXR5LCBzdW1tYXJ5LCBkZXRhaWwgfSk7XG4gIH1cbn1cbiIsIjxwLXRvb2xiYXIgc3R5bGVDbGFzcz1cInJlZ2lvbi10b29sYmFyXCI+XG4gIDxkaXYgY2xhc3M9XCJwLXRvb2xiYXItZ3JvdXAtc3RhcnQgYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtd3JhcCBnYXAtMVwiPlxuICAgIDxwLWJ1dHRvblxuICAgICAgaWNvbj1cInBpIHBpLXRhZ1wiXG4gICAgICBzaXplPVwic21hbGxcIlxuICAgICAgW3RleHRdPVwiIXNob3dTaGFwZUxhYmVsXCJcbiAgICAgIHBUb29sdGlwPVwiU2hvdyByZWdpb24gbGFiZWxzLlwiXG4gICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxuICAgICAgKG9uQ2xpY2spPVwic2hvd1NoYXBlTGFiZWwgPSAhc2hvd1NoYXBlTGFiZWw7IGNoYW5nZVNob3dTaGFwZUxhYmVsKHNob3dTaGFwZUxhYmVsKVwiXG4gICAgPlxuICAgIDwvcC1idXR0b24+XG4gICAgPHAtYnV0dG9uXG4gICAgICBpY29uPVwicGkgcGktc3RvcC1jaXJjbGVcIlxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgIFt0ZXh0XT1cIiFyZWdpb25zRmlsbGVkXCJcbiAgICAgIHBUb29sdGlwPVwiRmlsbCByZWdpb25zIGluIHRoZWlyIGNvbG91ciAoYW4gYXRsYXMncyBsb29rKTsgbGFiZWxzIHNpdCBpbnNpZGUuXCJcbiAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXG4gICAgICBhcmlhTGFiZWw9XCJGaWxsIHJlZ2lvbnNcIlxuICAgICAgKG9uQ2xpY2spPVwidG9nZ2xlRmlsbCgpXCJcbiAgICA+XG4gICAgPC9wLWJ1dHRvbj5cbiAgICA8cC1idXR0b25cbiAgICAgICpuZ0lmPVwidm9sdW1lVmlld1wiXG4gICAgICBpY29uPVwicGkgcGktZXllXCJcbiAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICBbdGV4dF09XCIhcmVnaW9uc1Rocm91Z2hWb2x1bWVcIlxuICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cInJlZ2lvbnNUaHJvdWdoVm9sdW1lXCJcbiAgICAgIHBUb29sdGlwPVwiU2VlIHRoZSByZWdpb25zIHRocm91Z2ggdGhlIHZvbHVtZS4gT2ZmLCB0aGUgdm9sdW1lIGhpZGVzIHRoZSBwYXJ0cyBvZiB0aGVtIGJlaGluZCB3aGF0IGl0IHNob3dzOyBvbiwgbm9uZSAobGF5ZXJzIHRyYWNlZCBpbnNpZGUgYnJpZ2h0IHN0cnVjdHVyZXMsIHN1Y2ggYXMgYW4gT0NUJ3MpLlwiXG4gICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxuICAgICAgYXJpYUxhYmVsPVwiUmVnaW9ucyB0aHJvdWdoIHZvbHVtZVwiXG4gICAgICAob25DbGljayk9XCJ0b2dnbGVUaHJvdWdoVm9sdW1lKClcIlxuICAgID5cbiAgICA8L3AtYnV0dG9uPlxuICAgIDxzcGFuIGNsYXNzPVwidG9vbGJhci1zZXBhcmF0b3JcIj48L3NwYW4+XG4gICAgPCEtLSBOZXcgcmVnaW9ucyBhcmUgbm93IGNyZWF0ZWQgZnJvbSB0aGUgZGlhZ3JhbSB0b29sYmFyXG4gICAgICAgICAocmVjdGFuZ2xlLCBwb2x5bGluZSwgZnJlZWZvcm0sIHdhbmQpLiAtLT5cbiAgICA8cC1idXR0b25cbiAgICAgIGljb249XCJwaSBwaS11cGxvYWRcIlxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgIFt0ZXh0XT1cInRydWVcIlxuICAgICAgc3R5bGVDbGFzcz1cIm1yLTJcIlxuICAgICAgcFRvb2x0aXA9XCJVcGxvYWQgYW5kIGRpc3BsYXkgcmVnaW9ucyBmcm9tIGdlb2pzb24gZmlsZS5cIlxuICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgIChjbGljayk9XCJyb2lGaWxlSW5wdXQuY2xpY2soKVwiXG4gICAgPlxuICAgIDwvcC1idXR0b24+XG4gICAgPGlucHV0XG4gICAgICAjcm9pRmlsZUlucHV0XG4gICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICBhY2NlcHQ9XCIuZ2VvanNvbiwuanNvblwiXG4gICAgICBoaWRkZW5cbiAgICAgIChjaGFuZ2UpPVwiaW1wb3J0Um9pcygkZXZlbnQpOyByb2lGaWxlSW5wdXQudmFsdWUgPSAnJ1wiXG4gICAgLz5cbiAgICA8cC1idXR0b25cbiAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICBbdGV4dF09XCJ0cnVlXCJcbiAgICAgIHN0eWxlQ2xhc3M9XCJtci0yXCJcbiAgICAgIHBUb29sdGlwPVwiRG93bmxvYWQgcmVnaW9ucyBhcyBnZW9qc29uIGZpbGUuXCJcbiAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXG4gICAgICBpY29uPVwicGkgcGktZG93bmxvYWRcIlxuICAgICAgKGNsaWNrKT1cImV4cG9ydFJvaXMoKVwiXG4gICAgPlxuICAgIDwvcC1idXR0b24+XG4gICAgPHAtYnV0dG9uXG4gICAgICBpY29uPVwicGkgcGktc2F2ZVwiXG4gICAgICBzaXplPVwic21hbGxcIlxuICAgICAgW3RleHRdPVwidHJ1ZVwiXG4gICAgICBzdHlsZUNsYXNzPVwibXItMlwiXG4gICAgICBwVG9vbHRpcD1cIlNhdmUgcmVnaW9ucyB0byBzZXJ2ZXIuXCJcbiAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXG4gICAgICAoY2xpY2spPVwicGVyc2lzdFJlZ2lvbnMoKVwiXG4gICAgICBbZGlzYWJsZWRdPVwiKCFyZWdpb25zIHx8ICFyZWdpb25zLmxlbmd0aCkgJiYgIWhhc1JlZ2lvblNvdXJjZVwiXG4gICAgPlxuICAgIDwvcC1idXR0b24+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=
1563
+ /**
1564
+ * Whether one GeoJSON file holds a single plane (its regions imported as they always were). One
1565
+ * that does not parse is taken as one too, so the regions import reports it as it always has.
1566
+ */
1567
+ function onePlane(text) {
1568
+ try {
1569
+ return splitByPlane(text).length === 1;
1570
+ }
1571
+ catch {
1572
+ return true;
1573
+ }
1574
+ }
1575
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLWVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1lZGl0b3IvcmVnaW9uLWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1lZGl0b3IvcmVnaW9uLWVkaXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBR0wsU0FBUyxFQUNULE1BQU0sRUFDTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFB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O1FBQ1AsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBEZXN0cm95UmVmLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgVmlld0NoaWxkLFxuICBpbmplY3QsXG4gIE5nWm9uZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBtYXJrRm9yQ2hlY2tJblpvbmUgfSBmcm9tICcuLi91dGlsL21hcmstZm9yLWNoZWNrJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYnV0dG9uJztcbmltcG9ydCB7IENvbmZpcm1EaWFsb2dNb2R1bGUgfSBmcm9tICdwcmltZW5nL2NvbmZpcm1kaWFsb2cnO1xuaW1wb3J0IHsgRHJvcGRvd25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2Ryb3Bkb3duJztcbmltcG9ydCB7IElucHV0VGV4dE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvaW5wdXR0ZXh0JztcbmltcG9ydCB7IE92ZXJsYXlQYW5lbCwgT3ZlcmxheVBhbmVsTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9vdmVybGF5cGFuZWwnO1xuaW1wb3J0IHsgVG9vbGJhck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdG9vbGJhcic7XG5pbXBvcnQgeyBUb29sdGlwTW9kdWxlIH0gZnJvbSAncHJpbWVuZy90b29sdGlwJztcbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gJ2ZpbGUtc2F2ZXInO1xuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFJlY3RhbmdsZSwgUmVnaW9uIH0gZnJvbSAnLi4vbW9kZWxzL3JlZ2lvbic7XG5pbXBvcnQgeyB3aXRoUmVnaW9uUGF0Y2ggfSBmcm9tICcuLi9tb2RlbHMvcmVnaW9uLWNsb25lJztcbmltcG9ydCB7IFByZXNldFNldCwgQ2xhc3NQcmVzZXQsIGRlZmF1bHRQcmVzZXRTZXQsIHBhcnNlUHJlc2V0U2V0IH0gZnJvbSAnLi4vbW9kZWxzL2NsYXNzLXByZXNldCc7XG5pbXBvcnQgeyBjb2xvckZvckxhYmVsLCBwcmVzZXRLZXkgfSBmcm9tICcuLi9zdG9yZS9jbGFzcy1jb2xvci51dGlsJztcbmltcG9ydCB7IENvbmZpcm1hdGlvblNlcnZpY2UsIE1lc3NhZ2VTZXJ2aWNlLCBTaGFyZWRNb2R1bGUgfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQgeyBJUmVnaW9uRWRpdG9yQXBpLCBSRUdJT05fRURJVE9SX0FQSSB9IGZyb20gJy4uL2NvbnRyYWN0cy9yZWdpb24tZWRpdG9yLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBWSVpfVE9BU1RfS0VZIH0gZnJvbSAnLi4vdG9hc3Qtb3V0bGV0cyc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgb3Blbkh0dHBSZWdpb25Tb3VyY2UgfSBmcm9tICcuLi9yZWdpb24tc291cmNlL2h0dHAtcmVnaW9uLXNvdXJjZSc7XG5pbXBvcnQgeyBSZWdpb25JbXBvcnRGaWxlLCBpbXBvcnRGaWxlLCBwbGFuUmVnaW9uSW1wb3J0IH0gZnJvbSAnLi4vcmVnaW9uLWltcG9ydC9yZWdpb24taW1wb3J0JztcbmltcG9ydCB7IHJlYWRBbm5vdGF0aW9uU2xpY2VzLCBzcGxpdEJ5UGxhbmUgfSBmcm9tICcuLi9yZWdpb24taW1wb3J0L29wZW4tYW5ub3RhdGlvbnMnO1xuaW1wb3J0IHsgaXNaaXBOYW1lIH0gZnJvbSAnLi4vcmVnaW9uLWltcG9ydC96aXAnO1xuaW1wb3J0IHsgUmVnaW9uUGVyc2lzdGVuY2VTZXJ2aWNlLCBTbGljZUdlb0pzb24gfSBmcm9tICcuL3JlZ2lvbi1wZXJzaXN0ZW5jZS5zZXJ2aWNlJztcbmltcG9ydCB7IENsYXNzQ29sb3JFZGl0LCBSZWdpb25Db2xvckRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vcmVnaW9uLWNvbG9yLWRpYWxvZy9yZWdpb24tY29sb3ItZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDbGFzc2VzUGFuZWxDb21wb25lbnQgfSBmcm9tICcuL2NsYXNzZXMtcGFuZWwvY2xhc3Nlcy1wYW5lbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVnaW9uVGFibGVDb21wb25lbnQgfSBmcm9tICcuL3JlZ2lvbi10YWJsZS9yZWdpb24tdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IENsYXNzVHJlZUNvbXBvbmVudCwgQ2xhc3NUcmVlUGljayB9IGZyb20gJy4vY2xhc3MtdHJlZS9jbGFzcy10cmVlLmNvbXBvbmVudCc7XG5pbXBvcnQgdHlwZSB7IFJlZ2lvblNvdXJjZVZpZXcgfSBmcm9tICcuLi9yZWdpb24tc291cmNlL3JlZ2lvbi1zb3VyY2UnO1xuaW1wb3J0IHR5cGUgeyBSZWdpb25DbGFzc05vZGUsIFJlZ2lvbkluZGV4Um93IH0gZnJvbSAnLi4vcmVnaW9uLXNvdXJjZS9yZWdpb24tdGlsZXMnO1xuaW1wb3J0IHsgU2F2ZVJlZ2lvbnNEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL3NhdmUtcmVnaW9ucy1kaWFsb2cvc2F2ZS1yZWdpb25zLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2F2ZU1hc2tEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL3NhdmUtbWFzay1kaWFsb2cvc2F2ZS1tYXNrLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWFuYWdlQ2xhc3Nlc0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vbWFuYWdlLWNsYXNzZXMtZGlhbG9nL21hbmFnZS1jbGFzc2VzLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVnaW9uRWRpdG9ySGVscENvbXBvbmVudCB9IGZyb20gJy4vcmVnaW9uLWVkaXRvci1oZWxwL3JlZ2lvbi1lZGl0b3ItaGVscC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWFza0V4cG9ydFNlcnZpY2UsIE1hc2tNb2RlIH0gZnJvbSAnLi9tYXNrLWV4cG9ydC5zZXJ2aWNlJztcbmltcG9ydCB7IFBpeGVsU2l6ZSwgZm9ybWF0QXJlYSwgcGlja01wcCwgcmVnaW9uQXJlYVB4IH0gZnJvbSAnLi9yZWdpb24tbWV0cmljcyc7XG5cbi8qKlxuICogVGhlIFJlZ2lvbiBFZGl0b3IgKGA8cmVnaW9uLWVkaXRvcj5gKTogdGhlIHRhYmxlIG9mIHRoZSBhY3RpdmUgaW1hZ2Unc1xuICogYW5ub3RhdGlvbiByZWdpb25zIHdpdGggY2xhc3MgcHJlc2V0cywgY29sb3VycywgbGFiZWxzLCBHZW9KU09OIGltcG9ydCAvXG4gKiBleHBvcnQgLyBzZXJ2ZXIgc2F2ZSBhbmQgbWFzayBleHBvcnQuIFNlbGYtY29udGFpbmVkOiBpdCB0YWxrcyB0byB0aGUgdmlld2VyXG4gKiBvbmx5IHRocm91Z2gge0BsaW5rIFJFR0lPTl9FRElUT1JfQVBJfSAoYW5kIHRoZSBob3N0J3MgUkVHSU9OX0lPX1BPUlQpLCBzbyBpdFxuICogaGFzIG5vIGlucHV0cyBvciBvdXRwdXRzLlxuICpcbiAqIE9uUHVzaDogdGVtcGxhdGUgZXZlbnRzIHJlLXJlbmRlciBpdDsgc3RhdGUgdGhhdCBsYW5kcyBhc3luY2hyb25vdXNseSAodGhlXG4gKiBBUEkncyByZWdpb24gLyBzZWxlY3Rpb24gLyBwcmVzZXQgLyBpbWFnZS1tZXRhIHN0cmVhbXMsIHNhdmUgYW5kIG1hc2stZXhwb3J0XG4gKiBwcm9ncmVzcywgZmlsZSByZWFkcykgbWFya3MgaXQgZm9yIGNoZWNrLlxuICovXG4vKiogVGhlIG9wYWNpdHkgdGhlIGZpbGwgdG9nZ2xlIGZpbGxzIHJlZ2lvbnMgYXQuICovXG5jb25zdCBSRUdJT05fRklMTF9PUEFDSVRZID0gMC42O1xuXG4vKiogXCJTZWxlY3QgYWxsXCIgdGFrZXMgYXQgbW9zdCB0aGlzIG1hbnkgcmVnaW9uLXNvdXJjZSBmZWF0dXJlcyBpbnRvIHRoZSByZWdpb25zLiAqL1xuY29uc3QgU0VMRUNUX0FMTF9TT1VSQ0VfTElNSVQgPSA1MDAwO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyZWdpb24tZWRpdG9yJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBTaGFyZWRNb2R1bGUsXG4gICAgQnV0dG9uTW9kdWxlLFxuICAgIENvbmZpcm1EaWFsb2dNb2R1bGUsXG4gICAgRHJvcGRvd25Nb2R1bGUsXG4gICAgSW5wdXRUZXh0TW9kdWxlLFxuICAgIE92ZXJsYXlQYW5lbE1vZHVsZSxcbiAgICBUb29sYmFyTW9kdWxlLFxuICAgIFRvb2x0aXBNb2R1bGUsXG4gICAgQ2xhc3Nlc1BhbmVsQ29tcG9uZW50LFxuICAgIFJlZ2lvblRhYmxlQ29tcG9uZW50LFxuICAgIENsYXNzVHJlZUNvbXBvbmVudCxcbiAgICBTYXZlUmVnaW9uc0RpYWxvZ0NvbXBvbmVudCxcbiAgICBTYXZlTWFza0RpYWxvZ0NvbXBvbmVudCxcbiAgICBSZWdpb25Db2xvckRpYWxvZ0NvbXBvbmVudCxcbiAgICBNYW5hZ2VDbGFzc2VzRGlhbG9nQ29tcG9uZW50LFxuICAgIFJlZ2lvbkVkaXRvckhlbHBDb21wb25lbnQsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9yZWdpb24tZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcmVnaW9uLWVkaXRvci5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgcHJvdmlkZXJzOiBbUmVnaW9uUGVyc2lzdGVuY2VTZXJ2aWNlXSxcbn0pXG5leHBvcnQgY2xhc3MgUmVnaW9uRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKCdvcCcpIHByaXZhdGUgb3ZlcmxheVBhbmVsITogT3ZlcmxheVBhbmVsO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBlZGl0b3IgaXMgb24gc2NyZWVuIChpdHMgZGlhbG9nIG9wZW4pLiBDbG9zZWQsIGl0IGFza3MgdGhlIHJlZ2lvbiBzb3VyY2Ugbm90aGluZzpcbiAgICogaXRzIHBhZ2Ugb2YgZmVhdHVyZXMsIGl0cyBjbGFzcyBjb3VudHMgYW5kLCBpbiBhIHZvbHVtZSB2aWV3LCBpdHMgY2xhc3Nlcycgdm9sdW1lcyBhcmUgZWFjaCBhXG4gICAqIHJlcXVlc3Qgb3ZlciB0aGUgd2hvbGUgc2V0IChhIHN0YWNrJ3MgZXZlcnkgc2xpY2UpLCBhbmQgdGhleSBjb21wZXRlZCB3aXRoIHRoZSB2b2x1bWUncyBvd25cbiAgICogc2xpY2UgbG9hZGluZyBmb3Igbm90aGluZyBhbnlvbmUgY291bGQgc2VlLiBPcGVuZWQsIGl0IHJlYWRzIHRoZW0gYWdhaW4uXG4gICAqL1xuICBASW5wdXQoKSBzZXQgYWN0aXZlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgY29uc3Qgd2FzID0gdGhpcy5pc0FjdGl2ZTtcbiAgICB0aGlzLmlzQWN0aXZlID0gdmFsdWU7XG4gICAgaWYgKHZhbHVlICYmICF3YXMpIHtcbiAgICAgIHZvaWQgdGhpcy5yZWZyZXNoU291cmNlKCk7XG4gICAgICB0aGlzLnJlc2V0Vm9sdW1lcygpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGlzQWN0aXZlID0gdHJ1ZTtcbiAgLyoqIFRoZSBob3N0J3MgSHR0cENsaWVudDogYSBzZXJ2ZWQgcmVnaW9uIHNldCdzIHJlcXVlc3RzIGdvIHRocm91Z2ggaXQgKGl0cyBhdXRoKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBodHRwID0gaW5qZWN0KEh0dHBDbGllbnQsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgcHJvdGVjdGVkIHJlZ2lvbnM6IFJlZ2lvbltdID0gW107XG4gIHByb3RlY3RlZCBzZWxlY3RlZFJlZ2lvbnM6IFJlZ2lvbltdID0gW107XG4gIHByb3RlY3RlZCBzaG93U2hhcGVMYWJlbCE6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBzaGFwZUNvbG9yITogc3RyaW5nO1xuICBwcm90ZWN0ZWQgZmlsbENvbG9yITogc3RyaW5nO1xuICBwcm90ZWN0ZWQgZGlzcGxheUhlbHBEaWFsb2cgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHNob3dDb2xvckRpYWxvZyA9IGZhbHNlO1xuICAvKiogT25lIGNvbG91ciBlZGl0b3IgcGVyIHVuaXF1ZSBjbGFzcyBhbW9uZyB0aGUgc2VsZWN0ZWQgcmVnaW9ucywgc2hvd24gaW4gdGhlXG4gICAqICBcImVkaXQgY29sb3VyIG9mIHNlbGVjdGVkIHJlZ2lvbnNcIiBkaWFsb2cuIFVuY2xhc3NpZmllZCByZWdpb25zIChubyBsYWJlbClcbiAgICogIGFyZSBncm91cGVkIHVuZGVyIGEgc2luZ2xlIGVudHJ5IHdpdGggYW4gZW1wdHkgYGxhYmVsYC4gKi9cbiAgcHJvdGVjdGVkIGNsYXNzQ29sb3JFZGl0czogQ2xhc3NDb2xvckVkaXRbXSA9IFtdO1xuICAvKiogXCJFZGl0IGNsYXNzIG9uIHNlbGVjdGVkIHJvd3NcIiBwb3B1cDogY2hvc2VuIGV4aXN0aW5nIGNsYXNzLCBhbmQgYSBuZXctY2xhc3MgbmFtZS4gKi9cbiAgcHJvdGVjdGVkIGJ1bGtDbGFzcyA9ICcnO1xuICBwcm90ZWN0ZWQgbmV3QnVsa0NsYXNzID0gJyc7XG5cbiAgLy8g4pSA4pSAIGFubm90YXRpb24tY2xhc3MgcHJlc2V0cyAoaml0LXVpIzcwKSDilIDilIBcbiAgLyoqIExvY2FsIG1pcnJvciBvZiB0aGUgcGVyLXVzZXIgcHJlc2V0IHNldCAoY2hpcCBzdHJpcCwgQ2xhc3MgZHJvcGRvd24sIGRpYWxvZykuICovXG4gIHByb3RlY3RlZCBwcmVzZXRTZXQ6IFByZXNldFNldCA9IGRlZmF1bHRQcmVzZXRTZXQoKTtcbiAgLyoqIFRoZSBjbGFzcyBsYXN0IHBpY2tlZCBpbiB0aGUgcGFuZWw7IGEgY2hpcC1jbGljayBhcHBsaWVzIGl0IHRvIHRoZSBzZWxlY3RlZCByb3dzLiAqL1xuICBwcm90ZWN0ZWQgYWN0aXZlQ2xhc3M6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcm90ZWN0ZWQgc2hvd01hbmFnZURpYWxvZyA9IGZhbHNlO1xuICAvKiogV29ya2luZyBjb3B5IGVkaXRlZCBpbnNpZGUgdGhlIE1hbmFnZS1jbGFzc2VzIGRpYWxvZzsgY29tbWl0dGVkIG9uIEFwcGx5L0RvbmUuICovXG4gIHByb3RlY3RlZCBwcmVzZXREcmFmdDogUHJlc2V0U2V0IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBjbGFzcyBuYW1lIChtYXRjaC1tb2RlIGtleWVkKSDihpIgbnVtYmVyIG9mIHJlZ2lvbnMgY3VycmVudGx5IHVzaW5nIGl0LiAqL1xuICBwcm90ZWN0ZWQgY2xhc3NDb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAvKiogRmFsbGJhY2sgY2xhc3MgdGhhdCBhIHJlZ2lvbiByZXZlcnRzIHRvIHdoZW4gaXRzIGNsYXNzIGlzIGRlbGV0ZWQgKGppdC11aSM3MCkuICovXG4gIHByb3RlY3RlZCByZWFkb25seSBkZWZhdWx0Q2xhc3NOYW1lID0gJ1JlZ2lvbic7XG4gIC8qKiBDbGFzc2VzIGFzIHNob3duIGluIHRoZSBwYW5lbDogc29ydGVkIGJ5IHJlZ2lvbiBjb3VudCAoZGVzYyksIHRoZW4gbmFtZS4gKi9cbiAgcHJvdGVjdGVkIGRpc3BsYXlDbGFzc2VzOiBDbGFzc1ByZXNldFtdID0gW107XG5cbiAgcHJvdGVjdGVkIHBhZ2luYXRvckZpcnN0ID0gMDtcbiAgcHJvdGVjdGVkIHBhZ2luYXRvclJvd3MgPSAxMDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJvd3NQZXJQYWdlT3B0aW9ucyA9IFsxMCwgMjUsIDUwXTtcbiAgLyoqIFJlZ2lvbnMgd2hvc2UgQ2xhc3MgY2VsbCBpcyBjdXJyZW50bHkgaW4gZWRpdCBtb2RlIOKGkiB0aGUgbGFiZWwgYmVpbmcgdHlwZWQuXG4gICAqICBUaGUgZHJhZnQgaXMgY29tbWl0dGVkIG9uIEVudGVyIGFuZCBkaXNjYXJkZWQgb24gRXNjYXBlL+KclSwgc28gdHlwaW5nIG5ldmVyXG4gICAqICB3cml0ZXMgaW50byB0aGUgc3RvcmUncyByZWdpb24gKFJULTE4KS4gS2V5ZWQgYnkgb2JqZWN0IGlkZW50aXR5LCB3aGljaFxuICAgKiAgYXZvaWRzIG5lZWRpbmcgYSB1bmlxdWUgaWQgZmllbGQuICovXG4gIHByb3RlY3RlZCBlZGl0aW5nTGFiZWxSZWdpb25zID0gbmV3IE1hcDxSZWdpb24sIHN0cmluZz4oKTtcblxuICBwcm90ZWN0ZWQgc2hvd1NhdmVBc0RpYWxvZyA9IGZhbHNlO1xuICAvKipcbiAgICogVGhlIHNsaWNlJ3MgcmVnaW9uIHNvdXJjZSAoYSBsYXJnZSByZWdpb24gc2V0IGRyYXduIGJ5IGxldmVsIG9mIGRldGFpbCksIG9yIG51bGwuIEl0c1xuICAgKiBmZWF0dXJlcyBhcmUgcm93cyBvZiB0aGUgdGFibGUgYWZ0ZXIgdGhlIHJlZ2lvbnMg4oCUIHN0YW5kLWlucyB1bnRpbCBvbmUgaXMgc2VsZWN0ZWQgb3IgZWRpdGVkLFxuICAgKiB3aGljaCB0YWtlcyBpdCBpbnRvIHRoZSByZWdpb25zIOKAlCBhbmQgaXRzIGNsYXNzZXMgY291bnQgaW4gdGhlIGNsYXNzZXMgcGFuZWwuXG4gICAqL1xuICBwcm90ZWN0ZWQgc291cmNlVmlldzogUmVnaW9uU291cmNlVmlldyB8IG51bGwgPSBudWxsO1xuICAvKiogRmVhdHVyZXMgc3RpbGwgaW4gdGhlIHNvdXJjZSAodGhlIHRhYmxlJ3Mgcm93cyBhZnRlciB0aGUgcmVnaW9ucykuICovXG4gIHByaXZhdGUgc291cmNlVG90YWwgPSAwO1xuICAvKiogU3RhbmQtaW4gcm93cyBmb3IgdGhlIHNvdXJjZSBmZWF0dXJlcyBvbiB0aGUgY3VycmVudCBwYWdlLiAqL1xuICBwcml2YXRlIHNvdXJjZVJvd3M6IFJlZ2lvbltdID0gW107XG4gIC8qKiBGZWF0dXJlcyBwZXIgY2xhc3Mgc3RpbGwgaW4gdGhlIHNvdXJjZS4gKi9cbiAgcHJpdmF0ZSBzb3VyY2VDbGFzc0NvdW50czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAvKiogVGhlIHN0YW5kLWluIHJvd3MgKHJvd3Mgb2YgYSBzb3VyY2UgZmVhdHVyZSwgbm90IG9mIGEgcmVnaW9uKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzdGFuZElucyA9IG5ldyBXZWFrU2V0PFJlZ2lvbj4oKTtcbiAgcHJpdmF0ZSBzdGFuZEluU2VxID0gMDtcbiAgLyoqIEJ1bXBlZCBwZXIgc291cmNlIHJlZnJlc2gsIHNvIGEgbGF0ZSBhbnN3ZXIgaXMgZHJvcHBlZC4gKi9cbiAgcHJpdmF0ZSBzb3VyY2VSZXF1ZXN0ID0gMDtcbiAgLyoqIFRoZSBjbGFzc2VzIHRoZSB0YWJsZSdzIENsYXNzIGNvbHVtbiBvZmZlcnM6IHRoZSBwcmVzZXRzIGFuZCB0aGUgcmVnaW9uIHNvdXJjZSdzIGNsYXNzZXNcbiAgICogIChhIGRyb3Bkb3duIGNhbiBvbmx5IHNob3cgYSB2YWx1ZSB0aGF0IGlzIG9uZSBvZiBpdHMgb3B0aW9ucykuICovXG4gIHByb3RlY3RlZCB0YWJsZVByZXNldFNldDogUHJlc2V0U2V0ID0gZGVmYXVsdFByZXNldFNldCgpO1xuICAvKiogV2hldGhlciByZWdpb25zIGFyZSBkcmF3biBmaWxsZWQgKHRoZSBhdGxhcyBsb29rKSByYXRoZXIgdGhhbiBvdXRsaW5lZC4gKi9cbiAgcHJvdGVjdGVkIHJlZ2lvbnNGaWxsZWQgPSBmYWxzZTtcbiAgLyoqIFdoZXRoZXIgYSB2b2x1bWUgdmlldyBpcyBvbiBzY3JlZW4gKGNsYXNzZXMgY2FuIHRoZW4gYmUgc2hvd24gaW4gM0QpLiAqL1xuICBwcm90ZWN0ZWQgdm9sdW1lVmlldyA9IGZhbHNlO1xuICAvKiogV2hldGhlciB0aGUgdm9sdW1lIHZpZXcncyBzbGljZSBwYW5lIGlzIHdhbnRlZCAob25lIHNsaWNlIGVkaXRlZCBiZXNpZGUgdGhlIDNEIHZpZXcpLiAqL1xuICBwcml2YXRlIHNsaWNlUGFuZSA9IGZhbHNlO1xuICAvKiogV2hldGhlciB0aGUgdm9sdW1lIHZpZXcgZHJhd3MgdGhlIHJlZ2lvbnMgdGhyb3VnaCB0aGUgdm9sdW1lIChzZWUgdG9nZ2xlVGhyb3VnaFZvbHVtZSkuICovXG4gIHByb3RlY3RlZCByZWdpb25zVGhyb3VnaFZvbHVtZSA9IGZhbHNlO1xuICAvKiogQ2xhc3NlcyBzaG93biBpbiAzRCBpbiB0aGUgdm9sdW1lIHZpZXcsIGVhY2ggd2l0aCB0aGUgY2xhc3NlcyBpdHMgc3VyZmFjZSBjb3ZlcnMuICovXG4gIHByb3RlY3RlZCBzaG93bjNkID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICAvKiogVGhlIGNsYXNzZXMgb2YgdGhlIGNsYXNzIHRyZWUncyBwaWNrIChpdCBhbmQgaXRzIHN1YnRyZWUpLCBhcyBsb25nIGFzIHRoZSBwaWNrIGhvbGRzLiAqL1xuICBwcml2YXRlIHBpY2tlZENsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW107XG4gIC8qKiBUaGUgc2VsZWN0ZWQgcm93cycgY2xhc3NlcywgbWFya2VkIGluIHRoZSBjbGFzcyBsaXN0cy4gKi9cbiAgcHJvdGVjdGVkIG1hcmtlZENsYXNzZXM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIC8qKiBUaGUgc3VyZmFjZXMgaGlnaGxpZ2h0ZWQgaW4gdGhlIHZvbHVtZSB2aWV3ICh0aGVpciBrZXlzLCBqb2luZWQpLiAqL1xuICBwcml2YXRlIGhpZ2hsaWdodGVkM2QgPSAnJztcbiAgLyoqIFRoZSBjb2xvdXIgZWFjaCBzaG93biBzdXJmYWNlIHdhcyBsYXN0IGRyYXduIGluLiAqL1xuICBwcml2YXRlIGNvbG9yczNkID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgLyoqIFRoZWlyIG5hbWVzLCBmb3IgdGhlIGNsYXNzIGxpc3RzJyB0b2dnbGVzIChhIG5ldyBzZXQgcGVyIGNoYW5nZSwgZm9yIE9uUHVzaCkuICovXG4gIHByb3RlY3RlZCBzaG93bjNkTmFtZXM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIC8qKiBUaGUgY2xhc3NlcyBoaWRkZW4gZnJvbSB2aWV3ICh0aGVpciByZWdpb25zLCBzb3VyY2UgZmVhdHVyZXMgYW5kIHN1cmZhY2VzKS4gKi9cbiAgcHJvdGVjdGVkIGhpZGRlbkNsYXNzZXM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIC8qKiBXaGV0aGVyIGEgcmVnaW9uIHNldCdzIGNsYXNzIGhpZXJhcmNoeSBpcyBzaG93biBhcyBhIHRyZWUgKHJhdGhlciB0aGFuIHRoZSBjbGFzcyBsaXN0KS4gKi9cbiAgcHJvdGVjdGVkIGNsYXNzVHJlZVZpZXcgPSB0cnVlO1xuICAvKiogVGhlIGNsYXNzIHBpY2tlZCBsYXN0IGluIHRoZSBjbGFzcyB0cmVlLiAqL1xuICBwcm90ZWN0ZWQgcGlja2VkQ2xhc3M6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogUmVnaW9ucyBwZXIgY2xhc3MgKHRoZSByZWdpb25zJyBhbmQgdGhlIHNvdXJjZSdzKSwgZm9yIHRoZSBjbGFzcyB0cmVlLiAqL1xuICBwcm90ZWN0ZWQgdHJlZUNvdW50cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIC8qKiBBIGNsYXNzJ3MgY29sb3VyLCBmb3IgdGhlIGNsYXNzIHRyZWU6IGEgbmV3IGZ1bmN0aW9uIHBlciBjb2xvdXIgY2hhbmdlLCBzbyB0aGUgdHJlZSByZXBhaW50cy4gKi9cbiAgcHJvdGVjdGVkIHRyZWVDb2xvciA9IChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4gY29sb3JGb3JMYWJlbChuYW1lLCB0aGlzLnByZXNldFNldCk7XG4gIHByb3RlY3RlZCBzYXZlQXNGaWxlbmFtZSA9ICcnO1xuICBwcm90ZWN0ZWQgc2F2ZUFzRmlsZUV4aXN0cyA9IGZhbHNlO1xuICAvKiogVHJ1ZSB3aGlsZSBhIEdlb0pTT04gcGVyc2lzdCBpcyBzZXJpYWxpemluZy91cGxvYWRpbmcg4oCUIGRyaXZlcyB0aGUgZGlhbG9nJ3NcbiAgICogIHByb2dyZXNzIGJhciBhbmQgQ2FuY2VsIGJ1dHRvbiAocGFyaXR5IHdpdGggdGhlIFNhdmUtbWFzayBkaWFsb2cpLiAqL1xuICBwcm90ZWN0ZWQgc2F2ZUFzQnVzeSA9IGZhbHNlO1xuICAvKiogVGhlIHJ1bm5pbmcgR2VvSlNPTiBzYXZlOyB1bnN1YnNjcmliaW5nIGNhbmNlbHMgaXQgKENhbmNlbCAvIGRlc3Ryb3kpLiAqL1xuICBwcml2YXRlIF9zYXZlQXNTdWI/OiBTdWJzY3JpcHRpb247XG4gIC8qKiBTYXZlLWFzIGZpbGUgbmFtZXMgdG8gY2hlY2sgZm9yIGFuIGV4aXN0aW5nIGZpbGUgKGRlYm91bmNlZCkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2F2ZUFzQ2hlY2skID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gIHByb3RlY3RlZCBzaG93RXhwb3J0RGlhbG9nID0gZmFsc2U7XG4gIHByb3RlY3RlZCBleHBvcnRGaWxlbmFtZSA9ICcnO1xuXG4gIHByb3RlY3RlZCBzaG93U2F2ZU1hc2tEaWFsb2cgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHNhdmVNYXNrRmlsZW5hbWUgPSAnJztcbiAgLyoqIE1hc2sgdHlwZSBjaG9zZW4gaW4gdGhlIFNhdmUtbWFzayBkaWFsb2c6IGEgYmluYXJ5IGZvcmVncm91bmQvYmFja2dyb3VuZFxuICAgKiAgbWFzaywgb3IgYSBtdWx0aS1jbGFzcyBtYXNrIHdpdGggYSBkaXN0aW5jdCBpZCBwZXIgcmVnaW9uLiAqL1xuICBwcm90ZWN0ZWQgbWFza01vZGU6IE1hc2tNb2RlID0gJ2JpbmFyeSc7XG4gIC8qKiBUcnVlIHdoaWxlIHRoZSBtYXNrIHdvcmtlciBpcyByYXN0ZXJpemluZy9lbmNvZGluZyDigJQgZHJpdmVzIHRoZSBwcm9ncmVzc1xuICAgKiAgYmFyIGFuZCB0aGUgQ2FuY2VsIGJ1dHRvbiBpbiB0aGUgZGlhbG9nLiAqL1xuICBwcm90ZWN0ZWQgbWFza0J1c3kgPSBmYWxzZTtcbiAgLyoqIDDigJMxMDAgcmFzdGVyaXphdGlvbiBwcm9ncmVzczsgc3dpdGNoZXMgdG8gaW5kZXRlcm1pbmF0ZSBkdXJpbmcgZW5jb2RpbmcuICovXG4gIHByb3RlY3RlZCBtYXNrUHJvZ3Jlc3MgPSAwO1xuICBwcm90ZWN0ZWQgbWFza0VuY29kaW5nID0gZmFsc2U7XG4gIC8qKiBUaGUgcnVubmluZyBtYXNrIGV4cG9ydDsgdW5zdWJzY3JpYmluZyBjYW5jZWxzIGl0ICh0ZXJtaW5hdGVzIGl0cyB3b3JrZXIpLiAqL1xuICBwcml2YXRlIG1hc2tKb2I/OiBTdWJzY3JpcHRpb247XG5cbiAgLyoqXG4gICAqIFByaW1lTkcgcC10YWJsZSBtdWx0aS1zZWxlY3Rpb24gbW9kZSB0b2dnbGUuIFdoZW4gdHJ1ZSwgc2luZ2xlLWNsaWNrXG4gICAqIHNlbGVjdHMgb25lIHJvdyAocmVwbGFjaW5nIHByaW9yKTsgbWV0YS9jdHJsLWNsaWNrIHRvZ2dsZXMgYSByb3cgaW4vb3V0XG4gICAqIG9mIHRoZSBzZWxlY3Rpb24uIFdoZW4gZmFsc2UsIGV2ZXJ5IGNsaWNrIHRvZ2dsZXMuIERlZmF1bHQgdHJ1ZSB0b1xuICAgKiBtYXRjaCB0aGUgbW9zdCBjb21tb24gc3ByZWFkc2hlZXQtbGlrZSBVWC5cbiAgICovXG4gIHByb3RlY3RlZCBtZXRhS2V5ID0gdHJ1ZTtcblxuICBwcml2YXRlIF91cGRhdGluZ0Zyb21FZGl0b3IgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc3VwcHJlc3NTZWxlY3Rpb25TeW5jVG9QbG90ID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IHpvbmUgPSBpbmplY3QoTmdab25lKTtcblxuICAvKiogUmUtcmVuZGVyIHRoaXMgT25QdXNoIHZpZXcsIHJlLWVudGVyaW5nIHRoZSB6b25lIHdoZW4gdGhlIGNoYW5nZSBjYW1lIGZyb20gb3V0c2lkZSBpdC4gKi9cbiAgcHJpdmF0ZSBjaGFuZ2VkKCk6IHZvaWQge1xuICAgIG1hcmtGb3JDaGVja0luWm9uZSh0aGlzLmNkciwgdGhpcy56b25lKTtcbiAgfVxuXG4gIC8qKiBQaHlzaWNhbCBwaXhlbCBzaXplICjCtW0vcGl4ZWwpIG9mIHRoZSBhY3RpdmUgaW1hZ2UsIGZvciByZWdpb24gYXJlYXMgaW5cbiAgICogIMK1bcKyOyBlbXB0eSB3aGVuIHRoZSBmb3JtYXQgcmVwb3J0cyBubyBwaHlzaWNhbCBzaXplLiAqL1xuICBwcm90ZWN0ZWQgbXBwOiBQaXhlbFNpemUgPSB7fTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KFJFR0lPTl9FRElUT1JfQVBJKSBwcml2YXRlIHJlZ2lvbkFwaTogSVJlZ2lvbkVkaXRvckFwaSxcbiAgICBwcml2YXRlIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcbiAgICBwcml2YXRlIGNvbmZpcm1hdGlvblNlcnZpY2U6IENvbmZpcm1hdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwZXJzaXN0ZW5jZTogUmVnaW9uUGVyc2lzdGVuY2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWFza0V4cG9ydDogTWFza0V4cG9ydFNlcnZpY2UsXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnNob3dTaGFwZUxhYmVsID0gdGhpcy5yZWdpb25BcGkuZ2V0U2hvd1NoYXBlTGFiZWwoKTtcbiAgICB0aGlzLnNoYXBlQ29sb3IgPSB0aGlzLnJlZ2lvbkFwaS5nZXRTaGFwZUNvbG9yKCk7XG4gICAgdGhpcy5maWxsQ29sb3IgPSB0aGlzLnJlZ2lvbkFwaS5nZXRGaWxsQ29sb3IoKTtcblxuICAgIC8vIEFubm90YXRpb24tY2xhc3MgcHJlc2V0cyAoaml0LXVpIzcwKTogbWlycm9yIHRoZSBzZXQgZm9yIHRoZSBjaGlwIHN0cmlwLFxuICAgIC8vIHRoZSBDbGFzcyBkcm9wZG93biBhbmQgdGhlIG1hbmFnZSBkaWFsb2cuIEd1YXJkZWQgd2l0aCBvcHRpb25hbCBjYWxscyBzb1xuICAgIC8vIHBhcnRpYWwgQVBJIG1vY2tzIGluIHRlc3RzICh3aGljaCBvbWl0IHRoZSBwcmVzZXQgbWV0aG9kcykgZG9uJ3QgdGhyb3cuXG4gICAgY29uc3QgaW5pdGlhbFByZXNldHMgPSB0aGlzLnJlZ2lvbkFwaS5nZXRQcmVzZXRTZXQ/LigpO1xuICAgIGlmIChpbml0aWFsUHJlc2V0cykgdGhpcy5wcmVzZXRTZXQgPSBpbml0aWFsUHJlc2V0cztcbiAgICBjb25zdCBwcmVzZXRzJCA9IHRoaXMucmVnaW9uQXBpLmdldFByZXNldFNldCQ/LigpO1xuICAgIGlmIChwcmVzZXRzJCkge1xuICAgICAgcHJlc2V0cyQucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSkuc3Vic2NyaWJlKChzZXQpID0+IHtcbiAgICAgICAgaWYgKHNldCkgdGhpcy5wcmVzZXRTZXQgPSBzZXQ7XG4gICAgICAgIHRoaXMudHJlZUNvbG9yID0gKG5hbWU6IHN0cmluZyk6IHN0cmluZyA9PiBjb2xvckZvckxhYmVsKG5hbWUsIHRoaXMucHJlc2V0U2V0KTtcbiAgICAgICAgdGhpcy51cGRhdGVEaXNwbGF5Q2xhc3NlcygpO1xuICAgICAgICB0aGlzLnJlY29sb3IzZCgpO1xuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBTZWVkIGZyb20gdGhlIHZpc3VhbGl6ZXIncyBjdXJyZW50IHJlZ2lvbnMg4oCUIGFscmVhZHkgc2NvcGVkIHRvIHRoZVxuICAgIC8vIGFjdGl2ZSBpbWFnZSBieSB0aGUgcGVyLWltYWdlIGNhY2hlLCBhbmQgaGFuZGVkIGJhY2sgYXMgbmV1dHJhbCBSZWdpb25cbiAgICAvLyBvYmplY3RzIChubyBiYWNrZW5kIHNoYXBlIGZvcm1hdCBpbnZvbHZlZCkuXG4gICAgLy8gQW5ub3RhdGlvbiByZWdpb25zIG9ubHkg4oCUIGludGVuc2l0eS1wcm9maWxlIGxpbmVzIGFyZSBvd25lZCBieSB0aGVcbiAgICAvLyBpbnRlbnNpdHkgdG9vbCBhbmQgZXhjbHVkZWQgYnkgdGhlIGNvbnRyYWN0LCBzbyB0aGUgZWRpdG9yIG5ldmVyIHNlZXMgdGhlbS5cbiAgICB0aGlzLnJlZ2lvbnMgPSB0aGlzLmFwcGx5UmVnaW9uQ29sb3JzKHRoaXMucmVnaW9uQXBpLmdldEFubm90YXRpb25SZWdpb25zKCkpO1xuICAgIHRoaXMuc3luY0NsYXNzZXNGcm9tUmVnaW9ucyh0aGlzLnJlZ2lvbnMpO1xuICAgIHRoaXMucmVjb21wdXRlQ2xhc3NDb3VudHMoKTtcblxuICAgIC8vIFRoZSB1cGRhdGUgZXZlbnQgaXMganVzdCBhIGNoYW5nZSBzaWduYWw7IHJlLXJlYWQgdGhlIHJlZ2lvbnMgZnJvbSB0aGVcbiAgICAvLyB2aXN1YWxpemVyIHJhdGhlciB0aGFuIHBhcnNpbmcgd2hhdGV2ZXIgcGF5bG9hZCBpdCBjYXJyaWVzLlxuICAgIHRoaXMucmVnaW9uQXBpXG4gICAgICAuZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3VwZGF0aW5nRnJvbUVkaXRvcikgcmV0dXJuO1xuICAgICAgICBjb25zdCB1cGRhdGVkID0gdGhpcy5hcHBseVJlZ2lvbkNvbG9ycyh0aGlzLnJlZ2lvbkFwaS5nZXRBbm5vdGF0aW9uUmVnaW9ucygpKTtcbiAgICAgICAgLy8gcHJlc2VydmUgc2VsZWN0aW9uIGZvciByZWdpb25zIHRoYXQgc3RpbGwgZXhpc3QgKGJ5IGlkLCBzaW5jZSBuYW1lXG4gICAgICAgIC8vIGlzIGEgdXNlci1lZGl0YWJsZSBkaXNwbGF5IGxhYmVsIGFuZCBtYXkgY29sbGlkZSlcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJZHMgPSBuZXcgU2V0KHRoaXMuc2VsZWN0ZWRSZWdpb25zLm1hcCgocikgPT4gci5pZCkpO1xuICAgICAgICB0aGlzLnJlZ2lvbnMgPSB1cGRhdGVkO1xuICAgICAgICB0aGlzLnNlbGVjdGVkUmVnaW9ucyA9IHVwZGF0ZWQuZmlsdGVyKChyKSA9PiBzZWxlY3RlZElkcy5oYXMoci5pZCkpO1xuICAgICAgICB0aGlzLmNsYW1wUGFnaW5hdG9yRmlyc3QoKTtcbiAgICAgICAgdGhpcy5zeW5jQ2xhc3Nlc0Zyb21SZWdpb25zKHVwZGF0ZWQpO1xuICAgICAgICB0aGlzLnJlY29tcHV0ZUNsYXNzQ291bnRzKCk7XG4gICAgICAgIGlmICh0aGlzLnZvbHVtZVZpZXcpIHRoaXMucmVzZXRWb2x1bWVzKCk7XG4gICAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgICB2b2lkIHRoaXMucmVmcmVzaFNvdXJjZSgpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lvbkFwaVxuICAgICAgLmdldFJlZ2lvblNvdXJjZVZpZXckPy4oKVxuICAgICAgPy5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgodmlldykgPT4ge1xuICAgICAgICBpZiAodmlldz8uc291cmNlICE9PSB0aGlzLnNvdXJjZVZpZXc/LnNvdXJjZSkgdGhpcy5waWNrZWRDbGFzcyA9IG51bGw7XG4gICAgICAgIHRoaXMuc291cmNlVmlldyA9IHZpZXc7XG4gICAgICAgIHZvaWQgdGhpcy5yZWZyZXNoU291cmNlKCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMucmVnaW9uQXBpXG4gICAgICAuZ2V0UmVnaW9uU3R5bGUkPy4oKVxuICAgICAgPy5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoc3R5bGUpID0+IHtcbiAgICAgICAgdGhpcy5yZWdpb25zRmlsbGVkID0gc3R5bGUuZmlsbE9wYWNpdHkgPiAwO1xuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpb25BcGlcbiAgICAgIC5nZXRWb2x1bWVWaWV3JD8uKClcbiAgICAgID8ucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKHZvbHVtZSkgPT4ge1xuICAgICAgICBjb25zdCBjb3VudGluZyA9IHRoaXMuc3RhY2tDb3VudHM7XG4gICAgICAgIHRoaXMudm9sdW1lVmlldyA9IHZvbHVtZTtcbiAgICAgICAgdGhpcy5yZXNldFZvbHVtZXMoKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICAgIGlmICh0aGlzLnN0YWNrQ291bnRzICE9PSBjb3VudGluZykgdm9pZCB0aGlzLnJlZnJlc2hTb3VyY2UoKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpb25BcGlcbiAgICAgIC5nZXRSZWdpb25zVGhyb3VnaFZvbHVtZSQ/LigpXG4gICAgICA/LnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCh0aHJvdWdoKSA9PiB7XG4gICAgICAgIHRoaXMucmVnaW9uc1Rocm91Z2hWb2x1bWUgPSB0aHJvdWdoO1xuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpb25BcGlcbiAgICAgIC5nZXRTbGljZUVkaXRvciQ/LigpXG4gICAgICA/LnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChwYW5lKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvdW50aW5nID0gdGhpcy5zdGFja0NvdW50cztcbiAgICAgICAgdGhpcy5zbGljZVBhbmUgPSBwYW5lO1xuICAgICAgICBpZiAodGhpcy5zdGFja0NvdW50cyAhPT0gY291bnRpbmcpIHZvaWQgdGhpcy5yZWZyZXNoU291cmNlKCk7XG4gICAgICB9KTtcblxuICAgIC8vIFdoYXQgaXMgc2hvd24gaW4gM0Q6IHRoZSByb3V0ZXIgY2xlYXJzIGl0IHdoZW4gYW5vdGhlciBpbWFnZSBpcyBwbG90dGVkLlxuICAgIHRoaXMucmVnaW9uQXBpXG4gICAgICAuZ2V0UmVnaW9uQ2xhc3NlczNkJD8uKClcbiAgICAgID8ucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKGdyb3VwcykgPT4ge1xuICAgICAgICB0aGlzLnNob3duM2QgPSBuZXcgTWFwKGdyb3Vwcy5tYXAoKGcpID0+IFtnLmtleSwgWy4uLmcuY2xhc3Nlc11dKSk7XG4gICAgICAgIHRoaXMuc2hvd24zZE5hbWVzID0gbmV3IFNldCh0aGlzLnNob3duM2Qua2V5cygpKTtcbiAgICAgICAgdGhpcy5oaWdobGlnaHRlZDNkID0gJyc7XG4gICAgICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uSGlnaGxpZ2h0KCk7XG4gICAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lvbkFwaVxuICAgICAgLmdldEhpZGRlbkNsYXNzZXMkPy4oKVxuICAgICAgPy5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoaGlkZGVuKSA9PiB7XG4gICAgICAgIHRoaXMuaGlkZGVuQ2xhc3NlcyA9IGhpZGRlbjtcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICB9KTtcblxuICAgIC8vIEEgc3VyZmFjZSBjbGlja2VkIGluIHRoZSB2b2x1bWUgdmlldyAod2l0aCB0aGUgc2VsZWN0aW9uIHRvb2wpIHBpY2tzIGl0cyBjbGFzcy5cbiAgICB0aGlzLnJlZ2lvbkFwaVxuICAgICAgLmdldFJlZ2lvblBpY2tlZDNkJD8uKClcbiAgICAgID8ucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKHsga2V5LCBhZGRpdGl2ZSB9KSA9PiB0aGlzLm9uUGlja2VkM2Qoa2V5LCBhZGRpdGl2ZSkpO1xuXG4gICAgdGhpcy5wZXJzaXN0ZW5jZVxuICAgICAgLmZpbGVFeGlzdHModGhpcy5zYXZlQXNDaGVjayQpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKGV4aXN0cykgPT4ge1xuICAgICAgICB0aGlzLnNhdmVBc0ZpbGVFeGlzdHMgPSBleGlzdHM7XG4gICAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgfSk7XG5cbiAgICAvLyBQaHlzaWNhbCBwaXhlbCBzaXplIG9mIHRoZSBhY3RpdmUgaW1hZ2UgKGZvciByZWdpb24gYXJlYXMgaW4gwrVtwrIvbW3CsikuXG4gICAgdGhpcy5yZWdpb25BcGlcbiAgICAgIC5nZXRJbWFnZU1ldGEoKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChtZXRhKSA9PiB7XG4gICAgICAgIHRoaXMubXBwID0gcGlja01wcChtZXRhKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMucmVnaW9uQXBpXG4gICAgICAuZ2V0U2VsZWN0ZWRSZWdpb25zJCgpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKHNlbGVjdGVkKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9zdXBwcmVzc1NlbGVjdGlvblN5bmNUb1Bsb3QpIHJldHVybjtcbiAgICAgICAgLy8gTWFwIHRoZSBjb250cmFjdCdzIHNlbGVjdGVkIHJlZ2lvbnMgdG8gdGhlIGVkaXRvcidzIG93biBpbnN0YW5jZXMgYnkgaWQuXG4gICAgICAgIGNvbnN0IG5leHQgPSBzZWxlY3RlZC5tYXAoKHMpID0+IHRoaXMucmVnaW9ucy5maW5kKChyKSA9PiByLmlkID09PSBzLmlkKSkuZmlsdGVyKChyKTogciBpcyBSZWdpb24gPT4gISFyKTtcbiAgICAgICAgY29uc3Qgc2FtZSA9XG4gICAgICAgICAgbmV4dC5sZW5ndGggPT09IHRoaXMuc2VsZWN0ZWRSZWdpb25zLmxlbmd0aCAmJlxuICAgICAgICAgIG5leHQuZXZlcnkoKHIsIGkpID0+IHIuaWQgPT09IHRoaXMuc2VsZWN0ZWRSZWdpb25zW2ldPy5pZCk7XG4gICAgICAgIGlmICghc2FtZSkgdGhpcy5zZWxlY3RlZFJlZ2lvbnMgPSBuZXh0O1xuICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbkhpZ2hsaWdodCgpO1xuICAgICAgICAvLyBTY3JvbGwgdGhlIHBhZ2luYXRvciBzbyB0aGUgbW9zdC1yZWNlbnRseS1zZWxlY3RlZCByb3cgaXMgdmlzaWJsZS5cbiAgICAgICAgaWYgKG5leHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGxhc3RJZHggPSB0aGlzLnJlZ2lvbnMuZmluZEluZGV4KChyKSA9PiByLmlkID09PSBuZXh0W25leHQubGVuZ3RoIC0gMV0uaWQpO1xuICAgICAgICAgIGlmIChsYXN0SWR4ID49IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHBhZ2VTdGFydCA9IE1hdGguZmxvb3IobGFzdElkeCAvIHRoaXMucGFnaW5hdG9yUm93cykgKiB0aGlzLnBhZ2luYXRvclJvd3M7XG4gICAgICAgICAgICBpZiAocGFnZVN0YXJ0ICE9PSB0aGlzLnBhZ2luYXRvckZpcnN0KSB0aGlzLnBhZ2luYXRvckZpcnN0ID0gcGFnZVN0YXJ0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqIENhbmNlbHMgYSBydW5uaW5nIEdlb0pTT04gc2F2ZSAoYWJvcnRzIGl0cyB1cGxvYWQpIGFuZCBtYXNrIGV4cG9ydCAodGVybWluYXRlc1xuICAgKiAgaXRzIHdvcmtlcik7IHRoZSBBUEkgc3Vic2NyaXB0aW9ucyBlbmQgdGhyb3VnaCBgdGFrZVVudGlsRGVzdHJveWVkYC4gKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fc2F2ZUFzU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMubWFza0pvYj8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWJsZSDihpIgUGxvdDogUHJpbWVORyBmaXJlcyBvblJvd1NlbGVjdC9vblJvd1Vuc2VsZWN0IGFmdGVyIHVwZGF0aW5nXG4gICAqIGBzZWxlY3RlZFJlZ2lvbnNgLiBQdXNoIHRoZSBzZWxlY3RlZCByZWdpb25zIHRvIHRoZSBjb250cmFjdCBieSBpZGVudGl0eSDigJRcbiAgICogdGhlIHBhY2thZ2UgbWFwcyB0aGVtIHRvIGl0cyBpbnRlcm5hbCBpbmRleCBzcGFjZSAod2hpY2ggaW5jbHVkZXMgdGhlXG4gICAqIGludGVuc2l0eS1wcm9maWxlIGxpbmVzIHRoZSBlZGl0b3IgbmV2ZXIgc2VlcykuXG4gICAqL1xuICBwcm90ZWN0ZWQgb25TZWxlY3Rpb25DaGFuZ2VkKCkge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5zZWxlY3RlZFJlZ2lvbnMgPz8gW107XG4gICAgLy8gUm93cyBwaWNrZWQgaW4gdGhlIHRhYmxlIHJlcGxhY2UgdGhlIGNsYXNzIHRyZWUncyBwaWNrLlxuICAgIHRoaXMucGlja2VkQ2xhc3NlcyA9IFtdO1xuICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uSGlnaGxpZ2h0KCk7XG4gICAgY29uc3QgZnJvbVNvdXJjZSA9IHNlbGVjdGVkLmZpbHRlcigocikgPT4gdGhpcy5zdGFuZElucy5oYXMocikpO1xuICAgIHRoaXMuX3N1cHByZXNzU2VsZWN0aW9uU3luY1RvUGxvdCA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMucmVnaW9uQXBpLnNldFNlbGVjdGVkUmVnaW9ucyhzZWxlY3RlZC5maWx0ZXIoKHIpID0+ICF0aGlzLnN0YW5kSW5zLmhhcyhyKSkpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9zdXBwcmVzc1NlbGVjdGlvblN5bmNUb1Bsb3QgPSBmYWxzZTtcbiAgICB9XG4gICAgLy8gQSBzZWxlY3RlZCBzb3VyY2Ugcm93IGlzIHRha2VuIGludG8gdGhlIHJlZ2lvbnMgKGFuZCBzbyBzZWxlY3RlZCBvbiB0aGUgaW1hZ2UgdG9vKS5cbiAgICBpZiAoZnJvbVNvdXJjZS5sZW5ndGgpIHZvaWQgdGhpcy5yZWdpb25BcGkuc2VsZWN0U291cmNlRmVhdHVyZXM/Lih0aGlzLnNvdXJjZUlkcyhmcm9tU291cmNlKSwgdHJ1ZSk7XG4gIH1cblxuICAvLyDilIDilIAgVGhlIHJlZ2lvbiBzb3VyY2UncyBmZWF0dXJlcyBhcyB0YWJsZSByb3dzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBXaGV0aGVyIHRoZSBzbGljZSBoYXMgYSByZWdpb24gc291cmNlOiBpdCB0aGVuIGhhcyByZWdpb25zIHRvIHNhdmUgZXZlbiB3aXRoIGFuIGVtcHR5IHRhYmxlLiAqL1xuICBwcm90ZWN0ZWQgZ2V0IGhhc1JlZ2lvblNvdXJjZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnNvdXJjZVZpZXc7XG4gIH1cblxuICAvKiogUm93cyBpbiB0aGUgdGFibGU6IHRoZSByZWdpb25zLCB0aGVuIHRoZSBmZWF0dXJlcyBzdGlsbCBpbiB0aGUgcmVnaW9uIHNvdXJjZS4gKi9cbiAgcHJvdGVjdGVkIGdldCB0YWJsZVRvdGFsKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9ucy5sZW5ndGggKyB0aGlzLnNvdXJjZVRvdGFsO1xuICB9XG5cbiAgLyoqIFRoZSBjbGFzcyBoaWVyYXJjaHkgb2YgdGhlIHNsaWNlJ3MgcmVnaW9uIHNvdXJjZSwgd2hlbiBpdCBoYXMgb25lICh0aGUgY2xhc3NlcyBhcyBhIHRyZWUpLiAqL1xuICBwcm90ZWN0ZWQgZ2V0IGNsYXNzSGllcmFyY2h5KCk6IFJlZ2lvbkNsYXNzTm9kZVtdIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlVmlldz8uc291cmNlLmluZm8uaGllcmFyY2h5ID8/IG51bGw7XG4gIH1cblxuICAvKiogV2hldGhlciBgcm93YCBpcyBhIHJlZ2lvbi1zb3VyY2UgZmVhdHVyZSdzIHN0YW5kLWluIHJhdGhlciB0aGFuIGEgcmVnaW9uLiAqL1xuICBwcm90ZWN0ZWQgaXNTb3VyY2VSb3cocm93OiBSZWdpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGFuZElucy5oYXMocm93KTtcbiAgfVxuXG4gIHByaXZhdGUgc291cmNlSWRzKHJvd3M6IFJlZ2lvbltdKTogc3RyaW5nW10ge1xuICAgIHJldHVybiByb3dzLm1hcCgocikgPT4gci5zb3VyY2VJZCkuZmlsdGVyKChpZCk6IGlkIGlzIHN0cmluZyA9PiAhIWlkKTtcbiAgfVxuXG4gIC8qKiBBIHRhYmxlIHJvdyBmb3IgYSBzb3VyY2UgZmVhdHVyZTogbm8gZ2VvbWV0cnkgdW50aWwgaXQgaXMgdGFrZW4uICovXG4gIHByaXZhdGUgc3RhbmRJbihyb3c6IFJlZ2lvbkluZGV4Um93KTogUmVnaW9uIHtcbiAgICBjb25zdCByID0gT2JqZWN0LmFzc2lnbihuZXcgUmVnaW9uKCksIHtcbiAgICAgIGlkOiAtKyt0aGlzLnN0YW5kSW5TZXEsXG4gICAgICBuYW1lOiByb3cubGFiZWwgPz8gcm93LmlkLFxuICAgICAgbGFiZWw6IHJvdy5sYWJlbCA/PyB1bmRlZmluZWQsXG4gICAgICBjb2xvcjogdGhpcy5zb3VyY2VWaWV3Py5jb2xvck9mKHJvdykgPz8gcm93LmNvbG9yID8/IHRoaXMuc2hhcGVDb2xvcixcbiAgICAgIHNvdXJjZUlkOiByb3cuaWQsXG4gICAgICBzb3VyY2VBcmVhOiByb3cuYXJlYSxcbiAgICAgIGJvdW5kczogbnVsbCxcbiAgICB9KTtcbiAgICB0aGlzLnN0YW5kSW5zLmFkZChyKTtcbiAgICByZXR1cm4gcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1yZWFkIHRoZSBzb3VyY2UgcGFydCBvZiB0aGUgdGFibGUgKHRoZSBzdGFuZC1pbnMgb24gdGhlIGN1cnJlbnQgcGFnZSwgdGhlIGNvdW50KSBhbmQgdGhlXG4gICAqIHNvdXJjZSdzIGNsYXNzIGNvdW50cy4gVGhlIHBhZ2UgaG9sZHMgcmVnaW9ucyBmaXJzdCwgc28gaXRzIHNvdXJjZSByb3dzIHN0YXJ0IGF0XG4gICAqIGBtYXgoZmlyc3QsIHJlZ2lvbnMpYCDiiJIgcmVnaW9ucy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaFNvdXJjZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuaXNBY3RpdmUpIHJldHVybjtcbiAgICBjb25zdCByZXF1ZXN0ID0gKyt0aGlzLnNvdXJjZVJlcXVlc3Q7XG4gICAgY29uc3QgdmlldyA9IHRoaXMuc291cmNlVmlldztcbiAgICBsZXQgcm93czogUmVnaW9uSW5kZXhSb3dbXSA9IFtdO1xuICAgIGxldCB0b3RhbCA9IDA7XG4gICAgbGV0IGNvdW50czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIGlmICh2aWV3ICYmIHRoaXMucmVnaW9uQXBpLmdldFJlZ2lvblNvdXJjZUluZGV4KSB7XG4gICAgICBjb25zdCBvd24gPSB0aGlzLnJlZ2lvbnMubGVuZ3RoO1xuICAgICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heCh0aGlzLnBhZ2luYXRvckZpcnN0LCBvd24pO1xuICAgICAgY29uc3QgbGltaXQgPSBNYXRoLm1heCgwLCB0aGlzLnBhZ2luYXRvckZpcnN0ICsgdGhpcy5wYWdpbmF0b3JSb3dzIC0gc3RhcnQpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgW3BhZ2UsIHBlckNsYXNzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICB0aGlzLnJlZ2lvbkFwaS5nZXRSZWdpb25Tb3VyY2VJbmRleCh7IG9mZnNldDogc3RhcnQgLSBvd24sIGxpbWl0IH0pLFxuICAgICAgICAgIHRoaXMucmVnaW9uQXBpLmdldFJlZ2lvblNvdXJjZUNsYXNzQ291bnRzPy4odGhpcy5zdGFja0NvdW50cyksXG4gICAgICAgIF0pO1xuICAgICAgICByb3dzID0gcGFnZT8ucm93cyA/PyBbXTtcbiAgICAgICAgdG90YWwgPSBwYWdlPy50b3RhbCA/PyAwO1xuICAgICAgICBjb3VudHMgPSBwZXJDbGFzcyA/PyB7fTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tyZWdpb25zXSBjb3VsZCBub3QgbGlzdCB0aGUgcmVnaW9uIHNvdXJjZScsIGVycik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZXF1ZXN0ICE9PSB0aGlzLnNvdXJjZVJlcXVlc3QpIHJldHVybjtcbiAgICB0aGlzLnNvdXJjZVRvdGFsID0gdG90YWw7XG4gICAgdGhpcy5zb3VyY2VSb3dzID0gcm93cy5tYXAoKHIpID0+IHRoaXMuc3RhbmRJbihyKSk7XG4gICAgdGhpcy5zb3VyY2VDbGFzc0NvdW50cyA9IGNvdW50cztcbiAgICB0aGlzLnJlY29tcHV0ZUNsYXNzQ291bnRzKCk7XG4gICAgdGhpcy5jaGFuZ2VkKCk7XG4gIH1cblxuICAvKiogVGFrZSBhIHNvdXJjZSByb3cncyBmZWF0dXJlIGludG8gdGhlIHJlZ2lvbnMsIHRoZW4gcnVuIGB0aGVuYCBvbiB0aGUgcmVnaW9uIGl0IGJlY2FtZS4gKi9cbiAgcHJpdmF0ZSBhc3luYyB0YWtlVGhlbihyb3c6IFJlZ2lvbiwgdGhlbjogKHJlZ2lvbjogUmVnaW9uKSA9PiB2b2lkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgW2lkXSA9IChhd2FpdCB0aGlzLnJlZ2lvbkFwaS5zZWxlY3RTb3VyY2VGZWF0dXJlcz8uKHRoaXMuc291cmNlSWRzKFtyb3ddKSkpID8/IFtdO1xuICAgIGNvbnN0IHJlZ2lvbiA9IHRoaXMucmVnaW9ucy5maW5kKChyKSA9PiByLmlkID09PSBpZCk7XG4gICAgaWYgKHJlZ2lvbikgdGhlbihyZWdpb24pO1xuICB9XG5cbiAgLyoqIFRvZ2dsZSB0aGUgZmlsbGVkIChhdGxhcykgbG9vazogZWFjaCByZWdpb24gZmlsbGVkIGluIGl0cyBjb2xvdXIsIGxhYmVscyBpbnNpZGUuICovXG4gIC8qKiBJbiBhIHZvbHVtZSB2aWV3OiB0aGUgcmVnaW9ucyBkcmF3biB0aHJvdWdoIHRoZSB2b2x1bWUsIG9yIGhpZGRlbiBiZWhpbmQgd2hhdCBpdCBzaG93cy4gKi9cbiAgcHJvdGVjdGVkIHRvZ2dsZVRocm91Z2hWb2x1bWUoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25BcGkuc2V0UmVnaW9uc1Rocm91Z2hWb2x1bWU/LighdGhpcy5yZWdpb25zVGhyb3VnaFZvbHVtZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9nZ2xlRmlsbCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkFwaS5zZXRSZWdpb25TdHlsZT8uKHsgZmlsbE9wYWNpdHk6IHRoaXMucmVnaW9uc0ZpbGxlZCA/IDAgOiBSRUdJT05fRklMTF9PUEFDSVRZIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgb3IgaGlkZSBhIGNsYXNzIGluIHRoZSB2b2x1bWUgdmlldyBhcyBhIDNEIHJlY29uc3RydWN0aW9uIOKAlCBhIHRyZWUgbm9kZSB3aXRoIGV2ZXJ5IGNsYXNzXG4gICAqIHVuZGVyIGl0LCBhcyBvbmUgc3VyZmFjZSBpbiBpdHMgY29sb3VyLlxuICAgKi9cbiAgcHJvdGVjdGVkIHRvZ2dsZUNsYXNzM2QobmFtZTogc3RyaW5nLCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtuYW1lXSk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSBuZXcgTWFwKHRoaXMuc2hvd24zZCk7XG4gICAgaWYgKG5leHQuaGFzKG5hbWUpKSBuZXh0LmRlbGV0ZShuYW1lKTtcbiAgICBlbHNlIG5leHQuc2V0KG5hbWUsIGNsYXNzZXMpO1xuICAgIHRoaXMuc2hvd24zZCA9IG5leHQ7XG4gICAgdGhpcy5zaG93bjNkTmFtZXMgPSBuZXcgU2V0KG5leHQua2V5cygpKTtcbiAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICB0aGlzLnNob3czZCh0aGlzLmdyb3VwczNkKCkpO1xuICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uSGlnaGxpZ2h0KCk7XG4gIH1cblxuICAvKiogSGlkZSAob3Igc2hvdyBhZ2FpbikgdGhlc2UgY2xhc3NlcycgcmVnaW9ucywgd2hlcmV2ZXIgdGhleSBhcmUgZHJhd24uICovXG4gIHByb3RlY3RlZCBzZXRDbGFzc2VzSGlkZGVuKGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdLCBoaWRkZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkFwaS5zZXRDbGFzc2VzSGlkZGVuPy4oY2xhc3NlcywgaGlkZGVuKTtcbiAgfVxuXG4gIC8qKiBUaGUgc3VyZmFjZXMgc2hvd24gaW4gM0QsIGluIHRoZWlyIGNsYXNzZXMnIGNvbG91cnMgbm93LiAqL1xuICBwcml2YXRlIGdyb3VwczNkKCk6IEFycmF5PHsga2V5OiBzdHJpbmc7IGNsYXNzZXM6IHN0cmluZ1tdOyBjb2xvcjogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH0+IHtcbiAgICBjb25zdCB0aXRsZXMgPSBuZXcgTWFwKCh0aGlzLmNsYXNzSGllcmFyY2h5ID8/IFtdKS5tYXAoKG4pID0+IFtuLm5hbWUsIG4udGl0bGVdKSk7XG4gICAgcmV0dXJuIFsuLi50aGlzLnNob3duM2RdLm1hcCgoW2tleSwgY2xhc3Nlc10pID0+IHtcbiAgICAgIGNvbnN0IHRpdGxlID0gdGl0bGVzLmdldChrZXkpO1xuICAgICAgcmV0dXJuIHsga2V5LCBjbGFzc2VzLCBjb2xvcjogdGhpcy50cmVlQ29sb3Ioa2V5KSwgbGFiZWw6IHRpdGxlID8gYCR7a2V5fSDCtyAke3RpdGxlfWAgOiBrZXkgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBUaGUgY2xhc3NlcyBzZWxlY3RlZCBub3c6IHRoZSBjbGFzcyB0cmVlJ3MgcGljayAod2l0aCBpdHMgc3VidHJlZSkgYW5kIHRoZSBzZWxlY3RlZCByb3dzJy4gKi9cbiAgcHJpdmF0ZSBzZWxlY3RlZENsYXNzTmFtZXMoKTogU2V0PHN0cmluZz4ge1xuICAgIGNvbnN0IG5hbWVzID0gbmV3IFNldCh0aGlzLnBpY2tlZENsYXNzZXMpO1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLnNlbGVjdGVkUmVnaW9ucyA/PyBbXSkgaWYgKHIubGFiZWwpIG5hbWVzLmFkZChyLmxhYmVsKTtcbiAgICByZXR1cm4gbmFtZXM7XG4gIH1cblxuICAvKipcbiAgICogSGlnaGxpZ2h0LCBpbiB0aGUgdm9sdW1lIHZpZXcsIHRoZSBzdXJmYWNlcyBob2xkaW5nIGEgc2VsZWN0ZWQgY2xhc3MgKGZvY3VzICsgY29udGV4dDogdGhleVxuICAgKiB0dXJuIG5lYXIgb3BhcXVlLCB0aGUgb3RoZXJzIGZhZGUpLCBhbmQgbWFyayB0aGUgc2VsZWN0ZWQgcm93cycgY2xhc3NlcyBpbiB0aGUgY2xhc3MgbGlzdHMuXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVNlbGVjdGlvbkhpZ2hsaWdodCgpOiB2b2lkIHtcbiAgICBjb25zdCBuYW1lcyA9IHRoaXMuc2VsZWN0ZWRDbGFzc05hbWVzKCk7XG4gICAgY29uc3QgbWFya2VkID0gbmV3IFNldCgodGhpcy5zZWxlY3RlZFJlZ2lvbnMgPz8gW10pLm1hcCgocikgPT4gci5sYWJlbCkuZmlsdGVyKChsKTogbCBpcyBzdHJpbmcgPT4gISFsKSk7XG4gICAgaWYgKFsuLi5tYXJrZWRdLmpvaW4oJ1xcbicpICE9PSBbLi4udGhpcy5tYXJrZWRDbGFzc2VzXS5qb2luKCdcXG4nKSkgdGhpcy5tYXJrZWRDbGFzc2VzID0gbWFya2VkO1xuICAgIGNvbnN0IGtleXMgPSBbLi4udGhpcy5zaG93bjNkXS5maWx0ZXIoKFssIGNsYXNzZXNdKSA9PiBjbGFzc2VzLnNvbWUoKGMpID0+IG5hbWVzLmhhcyhjKSkpLm1hcCgoW2tdKSA9PiBrKTtcbiAgICBjb25zdCBpZCA9IGtleXMuam9pbignXFxuJyk7XG4gICAgaWYgKGlkID09PSB0aGlzLmhpZ2hsaWdodGVkM2QpIHJldHVybjtcbiAgICB0aGlzLmhpZ2hsaWdodGVkM2QgPSBpZDtcbiAgICB0aGlzLnJlZ2lvbkFwaS5oaWdobGlnaHRSZWdpb25DbGFzc2VzM2Q/LihrZXlzKTtcbiAgfVxuXG4gIC8qKiBBIHN1cmZhY2UgY2xpY2tlZCBpbiB0aGUgdm9sdW1lIHZpZXc6IHBpY2sgaXRzIGNsYXNzIGFzIHRoZSB0cmVlIHdvdWxkOyBiZXNpZGUgdGhlbSwgY2xlYXIuICovXG4gIHByaXZhdGUgb25QaWNrZWQzZChrZXk6IHN0cmluZyB8IG51bGwsIGFkZGl0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKGtleSA9PT0gbnVsbCkge1xuICAgICAgaWYgKGFkZGl0aXZlKSByZXR1cm47XG4gICAgICB0aGlzLnBpY2tlZENsYXNzID0gbnVsbDtcbiAgICAgIHRoaXMucGlja2VkQ2xhc3NlcyA9IFtdO1xuICAgICAgdGhpcy5zZWxlY3RlZFJlZ2lvbnMgPSBbXTtcbiAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2VkKCk7XG4gICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdm9pZCB0aGlzLnBpY2tDbGFzc2VzKHsgbmFtZToga2V5LCBjbGFzc2VzOiB0aGlzLnNob3duM2QuZ2V0KGtleSkgPz8gW2tleV0sIGFkZGl0aXZlIH0pO1xuICB9XG5cbiAgLyoqIEEgY2xhc3MgY29sb3VyIGNoYW5nZWQgKGl0cyBzd2F0Y2gsIG9yIE1hbmFnZSk6IHJlcGFpbnQgdGhlIHN1cmZhY2VzIHNob3duIGluIDNEIHdob3NlIGNvbG91ciBpdCBjaGFuZ2VkLiAqL1xuICBwcml2YXRlIHJlY29sb3IzZCgpOiB2b2lkIHtcbiAgICBjb25zdCBncm91cHMgPSB0aGlzLmdyb3VwczNkKCk7XG4gICAgaWYgKCFncm91cHMuc29tZSgoZykgPT4gZy5jb2xvciAhPT0gdGhpcy5jb2xvcnMzZC5nZXQoZy5rZXkpKSkgcmV0dXJuO1xuICAgIHRoaXMuc2hvdzNkKGdyb3Vwcyk7XG4gIH1cblxuICBwcml2YXRlIHNob3czZChncm91cHM6IEFycmF5PHsga2V5OiBzdHJpbmc7IGNsYXNzZXM6IHN0cmluZ1tdOyBjb2xvcjogc3RyaW5nIH0+KTogdm9pZCB7XG4gICAgdGhpcy5jb2xvcnMzZCA9IG5ldyBNYXAoZ3JvdXBzLm1hcCgoZykgPT4gW2cua2V5LCBnLmNvbG9yXSkpO1xuICAgIHRoaXMucmVnaW9uQXBpLnNob3dSZWdpb25DbGFzc2VzM2Q/Lihncm91cHMpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIHRoaXMudG9hc3QoJ2Vycm9yJywgJ0NvdWxkIG5vdCBzaG93IHRoZSByZWdpb24gaW4gM0QnLCBgJHsoZXJyIGFzIEVycm9yKT8ubWVzc2FnZSA/PyBlcnJ9YCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogUGljayBhIGNsYXNzIGluIHRoZSBjbGFzcyB0cmVlOiBzZWxlY3QgaXRzIHJlZ2lvbnMgYW5kIGl0cyBzdWJjbGFzc2VzJywgdGhlIHNvdXJjZSdzIHRha2VuLiAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgcGlja0NsYXNzZXMocGljazogQ2xhc3NUcmVlUGljayk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucGlja2VkQ2xhc3MgPSBwaWNrLm5hbWU7XG4gICAgdGhpcy5waWNrZWRDbGFzc2VzID0gcGljay5hZGRpdGl2ZSA/IFsuLi5uZXcgU2V0KFsuLi50aGlzLnBpY2tlZENsYXNzZXMsIC4uLnBpY2suY2xhc3Nlc10pXSA6IHBpY2suY2xhc3NlcztcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbkhpZ2hsaWdodCgpO1xuICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgIGF3YWl0IHRoaXMucmVnaW9uQXBpLnNlbGVjdFJlZ2lvbkNsYXNzZXM/LihwaWNrLmNsYXNzZXMsIHBpY2suYWRkaXRpdmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvd3MgZm9yIHJlZ2lvbnMgY29taW5nIGZyb20gdGhlIHZpc3VhbGl6ZXI6IG5ldXRyYWwgYFJlZ2lvbmBzIHdpdGggYm91bmRzLFxuICAgKiBjb2xvdXIgYW5kIGxhYmVsIGFscmVhZHkgcG9wdWxhdGVkLiBBIHJlZ2lvbiB3aXRob3V0IGEgY29sb3VyIGlzIHNob3duIHdpdGhcbiAgICogaXRzIGNsYXNzaWZpY2F0aW9uIGNvbG91ciAob3IgdGhlIGRlZmF1bHQgc2hhcGUgY29sb3VyKSDigJQgYXMgYSBjb3B5OiB0aGVcbiAgICogc3RvcmUncyBpbnN0YW5jZXMgYXJlIHNoYXJlZCB3aXRoIGl0cyB1bmRvIGhpc3RvcnkgYW5kIG11c3Qgbm90IGJlIGNoYW5nZWRcbiAgICogaW4gcGxhY2UgKFJULTEpLlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseVJlZ2lvbkNvbG9ycyhyZWdpb25zOiBSZWdpb25bXSk6IFJlZ2lvbltdIHtcbiAgICBjb25zdCBjbGFzc0NvbG9ycyA9IHRoaXMucmVnaW9uQXBpLmdldENsYXNzaWZpY2F0aW9uQ29sb3JzKCk7XG4gICAgcmV0dXJuIHJlZ2lvbnMubWFwKChyZWdpb24pID0+XG4gICAgICByZWdpb24uY29sb3JcbiAgICAgICAgPyByZWdpb25cbiAgICAgICAgOiB3aXRoUmVnaW9uUGF0Y2gocmVnaW9uLCB7IGNvbG9yOiBjbGFzc0NvbG9ycy5nZXQocmVnaW9uLmxhYmVsID8/ICcnKSB8fCB0aGlzLnNoYXBlQ29sb3IgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZWRpdG9yJ3Mgb25lIHdyaXRlIHBhdGggKFJULTEpOiBtYWtlIGBuZXh0YCB0aGUgdGFibGUncyByb3dzIGFuZCBjb21taXRcbiAgICogdGhlbSB0byB0aGUgc3RvcmUg4oCUIGxpdmUsIGFzIG9uZSB1bmRvYWJsZSBzdGVwIChpc1JlZ2lvblNhdmVPbj10cnVlOyB0aGVcbiAgICogcm91dGVyIGtlZXBzIHRoZSBpbnRlbnNpdHktcHJvZmlsZSBsaW5lcykuIFJvd3MgYXJlIHRoZSBzdG9yZSdzIGluc3RhbmNlcyxcbiAgICogc28gYW4gZWRpdCBwYXNzZXMgY29waWVzICh7QGxpbmsgcGF0Y2hSZWdpb25zfSksIG5ldmVyIGNoYW5nZWQgcm93cy4gVGhlXG4gICAqIHJlc3VsdGluZyByZWdpb24tdXBkYXRlIGV2ZW50IGlzIGlnbm9yZWQgKGBfdXBkYXRpbmdGcm9tRWRpdG9yYCksIHNvIHRoZVxuICAgKiBjbGFzcyBsaXN0IGFuZCBjb3VudHMgYXJlIHJlZnJlc2hlZCBoZXJlIChhIHR5cGVkIGNsYXNzIGlzIGFkZGVkOyBqaXQtdWkjNzApLlxuICAgKi9cbiAgcHJpdmF0ZSBjb21taXQobmV4dDogUmVnaW9uW10gPSB0aGlzLnJlZ2lvbnMpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbnMgPSBuZXh0O1xuICAgIHRoaXMuX3VwZGF0aW5nRnJvbUVkaXRvciA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMucmVnaW9uQXBpLnNldEFubm90YXRpb25SZWdpb25zKG5leHQsIHRoaXMuc2hvd1NoYXBlTGFiZWwsIHRydWUsIHRoaXMuZmlsbENvbG9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fdXBkYXRpbmdGcm9tRWRpdG9yID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuc3luY0NsYXNzZXNGcm9tUmVnaW9ucyhuZXh0KTtcbiAgICB0aGlzLnJlY29tcHV0ZUNsYXNzQ291bnRzKCk7XG4gICAgdGhpcy5jaGFuZ2VkKCk7XG4gIH1cblxuICAvKipcbiAgICogQ29weS1vbi13cml0ZSBlZGl0IChyZXZpZXcgUlQtMSkuIFRoZSBlZGl0b3IncyByb3dzIGFyZSB0aGUgcmVnaW9uIHN0b3JlJ3NcbiAgICogbGl2ZSBpbnN0YW5jZXMsIGFuZCB0aGUgc3RvcmUgdGFrZXMgaXRzIHVuZG8gc25hcHNob3Qgb25seSB3aGVuIHRoZSBlZGl0IGlzXG4gICAqIGNvbW1pdHRlZCDigJQgc28gYW4gZWRpdCBtdXN0IHJlcGxhY2UgYSByZWdpb24gd2l0aCBhIHBhdGNoZWQgY29weSAoYW5kIGFueVxuICAgKiBib3VuZHMgaXQgY2hhbmdlcyB3aXRoIG5ldyBib3VuZHMpLCBuZXZlciBtdXRhdGUgdGhlIGluc3RhbmNlIHRoZSBzdG9yZVxuICAgKiBob2xkcy4gUmV0dXJucyB0aGUgY29waWVzIGJ5IG9yaWdpbmFsOyB0aGUgc2VsZWN0aW9uIGFuZCBhbiBvcGVuIGxhYmVsIGVkaXRcbiAgICogZm9sbG93IHRoZW0uXG4gICAqL1xuICBwcml2YXRlIHBhdGNoUmVnaW9ucyhwYXRjaEZvcjogKHI6IFJlZ2lvbikgPT4gUGFydGlhbDxSZWdpb24+IHwgbnVsbCk6IE1hcDxSZWdpb24sIFJlZ2lvbj4ge1xuICAgIGNvbnN0IGNvcGllcyA9IG5ldyBNYXA8UmVnaW9uLCBSZWdpb24+KCk7XG4gICAgdGhpcy5yZWdpb25zID0gdGhpcy5yZWdpb25zLm1hcCgocikgPT4ge1xuICAgICAgY29uc3QgcGF0Y2ggPSBwYXRjaEZvcihyKTtcbiAgICAgIGlmICghcGF0Y2gpIHJldHVybiByO1xuICAgICAgY29uc3QgY29weSA9IHdpdGhSZWdpb25QYXRjaChyLCBwYXRjaCk7XG4gICAgICBjb3BpZXMuc2V0KHIsIGNvcHkpO1xuICAgICAgcmV0dXJuIGNvcHk7XG4gICAgfSk7XG4gICAgaWYgKGNvcGllcy5zaXplKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUmVnaW9ucyA9ICh0aGlzLnNlbGVjdGVkUmVnaW9ucyA/PyBbXSkubWFwKChyKSA9PiBjb3BpZXMuZ2V0KHIpID8/IHIpO1xuICAgICAgaWYgKFsuLi5jb3BpZXMua2V5cygpXS5zb21lKChyKSA9PiB0aGlzLmVkaXRpbmdMYWJlbFJlZ2lvbnMuaGFzKHIpKSkge1xuICAgICAgICB0aGlzLmVkaXRpbmdMYWJlbFJlZ2lvbnMgPSBuZXcgTWFwKFsuLi50aGlzLmVkaXRpbmdMYWJlbFJlZ2lvbnNdLm1hcCgoW3IsIGRdKSA9PiBbY29waWVzLmdldChyKSA/PyByLCBkXSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29waWVzO1xuICB9XG5cbiAgLyoqIFNldCBvbmUgcmVnaW9uJ3Mgb3V0bGluZSBjb2xvdXIgKGFuIGV4cGxpY2l0IG92ZXJyaWRlKSBhbmQgY29tbWl0IGxpdmUuICovXG4gIHByb3RlY3RlZCBjaGFuZ2VSZWdpb25Db2xvcihyZWdpb246IFJlZ2lvbiwgY29sb3I6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghY29sb3IgfHwgcmVnaW9uLmNvbG9yID09PSBjb2xvcikgcmV0dXJuO1xuICAgIC8vIGNvbG9yT3ZlcnJpZGRlbjogZXhwbGljaXQgcGVyLXJlZ2lvbiBjb2xvdXIg4oCUIHByZXNlcnZlIGl0IGFnYWluc3QgcHJlc2V0IChyZSlhcHBseSAoaml0LXVpIzcwKVxuICAgIHRoaXMucGF0Y2hSZWdpb25zKChyKSA9PiAociA9PT0gcmVnaW9uID8geyBjb2xvciwgY29sb3JPdmVycmlkZGVuOiB0cnVlIH0gOiBudWxsKSk7XG4gICAgdGhpcy5jb21taXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZnRlciBhIGxhYmVsIGVkaXQgb24gYHJlZ2lvbmA6IGdpdmUgZXZlcnkgbGFiZWxsZWQgcm93IHdpdGhvdXQgYSBjb2xvdXIgaXRzXG4gICAqIGNsYXNzIGNvbG91ciAocHJlc2V0IG9yIGZhbGxiYWNrLCBhcyB0aGUgc3RvcmUgd2lsbCksIGFuZCBjb21taXQgd2hlblxuICAgKiBgY29tbWl0YCBpcyBzZXQuXG4gICAqL1xuICBwcm90ZWN0ZWQgbGFiZWxSZWdpb25VcGRhdGUocmVnaW9uOiBSZWdpb24sIGNvbW1pdCA9IGZhbHNlKSB7XG4gICAgdGhpcy5maWxsQ2xhc3NDb2xvcnMoKTtcbiAgICBpZiAoY29tbWl0KSB0aGlzLmNvbW1pdCgpO1xuICB9XG5cbiAgLyoqIExhYmVsbGVkIHJvd3Mgd2l0aG91dCBhIGNvbG91ciBnZXQgdGhlaXIgY2xhc3MgY29sb3VyIChjb3BpZXMpLiAqL1xuICBwcml2YXRlIGZpbGxDbGFzc0NvbG9ycygpOiB2b2lkIHtcbiAgICB0aGlzLnBhdGNoUmVnaW9ucygocikgPT4gKCFyLmNvbG9yICYmIHIubGFiZWwgPyB7IGNvbG9yOiB0aGlzLmNvbG9yRm9yTmFtZShyLmxhYmVsKSB9IDogbnVsbCkpO1xuICB9XG5cbiAgLyoqIFRoZSBjdXJyZW50IHBhZ2Ugb2YgdGhlIHRhYmxlLiBNZW1vaXplZCBvbiAocmVnaW9ucywgZmlyc3QsIHJvd3MpLCBzb1xuICAgKiAgY2hhbmdlIGRldGVjdGlvbiBkb2Vzbid0IGhhbmQgcC10YWJsZSBhIG5ldyBhcnJheSBldmVyeSB0aWNrIChSVC0yMCkuICovXG4gIHByb3RlY3RlZCBnZXQgcGFnZWRSZWdpb25zKCk6IFJlZ2lvbltdIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLl9wYWdlS2V5O1xuICAgIGlmIChcbiAgICAgIGtleS5yZWdpb25zICE9PSB0aGlzLnJlZ2lvbnMgfHxcbiAgICAgIGtleS5zb3VyY2UgIT09IHRoaXMuc291cmNlUm93cyB8fFxuICAgICAga2V5LmZpcnN0ICE9PSB0aGlzLnBhZ2luYXRvckZpcnN0IHx8XG4gICAgICBrZXkucm93cyAhPT0gdGhpcy5wYWdpbmF0b3JSb3dzXG4gICAgKSB7XG4gICAgICB0aGlzLl9wYWdlS2V5ID0ge1xuICAgICAgICByZWdpb25zOiB0aGlzLnJlZ2lvbnMsXG4gICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2VSb3dzLFxuICAgICAgICBmaXJzdDogdGhpcy5wYWdpbmF0b3JGaXJzdCxcbiAgICAgICAgcm93czogdGhpcy5wYWdpbmF0b3JSb3dzLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IG93biA9IHRoaXMucmVnaW9ucy5zbGljZSh0aGlzLnBhZ2luYXRvckZpcnN0LCB0aGlzLnBhZ2luYXRvckZpcnN0ICsgdGhpcy5wYWdpbmF0b3JSb3dzKTtcbiAgICAgIHRoaXMuX3BhZ2UgPVxuICAgICAgICBvd24ubGVuZ3RoID49IHRoaXMucGFnaW5hdG9yUm93c1xuICAgICAgICAgID8gb3duXG4gICAgICAgICAgOiBbLi4ub3duLCAuLi50aGlzLnNvdXJjZVJvd3Muc2xpY2UoMCwgdGhpcy5wYWdpbmF0b3JSb3dzIC0gb3duLmxlbmd0aCldO1xuICAgICAgLy8gQSBuZXcgcGFnZSBtYXkgc2hvdyBjbGFzc2VzIHdob3NlIHZvbHVtZSBpcyBub3Qga25vd24geWV0IChhZnRlciB0aGlzIGNoZWNrKS5cbiAgICAgIGlmICh0aGlzLnZvbHVtZVZpZXcpIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMucmVxdWVzdFZvbHVtZXMoKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9wYWdlO1xuICB9XG5cbiAgLyoqIEluIGEgdm9sdW1lIHZpZXcsIGVhY2ggY2xhc3MncyB2b2x1bWUgb3ZlciB0aGUgd2hvbGUgc3RhY2ssIGZvciB0aGUgdGFibGUgKG51bGw6IGFyZWFzKS4gKi9cbiAgcHJvdGVjdGVkIHRhYmxlVm9sdW1lczogUmVhZG9ubHlNYXA8c3RyaW5nLCBudW1iZXIgfCBudWxsPiB8IG51bGwgPSBudWxsO1xuICAvKiogQnVtcGVkIHdoZW4gdGhlIHJlZ2lvbnMgY2hhbmdlLCBzbyBhIHZvbHVtZSBjb21wdXRlZCBiZWZvcmUgaXMgZHJvcHBlZC4gKi9cbiAgcHJpdmF0ZSB2b2x1bWVSZXF1ZXN0ID0gMDtcblxuICAvKiogQ29tcHV0ZSB0aGUgdm9sdW1lcyBvZiB0aGUgY2xhc3NlcyBvbiB0aGUgdGFibGUncyBwYWdlIHRoYXQgYXJlIG5vdCBrbm93biB5ZXQuICovXG4gIHByaXZhdGUgcmVxdWVzdFZvbHVtZXMoKTogdm9pZCB7XG4gICAgY29uc3QgYXBpID0gdGhpcy5yZWdpb25BcGkuZ2V0Q2xhc3NWb2x1bWVzPy5iaW5kKHRoaXMucmVnaW9uQXBpKTtcbiAgICAvLyBDbG9zZWQ6IGFza2VkIGZvciBhZ2FpbiB3aGVuIGl0IG9wZW5zIChzZWUgYWN0aXZlKS5cbiAgICBpZiAoIXRoaXMuaXNBY3RpdmUpIHJldHVybjtcbiAgICBpZiAoIXRoaXMudm9sdW1lVmlldyB8fCAhYXBpKSB7XG4gICAgICBpZiAodGhpcy50YWJsZVZvbHVtZXMpIHtcbiAgICAgICAgdGhpcy50YWJsZVZvbHVtZXMgPSBudWxsO1xuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qga25vd24gPSB0aGlzLnRhYmxlVm9sdW1lcyA/PyBuZXcgTWFwPHN0cmluZywgbnVtYmVyIHwgbnVsbD4oKTtcbiAgICBjb25zdCBsYWJlbHMgPSBuZXcgU2V0KHRoaXMucGFnZWRSZWdpb25zLm1hcCgocikgPT4gci5sYWJlbCkuZmlsdGVyKChsKTogbCBpcyBzdHJpbmcgPT4gISFsKSk7XG4gICAgY29uc3QgbWlzc2luZyA9IFsuLi5sYWJlbHNdLmZpbHRlcigobCkgPT4gIWtub3duLmhhcyhsKSk7XG4gICAgaWYgKCFtaXNzaW5nLmxlbmd0aCAmJiB0aGlzLnRhYmxlVm9sdW1lcykgcmV0dXJuO1xuICAgIHRoaXMudGFibGVWb2x1bWVzID0gbmV3IE1hcChbLi4ua25vd24sIC4uLm1pc3NpbmcubWFwKChsKTogW3N0cmluZywgbnVsbF0gPT4gW2wsIG51bGxdKV0pO1xuICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgIGlmICghbWlzc2luZy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy52b2x1bWVSZXF1ZXN0O1xuICAgIGFwaShtaXNzaW5nKS50aGVuKFxuICAgICAgKHZvbHVtZXMpID0+IHtcbiAgICAgICAgaWYgKHJlcXVlc3QgIT09IHRoaXMudm9sdW1lUmVxdWVzdCB8fCAhdGhpcy50YWJsZVZvbHVtZXMpIHJldHVybjtcbiAgICAgICAgdGhpcy50YWJsZVZvbHVtZXMgPSBuZXcgTWFwKFsuLi50aGlzLnRhYmxlVm9sdW1lcywgLi4uT2JqZWN0LmVudHJpZXModm9sdW1lcyldKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICB9LFxuICAgICAgKGVycikgPT4ge1xuICAgICAgICBpZiAocmVxdWVzdCAhPT0gdGhpcy52b2x1bWVSZXF1ZXN0IHx8ICF0aGlzLnRhYmxlVm9sdW1lcykgcmV0dXJuO1xuICAgICAgICAvLyBMZWF2ZSB0aGVtIHVua25vd24gKCfigJQnKSByYXRoZXIgdGhhbiBjb21wdXRpbmcgZm9yZXZlci5cbiAgICAgICAgY29uc3QgbmV4dCA9IG5ldyBNYXAodGhpcy50YWJsZVZvbHVtZXMpO1xuICAgICAgICBmb3IgKGNvbnN0IGwgb2YgbWlzc2luZykgbmV4dC5kZWxldGUobCk7XG4gICAgICAgIHRoaXMudGFibGVWb2x1bWVzID0gbmV4dDtcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICAgIGNvbnNvbGUud2FybignW3JlZ2lvbnNdIGNvdWxkIG5vdCBjb21wdXRlIGNsYXNzIHZvbHVtZXMnLCBlcnIpO1xuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLyoqIFRoZSByZWdpb25zIGNoYW5nZWQgKG9yIHRoZSB2aWV3IGRpZCk6IGZvcmdldCB0aGUgdm9sdW1lcyBhbmQgY29tcHV0ZSB0aGUgcGFnZSdzIGFnYWluLiAqL1xuICBwcml2YXRlIHJlc2V0Vm9sdW1lcygpOiB2b2lkIHtcbiAgICB0aGlzLnZvbHVtZVJlcXVlc3QrKztcbiAgICB0aGlzLnRhYmxlVm9sdW1lcyA9IG51bGw7XG4gICAgdGhpcy5yZXF1ZXN0Vm9sdW1lcygpO1xuICB9XG4gIHByaXZhdGUgX3BhZ2VLZXk6IHsgcmVnaW9ucz86IFJlZ2lvbltdOyBzb3VyY2U/OiBSZWdpb25bXTsgZmlyc3Q/OiBudW1iZXI7IHJvd3M/OiBudW1iZXIgfSA9IHt9O1xuICBwcml2YXRlIF9wYWdlOiBSZWdpb25bXSA9IFtdO1xuXG4gIHByb3RlY3RlZCBvblBhZ2VDaGFuZ2UoZXZlbnQ6IHsgZmlyc3Q/OiBudW1iZXI7IHJvd3M/OiBudW1iZXIgfSkge1xuICAgIHRoaXMucGFnaW5hdG9yRmlyc3QgPSBldmVudC5maXJzdCA/PyAwO1xuICAgIHRoaXMucGFnaW5hdG9yUm93cyA9IGV2ZW50LnJvd3MgPz8gdGhpcy5wYWdpbmF0b3JSb3dzO1xuICAgIHZvaWQgdGhpcy5yZWZyZXNoU291cmNlKCk7XG4gIH1cblxuICAvKiogU2VsZWN0IGV2ZXJ5IHJlZ2lvbiBpbiB0aGUgdGFibGUgKGFuZCBoaWdobGlnaHQgdGhlbSBvbiB0aGUgZGlhZ3JhbSksIHRoZSBzb3VyY2UncyB0YWtlbi4gKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHNlbGVjdEFsbFJlZ2lvbnMoKSB7XG4gICAgdGhpcy5zZWxlY3RlZFJlZ2lvbnMgPSBbLi4udGhpcy5yZWdpb25zXTtcbiAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlZCgpO1xuICAgIGlmICghdGhpcy5zb3VyY2VUb3RhbCB8fCAhdGhpcy5yZWdpb25BcGkuZ2V0UmVnaW9uU291cmNlSW5kZXgpIHJldHVybjtcbiAgICBjb25zdCBwYWdlID0gYXdhaXQgdGhpcy5yZWdpb25BcGkuZ2V0UmVnaW9uU291cmNlSW5kZXgoeyBvZmZzZXQ6IDAsIGxpbWl0OiBTRUxFQ1RfQUxMX1NPVVJDRV9MSU1JVCB9KTtcbiAgICBjb25zdCBpZHMgPSAocGFnZT8ucm93cyA/PyBbXSkubWFwKChyKSA9PiByLmlkKTtcbiAgICBpZiAoaWRzLmxlbmd0aCkgYXdhaXQgdGhpcy5yZWdpb25BcGkuc2VsZWN0U291cmNlRmVhdHVyZXM/LihpZHMsIHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlbGV0ZVNlbGVjdGVkUmVnaW9ucygpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZFJlZ2lvbnMgJiYgdGhpcy5zZWxlY3RlZFJlZ2lvbnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZnJvbVNvdXJjZSA9IHRoaXMuc2VsZWN0ZWRSZWdpb25zLmZpbHRlcigocikgPT4gdGhpcy5zdGFuZElucy5oYXMocikpO1xuICAgICAgaWYgKGZyb21Tb3VyY2UubGVuZ3RoKSB0aGlzLnJlZ2lvbkFwaS5kZWxldGVTb3VyY2VGZWF0dXJlcz8uKHRoaXMuc291cmNlSWRzKGZyb21Tb3VyY2UpKTtcbiAgICAgIC8vIEZpbHRlciBieSBpZCDigJQgb2JqZWN0IGlkZW50aXR5IGlzbid0IHJlbGlhYmxlIGFjcm9zcyByZS1wYXJzZXMsXG4gICAgICAvLyBhbmQgbmFtZSBpcyBhIHVzZXItZWRpdGFibGUgbGFiZWwgdGhhdCBtYXkgY29sbGlkZS5cbiAgICAgIGNvbnN0IHJlbW92ZWQgPSBuZXcgU2V0KHRoaXMuc2VsZWN0ZWRSZWdpb25zLm1hcCgocikgPT4gci5pZCkpO1xuICAgICAgdGhpcy5zZWxlY3RlZFJlZ2lvbnMgPSBbXTtcbiAgICAgIHRoaXMuY29tbWl0KHRoaXMucmVnaW9ucy5maWx0ZXIoKHIpID0+ICFyZW1vdmVkLmhhcyhyLmlkKSkpO1xuICAgICAgdGhpcy5jbGFtcFBhZ2luYXRvckZpcnN0KCk7XG4gICAgICAvLyBTeW5jIHRoZSBjbGVhcmVkIHNlbGVjdGlvbiB3aXRoIHRoZSBwbG90J3MgaGlnaGxpZ2h0IHN0YXRlLlxuICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZWQoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJBbGxSZWdpb25zKCkge1xuICAgIHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcbiAgICAgIGtleTogJ3Bvc2l0aW9uRGlhbG9nJyxcbiAgICAgIG1lc3NhZ2U6ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIGFsbCByZWdpb25zPycsXG4gICAgICBhY2NlcHQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJlZ2lvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5wYWdpbmF0b3JGaXJzdCA9IDA7XG4gICAgICAgIHRoaXMuY29tbWl0KFtdKTtcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZWQoKTtcbiAgICAgICAgaWYgKHRoaXMuaGFzUmVnaW9uU291cmNlKSB2b2lkIHRoaXMuZGVsZXRlQWxsU291cmNlRmVhdHVyZXMoKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogRGVsZXRlIGV2ZXJ5IGZlYXR1cmUgc3RpbGwgaW4gdGhlIHNsaWNlJ3MgcmVnaW9uIHNvdXJjZSAod2l0aCBcIkRlbGV0ZSBhbGwgcmVnaW9uc1wiKS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBkZWxldGVBbGxTb3VyY2VGZWF0dXJlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMucmVnaW9uQXBpLmdldFJlZ2lvblNvdXJjZUluZGV4O1xuICAgIGlmICghaW5kZXggfHwgIXRoaXMucmVnaW9uQXBpLmRlbGV0ZVNvdXJjZUZlYXR1cmVzKSByZXR1cm47XG4gICAgY29uc3QgcGFnZSA9IGF3YWl0IGluZGV4LmNhbGwodGhpcy5yZWdpb25BcGksIHsgb2Zmc2V0OiAwLCBsaW1pdDogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgfSk7XG4gICAgaWYgKHBhZ2U/LnJvd3MubGVuZ3RoKSB0aGlzLnJlZ2lvbkFwaS5kZWxldGVTb3VyY2VGZWF0dXJlcyhwYWdlLnJvd3MubWFwKChyKSA9PiByLmlkKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVsZXRlUmVnaW9uKHNoYXBlSWR4OiBudW1iZXIpIHtcbiAgICAvLyBBIHJvdyBwYXN0IHRoZSByZWdpb25zIGlzIGEgc291cmNlIGZlYXR1cmU6IGRlbGV0ZSBpdCBmcm9tIHRoZSBzb3VyY2UuXG4gICAgaWYgKHNoYXBlSWR4ID49IHRoaXMucmVnaW9ucy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHJvdyA9IHRoaXMuc291cmNlUm93c1tzaGFwZUlkeCAtIE1hdGgubWF4KHRoaXMucGFnaW5hdG9yRmlyc3QsIHRoaXMucmVnaW9ucy5sZW5ndGgpXTtcbiAgICAgIGlmIChyb3cpIHRoaXMucmVnaW9uQXBpLmRlbGV0ZVNvdXJjZUZlYXR1cmVzPy4odGhpcy5zb3VyY2VJZHMoW3Jvd10pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMucmVnaW9uc1tzaGFwZUlkeF07XG4gICAgaWYgKHJlbW92ZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSZWdpb25zID0gdGhpcy5zZWxlY3RlZFJlZ2lvbnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSByZW1vdmVkLmlkKTtcbiAgICB9XG4gICAgdGhpcy5jb21taXQodGhpcy5yZWdpb25zLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gc2hhcGVJZHgpKTtcbiAgICB0aGlzLmNsYW1wUGFnaW5hdG9yRmlyc3QoKTtcbiAgICAvLyBSZS1lbWl0IHRoZSAocG9zc2libHkgdHJpbW1lZCkgc2VsZWN0aW9uIHNvIHRoZSBwbG90J3MgaGlnaGxpZ2h0IHN0YXlzXG4gICAgLy8gaW4gc3luYyB3aXRoIHdoYXQncyBzdGlsbCBpbiB0aGUgdGFibGUuXG4gICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xhbXBQYWdpbmF0b3JGaXJzdCgpIHtcbiAgICBjb25zdCBtYXhGaXJzdCA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IoKHRoaXMudGFibGVUb3RhbCAtIDEpIC8gdGhpcy5wYWdpbmF0b3JSb3dzKSAqIHRoaXMucGFnaW5hdG9yUm93cyk7XG4gICAgaWYgKHRoaXMucGFnaW5hdG9yRmlyc3QgPiBtYXhGaXJzdCkge1xuICAgICAgdGhpcy5wYWdpbmF0b3JGaXJzdCA9IG1heEZpcnN0O1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgY2hhbmdlU2hvd1NoYXBlTGFiZWwoc2hvd0xhYmVsOiBib29sZWFuKSB7XG4gICAgdGhpcy5jb21taXQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc0VkaXRpbmdMYWJlbChyZWdpb246IFJlZ2lvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVkaXRpbmdMYWJlbFJlZ2lvbnMuaGFzKHJlZ2lvbik7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhcnRFZGl0TGFiZWwocmVnaW9uOiBSZWdpb24sIGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7IC8vIGRvbid0IHRvZ2dsZSByb3cgc2VsZWN0aW9uXG4gICAgaWYgKHRoaXMuc3RhbmRJbnMuaGFzKHJlZ2lvbikpIHtcbiAgICAgIHZvaWQgdGhpcy50YWtlVGhlbihyZWdpb24sIChyKSA9PiB0aGlzLnN0YXJ0RWRpdExhYmVsKHIpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQSBuZXcgbWFwIHBlciBzdGFydC9zdG9wLCBzbyB0aGUgT25QdXNoIHRhYmxlIHNlZXMgdGhlIGNoYW5nZS5cbiAgICB0aGlzLmVkaXRpbmdMYWJlbFJlZ2lvbnMgPSBuZXcgTWFwKHRoaXMuZWRpdGluZ0xhYmVsUmVnaW9ucykuc2V0KHJlZ2lvbiwgcmVnaW9uLmxhYmVsID8/ICcnKTtcbiAgfVxuXG4gIC8qKiBUaGUgbGFiZWwgdHlwZWQgc28gZmFyIGZvciBhIHJvdyBpbiBlZGl0IG1vZGUgKG5vIHJlLXJlbmRlciBuZWVkZWQpLiAqL1xuICBwcm90ZWN0ZWQgc2V0TGFiZWxEcmFmdChyZWdpb246IFJlZ2lvbiwgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVkaXRpbmdMYWJlbFJlZ2lvbnMuaGFzKHJlZ2lvbikpIHRoaXMuZWRpdGluZ0xhYmVsUmVnaW9ucy5zZXQocmVnaW9uLCB2YWx1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RvcEVkaXRMYWJlbChyZWdpb246IFJlZ2lvbiwgY29tbWl0OiBib29sZWFuLCBldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IGRyYWZ0ID0gdGhpcy5lZGl0aW5nTGFiZWxSZWdpb25zLmdldChyZWdpb24pO1xuICAgIGlmICh0aGlzLmVkaXRpbmdMYWJlbFJlZ2lvbnMuaGFzKHJlZ2lvbikpIHtcbiAgICAgIGNvbnN0IG5leHQgPSBuZXcgTWFwKHRoaXMuZWRpdGluZ0xhYmVsUmVnaW9ucyk7XG4gICAgICBuZXh0LmRlbGV0ZShyZWdpb24pO1xuICAgICAgdGhpcy5lZGl0aW5nTGFiZWxSZWdpb25zID0gbmV4dDtcbiAgICB9XG4gICAgaWYgKGNvbW1pdCkge1xuICAgICAgLy8gQSBjaGFuZ2VkIGxhYmVsIGNvbW1pdHMgYXMgYSByZXBsYWNlbWVudCByZWdpb24sIHNvIGl0IGlzIHVuZG9hYmxlIChSVC0xKS5cbiAgICAgIGNvbnN0IGVkaXRlZCA9XG4gICAgICAgIGRyYWZ0ICE9PSB1bmRlZmluZWQgJiYgZHJhZnQgIT09IHJlZ2lvbi5sYWJlbFxuICAgICAgICAgID8gKHRoaXMucGF0Y2hSZWdpb25zKChyKSA9PiAociA9PT0gcmVnaW9uID8geyBsYWJlbDogZHJhZnQgfSA6IG51bGwpKS5nZXQocmVnaW9uKSA/PyByZWdpb24pXG4gICAgICAgICAgOiByZWdpb247XG4gICAgICB0aGlzLmxhYmVsUmVnaW9uVXBkYXRlKGVkaXRlZCwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlZ2lvbiBhcmVhIGZvciBkaXNwbGF5ICjCtW3Csi9tbcKyIHdoZW4gdGhlIGltYWdlIGlzIHNjYWxlZCwgZWxzZSBweMKyKTtcbiAgICogIGVtcHR5IGZvciBhIGRlZ2VuZXJhdGUgcmVnaW9uLiBTZWUgYHJlZ2lvbi1tZXRyaWNzYC4gKi9cbiAgcHJvdGVjdGVkIHJlZ2lvbkFyZWEocmVnaW9uOiBSZWdpb24pOiBzdHJpbmcge1xuICAgIHJldHVybiBmb3JtYXRBcmVhKHJlZ2lvbkFyZWFQeChyZWdpb24pLCB0aGlzLm1wcCk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgcm91bmRzIGFsbCB0aGUgcmVjdGFuZ2xlIHJlZ2lvbnMgbGVuZ3RocyB0byBtdWx0aXBsZSBvZiA1MTJcbiAgICovXG4gIHByb3RlY3RlZCByb3VuZFJlY3RhbmdsZUxlbmd0aHMoKSB7XG4gICAgdGhpcy5wYXRjaFJlZ2lvbnMoKHJlZ2lvbikgPT4ge1xuICAgICAgY29uc3QgcmVjdCA9IHJlZ2lvbi5ib3VuZHM7XG4gICAgICBpZiAoIShyZWN0IGluc3RhbmNlb2YgUmVjdGFuZ2xlKSkgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBib3VuZHM6IE9iamVjdC5hc3NpZ24obmV3IFJlY3RhbmdsZSgpLCByZWN0LCB7XG4gICAgICAgICAgaGVpZ2h0OiBNYXRoLnJvdW5kKHJlY3QuaGVpZ2h0IC8gNTEyKSAqIDUxMixcbiAgICAgICAgICB3aWR0aDogTWF0aC5yb3VuZChyZWN0LndpZHRoIC8gNTEyKSAqIDUxMixcbiAgICAgICAgfSksXG4gICAgICB9O1xuICAgIH0pO1xuICAgIHRoaXMuY29tbWl0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvd0hlbHAoKSB7XG4gICAgdGhpcy5kaXNwbGF5SGVscERpYWxvZyA9IHRydWU7XG4gIH1cblxuICAvKiogT3BlbiB0aGUgY29sb3VyIGRpYWxvZyBmb3IgdGhlIGN1cnJlbnRseS1zZWxlY3RlZCByZWdpb24ocyksIGJ1aWxkaW5nIG9uZVxuICAgKiAgY29sb3VyIHBpY2tlciBwZXIgdW5pcXVlIGNsYXNzIGluIHRoZSBzZWxlY3Rpb24uIEVhY2ggcGlja2VyIGlzIHNlZWRlZCB3aXRoXG4gICAqICB0aGUgZmlyc3Qgc2VsZWN0ZWQgcmVnaW9uIG9mIHRoYXQgY2xhc3MncyBjb2xvdXIgKGVsc2UgdGhlIGNsYXNzIGNvbG91cikuICovXG4gIHByb3RlY3RlZCBvcGVuQ29sb3JEaWFsb2coKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkUmVnaW9ucz8ubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3Qgc2VlZEJ5TGFiZWwgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgcmVnaW9uIG9mIHRoaXMuc2VsZWN0ZWRSZWdpb25zKSB7XG4gICAgICBjb25zdCBsYWJlbCA9IHJlZ2lvbi5sYWJlbD8udHJpbSgpID8/ICcnO1xuICAgICAgaWYgKHNlZWRCeUxhYmVsLmhhcyhsYWJlbCkpIGNvbnRpbnVlO1xuICAgICAgc2VlZEJ5TGFiZWwuc2V0KGxhYmVsLCByZWdpb24uY29sb3IgPz8gKGxhYmVsID8gdGhpcy5jb2xvckZvck5hbWUobGFiZWwpIDogdGhpcy5zaGFwZUNvbG9yKSk7XG4gICAgfVxuICAgIHRoaXMuY2xhc3NDb2xvckVkaXRzID0gWy4uLnNlZWRCeUxhYmVsXS5tYXAoKFtsYWJlbCwgY29sb3JdKSA9PiAoeyBsYWJlbCwgY29sb3IgfSkpO1xuICAgIHRoaXMuc2hvd0NvbG9yRGlhbG9nID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBBcHBseSBlYWNoIGNsYXNzJ3MgY2hvc2VuIGNvbG91ciB0byB0aGUgc2VsZWN0ZWQgcmVnaW9ucyBvZiB0aGF0IGNsYXNzIChhblxuICAgKiAgZXhwbGljaXQgb3ZlcnJpZGUpIGFuZCBjb21taXQgbGl2ZS4gKi9cbiAgcHJvdGVjdGVkIGFwcGx5Q29sb3JUb1NlbGVjdGVkKGVkaXRzOiBDbGFzc0NvbG9yRWRpdFtdID0gdGhpcy5jbGFzc0NvbG9yRWRpdHMpIHtcbiAgICBjb25zdCBjb2xvckJ5TGFiZWwgPSBuZXcgTWFwKGVkaXRzLm1hcCgoZSkgPT4gW2UubGFiZWwsIGUuY29sb3JdKSk7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBuZXcgU2V0KHRoaXMuc2VsZWN0ZWRSZWdpb25zID8/IFtdKTtcbiAgICB0aGlzLnBhdGNoUmVnaW9ucygocmVnaW9uKSA9PiB7XG4gICAgICBpZiAoIXNlbGVjdGVkLmhhcyhyZWdpb24pKSByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IGxhYmVsID0gcmVnaW9uLmxhYmVsPy50cmltKCkgPz8gJyc7XG4gICAgICBjb25zdCBjb2xvciA9IGNvbG9yQnlMYWJlbC5nZXQobGFiZWwpO1xuICAgICAgaWYgKCFjb2xvcikgcmV0dXJuIG51bGw7XG4gICAgICAvLyBleHBsaWNpdCBjb2xvdXIg4oCUIHByZXNlcnZlIGFnYWluc3QgcHJlc2V0IChyZSlhcHBseSAoaml0LXVpIzcwKVxuICAgICAgcmV0dXJuIHsgY29sb3IsIGNvbG9yT3ZlcnJpZGRlbjogdHJ1ZSB9O1xuICAgIH0pO1xuICAgIHRoaXMuY29tbWl0KCk7XG4gICAgdGhpcy5zaG93Q29sb3JEaWFsb2cgPSBmYWxzZTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBhbm5vdGF0aW9uLWNsYXNzIHByZXNldHMgKGppdC11aSM3MCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFJlc29sdmUgdGhlIGRpc3BsYXkgY29sb3VyIGZvciBhIGNsYXNzIG5hbWUgKHByZXNldCBjb2xvdXIgb3IgZGV0ZXJtaW5pc3RpYyBmYWxsYmFjaykuICovXG4gIHByb3RlY3RlZCBjb2xvckZvck5hbWUobmFtZT86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5hbWUgPyBjb2xvckZvckxhYmVsKG5hbWUsIHRoaXMucHJlc2V0U2V0KSA6IHRoaXMuc2hhcGVDb2xvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgZXZlcnkgY2xhc3MgbGFiZWwgcHJlc2VudCBpbiB0aGUgbG9hZGVkIHJlZ2lvbnMgZXhpc3RzIGluIHRoZSBwcmVzZXRcbiAgICogbGlzdCwgYXV0by1hZGRpbmcgYW55IHRoYXQgYXJlIG1pc3NpbmcgKHVzaW5nIHRoZSByZWdpb24ncyBhbHJlYWR5LXJlc29sdmVkXG4gICAqIGNvbG91cikuIFRoaXMgbWFrZXMgY2xhc3NlcyBjYXJyaWVkIGluIGEgbG9hZGVkL2ltcG9ydGVkIEdlb0pTT04gc2hvdyB1cCBhc1xuICAgKiBjaGlwcyArIENsYXNzLWRyb3Bkb3duIG9wdGlvbnMgKGEgcC1kcm9wZG93biBjYW4ndCBkaXNwbGF5IGEgdmFsdWUgdGhhdCBpc24ndFxuICAgKiBhbiBvcHRpb24pIGFuZCBsZXRzIHRoZSB1c2VyIG1hbmFnZSB0aGVtLiBUaGUgcGxhY2Vob2xkZXIgJ2xlZ2VuZCcgYW5kIGVtcHR5XG4gICAqIGxhYmVscyBhcmUgaWdub3JlZC4gKGppdC11aSM3MClcbiAgICovXG4gIHByaXZhdGUgc3luY0NsYXNzZXNGcm9tUmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSk6IHZvaWQge1xuICAgIGNvbnN0IGtleU9mID0gKGw6IHN0cmluZykgPT4gcHJlc2V0S2V5KHRoaXMucHJlc2V0U2V0LCBsKTtcbiAgICBjb25zdCBrbm93biA9IG5ldyBTZXQodGhpcy5wcmVzZXRTZXQuY2xhc3Nlcy5tYXAoKGMpID0+IGtleU9mKGMubmFtZSkpKTtcbiAgICBjb25zdCBhZGRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgciBvZiByZWdpb25zKSB7XG4gICAgICBjb25zdCBsYWJlbCA9IHIubGFiZWw/LnRyaW0oKTtcbiAgICAgIGlmICghbGFiZWwgfHwgbGFiZWwgPT09ICdsZWdlbmQnKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGsgPSBrZXlPZihsYWJlbCk7XG4gICAgICBpZiAoa25vd24uaGFzKGspIHx8IGFkZGVkLmhhcyhrKSkgY29udGludWU7XG4gICAgICBhZGRlZC5hZGQoayk7XG4gICAgICB0aGlzLnJlZ2lvbkFwaS51cHNlcnRDbGFzcyh7XG4gICAgICAgIG5hbWU6IGxhYmVsLFxuICAgICAgICBjb2xvcjogci5jb2xvciB8fCBjb2xvckZvckxhYmVsKGxhYmVsLCB0aGlzLnByZXNldFNldCksXG4gICAgICAgIHNvdXJjZTogJ2F1dG8nLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIERvY2tlZCBDbGFzc2VzIHBhbmVsIChqaXQtdWkjNzApIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjbGFzc2VzIGNvdW50IGV2ZXJ5IHNsaWNlIG9mIHRoZSBzdGFjazogaW4gYSB2b2x1bWUgdmlldyAodGhlIHdob2xlIHN0YWNrIG9uXG4gICAqIHNjcmVlbiksIHVubGVzcyBpdHMgc2xpY2UgcGFuZSBzaG93cyBvbmUgc2xpY2UuIFRoZSB0YWJsZSBsaXN0cyB0aGUgc2xpY2UncyByZWdpb25zIGFueXdheS5cbiAgICovXG4gIHByaXZhdGUgZ2V0IHN0YWNrQ291bnRzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZvbHVtZVZpZXcgJiYgIXRoaXMuc2xpY2VQYW5lO1xuICB9XG5cbiAgLyoqIFJlYnVpbGQgdGhlIHBlci1jbGFzcyByZWdpb24gY291bnRzIHNob3duIGluIHRoZSBwYW5lbCAodGhlIHN0YWNrJ3MsIHNlZSBzdGFja0NvdW50cykuICovXG4gIHByaXZhdGUgcmVjb21wdXRlQ2xhc3NDb3VudHMoKTogdm9pZCB7XG4gICAgY29uc3QgY291bnRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICBjb25zdCB0cmVlID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICBjb25zdCBhZGQgPSAobGFiZWw6IHN0cmluZywgbjogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBrID0gcHJlc2V0S2V5KHRoaXMucHJlc2V0U2V0LCBsYWJlbCk7XG4gICAgICBjb3VudHMuc2V0KGssIChjb3VudHMuZ2V0KGspID8/IDApICsgbik7XG4gICAgICB0cmVlLnNldChsYWJlbCwgKHRyZWUuZ2V0KGxhYmVsKSA/PyAwKSArIG4pO1xuICAgIH07XG4gICAgY29uc3QgcmVnaW9ucyA9IHRoaXMuc3RhY2tDb3VudHMgPyB0aGlzLnJlZ2lvbkFwaS5nZXRTbGljZUFubm90YXRpb25SZWdpb25zKCkgOiB0aGlzLnJlZ2lvbnM7XG4gICAgZm9yIChjb25zdCByIG9mIHJlZ2lvbnMpIGlmIChyLmxhYmVsKSBhZGQoci5sYWJlbCwgMSk7XG4gICAgLy8gVGhlIHJlZ2lvbiBzb3VyY2UncyBjbGFzc2VzIGNvdW50IHRvbyAoaXRzIGZlYXR1cmVzIGFyZSByb3dzIG9mIHRoZSB0YWJsZSkuXG4gICAgZm9yIChjb25zdCBbbGFiZWwsIG5dIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuc291cmNlQ2xhc3NDb3VudHMpKSBhZGQobGFiZWwsIG4pO1xuICAgIHRoaXMuY2xhc3NDb3VudHMgPSBjb3VudHM7XG4gICAgdGhpcy50cmVlQ291bnRzID0gdHJlZTtcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXlDbGFzc2VzKCk7XG4gIH1cblxuICAvKiogUmVidWlsZCB0aGUgcGFuZWwncyBkaXNwbGF5IG9yZGVyIOKAlCBtb3N0LXVzZWQgY2xhc3NlcyBmaXJzdCwgdGhlbiBieSBuYW1lLiBBIGNsYXNzIG9ubHlcbiAgICogIHRoZSByZWdpb24gc291cmNlIGhhcyBpcyBsaXN0ZWQgdG9vLCBpbiBpdHMgY29sb3VyLiAqL1xuICBwcml2YXRlIHVwZGF0ZURpc3BsYXlDbGFzc2VzKCk6IHZvaWQge1xuICAgIGNvbnN0IGtub3duID0gbmV3IFNldCh0aGlzLnByZXNldFNldC5jbGFzc2VzLm1hcCgoYykgPT4gcHJlc2V0S2V5KHRoaXMucHJlc2V0U2V0LCBjLm5hbWUpKSk7XG4gICAgY29uc3QgZnJvbVNvdXJjZTogQ2xhc3NQcmVzZXRbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgbGFiZWwgb2YgT2JqZWN0LmtleXModGhpcy5zb3VyY2VDbGFzc0NvdW50cykpIHtcbiAgICAgIGNvbnN0IGsgPSBwcmVzZXRLZXkodGhpcy5wcmVzZXRTZXQsIGxhYmVsKTtcbiAgICAgIGlmIChrbm93bi5oYXMoaykpIGNvbnRpbnVlO1xuICAgICAga25vd24uYWRkKGspO1xuICAgICAgZnJvbVNvdXJjZS5wdXNoKHsgbmFtZTogbGFiZWwsIGNvbG9yOiBjb2xvckZvckxhYmVsKGxhYmVsLCB0aGlzLnByZXNldFNldCkgfSk7XG4gICAgfVxuICAgIHRoaXMudGFibGVQcmVzZXRTZXQgPSBmcm9tU291cmNlLmxlbmd0aFxuICAgICAgPyB7IC4uLnRoaXMucHJlc2V0U2V0LCBjbGFzc2VzOiBbLi4udGhpcy5wcmVzZXRTZXQuY2xhc3NlcywgLi4uZnJvbVNvdXJjZV0gfVxuICAgICAgOiB0aGlzLnByZXNldFNldDtcbiAgICB0aGlzLmRpc3BsYXlDbGFzc2VzID0gWy4uLnRoaXMucHJlc2V0U2V0LmNsYXNzZXMsIC4uLmZyb21Tb3VyY2VdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGQgPSB0aGlzLmNsYXNzQ291bnQoYi5uYW1lKSAtIHRoaXMuY2xhc3NDb3VudChhLm5hbWUpO1xuICAgICAgcmV0dXJuIGQgIT09IDAgPyBkIDogYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBOdW1iZXIgb2YgcmVnaW9ucyBjdXJyZW50bHkgdXNpbmcgYSBjbGFzcyAoa2V5ZWQgYnkgdGhlIGFjdGl2ZSBtYXRjaCBtb2RlKS4gKi9cbiAgcHJvdGVjdGVkIGNsYXNzQ291bnQobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jbGFzc0NvdW50cy5nZXQocHJlc2V0S2V5KHRoaXMucHJlc2V0U2V0LCBuYW1lKSkgPz8gMDtcbiAgfVxuXG4gIC8qKiBSZWNvbG91ciBhIGNsYXNzIGZyb20gaXRzIHBhbmVsIHN3YXRjaCBhbmQgcmVwYWludCBpdHMgKG5vbi1vdmVycmlkZGVuKSByZWdpb25zLiAqL1xuICBwcm90ZWN0ZWQgc2V0Q2xhc3NDb2xvcihuYW1lOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIWNvbG9yKSByZXR1cm47XG4gICAgdGhpcy5yZWdpb25BcGkuc2V0Q2xhc3NpZmljYXRpb25Db2xvcihuYW1lLCBjb2xvcik7XG4gICAgdGhpcy5jb21taXQoKTtcbiAgfVxuXG4gIC8qKiBSZW1vdmUgYSBjbGFzcy4gQW55IHJlZ2lvbnMgc3RpbGwgdXNpbmcgaXQgZmFsbCBiYWNrIHRvIHRoZSBkZWZhdWx0XG4gICAqICBcIlJlZ2lvblwiIGNsYXNzLCBzbyB0aGV5IGFyZW4ndCBvcnBoYW5lZCAoYW5kIHRoZSBjbGFzcyBpc24ndCBpbW1lZGlhdGVseVxuICAgKiAgcmUtYWRkZWQgZnJvbSBpdHMgcmVnaW9ucyBieSBzeW5jQ2xhc3Nlc0Zyb21SZWdpb25zKS4gKi9cbiAgcHJvdGVjdGVkIGRlbGV0ZUNsYXNzKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucmVhc3NpZ25SZWdpb25zVG9EZWZhdWx0Q2xhc3MoW25hbWVdKTtcbiAgICB0aGlzLnJlZ2lvbkFwaS5yZW1vdmVDbGFzcyhuYW1lKTtcbiAgICBpZiAodGhpcy5hY3RpdmVDbGFzcyA9PT0gbmFtZSkgdGhpcy5hY3RpdmVDbGFzcyA9IG51bGw7XG4gICAgdGhpcy5jb21taXQoKTtcbiAgfVxuXG4gIC8qKiBSZWdpb25zIGxhYmVsbGVkIHdpdGggYW55IG9mIGByZW1vdmVkTmFtZXNgIHJldmVydCB0byB0aGUgZGVmYXVsdFxuICAgKiAge0BsaW5rIGRlZmF1bHRDbGFzc05hbWV9IChcIlJlZ2lvblwiKTogaXRzIGNsYXNzIGNvbG91ciwgb3ZlcnJpZGUgY2xlYXJlZC5cbiAgICogIFNraXBzIHRoZSBkZWZhdWx0IGl0c2VsZiBzbyBkZWxldGluZyBcIlJlZ2lvblwiIGNhbid0IHNlbGYtcmVhc3NpZ24uIChqaXQtdWkjNzApICovXG4gIHByaXZhdGUgcmVhc3NpZ25SZWdpb25zVG9EZWZhdWx0Q2xhc3MocmVtb3ZlZE5hbWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGNvbnN0IGtleU9mID0gKHM6IHN0cmluZykgPT4gcHJlc2V0S2V5KHRoaXMucHJlc2V0U2V0LCBzKTtcbiAgICBjb25zdCByZW1vdmVkID0gbmV3IFNldChyZW1vdmVkTmFtZXMubWFwKGtleU9mKSk7XG4gICAgcmVtb3ZlZC5kZWxldGUoa2V5T2YodGhpcy5kZWZhdWx0Q2xhc3NOYW1lKSk7XG4gICAgaWYgKCFyZW1vdmVkLnNpemUpIHJldHVybjtcbiAgICBjb25zdCBjb2xvciA9IGNvbG9yRm9yTGFiZWwodGhpcy5kZWZhdWx0Q2xhc3NOYW1lLCB0aGlzLnByZXNldFNldCk7XG4gICAgdGhpcy5wYXRjaFJlZ2lvbnMoKHIpID0+XG4gICAgICByLmxhYmVsICYmIHJlbW92ZWQuaGFzKGtleU9mKHIubGFiZWwpKVxuICAgICAgICA/IHsgbGFiZWw6IHRoaXMuZGVmYXVsdENsYXNzTmFtZSwgY29sb3JPdmVycmlkZGVuOiBmYWxzZSwgY29sb3IgfVxuICAgICAgICA6IG51bGwsXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBTdGFtcCBhIGNsYXNzIChhbmQgaXRzIHByZXNldC9mYWxsYmFjayBjb2xvdXIpIG9udG8gb25lIHJlZ2lvbiBmcm9tIHRoZSBDbGFzc1xuICAgKiAgZHJvcGRvd247IGNob29zaW5nIGEgY2xhc3Mgb3B0cyB0aGUgcmVnaW9uIGJhY2sgaW50byB0aGUgcHJlc2V0IGNvbG91ci4gKi9cbiAgcHJvdGVjdGVkIGFwcGx5UHJlc2V0VG9SZWdpb24ocmVnaW9uOiBSZWdpb24sIGNsYXNzTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3RhbmRJbnMuaGFzKHJlZ2lvbikpIHtcbiAgICAgIHZvaWQgdGhpcy50YWtlVGhlbihyZWdpb24sIChyKSA9PiB0aGlzLmFwcGx5UHJlc2V0VG9SZWdpb24ociwgY2xhc3NOYW1lKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSAoY2xhc3NOYW1lID8/ICcnKS50cmltKCk7XG4gICAgY29uc3QgcGF0Y2g6IFBhcnRpYWw8UmVnaW9uPiA9IHsgbGFiZWw6IG5hbWUsIGNvbG9yT3ZlcnJpZGRlbjogZmFsc2UgfTtcbiAgICBpZiAobmFtZSkgcGF0Y2guY29sb3IgPSBjb2xvckZvckxhYmVsKG5hbWUsIHRoaXMucHJlc2V0U2V0KTtcbiAgICB0aGlzLnBhdGNoUmVnaW9ucygocikgPT4gKHIgPT09IHJlZ2lvbiA/IHBhdGNoIDogbnVsbCkpO1xuICAgIHRoaXMuY29tbWl0KCk7XG4gIH1cblxuICAvKiogTWFrZSBhIGNsYXNzIGFjdGl2ZSAodXNlZCBmb3IgbmV3IHJlZ2lvbnMpIGFuZCwgaWYgcm93cyBhcmUgc2VsZWN0ZWQsIGFwcGx5XG4gICAqICBpdCB0byB0aGVtIGluIG9uZSBjb21taXQuICovXG4gIHByb3RlY3RlZCBzZWxlY3RBY3RpdmVDbGFzcyhuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZUNsYXNzID0gbmFtZTtcbiAgICB0aGlzLmFwcGx5Q2xhc3NUb1NlbGVjdGVkKG5hbWUpO1xuICB9XG5cbiAgLyoqIEFwcGx5IGEgY2xhc3MgKGxhYmVsICsgcHJlc2V0L2ZhbGxiYWNrIGNvbG91cikgdG8gdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGFuZCBjb21taXQuICovXG4gIHByaXZhdGUgYXBwbHlDbGFzc1RvU2VsZWN0ZWQobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBuZXcgU2V0KHRoaXMuc2VsZWN0ZWRSZWdpb25zID8/IFtdKTtcbiAgICBpZiAoIXNlbGVjdGVkLnNpemUpIHJldHVybjtcbiAgICBjb25zdCBjb2xvciA9IGNvbG9yRm9yTGFiZWwobmFtZSwgdGhpcy5wcmVzZXRTZXQpO1xuICAgIHRoaXMucGF0Y2hSZWdpb25zKChyKSA9PiAoc2VsZWN0ZWQuaGFzKHIpID8geyBsYWJlbDogbmFtZSwgY29sb3JPdmVycmlkZGVuOiBmYWxzZSwgY29sb3IgfSA6IG51bGwpKTtcbiAgICB0aGlzLmNvbW1pdCgpO1xuICB9XG5cbiAgLyoqIFwiRWRpdCBjbGFzcyBvbiBzZWxlY3RlZCByb3dzXCIgcG9wdXAg4oCUIGFwcGx5IHRoZSBjaG9zZW4gZXhpc3RpbmcgY2xhc3MuICovXG4gIHByb3RlY3RlZCBhcHBseUJ1bGtDbGFzcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYnVsa0NsYXNzKSByZXR1cm47XG4gICAgdGhpcy5hcHBseUNsYXNzVG9TZWxlY3RlZCh0aGlzLmJ1bGtDbGFzcyk7XG4gICAgdGhpcy5vdmVybGF5UGFuZWw/LmhpZGUoKTtcbiAgfVxuXG4gIC8qKiBcIkVkaXQgY2xhc3Mgb24gc2VsZWN0ZWQgcm93c1wiIHBvcHVwIOKAlCBhZGQgYSBuZXcgY2xhc3MgYW5kIHNldCBpdCBvbiB0aGUgc2VsZWN0aW9uLiAqL1xuICBwcm90ZWN0ZWQgYWRkQW5kQXBwbHlCdWxrQ2xhc3MoKTogdm9pZCB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMubmV3QnVsa0NsYXNzLnRyaW0oKTtcbiAgICBpZiAoIW5hbWUpIHJldHVybjtcbiAgICBjb25zdCBrZXkgPSBwcmVzZXRLZXkodGhpcy5wcmVzZXRTZXQsIG5hbWUpO1xuICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMucHJlc2V0U2V0LmNsYXNzZXMuc29tZSgoYykgPT4gcHJlc2V0S2V5KHRoaXMucHJlc2V0U2V0LCBjLm5hbWUpID09PSBrZXkpO1xuICAgIGlmICghZXhpc3RzKSB7XG4gICAgICB0aGlzLnJlZ2lvbkFwaS51cHNlcnRDbGFzcyh7IG5hbWUsIGNvbG9yOiBjb2xvckZvckxhYmVsKG5hbWUsIHRoaXMucHJlc2V0U2V0KSwgc291cmNlOiAndXNlcicgfSk7XG4gICAgfVxuICAgIHRoaXMuYXBwbHlDbGFzc1RvU2VsZWN0ZWQobmFtZSk7XG4gICAgdGhpcy5idWxrQ2xhc3MgPSBuYW1lO1xuICAgIHRoaXMubmV3QnVsa0NsYXNzID0gJyc7XG4gICAgdGhpcy5vdmVybGF5UGFuZWw/LmhpZGUoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBNYW5hZ2UtY2xhc3NlcyBkaWFsb2cg4pSA4pSAXG4gIHByb3RlY3RlZCBvcGVuTWFuYWdlRGlhbG9nKCk6IHZvaWQge1xuICAgIHRoaXMucHJlc2V0RHJhZnQgPSB0aGlzLmNsb25lUHJlc2V0U2V0KHRoaXMucHJlc2V0U2V0KTtcbiAgICB0aGlzLnNob3dNYW5hZ2VEaWFsb2cgPSB0cnVlO1xuICB9XG4gIHByaXZhdGUgY2xvbmVQcmVzZXRTZXQoczogUHJlc2V0U2V0KTogUHJlc2V0U2V0IHtcbiAgICByZXR1cm4ge1xuICAgICAgY2xhc3NlczogKHMuY2xhc3NlcyA/PyBbXSkubWFwKChjKSA9PiAoeyAuLi5jIH0pKSxcbiAgICAgIGZhbGxiYWNrUGFsZXR0ZTogWy4uLihzLmZhbGxiYWNrUGFsZXR0ZSA/PyBbXSldLFxuICAgICAgYXV0b1Byb21vdGU6ICEhcy5hdXRvUHJvbW90ZSxcbiAgICAgIG1hdGNoTW9kZTogcy5tYXRjaE1vZGUgPT09ICdub3JtYWxpemVkJyA/ICdub3JtYWxpemVkJyA6ICdleGFjdCcsXG4gICAgfTtcbiAgfVxuICAvKiogQ29tbWl0IHRoZSBkcmFmdDogZHJvcCBibGFuay9kdXBsaWNhdGUgbmFtZXMsIHBlcnNpc3QsIGFuZCByZWNvbG91clxuICAgKiAgbm9uLW92ZXJyaWRkZW4gcmVnaW9ucyB3aXRoIHRoZSB1cGRhdGVkIHByZXNldHMuICovXG4gIHByb3RlY3RlZCBhcHBseU1hbmFnZURpYWxvZyhjbG9zZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5wcmVzZXREcmFmdCkgcmV0dXJuO1xuICAgIC8vIERlLWR1cGxpY2F0ZSB1c2luZyB0aGUgYWN0aXZlIG1hdGNoIG1vZGUncyBrZXkgc28gbm9ybWFsaXplZCBtb2RlIGNhbid0IGtlZXBcbiAgICAvLyBib3RoIFwiVHVtb3JcIiBhbmQgXCJ0dW1vclwiICh3aGljaCB3b3VsZCBjb2xsaWRlIGF0IHJ1bnRpbWUgaW4gZmluZFByZXNldCgpKS5cbiAgICBjb25zdCBkcmFmdCA9IHRoaXMucHJlc2V0RHJhZnQ7XG4gICAgY29uc3Qga2V5T2YgPSAoczogc3RyaW5nKSA9PiBwcmVzZXRLZXkoZHJhZnQsIHMpO1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBjbGFzc2VzOiBDbGFzc1ByZXNldFtdID0gW107XG4gICAgZm9yIChjb25zdCBjIG9mIGRyYWZ0LmNsYXNzZXMpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSAoYy5uYW1lID8/ICcnKS50cmltKCk7XG4gICAgICBjb25zdCBrZXkgPSBrZXlPZihuYW1lKTtcbiAgICAgIGlmICghbmFtZSB8fCBzZWVuLmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICBjbGFzc2VzLnB1c2goeyAuLi5jLCBuYW1lIH0pO1xuICAgIH1cbiAgICB0aGlzLnByZXNldERyYWZ0ID0geyAuLi5kcmFmdCwgY2xhc3NlcyB9O1xuICAgIC8vIENsYXNzZXMgZHJvcHBlZCBpbiB0aGUgZGlhbG9nOiB0aGVpciByZWdpb25zIHJldmVydCB0byB0aGUgZGVmYXVsdCBcIlJlZ2lvblwiXG4gICAgLy8gY2xhc3MgKGVsc2Ugc3luY0NsYXNzZXNGcm9tUmVnaW9ucyB3b3VsZCBqdXN0IHJlLWFkZCB0aGVtKSAoaml0LXVpIzcwKS5cbiAgICBjb25zdCBrZXB0ID0gbmV3IFNldChjbGFzc2VzLm1hcCgoYykgPT4ga2V5T2YoYy5uYW1lKSkpO1xuICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnByZXNldFNldC5jbGFzc2VzLm1hcCgoYykgPT4gYy5uYW1lKS5maWx0ZXIoKG4pID0+ICFrZXB0LmhhcyhrZXlPZihuKSkpO1xuICAgIHRoaXMucmVhc3NpZ25SZWdpb25zVG9EZWZhdWx0Q2xhc3MocmVtb3ZlZCk7XG4gICAgdGhpcy5yZWdpb25BcGkuc2V0UHJlc2V0U2V0KHRoaXMucHJlc2V0RHJhZnQpO1xuICAgIHRoaXMuY29tbWl0KCk7IC8vIHJlY29sb3VyIGV4aXN0aW5nIChub24tb3ZlcnJpZGRlbikgcmVnaW9ucyBmcm9tIHRoZSBuZXcgcHJlc2V0c1xuICAgIGlmIChjbG9zZSkgdGhpcy5zaG93TWFuYWdlRGlhbG9nID0gZmFsc2U7XG4gIH1cbiAgcHJvdGVjdGVkIHJlc2V0UHJlc2V0c1RvRGVmYXVsdHMoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25BcGkucmVzZXRQcmVzZXRzKCk7XG4gICAgdGhpcy5wcmVzZXREcmFmdCA9IHRoaXMuY2xvbmVQcmVzZXRTZXQodGhpcy5yZWdpb25BcGkuZ2V0UHJlc2V0U2V0KCkpO1xuICAgIHRoaXMuY29tbWl0KCk7XG4gIH1cbiAgcHJvdGVjdGVkIGV4cG9ydFByZXNldHMoKTogdm9pZCB7XG4gICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KHRoaXMuY2xvbmVQcmVzZXRTZXQodGhpcy5yZWdpb25BcGkuZ2V0UHJlc2V0U2V0KCkpLCBudWxsLCAyKTtcbiAgICBzYXZlQXMobmV3IEJsb2IoW2pzb25dLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KSwgJ2Fubm90YXRpb24tY2xhc3Nlcy5qc29uJyk7XG4gIH1cbiAgcHJvdGVjdGVkIGltcG9ydFByZXNldHMoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5wZXJzaXN0ZW5jZS5yZWFkQ2hvc2VuRmlsZShldmVudCwgKHRleHQpID0+IHRoaXMuYXBwbHlJbXBvcnRlZFByZXNldHModGV4dCkpO1xuICB9XG5cbiAgLyoqIFZhbGlkYXRlIGFuZCBhcHBseSBhbiBpbXBvcnRlZCBhbm5vdGF0aW9uLWNsYXNzZXMgSlNPTiBmaWxlLiAqL1xuICBwcml2YXRlIGFwcGx5SW1wb3J0ZWRQcmVzZXRzKHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZXQgPSBwYXJzZVByZXNldFNldChKU09OLnBhcnNlKHRleHQpKTtcbiAgICAgIGlmICghc2V0KSB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBmaWxlIGlzIG5vdCBhbiBhbm5vdGF0aW9uLWNsYXNzIGxpc3QgKG5vIHZhbGlkIGNsYXNzZXMpLicpO1xuICAgICAgdGhpcy5yZWdpb25BcGkuc2V0UHJlc2V0U2V0KHNldCk7XG4gICAgICB0aGlzLnByZXNldERyYWZ0ID0gdGhpcy5jbG9uZVByZXNldFNldCh0aGlzLnJlZ2lvbkFwaS5nZXRQcmVzZXRTZXQoKSk7XG4gICAgICB0aGlzLmNvbW1pdCgpO1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICBrZXk6IFZJWl9UT0FTVF9LRVksXG4gICAgICAgIHNldmVyaXR5OiAnc3VjY2VzcycsXG4gICAgICAgIHN1bW1hcnk6ICdDbGFzc2VzIGltcG9ydGVkJyxcbiAgICAgICAgZGV0YWlsOiAnQW5ub3RhdGlvbiBjbGFzc2VzIGxvYWRlZC4nLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgIGtleTogVklaX1RPQVNUX0tFWSxcbiAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgIHN1bW1hcnk6ICdJbXBvcnQgZmFpbGVkJyxcbiAgICAgICAgZGV0YWlsOiBgJHsoZXJyIGFzIEVycm9yKT8ubWVzc2FnZSA/PyBlcnJ9YCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmNoYW5nZWQoKTtcbiAgfVxuXG4gIC8qKiBUaGUgZmlsZXMgY2hvc2VuIGluIHRoZSBpbXBvcnQgaW5wdXRzOiBvbmUgR2VvSlNPTiwgYSBsYWJlbCB2b2x1bWUgd2l0aCBpdHMgb250b2xvZ3ksIG9yIGFcbiAgICogIGZvbGRlciBvZiBwZXItc2xpY2UgR2VvSlNPTiBmaWxlcy4gKi9cbiAgcHJvdGVjdGVkIGltcG9ydFJvaXMoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgZmlsZXMgPSBBcnJheS5mcm9tKChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuZmlsZXMgPz8gW10pO1xuICAgIGlmIChmaWxlcy5sZW5ndGgpIHZvaWQgdGhpcy5pbXBvcnRSZWdpb25GaWxlcyhmaWxlcy5tYXAoKGYpID0+IGltcG9ydEZpbGUoZiwgZi53ZWJraXRSZWxhdGl2ZVBhdGggfHwgZi5uYW1lKSkpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGhvc3QgY2FuIHBpY2sgcmVnaW9ucyBvbiBpdHMgc2VydmVyIChcIkltcG9ydCByZWdpb25zIGZyb20gc2VydmVyXCIpLiAqL1xuICBwcm90ZWN0ZWQgZ2V0IGNhbkltcG9ydEZyb21TZXJ2ZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGVyc2lzdGVuY2UuY2FuUGlja1NlcnZlclJlZ2lvbnMoKTtcbiAgfVxuICAvKiogQW4gaW1wb3J0IGZyb20gdGhlIHNlcnZlciBpcyBpbiBmbGlnaHQuICovXG4gIHByb3RlY3RlZCBpbXBvcnRpbmcgPSBmYWxzZTtcblxuICAvKiogXCJJbXBvcnQgcmVnaW9ucyBmcm9tIHNlcnZlclwiOiB0aGUgaG9zdCBwaWNrcyBmaWxlcyBvciBhIHNlcnZlZCByZWdpb24gc2V0OyB0aGV5IGltcG9ydCBhcyBjaG9zZW4gZmlsZXMgZG8uICovXG4gIHByb3RlY3RlZCBpbXBvcnRGcm9tU2VydmVyKCk6IHZvaWQge1xuICAgIHRoaXMuaW1wb3J0aW5nID0gdHJ1ZTtcbiAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICB0aGlzLnBlcnNpc3RlbmNlLnBpY2tTZXJ2ZXJSZWdpb25zKCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChwaWNrKSA9PiB7XG4gICAgICAgIGlmICghcGljaykgcmV0dXJuO1xuICAgICAgICBpZiAocGljay5raW5kID09PSAnZmlsZXMnKSB7XG4gICAgICAgICAgdm9pZCB0aGlzLmltcG9ydFJlZ2lvbkZpbGVzKHBpY2suZmlsZXMubWFwKChmKSA9PiBpbXBvcnRGaWxlKGYuZGF0YSwgZi5uYW1lKSkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2b2lkIHRoaXMuaW1wb3J0U2VydmVkUmVnaW9uU2V0KHBpY2sudXJsLCBwaWNrLm5hbWUpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB0aGlzLmltcG9ydEZhaWxlZChlcnIpLFxuICAgICAgY29tcGxldGU6ICgpID0+IHtcbiAgICAgICAgdGhpcy5pbXBvcnRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBgZmlsZXNgOiBvbmUgR2VvSlNPTiBmaWxlIGFzIGJlZm9yZSAoaXRzIHJlZ2lvbnMsIGVkaXRhYmxlKTsgYW55dGhpbmcgZWxzZSAoc2VlXG4gICAqIHJlYWRBbm5vdGF0aW9uU2xpY2VzKSBhcyBvbmUgcmVnaW9uIHNvdXJjZSBwZXIgc2xpY2UsIHJlcGxhY2luZyB0aGUgcmVnaW9ucyBhbmQgc291cmNlcyBvZlxuICAgKiBldmVyeSBzbGljZTogYSBsYWJlbCB2b2x1bWUgb3IgYW4gT01FLVphcnIgbGFiZWwgaW1hZ2UgdHJhY2VkIHRoZSBmaXJzdCB0aW1lIGEgc2xpY2UgaXMgc2hvd24sXG4gICAqIGl0cyBjbGFzc2VzIG5hbWVkIChhbmQgdHJlZWQpIGJ5IGl0cyBvbnRvbG9neTsgYSBmb2xkZXIgYXMgb25lIHNvdXJjZSBwZXIgc2xpY2UgZmlsZTsgYVxuICAgKiB6LWluZGV4ZWQgR2VvSlNPTiBvbmUgcGVyIHBsYW5lOyBhIHppcCBvZiBhbnkgb2YgdGhlc2UuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGltcG9ydFJlZ2lvbkZpbGVzKGZpbGVzOiBSZWdpb25JbXBvcnRGaWxlW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBFdmVyeSBzdGVwLCByZWFkaW5nIHRoZSBmaWxlcyBpbmNsdWRlZCwgcmVwb3J0cyBpdHMgZmFpbHVyZSBoZXJlIHJhdGhlciB0aGFuIHJlamVjdGluZzpcbiAgICAvLyB0aGUgaW5wdXRzIGNhbGwgdGhpcyB3aXRob3V0IHdhaXRpbmcgb24gaXQuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBsYW4gPSBmaWxlcy5zb21lKChmKSA9PiBpc1ppcE5hbWUoZi5uYW1lKSkgPyBudWxsIDogcGxhblJlZ2lvbkltcG9ydChmaWxlcyk7XG4gICAgICBpZiAocGxhbj8ua2luZCA9PT0gJ3NpbmdsZScpIHtcbiAgICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IHBsYW4uZmlsZS50ZXh0KCk7XG4gICAgICAgIGlmIChvbmVQbGFuZSh0ZXh0KSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYXBwbHlJbXBvcnRlZFJvaXModGV4dCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBhdHRhY2ggPSB0aGlzLnJlZ2lvbkFwaS5pbXBvcnRTbGljZVJlZ2lvblNvdXJjZXM/LmJpbmQodGhpcy5yZWdpb25BcGkpO1xuICAgICAgaWYgKCFhdHRhY2gpIHtcbiAgICAgICAgdGhpcy5pbXBvcnRGYWlsZWQobmV3IEVycm9yKCdUaGlzIHZpZXdlciBjYW5ub3QgaG9sZCByZWdpb24gc291cmNlcy4nKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFRha2VuIGJlZm9yZSB0aGUgZmlsZXMgYXJlIHJlYWQ6IGRlY29kaW5nIGEgdm9sdW1lIHRha2VzIGEgd2hpbGUsIGFuZCB0aGUgaW1wb3J0IG11c3QgbGFuZFxuICAgICAgLy8gb24gdGhlIGltYWdlIGl0IHdhcyBzdGFydGVkIGZvciwgbm90IG9uIG9uZSBzaG93biBtZWFud2hpbGUuXG4gICAgICBjb25zdCB0aWNrZXQgPSB0aGlzLnJlZ2lvbkFwaS5yZWdpb25JbXBvcnRUaWNrZXQ/LigpO1xuICAgICAgY29uc3Qgc2V0ID0gYXdhaXQgcmVhZEFubm90YXRpb25TbGljZXMoZmlsZXMpO1xuICAgICAgaWYgKCFzZXQpIHtcbiAgICAgICAgdGhpcy5pbXBvcnRGYWlsZWQoXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ0Nob29zZSBhIEdlb0pTT04gZmlsZSwgYSBmb2xkZXIgb2YgR2VvSlNPTiBmaWxlcywgYSAubmlpLCAubmlpLmd6IG9yIC5ucnJkIGxhYmVsIHZvbHVtZSwgJyArXG4gICAgICAgICAgICAgICdhbiBPTUUtWmFyciBzdG9yZSwgb3IgYSAuemlwIG9mIGFueSBvZiB0aGVzZS4nLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChzZXQuc2l6ZSkgdGhpcy53YXJuSWZTaXplRGlmZmVycyhzZXQuc2l6ZVswXSwgc2V0LnNpemVbMV0pO1xuICAgICAgY29uc3QgYXR0YWNoZWQgPSBhdHRhY2goc2V0Lm9wZW5lcnMsIHRpY2tldCk7XG4gICAgICBpZiAoYXR0YWNoZWQgPT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5pbXBvcnRTdGFsZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmFmdGVyU291cmNlSW1wb3J0KCk7XG4gICAgICB0aGlzLnRvYXN0KFxuICAgICAgICAnc3VjY2VzcycsXG4gICAgICAgICdSZWdpb25zIGltcG9ydGVkJyxcbiAgICAgICAgYCR7c2V0LnN1bW1hcnl9OyAke2F0dGFjaGVkfSBzbGljZSR7YXR0YWNoZWQgPT09IDEgPyAnJyA6ICdzJ30gYW5ub3RhdGVkLmAsXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5pbXBvcnRGYWlsZWQoZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKiogQSByZWdpb24gc2V0IHRoZSBob3N0J3Mgc2VydmVyIHNlcnZlcyAoaml0LXNlcnZpY2UncyAvcmVnaW9ucy97aWR9LyksIHJlYWQgdGhyb3VnaCBpdHMgSHR0cENsaWVudC4gKi9cbiAgcHJpdmF0ZSBhc3luYyBpbXBvcnRTZXJ2ZWRSZWdpb25TZXQodXJsOiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbXBvcnRTb3VyY2UgPSB0aGlzLnJlZ2lvbkFwaS5pbXBvcnRSZWdpb25Tb3VyY2VPcGVuZXI/LmJpbmQodGhpcy5yZWdpb25BcGkpO1xuICAgIGlmICghaW1wb3J0U291cmNlKSB7XG4gICAgICB0aGlzLmltcG9ydEZhaWxlZChuZXcgRXJyb3IoJ1RoaXMgdmlld2VyIGNhbm5vdCBob2xkIHJlZ2lvbiBzb3VyY2VzLicpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGlja2V0ID0gdGhpcy5yZWdpb25BcGkucmVnaW9uSW1wb3J0VGlja2V0Py4oKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYXBwbGllZCA9IGF3YWl0IGltcG9ydFNvdXJjZShcbiAgICAgICAgKCkgPT4gb3Blbkh0dHBSZWdpb25Tb3VyY2UodXJsLCB7IGh0dHA6IHRoaXMuaHR0cCA/PyB1bmRlZmluZWQgfSksXG4gICAgICAgIHRpY2tldCxcbiAgICAgICk7XG4gICAgICBpZiAoYXBwbGllZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5pbXBvcnRTdGFsZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmFmdGVyU291cmNlSW1wb3J0KCk7XG4gICAgICB0aGlzLnRvYXN0KCdzdWNjZXNzJywgJ1JlZ2lvbnMgaW1wb3J0ZWQnLCBuYW1lID8/IHVybCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmltcG9ydEZhaWxlZChlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBBbiBpbXBvcnQgdGhhdCBmaW5pc2hlZCBhZnRlciBhbm90aGVyIGltYWdlIHdhcyBzaG93biAob3IgYW5vdGhlciBpbXBvcnQgYmVnYW4pOiBkcm9wcGVkLiAqL1xuICBwcml2YXRlIGltcG9ydFN0YWxlKCk6IHZvaWQge1xuICAgIHRoaXMudG9hc3QoJ2luZm8nLCAnSW1wb3J0IGRpc2NhcmRlZCcsICdUaGUgaW1hZ2UgY2hhbmdlZCB3aGlsZSB0aGUgcmVnaW9ucyB3ZXJlIGJlaW5nIHJlYWQuJyk7XG4gICAgdGhpcy5jaGFuZ2VkKCk7XG4gIH1cblxuICAvKiogVGhlIHRhYmxlIGFuZCBzZWxlY3Rpb24gYWZ0ZXIgdGhlIHJlZ2lvbnMgd2VyZSByZXBsYWNlZCBieSBpbXBvcnRlZCBzb3VyY2VzLiAqL1xuICBwcml2YXRlIGFmdGVyU291cmNlSW1wb3J0KCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRSZWdpb25zID0gW107XG4gICAgdGhpcy5wYWdpbmF0b3JGaXJzdCA9IDA7XG4gICAgdGhpcy5jb21taXQoW10pO1xuICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2VkKCk7XG4gIH1cblxuICAvKiogV2FybiB3aGVuIGFuIGltcG9ydGVkIHZvbHVtZSdzIHNsaWNlcyBhcmUgbm90IHRoZSBpbWFnZSdzIHNpemU6IGl0cyBvdXRsaW5lcyB3b3VsZCBub3QgZml0LiAqL1xuICBwcml2YXRlIHdhcm5JZlNpemVEaWZmZXJzKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMucmVnaW9uQXBpLmdldE1hc2tJbWFnZVNpemUoKTtcbiAgICBpZiAobWV0YSAmJiAobWV0YS53aWR0aCAhPT0gd2lkdGggfHwgbWV0YS5oZWlnaHQgIT09IGhlaWdodCkpIHtcbiAgICAgIHRoaXMudG9hc3QoXG4gICAgICAgICdpbmZvJyxcbiAgICAgICAgJ0RpZmZlcmVudCBzaXplJyxcbiAgICAgICAgYFRoZSB2b2x1bWUncyBzbGljZXMgYXJlICR7d2lkdGh9IMOXICR7aGVpZ2h0fTsgdGhlIGltYWdlIGlzICR7bWV0YS53aWR0aH0gw5cgJHttZXRhLmhlaWdodH0uYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbXBvcnRGYWlsZWQoZXJyOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5pbXBvcnRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICBrZXk6IFZJWl9UT0FTVF9LRVksXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIHN1bW1hcnk6ICdFcnJvciBpbXBvcnRpbmcgcmVnaW9ucycsXG4gICAgICBkZXRhaWw6IGAkeyhlcnIgYXMgRXJyb3IpPy5tZXNzYWdlID8/IGVycn1gLFxuICAgIH0pO1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGltcG9ydGluZyByZWdpb25zOicsIGVycik7XG4gICAgdGhpcy5jaGFuZ2VkKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSB0aGUgcmVnaW9ucyB3aXRoIGFuIGltcG9ydGVkIEdlb0pTT04gZmlsZSdzLCBhbmQgdGhlIHNsaWNlJ3MgcmVnaW9uIHNvdXJjZSB3aXRoIHRoZW0uXG4gICAqIEEgbGFyZ2UgZmlsZSBiZWNvbWVzIHRoZSBzbGljZSdzIHJlZ2lvbiBzb3VyY2UgaW5zdGVhZCAoZHJhd24gYnkgbGV2ZWwgb2YgZGV0YWlsOyBsaXN0ZWQgYWJvdmVcbiAgICogdGhlIHRhYmxlKSwgdGhlIHRhYmxlIGVtcHRpZWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFwcGx5SW1wb3J0ZWRSb2lzKHRleHQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAoYXdhaXQgdGhpcy5yZWdpb25BcGkuaW1wb3J0UmVnaW9uU291cmNlPy4odGV4dCkpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJlZ2lvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5wYWdpbmF0b3JGaXJzdCA9IDA7XG4gICAgICAgIHRoaXMuY29tbWl0KFtdKTtcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZWQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gUGFyc2VkIGZpcnN0OiBhIGZpbGUgdGhhdCBpcyBub3QgR2VvSlNPTiBsZWF2ZXMgdGhlIHNvdXJjZSBhbG9uZS5cbiAgICAgIGNvbnN0IHJlZ2lvbnMgPSB0aGlzLnJlZ2lvbkFwaS5pbXBvcnRSZWdpb25zKHRleHQpO1xuICAgICAgYXdhaXQgdGhpcy5yZWdpb25BcGkuZHJvcFJlZ2lvblNvdXJjZT8uKCk7XG4gICAgICB0aGlzLnJlZ2lvbnMgPSByZWdpb25zO1xuICAgICAgdGhpcy5maWxsQ2xhc3NDb2xvcnMoKTtcbiAgICAgIHRoaXMuY29tbWl0KCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgIGtleTogVklaX1RPQVNUX0tFWSxcbiAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgIHN1bW1hcnk6ICdFcnJvciBpbXBvcnRpbmcgdGhlIGZpbGUnLFxuICAgICAgICBkZXRhaWw6IGAkeyhlcnIgYXMgRXJyb3IpPy5tZXNzYWdlID8/IGVycn1gLFxuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciByZWFkaW5nIHRoZSBmaWxlOicsIGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlZ2lvbnMgdG8gc2VyaWFsaXplIG9uIHNhdmUvZXhwb3J0IChldmVyeSBzbGljZSBmb3IgYSBjb21iaW5lZCB6LXN0YWNrKS4gKi9cbiAgcHJpdmF0ZSByZWdpb25zRm9yU2F2ZSgpOiBSZWdpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucGVyc2lzdGVuY2UucmVnaW9uc0ZvclNhdmUodGhpcy5yZWdpb25zKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBleHBvcnRSb2lzKCkge1xuICAgIGlmICghdGhpcy5yZWdpb25zRm9yU2F2ZSgpLmxlbmd0aCAmJiAhdGhpcy5oYXNSZWdpb25Tb3VyY2UpIHJldHVybjtcbiAgICB0aGlzLmV4cG9ydEZpbGVuYW1lID0gdGhpcy5wZXJzaXN0ZW5jZS5kZWZhdWx0RXhwb3J0TmFtZSgpO1xuICAgIHRoaXMuc2hvd0V4cG9ydERpYWxvZyA9IHRydWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29uZmlybUV4cG9ydCgpIHtcbiAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMuZXhwb3J0RmlsZW5hbWUudHJpbSgpO1xuICAgIGNvbnN0IHJlZ2lvbnMgPSB0aGlzLnJlZ2lvbnNGb3JTYXZlKCk7XG4gICAgaWYgKCFmaWxlbmFtZSB8fCAoIXJlZ2lvbnMubGVuZ3RoICYmICF0aGlzLmhhc1JlZ2lvblNvdXJjZSkpIHJldHVybjtcbiAgICB0aGlzLnNob3dFeHBvcnREaWFsb2cgPSBmYWxzZTtcbiAgICB0aGlzLnBlcnNpc3RlbmNlXG4gICAgICAuZG93bmxvYWQocmVnaW9ucywgZmlsZW5hbWUpXG4gICAgICAuY2F0Y2goKGVycikgPT4gdGhpcy50b2FzdCgnZXJyb3InLCAnRXJyb3IgZXhwb3J0aW5nIHJlZ2lvbnMnLCBgJHsoZXJyIGFzIEVycm9yKT8ubWVzc2FnZSA/PyBlcnJ9YCkpO1xuICB9XG5cbiAgLyoqIE9wZW4gdGhlIFwiU2F2ZSBtYXNrXCIgZGlhbG9nLCBzZWVkZWQgd2l0aCBgPGltYWdlLXN0ZW0+X21hc2sucG5nYC4gKi9cbiAgcHJvdGVjdGVkIG9wZW5TYXZlTWFza0RpYWxvZygpIHtcbiAgICBpZiAoIXRoaXMucmVnaW9ucy5sZW5ndGgpIHJldHVybjtcbiAgICB0aGlzLnNhdmVNYXNrRmlsZW5hbWUgPSB0aGlzLnBlcnNpc3RlbmNlLmRlZmF1bHRNYXNrTmFtZSgpO1xuICAgIHRoaXMubWFza01vZGUgPSAnYmluYXJ5JztcbiAgICB0aGlzLnNob3dTYXZlTWFza0RpYWxvZyA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmFzdGVyaXplIHRoZSByZWdpb25zIHRvIHRoZSBjaG9zZW4gbWFzayB0eXBlIGFuZCBkb3dubG9hZCBhcyBhIFBORy4gVGhlXG4gICAqIGhlYXZ5IHdvcmsgcnVucyBpbiBhIFdlYiBXb3JrZXIgKHtAbGluayBNYXNrRXhwb3J0U2VydmljZX0pIHNvIHRoZSBVSSBuZXZlclxuICAgKiBmcmVlemVzIG9uIHdob2xlLXNsaWRlIGltYWdlcyBhbmQgdGhlIGpvYiBjYW4gYmUgY2FuY2VsbGVkIChqaXQtdWkjOTUpO1xuICAgKiB0aGUgZGlhbG9nIHN0YXlzIG9wZW4gd2l0aCBhIHByb2dyZXNzIGJhciB1bnRpbCBkb25lLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbmZpcm1TYXZlTWFzaygpIHtcbiAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMuc2F2ZU1hc2tGaWxlbmFtZS50cmltKCk7XG4gICAgaWYgKCFmaWxlbmFtZSB8fCAhdGhpcy5yZWdpb25zLmxlbmd0aCB8fCB0aGlzLm1hc2tCdXN5KSByZXR1cm47XG5cbiAgICBjb25zdCBzaXplID0gdGhpcy5yZWdpb25BcGkuZ2V0TWFza0ltYWdlU2l6ZSgpO1xuICAgIGlmICghc2l6ZSkge1xuICAgICAgdGhpcy5tYXNrRXJyb3IoJ05vIGltYWdlIHNpemUgaXMgYXZhaWxhYmxlLCBzbyB0aGUgbWFzayBjYW5ub3QgYmUgc2l6ZWQuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubWFza0J1c3kgPSB0cnVlO1xuICAgIHRoaXMubWFza0VuY29kaW5nID0gZmFsc2U7XG4gICAgdGhpcy5tYXNrUHJvZ3Jlc3MgPSAwO1xuICAgIHRoaXMubWFza0pvYiA9IHRoaXMubWFza0V4cG9ydFxuICAgICAgLmV4cG9ydCh7XG4gICAgICAgIHJlZ2lvbnM6IHRoaXMucmVnaW9ucyxcbiAgICAgICAgaW1hZ2VTaXplOiBzaXplLFxuICAgICAgICBtb2RlOiB0aGlzLm1hc2tNb2RlLFxuICAgICAgICBzb3VyY2VOYW1lOiB0aGlzLnBlcnNpc3RlbmNlLnNlbGVjdGVkRmlsZU5hbWUoKSxcbiAgICAgIH0pXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGUpID0+IHtcbiAgICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgICAgICBzd2l0Y2ggKGUudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAncGxhbm5lZCc6XG4gICAgICAgICAgICAgIGlmIChlLnNjYWxlIDwgMSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgICAgICAgIGtleTogVklaX1RPQVNUX0tFWSxcbiAgICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnaW5mbycsXG4gICAgICAgICAgICAgICAgICBzdW1tYXJ5OiAnTWFzayBkb3duc2NhbGVkJyxcbiAgICAgICAgICAgICAgICAgIGRldGFpbDogYEltYWdlIHRvbyBsYXJnZSBmb3IgYSBmdWxsLXJlc29sdXRpb24gbWFzazsgc2F2aW5nIGF0ICR7ZS53aWR0aH3DlyR7ZS5oZWlnaHR9LmAsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdwcm9ncmVzcyc6XG4gICAgICAgICAgICAgIHRoaXMubWFza1Byb2dyZXNzID0gZS5wZXJjZW50O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2VuY29kaW5nJzpcbiAgICAgICAgICAgICAgdGhpcy5tYXNrRW5jb2RpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RvbmUnOlxuICAgICAgICAgICAgICB0aGlzLmZpbmlzaE1hc2soZS5ibG9iLCBmaWxlbmFtZSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnI6IEVycm9yKSA9PiB7XG4gICAgICAgICAgdGhpcy5tYXNrRXJyb3IoZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gIH1cblxuICAvKiogQ2FuY2VsIGFuIGluLXByb2dyZXNzIG1hc2sgZXhwb3J0ICh0ZXJtaW5hdGVzIGl0cyB3b3JrZXIpIGFuZCByZXNldCBzdGF0ZS4gKi9cbiAgcHJvdGVjdGVkIGNhbmNlbFNhdmVNYXNrKCkge1xuICAgIHRoaXMubWFza0pvYj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm1hc2tKb2IgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5tYXNrQnVzeSA9IGZhbHNlO1xuICAgIHRoaXMubWFza0VuY29kaW5nID0gZmFsc2U7XG4gICAgdGhpcy5tYXNrUHJvZ3Jlc3MgPSAwO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5pc2hNYXNrKGJsb2I6IEJsb2IsIGZpbGVuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLm1hc2tKb2IgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5tYXNrQnVzeSA9IGZhbHNlO1xuICAgIHRoaXMubWFza0VuY29kaW5nID0gZmFsc2U7XG4gICAgdGhpcy5zaG93U2F2ZU1hc2tEaWFsb2cgPSBmYWxzZTtcbiAgICBzYXZlQXMoYmxvYiwgZmlsZW5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXNrRXJyb3IoZGV0YWlsOiBzdHJpbmcpIHtcbiAgICB0aGlzLm1hc2tKb2IgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5tYXNrQnVzeSA9IGZhbHNlO1xuICAgIHRoaXMubWFza0VuY29kaW5nID0gZmFsc2U7XG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAga2V5OiBWSVpfVE9BU1RfS0VZLFxuICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICBzdW1tYXJ5OiAnQ291bGQgbm90IGNyZWF0ZSBtYXNrJyxcbiAgICAgIGRldGFpbCxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwZXJzaXN0UmVnaW9ucygpIHtcbiAgICAvLyBGb2xkZXIgc3RhY2s6IHdyaXRlIGVhY2ggc2xpY2UncyByZWdpb25zIGJhY2sgdG8gaXRzIG93biBzbGljZS1maWxlJ3NcbiAgICAvLyBzaWJsaW5nIGdlb2pzb24g4oCUIG5vIHNpbmdsZS1maWxlbmFtZSBwcm9tcHQgKGppdC11aSM5MykuXG4gICAgaWYgKHRoaXMucGVyc2lzdGVuY2Uuc2F2ZXNQZXJTbGljZSgpKSB7XG4gICAgICB0aGlzLnNhdmVTdGFja1NsaWNlcygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMucGVyc2lzdGVuY2UuZGVmYXVsdFNhdmVOYW1lKCk7XG4gICAgaWYgKCFmaWxlbmFtZSB8fCAoIXRoaXMucmVnaW9uc0ZvclNhdmUoKS5sZW5ndGggJiYgIXRoaXMuaGFzUmVnaW9uU291cmNlKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5zYXZlQXNGaWxlbmFtZSA9IGZpbGVuYW1lO1xuICAgIHRoaXMuc2F2ZUFzRmlsZUV4aXN0cyA9IGZhbHNlO1xuICAgIHRoaXMuc2hvd1NhdmVBc0RpYWxvZyA9IHRydWU7XG4gICAgdGhpcy5zYXZlQXNDaGVjayQubmV4dCh0aGlzLnNhdmVBc0ZpbGVuYW1lKTtcbiAgfVxuXG4gIC8qKiBTYXZlIGEgZm9sZGVyIHN0YWNrJ3MgcmVnaW9ucyBhcyBvbmUgZ2VvanNvbiBwZXIgc2xpY2UtZmlsZSAoaml0LXVpIzkzKS5cbiAgICogIE5vIGRpYWxvZyBjb3ZlcnMgdGhlIHRvb2xiYXIgbWVhbndoaWxlLCBzbyBhIFNhdmUgd2hpbGUgb25lIGlzIHVwbG9hZGluZ1xuICAgKiAgaXMgaWdub3JlZCByYXRoZXIgdGhhbiBzdGFydGluZyBhIHNlY29uZCB3cml0ZSAoYW5kIG9ycGhhbmluZyB0aGUgZmlyc3QpLiAqL1xuICBwcml2YXRlIGFzeW5jIHNhdmVTdGFja1NsaWNlcygpIHtcbiAgICBpZiAodGhpcy5zYXZlQXNCdXN5KSByZXR1cm47XG4gICAgdGhpcy5zYXZlQXNCdXN5ID0gdHJ1ZTtcbiAgICBsZXQgc2xpY2VzOiBTbGljZUdlb0pzb25bXTtcbiAgICB0cnkge1xuICAgICAgc2xpY2VzID0gYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZS5zbGljZUdlb0pzb25zKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLnNhdmVBc0J1c3kgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgdGhpcy50b2FzdCgnZXJyb3InLCAnRXJyb3Igc2F2aW5nIHJlZ2lvbnMnLCBgJHsoZXJyIGFzIEVycm9yKT8ubWVzc2FnZSA/PyBlcnJ9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIENhbmNlbGxlZCB3aGlsZSB0aGUgc2xpY2VzIHNlcmlhbGl6ZWQsIG9yIG5vdGhpbmcgdG8gd3JpdGUuXG4gICAgaWYgKCF0aGlzLnNhdmVBc0J1c3kgfHwgIXNsaWNlcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2F2ZUFzQnVzeSA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9zYXZlQXNTdWIgPSB0aGlzLnBlcnNpc3RlbmNlLnNhdmVTbGljZXMoc2xpY2VzKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICB0aGlzLnNhdmVBc0J1c3kgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XG4gICAgICAgIHRoaXMudG9hc3QoXG4gICAgICAgICAgJ3N1Y2Nlc3MnLFxuICAgICAgICAgICdSZWdpb25zIHNhdmVkJyxcbiAgICAgICAgICBgU2F2ZWQgUk9JcyBmb3IgJHtzbGljZXMubGVuZ3RofSBzbGljZSR7c2xpY2VzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnfWAsXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgdGhpcy5zYXZlQXNCdXN5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgICB0aGlzLnRvYXN0KCdlcnJvcicsICdFcnJvciBzYXZpbmcgcmVnaW9ucycsIGAkeyhlcnIgYXMgRXJyb3IpPy5tZXNzYWdlID8/IGVycn1gKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tTYXZlQXNGaWxlRXhpc3RzKCkge1xuICAgIHRoaXMuc2F2ZUFzQ2hlY2skLm5leHQodGhpcy5zYXZlQXNGaWxlbmFtZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29uZmlybVNhdmVBcygpIHtcbiAgICBpZiAoIXRoaXMucGVyc2lzdGVuY2Uuc2VsZWN0ZWRGaWxlTmFtZSgpKSByZXR1cm47XG5cbiAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMuc2F2ZUFzRmlsZW5hbWUudHJpbSgpO1xuICAgIGlmICghZmlsZW5hbWUpIHJldHVybjtcblxuICAgIC8vIEtlZXAgdGhlIGRpYWxvZyBvcGVuIHNob3dpbmcgYW4gKGluZGV0ZXJtaW5hdGUpIHByb2dyZXNzIGJhciB3aGlsZSB0aGVcbiAgICAvLyByZWdpb25zIHNlcmlhbGl6ZSBhbmQgdXBsb2FkLCB0aGVuIGNsb3NlIG9uIHN1Y2Nlc3MuXG4gICAgY29uc3QgZG9TYXZlID0gKCkgPT4ge1xuICAgICAgdGhpcy5zYXZlQXNCdXN5ID0gdHJ1ZTtcbiAgICAgIC8vIEFsc28gcnVuIGZyb20gdGhlIG92ZXJ3cml0ZSBjb25maXJtYXRpb24sIHdoaWNoIHRoZSBob3N0J3MgZGlhbG9nIG1heSBhbnN3ZXIuXG4gICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgIHRoaXMuX3NhdmVBc1N1YiA9IHRoaXMucGVyc2lzdGVuY2VcbiAgICAgICAgLnNhdmUoKCkgPT4gdGhpcy5yZWdpb25zRm9yU2F2ZSgpLCBmaWxlbmFtZSlcbiAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zYXZlQXNCdXN5ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNob3dTYXZlQXNEaWFsb2cgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZCgpO1xuICAgICAgICAgICAgdGhpcy50b2FzdCgnc3VjY2VzcycsICdSZWdpb25zIHNhdmVkJywgYFNhdmVkIGFzICR7ZmlsZW5hbWV9YCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgICAgdGhpcy5zYXZlQXNCdXN5ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQoKTtcbiAgICAgICAgICAgIHRoaXMudG9hc3QoJ2Vycm9yJywgJ0Vycm9yIHNhdmluZyByZWdpb25zJywgYCR7KGVyciBhcyBFcnJvcik/Lm1lc3NhZ2UgfHwgZXJyfWApO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBpZiAodGhpcy5zYXZlQXNGaWxlRXhpc3RzKSB7XG4gICAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XG4gICAgICAgIG1lc3NhZ2U6IGBcIiR7ZmlsZW5hbWV9XCIgYWxyZWFkeSBleGlzdHMuIERvIHlvdSB3YW50IHRvIG92ZXJ3cml0ZSBpdD9gLFxuICAgICAgICBoZWFkZXI6ICdDb25maXJtIE92ZXJ3cml0ZScsXG4gICAgICAgIGljb246ICdwaSBwaS1leGNsYW1hdGlvbi10cmlhbmdsZScsXG4gICAgICAgIGFjY2VwdDogZG9TYXZlLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvU2F2ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDYW5jZWwgYW4gaW4tcHJvZ3Jlc3MgR2VvSlNPTiBwZXJzaXN0OiBhYm9ydCB0aGUgZGVmZXJyZWQgc2VyaWFsaXplIGFuZC9vclxuICAgKiAgdGhlIGluLWZsaWdodCB1cGxvYWQsIGFuZCByZXNldCBzdGF0ZS4gKi9cbiAgcHJvdGVjdGVkIGNhbmNlbFNhdmVBcygpIHtcbiAgICB0aGlzLl9zYXZlQXNTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fc2F2ZUFzU3ViID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc2F2ZUFzQnVzeSA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSB0b2FzdChzZXZlcml0eTogJ3N1Y2Nlc3MnIHwgJ2Vycm9yJyB8ICdpbmZvJywgc3VtbWFyeTogc3RyaW5nLCBkZXRhaWw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsga2V5OiBWSVpfVE9BU1RfS0VZLCBzZXZlcml0eSwgc3VtbWFyeSwgZGV0YWlsIH0pO1xuICB9XG59XG5cbi8qKlxuICogV2hldGhlciBvbmUgR2VvSlNPTiBmaWxlIGhvbGRzIGEgc2luZ2xlIHBsYW5lIChpdHMgcmVnaW9ucyBpbXBvcnRlZCBhcyB0aGV5IGFsd2F5cyB3ZXJlKS4gT25lXG4gKiB0aGF0IGRvZXMgbm90IHBhcnNlIGlzIHRha2VuIGFzIG9uZSB0b28sIHNvIHRoZSByZWdpb25zIGltcG9ydCByZXBvcnRzIGl0IGFzIGl0IGFsd2F5cyBoYXMuXG4gKi9cbmZ1bmN0aW9uIG9uZVBsYW5lKHRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiBzcGxpdEJ5UGxhbmUodGV4dCkubGVuZ3RoID09PSAxO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIiwiPHAtdG9vbGJhciBzdHlsZUNsYXNzPVwicmVnaW9uLXRvb2xiYXJcIj5cbiAgPGRpdiBjbGFzcz1cInAtdG9vbGJhci1ncm91cC1zdGFydCBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC13cmFwIGdhcC0xXCI+XG4gICAgPHAtYnV0dG9uXG4gICAgICBpY29uPVwicGkgcGktdGFnXCJcbiAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICBbdGV4dF09XCIhc2hvd1NoYXBlTGFiZWxcIlxuICAgICAgcFRvb2x0aXA9XCJTaG93IHJlZ2lvbiBsYWJlbHMuXCJcbiAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXG4gICAgICAob25DbGljayk9XCJzaG93U2hhcGVMYWJlbCA9ICFzaG93U2hhcGVMYWJlbDsgY2hhbmdlU2hvd1NoYXBlTGFiZWwoc2hvd1NoYXBlTGFiZWwpXCJcbiAgICA+XG4gICAgPC9wLWJ1dHRvbj5cbiAgICA8cC1idXR0b25cbiAgICAgIGljb249XCJwaSBwaS1zdG9wLWNpcmNsZVwiXG4gICAgICBzaXplPVwic21hbGxcIlxuICAgICAgW3RleHRdPVwiIXJlZ2lvbnNGaWxsZWRcIlxuICAgICAgcFRvb2x0aXA9XCJGaWxsIHJlZ2lvbnMgaW4gdGhlaXIgY29sb3VyIChhbiBhdGxhcydzIGxvb2spOyBsYWJlbHMgc2l0IGluc2lkZS5cIlxuICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgIGFyaWFMYWJlbD1cIkZpbGwgcmVnaW9uc1wiXG4gICAgICAob25DbGljayk9XCJ0b2dnbGVGaWxsKClcIlxuICAgID5cbiAgICA8L3AtYnV0dG9uPlxuICAgIDxwLWJ1dHRvblxuICAgICAgKm5nSWY9XCJ2b2x1bWVWaWV3XCJcbiAgICAgIGljb249XCJwaSBwaS1leWVcIlxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgIFt0ZXh0XT1cIiFyZWdpb25zVGhyb3VnaFZvbHVtZVwiXG4gICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwicmVnaW9uc1Rocm91Z2hWb2x1bWVcIlxuICAgICAgcFRvb2x0aXA9XCJTZWUgdGhlIHJlZ2lvbnMgdGhyb3VnaCB0aGUgdm9sdW1lLiBPZmYsIHRoZSB2b2x1bWUgaGlkZXMgdGhlIHBhcnRzIG9mIHRoZW0gYmVoaW5kIHdoYXQgaXQgc2hvd3M7IG9uLCBub25lIChsYXllcnMgdHJhY2VkIGluc2lkZSBicmlnaHQgc3RydWN0dXJlcywgc3VjaCBhcyBhbiBPQ1QncykuXCJcbiAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXG4gICAgICBhcmlhTGFiZWw9XCJSZWdpb25zIHRocm91Z2ggdm9sdW1lXCJcbiAgICAgIChvbkNsaWNrKT1cInRvZ2dsZVRocm91Z2hWb2x1bWUoKVwiXG4gICAgPlxuICAgIDwvcC1idXR0b24+XG4gICAgPHNwYW4gY2xhc3M9XCJ0b29sYmFyLXNlcGFyYXRvclwiPjwvc3Bhbj5cbiAgICA8IS0tIE5ldyByZWdpb25zIGFyZSBub3cgY3JlYXRlZCBmcm9tIHRoZSBkaWFncmFtIHRvb2xiYXJcbiAgICAgICAgIChyZWN0YW5nbGUsIHBvbHlsaW5lLCBmcmVlZm9ybSwgd2FuZCkuIC0tPlxuICAgIDxwLWJ1dHRvblxuICAgICAgaWNvbj1cInBpIHBpLXVwbG9hZFwiXG4gICAgICBzaXplPVwic21hbGxcIlxuICAgICAgW3RleHRdPVwidHJ1ZVwiXG4gICAgICBzdHlsZUNsYXNzPVwibXItMlwiXG4gICAgICBwVG9vbHRpcD1cIkltcG9ydCByZWdpb25zOiBhIEdlb0pTT04gZmlsZSwgb3IgYSBsYWJlbCB2b2x1bWUgKC5uaWksIC5uaWkuZ3osIC5ucnJkKSBjaG9zZW4gd2l0aCBpdHMgb250b2xvZ3kgSlNPTiBmb3IgdGhlIGNsYXNzIHRyZWUuXCJcbiAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXG4gICAgICAoY2xpY2spPVwicm9pRmlsZUlucHV0LmNsaWNrKClcIlxuICAgID5cbiAgICA8L3AtYnV0dG9uPlxuICAgIDxpbnB1dFxuICAgICAgI3JvaUZpbGVJbnB1dFxuICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgYWNjZXB0PVwiLmdlb2pzb24sLmpzb24sLm5paSwuZ3osLm5ycmRcIlxuICAgICAgbXVsdGlwbGVcbiAgICAgIGhpZGRlblxuICAgICAgKGNoYW5nZSk9XCJpbXBvcnRSb2lzKCRldmVudCk7IHJvaUZpbGVJbnB1dC52YWx1ZSA9ICcnXCJcbiAgICAvPlxuICAgIDxwLWJ1dHRvblxuICAgICAgaWNvbj1cInBpIHBpLWZvbGRlci1vcGVuXCJcbiAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICBbdGV4dF09XCJ0cnVlXCJcbiAgICAgIHN0eWxlQ2xhc3M9XCJtci0yXCJcbiAgICAgIHBUb29sdGlwPVwiSW1wb3J0IGEgZm9sZGVyIG9mIHBlci1zbGljZSBHZW9KU09OIGZpbGVzIChvbmUgcGVyIHNsaWNlLCBpbiBuYW1lIG9yZGVyLCB3aXRoIGl0cyByZWdpb25zZXQuanNvbiBjbGFzcyB0cmVlKS5cIlxuICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgIGFyaWFMYWJlbD1cIkltcG9ydCBhIGZvbGRlciBvZiByZWdpb25zXCJcbiAgICAgIChjbGljayk9XCJyb2lGb2xkZXJJbnB1dC5jbGljaygpXCJcbiAgICA+XG4gICAgPC9wLWJ1dHRvbj5cbiAgICA8aW5wdXRcbiAgICAgICNyb2lGb2xkZXJJbnB1dFxuICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgd2Via2l0ZGlyZWN0b3J5XG4gICAgICBtdWx0aXBsZVxuICAgICAgaGlkZGVuXG4gICAgICAoY2hhbmdlKT1cImltcG9ydFJvaXMoJGV2ZW50KTsgcm9pRm9sZGVySW5wdXQudmFsdWUgPSAnJ1wiXG4gICAgLz5cbiAgICA8cC1idXR0b25cbiAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICBbdGV4dF09XCJ0cnVlXCJcbiAgICAgIHN0eWxlQ2xhc3M9XCJtci0yXCJcbiAgICAgIHBUb29sdGlwPVwiRG93bmxvYWQgcmVnaW9ucyBhcyBnZW9qc29uIGZpbGUuXCJcbiAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXG4gICAgICBpY29uPVwicGkgcGktZG93bmxvYWRcIlxuICAgICAgKGNsaWNrKT1cImV4cG9ydFJvaXMoKVwiXG4gICAgPlxuICAgIDwvcC1idXR0b24+XG4gICAgPHAtYnV0dG9uXG4gICAgICBpY29uPVwicGkgcGktc2F2ZVwiXG4gICAgICBzaXplPVwic21hbGxcIlxuICAgICAgW3RleHRdPVwidHJ1ZVwiXG4gICAgICBzdHlsZUNsYXNzPVwibXItMlwiXG4gICAgICBwVG9vbHRpcD1cIlNhdmUgcmVnaW9ucyB0byBzZXJ2ZXIuXCJcbiAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXG4gICAgICAoY2xpY2spPVwicGVyc2lzdFJlZ2lvbnMoKVwiXG4gICAgICBbZGlzYWJsZWRdPVwiKCFyZWdpb25zIHx8ICFyZWdpb25zLmxlbmd0aCkgJiYgIWhhc1JlZ2lvblNvdXJjZVwiXG4gICAgPlxuICAgIDwvcC1idXR0b24+XG4gICAgPHAtYnV0dG9uXG4gICAgICAqbmdJZj1cImNhbkltcG9ydEZyb21TZXJ2ZXJcIlxuICAgICAgaWNvbj1cInBpIHBpLWNsb3VkLWRvd25sb2FkXCJcbiAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICBbdGV4dF09XCJ0cnVlXCJcbiAgICAgIHN0eWxlQ2xhc3M9XCJtci0yXCJcbiAgICAgIHBUb29sdGlwPVwiSW1wb3J0IHJlZ2lvbnMgZnJvbSBzZXJ2ZXI6IGEgR2VvSlNPTiBmaWxlLCBhIGZvbGRlciBvZiBwZXItc2xpY2UgR2VvSlNPTiBmaWxlcyBvciBhIGxhYmVsIHZvbHVtZSAoLm5paSwgLm5paS5neiwgLm5ycmQpLlwiXG4gICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxuICAgICAgYXJpYUxhYmVsPVwiSW1wb3J0IHJlZ2lvbnMgZnJvbSBzZXJ2ZXJcIlxuICAgICAgW2xvYWRpbmddPVwiaW1wb3J0aW5nXCJcbiAgICAgIChjbGljayk9XCJpbXBvcnRGcm9tU2VydmVyKClcIlxuICAgID5cbiAgICA8L3AtYnV0dG9uPlxuICAgIDxwLWJ1dHRvblxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgIFt0ZXh0XT1cInRydWVcIlxuICAgICAgc3R5bGVDbGFzcz1cIm1yLTJcIlxuICAgICAgcFRvb2x0aXA9XCJEb3dubG9hZCBtYXNrIG9mIHRoZSByZWdpb25zIGFzIFBOR1wiXG4gICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxuICAgICAgKGNsaWNrKT1cIm9wZW5TYXZlTWFza0RpYWxvZygpXCJcbiAgICAgIFtkaXNhYmxlZF09XCIhcmVnaW9ucyB8fCAhcmVnaW9ucy5sZW5ndGhcIlxuICAgID5cbiAgICAgIDwhLS0gUmVmZXJlbmNlcyB0aGUgZmlsZSBzbyBJbmtzY2FwZSBlZGl0cyB0byBtYXNrLnN2ZyBzaG93IHVwIGRpcmVjdGx5XG4gICAgICAgICAgICh0aGUgbGliJ3MgYXNzZXRzLyoqIGFyZSBzZXJ2ZWQgYXQgYXNzZXRzL3Bsb3R0aW5nLykuIFRoZVxuICAgICAgICAgICB0b29sYmFyLWljb24tZGFyayBmaWx0ZXIgcmVjb2xvdXJzIHRoZSBibGFjayBTVkcgdG8gdGhlIHRoZW1lIGJsdWUsXG4gICAgICAgICAgIHNhbWUgYXMgcmVnaW9uLWVkaXRvci5zdmcgYW5kIHRoZSBvdGhlciBTVkcgdG9vbGJhciBpY29ucy4gLS0+XG4gICAgICA8aW1nXG4gICAgICAgIHNyYz1cImFzc2V0cy9wbG90dGluZy9tYXNrLnN2Z1wiXG4gICAgICAgIGNsYXNzPVwidG9vbGJhci1pY29uLWRhcmtcIlxuICAgICAgICBzdHlsZT1cIndpZHRoOiAxcmVtOyBoZWlnaHQ6IDFyZW07IHZlcnRpY2FsLWFsaWduOiBtaWRkbGVcIlxuICAgICAgICBhbHQ9XCJEb3dubG9hZCBtYXNrXCJcbiAgICAgIC8+XG4gICAgPC9wLWJ1dHRvbj5cbiAgICA8cC1idXR0b25cbiAgICAgIGxhYmVsPVwieDUxMlwiXG4gICAgICBzaXplPVwic21hbGxcIlxuICAgICAgW3RleHRdPVwidHJ1ZVwiXG4gICAgICBzdHlsZUNsYXNzPVwibXItMlwiXG4gICAgICBwVG9vbHRpcD1cIlJvdW5kIGFsbCByZWN0YW5nbGUgcmVnaW9uc1xuICAgICAgICAgICAgICAgICAgICB0byB3aWR0aCBhbmQgaGVpZ2h0IHRoYXQgYXJlIG11bHRpcGxlIG9mIDUxMlwiXG4gICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxuICAgICAgKGNsaWNrKT1cInJvdW5kUmVjdGFuZ2xlTGVuZ3RocygpXCJcbiAgICA+XG4gICAgPC9wLWJ1dHRvbj5cbiAgICA8cC1idXR0b25cbiAgICAgIGljb249XCJwaSBwaS1jaGVjay1zcXVhcmVcIlxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgIFt0ZXh0XT1cInRydWVcIlxuICAgICAgc3R5bGVDbGFzcz1cIm1yLTJcIlxuICAgICAgcFRvb2x0aXA9XCJTZWxlY3QgYWxsIHJlZ2lvbnNcIlxuICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgIChjbGljayk9XCJzZWxlY3RBbGxSZWdpb25zKClcIlxuICAgICAgW2Rpc2FibGVkXT1cIiFyZWdpb25zIHx8ICFyZWdpb25zLmxlbmd0aFwiXG4gICAgPlxuICAgIDwvcC1idXR0b24+XG4gICAgPHAtYnV0dG9uXG4gICAgICBpY29uPVwicGkgcGktdGFnc1wiXG4gICAgICBzaXplPVwic21hbGxcIlxuICAgICAgW3RleHRdPVwidHJ1ZVwiXG4gICAgICBzdHlsZUNsYXNzPVwibXItMlwiXG4gICAgICBwVG9vbHRpcD1cIkVkaXQgY2xhc3Mgb24gc2VsZWN0ZWQgcm93c1wiXG4gICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxuICAgICAgKGNsaWNrKT1cIiFzZWxlY3RlZFJlZ2lvbnMgfHwgIXNlbGVjdGVkUmVnaW9ucy5sZW5ndGggPyBvcC5oaWRlKCkgOiBvcC50b2dnbGUoJGV2ZW50KVwiXG4gICAgICBbZGlzYWJsZWRdPVwiIXNlbGVjdGVkUmVnaW9ucyB8fCAhc2VsZWN0ZWRSZWdpb25zLmxlbmd0aFwiXG4gICAgPlxuICAgIDwvcC1idXR0b24+XG4gICAgPHAtYnV0dG9uXG4gICAgICBpY29uPVwicGkgcGktcGFsZXR0ZVwiXG4gICAgICBzaXplPVwic21hbGxcIlxuICAgICAgW3RleHRdPVwidHJ1ZVwiXG4gICAgICBzdHlsZUNsYXNzPVwibXItMlwiXG4gICAgICBwVG9vbHRpcD1cIkVkaXQgY29sb3VyIG9mIHNlbGVjdGVkIHJlZ2lvbnNcIlxuICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgIChjbGljayk9XCJvcGVuQ29sb3JEaWFsb2coKVwiXG4gICAgICBbZGlzYWJsZWRdPVwiIXNlbGVjdGVkUmVnaW9ucyB8fCAhc2VsZWN0ZWRSZWdpb25zLmxlbmd0aFwiXG4gICAgPlxuICAgIDwvcC1idXR0b24+XG4gICAgPHAtb3ZlcmxheVBhbmVsICNvcCAob25IaWRlKT1cImJ1bGtDbGFzcyA9ICcnOyBuZXdCdWxrQ2xhc3MgPSAnJ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2x1bW4gZ2FwLTJcIiBzdHlsZT1cIndpZHRoOiAxOHJlbVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtbWVkaXVtIHRleHQtOTAwXCJcbiAgICAgICAgICA+U2V0IGNsYXNzIG9uIHt7IHNlbGVjdGVkUmVnaW9ucz8ubGVuZ3RoIHx8IDAgfX0gc2VsZWN0ZWQgcmVnaW9uKHMpPC9zcGFuXG4gICAgICAgID5cbiAgICAgICAgPCEtLSBTZWxlY3RpbmcgYSBjbGFzcyBhcHBsaWVzIGl0IGltbWVkaWF0ZWx5IChjaG9vc2luZyBhbiBvcHRpb24gY2xvc2VzIHRoZVxuICAgICAgICAgICAgIG92ZXJsYXksIHNvIHRoZXJlJ3Mgbm8gc2VwYXJhdGUgQXBwbHkgYnV0dG9uKS4gLS0+XG4gICAgICAgIDxwLWRyb3Bkb3duXG4gICAgICAgICAgc3R5bGVDbGFzcz1cInctZnVsbFwiXG4gICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICBbb3B0aW9uc109XCJwcmVzZXRTZXQuY2xhc3Nlc1wiXG4gICAgICAgICAgb3B0aW9uTGFiZWw9XCJuYW1lXCJcbiAgICAgICAgICBvcHRpb25WYWx1ZT1cIm5hbWVcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwiYnVsa0NsYXNzXCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIkNob29zZSBhIGNsYXNz4oCmXCJcbiAgICAgICAgICBbZmlsdGVyXT1cInByZXNldFNldC5jbGFzc2VzLmxlbmd0aCA+IDhcIlxuICAgICAgICAgIGZpbHRlckJ5PVwibmFtZVwiXG4gICAgICAgICAgKG9uQ2hhbmdlKT1cImFwcGx5QnVsa0NsYXNzKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1jIHBUZW1wbGF0ZT1cIml0ZW1cIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGQtdmFsdWVcIlxuICAgICAgICAgICAgICA+PHNwYW4gY2xhc3M9XCJjaGlwLXN3YXRjaFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImMuY29sb3JcIj48L3NwYW4+e3sgYy5uYW1lIH19PC9zcGFuXG4gICAgICAgICAgICA+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9wLWRyb3Bkb3duPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicC1pbnB1dGdyb3VwXCI+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBwSW5wdXRUZXh0XG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIuKApm9yIGEgbmV3IGNsYXNzXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwibmV3QnVsa0NsYXNzXCJcbiAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImFkZEFuZEFwcGx5QnVsa0NsYXNzKClcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBpY29uPVwicGkgcGktcGx1c1wiXG4gICAgICAgICAgICBwVG9vbHRpcD1cIkFkZCBjbGFzcyAmYW1wOyBzZXQgaXRcIlxuICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhbmV3QnVsa0NsYXNzLnRyaW0oKVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWRkQW5kQXBwbHlCdWxrQ2xhc3MoKVwiXG4gICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvcC1vdmVybGF5UGFuZWw+XG4gICAgPHAtYnV0dG9uXG4gICAgICBpY29uPVwicGkgcGktdHJhc2hcIlxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgIFt0ZXh0XT1cInRydWVcIlxuICAgICAgc3R5bGVDbGFzcz1cIm1yLTJcIlxuICAgICAgKGNsaWNrKT1cImRlbGV0ZVNlbGVjdGVkUmVnaW9ucygpXCJcbiAgICAgIHBUb29sdGlwPVwiRGVsZXRlIHNlbGVjdGVkIHJlZ2lvbnNcIlxuICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWRSZWdpb25zIHx8ICFzZWxlY3RlZFJlZ2lvbnMubGVuZ3RoXCJcbiAgICA+PC9wLWJ1dHRvbj5cbiAgICA8cC1idXR0b25cbiAgICAgIGljb249XCJwaSBwaS10aW1lcy1jaXJjbGVcIlxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgIFt0ZXh0XT1cInRydWVcIlxuICAgICAgc3R5bGVDbGFzcz1cIm1yLTJcIlxuICAgICAgKGNsaWNrKT1cImNsZWFyQWxsUmVnaW9ucygpXCJcbiAgICAgIHBUb29sdGlwPVwiRGVsZXRlIGFsbCByZWdpb25zXCJcbiAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXG4gICAgICBbZGlzYWJsZWRdPVwiKCFyZWdpb25zIHx8ICFyZWdpb25zLmxlbmd0aCkgJiYgIWhhc1JlZ2lvblNvdXJjZVwiXG4gICAgPjwvcC1idXR0b24+XG4gICAgPHAtYnV0dG9uXG4gICAgICBpY29uPVwicGkgcGktcXVlc3Rpb25cIlxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgIFt0ZXh0XT1cInRydWVcIlxuICAgICAgKGNsaWNrKT1cInNob3dIZWxwKClcIlxuICAgICAgcFRvb2x0aXA9XCJIZWxwXCJcbiAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXG4gICAgPjwvcC1idXR0b24+XG4gIDwvZGl2PlxuPC9wLXRvb2xiYXI+XG5cbjxyZWdpb24tY2xhc3Nlcy1wYW5lbFxuICBbY2xhc3Nlc109XCJkaXNwbGF5Q2xhc3Nlc1wiXG4gIFtjb3VudHNdPVwiY2xhc3NDb3VudHNcIlxuICBbbWF0Y2hNb2RlXT1cInByZXNldFNldC5tYXRjaE1vZGVcIlxuICBbYWN0aXZlQ2xhc3NdPVwiYWN0aXZlQ2xhc3NcIlxuICBbcGlja2VkXT1cInBpY2tlZENsYXNzXCJcbiAgW21hcmtlZF09XCJtYXJrZWRDbGFzc2VzXCJcbiAgW3NlbGVjdGVkQ291bnRdPVwic2VsZWN0ZWRSZWdpb25zPy5sZW5ndGggfHwgMFwiXG4gIFtkZWZhdWx0Q2xhc3NOYW1lXT1cImRlZmF1bHRDbGFzc05hbWVcIlxuICAocGljayk9XCJzZWxlY3RBY3RpdmVDbGFzcygkZXZlbnQpXCJcbiAgKHJlY29sb3IpPVwic2V0Q2xhc3NDb2xvcigkZXZlbnQubmFtZSwgJGV2ZW50LmNvbG9yKVwiXG4gIChyZW1vdmUpPVwiZGVsZXRlQ2xhc3MoJGV2ZW50KVwiXG4gIChtYW5hZ2UpPVwib3Blbk1hbmFnZURpYWxvZygpXCJcbiAgW3ZvbHVtZV09XCJ2b2x1bWVWaWV3XCJcbiAgW3Nob3duM2RdPVwic2hvd24zZE5hbWVzXCJcbiAgKHRvZ2dsZTNkKT1cInRvZ2dsZUNsYXNzM2QoJGV2ZW50KVwiXG4gIFtoaWRkZW5dPVwiaGlkZGVuQ2xhc3Nlc1wiXG4gICh0b2dnbGVIaWRkZW4pPVwic2V0Q2xhc3Nlc0hpZGRlbihbJGV2ZW50XSwgIWhpZGRlbkNsYXNzZXMuaGFzKCRldmVudCkpXCJcbiAgW3RyZWVWaWV3XT1cImNsYXNzSGllcmFyY2h5ID8gY2xhc3NUcmVlVmlldyA6IG51bGxcIlxuICAodHJlZVZpZXdDaGFuZ2UpPVwiY2xhc3NUcmVlVmlldyA9ICRldmVudFwiXG4+XG4gIDwhLS0gQSByZWdpb24gc2V0IHdpdGggYSBjbGFzcyBoaWVyYXJjaHkgKGFuIGF0bGFzIG9udG9sb2d5KSBjYW4gc2hvdyBpdHMgY2xhc3NlcyBhcyBhIHRyZWUuIC0tPlxuICA8cmVnaW9uLWNsYXNzLXRyZWVcbiAgICAqbmdJZj1cImNsYXNzSGllcmFyY2h5IGFzIGhpZXJhcmNoeVwiXG4gICAgW25vZGVzXT1cImhpZXJhcmNoeVwiXG4gICAgW2NvdW50c109XCJ0cmVlQ291bnRzXCJcbiAgICBbY29sb3JPZl09XCJ0cmVlQ29sb3JcIlxuICAgIFtwaWNrZWRdPVwicGlja2VkQ2xhc3NcIlxuICAgIFttYXJrZWRdPVwibWFya2VkQ2xhc3Nlc1wiXG4gICAgW3ZvbHVtZV09XCJ2b2x1bWVWaWV3XCJcbiAgICBbc2hvd24zZF09XCJzaG93bjNkTmFtZXNcIlxuICAgIChwaWNrKT1cInBpY2tDbGFzc2VzKCRldmVudClcIlxuICAgIChyZWNvbG9yKT1cInNldENsYXNzQ29sb3IoJGV2ZW50Lm5hbWUsICRldmVudC5jb2xvcilcIlxuICAgICh0b2dnbGUzZCk9XCJ0b2dnbGVDbGFzczNkKCRldmVudC5uYW1lLCAkZXZlbnQuY2xhc3NlcylcIlxuICAgIFtoaWRkZW5dPVwiaGlkZGVuQ2xhc3Nlc1wiXG4gICAgKHRvZ2dsZUhpZGRlbik9XCJzZXRDbGFzc2VzSGlkZGVuKCRldmVudC5jbGFzc2VzLCAkZXZlbnQuaGlkZGVuKVwiXG4gID5cbiAgPC9yZWdpb24tY2xhc3MtdHJlZT5cbjwvcmVnaW9uLWNsYXNzZXMtcGFuZWw+XG5cbjxyZWdpb24tdGFibGVcbiAgW3BhZ2VdPVwicGFnZWRSZWdpb25zXCJcbiAgW3RvdGFsXT1cInRhYmxlVG90YWxcIlxuICBbZmlyc3RdPVwicGFnaW5hdG9yRmlyc3RcIlxuICBbcm93c109XCJwYWdpbmF0b3JSb3dzXCJcbiAgW3Jvd3NQZXJQYWdlT3B0aW9uc109XCJyb3dzUGVyUGFnZU9wdGlvbnNcIlxuICBbbWV0YUtleV09XCJtZXRhS2V5XCJcbiAgW3NlbGVjdGlvbl09XCJzZWxlY3RlZFJlZ2lvbnNcIlxuICAoc2VsZWN0aW9uQ2hhbmdlKT1cInNlbGVjdGVkUmVnaW9ucyA9ICRldmVudFwiXG4gIChyb3dTZWxlY3QpPVwib25TZWxlY3Rpb25DaGFuZ2VkKClcIlxuICBbcHJlc2V0U2V0XT1cInRhYmxlUHJlc2V0U2V0XCJcbiAgW2RlZmF1bHRDb2xvcl09XCJzaGFwZUNvbG9yXCJcbiAgW21wcF09XCJtcHBcIlxuICBbdm9sdW1lc109XCJ0YWJsZVZvbHVtZXNcIlxuICBbbGFiZWxEcmFmdHNdPVwiZWRpdGluZ0xhYmVsUmVnaW9uc1wiXG4gIChsYWJlbEVkaXRTdGFydCk9XCJzdGFydEVkaXRMYWJlbCgkZXZlbnQpXCJcbiAgKGxhYmVsRHJhZnRDaGFuZ2UpPVwic2V0TGFiZWxEcmFmdCgkZXZlbnQucmVnaW9uLCAkZXZlbnQudmFsdWUpXCJcbiAgKGxhYmVsRWRpdFN0b3ApPVwic3RvcEVkaXRMYWJlbCgkZXZlbnQucmVnaW9uLCAkZXZlbnQuY29tbWl0KVwiXG4gIChjbGFzc1BpY2spPVwiYXBwbHlQcmVzZXRUb1JlZ2lvbigkZXZlbnQucmVnaW9uLCAkZXZlbnQubmFtZSlcIlxuICAoZGVsZXRlUm93KT1cImRlbGV0ZVJlZ2lvbigkZXZlbnQpXCJcbiAgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxuPlxuPC9yZWdpb24tdGFibGU+XG5cbjwhLS0gTGl2ZS1lZGl0IG1vZGU6IG5vIFNhdmUvQ2FuY2VsIOKAlCBldmVyeSBlZGl0IGNvbW1pdHMgaW1tZWRpYXRlbHkgdG8gdGhlXG4gICAgIGFjdGl2ZSBpbWFnZSdzIHJlZ2lvbiBjYWNoZS4gLS0+XG5cbjxwLWNvbmZpcm1EaWFsb2dcbiAgI2NkXG4gIFtzdHlsZV09XCJ7IHdpZHRoOiAnMjRyZW0nLCBoZWlnaHQ6ICcxNHJlbScgfVwiXG4gIGtleT1cInBvc2l0aW9uRGlhbG9nXCJcbiAgW2Jhc2VaSW5kZXhdPVwiMTAwMDBcIlxuICByZWplY3RCdXR0b25TdHlsZUNsYXNzPVwicC1idXR0b24tb3V0bGluZWRcIlxuPlxuICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZm9vdGVyXCI+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgcEJ1dHRvbiBpY29uPVwicGkgcGktY2hlY2tcIiBsYWJlbD1cIlllc1wiIChjbGljayk9XCJjZC5hY2NlcHQoKVwiPjwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1vdXRsaW5lZFwiXG4gICAgICBwQnV0dG9uXG4gICAgICBpY29uPVwicGkgcGktdGltZXNcIlxuICAgICAgbGFiZWw9XCJOb1wiXG4gICAgICAoY2xpY2spPVwiY2QucmVqZWN0KClcIlxuICAgID48L2J1dHRvbj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvcC1jb25maXJtRGlhbG9nPlxuXG48cmVnaW9uLXNhdmUtcmVnaW9ucy1kaWFsb2dcbiAgWyh2aXNpYmxlKV09XCJzaG93U2F2ZUFzRGlhbG9nXCJcbiAgW2ZpbGVuYW1lXT1cInNhdmVBc0ZpbGVuYW1lXCJcbiAgKGZpbGVuYW1lQ2hhbmdlKT1cInNhdmVBc0ZpbGVuYW1lID0gJGV2ZW50OyBjaGVja1NhdmVBc0ZpbGVFeGlzdHMoKVwiXG4gIFtmaWxlRXhpc3RzXT1cInNhdmVBc0ZpbGVFeGlzdHNcIlxuICBbYnVzeV09XCJzYXZlQXNCdXN5XCJcbiAgKGNvbmZpcm0pPVwiY29uZmlybVNhdmVBcygpXCJcbiAgKGNhbmNlbFNhdmUpPVwiY2FuY2VsU2F2ZUFzKClcIlxuPlxuPC9yZWdpb24tc2F2ZS1yZWdpb25zLWRpYWxvZz5cblxuPHJlZ2lvbi1zYXZlLXJlZ2lvbnMtZGlhbG9nXG4gIGhlYWRlcj1cIkV4cG9ydCBSZWdpb25zXCJcbiAgY29uZmlybUxhYmVsPVwiRXhwb3J0XCJcbiAgY29uZmlybUljb249XCJwaSBwaS1kb3dubG9hZFwiXG4gIGlucHV0SWQ9XCJleHBvcnQtZmlsZW5hbWVcIlxuICBbKHZpc2libGUpXT1cInNob3dFeHBvcnREaWFsb2dcIlxuICBbKGZpbGVuYW1lKV09XCJleHBvcnRGaWxlbmFtZVwiXG4gIChjb25maXJtKT1cImNvbmZpcm1FeHBvcnQoKVwiXG4+XG48L3JlZ2lvbi1zYXZlLXJlZ2lvbnMtZGlhbG9nPlxuXG48cmVnaW9uLXNhdmUtbWFzay1kaWFsb2dcbiAgWyh2aXNpYmxlKV09XCJzaG93U2F2ZU1hc2tEaWFsb2dcIlxuICBbKGZpbGVuYW1lKV09XCJzYXZlTWFza0ZpbGVuYW1lXCJcbiAgWyhtb2RlKV09XCJtYXNrTW9kZVwiXG4gIFtidXN5XT1cIm1hc2tCdXN5XCJcbiAgW3Byb2dyZXNzXT1cIm1hc2tQcm9ncmVzc1wiXG4gIFtlbmNvZGluZ109XCJtYXNrRW5jb2RpbmdcIlxuICAoY29uZmlybSk9XCJjb25maXJtU2F2ZU1hc2soKVwiXG4gIChjYW5jZWxFeHBvcnQpPVwiY2FuY2VsU2F2ZU1hc2soKVwiXG4+XG48L3JlZ2lvbi1zYXZlLW1hc2stZGlhbG9nPlxuXG48cmVnaW9uLWNvbG9yLWRpYWxvZ1xuICBbKHZpc2libGUpXT1cInNob3dDb2xvckRpYWxvZ1wiXG4gIFtlZGl0c109XCJjbGFzc0NvbG9yRWRpdHNcIlxuICBbc2VsZWN0ZWRDb3VudF09XCJzZWxlY3RlZFJlZ2lvbnM/Lmxlbmd0aCB8fCAwXCJcbiAgKGFwcGx5KT1cImFwcGx5Q29sb3JUb1NlbGVjdGVkKCRldmVudClcIlxuPlxuPC9yZWdpb24tY29sb3ItZGlhbG9nPlxuXG48IS0tIE1hbmFnZSBhbm5vdGF0aW9uIGNsYXNzZXMgKGppdC11aSM3MCk6IGVkaXRzIGEgd29ya2luZyBjb3B5LCBjb21taXR0ZWQgb24gQXBwbHkuIC0tPlxuPHJlZ2lvbi1tYW5hZ2UtY2xhc3Nlcy1kaWFsb2dcbiAgWyh2aXNpYmxlKV09XCJzaG93TWFuYWdlRGlhbG9nXCJcbiAgWyhkcmFmdCldPVwicHJlc2V0RHJhZnRcIlxuICAoYXBwbHkpPVwiYXBwbHlNYW5hZ2VEaWFsb2codHJ1ZSlcIlxuICAocmVzZXREZWZhdWx0cyk9XCJyZXNldFByZXNldHNUb0RlZmF1bHRzKClcIlxuICAoaW1wb3J0RmlsZSk9XCJpbXBvcnRQcmVzZXRzKCRldmVudClcIlxuICAoZXhwb3J0KT1cImV4cG9ydFByZXNldHMoKVwiXG4+XG48L3JlZ2lvbi1tYW5hZ2UtY2xhc3Nlcy1kaWFsb2c+XG5cbjxyZWdpb24tZWRpdG9yLWhlbHAgWyh2aXNpYmxlKV09XCJkaXNwbGF5SGVscERpYWxvZ1wiPjwvcmVnaW9uLWVkaXRvci1oZWxwPlxuIl19