@jax-data-science/sci-image-visualizer 0.9.0 → 0.11.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 (149) hide show
  1. package/esm2022/index.mjs +10 -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/contracts/region-store.contract.mjs +1 -1
  6. package/esm2022/lib/contracts/section-view.contract.mjs +2 -0
  7. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  8. package/esm2022/lib/contracts/viz-config.mjs +1 -1
  9. package/esm2022/lib/geometry/loft.mjs +128 -0
  10. package/esm2022/lib/geometry/polylabel.mjs +156 -0
  11. package/esm2022/lib/geometry/reconstruct.mjs +315 -0
  12. package/esm2022/lib/geometry/reslice-image.mjs +57 -0
  13. package/esm2022/lib/geometry/section.mjs +215 -0
  14. package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +11 -7
  15. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +20 -3
  16. package/esm2022/lib/implementations/napari-js/napari-region-mesh-pointer.mjs +100 -0
  17. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +28 -5
  18. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
  19. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +9 -2
  20. package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +5 -2
  21. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +81 -1
  22. package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +129 -0
  23. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +115 -4
  24. package/esm2022/lib/implementations/napari-js/napari-volume-slice-planes.mjs +103 -0
  25. package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +15 -3
  26. package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +18 -2
  27. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +9 -1
  28. package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +18 -7
  29. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +38 -8
  30. package/esm2022/lib/implementations/osd/osd-tile-loading.mjs +71 -0
  31. package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +1 -1
  32. package/esm2022/lib/implementations/osd/slice-cache.mjs +35 -6
  33. package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +1 -1
  34. package/esm2022/lib/models/class-preset.mjs +1 -1
  35. package/esm2022/lib/models/polygon-factory.mjs +17 -1
  36. package/esm2022/lib/models/region-geojson.mjs +44 -6
  37. package/esm2022/lib/models/region.mjs +1 -1
  38. package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +156 -0
  39. package/esm2022/lib/region-editor/class-tree/class-tree.mjs +108 -0
  40. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +77 -13
  41. package/esm2022/lib/region-editor/region-editor.component.mjs +670 -42
  42. package/esm2022/lib/region-editor/region-metrics.mjs +20 -2
  43. package/esm2022/lib/region-editor/region-persistence.service.mjs +44 -10
  44. package/esm2022/lib/region-editor/region-table/region-table.component.mjs +24 -8
  45. package/esm2022/lib/region-import/label-classes.mjs +149 -0
  46. package/esm2022/lib/region-import/label-volume.mjs +194 -0
  47. package/esm2022/lib/region-import/region-import.mjs +71 -0
  48. package/esm2022/lib/region-overlay/region-geometry.mjs +3 -3
  49. package/esm2022/lib/region-overlay/region-source-layer.mjs +378 -0
  50. package/esm2022/lib/region-overlay/region-style.mjs +97 -0
  51. package/esm2022/lib/region-source/http-region-source.mjs +104 -0
  52. package/esm2022/lib/region-source/region-source-ops.mjs +53 -0
  53. package/esm2022/lib/region-source/region-source-worker.mjs +10 -0
  54. package/esm2022/lib/region-source/region-source.mjs +67 -0
  55. package/esm2022/lib/region-source/region-tiles.mjs +708 -0
  56. package/esm2022/lib/region-source/worker-region-source.mjs +229 -0
  57. package/esm2022/lib/routing-visualizer.service.mjs +510 -22
  58. package/esm2022/lib/section-pane/section-pane.component.mjs +299 -0
  59. package/esm2022/lib/store/class-color.util.mjs +10 -5
  60. package/esm2022/lib/store/class-signatures.mjs +63 -0
  61. package/esm2022/lib/store/region-scope-cache.mjs +5 -1
  62. package/esm2022/lib/store/region-source-scope.mjs +186 -0
  63. package/esm2022/lib/store/region-store.service.mjs +774 -12
  64. package/esm2022/lib/store/visualizer-store.service.mjs +33 -6
  65. package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +8 -2
  66. package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +55 -15
  67. package/esm2022/lib/toolbar/toolbar.component.mjs +19 -5
  68. package/esm2022/lib/visualizer/region-load.mjs +67 -4
  69. package/esm2022/lib/visualizer/volume-sections.mjs +175 -0
  70. package/esm2022/lib/visualizer.component.mjs +155 -7
  71. package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BELcx0jv.mjs} +9851 -2904
  72. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BELcx0jv.mjs.map +1 -0
  73. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-DEDSm_NL.mjs} +4 -4
  74. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-DEDSm_NL.mjs.map} +1 -1
  75. package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs +12 -0
  76. package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs.map +1 -0
  77. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +3 -3
  78. package/fesm2022/region-source.worker.js +1067 -0
  79. package/index.d.ts +12 -0
  80. package/lib/contracts/image.contract.d.ts +4 -0
  81. package/lib/contracts/ports/region-io.port.d.ts +24 -0
  82. package/lib/contracts/region-editor-api.contract.d.ts +102 -0
  83. package/lib/contracts/region-store.contract.d.ts +22 -0
  84. package/lib/contracts/section-view.contract.d.ts +44 -0
  85. package/lib/contracts/visualizer.contract.d.ts +10 -0
  86. package/lib/contracts/viz-config.d.ts +8 -0
  87. package/lib/geometry/loft.d.ts +22 -0
  88. package/lib/geometry/polylabel.d.ts +23 -0
  89. package/lib/geometry/reconstruct.d.ts +54 -0
  90. package/lib/geometry/reslice-image.d.ts +33 -0
  91. package/lib/geometry/section.d.ts +52 -0
  92. package/lib/implementations/napari-js/napari-loading-badge.d.ts +4 -2
  93. package/lib/implementations/napari-js/napari-loading-state.d.ts +8 -1
  94. package/lib/implementations/napari-js/napari-region-mesh-pointer.d.ts +32 -0
  95. package/lib/implementations/napari-js/napari-region-overlay.d.ts +6 -1
  96. package/lib/implementations/napari-js/napari-scene.d.ts +33 -0
  97. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +3 -1
  98. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +48 -0
  99. package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +66 -0
  100. package/lib/implementations/napari-js/napari-volume-scene.d.ts +45 -1
  101. package/lib/implementations/napari-js/napari-volume-slice-planes.d.ts +43 -0
  102. package/lib/implementations/osd/openseadragon-viewer-options.d.ts +2 -0
  103. package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +2 -0
  104. package/lib/implementations/osd/osd-region-overlay-draw.d.ts +4 -3
  105. package/lib/implementations/osd/osd-region-overlay.d.ts +10 -3
  106. package/lib/implementations/osd/osd-tile-loading.d.ts +43 -0
  107. package/lib/implementations/osd/osd-viewer-like.d.ts +14 -0
  108. package/lib/implementations/osd/slice-cache.d.ts +13 -3
  109. package/lib/implementations/tile-server/tile-protocol.d.ts +3 -0
  110. package/lib/models/class-preset.d.ts +7 -0
  111. package/lib/models/polygon-factory.d.ts +5 -0
  112. package/lib/models/region-geojson.d.ts +40 -0
  113. package/lib/models/region.d.ts +19 -0
  114. package/lib/region-editor/class-tree/class-tree.component.d.ts +78 -0
  115. package/lib/region-editor/class-tree/class-tree.d.ts +31 -0
  116. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +36 -6
  117. package/lib/region-editor/region-editor.component.d.ts +159 -17
  118. package/lib/region-editor/region-metrics.d.ts +8 -0
  119. package/lib/region-editor/region-persistence.service.d.ts +17 -5
  120. package/lib/region-editor/region-table/region-table.component.d.ts +10 -4
  121. package/lib/region-import/label-classes.d.ts +39 -0
  122. package/lib/region-import/label-volume.d.ts +31 -0
  123. package/lib/region-import/region-import.d.ts +46 -0
  124. package/lib/region-overlay/region-geometry.d.ts +4 -3
  125. package/lib/region-overlay/region-source-layer.d.ts +96 -0
  126. package/lib/region-overlay/region-style.d.ts +52 -0
  127. package/lib/region-source/http-region-source.d.ts +45 -0
  128. package/lib/region-source/region-source-ops.d.ts +89 -0
  129. package/lib/region-source/region-source-worker.d.ts +7 -0
  130. package/lib/region-source/region-source.d.ts +82 -0
  131. package/lib/region-source/region-tiles.d.ts +289 -0
  132. package/lib/region-source/worker-region-source.d.ts +65 -0
  133. package/lib/routing-visualizer.service.d.ts +168 -1
  134. package/lib/section-pane/section-pane.component.d.ts +47 -0
  135. package/lib/store/class-color.util.d.ts +6 -3
  136. package/lib/store/class-signatures.d.ts +11 -0
  137. package/lib/store/region-scope-cache.d.ts +2 -0
  138. package/lib/store/region-source-scope.d.ts +74 -0
  139. package/lib/store/region-store.service.d.ts +216 -2
  140. package/lib/store/visualizer-store.service.d.ts +10 -0
  141. package/lib/toolbar/region-tools/region-tools.component.d.ts +3 -1
  142. package/lib/toolbar/stack-controls/stack-controls.component.d.ts +20 -9
  143. package/lib/toolbar/toolbar.component.d.ts +9 -2
  144. package/lib/visualizer/region-load.d.ts +23 -4
  145. package/lib/visualizer/volume-sections.d.ts +64 -0
  146. package/lib/visualizer.component.d.ts +40 -0
  147. package/package.json +2 -2
  148. package/src/lib/assets/slice.svg +23 -0
  149. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +0 -1
@@ -100,6 +100,18 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
100
100
  this.lifetime = new AbortController();
101
101
  /** What {@link plot} mounted, while it is mounted. */
102
102
  this.scene = null;
103
+ /** Region reconstructions to show in a volume view, kept across re-plots of their image. */
104
+ this.regionMeshes = [];
105
+ /** The keys of the reconstructions highlighted. */
106
+ this.regionHighlight = [];
107
+ /** The keys of the reconstructions hidden. */
108
+ this.regionHidden = [];
109
+ /** The planes of the sections beside a volume view, or none. */
110
+ this.slicePlanes = { x: null, y: null, z: null };
111
+ /** A section's plane dragged in the volume (see {@link getSlicePlaneMove$}). */
112
+ this.slicePlaneMove$ = new Subject();
113
+ /** Clicks on the reconstructions (see {@link getRegionMeshPick$}). */
114
+ this.regionMeshPick$ = new Subject();
103
115
  /** Viewer settings that outlive a scene. */
104
116
  this.settings = {
105
117
  resolutionScale: NAPARI_DEFAULT_DECIMATE,
@@ -123,6 +135,7 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
123
135
  this.stackLoadingProgress$ = new BehaviorSubject(0);
124
136
  this.autoscaleEvent$ = new Subject();
125
137
  this.viewportChange$ = new Subject();
138
+ this.regionsThroughVolume = false;
126
139
  this.viewOptions = {
127
140
  setNavigatorVisible: (visible) => this.setNavigatorVisible(visible),
128
141
  setImageSmoothingEnabled: (enabled) => this.setImageSmoothingEnabled(enabled),
@@ -193,6 +206,8 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
193
206
  fitCameraSoon: () => this.fitCameraSoon(),
194
207
  outsideZone: (fn) => this.zone.runOutsideAngular(fn),
195
208
  inZone: (fn) => this.inZone(fn),
209
+ regionMeshPicked: (key, additive) => this.regionMeshPick$.next({ key, additive }),
210
+ slicePlaneMoved: (axis, value) => this.slicePlaneMove$.next({ axis, value }),
196
211
  };
197
212
  }
198
213
  // ── IDataRenderer: load / render / viewport ───────────────────────────────
@@ -269,6 +284,14 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
269
284
  // No loaded image: an image-less spatial dataset opened before any image (the visualizer's
270
285
  // plotSpatialWithoutImage) — the observations alone.
271
286
  this.scene = this.createScene(plotType, this.sceneContext(viewer, host, canvas), info, imageLoaded == null);
287
+ // Another image's surfaces would land in this volume's frame at the wrong size: drop them.
288
+ if (info?.fileName !== this.regionMeshesImage)
289
+ this.regionMeshes = [];
290
+ this.scene.setRegionMeshes?.(this.regionMeshes);
291
+ this.scene.setRegionHighlight?.(this.regionHighlight);
292
+ this.scene.setRegionHidden?.(this.regionHidden);
293
+ this.scene.setRegionsThroughVolume?.(this.regionsThroughVolume);
294
+ this.scene.setSlicePlanes?.(this.slicePlanes);
272
295
  await this.scene.mount();
273
296
  this.tools.scheduleReadback();
274
297
  return true;
@@ -319,6 +342,52 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
319
342
  reloadAndPlot() {
320
343
  /* no-op */
321
344
  }
345
+ /** Show `message` on the canvas's loading badge until the returned function is called. */
346
+ beginTask(message) {
347
+ return this.badge.beginTask(message);
348
+ }
349
+ /** Show these region reconstructions of `image` in the volume view (kept for its next volume plot). */
350
+ setRegionMeshes(meshes, image) {
351
+ this.regionMeshes = meshes;
352
+ this.regionMeshesImage = image;
353
+ this.scene?.setRegionMeshes?.(meshes);
354
+ }
355
+ /** Highlight the reconstructions of these keys (none: all as usual). */
356
+ setRegionHighlight(keys) {
357
+ this.regionHighlight = keys;
358
+ this.scene?.setRegionHighlight?.(keys);
359
+ }
360
+ /** Hide the reconstructions of these keys (kept for the next volume plot). */
361
+ setRegionHidden(keys) {
362
+ this.regionHidden = keys;
363
+ this.scene?.setRegionHidden?.(keys);
364
+ }
365
+ /** Draw the reconstructions through the volume rather than hidden behind it (kept across plots). */
366
+ setRegionsThroughVolume(through) {
367
+ this.regionsThroughVolume = through;
368
+ this.scene?.setRegionsThroughVolume?.(through);
369
+ }
370
+ /** Show the planes of the sections beside a volume view (null: hide one); kept across plots. */
371
+ setSlicePlanes(planes) {
372
+ this.slicePlanes = planes;
373
+ this.scene?.setSlicePlanes?.(planes);
374
+ }
375
+ /** A section's plane dragged in the volume view, to `value` along its axis (image px, or a slice). */
376
+ getSlicePlaneMove$() {
377
+ return this.slicePlaneMove$.asObservable();
378
+ }
379
+ /** The volume on screen, as assembled (see VolumeScene.volumeVoxels); null outside a volume view. */
380
+ volumeVoxels() {
381
+ return this.scene?.volumeVoxels?.() ?? null;
382
+ }
383
+ /** A reconstruction clicked with the selection tool (its key), or the volume beside them (null). */
384
+ getRegionMeshPick$() {
385
+ return this.regionMeshPick$.asObservable();
386
+ }
387
+ /** Image px per voxel of the volume on screen, in-plane; null outside a volume view. */
388
+ regionVoxelStep() {
389
+ return this.scene?.voxelStep?.() ?? null;
390
+ }
322
391
  /**
323
392
  * End the mounted scene: abort its lifetime (its descriptor poll, tile counts, frame loading and
324
393
  * awaits) and dispose it — its layers, keys, subscriptions and listeners go with it, so the next
@@ -340,7 +409,18 @@ export class NapariVisualizerService extends BaseStoreVisualizer {
340
409
  this.host.removeChild(this.canvas);
341
410
  this.canvas = null;
342
411
  }
412
+ /**
413
+ * The plot area changed size (the slice editor split it, a divider moved): fit the canvas, whose
414
+ * height was fixed at plot time, to it again.
415
+ */
343
416
  relayout(_trueImageSize) {
417
+ const { canvas, host } = this;
418
+ if (canvas && host) {
419
+ // Let the host take its height from the layout, not from the canvas inside it.
420
+ canvas.style.height = '0px';
421
+ const height = host.clientHeight;
422
+ canvas.style.height = height > 0 ? `${height}px` : '100%';
423
+ }
344
424
  this.viewer?.requestRender();
345
425
  }
346
426
  /** @deprecated Plotly-specific axis reset. */
@@ -586,4 +666,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
586
666
  type: Inject,
587
667
  args: [SPATIAL_DATA_PORT]
588
668
  }] }, { type: i8.SpatialSelectionStore }] });
589
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXZpc3VhbGl6ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9uYXBhcmktdmlzdWFsaXplci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdFLE9BQU8sRUFBYyxlQUFlLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVoRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFPbkMsT0FBTyxFQUFFLGlCQUFpQixFQUFtQixNQUFNLHlDQUF5QyxDQUFDO0FBQzdGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBa0IsTUFBTSx3Q0FBd0MsQ0FBQztBQUMxRixPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sNEJBQTRCLENBQUM7QUFDbkUsT0FBTyxFQUFrQixjQUFjLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUN6RixPQUFPLEVBQXNCLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUMxRyxPQUFPLEVBQ0wsUUFBUSxFQUVSLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDdkIsVUFBVSxFQUNWLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixjQUFjLEVBQ2QsZ0JBQWdCLEdBQ2pCLE1BQU0sMkJBQTJCLENBQUM7QUFXbkMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUcvRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1B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LFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQTBFN0IsTUFBTTsyQkFBQyxnQkFBZ0I7OzBCQU92QixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGNBQWM7OzBCQUVqQyxNQUFNOzJCQUFDLFVBQVU7OzBCQUdqQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgTmdab25lLCBPcHRpb25hbCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJ2ltYWdlLWpzJztcbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gJ2ZpbGUtc2F2ZXInO1xuaW1wb3J0IHsgVmlld2VyIH0gZnJvbSAnbmFwYXJpLWpzJztcblxuaW1wb3J0IHsgSUltYWdlSW5mbyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9pbWFnZS5jb250cmFjdCc7XG5pbXBvcnQgeyBJSGlzdG9ncmFtIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBDYW52YXNUb29sSWQgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBJUmVnaW9uT3ZlcmxheSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9yZWdpb24tb3ZlcmxheS5jb250cmFjdCc7XG5pbXBvcnQgeyBTcGF0aWFsT2JzZXJ2YXRpb25zIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgeyBTUEFUSUFMX0RBVEFfUE9SVCwgU3BhdGlhbERhdGFQb3J0IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3BvcnRzL3NwYXRpYWwtZGF0YS5wb3J0JztcbmltcG9ydCB7IFRJTEVfQUNDRVNTX1BPUlQsIFRpbGVBY2Nlc3NQb3J0IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3BvcnRzL3RpbGUtYWNjZXNzLnBvcnQnO1xuaW1wb3J0IHsgVklaX0NPTkZJRywgVml6Q29uZmlnIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Zpei1jb25maWcnO1xuaW1wb3J0IHsgSUNlbGxTZWdtZW50ZXIsIENFTExfU0VHTUVOVEVSIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NlbGwtc2VnbWVudGVyLmNvbnRyYWN0JztcbmltcG9ydCB7IFZpZXdlckNhcGFiaWxpdGllcywgVmlld2VyRmVhdHVyZSwgY2FwYWJpbGl0aWVzT2YgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2FwYWJpbGl0aWVzLmNvbnRyYWN0JztcbmltcG9ydCB7XG4gIFBsb3RUeXBlLFxuICBQbG90VHlwZURlc2NyaXB0b3IsXG4gIFBMT1RfVFlQRV9ERVNDUklQVE9SUyxcbiAgTkFQQVJJX0RFRkFVTFRfREVDSU1BVEUsXG4gIGlzTmFwYXJpM2QsXG4gIGlzTmFwYXJpSXNvc3VyZmFjZSxcbiAgaXNOYXBhcmlTY2F0dGVyLFxuICBpc05hcGFyaVNjYXR0ZXIzZCxcbiAgaXNOYXBhcmlTdXJmYWNlLFxuICBpc1NwYXRpYWxPbWljcyxcbiAgaXNTcGF0aWFsT21pY3MzZCxcbn0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Bsb3QtdHlwZSc7XG5pbXBvcnQge1xuICBJVmlld2VyQmFja2VuZCxcbiAgUGl4ZWxEYXRhLFxuICBJSXNvc3VyZmFjZUNvbnRyb2xzLFxuICBJSW50ZW5zaXR5Q29udHJvbHMsXG4gIElTdXJmYWNlM2RDb250cm9scyxcbiAgSU9zZFZpZXdPcHRpb25zLFxuICBJVm9sdW1lUmVzb2x1dGlvbixcbiAgSUludGVuc2l0eVZpZXdwb3J0U291cmNlLFxufSBmcm9tICcuLi8uLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgeyBWaXN1YWxpemVyU3RvcmUgfSBmcm9tICcuLi8uLi9zdG9yZS92aXN1YWxpemVyLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVnaW9uU3RvcmUgfSBmcm9tICcuLi8uLi9zdG9yZS9yZWdpb24tc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBTcGF0aWFsU2VsZWN0aW9uU3RvcmUgfSBmcm9tICcuLi8uLi9zdG9yZS9zcGF0aWFsLXNlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IENhbnZhc1Rvb2xNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vdG9vbGJhci90b29sLWtpdC9jYW52YXMtdG9vbC1tYW5hZ2VyJztcbmltcG9ydCB7IFdhbmRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci93YW5kL3dhbmQuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Ub29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2FtUG9pbnRUb29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS1wb2ludC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2VsbFNlZ21lbnRUb29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL2NlbGwtc2VnbWVudC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgQmFzZVN0b3JlVmlzdWFsaXplciB9IGZyb20gJy4uL2Jhc2Utc3RvcmUtdmlzdWFsaXplcic7XG5pbXBvcnQgeyB0aHJvd0lmQWJvcnRlZCB9IGZyb20gJy4uL3RpbGUtc2VydmVyJztcbmltcG9ydCB7IFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSB9IGZyb20gJy4uL3NpbXBsZS1zbGljZS1hY2Nlc3Muc2VydmljZSc7XG5pbXBvcnQgeyBaT09NX0JVVFRPTl9TVEVQIH0gZnJvbSAnLi4vb3NkL29zZC16b29tJztcbmltcG9ydCB7IE5BUEFSSV9XSEVFTF9aT09NX1NQRUVEIH0gZnJvbSAnLi9uYXBhcmktem9vbSc7XG5pbXBvcnQgeyBUcmFuc2NyaXB0RXN0aW1hdGUgfSBmcm9tICcuL25hcGFyaS1zcGF0aWFsLXRpbGVzJztcbmltcG9ydCB7IE5hcGFyaVRpbGVDbGllbnQgfSBmcm9tICcuL25hcGFyaS10aWxlLWNsaWVudCc7XG5pbXBvcnQgeyBOYXBhcmlEaXNwbGF5U3RhdGUgfSBmcm9tICcuL25hcGFyaS1kaXNwbGF5LXN0YXRlJztcbmltcG9ydCB7IExvYWRpbmdCYWRnZVN0YXRlIH0gZnJvbSAnLi9uYXBhcmktbG9hZGluZy1zdGF0ZSc7XG5pbXBvcnQgeyBOYXBhcmlUb29sQnJpZGdlIH0gZnJvbSAnLi9uYXBhcmktdG9vbC1icmlkZ2UnO1xuaW1wb3J0IHsgY2FtZXJhRHJhZ01vZGUgfSBmcm9tICcuL25hcGFyaS1heGVzLWdpem1vJztcbmltcG9ydCB7IE5hcGFyaVNjZW5lLCBOYXBhcmlTZXR0aW5ncywgU2NlbmVDb250ZXh0IH0gZnJvbSAnLi9uYXBhcmktc2NlbmUnO1xuaW1wb3J0IHsgSW1hZ2UyZFNjZW5lLCBTY2F0dGVyUmVnaW9uc1NjZW5lIH0gZnJvbSAnLi9uYXBhcmktaW1hZ2UtMmQtc2NlbmUnO1xuaW1wb3J0IHsgU2NhdHRlcjNkU2NlbmUsIFZvbHVtZVNjZW5lIH0gZnJvbSAnLi9uYXBhcmktdm9sdW1lLXNjZW5lJztcbmltcG9ydCB7IFN1cmZhY2VTY2VuZSB9IGZyb20gJy4vbmFwYXJpLXN1cmZhY2Utc2NlbmUnO1xuaW1wb3J0IHsgU3BhdGlhbFNlc3Npb24gfSBmcm9tICcuL25hcGFyaS1zcGF0aWFsLXNjZW5lJztcbmltcG9ydCB7IFNwYXRpYWwyZFNjZW5lIH0gZnJvbSAnLi9uYXBhcmktc3BhdGlhbC0yZC1zY2VuZSc7XG5pbXBvcnQgeyBTcGF0aWFsM2RTY2VuZSB9IGZyb20gJy4vbmFwYXJpLXNwYXRpYWwtM2Qtc2NlbmUnO1xuXG4vKiogT3BhcXVlIGhhbmRsZSBmcm9tIHtAbGluayBOYXBhcmlWaXN1YWxpemVyU2VydmljZS5sb2FkfSwgcGFzc2VkIGJhY2sgdG8gcGxvdCgpLiAqL1xuaW50ZXJmYWNlIE5hcGFyaUxvYWRlZCB7XG4gIGltYWdlSW5mbzogSUltYWdlSW5mbztcbiAgejogbnVtYmVyO1xuICAvKiogTXVzdCBtYXRjaCBgSUltYWdlSW5mby5maWxlTmFtZWAg4oCUIHRoZSByZW5kZXIgb3JjaGVzdHJhdG9yIGRyb3BzIHRoZSByZXN1bHQgaWYgdGhlXG4gICAqICBoYW5kbGUncyBgZmlsZW5hbWVgIGRvZXNuJ3QgbWF0Y2ggdGhlIHJlcXVlc3RlZCBpbWFnZSAoZ3VhcmRzIGFnYWluc3Qgc3RhbGUgY2xpY2tzKS4gKi9cbiAgZmlsZW5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgV2ViR1BVIGltYWdlIGJhY2tlbmQsIGJ1aWx0IG9uIHRoZSBwdWJsaXNoZWQgYG5hcGFyaS1qc2AgbGlicmFyeSAoaml0LXVpIzEwMjogYVxuICogYnJvd3Nlci1iYXNlZCBuYXBhcmkgc2hpcHBlZCBhcyBhIEpTIGxpYnJhcnksIGFsb25nc2lkZSBPcGVuU2VhZHJhZ29uIGZvciBpbWFnZXMgYW5kIFBsb3RseVxuICogZm9yIDNEKS5cbiAqXG4gKiBPbmUgc2NlbmUgaXMgbW91bnRlZCBwZXIge0BsaW5rIHBsb3R9LCBjaG9zZW4gYnkgcGxvdCB0eXBlOlxuICogIC0gKioyRCBpbWFnZSoqIChhbmQgdGhlIHJlZ2lvbi1jZW50cm9pZCBzY2F0dGVyIGFuZCBzcGF0aWFsLW9taWNzIHZpZXdzIG92ZXIgaXQpOiBweXJhbWlkYWxcbiAqICAgIGBUaWxlZFNvdXJjZWBzIGFnYWluc3QgdGhlIGppdC1zZXJ2aWNlIGAvdGlsZWAgZW5kcG9pbnQgd2hlbiBgL3RpbGVzL2luZm9gIGRlc2NyaWJlcyB0aGVcbiAqICAgIGltYWdlLCBlbHNlIGEgc2luZ2xlIHN0aXRjaGVkIGxldmVsIChgdGlsZWQ6ZmFsc2VgIHN0YWNrcyBmZXRjaCBlYWNoIHNsaWNlJ3Mgb3duIFVSTCk7XG4gKiAgICBtdWx0aWNoYW5uZWwgYWRkaXRpdmUgdGludHMsIGdyYXlzY2FsZSBjb2xvcm1hcCBvciBSR0I7IHNjYWxlIGJhciwgbmF2aWdhdG9yLCByZWdpb25cbiAqICAgIG92ZXJsYXkgYW5kIHRoZSBzaGFyZWQgcGl4ZWwgdG9vbHMgKHdhbmQsIGJydXNoLCBlcmFzZXIsIHpvb20tdG8tYm94LCBTQU0vY2VsbHBvc2UpLlxuICogIC0gKipWb2x1bWUgLyBpc29zdXJmYWNlIC8gM0Qgc2NhdHRlciAvIHN1cmZhY2UqKjogc2xpY2VzIGFzc2VtYmxlZCBpbnRvIGEgZGVjaW1hdGVkIHZvbHVtZVxuICogICAgKG9yIG9uZSBoZWlnaHQgZmllbGQgcGVyIHNsaWNlKSwgd2l0aCB0aGUgYXhlcyBnaXptbyBhbmQgdGhlIFotaGVpZ2h0IGhhbmRsZS5cbiAqICAtICoqU3BhdGlhbCBvbWljcyAyRCAvIDNEKio6IG9ic2VydmF0aW9uIG1hcmtlcnMgb3IgYSAzRCBjbG91ZCwgZ2VuZSBtYXBzLCBkZW5zaXR5IHZvbHVtZXMsXG4gKiAgICBsZXZlbC1vZi1kZXRhaWwgdGlsZXMsIGhvdmVyIHRvb2x0aXAgYW5kIGNsaWNrLXRvLXNlbGVjdC5cbiAqXG4gKiBQZXItY2hhbm5lbCBoaXN0b2dyYW1zIGNvbWUgZnJvbSB0aGUgY2xpZW50IGRhdGEsIG9yIGZyb20gdGhlIHNlcnZlcidzIGAvaGlzdG9ncmFtYCBmb3JcbiAqID44LWJpdCBpbWFnZXM7IFRJRkYgZXhwb3J0IGZyb20gYC9leHBvcnQvdGlmZmAuIFJlZ2lvbiBzdGF0ZSBhbmQgZGlzcGxheSBvcHRpb25zIGRlbGVnYXRlIHRvXG4gKiB0aGUgc2hhcmVkIHtAbGluayBSZWdpb25TdG9yZX0gLyB7QGxpbmsgVmlzdWFsaXplclN0b3JlfSB0aHJvdWdoIHtAbGluayBCYXNlU3RvcmVWaXN1YWxpemVyfSxcbiAqIGV4YWN0bHkgYXMgT1NEIGRvZXMuIG5hcGFyaS1qcydzIHJlbmRlciBsb29wIGFuZCB0aGUgaG90IHBvaW50ZXIgcGF0aHMgcnVuIG91dHNpZGUgdGhlXG4gKiBBbmd1bGFyIHpvbmUuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgTmFwYXJpVmlzdWFsaXplclNlcnZpY2UgZXh0ZW5kcyBCYXNlU3RvcmVWaXN1YWxpemVyIGltcGxlbWVudHMgSVZpZXdlckJhY2tlbmQge1xuICByZWFkb25seSBjYXBhYmlsaXRpZXM6IFZpZXdlckNhcGFiaWxpdGllcyA9IGNhcGFiaWxpdGllc09mKFtcbiAgICBWaWV3ZXJGZWF0dXJlLkltYWdlRGlzcGxheSxcbiAgICBWaWV3ZXJGZWF0dXJlLlN0YWNrU2xpZGVyLFxuICAgIFZpZXdlckZlYXR1cmUuUGl4ZWxSZWFkYmFjayxcbiAgICBWaWV3ZXJGZWF0dXJlLlN1cmZhY2UzRCxcbiAgICBWaWV3ZXJGZWF0dXJlLklzb3N1cmZhY2UsXG4gIF0pO1xuXG4gIC8qKiBUaGUgaml0LXNlcnZpY2UgdGlsZSBzZXJ2ZXI6IGRlc2NyaXB0b3IsIHNsaWNlcywgdGlsZWQgc291cmNlcywgaGlzdG9ncmFtcywgZXhwb3J0LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHRpbGVDbGllbnQ6IE5hcGFyaVRpbGVDbGllbnQ7XG4gIC8qKiBuYXBhcmktanMncyByZW5kZXIgbG9vcCBhbmQgdGhlIGhvdCBwb2ludGVyL3RpbWVyIHBhdGhzIHJ1biBvdXRzaWRlIHRoZSBBbmd1bGFyIHpvbmVcbiAgICogIChOQVBBUkktU1ZDLTI1KTsgd2hhdCB0aGV5IHByb2R1Y2UgZm9yIHRoZSBVSSByZS1lbnRlcnMgaXQgdGhyb3VnaCB7QGxpbmsgaW5ab25lfS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSB6b25lID0gaW5qZWN0KE5nWm9uZSk7XG5cbiAgcHJpdmF0ZSB2aWV3ZXI6IFZpZXdlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBob3N0OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxvYWRlZDogTmFwYXJpTG9hZGVkIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBGb3IgdGhlIHBhbmVsOiB0aGUgdHJhbnNjcmlwdHMtaW4tdmlldyBlc3RpbWF0ZSBhbmQgdGhlIGRlbnNpdHkgd2luZG93IGluIHVzZS4gKi9cbiAgcmVhZG9ubHkgdHJhbnNjcmlwdEVzdGltYXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VHJhbnNjcmlwdEVzdGltYXRlIHwgbnVsbD4obnVsbCk7XG4gIC8qKiBUcmFuc2NyaXB0cyBvZiBlYWNoIHNlbGVjdGVkIGdlbmUgaW4gdmlldyAoc2VlIE5hcGFyaVNwYXRpYWxUaWxlTGF5ZXJzLmdlbmVDb3VudHNJbikuICovXG4gIHJlYWRvbmx5IGdlbmVDb3VudHNJblZpZXckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+IHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGRlbnNpdHlTdGF0cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHsgbG86IG51bWJlcjsgaGk6IG51bWJlcjsgbWF4OiBudW1iZXIgfSB8IG51bGw+KG51bGwpO1xuICAvKiogXCJ4IHJlbG9hZGluZ+KAplwiIGF0IHRoZSBib3R0b20gb2YgdGhlIGNhbnZhczogdGhlIHRpbGUgbGF5ZXJzJyBsb2FkcyBhbmQgdGhlIG9ic2VydmF0aW9ucycuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgYmFkZ2UgPSBuZXcgTG9hZGluZ0JhZGdlU3RhdGUoKTtcbiAgLyoqIFRoZSBzdG9yZSdzIGRpc3BsYXkgc3RhdGUgKGNvbG9ybWFwLCByZXZlcnNlLCBpbnZlcnQpIGFuZCB0aGUgY29sb3JtYXBzIGRlcml2ZWQgZnJvbSBpdC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBkaXNwbGF5OiBOYXBhcmlEaXNwbGF5U3RhdGU7XG4gIC8qKlxuICAgKiBUaGUgbW91bnRlZCBzY2VuZSdzIGxpZmV0aW1lOiBhYm9ydGVkIGJ5IHtAbGluayByZXNldH0sIHNvIGV2ZXJ5dGhpbmcgYSBwbG90IHN0YXJ0cyDigJQgaXRzXG4gICAqIGRlc2NyaXB0b3IgcG9sbCwgaXRzIHRpbGUgZmV0Y2hlcywgaXRzIGJhZGdlIGNvdW50cywgaXRzIGF3YWl0cyDigJQgY2FuIHRlbGwgdGhhdCBhIG5ld2VyIHBsb3RcbiAgICogaGFzIHJlcGxhY2VkIGl0LiBBIHRpbGUgdGhhdCBzZXR0bGVzIGFmdGVyIGEgcmVzZXQgYmVsb25ncyB0byB0aGUgYWJvcnRlZCBzY2VuZSBhbmQgbGVhdmVzIHRoZVxuICAgKiBuZXcgc2NlbmUncyBjb3VudCBhbG9uZS5cbiAgICovXG4gIHByaXZhdGUgbGlmZXRpbWUgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIC8qKiBXaGF0IHtAbGluayBwbG90fSBtb3VudGVkLCB3aGlsZSBpdCBpcyBtb3VudGVkLiAqL1xuICBwcml2YXRlIHNjZW5lOiBOYXBhcmlTY2VuZSB8IG51bGwgPSBudWxsO1xuICAvKiogU3BhdGlhbCBzdGF0ZSB0aGF0IG91dGxpdmVzIGEgc2NlbmUgKGxhdGVzdCBkYXRhLCB3aW5kb3dzLCBlc3RpbWF0ZWQgZ2VuZS1tYXAgZmllbGRzKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzcGF0aWFsOiBTcGF0aWFsU2Vzc2lvbjtcbiAgLyoqIFZpZXdlciBzZXR0aW5ncyB0aGF0IG91dGxpdmUgYSBzY2VuZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nczogTmFwYXJpU2V0dGluZ3MgPSB7XG4gICAgcmVzb2x1dGlvblNjYWxlOiBOQVBBUklfREVGQVVMVF9ERUNJTUFURSxcbiAgICBuYXZpZ2F0b3JWaXNpYmxlOiB0cnVlLFxuICAgIGltYWdlU21vb3RoaW5nOiBmYWxzZSxcbiAgICBheGVzVmlzaWJsZTogdHJ1ZSxcbiAgICBzdXJmYWNlV2lyZWZyYW1lOiBmYWxzZSxcbiAgICB2b2x1bWVaU2NhbGU6IDEsXG4gIH07XG4gIC8qKlxuICAgKiBGcmFtZSBsb2FkaW5nICh2b2x1bWUgYXNzZW1ibHksIHN1cmZhY2UgcHJlbG9hZCk6IGFib3J0ZWQgYnkge0BsaW5rIHJlc2V0fSBBTkQgYnlcbiAgICoge0BsaW5rIGNhbmNlbExvYWRpbmd9LCBzbyBhIENhbmNlbCBhY3R1YWxseSBzdG9wcyBmZXRjaGluZyBmcmFtZXMgaW5zdGVhZCBvZiBydW5uaW5nIHRvXG4gICAqIGNvbXBsZXRpb24gaW4gdGhlIGJhY2tncm91bmQsIHdoaWxlIHRoZSBzY2VuZSBpdHNlbGYgc3RheXMgbW91bnRlZC4gKExhdGVzdC13aW5zIFdJVEhJTiBhXG4gICAqIHNjZW5lIOKAlCBhIHNjcnViLCBhIGNvbG91ciByZWJ1aWxkLCBhIGhvdmVyLXNvdXJjZSBmZXRjaCDigJQgaXMgZWFjaCBzY2VuZSdzIG93biBidXNpbmVzcy4pXG4gICAqL1xuICBwcml2YXRlIGxvYWRpbmcgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIC8qKiBUaGUgaW1hZ2UncyBmdWxsLXJlc29sdXRpb24gc2l6ZSBhcyB0aGUgbGFzdCBzY2VuZSBkcmV3IGl0IChpdCBvdXRsaXZlcyB0aGUgc2NlbmUpLiAqL1xuICBwcml2YXRlIGltYWdlVyA9IDA7XG4gIHByaXZhdGUgaW1hZ2VIID0gMDtcbiAgLyoqIFRoZSByZWdpb24gb3ZlcmxheSwgdGhlIHBpeGVsIHRvb2xzIGFuZCB0aGUgZGlzcGxheWVkLXBpeGVsIHJlYWRiYWNrIHRoZXkgcmVhZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSB0b29sczogTmFwYXJpVG9vbEJyaWRnZTtcbiAgLyoqIFRoaXMgYmFja2VuZCdzIG93biB3YW5kLCBicnVzaCwgZXJhc2VyLCB6b29tLXRvLWJveCBhbmQgU0FNIHBvaW50IHRvb2xzLiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2FudmFzVG9vbHM6IENhbnZhc1Rvb2xNYW5hZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrTG9hZGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFja0xvYWRpbmdQcm9ncmVzcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0b3NjYWxlRXZlbnQkID0gbmV3IFN1YmplY3Q8dW5rbm93bj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3cG9ydENoYW5nZSQgPSBuZXcgU3ViamVjdDx7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xuICB9PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoVElMRV9BQ0NFU1NfUE9SVCkgdGlsZXM6IFRpbGVBY2Nlc3NQb3J0LFxuICAgIHN0b3JlOiBWaXN1YWxpemVyU3RvcmUsXG4gICAgcmVnaW9uU3RvcmU6IFJlZ2lvblN0b3JlLFxuICAgIHdhbmRTZXJ2aWNlOiBXYW5kU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNhbVRvb2w6IFNhbVRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2FtUG9pbnRUb29sOiBTYW1Qb2ludFRvb2xTZXJ2aWNlLFxuICAgIGNlbGxTZWdtZW50VG9vbDogQ2VsbFNlZ21lbnRUb29sU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KENFTExfU0VHTUVOVEVSKSBjZWxsU2VnbWVudGVyOiBJQ2VsbFNlZ21lbnRlciB8IG51bGwsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzaW1wbGVTdGFjazogU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlLFxuICAgIEBJbmplY3QoVklaX0NPTkZJRykgY29uZmlnOiBWaXpDb25maWcsXG4gICAgLy8gT3B0aW9uYWw6IG9ubHkgYSBob3N0IHRoYXQgc2VydmVzIHNwYXRpYWwtb21pY3MgZGF0YSBwcm92aWRlcyBpdCwgYW5kXG4gICAgLy8gd2l0aG91dCBpdCB0aGUgU1BBVElBTF9PTUlDUyBwbG90IHR5cGUgaXMgbmV2ZXIgb2ZmZXJlZCBhbnl3YXkuXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChTUEFUSUFMX0RBVEFfUE9SVCkgc3BhdGlhbERhdGE6IFNwYXRpYWxEYXRhUG9ydCB8IG51bGwgPSBudWxsLFxuICAgIHNlbGVjdGlvblN0b3JlOiBTcGF0aWFsU2VsZWN0aW9uU3RvcmUgfCBudWxsID0gbnVsbCxcbiAgKSB7XG4gICAgc3VwZXIocmVnaW9uU3RvcmUsIHN0b3JlKTtcbiAgICB0aGlzLnRpbGVDbGllbnQgPSBuZXcgTmFwYXJpVGlsZUNsaWVudCh0aWxlcywgc2ltcGxlU3RhY2ssIGNvbmZpZy5zbGlkZUNyb3BTZXJ2ZXIpO1xuICAgIHRoaXMudGlsZUNsaWVudC5zdGFydFNjZW5lKHRoaXMubGlmZXRpbWUuc2lnbmFsKTtcbiAgICB0aGlzLmRpc3BsYXkgPSBuZXcgTmFwYXJpRGlzcGxheVN0YXRlKHN0b3JlKTtcbiAgICB0aGlzLnNwYXRpYWwgPSBuZXcgU3BhdGlhbFNlc3Npb24oc3BhdGlhbERhdGEsIHNlbGVjdGlvblN0b3JlLCB7XG4gICAgICBjb250aW51b3VzTHV0OiAodmlldykgPT4gdGhpcy5kaXNwbGF5LnNwYXRpYWxMdXQodmlldyksXG4gICAgICAvLyBUaGVzZSBmb2xsb3cgdGhlIGNhbWVyYSwgd2hpY2ggbW92ZXMgb3V0c2lkZSB0aGUgem9uZTsgdGhlIHBhbmVsIHJlYWRzIHRoZW0uXG4gICAgICBlc3RpbWF0ZUNoYW5nZWQ6IChlKSA9PiB0aGlzLmluWm9uZSgoKSA9PiB0aGlzLnRyYW5zY3JpcHRFc3RpbWF0ZSQubmV4dChlKSksXG4gICAgICBnZW5lQ291bnRzQ2hhbmdlZDogKGMpID0+IHRoaXMuaW5ab25lKCgpID0+IHRoaXMuZ2VuZUNvdW50c0luVmlldyQubmV4dChjKSksXG4gICAgICBkZW5zaXR5Q2hhbmdlZDogKGQpID0+IHRoaXMuaW5ab25lKCgpID0+IHRoaXMuZGVuc2l0eVN0YXRzJC5uZXh0KGQpKSxcbiAgICAgIGxvYWRpbmdDaGFuZ2VkOiAobGF5ZXJzKSA9PiB0aGlzLmJhZGdlLnNldFRpbGVMYXllcnMobGF5ZXJzKSxcbiAgICB9KTtcbiAgICB0aGlzLnRvb2xzID0gbmV3IE5hcGFyaVRvb2xCcmlkZ2UoXG4gICAgICB7XG4gICAgICAgIHZpZXdlcjogKCkgPT4gdGhpcy52aWV3ZXIsXG4gICAgICAgIGhvc3Q6ICgpID0+IHRoaXMuaG9zdCxcbiAgICAgICAgY2FudmFzOiAoKSA9PiB0aGlzLmNhbnZhcyxcbiAgICAgICAgaW1hZ2VTaXplOiAoKSA9PiB0aGlzLmdldFRydWVJbWFnZVNpemUoKSxcbiAgICAgICAgZnJhbWVJbmRleDogKCkgPT4gdGhpcy5sb2FkZWQ/LnogPz8gMCxcbiAgICAgICAgZmlsZU5hbWU6ICgpID0+IHRoaXMubG9hZGVkPy5maWxlbmFtZSxcbiAgICAgICAgLy8gUmVhY2hlZCBmcm9tIHRpbWVycyBhcm1lZCBvdXRzaWRlIHRoZSB6b25lOyBzdWJzY3JpYmVycyBhcmUgVUkuXG4gICAgICAgIHZpZXdwb3J0Q2hhbmdlZDogKHJlY3QpID0+IHRoaXMuaW5ab25lKCgpID0+IHRoaXMudmlld3BvcnRDaGFuZ2UkLm5leHQocmVjdCkpLFxuICAgICAgICBvdXRzaWRlWm9uZTogKGZuKSA9PiB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoZm4pLFxuICAgICAgICBpblpvbmU6IChmbikgPT4gdGhpcy5pblpvbmUoZm4pLFxuICAgICAgfSxcbiAgICAgIHsgcmVnaW9uU3RvcmUsIHdhbmRTZXJ2aWNlLCBzYW1Ub29sLCBzYW1Qb2ludFRvb2wsIGNlbGxTZWdtZW50VG9vbCwgY2VsbFNlZ21lbnRlciB9LFxuICAgICk7XG4gICAgdGhpcy5jYW52YXNUb29scyA9IHRoaXMudG9vbHMuY2FudmFzVG9vbHM7XG4gIH1cblxuICAvKiogUnVuIGBmbmAgaW5zaWRlIHRoZSBBbmd1bGFyIHpvbmU6IGZvciBvdXRwdXQgKHN1YmplY3RzIHRoZSBVSSByZW5kZXJzLCBzdG9yZSB3cml0ZXMpXG4gICAqICBwcm9kdWNlZCBieSB3b3JrIHRoYXQgcnVucyBvdXRzaWRlIGl0LiAqL1xuICBwcml2YXRlIGluWm9uZTxUPihmbjogKCkgPT4gVCk6IFQge1xuICAgIHJldHVybiBOZ1pvbmUuaXNJbkFuZ3VsYXJab25lKCkgPyBmbigpIDogdGhpcy56b25lLnJ1bihmbik7XG4gIH1cblxuICAvKiogV2hhdCBhIHNjZW5lIGlzIGJ1aWx0IGZyb20gKHNlZSB7QGxpbmsgU2NlbmVDb250ZXh0fSkuICovXG4gIHByaXZhdGUgc2NlbmVDb250ZXh0KHZpZXdlcjogVmlld2VyLCBob3N0OiBIVE1MRWxlbWVudCwgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCk6IFNjZW5lQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZpZXdlcixcbiAgICAgIGhvc3QsXG4gICAgICBjYW52YXMsXG4gICAgICBzaWduYWw6IHRoaXMubGlmZXRpbWUuc2lnbmFsLFxuICAgICAgbG9hZGluZzogKCkgPT4gdGhpcy5sb2FkaW5nLnNpZ25hbCxcbiAgICAgIGluZm86ICgpID0+IHRoaXMubG9hZGVkPy5pbWFnZUluZm8sXG4gICAgICB6OiAoKSA9PiB0aGlzLmxvYWRlZD8ueiA/PyAwLFxuICAgICAgdGlsZXM6IHRoaXMudGlsZUNsaWVudCxcbiAgICAgIGRpc3BsYXk6IHRoaXMuZGlzcGxheSxcbiAgICAgIGJhZGdlOiB0aGlzLmJhZGdlLFxuICAgICAgdG9vbHM6IHRoaXMudG9vbHMsXG4gICAgICBzdG9yZTogdGhpcy5zdG9yZSxcbiAgICAgIHJlZ2lvblN0b3JlOiB0aGlzLnJlZ2lvblN0b3JlLFxuICAgICAgc2V0dGluZ3M6IHRoaXMuc2V0dGluZ3MsXG4gICAgICBzdGFjazoge1xuICAgICAgICBsb2FkaW5nOiAob24pID0+IHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KG9uKSxcbiAgICAgICAgcHJvZ3Jlc3M6IChwZXJjZW50KSA9PiB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KHBlcmNlbnQpLFxuICAgICAgfSxcbiAgICAgIGltYWdlU2l6ZTogKCkgPT4gKHsgd2lkdGg6IHRoaXMuaW1hZ2VXLCBoZWlnaHQ6IHRoaXMuaW1hZ2VIIH0pLFxuICAgICAgc2V0SW1hZ2VTaXplOiAod2lkdGgsIGhlaWdodCkgPT4ge1xuICAgICAgICB0aGlzLmltYWdlVyA9IHdpZHRoO1xuICAgICAgICB0aGlzLmltYWdlSCA9IGhlaWdodDtcbiAgICAgIH0sXG4gICAgICBmaXRDYW1lcmFTb29uOiAoKSA9PiB0aGlzLmZpdENhbWVyYVNvb24oKSxcbiAgICAgIG91dHNpZGVab25lOiAoZm4pID0+IHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcihmbiksXG4gICAgICBpblpvbmU6IChmbikgPT4gdGhpcy5pblpvbmUoZm4pLFxuICAgIH07XG4gIH1cblxuICAvLyDilIDilIAgSURhdGFSZW5kZXJlcjogbG9hZCAvIHJlbmRlciAvIHZpZXdwb3J0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvKipcbiAgICogUmVjb3JkIHRoZSBpbWFnZSB0byBkcmF3LiBObyBuZXR3b3JrIHdvcmsgaGFwcGVucyBoZXJlIOKAlCB0aGUgZGVzY3JpcHRvciBwb2xsIGFuZCB0aGUgdGlsZSxcbiAgICogdm9sdW1lIGFuZCBzcGF0aWFsIGZldGNoZXMgYWxsIHJ1biBpbiB7QGxpbmsgcGxvdH0gdW5kZXIgaXRzIHNjZW5lIHNpZ25hbCwgd2hpY2ggYSBuZXdlciBwbG90LFxuICAgKiB7QGxpbmsgcmVzZXR9IG9yIGBjYW5jZWxMb2FkaW5nKClgIGFib3J0cyDigJQgc28gYHNpZ25hbGAgaXMgb25seSBjaGVja2VkOiBhbiBhbHJlYWR5LWFib3J0ZWRcbiAgICogbG9hZCByZWplY3RzIHdpdGggYW4gYEFib3J0RXJyb3JgIGFuZCBsZWF2ZXMgdGhlIHJlY29yZGVkIGltYWdlIGFsb25lLlxuICAgKi9cbiAgYXN5bmMgbG9hZChpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8TmFwYXJpTG9hZGVkPiB7XG4gICAgdGhyb3dJZkFib3J0ZWQoc2lnbmFsKTtcbiAgICAvLyBLZWVwcyBTaW1wbGVTbGljZUFjY2Vzc1NlcnZpY2UncyBibG9iIGNhY2hlIGluIHN5bmMgZXZlbiB3aGVuIHRoZSB1c2VyXG4gICAgLy8gc3dpdGNoZXMgYmFja2VuZHMgKGUuZy4gT1NEIEltYWdlIOKGkiBuYXBhcmkgVm9sdW1lKSBvbiB0aGUgc2FtZSBmaWxlIOKAlFxuICAgIC8vIHdoaWNoZXZlciBiYWNrZW5kIGxvYWRzIGEgZ2VudWluZWx5IGRpZmZlcmVudCBmaWxlIGZpcnN0IGV2aWN0cyBpdC5cbiAgICB0aGlzLnNpbXBsZVN0YWNrLm5vdGVBY3RpdmVGaWxlKGltYWdlSW5mby5maWxlTmFtZSk7XG4gICAgdGhpcy5sb2FkZWQgPSB7IGltYWdlSW5mbywgejogekluZGV4LCBmaWxlbmFtZTogaW1hZ2VJbmZvLmZpbGVOYW1lIH07XG4gICAgcmV0dXJuIHRoaXMubG9hZGVkO1xuICB9XG5cbiAgYXN5bmMgcGxvdChcbiAgICBwbG90RGl2OiBzdHJpbmcsXG4gICAgaW1hZ2VMb2FkZWQ6IHVua25vd24sXG4gICAgaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLFxuICAgIHNjcmVlbkhlaWdodDogbnVtYmVyLFxuICAgIHBsb3RUeXBlOiBQbG90VHlwZSxcbiAgICBpblBsYWNlPzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgaG9zdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBsb3REaXYpO1xuICAgIGlmICghaG9zdCkge1xuICAgICAgY29uc29sZS5lcnJvcihgW25hcGFyaS1qc10gcGxvdCB0YXJnZXQgIyR7cGxvdERpdn0gbm90IGZvdW5kYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMucmVzZXQoKTtcbiAgICAvLyBBIG5ldyBpbWFnZTogYSBzdHJva2Ugb3IgU0FNIHByb21wdCBpbiBwcm9ncmVzcyBiZWxvbmdlZCB0byB0aGUgb2xkIG9uZS5cbiAgICBpZiAoIWluUGxhY2UpIHRoaXMuY2FudmFzVG9vbHMucmVzZXRBbGwoKTtcbiAgICAvLyBUaGlzIHBsb3QncyBzY2VuZS4gQSBuZXdlciBwbG90IHJlc2V0cyBpbnRvIHRoZSBuZXh0IG9uZSB3aGlsZSB0aGlzIG9uZSBzdGlsbCBhd2FpdHMsIGFuZFxuICAgIC8vIGEgc3VwZXJzZWRlZCBwbG90IG11c3Qgbm90IGdvIG9uIHRvIGRyYXcgKG9yIGNvdW50IGltYWdlIHRpbGVzKSBpbnRvIHRoZSBuZXdlciBzY2VuZS5cbiAgICBjb25zdCBzY2VuZSA9IHRoaXMubGlmZXRpbWUuc2lnbmFsO1xuICAgIHRoaXMuaG9zdCA9IGhvc3Q7XG4gICAgdGhpcy5iYWRnZS5hdHRhY2goaG9zdCk7XG5cbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgY2FudmFzLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgIGNhbnZhcy5zdHlsZS5oZWlnaHQgPSBzY3JlZW5IZWlnaHQgPyBgJHtzY3JlZW5IZWlnaHR9cHhgIDogJzEwMCUnO1xuICAgIGhvc3QuYXBwZW5kQ2hpbGQoY2FudmFzKTtcbiAgICB0aGlzLmNhbnZhcyA9IGNhbnZhcztcblxuICAgIGNvbnN0IGluZm8gPSAoaW1hZ2VMb2FkZWQgYXMgTmFwYXJpTG9hZGVkKT8uaW1hZ2VJbmZvID8/IGltYWdlSW5mbztcblxuICAgIHRyeSB7XG4gICAgICAvLyBCdWlsdCBPVVRTSURFIHRoZSBBbmd1bGFyIHpvbmUsIHNvIGl0cyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgbG9vcCwgaXRzIGNhbnZhcyBwb2ludGVyIC9cbiAgICAgIC8vIHdoZWVsIGxpc3RlbmVycyBhbmQgaXRzIFJlc2l6ZU9ic2VydmVyIGRvIG5vdCBlYWNoIHRyaWdnZXIgYXBwLXdpZGUgY2hhbmdlIGRldGVjdGlvbi5cbiAgICAgIC8vIFdoYXRldmVyIHRoZXkgY2F1c2UgdGhhdCB0aGUgVUkgc2hvd3MgcmUtZW50ZXJzIHRoZSB6b25lIChzZWUgaW5ab25lKS5cbiAgICAgIGNvbnN0IHZpZXdlciA9IHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcihcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBuZXcgVmlld2VyKHtcbiAgICAgICAgICAgIGNhbnZhcyxcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IHsgcjogMC4wNywgZzogMC4wNywgYjogMC4wOSwgYTogMSB9LFxuICAgICAgICAgICAgLy8gU2V0IGhlcmUgcmF0aGVyIHRoYW4gbGVmdCB0byBuYXBhcmktanMncyBvd24gZGVmYXVsdCBzbyB0aGUgZ2VudGxlclxuICAgICAgICAgICAgLy8gc3RlcCBhcHBsaWVzIHdpdGggdGhlIHZlcnNpb24gY3VycmVudGx5IGluc3RhbGxlZC4gQ2hvc2VuIHRvIG1hdGNoIHRoZVxuICAgICAgICAgICAgLy8gT1NEIGJhY2tlbmQncyBzdGVwIChzZWUgT1NEX1pPT01fUEVSX1NDUk9MTCk6IHRoZSB3aGVlbCBzaG91bGQgZmVlbCB0aGVcbiAgICAgICAgICAgIC8vIHNhbWUgb24gYW4gaW1hZ2Ugd2hpY2hldmVyIHJlbmRlcmVyIGlzIGRyYXdpbmcgaXQuIFRoZSBzdGVwIGFwcGxpZXMgcGVyXG4gICAgICAgICAgICAvLyBzY3JvbGwgRVZFTlQsIGFuZCBhIHRyYWNrcGFkIHNlbmRzIGEgYnVyc3Qgb2YgdGhlbSBwZXIgc3dpcGUsIHNvIGEgc3RlcFxuICAgICAgICAgICAgLy8gdHVuZWQgdG8gYSBtb3VzZSBub3RjaCBydW5zIGF3YXkgdW5kZXIgYSB0cmFja3BhZC5cbiAgICAgICAgICAgIHdoZWVsWm9vbVNwZWVkOiBOQVBBUklfV0hFRUxfWk9PTV9TUEVFRCxcbiAgICAgICAgICAgIC8vIFRoZSBGSVJTVCAzRCBsYXllciBvZiBhIHNjZW5lIGZyYW1lcyB0aGUgb3JiaXQgY2FtZXJhOyBldmVyeSBsYXRlciBvbmUgbGVhdmVzIHRoZVxuICAgICAgICAgICAgLy8gcG9zZSBhbG9uZS4gQSBzcGF0aWFsIHNjZW5lIGlzIGJ1aWx0IGZyb20gc2V2ZXJhbCBsYXllcnMgYW5kIHJlYnVpbHQgY29uc3RhbnRseSDigJRcbiAgICAgICAgICAgIC8vIHJlY29sb3VyaW5nIGJ5IGEgY2xhc3MsIHBpY2tpbmcgYSBnZW5lLCBzdGVwcGluZyBhIHNlY3Rpb24g4oCUIGFuZCB3aXRoIG5hcGFyaS1qcydzXG4gICAgICAgICAgICAvLyBwcmV2aW91cyB1bmNvbmRpdGlvbmFsIGZyYW1pbmcgZWFjaCBvZiB0aG9zZSB0aHJldyBhd2F5IGFuIG9yYml0IHRoZSB1c2VyIGhhZCBzZXQuXG4gICAgICAgICAgICAvLyBUaGUgcG9zZSBpdCBzbmFwcGVkIGJhY2sgdG8gZGVwZW5kZWQgb24gV0hJQ0ggbGF5ZXIgd2FzIHJlYnVpbHQsIHNvIGlzb2xhdGluZyBvbmVcbiAgICAgICAgICAgIC8vIHNlY3Rpb24gem9vbWVkIHRvIHRoYXQgc2VjdGlvbidzIGJvdW5kcy4gYHJlc2V0Rml0M0QoKWAgb24gYSBkYXRhc2V0IGNoYW5nZSBpcyB3aGF0XG4gICAgICAgICAgICAvLyBsZXRzIHRoZSBuZXh0IHNjZW5lIGZyYW1lIGl0c2VsZi5cbiAgICAgICAgICAgIGZpdDNkOiAnb25jZScsXG4gICAgICAgICAgICAvLyBJbiB0aGUgc3BhdGlhbCBtb2RlcyBhIHBsYWluIGNsaWNrIFNFTEVDVFMgdGhlIGNsYXNzIHVuZGVyIHRoZSBjdXJzb3IsXG4gICAgICAgICAgICAvLyBzbyBuYXBhcmkncyBPU0Qtc3R5bGUgY2xpY2stdG8tem9vbSBpcyB0dXJuZWQgb2ZmIHRoZXJlOiBvdGhlcndpc2Ugb25lXG4gICAgICAgICAgICAvLyBjbGljayB3b3VsZCBib3RoIHNlbGVjdCBhIGNsYXNzIGFuZCB6b29tIDJ4IGFib3V0IHRoZSBjdXJzb3IsIGFuZCB0aGVcbiAgICAgICAgICAgIC8vIHpvb20gd291bGQgdGhlbiBoYWx2ZSB0aGUgcGl4ZWwgcmFkaXVzIHRoZSBuZXh0IGNsaWNrIGhpdC10ZXN0cyB3aXRoLlxuICAgICAgICAgICAgLy8gWm9vbWluZyBpcyBzdGlsbCBvbiB0aGUgd2hlZWwsIHRoZSB6b29tIGJ1dHRvbnMgYW5kIHRoZSB6b29tLWJveCB0b29sLlxuICAgICAgICAgICAgLi4uKGlzU3BhdGlhbE9taWNzKHBsb3RUeXBlKSB8fCBpc1NwYXRpYWxPbWljczNkKHBsb3RUeXBlKSA/IHsgY2xpY2tab29tRmFjdG9yOiAwIH0gOiB7fSksXG4gICAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXI7XG4gICAgICBhd2FpdCB2aWV3ZXIucmVhZHk7XG4gICAgICBpZiAoc2NlbmUuYWJvcnRlZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBObyBsb2FkZWQgaW1hZ2U6IGFuIGltYWdlLWxlc3Mgc3BhdGlhbCBkYXRhc2V0IG9wZW5lZCBiZWZvcmUgYW55IGltYWdlICh0aGUgdmlzdWFsaXplcidzXG4gICAgICAvLyBwbG90U3BhdGlhbFdpdGhvdXRJbWFnZSkg4oCUIHRoZSBvYnNlcnZhdGlvbnMgYWxvbmUuXG4gICAgICB0aGlzLnNjZW5lID0gdGhpcy5jcmVhdGVTY2VuZShwbG90VHlwZSwgdGhpcy5zY2VuZUNvbnRleHQodmlld2VyLCBob3N0LCBjYW52YXMpLCBpbmZvLCBpbWFnZUxvYWRlZCA9PSBudWxsKTtcbiAgICAgIGF3YWl0IHRoaXMuc2NlbmUubW91bnQoKTtcbiAgICAgIHRoaXMudG9vbHMuc2NoZWR1bGVSZWFkYmFjaygpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbbmFwYXJpLWpzXSBwbG90IGZhaWxlZDonLCBlcnIpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgc2NlbmUgYSBwbG90IHR5cGUgbW91bnRzLiAqL1xuICBwcml2YXRlIGNyZWF0ZVNjZW5lKFxuICAgIHBsb3RUeXBlOiBQbG90VHlwZSxcbiAgICBjdHg6IFNjZW5lQ29udGV4dCxcbiAgICBpbmZvOiBJSW1hZ2VJbmZvIHwgdW5kZWZpbmVkLFxuICAgIG5vSW1hZ2U6IGJvb2xlYW4sXG4gICk6IE5hcGFyaVNjZW5lIHtcbiAgICBpZiAoaXNTcGF0aWFsT21pY3MzZChwbG90VHlwZSkpIHJldHVybiBuZXcgU3BhdGlhbDNkU2NlbmUoY3R4LCB0aGlzLnNwYXRpYWwpO1xuICAgIGlmIChpc1NwYXRpYWxPbWljcyhwbG90VHlwZSkpIHJldHVybiBuZXcgU3BhdGlhbDJkU2NlbmUoY3R4LCB0aGlzLnNwYXRpYWwsIG5vSW1hZ2UpO1xuICAgIGlmIChpc05hcGFyaVNjYXR0ZXIocGxvdFR5cGUpKSByZXR1cm4gbmV3IFNjYXR0ZXJSZWdpb25zU2NlbmUoY3R4KTtcbiAgICBpZiAoaXNOYXBhcmlTY2F0dGVyM2QocGxvdFR5cGUpKSByZXR1cm4gbmV3IFNjYXR0ZXIzZFNjZW5lKGN0eCwgaW5mbyk7XG4gICAgaWYgKGlzTmFwYXJpU3VyZmFjZShwbG90VHlwZSkpIHJldHVybiBuZXcgU3VyZmFjZVNjZW5lKGN0eCk7XG4gICAgaWYgKGlzTmFwYXJpM2QocGxvdFR5cGUpKSByZXR1cm4gbmV3IFZvbHVtZVNjZW5lKGN0eCwgaW5mbywgaXNOYXBhcmlJc29zdXJmYWNlKHBsb3RUeXBlKSA/ICdpc28nIDogJ21pcCcpO1xuICAgIHJldHVybiBuZXcgSW1hZ2UyZFNjZW5lKGN0eCk7XG4gIH1cblxuICAvKiogU2hvdy9oaWRlIHRoZSBvdmVydmlldyBuYXZpZ2F0b3IgKHNhbWUgc2V0dGluZyBhcyBPU0QncykuICovXG4gIHNldE5hdmlnYXRvclZpc2libGUodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2V0dGluZ3MubmF2aWdhdG9yVmlzaWJsZSA9IHZpc2libGU7XG4gICAgdGhpcy5zY2VuZT8uc2V0TmF2aWdhdG9yVmlzaWJsZT8uKHZpc2libGUpO1xuICB9XG5cbiAgLyoqIE9ic2VydmF0aW9ucyBwcm9qZWN0ZWQgdG8gY2FudmFzIHBpeGVscyB1bmRlciB0aGUgM0QgY2FtZXJhICh0aGUgc3BhdGlhbCAzRCBjbG91ZCksIGluZGV4ZWRcbiAgICogIGJ5IG9ic2VydmF0aW9uIHdpdGggTmFOIGZvciBhbnkgbm90IGRyYXduOyBudWxsIHdoZW4gbm8gY2xvdWQgaXMgbW91bnRlZC4gKi9cbiAgZ2V0U3BhdGlhbFNjcmVlblByb2plY3Rpb24ob2JzOiBTcGF0aWFsT2JzZXJ2YXRpb25zKTogRmxvYXQzMkFycmF5IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc2NlbmU/LnNjcmVlblByb2plY3Rpb24/LihvYnMpID8/IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGZpdENhbWVyYVNvb24oKTogdm9pZCB7XG4gICAgY29uc3QgcnVuID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHRoaXMudmlld2VyICYmIHRoaXMuY2FudmFzICYmIHRoaXMuaW1hZ2VXID4gMCAmJiB0aGlzLmltYWdlSCA+IDApIHtcbiAgICAgICAgdGhpcy52aWV3ZXIuY2FtZXJhLmZpdChcbiAgICAgICAgICB0aGlzLmltYWdlVyxcbiAgICAgICAgICB0aGlzLmltYWdlSCxcbiAgICAgICAgICB0aGlzLmNhbnZhcy5jbGllbnRXaWR0aCB8fCB0aGlzLmltYWdlVyxcbiAgICAgICAgICB0aGlzLmNhbnZhcy5jbGllbnRIZWlnaHQgfHwgdGhpcy5pbWFnZUgsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAodHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZShydW4pKTtcbiAgICBlbHNlIHJ1bigpO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIFBsb3RseS1zcGVjaWZpYzsgaG9zdCByZS1kcml2ZXMgcGxvdCgpIGZyb20gaXRzIGltYWdlIHN0cmVhbS4gKi9cbiAgcmVsb2FkQW5kUGxvdCgpOiB2b2lkIHtcbiAgICAvKiBuby1vcCAqL1xuICB9XG5cbiAgLyoqXG4gICAqIEVuZCB0aGUgbW91bnRlZCBzY2VuZTogYWJvcnQgaXRzIGxpZmV0aW1lIChpdHMgZGVzY3JpcHRvciBwb2xsLCB0aWxlIGNvdW50cywgZnJhbWUgbG9hZGluZyBhbmRcbiAgICogYXdhaXRzKSBhbmQgZGlzcG9zZSBpdCDigJQgaXRzIGxheWVycywga2V5cywgc3Vic2NyaXB0aW9ucyBhbmQgbGlzdGVuZXJzIGdvIHdpdGggaXQsIHNvIHRoZSBuZXh0XG4gICAqIHBsb3QgY2FuIG5ldmVyIGluaGVyaXQgYW4gXCJhbHJlYWR5IGJ1aWx0XCIga2V5IChOQVBBUkktU1ZDLTEpIOKAlCB0aGVuIHRlYXIgdGhlIHZpZXdlciBkb3duLlxuICAgKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkaW5nLmFib3J0KCk7XG4gICAgdGhpcy5sb2FkaW5nID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIHRoaXMubGlmZXRpbWUuYWJvcnQoKTtcbiAgICB0aGlzLmxpZmV0aW1lID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIHRoaXMuc2NlbmU/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLnNjZW5lID0gbnVsbDtcbiAgICB0aGlzLmJhZGdlLnJlc2V0KCk7XG4gICAgdGhpcy50b29scy50ZWFyZG93bigpO1xuICAgIHRoaXMudGlsZUNsaWVudC5zdGFydFNjZW5lKHRoaXMubGlmZXRpbWUuc2lnbmFsKTtcbiAgICB0aGlzLnZpZXdlcj8uZGlzcG9zZSgpO1xuICAgIHRoaXMudmlld2VyID0gbnVsbDtcbiAgICBpZiAodGhpcy5jYW52YXMgJiYgdGhpcy5ob3N0Py5jb250YWlucyh0aGlzLmNhbnZhcykpIHRoaXMuaG9zdC5yZW1vdmVDaGlsZCh0aGlzLmNhbnZhcyk7XG4gICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICB9XG5cbiAgcmVsYXlvdXQoX3RydWVJbWFnZVNpemU/OiBudW1iZXJbXSk6IHZvaWQge1xuICAgIHRoaXMudmlld2VyPy5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgUGxvdGx5LXNwZWNpZmljIGF4aXMgcmVzZXQuICovXG4gIHJlc2V0QXhlcygpOiB2b2lkIHtcbiAgICB0aGlzLmZpdENhbWVyYVNvb24oKTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCBQbG90bHktc3BlY2lmaWMgYXV0b3NjYWxlLiAqL1xuICBhdXRvc2NhbGUoKTogdm9pZCB7XG4gICAgdGhpcy5maXRDYW1lcmFTb29uKCk7XG4gICAgdGhpcy5hdXRvc2NhbGVFdmVudCQubmV4dCh1bmRlZmluZWQpO1xuICB9XG5cbiAgem9vbUluKCk6IHZvaWQge1xuICAgIHRoaXMuem9vbUJ5KFpPT01fQlVUVE9OX1NURVApO1xuICB9XG5cbiAgem9vbU91dCgpOiB2b2lkIHtcbiAgICB0aGlzLnpvb21CeSgxIC8gWk9PTV9CVVRUT05fU1RFUCk7XG4gIH1cblxuICAvKiogWm9vbSBieSBgZmFjdG9yYCAoPiAxID0gaW4pIG9uIHdoaWNoZXZlciBjYW1lcmEgaXMgbGl2ZTogdGhlIDJEIGNhbWVyYSdzIHpvb20sIG9yIOKAlCBpbiBhIDNEXG4gICAqICBzY2VuZSwgd2hlcmUgdGhhdCB3b3VsZCBjaGFuZ2Ugbm90aGluZyB2aXNpYmxlIOKAlCB0aGUgb3JiaXQgY2FtZXJhJ3MgZGlzdGFuY2UuICovXG4gIHByaXZhdGUgem9vbUJ5KGZhY3RvcjogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIGlmICh2LmRpbXMubmRpc3BsYXkgPT09IDMpXG4gICAgICB2LmNhbWVyYTNkLnpvb21CeSgxIC8gZmFjdG9yKTsgLy8gem9vbUJ5IHNjYWxlcyB0aGUgZGlzdGFuY2VcbiAgICBlbHNlIHYuY2FtZXJhLnpvb20gPSB2LmNhbWVyYS56b29tICogZmFjdG9yO1xuICB9XG5cbiAgc2V0RHJhZ01vZGUoX21vZGU6IHN0cmluZyB8IGZhbHNlKTogdm9pZCB7XG4gICAgLy8gTm8tb3A6IHBhbiBhbmQgem9vbSBhcmUgYWx3YXlzIHRoZSBuYXBhcmkgY2FtZXJhJ3MgZGVmYXVsdCBnZXN0dXJlcywgYW5kIHBhbi96b29tIGdhdGluZyBmb3JcbiAgICAvLyBkcmF3aW5nIGlzIG93bmVkIGJ5IHRoZSByZWdpb24gb3ZlcmxheSdzIHNldE1vZGUgKHNldENvbnRyb2xzRW5hYmxlZCkuIFRvZ2dsaW5nIGNvbnRyb2xzIGhlcmVcbiAgICAvLyB3b3VsZCBmaWdodCB0aGF0IOKAlCB0aGUgaG9zdCBjYWxscyBzZXREcmFnTW9kZShmYWxzZSkgYWxvbmdzaWRlIG92ZXJsYXkuc2V0TW9kZSg8dG9vbD4pLlxuICB9XG5cbiAgc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNldHRpbmdzLmltYWdlU21vb3RoaW5nID0gZW5hYmxlZDtcbiAgICAvLyBBcHBseSBsaXZlIHRvIHRoZSByZW5kZXJlZCBpbWFnZSBsYXllcnM7IGJha2VkIGludG8gdGhlIG5leHQgcmVuZGVyIHRvby5cbiAgICB0aGlzLnNjZW5lPy5zZXRJbWFnZVNtb290aGluZz8uKGVuYWJsZWQpO1xuICB9XG5cbiAgc2V0U2hvd1N0YWNrKF9zaG93c3RhY2s6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvKiBzdGFjayBuYXZpZ2F0ZWQgdmlhIHNldFpJbmRleCAqL1xuICB9XG5cbiAgc2V0WkluZGV4KHpJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubG9hZGVkKSB0aGlzLmxvYWRlZC56ID0gekluZGV4O1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICAvLyBEaXNwYXRjaCBvbiBXSEFUIElTIE1PVU5URUQsIG5vdCBvbiB3aGljaCBsYXllciBoYW5kbGUgaGFwcGVucyB0byBiZSBub24tbnVsbDogYSBzdXJmYWNlXG4gICAgLy8gc3RpbGwgcHJlbG9hZGluZyAob3Igd2hvc2UgZmlyc3QgYnVpbGQgZmFpbGVkKSBoYXMgbm8gbGF5ZXIgeWV0LCBhbmQgYSAzRCBzY2F0dGVyIG9yIGNsb3VkXG4gICAgLy8gaGFzIG5vbmUgb2YgdGhlbSDigJQgYW5kIGJvdGggdXNlZCB0byBmYWxsIHRocm91Z2ggdG8gdGhlIDJEIHJlbmRlciAoTkFQQVJJLVNWQy05KS5cbiAgICB0aGlzLnNjZW5lPy5zZXRaKHpJbmRleCk7XG4gIH1cblxuICBzZXRTdGFja0xvYWRpbmcoc3RhY2tMb2FkaW5nOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoc3RhY2tMb2FkaW5nKTtcbiAgfVxuXG4gIC8qKiBDYW5jZWwgaW4tZmxpZ2h0IGZyYW1lIGxvYWRpbmc6IGFib3J0IHtAbGluayBsb2FkaW5nfSBzbyB0aGUgdm9sdW1lLWFzc2VtYmx5IC8gc3VyZmFjZVxuICAgKiAgcHJlbG9hZCB3b3JrZXJzIHN0b3AgZmV0Y2hpbmcgbW9yZSBmcmFtZXMsIGFuZCBjbGVhciB0aGUgbG9hZGluZyBmbGFnICsgcHJvZ3Jlc3MuICovXG4gIGNhbmNlbExvYWRpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkaW5nLmFib3J0KCk7XG4gICAgdGhpcy5sb2FkaW5nID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5uZXh0KDApO1xuICB9XG5cbiAgaXNTdGFja0xvYWRpbmcoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhY2tMb2FkaW5nJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldFN0YWNrTG9hZGluZ1Byb2dyZXNzKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0VHJ1ZUltYWdlU2l6ZSgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5pbWFnZVcgPiAwICYmIHRoaXMuaW1hZ2VIID4gMCA/IHsgd2lkdGg6IHRoaXMuaW1hZ2VXLCBoZWlnaHQ6IHRoaXMuaW1hZ2VIIH0gOiBudWxsO1xuICB9XG5cbiAgZ2V0Q3VycmVudEltYWdlKCk6IFByb21pc2U8SW1hZ2UgfCBudWxsPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgfVxuXG4gIGdldERpc3BsYXllZFBpeGVsRGF0YSgpOiBQaXhlbERhdGEgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy50b29scy5sYXN0UGl4ZWxzO1xuICB9XG5cbiAgZ2V0RGlzcGxheWVkU291cmNlUmVjdCgpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGNvbnN0IHNpemUgPSB0aGlzLmdldFRydWVJbWFnZVNpemUoKTtcbiAgICBpZiAoIXYgfHwgIXNpemUpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHIgPSB2LnZpc2libGVXb3JsZFJlY3QoKTtcbiAgICBjb25zdCB4ID0gTWF0aC5tYXgoMCwgci54KTtcbiAgICBjb25zdCB5ID0gTWF0aC5tYXgoMCwgci55KTtcbiAgICByZXR1cm4ge1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICB3aWR0aDogTWF0aC5taW4oc2l6ZS53aWR0aCwgci54ICsgci53aWR0aCkgLSB4LFxuICAgICAgaGVpZ2h0OiBNYXRoLm1pbihzaXplLmhlaWdodCwgci55ICsgci5oZWlnaHQpIC0geSxcbiAgICB9O1xuICB9XG5cbiAgZG93bmxvYWRJbWFnZSgpOiB2b2lkIHtcbiAgICB2b2lkIHRoaXMuZXhwb3J0Q29tcG9zaXRlKCk7XG4gIH1cblxuICAvKiogTm8tb3A6IHRoZSBtb3VudGVkIHNjZW5lIGlzIGZpeGVkIHBlciB7QGxpbmsgcGxvdH07IGEgbmV3IHBsb3QgdHlwZSB0YWtlcyBhIHJlLXBsb3QuICovXG4gIHNldFBsb3RUeXBlKF9wbG90VHlwZTogUGxvdFR5cGUpOiB2b2lkIHtcbiAgICAvKiB0aGUgc2NlbmUgaXMgY2hvc2VuIGJ5IHBsb3QoKSAqL1xuICB9XG5cbiAgLyoqIE1hcCBhIFBsb3RseS1zdHlsZSAzRCBkcmFnIG1vZGUgb250byBuYXBhcmktanMncyBjYW1lcmEgZHJhZyBtb2RlLiAqL1xuICBzZXRTdXJmYWNlRHJhZ01vZGUobW9kZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgIHRoaXMudmlld2VyLnNldENhbWVyYURyYWdNb2RlKGNhbWVyYURyYWdNb2RlKG1vZGUpKTtcbiAgfVxuXG4gIC8qKiBSZS1mcmFtZSB0aGUgM0QgY2FtZXJhIG9uIHRoZSBzY2VuZTogbmFwYXJpLWpzIGZyYW1lcyB0aGUgdW5pb24gb2YgZXZlcnkgM0QgbGF5ZXIncyBib3VuZHNcbiAgICogIChzdXJmYWNlLCB2b2x1bWUsIHBvaW50IGNsb3VkKSwgd2l0aCB0aGUgdmlld3BvcnQtYXdhcmUgZnJhbWluZyBpdHMgYWRkZXJzIHVzZS4gKi9cbiAgcmVzZXRTdXJmYWNlQ2FtZXJhKCk6IHZvaWQge1xuICAgIHRoaXMudmlld2VyPy5maXRUb0xheWVycygpO1xuICAgIHRoaXMudmlld2VyPy5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICBnZXRBdXRvc2NhbGVFdmVudCgpOiBPYnNlcnZhYmxlPHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5hdXRvc2NhbGVFdmVudCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBsb3QgdHlwZXMgdGhpcyBiYWNrZW5kIGNhbiBtb3VudCDigJQgZXZlcnkgdHlwZSB7QGxpbmsgcGxvdH0gZGlzcGF0Y2hlcyBvbi5cbiAgICpcbiAgICogQ29udHJhY3Qtb25seSBpbiBwcm9kdWN0aW9uOiB0aGUgcm91dGVyIGFuc3dlcnMgYGdldFBsb3RUeXBlRGVzY3JpcHRvcnNgIGZyb20gdGhlIFBsb3RseVxuICAgKiBzZXJ2aWNlLCBzbyBub3RoaW5nIHJlYWNoZXMgdGhpcyBvbmUgdGhyb3VnaCBpdDsgaXQgaXMga2VwdCBhY2N1cmF0ZSBmb3IgZGlyZWN0IGNhbGxlcnMuXG4gICAqL1xuICBnZXRQbG90VHlwZURlc2NyaXB0b3JzKCk6IFBsb3RUeXBlRGVzY3JpcHRvcltdIHtcbiAgICAvLyBUaGUgV2ViR1BVIG5hcGFyaS1qcyBvcHRpb25zLCBvZmZlcmVkIGFsb25nc2lkZSAobm90IHJlcGxhY2luZykgdGhlIE9TRC9QbG90bHkgdHlwZXMuXG4gICAgcmV0dXJuIFtcbiAgICAgIFBMT1RfVFlQRV9ERVNDUklQVE9SU1tQbG90VHlwZS5OQVBBUklfSU1BR0VdISxcbiAgICAgIFBMT1RfVFlQRV9ERVNDUklQVE9SU1tQbG90VHlwZS5OQVBBUklfU0NBVFRFUl0hLFxuICAgICAgUExPVF9UWVBFX0RFU0NSSVBUT1JTW1Bsb3RUeXBlLk5BUEFSSV9TVVJGQUNFXSEsXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX1NDQVRURVIzRF0hLFxuICAgICAgUExPVF9UWVBFX0RFU0NSSVBUT1JTW1Bsb3RUeXBlLk5BUEFSSV9WT0xVTUVdISxcbiAgICAgIFBMT1RfVFlQRV9ERVNDUklQVE9SU1tQbG90VHlwZS5OQVBBUklfSVNPU1VSRkFDRV0hLFxuICAgICAgLy8gR2F0ZWQgYnkgYHJlcXVpcmVzU3BhdGlhbERhdGFgLCBzbyB0aGUgc2VsZWN0b3IgaGlkZXMgdGhlbSB1bnRpbCBhIGRhdGFzZXQgaXMgcHVibGlzaGVkXG4gICAgICAvLyAodGhlIDNEIG9uZSBhbHNvIGJ5IGByZXF1aXJlc1NwYXRpYWwzZGApLlxuICAgICAgUExPVF9UWVBFX0RFU0NSSVBUT1JTW1Bsb3RUeXBlLlNQQVRJQUxfT01JQ1NdISxcbiAgICAgIFBMT1RfVFlQRV9ERVNDUklQVE9SU1tQbG90VHlwZS5TUEFUSUFMX09NSUNTXzNEXSEsXG4gICAgXTtcbiAgfVxuXG4gIC8qKiBUaGUgbmFwYXJpIDNEIGRlY2ltYXRlIGZhY3RvciAoMSA9IGZ1bGwg4oCmIDggPSDihZspLiBSZWFkIGJ5IHRoZSB0b29sYmFyIHRvIGluaXQgdGhlIGNvbnRyb2wuICovXG4gIGdldFJlc29sdXRpb25TY2FsZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzLnJlc29sdXRpb25TY2FsZTtcbiAgfVxuXG4gIC8qKiBTZXQgdGhlIGRlY2ltYXRlIGZhY3RvciBmb3IgdGhlIG5hcGFyaSAzRCB0eXBlcy4gVGFrZXMgZWZmZWN0IG9uIHRoZSBuZXh0IChyZSlsb2FkIOKAlCB0aGUgaG9zdFxuICAgKiAgcmUtcGxvdHMgYWZ0ZXIgY2FsbGluZyB0aGlzLCBzaW5jZSBkZWNpbWF0aW9uIGNoYW5nZXMgdGhlIGZldGNoZWQvYXNzZW1ibGVkIGRhdGEuICovXG4gIHNldFJlc29sdXRpb25TY2FsZShzY2FsZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZXR0aW5ncy5yZXNvbHV0aW9uU2NhbGUgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKHNjYWxlKSk7XG4gIH1cblxuICAvKiogbmFwYXJpLWpzIGhhcyB0aGUgbmF2aWdhdG9yIGFuZCBpbWFnZSBzbW9vdGhpbmcgdG9vIChpdHMgMkQgdmlld3MpLiAqL1xuICBnZXRPc2RWaWV3T3B0aW9ucygpOiBJT3NkVmlld09wdGlvbnMge1xuICAgIHJldHVybiB0aGlzLnZpZXdPcHRpb25zO1xuICB9XG4gIHByaXZhdGUgcmVhZG9ubHkgdmlld09wdGlvbnM6IElPc2RWaWV3T3B0aW9ucyA9IHtcbiAgICBzZXROYXZpZ2F0b3JWaXNpYmxlOiAodmlzaWJsZSkgPT4gdGhpcy5zZXROYXZpZ2F0b3JWaXNpYmxlKHZpc2libGUpLFxuICAgIHNldEltYWdlU21vb3RoaW5nRW5hYmxlZDogKGVuYWJsZWQpID0+IHRoaXMuc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGVuYWJsZWQpLFxuICB9O1xuXG4gIC8qKiBUaGUgM0QgZGVjaW1hdGUgZmFjdG9yICh0aGUgM0QgdHlwZXMnIFJlc29sdXRpb24gY29udHJvbCkuICovXG4gIGdldFZvbHVtZVJlc29sdXRpb24oKTogSVZvbHVtZVJlc29sdXRpb24ge1xuICAgIHJldHVybiB0aGlzLnZvbHVtZVJlc29sdXRpb247XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSB2b2x1bWVSZXNvbHV0aW9uOiBJVm9sdW1lUmVzb2x1dGlvbiA9IHtcbiAgICBnZXQ6ICgpID0+IHRoaXMuZ2V0UmVzb2x1dGlvblNjYWxlKCksXG4gICAgc2V0OiAoc2NhbGUpID0+IHRoaXMuc2V0UmVzb2x1dGlvblNjYWxlKHNjYWxlKSxcbiAgfTtcblxuICAvKiogV2hlcmUgdGhlIGNhbWVyYSBzZXR0bGVkLCBmb3IgdGhlIGludGVuc2l0eSBpbnNldCdzIHJlLXNhbXBsaW5nLiAqL1xuICBnZXRJbnRlbnNpdHlTYW1wbGluZygpOiBJSW50ZW5zaXR5Vmlld3BvcnRTb3VyY2Uge1xuICAgIHJldHVybiB0aGlzLnZpZXdwb3J0U291cmNlO1xuICB9XG4gIHByaXZhdGUgcmVhZG9ubHkgdmlld3BvcnRTb3VyY2U6IElJbnRlbnNpdHlWaWV3cG9ydFNvdXJjZSA9IHtcbiAgICBnZXRWaWV3cG9ydENoYW5nZSQ6ICgpID0+IHRoaXMudmlld3BvcnRDaGFuZ2UkLmFzT2JzZXJ2YWJsZSgpLFxuICB9O1xuXG4gIC8vIOKUgOKUgCBJUmVnaW9uU3RvcmUgKyBjbGFzc2lmaWNhdGlvbiBjb2xvdXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBJbmhlcml0ZWQgZnJvbSBCYXNlU3RvcmVWaXN1YWxpemVyIOKAlCBwdXJlIGRlbGVnYXRpb25zIHRvIHRoZSBzaGFyZWRcbiAgLy8gUmVnaW9uU3RvcmUgLyBWaXN1YWxpemVyU3RvcmUgKGlkZW50aWNhbCB0byB0aGUgT1NEIGJhY2tlbmQpLlxuXG4gIC8vIOKUgOKUgCBJVG9vbENvbnRyb2xsZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIHNldEFjdGl2ZVRvb2wgYW5kIHRoZSBwZXItdG9vbCBzZXR0ZXJzIHJ1biBpbiBCYXNlU3RvcmVWaXN1YWxpemVyIG92ZXIgdGhpcy5jYW52YXNUb29sczsgdGhlXG4gIC8vIHBvaW50ZXIgYW5kIHJlYWRiYWNrIGdhdGluZywgYW5kIHRoZSBTQU0gLyBjZWxscG9zZSBydW5zLCBhcmUgdGhlIHRvb2wgYnJpZGdlJ3MuXG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGJlZm9yZVRvb2xDaGFuZ2UobmV4dDogQ2FudmFzVG9vbElkIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRvb2xzLmJlZm9yZVRvb2xDaGFuZ2UobmV4dCk7XG4gIH1cbiAgc2VnbWVudFJlY3RhbmdsZXMoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy50b29scy5zZWdtZW50UmVjdGFuZ2xlcygpO1xuICB9XG4gIHNlZ21lbnRSZWN0YW5nbGVzQ2VsbHBvc2UoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy50b29scy5zZWdtZW50UmVjdGFuZ2xlc0NlbGxwb3NlKCk7XG4gIH1cbiAgc2V0U2FtTW9kZWwoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2FtVG9vbC5zZXRNb2RlbChpZCk7XG4gICAgdGhpcy5zYW1Qb2ludFRvb2wuc2V0TW9kZWwoaWQpO1xuICB9XG5cbiAgLy8g4pSA4pSAIElEaXNwbGF5T3B0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gSW5oZXJpdGVkIGZyb20gQmFzZVN0b3JlVmlzdWFsaXplciDigJQgcHVyZSBkZWxlZ2F0aW9ucyB0byB0aGUgc2hhcmVkXG4gIC8vIFZpc3VhbGl6ZXJTdG9yZSAoaWRlbnRpY2FsIHRvIHRoZSBPU0QgYmFja2VuZCkuXG5cbiAgLy8g4pSA4pSAIElWaXN1YWxpemVyIGNvbXBvc2l0ZSBtZW1iZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBnZXRSZWdpb25PdmVybGF5KCk6IElSZWdpb25PdmVybGF5IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMudG9vbHMucmVnaW9uT3ZlcmxheTtcbiAgfVxuICBnZXRJc29zdXJmYWNlQ29udHJvbHMoKTogSUlzb3N1cmZhY2VDb250cm9scyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnNjZW5lPy5pc29Db250cm9scz8uKCkgPz8gbnVsbDtcbiAgfVxuICBnZXRJbnRlbnNpdHlDb250cm9scygpOiBJSW50ZW5zaXR5Q29udHJvbHMgfCBudWxsIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBnZXRTdXJmYWNlM2RDb250cm9scygpOiBJU3VyZmFjZTNkQ29udHJvbHMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zY2VuZT8uc3VyZmFjZTNkQ29udHJvbHM/LigpID8/IG51bGw7XG4gIH1cbiAgZ2V0SGlzdG9ncmFtKGNoYW5uZWxJbmRleDogbnVtYmVyLCBiaW5zOiBudW1iZXIpOiBJSGlzdG9ncmFtIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnZpZXdlcikgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMuc2NlbmU/Lmhpc3RvZ3JhbShjaGFubmVsSW5kZXgsIGJpbnMpID8/IG51bGw7XG4gIH1cbiAgZ2V0SGlzdG9ncmFtJChjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogT2JzZXJ2YWJsZTxJSGlzdG9ncmFtIHwgbnVsbD4ge1xuICAgIC8vID44LWJpdCBjaGFubmVsczogdGhlIHRydWUgbmF0aXZlIGRpc3RyaWJ1dGlvbiBmcm9tIHRoZSBzZXJ2ZXIgKHRoZSBkaXNwbGF5ZWQgcGl4ZWxzIGFyZVxuICAgIC8vIDgtYml0LCBzbyB0aGUgY2xpZW50IGhpc3RvZ3JhbSB3b3VsZCBiZSBjbGlwcGVkKS4gOC1iaXQgY2hhbm5lbHMgdXNlIHRoZSBjbGllbnQgcGF0aC5cbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy50aWxlQ2xpZW50Lm5hdGl2ZUhpc3RvZ3JhbSQodGhpcy5sb2FkZWQ/LmltYWdlSW5mbywgdGhpcy5sb2FkZWQ/LnogPz8gMCwgY2hhbm5lbEluZGV4LCBiaW5zKSA/P1xuICAgICAgb2YodGhpcy5nZXRIaXN0b2dyYW0oY2hhbm5lbEluZGV4LCBiaW5zKSlcbiAgICApO1xuICB9XG5cbiAgLyoqIFNhdmUgdGhlIGRpc3BsYXllZCBjb21wb3NpdGUgYXMgYSBQTkcuIFRocm91Z2ggZmlsZS1zYXZlciwgd2hpY2ggKHVubGlrZSByZXZva2luZyBhbiBvYmplY3RcbiAgICogIFVSTCBzdHJhaWdodCBhZnRlciBgYS5jbGljaygpYCkgZG9lcyBub3QgcmFjZSB0aGUgYnJvd3NlcidzIGRvd25sb2FkLiAqL1xuICBleHBvcnRDb21wb3NpdGUoKTogdm9pZCB7XG4gICAgY29uc3QgdiA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIHZvaWQgdlxuICAgICAgLnNjcmVlbnNob3QoKVxuICAgICAgLnRoZW4oKGJsb2IpID0+IHNhdmVBcyhibG9iLCAnbmFwYXJpLWpzLnBuZycpKVxuICAgICAgLmNhdGNoKChlcnIpID0+IGNvbnNvbGUud2FybignW25hcGFyaS1qc10gUE5HIGV4cG9ydCBmYWlsZWQnLCBlcnIpKTtcbiAgfVxuICAvKiogTmF0aXZlLWJpdC1kZXB0aCAoMTYvMzItYml0KSBtdWx0aS1iYW5kIFRJRkYgZXhwb3J0IHZpYSB0aGUgc2VydmVyIGAvZXhwb3J0L3RpZmZgIGVuZHBvaW50IOKAlFxuICAgKiAgdGhlIGRpc3BsYXllZCBQTkcgaXMgYW4gOC1iaXQgZmlndXJlLCB0aGlzIHByZXNlcnZlcyB0aGUgdHJ1ZSBwaXhlbCB2YWx1ZXMuIFZpc2libGUgY2hhbm5lbHNcbiAgICogIG9ubHkgKG9taXR0ZWQgd2hlbiBhbGwgYXJlIHZpc2libGUg4oaSIHNlcnZlciBkZWZhdWx0KS4gTWlycm9ycyB0aGUgT1NEIGJhY2tlbmQuICovXG4gIGFzeW5jIGV4cG9ydERhdGEoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy50aWxlQ2xpZW50LmV4cG9ydFRpZmYoXG4gICAgICB0aGlzLmxvYWRlZD8ueiA/PyAwLFxuICAgICAgdGhpcy5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpLFxuICAgICAgdGhpcy5sb2FkZWQ/LmZpbGVuYW1lLFxuICAgICk7XG4gIH1cbiAgdW5zdWJzY3JpYmUoKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldCgpO1xuICB9XG59XG4iXX0=
669
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXZpc3VhbGl6ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9uYXBhcmktdmlzdWFsaXplci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdFLE9BQU8sRUFBYyxlQUFlLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVoRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFPbkMsT0FBTyxFQUFFLGlCQUFpQixFQUFtQixNQUFNLHlDQUF5QyxDQUFDO0FBQzdGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBa0IsTUFBTSx3Q0FBd0MsQ0FBQztBQUMxRixPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sNEJBQTRCLENBQUM7QUFDbkUsT0FBTyxFQUFrQixjQUFjLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUN6RixPQUFPLEVBQXNCLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUMxRyxPQUFPLEVBQ0wsUUFBUSxFQUVSLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDdkIsVUFBVSxFQUNWLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixjQUFjLEVBQ2QsZ0JBQWdCLEdBQ2pCLE1BQU0sMkJBQTJCLENBQUM7QUFXbkMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUcvRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1B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amVjdCwgSW5qZWN0YWJsZSwgTmdab25lLCBPcHRpb25hbCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJ2ltYWdlLWpzJztcbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gJ2ZpbGUtc2F2ZXInO1xuaW1wb3J0IHsgVmlld2VyIH0gZnJvbSAnbmFwYXJpLWpzJztcblxuaW1wb3J0IHsgSUltYWdlSW5mbyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9pbWFnZS5jb250cmFjdCc7XG5pbXBvcnQgeyBJSGlzdG9ncmFtIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBDYW52YXNUb29sSWQgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBJUmVnaW9uT3ZlcmxheSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9yZWdpb24tb3ZlcmxheS5jb250cmFjdCc7XG5pbXBvcnQgeyBTcGF0aWFsT2JzZXJ2YXRpb25zIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgeyBTUEFUSUFMX0RBVEFfUE9SVCwgU3BhdGlhbERhdGFQb3J0IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3BvcnRzL3NwYXRpYWwtZGF0YS5wb3J0JztcbmltcG9ydCB7IFRJTEVfQUNDRVNTX1BPUlQsIFRpbGVBY2Nlc3NQb3J0IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3BvcnRzL3RpbGUtYWNjZXNzLnBvcnQnO1xuaW1wb3J0IHsgVklaX0NPTkZJRywgVml6Q29uZmlnIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Zpei1jb25maWcnO1xuaW1wb3J0IHsgSUNlbGxTZWdtZW50ZXIsIENFTExfU0VHTUVOVEVSIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NlbGwtc2VnbWVudGVyLmNvbnRyYWN0JztcbmltcG9ydCB7IFZpZXdlckNhcGFiaWxpdGllcywgVmlld2VyRmVhdHVyZSwgY2FwYWJpbGl0aWVzT2YgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2FwYWJpbGl0aWVzLmNvbnRyYWN0JztcbmltcG9ydCB7XG4gIFBsb3RUeXBlLFxuICBQbG90VHlwZURlc2NyaXB0b3IsXG4gIFBMT1RfVFlQRV9ERVNDUklQVE9SUyxcbiAgTkFQQVJJX0RFRkFVTFRfREVDSU1BVEUsXG4gIGlzTmFwYXJpM2QsXG4gIGlzTmFwYXJpSXNvc3VyZmFjZSxcbiAgaXNOYXBhcmlTY2F0dGVyLFxuICBpc05hcGFyaVNjYXR0ZXIzZCxcbiAgaXNOYXBhcmlTdXJmYWNlLFxuICBpc1NwYXRpYWxPbWljcyxcbiAgaXNTcGF0aWFsT21pY3MzZCxcbn0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Bsb3QtdHlwZSc7XG5pbXBvcnQge1xuICBJVmlld2VyQmFja2VuZCxcbiAgUGl4ZWxEYXRhLFxuICBJSXNvc3VyZmFjZUNvbnRyb2xzLFxuICBJSW50ZW5zaXR5Q29udHJvbHMsXG4gIElTdXJmYWNlM2RDb250cm9scyxcbiAgSU9zZFZpZXdPcHRpb25zLFxuICBJVm9sdW1lUmVzb2x1dGlvbixcbiAgSUludGVuc2l0eVZpZXdwb3J0U291cmNlLFxufSBmcm9tICcuLi8uLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgeyBWaXN1YWxpemVyU3RvcmUgfSBmcm9tICcuLi8uLi9zdG9yZS92aXN1YWxpemVyLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVnaW9uU3RvcmUgfSBmcm9tICcuLi8uLi9zdG9yZS9yZWdpb24tc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBTcGF0aWFsU2VsZWN0aW9uU3RvcmUgfSBmcm9tICcuLi8uLi9zdG9yZS9zcGF0aWFsLXNlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IENhbnZhc1Rvb2xNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vdG9vbGJhci90b29sLWtpdC9jYW52YXMtdG9vbC1tYW5hZ2VyJztcbmltcG9ydCB7IFdhbmRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci93YW5kL3dhbmQuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Ub29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2FtUG9pbnRUb29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS1wb2ludC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2VsbFNlZ21lbnRUb29sU2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvc2VnbWVudGF0aW9uL2NlbGwtc2VnbWVudC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgQmFzZVN0b3JlVmlzdWFsaXplciB9IGZyb20gJy4uL2Jhc2Utc3RvcmUtdmlzdWFsaXplcic7XG5pbXBvcnQgeyB0aHJvd0lmQWJvcnRlZCB9IGZyb20gJy4uL3RpbGUtc2VydmVyJztcbmltcG9ydCB7IFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSB9IGZyb20gJy4uL3NpbXBsZS1zbGljZS1hY2Nlc3Muc2VydmljZSc7XG5pbXBvcnQgeyBaT09NX0JVVFRPTl9TVEVQIH0gZnJvbSAnLi4vb3NkL29zZC16b29tJztcbmltcG9ydCB7IE5BUEFSSV9XSEVFTF9aT09NX1NQRUVEIH0gZnJvbSAnLi9uYXBhcmktem9vbSc7XG5pbXBvcnQgeyBUcmFuc2NyaXB0RXN0aW1hdGUgfSBmcm9tICcuL25hcGFyaS1zcGF0aWFsLXRpbGVzJztcbmltcG9ydCB7IE5hcGFyaVRpbGVDbGllbnQgfSBmcm9tICcuL25hcGFyaS10aWxlLWNsaWVudCc7XG5pbXBvcnQgeyBOYXBhcmlEaXNwbGF5U3RhdGUgfSBmcm9tICcuL25hcGFyaS1kaXNwbGF5LXN0YXRlJztcbmltcG9ydCB7IExvYWRpbmdCYWRnZVN0YXRlIH0gZnJvbSAnLi9uYXBhcmktbG9hZGluZy1zdGF0ZSc7XG5pbXBvcnQgeyBOYXBhcmlUb29sQnJpZGdlIH0gZnJvbSAnLi9uYXBhcmktdG9vbC1icmlkZ2UnO1xuaW1wb3J0IHsgY2FtZXJhRHJhZ01vZGUgfSBmcm9tICcuL25hcGFyaS1heGVzLWdpem1vJztcbmltcG9ydCB7IE5hcGFyaVNjZW5lLCBOYXBhcmlTZXR0aW5ncywgU2NlbmVDb250ZXh0LCBWb2x1bWVWb3hlbHNPblNjcmVlbiB9IGZyb20gJy4vbmFwYXJpLXNjZW5lJztcbmltcG9ydCB0eXBlIHsgUGxhbmVBeGlzLCBTbGljZVBsYW5lcyB9IGZyb20gJy4vbmFwYXJpLXZvbHVtZS1zbGljZS1wbGFuZXMnO1xuaW1wb3J0IHR5cGUgeyBSZWdpb25NZXNoM0QgfSBmcm9tICcuL25hcGFyaS12b2x1bWUtcmVnaW9uLW1lc2hlcyc7XG5pbXBvcnQgeyBJbWFnZTJkU2NlbmUsIFNjYXR0ZXJSZWdpb25zU2NlbmUgfSBmcm9tICcuL25hcGFyaS1pbWFnZS0yZC1zY2VuZSc7XG5pbXBvcnQgeyBTY2F0dGVyM2RTY2VuZSwgVm9sdW1lU2NlbmUgfSBmcm9tICcuL25hcGFyaS12b2x1bWUtc2NlbmUnO1xuaW1wb3J0IHsgU3VyZmFjZVNjZW5lIH0gZnJvbSAnLi9uYXBhcmktc3VyZmFjZS1zY2VuZSc7XG5pbXBvcnQgeyBTcGF0aWFsU2Vzc2lvbiB9IGZyb20gJy4vbmFwYXJpLXNwYXRpYWwtc2NlbmUnO1xuaW1wb3J0IHsgU3BhdGlhbDJkU2NlbmUgfSBmcm9tICcuL25hcGFyaS1zcGF0aWFsLTJkLXNjZW5lJztcbmltcG9ydCB7IFNwYXRpYWwzZFNjZW5lIH0gZnJvbSAnLi9uYXBhcmktc3BhdGlhbC0zZC1zY2VuZSc7XG5cbi8qKiBPcGFxdWUgaGFuZGxlIGZyb20ge0BsaW5rIE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlLmxvYWR9LCBwYXNzZWQgYmFjayB0byBwbG90KCkuICovXG5pbnRlcmZhY2UgTmFwYXJpTG9hZGVkIHtcbiAgaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvO1xuICB6OiBudW1iZXI7XG4gIC8qKiBNdXN0IG1hdGNoIGBJSW1hZ2VJbmZvLmZpbGVOYW1lYCDigJQgdGhlIHJlbmRlciBvcmNoZXN0cmF0b3IgZHJvcHMgdGhlIHJlc3VsdCBpZiB0aGVcbiAgICogIGhhbmRsZSdzIGBmaWxlbmFtZWAgZG9lc24ndCBtYXRjaCB0aGUgcmVxdWVzdGVkIGltYWdlIChndWFyZHMgYWdhaW5zdCBzdGFsZSBjbGlja3MpLiAqL1xuICBmaWxlbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBXZWJHUFUgaW1hZ2UgYmFja2VuZCwgYnVpbHQgb24gdGhlIHB1Ymxpc2hlZCBgbmFwYXJpLWpzYCBsaWJyYXJ5IChqaXQtdWkjMTAyOiBhXG4gKiBicm93c2VyLWJhc2VkIG5hcGFyaSBzaGlwcGVkIGFzIGEgSlMgbGlicmFyeSwgYWxvbmdzaWRlIE9wZW5TZWFkcmFnb24gZm9yIGltYWdlcyBhbmQgUGxvdGx5XG4gKiBmb3IgM0QpLlxuICpcbiAqIE9uZSBzY2VuZSBpcyBtb3VudGVkIHBlciB7QGxpbmsgcGxvdH0sIGNob3NlbiBieSBwbG90IHR5cGU6XG4gKiAgLSAqKjJEIGltYWdlKiogKGFuZCB0aGUgcmVnaW9uLWNlbnRyb2lkIHNjYXR0ZXIgYW5kIHNwYXRpYWwtb21pY3Mgdmlld3Mgb3ZlciBpdCk6IHB5cmFtaWRhbFxuICogICAgYFRpbGVkU291cmNlYHMgYWdhaW5zdCB0aGUgaml0LXNlcnZpY2UgYC90aWxlYCBlbmRwb2ludCB3aGVuIGAvdGlsZXMvaW5mb2AgZGVzY3JpYmVzIHRoZVxuICogICAgaW1hZ2UsIGVsc2UgYSBzaW5nbGUgc3RpdGNoZWQgbGV2ZWwgKGB0aWxlZDpmYWxzZWAgc3RhY2tzIGZldGNoIGVhY2ggc2xpY2UncyBvd24gVVJMKTtcbiAqICAgIG11bHRpY2hhbm5lbCBhZGRpdGl2ZSB0aW50cywgZ3JheXNjYWxlIGNvbG9ybWFwIG9yIFJHQjsgc2NhbGUgYmFyLCBuYXZpZ2F0b3IsIHJlZ2lvblxuICogICAgb3ZlcmxheSBhbmQgdGhlIHNoYXJlZCBwaXhlbCB0b29scyAod2FuZCwgYnJ1c2gsIGVyYXNlciwgem9vbS10by1ib3gsIFNBTS9jZWxscG9zZSkuXG4gKiAgLSAqKlZvbHVtZSAvIGlzb3N1cmZhY2UgLyAzRCBzY2F0dGVyIC8gc3VyZmFjZSoqOiBzbGljZXMgYXNzZW1ibGVkIGludG8gYSBkZWNpbWF0ZWQgdm9sdW1lXG4gKiAgICAob3Igb25lIGhlaWdodCBmaWVsZCBwZXIgc2xpY2UpLCB3aXRoIHRoZSBheGVzIGdpem1vIGFuZCB0aGUgWi1oZWlnaHQgaGFuZGxlLlxuICogIC0gKipTcGF0aWFsIG9taWNzIDJEIC8gM0QqKjogb2JzZXJ2YXRpb24gbWFya2VycyBvciBhIDNEIGNsb3VkLCBnZW5lIG1hcHMsIGRlbnNpdHkgdm9sdW1lcyxcbiAqICAgIGxldmVsLW9mLWRldGFpbCB0aWxlcywgaG92ZXIgdG9vbHRpcCBhbmQgY2xpY2stdG8tc2VsZWN0LlxuICpcbiAqIFBlci1jaGFubmVsIGhpc3RvZ3JhbXMgY29tZSBmcm9tIHRoZSBjbGllbnQgZGF0YSwgb3IgZnJvbSB0aGUgc2VydmVyJ3MgYC9oaXN0b2dyYW1gIGZvclxuICogPjgtYml0IGltYWdlczsgVElGRiBleHBvcnQgZnJvbSBgL2V4cG9ydC90aWZmYC4gUmVnaW9uIHN0YXRlIGFuZCBkaXNwbGF5IG9wdGlvbnMgZGVsZWdhdGUgdG9cbiAqIHRoZSBzaGFyZWQge0BsaW5rIFJlZ2lvblN0b3JlfSAvIHtAbGluayBWaXN1YWxpemVyU3RvcmV9IHRocm91Z2gge0BsaW5rIEJhc2VTdG9yZVZpc3VhbGl6ZXJ9LFxuICogZXhhY3RseSBhcyBPU0QgZG9lcy4gbmFwYXJpLWpzJ3MgcmVuZGVyIGxvb3AgYW5kIHRoZSBob3QgcG9pbnRlciBwYXRocyBydW4gb3V0c2lkZSB0aGVcbiAqIEFuZ3VsYXIgem9uZS5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBOYXBhcmlWaXN1YWxpemVyU2VydmljZSBleHRlbmRzIEJhc2VTdG9yZVZpc3VhbGl6ZXIgaW1wbGVtZW50cyBJVmlld2VyQmFja2VuZCB7XG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllczogVmlld2VyQ2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzT2YoW1xuICAgIFZpZXdlckZlYXR1cmUuSW1hZ2VEaXNwbGF5LFxuICAgIFZpZXdlckZlYXR1cmUuU3RhY2tTbGlkZXIsXG4gICAgVmlld2VyRmVhdHVyZS5QaXhlbFJlYWRiYWNrLFxuICAgIFZpZXdlckZlYXR1cmUuU3VyZmFjZTNELFxuICAgIFZpZXdlckZlYXR1cmUuSXNvc3VyZmFjZSxcbiAgXSk7XG5cbiAgLyoqIFRoZSBqaXQtc2VydmljZSB0aWxlIHNlcnZlcjogZGVzY3JpcHRvciwgc2xpY2VzLCB0aWxlZCBzb3VyY2VzLCBoaXN0b2dyYW1zLCBleHBvcnQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdGlsZUNsaWVudDogTmFwYXJpVGlsZUNsaWVudDtcbiAgLyoqIG5hcGFyaS1qcydzIHJlbmRlciBsb29wIGFuZCB0aGUgaG90IHBvaW50ZXIvdGltZXIgcGF0aHMgcnVuIG91dHNpZGUgdGhlIEFuZ3VsYXIgem9uZVxuICAgKiAgKE5BUEFSSS1TVkMtMjUpOyB3aGF0IHRoZXkgcHJvZHVjZSBmb3IgdGhlIFVJIHJlLWVudGVycyBpdCB0aHJvdWdoIHtAbGluayBpblpvbmV9LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHpvbmUgPSBpbmplY3QoTmdab25lKTtcblxuICBwcml2YXRlIHZpZXdlcjogVmlld2VyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGhvc3Q6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbG9hZGVkOiBOYXBhcmlMb2FkZWQgfCBudWxsID0gbnVsbDtcbiAgLyoqIEZvciB0aGUgcGFuZWw6IHRoZSB0cmFuc2NyaXB0cy1pbi12aWV3IGVzdGltYXRlIGFuZCB0aGUgZGVuc2l0eSB3aW5kb3cgaW4gdXNlLiAqL1xuICByZWFkb25seSB0cmFuc2NyaXB0RXN0aW1hdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUcmFuc2NyaXB0RXN0aW1hdGUgfCBudWxsPihudWxsKTtcbiAgLyoqIFRyYW5zY3JpcHRzIG9mIGVhY2ggc2VsZWN0ZWQgZ2VuZSBpbiB2aWV3IChzZWUgTmFwYXJpU3BhdGlhbFRpbGVMYXllcnMuZ2VuZUNvdW50c0luKS4gKi9cbiAgcmVhZG9ubHkgZ2VuZUNvdW50c0luVmlldyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFJlY29yZDxzdHJpbmcsIG51bWJlcj4gfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgZGVuc2l0eVN0YXRzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8eyBsbzogbnVtYmVyOyBoaTogbnVtYmVyOyBtYXg6IG51bWJlciB9IHwgbnVsbD4obnVsbCk7XG4gIC8qKiBcInggcmVsb2FkaW5n4oCmXCIgYXQgdGhlIGJvdHRvbSBvZiB0aGUgY2FudmFzOiB0aGUgdGlsZSBsYXllcnMnIGxvYWRzIGFuZCB0aGUgb2JzZXJ2YXRpb25zJy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBiYWRnZSA9IG5ldyBMb2FkaW5nQmFkZ2VTdGF0ZSgpO1xuICAvKiogVGhlIHN0b3JlJ3MgZGlzcGxheSBzdGF0ZSAoY29sb3JtYXAsIHJldmVyc2UsIGludmVydCkgYW5kIHRoZSBjb2xvcm1hcHMgZGVyaXZlZCBmcm9tIGl0LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGRpc3BsYXk6IE5hcGFyaURpc3BsYXlTdGF0ZTtcbiAgLyoqXG4gICAqIFRoZSBtb3VudGVkIHNjZW5lJ3MgbGlmZXRpbWU6IGFib3J0ZWQgYnkge0BsaW5rIHJlc2V0fSwgc28gZXZlcnl0aGluZyBhIHBsb3Qgc3RhcnRzIOKAlCBpdHNcbiAgICogZGVzY3JpcHRvciBwb2xsLCBpdHMgdGlsZSBmZXRjaGVzLCBpdHMgYmFkZ2UgY291bnRzLCBpdHMgYXdhaXRzIOKAlCBjYW4gdGVsbCB0aGF0IGEgbmV3ZXIgcGxvdFxuICAgKiBoYXMgcmVwbGFjZWQgaXQuIEEgdGlsZSB0aGF0IHNldHRsZXMgYWZ0ZXIgYSByZXNldCBiZWxvbmdzIHRvIHRoZSBhYm9ydGVkIHNjZW5lIGFuZCBsZWF2ZXMgdGhlXG4gICAqIG5ldyBzY2VuZSdzIGNvdW50IGFsb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBsaWZldGltZSA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgLyoqIFdoYXQge0BsaW5rIHBsb3R9IG1vdW50ZWQsIHdoaWxlIGl0IGlzIG1vdW50ZWQuICovXG4gIHByaXZhdGUgc2NlbmU6IE5hcGFyaVNjZW5lIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBSZWdpb24gcmVjb25zdHJ1Y3Rpb25zIHRvIHNob3cgaW4gYSB2b2x1bWUgdmlldywga2VwdCBhY3Jvc3MgcmUtcGxvdHMgb2YgdGhlaXIgaW1hZ2UuICovXG4gIHByaXZhdGUgcmVnaW9uTWVzaGVzOiByZWFkb25seSBSZWdpb25NZXNoM0RbXSA9IFtdO1xuICAvKiogVGhlIGltYWdlIChmaWxlIG5hbWUpIHtAbGluayByZWdpb25NZXNoZXN9IHdlcmUgYnVpbHQgZnJvbS4gKi9cbiAgcHJpdmF0ZSByZWdpb25NZXNoZXNJbWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKiogVGhlIGtleXMgb2YgdGhlIHJlY29uc3RydWN0aW9ucyBoaWdobGlnaHRlZC4gKi9cbiAgcHJpdmF0ZSByZWdpb25IaWdobGlnaHQ6IHJlYWRvbmx5IHN0cmluZ1tdID0gW107XG4gIC8qKiBUaGUga2V5cyBvZiB0aGUgcmVjb25zdHJ1Y3Rpb25zIGhpZGRlbi4gKi9cbiAgcHJpdmF0ZSByZWdpb25IaWRkZW46IHJlYWRvbmx5IHN0cmluZ1tdID0gW107XG4gIC8qKiBUaGUgcGxhbmVzIG9mIHRoZSBzZWN0aW9ucyBiZXNpZGUgYSB2b2x1bWUgdmlldywgb3Igbm9uZS4gKi9cbiAgcHJpdmF0ZSBzbGljZVBsYW5lczogU2xpY2VQbGFuZXMgPSB7IHg6IG51bGwsIHk6IG51bGwsIHo6IG51bGwgfTtcbiAgLyoqIEEgc2VjdGlvbidzIHBsYW5lIGRyYWdnZWQgaW4gdGhlIHZvbHVtZSAoc2VlIHtAbGluayBnZXRTbGljZVBsYW5lTW92ZSR9KS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzbGljZVBsYW5lTW92ZSQgPSBuZXcgU3ViamVjdDx7IGF4aXM6IFBsYW5lQXhpczsgdmFsdWU6IG51bWJlciB9PigpO1xuICAvKiogQ2xpY2tzIG9uIHRoZSByZWNvbnN0cnVjdGlvbnMgKHNlZSB7QGxpbmsgZ2V0UmVnaW9uTWVzaFBpY2skfSkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnaW9uTWVzaFBpY2skID0gbmV3IFN1YmplY3Q8eyBrZXk6IHN0cmluZyB8IG51bGw7IGFkZGl0aXZlOiBib29sZWFuIH0+KCk7XG4gIC8qKiBTcGF0aWFsIHN0YXRlIHRoYXQgb3V0bGl2ZXMgYSBzY2VuZSAobGF0ZXN0IGRhdGEsIHdpbmRvd3MsIGVzdGltYXRlZCBnZW5lLW1hcCBmaWVsZHMpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNwYXRpYWw6IFNwYXRpYWxTZXNzaW9uO1xuICAvKiogVmlld2VyIHNldHRpbmdzIHRoYXQgb3V0bGl2ZSBhIHNjZW5lLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzOiBOYXBhcmlTZXR0aW5ncyA9IHtcbiAgICByZXNvbHV0aW9uU2NhbGU6IE5BUEFSSV9ERUZBVUxUX0RFQ0lNQVRFLFxuICAgIG5hdmlnYXRvclZpc2libGU6IHRydWUsXG4gICAgaW1hZ2VTbW9vdGhpbmc6IGZhbHNlLFxuICAgIGF4ZXNWaXNpYmxlOiB0cnVlLFxuICAgIHN1cmZhY2VXaXJlZnJhbWU6IGZhbHNlLFxuICAgIHZvbHVtZVpTY2FsZTogMSxcbiAgfTtcbiAgLyoqXG4gICAqIEZyYW1lIGxvYWRpbmcgKHZvbHVtZSBhc3NlbWJseSwgc3VyZmFjZSBwcmVsb2FkKTogYWJvcnRlZCBieSB7QGxpbmsgcmVzZXR9IEFORCBieVxuICAgKiB7QGxpbmsgY2FuY2VsTG9hZGluZ30sIHNvIGEgQ2FuY2VsIGFjdHVhbGx5IHN0b3BzIGZldGNoaW5nIGZyYW1lcyBpbnN0ZWFkIG9mIHJ1bm5pbmcgdG9cbiAgICogY29tcGxldGlvbiBpbiB0aGUgYmFja2dyb3VuZCwgd2hpbGUgdGhlIHNjZW5lIGl0c2VsZiBzdGF5cyBtb3VudGVkLiAoTGF0ZXN0LXdpbnMgV0lUSElOIGFcbiAgICogc2NlbmUg4oCUIGEgc2NydWIsIGEgY29sb3VyIHJlYnVpbGQsIGEgaG92ZXItc291cmNlIGZldGNoIOKAlCBpcyBlYWNoIHNjZW5lJ3Mgb3duIGJ1c2luZXNzLilcbiAgICovXG4gIHByaXZhdGUgbG9hZGluZyA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgLyoqIFRoZSBpbWFnZSdzIGZ1bGwtcmVzb2x1dGlvbiBzaXplIGFzIHRoZSBsYXN0IHNjZW5lIGRyZXcgaXQgKGl0IG91dGxpdmVzIHRoZSBzY2VuZSkuICovXG4gIHByaXZhdGUgaW1hZ2VXID0gMDtcbiAgcHJpdmF0ZSBpbWFnZUggPSAwO1xuICAvKiogVGhlIHJlZ2lvbiBvdmVybGF5LCB0aGUgcGl4ZWwgdG9vbHMgYW5kIHRoZSBkaXNwbGF5ZWQtcGl4ZWwgcmVhZGJhY2sgdGhleSByZWFkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHRvb2xzOiBOYXBhcmlUb29sQnJpZGdlO1xuICAvKiogVGhpcyBiYWNrZW5kJ3Mgb3duIHdhbmQsIGJydXNoLCBlcmFzZXIsIHpvb20tdG8tYm94IGFuZCBTQU0gcG9pbnQgdG9vbHMuICovXG4gIHByb3RlY3RlZCByZWFkb25seSBjYW52YXNUb29sczogQ2FudmFzVG9vbE1hbmFnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhY2tMb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrTG9hZGluZ1Byb2dyZXNzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhdXRvc2NhbGVFdmVudCQgPSBuZXcgU3ViamVjdDx1bmtub3duPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHZpZXdwb3J0Q2hhbmdlJCA9IG5ldyBTdWJqZWN0PHtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gIH0+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChUSUxFX0FDQ0VTU19QT1JUKSB0aWxlczogVGlsZUFjY2Vzc1BvcnQsXG4gICAgc3RvcmU6IFZpc3VhbGl6ZXJTdG9yZSxcbiAgICByZWdpb25TdG9yZTogUmVnaW9uU3RvcmUsXG4gICAgd2FuZFNlcnZpY2U6IFdhbmRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2FtVG9vbDogU2FtVG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzYW1Qb2ludFRvb2w6IFNhbVBvaW50VG9vbFNlcnZpY2UsXG4gICAgY2VsbFNlZ21lbnRUb29sOiBDZWxsU2VnbWVudFRvb2xTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQ0VMTF9TRUdNRU5URVIpIGNlbGxTZWdtZW50ZXI6IElDZWxsU2VnbWVudGVyIHwgbnVsbCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNpbXBsZVN0YWNrOiBTaW1wbGVTbGljZUFjY2Vzc1NlcnZpY2UsXG4gICAgQEluamVjdChWSVpfQ09ORklHKSBjb25maWc6IFZpekNvbmZpZyxcbiAgICAvLyBPcHRpb25hbDogb25seSBhIGhvc3QgdGhhdCBzZXJ2ZXMgc3BhdGlhbC1vbWljcyBkYXRhIHByb3ZpZGVzIGl0LCBhbmRcbiAgICAvLyB3aXRob3V0IGl0IHRoZSBTUEFUSUFMX09NSUNTIHBsb3QgdHlwZSBpcyBuZXZlciBvZmZlcmVkIGFueXdheS5cbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFNQQVRJQUxfREFUQV9QT1JUKSBzcGF0aWFsRGF0YTogU3BhdGlhbERhdGFQb3J0IHwgbnVsbCA9IG51bGwsXG4gICAgc2VsZWN0aW9uU3RvcmU6IFNwYXRpYWxTZWxlY3Rpb25TdG9yZSB8IG51bGwgPSBudWxsLFxuICApIHtcbiAgICBzdXBlcihyZWdpb25TdG9yZSwgc3RvcmUpO1xuICAgIHRoaXMudGlsZUNsaWVudCA9IG5ldyBOYXBhcmlUaWxlQ2xpZW50KHRpbGVzLCBzaW1wbGVTdGFjaywgY29uZmlnLnNsaWRlQ3JvcFNlcnZlcik7XG4gICAgdGhpcy50aWxlQ2xpZW50LnN0YXJ0U2NlbmUodGhpcy5saWZldGltZS5zaWduYWwpO1xuICAgIHRoaXMuZGlzcGxheSA9IG5ldyBOYXBhcmlEaXNwbGF5U3RhdGUoc3RvcmUpO1xuICAgIHRoaXMuc3BhdGlhbCA9IG5ldyBTcGF0aWFsU2Vzc2lvbihzcGF0aWFsRGF0YSwgc2VsZWN0aW9uU3RvcmUsIHtcbiAgICAgIGNvbnRpbnVvdXNMdXQ6ICh2aWV3KSA9PiB0aGlzLmRpc3BsYXkuc3BhdGlhbEx1dCh2aWV3KSxcbiAgICAgIC8vIFRoZXNlIGZvbGxvdyB0aGUgY2FtZXJhLCB3aGljaCBtb3ZlcyBvdXRzaWRlIHRoZSB6b25lOyB0aGUgcGFuZWwgcmVhZHMgdGhlbS5cbiAgICAgIGVzdGltYXRlQ2hhbmdlZDogKGUpID0+IHRoaXMuaW5ab25lKCgpID0+IHRoaXMudHJhbnNjcmlwdEVzdGltYXRlJC5uZXh0KGUpKSxcbiAgICAgIGdlbmVDb3VudHNDaGFuZ2VkOiAoYykgPT4gdGhpcy5pblpvbmUoKCkgPT4gdGhpcy5nZW5lQ291bnRzSW5WaWV3JC5uZXh0KGMpKSxcbiAgICAgIGRlbnNpdHlDaGFuZ2VkOiAoZCkgPT4gdGhpcy5pblpvbmUoKCkgPT4gdGhpcy5kZW5zaXR5U3RhdHMkLm5leHQoZCkpLFxuICAgICAgbG9hZGluZ0NoYW5nZWQ6IChsYXllcnMpID0+IHRoaXMuYmFkZ2Uuc2V0VGlsZUxheWVycyhsYXllcnMpLFxuICAgIH0pO1xuICAgIHRoaXMudG9vbHMgPSBuZXcgTmFwYXJpVG9vbEJyaWRnZShcbiAgICAgIHtcbiAgICAgICAgdmlld2VyOiAoKSA9PiB0aGlzLnZpZXdlcixcbiAgICAgICAgaG9zdDogKCkgPT4gdGhpcy5ob3N0LFxuICAgICAgICBjYW52YXM6ICgpID0+IHRoaXMuY2FudmFzLFxuICAgICAgICBpbWFnZVNpemU6ICgpID0+IHRoaXMuZ2V0VHJ1ZUltYWdlU2l6ZSgpLFxuICAgICAgICBmcmFtZUluZGV4OiAoKSA9PiB0aGlzLmxvYWRlZD8ueiA/PyAwLFxuICAgICAgICBmaWxlTmFtZTogKCkgPT4gdGhpcy5sb2FkZWQ/LmZpbGVuYW1lLFxuICAgICAgICAvLyBSZWFjaGVkIGZyb20gdGltZXJzIGFybWVkIG91dHNpZGUgdGhlIHpvbmU7IHN1YnNjcmliZXJzIGFyZSBVSS5cbiAgICAgICAgdmlld3BvcnRDaGFuZ2VkOiAocmVjdCkgPT4gdGhpcy5pblpvbmUoKCkgPT4gdGhpcy52aWV3cG9ydENoYW5nZSQubmV4dChyZWN0KSksXG4gICAgICAgIG91dHNpZGVab25lOiAoZm4pID0+IHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcihmbiksXG4gICAgICAgIGluWm9uZTogKGZuKSA9PiB0aGlzLmluWm9uZShmbiksXG4gICAgICB9LFxuICAgICAgeyByZWdpb25TdG9yZSwgd2FuZFNlcnZpY2UsIHNhbVRvb2wsIHNhbVBvaW50VG9vbCwgY2VsbFNlZ21lbnRUb29sLCBjZWxsU2VnbWVudGVyIH0sXG4gICAgKTtcbiAgICB0aGlzLmNhbnZhc1Rvb2xzID0gdGhpcy50b29scy5jYW52YXNUb29scztcbiAgfVxuXG4gIC8qKiBSdW4gYGZuYCBpbnNpZGUgdGhlIEFuZ3VsYXIgem9uZTogZm9yIG91dHB1dCAoc3ViamVjdHMgdGhlIFVJIHJlbmRlcnMsIHN0b3JlIHdyaXRlcylcbiAgICogIHByb2R1Y2VkIGJ5IHdvcmsgdGhhdCBydW5zIG91dHNpZGUgaXQuICovXG4gIHByaXZhdGUgaW5ab25lPFQ+KGZuOiAoKSA9PiBUKTogVCB7XG4gICAgcmV0dXJuIE5nWm9uZS5pc0luQW5ndWxhclpvbmUoKSA/IGZuKCkgOiB0aGlzLnpvbmUucnVuKGZuKTtcbiAgfVxuXG4gIC8qKiBXaGF0IGEgc2NlbmUgaXMgYnVpbHQgZnJvbSAoc2VlIHtAbGluayBTY2VuZUNvbnRleHR9KS4gKi9cbiAgcHJpdmF0ZSBzY2VuZUNvbnRleHQodmlld2VyOiBWaWV3ZXIsIGhvc3Q6IEhUTUxFbGVtZW50LCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50KTogU2NlbmVDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgdmlld2VyLFxuICAgICAgaG9zdCxcbiAgICAgIGNhbnZhcyxcbiAgICAgIHNpZ25hbDogdGhpcy5saWZldGltZS5zaWduYWwsXG4gICAgICBsb2FkaW5nOiAoKSA9PiB0aGlzLmxvYWRpbmcuc2lnbmFsLFxuICAgICAgaW5mbzogKCkgPT4gdGhpcy5sb2FkZWQ/LmltYWdlSW5mbyxcbiAgICAgIHo6ICgpID0+IHRoaXMubG9hZGVkPy56ID8/IDAsXG4gICAgICB0aWxlczogdGhpcy50aWxlQ2xpZW50LFxuICAgICAgZGlzcGxheTogdGhpcy5kaXNwbGF5LFxuICAgICAgYmFkZ2U6IHRoaXMuYmFkZ2UsXG4gICAgICB0b29sczogdGhpcy50b29scyxcbiAgICAgIHN0b3JlOiB0aGlzLnN0b3JlLFxuICAgICAgcmVnaW9uU3RvcmU6IHRoaXMucmVnaW9uU3RvcmUsXG4gICAgICBzZXR0aW5nczogdGhpcy5zZXR0aW5ncyxcbiAgICAgIHN0YWNrOiB7XG4gICAgICAgIGxvYWRpbmc6IChvbikgPT4gdGhpcy5zdGFja0xvYWRpbmckLm5leHQob24pLFxuICAgICAgICBwcm9ncmVzczogKHBlcmNlbnQpID0+IHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLm5leHQocGVyY2VudCksXG4gICAgICB9LFxuICAgICAgaW1hZ2VTaXplOiAoKSA9PiAoeyB3aWR0aDogdGhpcy5pbWFnZVcsIGhlaWdodDogdGhpcy5pbWFnZUggfSksXG4gICAgICBzZXRJbWFnZVNpemU6ICh3aWR0aCwgaGVpZ2h0KSA9PiB7XG4gICAgICAgIHRoaXMuaW1hZ2VXID0gd2lkdGg7XG4gICAgICAgIHRoaXMuaW1hZ2VIID0gaGVpZ2h0O1xuICAgICAgfSxcbiAgICAgIGZpdENhbWVyYVNvb246ICgpID0+IHRoaXMuZml0Q2FtZXJhU29vbigpLFxuICAgICAgb3V0c2lkZVpvbmU6IChmbikgPT4gdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKGZuKSxcbiAgICAgIGluWm9uZTogKGZuKSA9PiB0aGlzLmluWm9uZShmbiksXG4gICAgICByZWdpb25NZXNoUGlja2VkOiAoa2V5LCBhZGRpdGl2ZSkgPT4gdGhpcy5yZWdpb25NZXNoUGljayQubmV4dCh7IGtleSwgYWRkaXRpdmUgfSksXG4gICAgICBzbGljZVBsYW5lTW92ZWQ6IChheGlzLCB2YWx1ZSkgPT4gdGhpcy5zbGljZVBsYW5lTW92ZSQubmV4dCh7IGF4aXMsIHZhbHVlIH0pLFxuICAgIH07XG4gIH1cblxuICAvLyDilIDilIAgSURhdGFSZW5kZXJlcjogbG9hZCAvIHJlbmRlciAvIHZpZXdwb3J0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvKipcbiAgICogUmVjb3JkIHRoZSBpbWFnZSB0byBkcmF3LiBObyBuZXR3b3JrIHdvcmsgaGFwcGVucyBoZXJlIOKAlCB0aGUgZGVzY3JpcHRvciBwb2xsIGFuZCB0aGUgdGlsZSxcbiAgICogdm9sdW1lIGFuZCBzcGF0aWFsIGZldGNoZXMgYWxsIHJ1biBpbiB7QGxpbmsgcGxvdH0gdW5kZXIgaXRzIHNjZW5lIHNpZ25hbCwgd2hpY2ggYSBuZXdlciBwbG90LFxuICAgKiB7QGxpbmsgcmVzZXR9IG9yIGBjYW5jZWxMb2FkaW5nKClgIGFib3J0cyDigJQgc28gYHNpZ25hbGAgaXMgb25seSBjaGVja2VkOiBhbiBhbHJlYWR5LWFib3J0ZWRcbiAgICogbG9hZCByZWplY3RzIHdpdGggYW4gYEFib3J0RXJyb3JgIGFuZCBsZWF2ZXMgdGhlIHJlY29yZGVkIGltYWdlIGFsb25lLlxuICAgKi9cbiAgYXN5bmMgbG9hZChpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8TmFwYXJpTG9hZGVkPiB7XG4gICAgdGhyb3dJZkFib3J0ZWQoc2lnbmFsKTtcbiAgICAvLyBLZWVwcyBTaW1wbGVTbGljZUFjY2Vzc1NlcnZpY2UncyBibG9iIGNhY2hlIGluIHN5bmMgZXZlbiB3aGVuIHRoZSB1c2VyXG4gICAgLy8gc3dpdGNoZXMgYmFja2VuZHMgKGUuZy4gT1NEIEltYWdlIOKGkiBuYXBhcmkgVm9sdW1lKSBvbiB0aGUgc2FtZSBmaWxlIOKAlFxuICAgIC8vIHdoaWNoZXZlciBiYWNrZW5kIGxvYWRzIGEgZ2VudWluZWx5IGRpZmZlcmVudCBmaWxlIGZpcnN0IGV2aWN0cyBpdC5cbiAgICB0aGlzLnNpbXBsZVN0YWNrLm5vdGVBY3RpdmVGaWxlKGltYWdlSW5mby5maWxlTmFtZSk7XG4gICAgdGhpcy5sb2FkZWQgPSB7IGltYWdlSW5mbywgejogekluZGV4LCBmaWxlbmFtZTogaW1hZ2VJbmZvLmZpbGVOYW1lIH07XG4gICAgcmV0dXJuIHRoaXMubG9hZGVkO1xuICB9XG5cbiAgYXN5bmMgcGxvdChcbiAgICBwbG90RGl2OiBzdHJpbmcsXG4gICAgaW1hZ2VMb2FkZWQ6IHVua25vd24sXG4gICAgaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLFxuICAgIHNjcmVlbkhlaWdodDogbnVtYmVyLFxuICAgIHBsb3RUeXBlOiBQbG90VHlwZSxcbiAgICBpblBsYWNlPzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgaG9zdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBsb3REaXYpO1xuICAgIGlmICghaG9zdCkge1xuICAgICAgY29uc29sZS5lcnJvcihgW25hcGFyaS1qc10gcGxvdCB0YXJnZXQgIyR7cGxvdERpdn0gbm90IGZvdW5kYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMucmVzZXQoKTtcbiAgICAvLyBBIG5ldyBpbWFnZTogYSBzdHJva2Ugb3IgU0FNIHByb21wdCBpbiBwcm9ncmVzcyBiZWxvbmdlZCB0byB0aGUgb2xkIG9uZS5cbiAgICBpZiAoIWluUGxhY2UpIHRoaXMuY2FudmFzVG9vbHMucmVzZXRBbGwoKTtcbiAgICAvLyBUaGlzIHBsb3QncyBzY2VuZS4gQSBuZXdlciBwbG90IHJlc2V0cyBpbnRvIHRoZSBuZXh0IG9uZSB3aGlsZSB0aGlzIG9uZSBzdGlsbCBhd2FpdHMsIGFuZFxuICAgIC8vIGEgc3VwZXJzZWRlZCBwbG90IG11c3Qgbm90IGdvIG9uIHRvIGRyYXcgKG9yIGNvdW50IGltYWdlIHRpbGVzKSBpbnRvIHRoZSBuZXdlciBzY2VuZS5cbiAgICBjb25zdCBzY2VuZSA9IHRoaXMubGlmZXRpbWUuc2lnbmFsO1xuICAgIHRoaXMuaG9zdCA9IGhvc3Q7XG4gICAgdGhpcy5iYWRnZS5hdHRhY2goaG9zdCk7XG5cbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgY2FudmFzLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgIGNhbnZhcy5zdHlsZS5oZWlnaHQgPSBzY3JlZW5IZWlnaHQgPyBgJHtzY3JlZW5IZWlnaHR9cHhgIDogJzEwMCUnO1xuICAgIGhvc3QuYXBwZW5kQ2hpbGQoY2FudmFzKTtcbiAgICB0aGlzLmNhbnZhcyA9IGNhbnZhcztcblxuICAgIGNvbnN0IGluZm8gPSAoaW1hZ2VMb2FkZWQgYXMgTmFwYXJpTG9hZGVkKT8uaW1hZ2VJbmZvID8/IGltYWdlSW5mbztcblxuICAgIHRyeSB7XG4gICAgICAvLyBCdWlsdCBPVVRTSURFIHRoZSBBbmd1bGFyIHpvbmUsIHNvIGl0cyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgbG9vcCwgaXRzIGNhbnZhcyBwb2ludGVyIC9cbiAgICAgIC8vIHdoZWVsIGxpc3RlbmVycyBhbmQgaXRzIFJlc2l6ZU9ic2VydmVyIGRvIG5vdCBlYWNoIHRyaWdnZXIgYXBwLXdpZGUgY2hhbmdlIGRldGVjdGlvbi5cbiAgICAgIC8vIFdoYXRldmVyIHRoZXkgY2F1c2UgdGhhdCB0aGUgVUkgc2hvd3MgcmUtZW50ZXJzIHRoZSB6b25lIChzZWUgaW5ab25lKS5cbiAgICAgIGNvbnN0IHZpZXdlciA9IHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcihcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBuZXcgVmlld2VyKHtcbiAgICAgICAgICAgIGNhbnZhcyxcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IHsgcjogMC4wNywgZzogMC4wNywgYjogMC4wOSwgYTogMSB9LFxuICAgICAgICAgICAgLy8gU2V0IGhlcmUgcmF0aGVyIHRoYW4gbGVmdCB0byBuYXBhcmktanMncyBvd24gZGVmYXVsdCBzbyB0aGUgZ2VudGxlclxuICAgICAgICAgICAgLy8gc3RlcCBhcHBsaWVzIHdpdGggdGhlIHZlcnNpb24gY3VycmVudGx5IGluc3RhbGxlZC4gQ2hvc2VuIHRvIG1hdGNoIHRoZVxuICAgICAgICAgICAgLy8gT1NEIGJhY2tlbmQncyBzdGVwIChzZWUgT1NEX1pPT01fUEVSX1NDUk9MTCk6IHRoZSB3aGVlbCBzaG91bGQgZmVlbCB0aGVcbiAgICAgICAgICAgIC8vIHNhbWUgb24gYW4gaW1hZ2Ugd2hpY2hldmVyIHJlbmRlcmVyIGlzIGRyYXdpbmcgaXQuIFRoZSBzdGVwIGFwcGxpZXMgcGVyXG4gICAgICAgICAgICAvLyBzY3JvbGwgRVZFTlQsIGFuZCBhIHRyYWNrcGFkIHNlbmRzIGEgYnVyc3Qgb2YgdGhlbSBwZXIgc3dpcGUsIHNvIGEgc3RlcFxuICAgICAgICAgICAgLy8gdHVuZWQgdG8gYSBtb3VzZSBub3RjaCBydW5zIGF3YXkgdW5kZXIgYSB0cmFja3BhZC5cbiAgICAgICAgICAgIHdoZWVsWm9vbVNwZWVkOiBOQVBBUklfV0hFRUxfWk9PTV9TUEVFRCxcbiAgICAgICAgICAgIC8vIFRoZSBGSVJTVCAzRCBsYXllciBvZiBhIHNjZW5lIGZyYW1lcyB0aGUgb3JiaXQgY2FtZXJhOyBldmVyeSBsYXRlciBvbmUgbGVhdmVzIHRoZVxuICAgICAgICAgICAgLy8gcG9zZSBhbG9uZS4gQSBzcGF0aWFsIHNjZW5lIGlzIGJ1aWx0IGZyb20gc2V2ZXJhbCBsYXllcnMgYW5kIHJlYnVpbHQgY29uc3RhbnRseSDigJRcbiAgICAgICAgICAgIC8vIHJlY29sb3VyaW5nIGJ5IGEgY2xhc3MsIHBpY2tpbmcgYSBnZW5lLCBzdGVwcGluZyBhIHNlY3Rpb24g4oCUIGFuZCB3aXRoIG5hcGFyaS1qcydzXG4gICAgICAgICAgICAvLyBwcmV2aW91cyB1bmNvbmRpdGlvbmFsIGZyYW1pbmcgZWFjaCBvZiB0aG9zZSB0aHJldyBhd2F5IGFuIG9yYml0IHRoZSB1c2VyIGhhZCBzZXQuXG4gICAgICAgICAgICAvLyBUaGUgcG9zZSBpdCBzbmFwcGVkIGJhY2sgdG8gZGVwZW5kZWQgb24gV0hJQ0ggbGF5ZXIgd2FzIHJlYnVpbHQsIHNvIGlzb2xhdGluZyBvbmVcbiAgICAgICAgICAgIC8vIHNlY3Rpb24gem9vbWVkIHRvIHRoYXQgc2VjdGlvbidzIGJvdW5kcy4gYHJlc2V0Rml0M0QoKWAgb24gYSBkYXRhc2V0IGNoYW5nZSBpcyB3aGF0XG4gICAgICAgICAgICAvLyBsZXRzIHRoZSBuZXh0IHNjZW5lIGZyYW1lIGl0c2VsZi5cbiAgICAgICAgICAgIGZpdDNkOiAnb25jZScsXG4gICAgICAgICAgICAvLyBJbiB0aGUgc3BhdGlhbCBtb2RlcyBhIHBsYWluIGNsaWNrIFNFTEVDVFMgdGhlIGNsYXNzIHVuZGVyIHRoZSBjdXJzb3IsXG4gICAgICAgICAgICAvLyBzbyBuYXBhcmkncyBPU0Qtc3R5bGUgY2xpY2stdG8tem9vbSBpcyB0dXJuZWQgb2ZmIHRoZXJlOiBvdGhlcndpc2Ugb25lXG4gICAgICAgICAgICAvLyBjbGljayB3b3VsZCBib3RoIHNlbGVjdCBhIGNsYXNzIGFuZCB6b29tIDJ4IGFib3V0IHRoZSBjdXJzb3IsIGFuZCB0aGVcbiAgICAgICAgICAgIC8vIHpvb20gd291bGQgdGhlbiBoYWx2ZSB0aGUgcGl4ZWwgcmFkaXVzIHRoZSBuZXh0IGNsaWNrIGhpdC10ZXN0cyB3aXRoLlxuICAgICAgICAgICAgLy8gWm9vbWluZyBpcyBzdGlsbCBvbiB0aGUgd2hlZWwsIHRoZSB6b29tIGJ1dHRvbnMgYW5kIHRoZSB6b29tLWJveCB0b29sLlxuICAgICAgICAgICAgLi4uKGlzU3BhdGlhbE9taWNzKHBsb3RUeXBlKSB8fCBpc1NwYXRpYWxPbWljczNkKHBsb3RUeXBlKSA/IHsgY2xpY2tab29tRmFjdG9yOiAwIH0gOiB7fSksXG4gICAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXI7XG4gICAgICBhd2FpdCB2aWV3ZXIucmVhZHk7XG4gICAgICBpZiAoc2NlbmUuYWJvcnRlZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBObyBsb2FkZWQgaW1hZ2U6IGFuIGltYWdlLWxlc3Mgc3BhdGlhbCBkYXRhc2V0IG9wZW5lZCBiZWZvcmUgYW55IGltYWdlICh0aGUgdmlzdWFsaXplcidzXG4gICAgICAvLyBwbG90U3BhdGlhbFdpdGhvdXRJbWFnZSkg4oCUIHRoZSBvYnNlcnZhdGlvbnMgYWxvbmUuXG4gICAgICB0aGlzLnNjZW5lID0gdGhpcy5jcmVhdGVTY2VuZShwbG90VHlwZSwgdGhpcy5zY2VuZUNvbnRleHQodmlld2VyLCBob3N0LCBjYW52YXMpLCBpbmZvLCBpbWFnZUxvYWRlZCA9PSBudWxsKTtcbiAgICAgIC8vIEFub3RoZXIgaW1hZ2UncyBzdXJmYWNlcyB3b3VsZCBsYW5kIGluIHRoaXMgdm9sdW1lJ3MgZnJhbWUgYXQgdGhlIHdyb25nIHNpemU6IGRyb3AgdGhlbS5cbiAgICAgIGlmIChpbmZvPy5maWxlTmFtZSAhPT0gdGhpcy5yZWdpb25NZXNoZXNJbWFnZSkgdGhpcy5yZWdpb25NZXNoZXMgPSBbXTtcbiAgICAgIHRoaXMuc2NlbmUuc2V0UmVnaW9uTWVzaGVzPy4odGhpcy5yZWdpb25NZXNoZXMpO1xuICAgICAgdGhpcy5zY2VuZS5zZXRSZWdpb25IaWdobGlnaHQ/Lih0aGlzLnJlZ2lvbkhpZ2hsaWdodCk7XG4gICAgICB0aGlzLnNjZW5lLnNldFJlZ2lvbkhpZGRlbj8uKHRoaXMucmVnaW9uSGlkZGVuKTtcbiAgICAgIHRoaXMuc2NlbmUuc2V0UmVnaW9uc1Rocm91Z2hWb2x1bWU/Lih0aGlzLnJlZ2lvbnNUaHJvdWdoVm9sdW1lKTtcbiAgICAgIHRoaXMuc2NlbmUuc2V0U2xpY2VQbGFuZXM/Lih0aGlzLnNsaWNlUGxhbmVzKTtcbiAgICAgIGF3YWl0IHRoaXMuc2NlbmUubW91bnQoKTtcbiAgICAgIHRoaXMudG9vbHMuc2NoZWR1bGVSZWFkYmFjaygpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbbmFwYXJpLWpzXSBwbG90IGZhaWxlZDonLCBlcnIpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgc2NlbmUgYSBwbG90IHR5cGUgbW91bnRzLiAqL1xuICBwcml2YXRlIGNyZWF0ZVNjZW5lKFxuICAgIHBsb3RUeXBlOiBQbG90VHlwZSxcbiAgICBjdHg6IFNjZW5lQ29udGV4dCxcbiAgICBpbmZvOiBJSW1hZ2VJbmZvIHwgdW5kZWZpbmVkLFxuICAgIG5vSW1hZ2U6IGJvb2xlYW4sXG4gICk6IE5hcGFyaVNjZW5lIHtcbiAgICBpZiAoaXNTcGF0aWFsT21pY3MzZChwbG90VHlwZSkpIHJldHVybiBuZXcgU3BhdGlhbDNkU2NlbmUoY3R4LCB0aGlzLnNwYXRpYWwpO1xuICAgIGlmIChpc1NwYXRpYWxPbWljcyhwbG90VHlwZSkpIHJldHVybiBuZXcgU3BhdGlhbDJkU2NlbmUoY3R4LCB0aGlzLnNwYXRpYWwsIG5vSW1hZ2UpO1xuICAgIGlmIChpc05hcGFyaVNjYXR0ZXIocGxvdFR5cGUpKSByZXR1cm4gbmV3IFNjYXR0ZXJSZWdpb25zU2NlbmUoY3R4KTtcbiAgICBpZiAoaXNOYXBhcmlTY2F0dGVyM2QocGxvdFR5cGUpKSByZXR1cm4gbmV3IFNjYXR0ZXIzZFNjZW5lKGN0eCwgaW5mbyk7XG4gICAgaWYgKGlzTmFwYXJpU3VyZmFjZShwbG90VHlwZSkpIHJldHVybiBuZXcgU3VyZmFjZVNjZW5lKGN0eCk7XG4gICAgaWYgKGlzTmFwYXJpM2QocGxvdFR5cGUpKSByZXR1cm4gbmV3IFZvbHVtZVNjZW5lKGN0eCwgaW5mbywgaXNOYXBhcmlJc29zdXJmYWNlKHBsb3RUeXBlKSA/ICdpc28nIDogJ21pcCcpO1xuICAgIHJldHVybiBuZXcgSW1hZ2UyZFNjZW5lKGN0eCk7XG4gIH1cblxuICAvKiogU2hvdy9oaWRlIHRoZSBvdmVydmlldyBuYXZpZ2F0b3IgKHNhbWUgc2V0dGluZyBhcyBPU0QncykuICovXG4gIHNldE5hdmlnYXRvclZpc2libGUodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2V0dGluZ3MubmF2aWdhdG9yVmlzaWJsZSA9IHZpc2libGU7XG4gICAgdGhpcy5zY2VuZT8uc2V0TmF2aWdhdG9yVmlzaWJsZT8uKHZpc2libGUpO1xuICB9XG5cbiAgLyoqIE9ic2VydmF0aW9ucyBwcm9qZWN0ZWQgdG8gY2FudmFzIHBpeGVscyB1bmRlciB0aGUgM0QgY2FtZXJhICh0aGUgc3BhdGlhbCAzRCBjbG91ZCksIGluZGV4ZWRcbiAgICogIGJ5IG9ic2VydmF0aW9uIHdpdGggTmFOIGZvciBhbnkgbm90IGRyYXduOyBudWxsIHdoZW4gbm8gY2xvdWQgaXMgbW91bnRlZC4gKi9cbiAgZ2V0U3BhdGlhbFNjcmVlblByb2plY3Rpb24ob2JzOiBTcGF0aWFsT2JzZXJ2YXRpb25zKTogRmxvYXQzMkFycmF5IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc2NlbmU/LnNjcmVlblByb2plY3Rpb24/LihvYnMpID8/IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGZpdENhbWVyYVNvb24oKTogdm9pZCB7XG4gICAgY29uc3QgcnVuID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHRoaXMudmlld2VyICYmIHRoaXMuY2FudmFzICYmIHRoaXMuaW1hZ2VXID4gMCAmJiB0aGlzLmltYWdlSCA+IDApIHtcbiAgICAgICAgdGhpcy52aWV3ZXIuY2FtZXJhLmZpdChcbiAgICAgICAgICB0aGlzLmltYWdlVyxcbiAgICAgICAgICB0aGlzLmltYWdlSCxcbiAgICAgICAgICB0aGlzLmNhbnZhcy5jbGllbnRXaWR0aCB8fCB0aGlzLmltYWdlVyxcbiAgICAgICAgICB0aGlzLmNhbnZhcy5jbGllbnRIZWlnaHQgfHwgdGhpcy5pbWFnZUgsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAodHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZShydW4pKTtcbiAgICBlbHNlIHJ1bigpO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIFBsb3RseS1zcGVjaWZpYzsgaG9zdCByZS1kcml2ZXMgcGxvdCgpIGZyb20gaXRzIGltYWdlIHN0cmVhbS4gKi9cbiAgcmVsb2FkQW5kUGxvdCgpOiB2b2lkIHtcbiAgICAvKiBuby1vcCAqL1xuICB9XG5cbiAgLyoqIFNob3cgYG1lc3NhZ2VgIG9uIHRoZSBjYW52YXMncyBsb2FkaW5nIGJhZGdlIHVudGlsIHRoZSByZXR1cm5lZCBmdW5jdGlvbiBpcyBjYWxsZWQuICovXG4gIGJlZ2luVGFzayhtZXNzYWdlOiBzdHJpbmcpOiAoKSA9PiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5iYWRnZS5iZWdpblRhc2sobWVzc2FnZSk7XG4gIH1cblxuICAvKiogU2hvdyB0aGVzZSByZWdpb24gcmVjb25zdHJ1Y3Rpb25zIG9mIGBpbWFnZWAgaW4gdGhlIHZvbHVtZSB2aWV3IChrZXB0IGZvciBpdHMgbmV4dCB2b2x1bWUgcGxvdCkuICovXG4gIHNldFJlZ2lvbk1lc2hlcyhtZXNoZXM6IHJlYWRvbmx5IFJlZ2lvbk1lc2gzRFtdLCBpbWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25NZXNoZXMgPSBtZXNoZXM7XG4gICAgdGhpcy5yZWdpb25NZXNoZXNJbWFnZSA9IGltYWdlO1xuICAgIHRoaXMuc2NlbmU/LnNldFJlZ2lvbk1lc2hlcz8uKG1lc2hlcyk7XG4gIH1cblxuICAvKiogSGlnaGxpZ2h0IHRoZSByZWNvbnN0cnVjdGlvbnMgb2YgdGhlc2Uga2V5cyAobm9uZTogYWxsIGFzIHVzdWFsKS4gKi9cbiAgc2V0UmVnaW9uSGlnaGxpZ2h0KGtleXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25IaWdobGlnaHQgPSBrZXlzO1xuICAgIHRoaXMuc2NlbmU/LnNldFJlZ2lvbkhpZ2hsaWdodD8uKGtleXMpO1xuICB9XG5cbiAgLyoqIEhpZGUgdGhlIHJlY29uc3RydWN0aW9ucyBvZiB0aGVzZSBrZXlzIChrZXB0IGZvciB0aGUgbmV4dCB2b2x1bWUgcGxvdCkuICovXG4gIHNldFJlZ2lvbkhpZGRlbihrZXlzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uSGlkZGVuID0ga2V5cztcbiAgICB0aGlzLnNjZW5lPy5zZXRSZWdpb25IaWRkZW4/LihrZXlzKTtcbiAgfVxuXG4gIC8qKiBEcmF3IHRoZSByZWNvbnN0cnVjdGlvbnMgdGhyb3VnaCB0aGUgdm9sdW1lIHJhdGhlciB0aGFuIGhpZGRlbiBiZWhpbmQgaXQgKGtlcHQgYWNyb3NzIHBsb3RzKS4gKi9cbiAgc2V0UmVnaW9uc1Rocm91Z2hWb2x1bWUodGhyb3VnaDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uc1Rocm91Z2hWb2x1bWUgPSB0aHJvdWdoO1xuICAgIHRoaXMuc2NlbmU/LnNldFJlZ2lvbnNUaHJvdWdoVm9sdW1lPy4odGhyb3VnaCk7XG4gIH1cbiAgcHJpdmF0ZSByZWdpb25zVGhyb3VnaFZvbHVtZSA9IGZhbHNlO1xuXG4gIC8qKiBTaG93IHRoZSBwbGFuZXMgb2YgdGhlIHNlY3Rpb25zIGJlc2lkZSBhIHZvbHVtZSB2aWV3IChudWxsOiBoaWRlIG9uZSk7IGtlcHQgYWNyb3NzIHBsb3RzLiAqL1xuICBzZXRTbGljZVBsYW5lcyhwbGFuZXM6IFNsaWNlUGxhbmVzKTogdm9pZCB7XG4gICAgdGhpcy5zbGljZVBsYW5lcyA9IHBsYW5lcztcbiAgICB0aGlzLnNjZW5lPy5zZXRTbGljZVBsYW5lcz8uKHBsYW5lcyk7XG4gIH1cblxuICAvKiogQSBzZWN0aW9uJ3MgcGxhbmUgZHJhZ2dlZCBpbiB0aGUgdm9sdW1lIHZpZXcsIHRvIGB2YWx1ZWAgYWxvbmcgaXRzIGF4aXMgKGltYWdlIHB4LCBvciBhIHNsaWNlKS4gKi9cbiAgZ2V0U2xpY2VQbGFuZU1vdmUkKCk6IE9ic2VydmFibGU8eyBheGlzOiBQbGFuZUF4aXM7IHZhbHVlOiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLnNsaWNlUGxhbmVNb3ZlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKiBUaGUgdm9sdW1lIG9uIHNjcmVlbiwgYXMgYXNzZW1ibGVkIChzZWUgVm9sdW1lU2NlbmUudm9sdW1lVm94ZWxzKTsgbnVsbCBvdXRzaWRlIGEgdm9sdW1lIHZpZXcuICovXG4gIHZvbHVtZVZveGVscygpOiBWb2x1bWVWb3hlbHNPblNjcmVlbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnNjZW5lPy52b2x1bWVWb3hlbHM/LigpID8/IG51bGw7XG4gIH1cblxuICAvKiogQSByZWNvbnN0cnVjdGlvbiBjbGlja2VkIHdpdGggdGhlIHNlbGVjdGlvbiB0b29sIChpdHMga2V5KSwgb3IgdGhlIHZvbHVtZSBiZXNpZGUgdGhlbSAobnVsbCkuICovXG4gIGdldFJlZ2lvbk1lc2hQaWNrJCgpOiBPYnNlcnZhYmxlPHsga2V5OiBzdHJpbmcgfCBudWxsOyBhZGRpdGl2ZTogYm9vbGVhbiB9PiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uTWVzaFBpY2skLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqIEltYWdlIHB4IHBlciB2b3hlbCBvZiB0aGUgdm9sdW1lIG9uIHNjcmVlbiwgaW4tcGxhbmU7IG51bGwgb3V0c2lkZSBhIHZvbHVtZSB2aWV3LiAqL1xuICByZWdpb25Wb3hlbFN0ZXAoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc2NlbmU/LnZveGVsU3RlcD8uKCkgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmQgdGhlIG1vdW50ZWQgc2NlbmU6IGFib3J0IGl0cyBsaWZldGltZSAoaXRzIGRlc2NyaXB0b3IgcG9sbCwgdGlsZSBjb3VudHMsIGZyYW1lIGxvYWRpbmcgYW5kXG4gICAqIGF3YWl0cykgYW5kIGRpc3Bvc2UgaXQg4oCUIGl0cyBsYXllcnMsIGtleXMsIHN1YnNjcmlwdGlvbnMgYW5kIGxpc3RlbmVycyBnbyB3aXRoIGl0LCBzbyB0aGUgbmV4dFxuICAgKiBwbG90IGNhbiBuZXZlciBpbmhlcml0IGFuIFwiYWxyZWFkeSBidWlsdFwiIGtleSAoTkFQQVJJLVNWQy0xKSDigJQgdGhlbiB0ZWFyIHRoZSB2aWV3ZXIgZG93bi5cbiAgICovXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZGluZy5hYm9ydCgpO1xuICAgIHRoaXMubG9hZGluZyA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB0aGlzLmxpZmV0aW1lLmFib3J0KCk7XG4gICAgdGhpcy5saWZldGltZSA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB0aGlzLnNjZW5lPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5zY2VuZSA9IG51bGw7XG4gICAgdGhpcy5iYWRnZS5yZXNldCgpO1xuICAgIHRoaXMudG9vbHMudGVhcmRvd24oKTtcbiAgICB0aGlzLnRpbGVDbGllbnQuc3RhcnRTY2VuZSh0aGlzLmxpZmV0aW1lLnNpZ25hbCk7XG4gICAgdGhpcy52aWV3ZXI/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLnZpZXdlciA9IG51bGw7XG4gICAgaWYgKHRoaXMuY2FudmFzICYmIHRoaXMuaG9zdD8uY29udGFpbnModGhpcy5jYW52YXMpKSB0aGlzLmhvc3QucmVtb3ZlQ2hpbGQodGhpcy5jYW52YXMpO1xuICAgIHRoaXMuY2FudmFzID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcGxvdCBhcmVhIGNoYW5nZWQgc2l6ZSAodGhlIHNsaWNlIGVkaXRvciBzcGxpdCBpdCwgYSBkaXZpZGVyIG1vdmVkKTogZml0IHRoZSBjYW52YXMsIHdob3NlXG4gICAqIGhlaWdodCB3YXMgZml4ZWQgYXQgcGxvdCB0aW1lLCB0byBpdCBhZ2Fpbi5cbiAgICovXG4gIHJlbGF5b3V0KF90cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBjb25zdCB7IGNhbnZhcywgaG9zdCB9ID0gdGhpcztcbiAgICBpZiAoY2FudmFzICYmIGhvc3QpIHtcbiAgICAgIC8vIExldCB0aGUgaG9zdCB0YWtlIGl0cyBoZWlnaHQgZnJvbSB0aGUgbGF5b3V0LCBub3QgZnJvbSB0aGUgY2FudmFzIGluc2lkZSBpdC5cbiAgICAgIGNhbnZhcy5zdHlsZS5oZWlnaHQgPSAnMHB4JztcbiAgICAgIGNvbnN0IGhlaWdodCA9IGhvc3QuY2xpZW50SGVpZ2h0O1xuICAgICAgY2FudmFzLnN0eWxlLmhlaWdodCA9IGhlaWdodCA+IDAgPyBgJHtoZWlnaHR9cHhgIDogJzEwMCUnO1xuICAgIH1cbiAgICB0aGlzLnZpZXdlcj8ucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIFBsb3RseS1zcGVjaWZpYyBheGlzIHJlc2V0LiAqL1xuICByZXNldEF4ZXMoKTogdm9pZCB7XG4gICAgdGhpcy5maXRDYW1lcmFTb29uKCk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgUGxvdGx5LXNwZWNpZmljIGF1dG9zY2FsZS4gKi9cbiAgYXV0b3NjYWxlKCk6IHZvaWQge1xuICAgIHRoaXMuZml0Q2FtZXJhU29vbigpO1xuICAgIHRoaXMuYXV0b3NjYWxlRXZlbnQkLm5leHQodW5kZWZpbmVkKTtcbiAgfVxuXG4gIHpvb21JbigpOiB2b2lkIHtcbiAgICB0aGlzLnpvb21CeShaT09NX0JVVFRPTl9TVEVQKTtcbiAgfVxuXG4gIHpvb21PdXQoKTogdm9pZCB7XG4gICAgdGhpcy56b29tQnkoMSAvIFpPT01fQlVUVE9OX1NURVApO1xuICB9XG5cbiAgLyoqIFpvb20gYnkgYGZhY3RvcmAgKD4gMSA9IGluKSBvbiB3aGljaGV2ZXIgY2FtZXJhIGlzIGxpdmU6IHRoZSAyRCBjYW1lcmEncyB6b29tLCBvciDigJQgaW4gYSAzRFxuICAgKiAgc2NlbmUsIHdoZXJlIHRoYXQgd291bGQgY2hhbmdlIG5vdGhpbmcgdmlzaWJsZSDigJQgdGhlIG9yYml0IGNhbWVyYSdzIGRpc3RhbmNlLiAqL1xuICBwcml2YXRlIHpvb21CeShmYWN0b3I6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICBpZiAodi5kaW1zLm5kaXNwbGF5ID09PSAzKVxuICAgICAgdi5jYW1lcmEzZC56b29tQnkoMSAvIGZhY3Rvcik7IC8vIHpvb21CeSBzY2FsZXMgdGhlIGRpc3RhbmNlXG4gICAgZWxzZSB2LmNhbWVyYS56b29tID0gdi5jYW1lcmEuem9vbSAqIGZhY3RvcjtcbiAgfVxuXG4gIHNldERyYWdNb2RlKF9tb2RlOiBzdHJpbmcgfCBmYWxzZSk6IHZvaWQge1xuICAgIC8vIE5vLW9wOiBwYW4gYW5kIHpvb20gYXJlIGFsd2F5cyB0aGUgbmFwYXJpIGNhbWVyYSdzIGRlZmF1bHQgZ2VzdHVyZXMsIGFuZCBwYW4vem9vbSBnYXRpbmcgZm9yXG4gICAgLy8gZHJhd2luZyBpcyBvd25lZCBieSB0aGUgcmVnaW9uIG92ZXJsYXkncyBzZXRNb2RlIChzZXRDb250cm9sc0VuYWJsZWQpLiBUb2dnbGluZyBjb250cm9scyBoZXJlXG4gICAgLy8gd291bGQgZmlnaHQgdGhhdCDigJQgdGhlIGhvc3QgY2FsbHMgc2V0RHJhZ01vZGUoZmFsc2UpIGFsb25nc2lkZSBvdmVybGF5LnNldE1vZGUoPHRvb2w+KS5cbiAgfVxuXG4gIHNldEltYWdlU21vb3RoaW5nRW5hYmxlZChlbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zZXR0aW5ncy5pbWFnZVNtb290aGluZyA9IGVuYWJsZWQ7XG4gICAgLy8gQXBwbHkgbGl2ZSB0byB0aGUgcmVuZGVyZWQgaW1hZ2UgbGF5ZXJzOyBiYWtlZCBpbnRvIHRoZSBuZXh0IHJlbmRlciB0b28uXG4gICAgdGhpcy5zY2VuZT8uc2V0SW1hZ2VTbW9vdGhpbmc/LihlbmFibGVkKTtcbiAgfVxuXG4gIHNldFNob3dTdGFjayhfc2hvd3N0YWNrOiBib29sZWFuKTogdm9pZCB7XG4gICAgLyogc3RhY2sgbmF2aWdhdGVkIHZpYSBzZXRaSW5kZXggKi9cbiAgfVxuXG4gIHNldFpJbmRleCh6SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmxvYWRlZCkgdGhpcy5sb2FkZWQueiA9IHpJbmRleDtcbiAgICBpZiAoIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgLy8gRGlzcGF0Y2ggb24gV0hBVCBJUyBNT1VOVEVELCBub3Qgb24gd2hpY2ggbGF5ZXIgaGFuZGxlIGhhcHBlbnMgdG8gYmUgbm9uLW51bGw6IGEgc3VyZmFjZVxuICAgIC8vIHN0aWxsIHByZWxvYWRpbmcgKG9yIHdob3NlIGZpcnN0IGJ1aWxkIGZhaWxlZCkgaGFzIG5vIGxheWVyIHlldCwgYW5kIGEgM0Qgc2NhdHRlciBvciBjbG91ZFxuICAgIC8vIGhhcyBub25lIG9mIHRoZW0g4oCUIGFuZCBib3RoIHVzZWQgdG8gZmFsbCB0aHJvdWdoIHRvIHRoZSAyRCByZW5kZXIgKE5BUEFSSS1TVkMtOSkuXG4gICAgdGhpcy5zY2VuZT8uc2V0Wih6SW5kZXgpO1xuICB9XG5cbiAgc2V0U3RhY2tMb2FkaW5nKHN0YWNrTG9hZGluZzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc3RhY2tMb2FkaW5nJC5uZXh0KHN0YWNrTG9hZGluZyk7XG4gIH1cblxuICAvKiogQ2FuY2VsIGluLWZsaWdodCBmcmFtZSBsb2FkaW5nOiBhYm9ydCB7QGxpbmsgbG9hZGluZ30gc28gdGhlIHZvbHVtZS1hc3NlbWJseSAvIHN1cmZhY2VcbiAgICogIHByZWxvYWQgd29ya2VycyBzdG9wIGZldGNoaW5nIG1vcmUgZnJhbWVzLCBhbmQgY2xlYXIgdGhlIGxvYWRpbmcgZmxhZyArIHByb2dyZXNzLiAqL1xuICBjYW5jZWxMb2FkaW5nKCk6IHZvaWQge1xuICAgIHRoaXMubG9hZGluZy5hYm9ydCgpO1xuICAgIHRoaXMubG9hZGluZyA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB0aGlzLnN0YWNrTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgdGhpcy5zdGFja0xvYWRpbmdQcm9ncmVzcyQubmV4dCgwKTtcbiAgfVxuXG4gIGlzU3RhY2tMb2FkaW5nKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN0YWNrTG9hZGluZyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXRTdGFja0xvYWRpbmdQcm9ncmVzcygpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnN0YWNrTG9hZGluZ1Byb2dyZXNzJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldFRydWVJbWFnZVNpemUoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuaW1hZ2VXID4gMCAmJiB0aGlzLmltYWdlSCA+IDAgPyB7IHdpZHRoOiB0aGlzLmltYWdlVywgaGVpZ2h0OiB0aGlzLmltYWdlSCB9IDogbnVsbDtcbiAgfVxuXG4gIGdldEN1cnJlbnRJbWFnZSgpOiBQcm9taXNlPEltYWdlIHwgbnVsbD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gIH1cblxuICBnZXREaXNwbGF5ZWRQaXhlbERhdGEoKTogUGl4ZWxEYXRhIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMudG9vbHMubGFzdFBpeGVscztcbiAgfVxuXG4gIGdldERpc3BsYXllZFNvdXJjZVJlY3QoKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBjb25zdCBzaXplID0gdGhpcy5nZXRUcnVlSW1hZ2VTaXplKCk7XG4gICAgaWYgKCF2IHx8ICFzaXplKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCByID0gdi52aXNpYmxlV29ybGRSZWN0KCk7XG4gICAgY29uc3QgeCA9IE1hdGgubWF4KDAsIHIueCk7XG4gICAgY29uc3QgeSA9IE1hdGgubWF4KDAsIHIueSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgd2lkdGg6IE1hdGgubWluKHNpemUud2lkdGgsIHIueCArIHIud2lkdGgpIC0geCxcbiAgICAgIGhlaWdodDogTWF0aC5taW4oc2l6ZS5oZWlnaHQsIHIueSArIHIuaGVpZ2h0KSAtIHksXG4gICAgfTtcbiAgfVxuXG4gIGRvd25sb2FkSW1hZ2UoKTogdm9pZCB7XG4gICAgdm9pZCB0aGlzLmV4cG9ydENvbXBvc2l0ZSgpO1xuICB9XG5cbiAgLyoqIE5vLW9wOiB0aGUgbW91bnRlZCBzY2VuZSBpcyBmaXhlZCBwZXIge0BsaW5rIHBsb3R9OyBhIG5ldyBwbG90IHR5cGUgdGFrZXMgYSByZS1wbG90LiAqL1xuICBzZXRQbG90VHlwZShfcGxvdFR5cGU6IFBsb3RUeXBlKTogdm9pZCB7XG4gICAgLyogdGhlIHNjZW5lIGlzIGNob3NlbiBieSBwbG90KCkgKi9cbiAgfVxuXG4gIC8qKiBNYXAgYSBQbG90bHktc3R5bGUgM0QgZHJhZyBtb2RlIG9udG8gbmFwYXJpLWpzJ3MgY2FtZXJhIGRyYWcgbW9kZS4gKi9cbiAgc2V0U3VyZmFjZURyYWdNb2RlKG1vZGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICB0aGlzLnZpZXdlci5zZXRDYW1lcmFEcmFnTW9kZShjYW1lcmFEcmFnTW9kZShtb2RlKSk7XG4gIH1cblxuICAvKiogUmUtZnJhbWUgdGhlIDNEIGNhbWVyYSBvbiB0aGUgc2NlbmU6IG5hcGFyaS1qcyBmcmFtZXMgdGhlIHVuaW9uIG9mIGV2ZXJ5IDNEIGxheWVyJ3MgYm91bmRzXG4gICAqICAoc3VyZmFjZSwgdm9sdW1lLCBwb2ludCBjbG91ZCksIHdpdGggdGhlIHZpZXdwb3J0LWF3YXJlIGZyYW1pbmcgaXRzIGFkZGVycyB1c2UuICovXG4gIHJlc2V0U3VyZmFjZUNhbWVyYSgpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdlcj8uZml0VG9MYXllcnMoKTtcbiAgICB0aGlzLnZpZXdlcj8ucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgZ2V0QXV0b3NjYWxlRXZlbnQoKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0b3NjYWxlRXZlbnQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwbG90IHR5cGVzIHRoaXMgYmFja2VuZCBjYW4gbW91bnQg4oCUIGV2ZXJ5IHR5cGUge0BsaW5rIHBsb3R9IGRpc3BhdGNoZXMgb24uXG4gICAqXG4gICAqIENvbnRyYWN0LW9ubHkgaW4gcHJvZHVjdGlvbjogdGhlIHJvdXRlciBhbnN3ZXJzIGBnZXRQbG90VHlwZURlc2NyaXB0b3JzYCBmcm9tIHRoZSBQbG90bHlcbiAgICogc2VydmljZSwgc28gbm90aGluZyByZWFjaGVzIHRoaXMgb25lIHRocm91Z2ggaXQ7IGl0IGlzIGtlcHQgYWNjdXJhdGUgZm9yIGRpcmVjdCBjYWxsZXJzLlxuICAgKi9cbiAgZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpOiBQbG90VHlwZURlc2NyaXB0b3JbXSB7XG4gICAgLy8gVGhlIFdlYkdQVSBuYXBhcmktanMgb3B0aW9ucywgb2ZmZXJlZCBhbG9uZ3NpZGUgKG5vdCByZXBsYWNpbmcpIHRoZSBPU0QvUGxvdGx5IHR5cGVzLlxuICAgIHJldHVybiBbXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX0lNQUdFXSEsXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX1NDQVRURVJdISxcbiAgICAgIFBMT1RfVFlQRV9ERVNDUklQVE9SU1tQbG90VHlwZS5OQVBBUklfU1VSRkFDRV0hLFxuICAgICAgUExPVF9UWVBFX0RFU0NSSVBUT1JTW1Bsb3RUeXBlLk5BUEFSSV9TQ0FUVEVSM0RdISxcbiAgICAgIFBMT1RfVFlQRV9ERVNDUklQVE9SU1tQbG90VHlwZS5OQVBBUklfVk9MVU1FXSEsXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuTkFQQVJJX0lTT1NVUkZBQ0VdISxcbiAgICAgIC8vIEdhdGVkIGJ5IGByZXF1aXJlc1NwYXRpYWxEYXRhYCwgc28gdGhlIHNlbGVjdG9yIGhpZGVzIHRoZW0gdW50aWwgYSBkYXRhc2V0IGlzIHB1Ymxpc2hlZFxuICAgICAgLy8gKHRoZSAzRCBvbmUgYWxzbyBieSBgcmVxdWlyZXNTcGF0aWFsM2RgKS5cbiAgICAgIFBMT1RfVFlQRV9ERVNDUklQVE9SU1tQbG90VHlwZS5TUEFUSUFMX09NSUNTXSEsXG4gICAgICBQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuU1BBVElBTF9PTUlDU18zRF0hLFxuICAgIF07XG4gIH1cblxuICAvKiogVGhlIG5hcGFyaSAzRCBkZWNpbWF0ZSBmYWN0b3IgKDEgPSBmdWxsIOKApiA4ID0g4oWbKS4gUmVhZCBieSB0aGUgdG9vbGJhciB0byBpbml0IHRoZSBjb250cm9sLiAqL1xuICBnZXRSZXNvbHV0aW9uU2NhbGUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5yZXNvbHV0aW9uU2NhbGU7XG4gIH1cblxuICAvKiogU2V0IHRoZSBkZWNpbWF0ZSBmYWN0b3IgZm9yIHRoZSBuYXBhcmkgM0QgdHlwZXMuIFRha2VzIGVmZmVjdCBvbiB0aGUgbmV4dCAocmUpbG9hZCDigJQgdGhlIGhvc3RcbiAgICogIHJlLXBsb3RzIGFmdGVyIGNhbGxpbmcgdGhpcywgc2luY2UgZGVjaW1hdGlvbiBjaGFuZ2VzIHRoZSBmZXRjaGVkL2Fzc2VtYmxlZCBkYXRhLiAqL1xuICBzZXRSZXNvbHV0aW9uU2NhbGUoc2NhbGU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2V0dGluZ3MucmVzb2x1dGlvblNjYWxlID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChzY2FsZSkpO1xuICB9XG5cbiAgLyoqIG5hcGFyaS1qcyBoYXMgdGhlIG5hdmlnYXRvciBhbmQgaW1hZ2Ugc21vb3RoaW5nIHRvbyAoaXRzIDJEIHZpZXdzKS4gKi9cbiAgZ2V0T3NkVmlld09wdGlvbnMoKTogSU9zZFZpZXdPcHRpb25zIHtcbiAgICByZXR1cm4gdGhpcy52aWV3T3B0aW9ucztcbiAgfVxuICBwcml2YXRlIHJlYWRvbmx5IHZpZXdPcHRpb25zOiBJT3NkVmlld09wdGlvbnMgPSB7XG4gICAgc2V0TmF2aWdhdG9yVmlzaWJsZTogKHZpc2libGUpID0+IHRoaXMuc2V0TmF2aWdhdG9yVmlzaWJsZSh2aXNpYmxlKSxcbiAgICBzZXRJbWFnZVNtb290aGluZ0VuYWJsZWQ6IChlbmFibGVkKSA9PiB0aGlzLnNldEltYWdlU21vb3RoaW5nRW5hYmxlZChlbmFibGVkKSxcbiAgfTtcblxuICAvKiogVGhlIDNEIGRlY2ltYXRlIGZhY3RvciAodGhlIDNEIHR5cGVzJyBSZXNvbHV0aW9uIGNvbnRyb2wpLiAqL1xuICBnZXRWb2x1bWVSZXNvbHV0aW9uKCk6IElWb2x1bWVSZXNvbHV0aW9uIHtcbiAgICByZXR1cm4gdGhpcy52b2x1bWVSZXNvbHV0aW9uO1xuICB9XG4gIHByaXZhdGUgcmVhZG9ubHkgdm9sdW1lUmVzb2x1dGlvbjogSVZvbHVtZVJlc29sdXRpb24gPSB7XG4gICAgZ2V0OiAoKSA9PiB0aGlzLmdldFJlc29sdXRpb25TY2FsZSgpLFxuICAgIHNldDogKHNjYWxlKSA9PiB0aGlzLnNldFJlc29sdXRpb25TY2FsZShzY2FsZSksXG4gIH07XG5cbiAgLyoqIFdoZXJlIHRoZSBjYW1lcmEgc2V0dGxlZCwgZm9yIHRoZSBpbnRlbnNpdHkgaW5zZXQncyByZS1zYW1wbGluZy4gKi9cbiAgZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKTogSUludGVuc2l0eVZpZXdwb3J0U291cmNlIHtcbiAgICByZXR1cm4gdGhpcy52aWV3cG9ydFNvdXJjZTtcbiAgfVxuICBwcml2YXRlIHJlYWRvbmx5IHZpZXdwb3J0U291cmNlOiBJSW50ZW5zaXR5Vmlld3BvcnRTb3VyY2UgPSB7XG4gICAgZ2V0Vmlld3BvcnRDaGFuZ2UkOiAoKSA9PiB0aGlzLnZpZXdwb3J0Q2hhbmdlJC5hc09ic2VydmFibGUoKSxcbiAgfTtcblxuICAvLyDilIDilIAgSVJlZ2lvblN0b3JlICsgY2xhc3NpZmljYXRpb24gY29sb3VycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gSW5oZXJpdGVkIGZyb20gQmFzZVN0b3JlVmlzdWFsaXplciDigJQgcHVyZSBkZWxlZ2F0aW9ucyB0byB0aGUgc2hhcmVkXG4gIC8vIFJlZ2lvblN0b3JlIC8gVmlzdWFsaXplclN0b3JlIChpZGVudGljYWwgdG8gdGhlIE9TRCBiYWNrZW5kKS5cblxuICAvLyDilIDilIAgSVRvb2xDb250cm9sbGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBzZXRBY3RpdmVUb29sIGFuZCB0aGUgcGVyLXRvb2wgc2V0dGVycyBydW4gaW4gQmFzZVN0b3JlVmlzdWFsaXplciBvdmVyIHRoaXMuY2FudmFzVG9vbHM7IHRoZVxuICAvLyBwb2ludGVyIGFuZCByZWFkYmFjayBnYXRpbmcsIGFuZCB0aGUgU0FNIC8gY2VsbHBvc2UgcnVucywgYXJlIHRoZSB0b29sIGJyaWRnZSdzLlxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBiZWZvcmVUb29sQ2hhbmdlKG5leHQ6IENhbnZhc1Rvb2xJZCB8IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50b29scy5iZWZvcmVUb29sQ2hhbmdlKG5leHQpO1xuICB9XG4gIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMudG9vbHMuc2VnbWVudFJlY3RhbmdsZXMoKTtcbiAgfVxuICBzZWdtZW50UmVjdGFuZ2xlc0NlbGxwb3NlKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMudG9vbHMuc2VnbWVudFJlY3RhbmdsZXNDZWxscG9zZSgpO1xuICB9XG4gIHNldFNhbU1vZGVsKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNhbVRvb2wuc2V0TW9kZWwoaWQpO1xuICAgIHRoaXMuc2FtUG9pbnRUb29sLnNldE1vZGVsKGlkKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJRGlzcGxheU9wdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIEluaGVyaXRlZCBmcm9tIEJhc2VTdG9yZVZpc3VhbGl6ZXIg4oCUIHB1cmUgZGVsZWdhdGlvbnMgdG8gdGhlIHNoYXJlZFxuICAvLyBWaXN1YWxpemVyU3RvcmUgKGlkZW50aWNhbCB0byB0aGUgT1NEIGJhY2tlbmQpLlxuXG4gIC8vIOKUgOKUgCBJVmlzdWFsaXplciBjb21wb3NpdGUgbWVtYmVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgZ2V0UmVnaW9uT3ZlcmxheSgpOiBJUmVnaW9uT3ZlcmxheSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnRvb2xzLnJlZ2lvbk92ZXJsYXk7XG4gIH1cbiAgZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk6IElJc29zdXJmYWNlQ29udHJvbHMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zY2VuZT8uaXNvQ29udHJvbHM/LigpID8/IG51bGw7XG4gIH1cbiAgZ2V0SW50ZW5zaXR5Q29udHJvbHMoKTogSUludGVuc2l0eUNvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc2NlbmU/LnN1cmZhY2UzZENvbnRyb2xzPy4oKSA/PyBudWxsO1xuICB9XG4gIGdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGwge1xuICAgIGlmICghdGhpcy52aWV3ZXIpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLnNjZW5lPy5oaXN0b2dyYW0oY2hhbm5lbEluZGV4LCBiaW5zKSA/PyBudWxsO1xuICB9XG4gIGdldEhpc3RvZ3JhbSQoY2hhbm5lbEluZGV4OiBudW1iZXIsIGJpbnM6IG51bWJlcik6IE9ic2VydmFibGU8SUhpc3RvZ3JhbSB8IG51bGw+IHtcbiAgICAvLyA+OC1iaXQgY2hhbm5lbHM6IHRoZSB0cnVlIG5hdGl2ZSBkaXN0cmlidXRpb24gZnJvbSB0aGUgc2VydmVyICh0aGUgZGlzcGxheWVkIHBpeGVscyBhcmVcbiAgICAvLyA4LWJpdCwgc28gdGhlIGNsaWVudCBoaXN0b2dyYW0gd291bGQgYmUgY2xpcHBlZCkuIDgtYml0IGNoYW5uZWxzIHVzZSB0aGUgY2xpZW50IHBhdGguXG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMudGlsZUNsaWVudC5uYXRpdmVIaXN0b2dyYW0kKHRoaXMubG9hZGVkPy5pbWFnZUluZm8sIHRoaXMubG9hZGVkPy56ID8/IDAsIGNoYW5uZWxJbmRleCwgYmlucykgPz9cbiAgICAgIG9mKHRoaXMuZ2V0SGlzdG9ncmFtKGNoYW5uZWxJbmRleCwgYmlucykpXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBTYXZlIHRoZSBkaXNwbGF5ZWQgY29tcG9zaXRlIGFzIGEgUE5HLiBUaHJvdWdoIGZpbGUtc2F2ZXIsIHdoaWNoICh1bmxpa2UgcmV2b2tpbmcgYW4gb2JqZWN0XG4gICAqICBVUkwgc3RyYWlnaHQgYWZ0ZXIgYGEuY2xpY2soKWApIGRvZXMgbm90IHJhY2UgdGhlIGJyb3dzZXIncyBkb3dubG9hZC4gKi9cbiAgZXhwb3J0Q29tcG9zaXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IHYgPSB0aGlzLnZpZXdlcjtcbiAgICBpZiAoIXYpIHJldHVybjtcbiAgICB2b2lkIHZcbiAgICAgIC5zY3JlZW5zaG90KClcbiAgICAgIC50aGVuKChibG9iKSA9PiBzYXZlQXMoYmxvYiwgJ25hcGFyaS1qcy5wbmcnKSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLndhcm4oJ1tuYXBhcmktanNdIFBORyBleHBvcnQgZmFpbGVkJywgZXJyKSk7XG4gIH1cbiAgLyoqIE5hdGl2ZS1iaXQtZGVwdGggKDE2LzMyLWJpdCkgbXVsdGktYmFuZCBUSUZGIGV4cG9ydCB2aWEgdGhlIHNlcnZlciBgL2V4cG9ydC90aWZmYCBlbmRwb2ludCDigJRcbiAgICogIHRoZSBkaXNwbGF5ZWQgUE5HIGlzIGFuIDgtYml0IGZpZ3VyZSwgdGhpcyBwcmVzZXJ2ZXMgdGhlIHRydWUgcGl4ZWwgdmFsdWVzLiBWaXNpYmxlIGNoYW5uZWxzXG4gICAqICBvbmx5IChvbWl0dGVkIHdoZW4gYWxsIGFyZSB2aXNpYmxlIOKGkiBzZXJ2ZXIgZGVmYXVsdCkuIE1pcnJvcnMgdGhlIE9TRCBiYWNrZW5kLiAqL1xuICBhc3luYyBleHBvcnREYXRhKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMudGlsZUNsaWVudC5leHBvcnRUaWZmKFxuICAgICAgdGhpcy5sb2FkZWQ/LnogPz8gMCxcbiAgICAgIHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKSxcbiAgICAgIHRoaXMubG9hZGVkPy5maWxlbmFtZSxcbiAgICApO1xuICB9XG4gIHVuc3Vic2NyaWJlKCk6IHZvaWQge1xuICAgIHRoaXMucmVzZXQoKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,129 @@
1
+ /** Opacity of a region's surface in the volume. */
2
+ export const REGION_MESH_OPACITY = 0.55;
3
+ /** While some surfaces are highlighted: theirs (near opaque, so their shape reads) … */
4
+ export const REGION_MESH_HIGHLIGHT_OPACITY = 0.9;
5
+ /** … and the others' (ghosted: still there for context, not in the way). */
6
+ export const REGION_MESH_DIMMED_OPACITY = 0.12;
7
+ /**
8
+ * The region reconstructions shown in a volume view: one translucent surface per region, in its
9
+ * colour, placed in the volume's world box (pixel x, y and slice z mapped onto it the way the
10
+ * volume maps its voxels) and re-placed when the volume's Z is stretched. A surface is updated in
11
+ * place (`setData`, `color`) rather than added again, and picked by napari-js (`pickSurface`).
12
+ *
13
+ * Highlighting is focus + context: the highlighted surfaces turn near opaque and the others fade
14
+ * to a ghost, so the selection stands out while staying in place among its neighbours.
15
+ */
16
+ export class VolumeRegionMeshes {
17
+ constructor(viewer) {
18
+ this.viewer = viewer;
19
+ this.layers = new Map();
20
+ this.highlighted = new Set();
21
+ this.hidden = new Set();
22
+ /** The meshes to show (kept while the volume has no frame yet). */
23
+ this.wanted = [];
24
+ this.frame = null;
25
+ }
26
+ /** Show exactly `meshes` (adding, keeping or removing surfaces). */
27
+ set(meshes) {
28
+ this.wanted = meshes;
29
+ this.sync();
30
+ }
31
+ /** Follow the volume's frame (it opened, or its Z was stretched): re-place every surface. */
32
+ setFrame(frame) {
33
+ this.frame = frame;
34
+ for (const e of this.layers.values())
35
+ e.layer.setData(toWorld(e.mesh.vertices, frame), e.mesh.faces);
36
+ this.sync();
37
+ }
38
+ /** Highlight the surfaces of these keys (none: every surface as usual). */
39
+ setHighlight(keys) {
40
+ this.highlighted = new Set(keys);
41
+ for (const [key, e] of this.layers)
42
+ e.layer.opacity = this.opacityOf(key);
43
+ this.viewer.requestRender();
44
+ }
45
+ /** Hide the surfaces of these keys (they are kept, so showing them again is instant). */
46
+ setHidden(keys) {
47
+ this.hidden = new Set(keys);
48
+ for (const [key, e] of this.layers)
49
+ e.layer.visible = !this.hidden.has(key);
50
+ this.viewer.requestRender();
51
+ }
52
+ /** The front-most surface under screen point (`x`, `y`) (canvas CSS px), or null. */
53
+ pickAt(x, y) {
54
+ if (!this.layers.size)
55
+ return null;
56
+ const ours = new Map([...this.layers.values()].map((e) => [e.layer, e.mesh]));
57
+ const hit = this.viewer.pickSurface(x, y, { pickable: (layer) => ours.has(layer) });
58
+ return hit ? (ours.get(hit.layer) ?? null) : null;
59
+ }
60
+ /** The meshes shown. */
61
+ get shown() {
62
+ return [...this.layers.values()].map((e) => e.mesh);
63
+ }
64
+ clear() {
65
+ for (const [key, e] of [...this.layers])
66
+ this.remove(key, e.layer);
67
+ this.wanted = [];
68
+ }
69
+ sync() {
70
+ const keep = new Map(this.wanted.map((m) => [m.key, m]));
71
+ for (const [key, e] of [...this.layers]) {
72
+ const want = keep.get(key);
73
+ if (!want || !want.faces.length) {
74
+ this.remove(key, e.layer);
75
+ continue;
76
+ }
77
+ // Rebuilt or recoloured: the same surface, updated in place.
78
+ if (want.vertices !== e.mesh.vertices && this.frame) {
79
+ e.layer.setData(toWorld(want.vertices, this.frame), want.faces);
80
+ }
81
+ if (want.color !== e.mesh.color)
82
+ e.layer.color = want.color;
83
+ e.mesh = want;
84
+ }
85
+ if (this.frame) {
86
+ for (const mesh of this.wanted)
87
+ if (!this.layers.has(mesh.key) && mesh.faces.length)
88
+ this.add(mesh);
89
+ }
90
+ this.viewer.requestRender();
91
+ }
92
+ add(mesh) {
93
+ const frame = this.frame;
94
+ const layer = this.viewer.addSurface(toWorld(mesh.vertices, frame), mesh.faces, undefined, {
95
+ name: `region ${mesh.key}`,
96
+ color: mesh.color,
97
+ opacity: this.opacityOf(mesh.key),
98
+ blending: 'translucent',
99
+ fit: 'never',
100
+ });
101
+ layer.visible = !this.hidden.has(mesh.key);
102
+ this.layers.set(mesh.key, { mesh, layer });
103
+ }
104
+ opacityOf(key) {
105
+ if (!this.highlighted.size)
106
+ return REGION_MESH_OPACITY;
107
+ return this.highlighted.has(key) ? REGION_MESH_HIGHLIGHT_OPACITY : REGION_MESH_DIMMED_OPACITY;
108
+ }
109
+ remove(key, layer) {
110
+ this.viewer.layers.remove(layer);
111
+ this.layers.delete(key);
112
+ }
113
+ }
114
+ /**
115
+ * Image px / slice coordinates → the volume's centred world box: pixel x of a `w`-wide image
116
+ * spans the box's width, slice k sits at the middle of its share of the box's depth.
117
+ */
118
+ export function toWorld(vertices, frame) {
119
+ const [w, h, d] = frame.size;
120
+ const [ww, wh, wd] = frame.world;
121
+ const out = new Float32Array(vertices.length);
122
+ for (let i = 0; i < vertices.length; i += 3) {
123
+ out[i] = (vertices[i] / w - 0.5) * ww;
124
+ out[i + 1] = (vertices[i + 1] / h - 0.5) * wh;
125
+ out[i + 2] = ((vertices[i + 2] + 0.5) / d - 0.5) * wd;
126
+ }
127
+ return out;
128
+ }
129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXZvbHVtZS1yZWdpb24tbWVzaGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9pbXBsZW1lbnRhdGlvbnMvbmFwYXJpLWpzL25hcGFyaS12b2x1bWUtcmVnaW9uLW1lc2hlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFzQkEsbURBQW1EO0FBQ25ELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQztBQUN4Qyx3RkFBd0Y7QUFDeEYsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsR0FBRyxDQUFDO0FBQ2pELDRFQUE0RTtBQUM1RSxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLENBQUM7QUFFL0M7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBUTdCLFlBQTZCLE1BQWM7UUFBZCxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBUDFCLFdBQU0sR0FBRyxJQUFJLEdBQUcsRUFBdUQsQ0FBQztRQUNqRixnQkFBVyxHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQzdDLFdBQU0sR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNoRCxtRUFBbUU7UUFDM0QsV0FBTSxHQUE0QixFQUFFLENBQUM7UUFDckMsVUFBSyxHQUF1QixJQUFJLENBQUM7SUFFSyxDQUFDO0lBRS9DLG9FQUFvRTtJQUNwRSxHQUFHLENBQUMsTUFBK0I7UUFDakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVELDZGQUE2RjtJQUM3RixRQUFRLENBQUMsS0FBa0I7UUFDekIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9B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QyxDQUFDO0lBQzFCLENBQUM7Q0FDRjtBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQUMsUUFBc0IsRUFBRSxLQUFrQjtJQUNoRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO0lBQzdCLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDakMsTUFBTSxHQUFHLEdBQUcsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM1QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN0QyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzlDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN4RCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTdXJmYWNlTGF5ZXIsIFZpZXdlciB9IGZyb20gJ25hcGFyaS1qcyc7XG5cbi8qKiBBIHJlZ2lvbidzIDNEIHJlY29uc3RydWN0aW9uIHRvIHNob3cgaW4gdGhlIHZvbHVtZTogYSBtZXNoIGluIGltYWdlIHB4ICh4LCB5KSBhbmQgc2xpY2VzICh6KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaW9uTWVzaDNEIHtcbiAgLyoqIElkZW50aXR5IChhIGNsYXNzIG5hbWUpOiBhIG1lc2ggd2l0aCB0aGUgc2FtZSBrZXkgYW5kIGFycmF5cyBpcyBrZXB0LCBub3QgcmVidWlsdC4gKi9cbiAga2V5OiBzdHJpbmc7XG4gIC8qKiBgI3JyZ2diYmAuICovXG4gIGNvbG9yOiBzdHJpbmc7XG4gIC8qKiBXaGF0IGhvdmVyaW5nIGl0IHNob3dzIChcIkhQRiDCtyBIaXBwb2NhbXBhbCBmb3JtYXRpb25cIik7IGRlZmF1bHQ6IHRoZSBrZXkuICovXG4gIGxhYmVsPzogc3RyaW5nO1xuICB2ZXJ0aWNlczogRmxvYXQzMkFycmF5O1xuICBmYWNlczogVWludDMyQXJyYXk7XG59XG5cbi8qKiBXaGVyZSB0aGUgc3RhY2sgc2l0cyBpbiB0aGUgdm9sdW1lJ3Mgd29ybGQ6IGl0cyBmdWxsIHNpemUsIGFuZCB0aGUgY2VudHJlZCB3b3JsZCBib3ggaXQgZmlsbHMuICovXG5leHBvcnQgaW50ZXJmYWNlIFZvbHVtZUZyYW1lIHtcbiAgLyoqIEltYWdlIHdpZHRoLCBoZWlnaHQgKHB4KSBhbmQgc2xpY2UgY291bnQuICovXG4gIHNpemU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgLyoqIFRoZSB3b3JsZCBib3ggKGNlbnRyZWQgb24gdGhlIG9yaWdpbiksIFogYXMgY3VycmVudGx5IHN0cmV0Y2hlZC4gKi9cbiAgd29ybGQ6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbn1cblxuLyoqIE9wYWNpdHkgb2YgYSByZWdpb24ncyBzdXJmYWNlIGluIHRoZSB2b2x1bWUuICovXG5leHBvcnQgY29uc3QgUkVHSU9OX01FU0hfT1BBQ0lUWSA9IDAuNTU7XG4vKiogV2hpbGUgc29tZSBzdXJmYWNlcyBhcmUgaGlnaGxpZ2h0ZWQ6IHRoZWlycyAobmVhciBvcGFxdWUsIHNvIHRoZWlyIHNoYXBlIHJlYWRzKSDigKYgKi9cbmV4cG9ydCBjb25zdCBSRUdJT05fTUVTSF9ISUdITElHSFRfT1BBQ0lUWSA9IDAuOTtcbi8qKiDigKYgYW5kIHRoZSBvdGhlcnMnIChnaG9zdGVkOiBzdGlsbCB0aGVyZSBmb3IgY29udGV4dCwgbm90IGluIHRoZSB3YXkpLiAqL1xuZXhwb3J0IGNvbnN0IFJFR0lPTl9NRVNIX0RJTU1FRF9PUEFDSVRZID0gMC4xMjtcblxuLyoqXG4gKiBUaGUgcmVnaW9uIHJlY29uc3RydWN0aW9ucyBzaG93biBpbiBhIHZvbHVtZSB2aWV3OiBvbmUgdHJhbnNsdWNlbnQgc3VyZmFjZSBwZXIgcmVnaW9uLCBpbiBpdHNcbiAqIGNvbG91ciwgcGxhY2VkIGluIHRoZSB2b2x1bWUncyB3b3JsZCBib3ggKHBpeGVsIHgsIHkgYW5kIHNsaWNlIHogbWFwcGVkIG9udG8gaXQgdGhlIHdheSB0aGVcbiAqIHZvbHVtZSBtYXBzIGl0cyB2b3hlbHMpIGFuZCByZS1wbGFjZWQgd2hlbiB0aGUgdm9sdW1lJ3MgWiBpcyBzdHJldGNoZWQuIEEgc3VyZmFjZSBpcyB1cGRhdGVkIGluXG4gKiBwbGFjZSAoYHNldERhdGFgLCBgY29sb3JgKSByYXRoZXIgdGhhbiBhZGRlZCBhZ2FpbiwgYW5kIHBpY2tlZCBieSBuYXBhcmktanMgKGBwaWNrU3VyZmFjZWApLlxuICpcbiAqIEhpZ2hsaWdodGluZyBpcyBmb2N1cyArIGNvbnRleHQ6IHRoZSBoaWdobGlnaHRlZCBzdXJmYWNlcyB0dXJuIG5lYXIgb3BhcXVlIGFuZCB0aGUgb3RoZXJzIGZhZGVcbiAqIHRvIGEgZ2hvc3QsIHNvIHRoZSBzZWxlY3Rpb24gc3RhbmRzIG91dCB3aGlsZSBzdGF5aW5nIGluIHBsYWNlIGFtb25nIGl0cyBuZWlnaGJvdXJzLlxuICovXG5leHBvcnQgY2xhc3MgVm9sdW1lUmVnaW9uTWVzaGVzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsYXllcnMgPSBuZXcgTWFwPHN0cmluZywgeyBtZXNoOiBSZWdpb25NZXNoM0Q7IGxheWVyOiBTdXJmYWNlTGF5ZXIgfT4oKTtcbiAgcHJpdmF0ZSBoaWdobGlnaHRlZDogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgcHJpdmF0ZSBoaWRkZW46IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIC8qKiBUaGUgbWVzaGVzIHRvIHNob3cgKGtlcHQgd2hpbGUgdGhlIHZvbHVtZSBoYXMgbm8gZnJhbWUgeWV0KS4gKi9cbiAgcHJpdmF0ZSB3YW50ZWQ6IHJlYWRvbmx5IFJlZ2lvbk1lc2gzRFtdID0gW107XG4gIHByaXZhdGUgZnJhbWU6IFZvbHVtZUZyYW1lIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB2aWV3ZXI6IFZpZXdlcikge31cblxuICAvKiogU2hvdyBleGFjdGx5IGBtZXNoZXNgIChhZGRpbmcsIGtlZXBpbmcgb3IgcmVtb3Zpbmcgc3VyZmFjZXMpLiAqL1xuICBzZXQobWVzaGVzOiByZWFkb25seSBSZWdpb25NZXNoM0RbXSk6IHZvaWQge1xuICAgIHRoaXMud2FudGVkID0gbWVzaGVzO1xuICAgIHRoaXMuc3luYygpO1xuICB9XG5cbiAgLyoqIEZvbGxvdyB0aGUgdm9sdW1lJ3MgZnJhbWUgKGl0IG9wZW5lZCwgb3IgaXRzIFogd2FzIHN0cmV0Y2hlZCk6IHJlLXBsYWNlIGV2ZXJ5IHN1cmZhY2UuICovXG4gIHNldEZyYW1lKGZyYW1lOiBWb2x1bWVGcmFtZSk6IHZvaWQge1xuICAgIHRoaXMuZnJhbWUgPSBmcmFtZTtcbiAgICBmb3IgKGNvbnN0IGUgb2YgdGhpcy5sYXllcnMudmFsdWVzKCkpIGUubGF5ZXIuc2V0RGF0YSh0b1dvcmxkKGUubWVzaC52ZXJ0aWNlcywgZnJhbWUpLCBlLm1lc2guZmFjZXMpO1xuICAgIHRoaXMuc3luYygpO1xuICB9XG5cbiAgLyoqIEhpZ2hsaWdodCB0aGUgc3VyZmFjZXMgb2YgdGhlc2Uga2V5cyAobm9uZTogZXZlcnkgc3VyZmFjZSBhcyB1c3VhbCkuICovXG4gIHNldEhpZ2hsaWdodChrZXlzOiBJdGVyYWJsZTxzdHJpbmc+KTogdm9pZCB7XG4gICAgdGhpcy5oaWdobGlnaHRlZCA9IG5ldyBTZXQoa2V5cyk7XG4gICAgZm9yIChjb25zdCBba2V5LCBlXSBvZiB0aGlzLmxheWVycykgZS5sYXllci5vcGFjaXR5ID0gdGhpcy5vcGFjaXR5T2Yoa2V5KTtcbiAgICB0aGlzLnZpZXdlci5yZXF1ZXN0UmVuZGVyKCk7XG4gIH1cblxuICAvKiogSGlkZSB0aGUgc3VyZmFjZXMgb2YgdGhlc2Uga2V5cyAodGhleSBhcmUga2VwdCwgc28gc2hvd2luZyB0aGVtIGFnYWluIGlzIGluc3RhbnQpLiAqL1xuICBzZXRIaWRkZW4oa2V5czogSXRlcmFibGU8c3RyaW5nPik6IHZvaWQge1xuICAgIHRoaXMuaGlkZGVuID0gbmV3IFNldChrZXlzKTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVdIG9mIHRoaXMubGF5ZXJzKSBlLmxheWVyLnZpc2libGUgPSAhdGhpcy5oaWRkZW4uaGFzKGtleSk7XG4gICAgdGhpcy52aWV3ZXIucmVxdWVzdFJlbmRlcigpO1xuICB9XG5cbiAgLyoqIFRoZSBmcm9udC1tb3N0IHN1cmZhY2UgdW5kZXIgc2NyZWVuIHBvaW50IChgeGAsIGB5YCkgKGNhbnZhcyBDU1MgcHgpLCBvciBudWxsLiAqL1xuICBwaWNrQXQoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBSZWdpb25NZXNoM0QgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMubGF5ZXJzLnNpemUpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG91cnMgPSBuZXcgTWFwKFsuLi50aGlzLmxheWVycy52YWx1ZXMoKV0ubWFwKChlKSA9PiBbZS5sYXllciwgZS5tZXNoXSkpO1xuICAgIGNvbnN0IGhpdCA9IHRoaXMudmlld2VyLnBpY2tTdXJmYWNlKHgsIHksIHsgcGlja2FibGU6IChsYXllcikgPT4gb3Vycy5oYXMobGF5ZXIpIH0pO1xuICAgIHJldHVybiBoaXQgPyAob3Vycy5nZXQoaGl0LmxheWVyKSA/PyBudWxsKSA6IG51bGw7XG4gIH1cblxuICAvKiogVGhlIG1lc2hlcyBzaG93bi4gKi9cbiAgZ2V0IHNob3duKCk6IFJlZ2lvbk1lc2gzRFtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMubGF5ZXJzLnZhbHVlcygpXS5tYXAoKGUpID0+IGUubWVzaCk7XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVdIG9mIFsuLi50aGlzLmxheWVyc10pIHRoaXMucmVtb3ZlKGtleSwgZS5sYXllcik7XG4gICAgdGhpcy53YW50ZWQgPSBbXTtcbiAgfVxuXG4gIHByaXZhdGUgc3luYygpOiB2b2lkIHtcbiAgICBjb25zdCBrZWVwID0gbmV3IE1hcCh0aGlzLndhbnRlZC5tYXAoKG0pID0+IFttLmtleSwgbV0pKTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVdIG9mIFsuLi50aGlzLmxheWVyc10pIHtcbiAgICAgIGNvbnN0IHdhbnQgPSBrZWVwLmdldChrZXkpO1xuICAgICAgaWYgKCF3YW50IHx8ICF3YW50LmZhY2VzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnJlbW92ZShrZXksIGUubGF5ZXIpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIFJlYnVpbHQgb3IgcmVjb2xvdXJlZDogdGhlIHNhbWUgc3VyZmFjZSwgdXBkYXRlZCBpbiBwbGFjZS5cbiAgICAgIGlmICh3YW50LnZlcnRpY2VzICE9PSBlLm1lc2gudmVydGljZXMgJiYgdGhpcy5mcmFtZSkge1xuICAgICAgICBlLmxheWVyLnNldERhdGEodG9Xb3JsZCh3YW50LnZlcnRpY2VzLCB0aGlzLmZyYW1lKSwgd2FudC5mYWNlcyk7XG4gICAgICB9XG4gICAgICBpZiAod2FudC5jb2xvciAhPT0gZS5tZXNoLmNvbG9yKSBlLmxheWVyLmNvbG9yID0gd2FudC5jb2xvcjtcbiAgICAgIGUubWVzaCA9IHdhbnQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmZyYW1lKSB7XG4gICAgICBmb3IgKGNvbnN0IG1lc2ggb2YgdGhpcy53YW50ZWQpIGlmICghdGhpcy5sYXllcnMuaGFzKG1lc2gua2V5KSAmJiBtZXNoLmZhY2VzLmxlbmd0aCkgdGhpcy5hZGQobWVzaCk7XG4gICAgfVxuICAgIHRoaXMudmlld2VyLnJlcXVlc3RSZW5kZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkKG1lc2g6IFJlZ2lvbk1lc2gzRCk6IHZvaWQge1xuICAgIGNvbnN0IGZyYW1lID0gdGhpcy5mcmFtZSBhcyBWb2x1bWVGcmFtZTtcbiAgICBjb25zdCBsYXllciA9IHRoaXMudmlld2VyLmFkZFN1cmZhY2UodG9Xb3JsZChtZXNoLnZlcnRpY2VzLCBmcmFtZSksIG1lc2guZmFjZXMsIHVuZGVmaW5lZCwge1xuICAgICAgbmFtZTogYHJlZ2lvbiAke21lc2gua2V5fWAsXG4gICAgICBjb2xvcjogbWVzaC5jb2xvcixcbiAgICAgIG9wYWNpdHk6IHRoaXMub3BhY2l0eU9mKG1lc2gua2V5KSxcbiAgICAgIGJsZW5kaW5nOiAndHJhbnNsdWNlbnQnLFxuICAgICAgZml0OiAnbmV2ZXInLFxuICAgIH0pO1xuICAgIGxheWVyLnZpc2libGUgPSAhdGhpcy5oaWRkZW4uaGFzKG1lc2gua2V5KTtcbiAgICB0aGlzLmxheWVycy5zZXQobWVzaC5rZXksIHsgbWVzaCwgbGF5ZXIgfSk7XG4gIH1cblxuICBwcml2YXRlIG9wYWNpdHlPZihrZXk6IHN0cmluZyk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLmhpZ2hsaWdodGVkLnNpemUpIHJldHVybiBSRUdJT05fTUVTSF9PUEFDSVRZO1xuICAgIHJldHVybiB0aGlzLmhpZ2hsaWdodGVkLmhhcyhrZXkpID8gUkVHSU9OX01FU0hfSElHSExJR0hUX09QQUNJVFkgOiBSRUdJT05fTUVTSF9ESU1NRURfT1BBQ0lUWTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlKGtleTogc3RyaW5nLCBsYXllcjogU3VyZmFjZUxheWVyKTogdm9pZCB7XG4gICAgdGhpcy52aWV3ZXIubGF5ZXJzLnJlbW92ZShsYXllcik7XG4gICAgdGhpcy5sYXllcnMuZGVsZXRlKGtleSk7XG4gIH1cbn1cblxuLyoqXG4gKiBJbWFnZSBweCAvIHNsaWNlIGNvb3JkaW5hdGVzIOKGkiB0aGUgdm9sdW1lJ3MgY2VudHJlZCB3b3JsZCBib3g6IHBpeGVsIHggb2YgYSBgd2Atd2lkZSBpbWFnZVxuICogc3BhbnMgdGhlIGJveCdzIHdpZHRoLCBzbGljZSBrIHNpdHMgYXQgdGhlIG1pZGRsZSBvZiBpdHMgc2hhcmUgb2YgdGhlIGJveCdzIGRlcHRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Xb3JsZCh2ZXJ0aWNlczogRmxvYXQzMkFycmF5LCBmcmFtZTogVm9sdW1lRnJhbWUpOiBGbG9hdDMyQXJyYXkge1xuICBjb25zdCBbdywgaCwgZF0gPSBmcmFtZS5zaXplO1xuICBjb25zdCBbd3csIHdoLCB3ZF0gPSBmcmFtZS53b3JsZDtcbiAgY29uc3Qgb3V0ID0gbmV3IEZsb2F0MzJBcnJheSh2ZXJ0aWNlcy5sZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHZlcnRpY2VzLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgb3V0W2ldID0gKHZlcnRpY2VzW2ldIC8gdyAtIDAuNSkgKiB3dztcbiAgICBvdXRbaSArIDFdID0gKHZlcnRpY2VzW2kgKyAxXSAvIGggLSAwLjUpICogd2g7XG4gICAgb3V0W2kgKyAyXSA9ICgodmVydGljZXNbaSArIDJdICsgMC41KSAvIGQgLSAwLjUpICogd2Q7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiJdfQ==