@jax-data-science/sci-image-visualizer 0.13.0 → 0.14.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 (61) hide show
  1. package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +19 -1
  2. package/esm2022/lib/contracts/display-types.mjs +7 -1
  3. package/esm2022/lib/contracts/image.contract.mjs +1 -1
  4. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +1 -1
  5. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  6. package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +17 -2
  7. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +88 -10
  8. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +62 -13
  9. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +21 -1
  10. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +5 -1
  11. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +4 -1
  12. package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +26 -3
  13. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +3 -2
  14. package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +20 -4
  15. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +4 -2
  16. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +4 -2
  17. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +42 -15
  18. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +3 -1
  19. package/esm2022/lib/spatial/lod.mjs +6 -3
  20. package/esm2022/lib/spatial/spatial-controls.facade.mjs +8 -3
  21. package/esm2022/lib/spatial/spatial-gene-filter.mjs +138 -0
  22. package/esm2022/lib/spatial/spatial-tile-merge.mjs +42 -1
  23. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +3 -3
  24. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +4 -3
  25. package/esm2022/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.mjs +66 -0
  26. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +106 -26
  27. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +3 -3
  28. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +3 -3
  29. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +3 -3
  30. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +110 -8
  31. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +41 -9
  32. package/esm2022/lib/store/visualizer-store.service.mjs +50 -1
  33. package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DURPqs5a.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DvFp1jNH.mjs} +1064 -318
  34. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DvFp1jNH.mjs.map +1 -0
  35. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-D0IQ6PjZ.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-D7lSUAM1.mjs} +2 -2
  36. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-D0IQ6PjZ.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-D7lSUAM1.mjs.map} +1 -1
  37. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1 -1
  38. package/lib/contracts/channel-histogram-api.contract.d.ts +14 -0
  39. package/lib/contracts/display-types.d.ts +27 -0
  40. package/lib/contracts/image.contract.d.ts +2 -0
  41. package/lib/contracts/spatial-dataset.contract.d.ts +7 -0
  42. package/lib/contracts/visualizer.contract.d.ts +3 -0
  43. package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +7 -0
  44. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +13 -2
  45. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +5 -0
  46. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +4 -0
  47. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +2 -0
  48. package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +6 -1
  49. package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +4 -0
  50. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +3 -1
  51. package/lib/spatial/lod.d.ts +3 -1
  52. package/lib/spatial/spatial-controls.facade.d.ts +3 -0
  53. package/lib/spatial/spatial-gene-filter.d.ts +44 -0
  54. package/lib/spatial/spatial-tile-merge.d.ts +17 -0
  55. package/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.d.ts +30 -0
  56. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +39 -7
  57. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +33 -1
  58. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +13 -1
  59. package/lib/store/visualizer-store.service.d.ts +13 -0
  60. package/package.json +1 -1
  61. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DURPqs5a.mjs.map +0 -1
@@ -4,6 +4,7 @@ import { debounceTime } from 'rxjs/operators';
4
4
  import { defaultPresetSet } from '../models/class-preset';
5
5
  import { findPreset, presetKey } from './class-color.util';
6
6
  import { PREFERENCES_PORT } from '../contracts/ports/preferences.port';
7
+ import { defaultChannelVisible } from '../contracts/channel-histogram-api.contract';
7
8
  import { DEFAULT_SPATIAL_VIEW } from '../contracts/display-types';
8
9
  import { COLORMAP_OPTIONS } from '../plot.utilities';
9
10
  import * as i0 from "@angular/core";
@@ -177,6 +178,52 @@ export class VisualizerStore {
177
178
  meta[0].mppY = mppY;
178
179
  this.imageMeta$.next(meta);
179
180
  }
181
+ /**
182
+ * Fill in the channel names and tints the host's image meta left out, from the image's tile
183
+ * descriptor: the server reads them from the file (an OME-TIFF's channel names, such as Cytos's
184
+ * "Actin" or "Cell-Membrane"), where a host's metadata (jit-ui's `/metadata`) carries none, so
185
+ * the Channels pane showed "Channel 1", "Channel 2"… The host's own names and tints win; only a
186
+ * channel still showing its derived default takes the descriptor's, so an edit made in the pane
187
+ * stays. A no-op when the channel counts differ, or for RGB.
188
+ */
189
+ adoptChannelInfo(info) {
190
+ const meta = this.imageMeta$.value;
191
+ const m0 = meta?.[0];
192
+ const current = this.channelStates$.value;
193
+ if (!info?.length || !m0 || (m0.rgbChannels ?? 1) >= 3)
194
+ return;
195
+ if ((m0.channelCount ?? 1) !== info.length || current.length !== info.length)
196
+ return;
197
+ const host = m0.channelInfo ?? [];
198
+ const merged = info.map((d, i) => ({
199
+ ...(host[i] ?? {}),
200
+ name: host[i]?.name || d.name || '',
201
+ color: host[i]?.color || d.color || '',
202
+ }));
203
+ const before = this.defaultChannelStates;
204
+ const nextMeta = meta.map((e, k) => (k === 0 ? { ...e, channelInfo: merged } : e));
205
+ this.imageMeta$.next(nextMeta);
206
+ const next = this.deriveChannels(nextMeta);
207
+ this.defaultChannelStates = next.map((c) => ({ ...c }));
208
+ let changed = false;
209
+ const states = current.map((st, i) => {
210
+ const was = before[i];
211
+ const now = next[i];
212
+ if (!was || !now)
213
+ return st;
214
+ const patch = {};
215
+ if (st.name === was.name && now.name !== was.name)
216
+ patch.name = now.name;
217
+ if (st.color === was.color && now.color !== was.color)
218
+ patch.color = now.color;
219
+ if (!Object.keys(patch).length)
220
+ return st;
221
+ changed = true;
222
+ return { ...st, ...patch };
223
+ });
224
+ if (changed)
225
+ this.channelStates$.next(states);
226
+ }
180
227
  /**
181
228
  * Publish the current image's metadata and derive its channels.
182
229
  *
@@ -204,6 +251,7 @@ export class VisualizerStore {
204
251
  * - RGB (rgbChannels ≥ 3) → Red/Green/Blue;
205
252
  * - multichannel fluorescence (channelCount > 1) → one channel per band,
206
253
  * named/tinted from the server `channelInfo` when present, else a palette;
254
+ * only the first `DEFAULT_VISIBLE_CHANNELS` start visible (see `defaultChannelVisible`);
207
255
  * - otherwise a single grayscale "Intensity" channel. */
208
256
  deriveChannels(meta) {
209
257
  const base = { min: 0, max: 255, gamma: 1, visible: true };
@@ -225,6 +273,7 @@ export class VisualizerStore {
225
273
  name: info?.[i]?.name || `Channel ${i + 1}`,
226
274
  color: info?.[i]?.color || palette[i % palette.length],
227
275
  ...base,
276
+ visible: defaultChannelVisible(i, count, info?.[i]?.visible),
228
277
  }));
229
278
  }
230
279
  return [{ index: 0, name: 'Intensity', color: '#ffffff', ...base }];
@@ -387,4 +436,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
387
436
  type: Inject,
388
437
  args: [PREFERENCES_PORT]
389
438
  }] }] });
390
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zdG9yZS92aXN1YWxpemVyLXN0b3JlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5QyxPQUFPLEVBQTBCLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQW1CLE1BQU0scUNBQXFDLENBQUM7QUFJeEYsT0FBTyxFQUFFLG9CQUFvQixFQUFvQixNQUFNLDRCQUE0QixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDOztBQUVyRDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxNQUFNLE9BQU8sZUFBZTtJQXFEMUIsMEVBQTBFO0lBQzFFLDJFQUEyRTtJQUMzRSwyQkFBMkI7SUFDM0IsWUFBbUUsWUFBb0MsSUFBSTtRQUF4QyxjQUFTLEdBQVQsU0FBUyxDQUErQjtRQXZEM0csd0VBQXdFO1FBQ3hFLDhFQUE4RTtRQUM5RSxxREFBcUQ7UUFDcEMsY0FBUyxHQUFHLElBQUksZUFBZSxDQUM5QyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLFdBQVcsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FDMUcsQ0FBQztRQUNlLGtCQUFhLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFFckUsd0VBQXdFO1FBQ3ZELGVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBbUIsRUFBRSxDQUFDLENBQUM7UUFFeEUsd0VBQXdFO1FBQ3hFLDZFQUE2RTtRQUM3RSw2RUFBNkU7UUFDN0Usd0VBQXdFO1FBQ3ZELG1CQUFjLEdBQUcsSUFBSSxlQUFlLENBQWtCLEVBQUUsQ0FBQyxDQUFDO1FBQzNFOzJGQUNtRjtRQUNsRSxxQkFBZ0IsR0FBRyxJQUFJLGVBQWUsQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUNuRSw0RUFBNEU7UUFDNUUsc0VBQXNFO1FBQzlELHlCQUFvQixHQUFvQixFQUFFLENBQUM7UUFHbkQsOEVBQThFO1FBQzlFLDJDQUEyQztRQUMxQixlQUFVLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDakQsWUFBTyxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBRS9ELHdFQUF3RTtRQUN4RSw0RUFBNEU7UUFDNUUscUVBQXFFO1FBQ3JFLDhFQUE4RTtRQUM5RSx3RUFBd0U7UUFDaEUsY0FBUyxHQUFjLGdCQUFnQixFQUFFLENBQUM7UUFDbEQscUZBQXFGO1FBQzdFLG1CQUFjLEdBQTJCLEVBQUUsQ0FBQztRQUNuQyxlQUFVLEdBQUcsSUFBSSxlQUFlLENBQVksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzVELGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUM1QyxrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUU5Qix3RUFBd0U7UUFDeEUsMEVBQTBFO1FBQzFFLDZFQUE2RTtRQUM3RSxtRUFBbUU7UUFDbEQsZ0JBQVcsR0FBRyxJQUFJLGVBQWUsQ0FBZ0IsSUFBSSxDQUFDLENBQUM7UUFFeEU7OzBEQUVrRDtRQUNqQyxpQkFBWSxHQUFHLElBQUksZUFBZSxDQUFtQixFQUFFLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO1FBTWpHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCx3RUFBd0U7SUFDaEUscUJBQXFCO1FBQzNCLG1FQUFtRTtRQUNuRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ3ZELElBQUksQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQ3RELEtBQUssRUFBRSxHQUFHLEVBQUU7b0JBQ1YscUJBQXFCO2dCQUN2QixDQUFDO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCwwRUFBMEU7UUFDMUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDeEMsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ1osSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ2hFLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUM5QyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3ZCLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7WUFDNUIsQ0FBQztZQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7WUFDNUIsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCx5RUFBeUU7SUFDakUsYUFBYTtRQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVPLGtCQUFrQixDQUFDLEdBQWM7UUFDdkMsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztRQUNwQyw4RUFBOEU7UUFDOUUscUVBQXFFO1FBQ3JFLE9BQU87WUFDTCxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDN0UsZUFBZSxFQUNiLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsTUFBTTtnQkFDOUQsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDO2dCQUMxQixDQUFDLENBQUMsUUFBUSxDQUFDLGVBQWU7WUFDOUIsV0FBVyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVztZQUM5QixTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVMsS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsT0FBTztTQUNuRSxDQUFDO0lBQ0osQ0FBQztJQUVELGtHQUFrRztJQUMxRixlQUFlO1FBQ3JCLElBQUksSUFBSSxDQUFDLGFBQWE7WUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ25ELENBQUM7SUFFRDs2RUFDeUU7SUFDakUsY0FBYztRQUNwQixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUN0RCxLQUFLLEVBQUUsR0FBRyxFQUFFO29CQUNWLHFCQUFxQjtnQkFDdkIsQ0FBQzthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQsa0VBQWtFO0lBQ2xFLGtCQUFrQjtRQUNoQixPQUFPLGdCQUFnQixDQUFDO0lBQzFCLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFDRDtzRUFDa0U7SUFDbEUsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7SUFDOUIsQ0FBQztJQUNELFdBQVcsQ0FBQyxRQUFhO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFDRCxtQkFBbUI7UUFDakIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztJQUNsQyxDQUFDO0lBQ0QsZUFBZSxDQUFDLE9BQWdCO1FBQzlCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsb0JBQW9CLENBQUMsSUFBYSxFQUFFLElBQWE7UUFDL0MsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUMxQixJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUMzQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUNsQyxNQUFNLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBb0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkYsSUFBSSxJQUFJO1lBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDOUIsSUFBSSxJQUFJO1lBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDOUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUNEOzs7Ozs7OztPQVFHO0lBQ0gsWUFBWSxDQUFDLFNBQTJCLEVBQUUsUUFBaUI7UUFDekQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1Qyw0RUFBNEU7UUFDNUUsNkRBQTZEO1FBQzdELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDeEQsTUFBTSxVQUFVLEdBQUcsUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLEtBQUssSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUMvRSxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQUUsSUFBSSxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUM7UUFDNUQsSUFBSSxVQUFVLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMERBQTBEO1FBQzNGLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7K0RBSTJEO0lBQ25ELGNBQWMsQ0FBQyxJQUFzQjtRQUMzQyxNQUFNLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUMzRCxNQUFNLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQyxFQUFFLFdBQVcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMvQixPQUFPO2dCQUNMLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFJLEVBQUU7Z0JBQ3BELEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFJLEVBQUU7Z0JBQ3RELEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFJLEVBQUU7YUFDdEQsQ0FBQztRQUNKLENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxDQUFDLEVBQUUsWUFBWSxJQUFJLENBQUMsQ0FBQztRQUNuQyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNkLE1BQU0sSUFBSSxHQUFHLENBQUMsRUFBRSxXQUFXLENBQUM7WUFDNUIsb0VBQW9FO1lBQ3BFLE1BQU0sT0FBTyxHQUFHLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDOUYsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDOUMsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzNDLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUksT0FBTyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO2dCQUN0RCxHQUFHLElBQUk7YUFDUixDQUFDLENBQUMsQ0FBQztRQUNOLENBQUM7UUFDRCxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVELHdFQUF3RTtJQUN4RSxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUNELG9CQUFvQjtRQUNsQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO0lBQ25DLENBQUM7SUFDRCw0RUFBNEU7SUFDNUUsa0JBQWtCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFDRCxzQkFBc0I7UUFDcEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDO0lBQ3JDLENBQUM7SUFDRCxrQkFBa0IsQ0FBQyxLQUFhO1FBQzlCLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssS0FBSyxLQUFLO1lBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBQ0QscURBQXFEO0lBQ3JELGVBQWUsQ0FBQyxLQUFhLEVBQUUsT0FBK0I7UUFDNUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDL0MsQ0FBQyxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUM3RCxDQUFDO1FBQ0YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUNELHVEQUF1RDtJQUN2RCxnQkFBZ0IsQ0FBQyxNQUF1QjtRQUN0QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBQ0Q7OzZFQUV5RTtJQUN6RSxpQkFBaUIsQ0FBQyxLQUFhO1FBQzdCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUU7WUFDMUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztZQUNsQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHO1lBQ3BCLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxJQUFJLENBQUM7WUFDdEIsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLElBQUksU0FBUztTQUMvQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztJQUMvQixDQUFDO0lBQ0QsWUFBWSxDQUFDLEVBQVc7UUFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUNELGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQzVCLENBQUM7SUFDRCxTQUFTLENBQUMsRUFBVztRQUNuQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQ7a0NBQzhCO0lBQzlCLHVCQUF1QjtRQUNyQixPQUFPLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUNELG1GQUFtRjtJQUNuRixzQkFBc0IsQ0FBQyxLQUFhLEVBQUUsS0FBYTtRQUNqRCxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsWUFBWTtRQUNWLHVFQUF1RTtRQUN2RSx1RUFBdUU7UUFDdkUsMkNBQTJDO1FBQzNDLE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELGVBQWUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUM7WUFDcEQsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVztZQUN2QyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTO1lBQ25DLGNBQWMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRTtTQUMzQyxDQUFDO0lBQ0osQ0FBQztJQUNEOzs7O09BSUc7SUFDSCwyQkFBMkIsQ0FBQyxNQUFtQztRQUM3RCxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDcEIsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxLQUFLLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUFFLFNBQVM7WUFDMUQsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDN0MsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUs7Z0JBQUUsU0FBUztZQUNqRCxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDL0QsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNqQixDQUFDO1FBQ0QsSUFBSSxPQUFPO1lBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFDRCxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFDRCxZQUFZLENBQUMsR0FBYztRQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsbURBQW1EO0lBQzVFLENBQUM7SUFDRCw0REFBNEQ7SUFDNUQsV0FBVyxDQUFDLE1BQW1CO1FBQzdCLE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVDLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxJQUFJLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDOztZQUNqRCxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDaEQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBQ0QsV0FBVyxDQUFDLElBQVk7UUFDdEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDdkcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBQ0QsWUFBWTtRQUNWLElBQUksQ0FBQyxTQUFTLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsdUNBQXVDO0lBQ2hFLENBQUM7SUFFRCx5RUFBeUU7SUFDekUsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRUQsaUVBQWlFO0lBQ2pFLGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxzRUFBc0U7SUFDdEUsY0FBYyxDQUFDLE9BQWtDO1FBQy9DLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVELGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUNELGFBQWEsQ0FBQyxJQUFtQjtRQUMvQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDOzhHQXJYVSxlQUFlLGtCQXdETSxnQkFBZ0I7a0hBeERyQyxlQUFlLGNBREYsTUFBTTs7MkZBQ25CLGVBQWU7a0JBRDNCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkF5RG5CLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgT3B0aW9uYWwsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IENsYXNzUHJlc2V0LCBQcmVzZXRTZXQsIGRlZmF1bHRQcmVzZXRTZXQgfSBmcm9tICcuLi9tb2RlbHMvY2xhc3MtcHJlc2V0JztcbmltcG9ydCB7IGZpbmRQcmVzZXQsIHByZXNldEtleSB9IGZyb20gJy4vY2xhc3MtY29sb3IudXRpbCc7XG5pbXBvcnQgeyBQUkVGRVJFTkNFU19QT1JULCBQcmVmZXJlbmNlc1BvcnQgfSBmcm9tICcuLi9jb250cmFjdHMvcG9ydHMvcHJlZmVyZW5jZXMucG9ydCc7XG5cbmltcG9ydCB7IElJbWFnZU1ldGFkYXRhIH0gZnJvbSAnLi4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IElDaGFubmVsU3RhdGUgfSBmcm9tICcuLi9jb250cmFjdHMvY2hhbm5lbC1oaXN0b2dyYW0tYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IERFRkFVTFRfU1BBVElBTF9WSUVXLCBTcGF0aWFsVmlld1N0YXRlIH0gZnJvbSAnLi4vY29udHJhY3RzL2Rpc3BsYXktdHlwZXMnO1xuaW1wb3J0IHsgQ09MT1JNQVBfT1BUSU9OUyB9IGZyb20gJy4uL3Bsb3QudXRpbGl0aWVzJztcblxuLyoqXG4gKiBCYWNrZW5kLW5ldXRyYWwgc3RvcmUgZm9yIHRoZSAqKnZpc3VhbGl6YXRpb24gc2Vzc2lvbioqIOKAlCB0aGUgc3RhdGUgdGhhdFxuICogZGVzY3JpYmVzICpob3cqIHRoZSBjdXJyZW50IGltYWdlIGlzIGJlaW5nIHZpZXdlZCwgaW5kZXBlbmRlbnQgb2Ygd2hpY2hcbiAqIHJlbmRlcmluZyBiYWNrZW5kIChQbG90bHksIE9wZW5TZWFkcmFnb24gb3IgbmFwYXJpLWpzKSBpcyBvbiBzY3JlZW46XG4gKlxuICogIC0gdGhlIGFjdGl2ZSBjb2xvcm1hcCAvIExVVCBhbmQgaXRzIHJldmVyc2Utc2NhbGUgdG9nZ2xlLFxuICogIC0gdGhlIGN1cnJlbnQgaW1hZ2UncyBwaHlzaWNhbCBtZXRhZGF0YSAowrVtL3BpeGVsIGV0Yy4pIGFuZCBpdHMgcGVyLWNoYW5uZWxcbiAqICAgIGRpc3BsYXkgc3RhdGUgKHdpbmRvdywgZ2FtbWEsIHRpbnQsIHZpc2liaWxpdHk7IGdyYXlzY2FsZSAvIGludmVydCksXG4gKiAgLSB0aGUgYW5ub3RhdGlvbi1jbGFzcyBwcmVzZXRzICh0aGUgY2xhc3NpZmljYXRpb24gbGFiZWwg4oaSIGNvbG91ciBtYXApLFxuICogIC0gdGhlIHNwYXRpYWwtb21pY3MgdmlldyBzdGF0ZSxcbiAqICAtIHdoaWNoIG9uLWNhbnZhcyB0b29sIGlzIGN1cnJlbnRseSBhY3RpdmUuXG4gKlxuICogRXZlcnkgYmFja2VuZCByZWFkcyBhbmQgd3JpdGVzIHRoaXMgc2luZ2xlIGluc3RhbmNlIChvbmUgcGVyIHZpc3VhbGl6ZXIgY2hhaW4pLFxuICogc28gdGhleSBzdGF5IGluIGxvY2stc3RlcCByZWdhcmRsZXNzIG9mIHdoaWNoIG9uZSBpcyByZW5kZXJpbmc7IG5vbmUgb2YgdGhlbVxuICogb3ducyB0aGUgc2Vzc2lvbiBzdGF0ZS4gUmVnaW9uIGdlb21ldHJ5IGxpdmVzIGluIHRoZSBzaWJsaW5nIGBSZWdpb25TdG9yZWAuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgVmlzdWFsaXplclN0b3JlIHtcbiAgLy8g4pSA4pSAIENvbG9ybWFwIC8gTFVUIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBEZWZhdWx0IHRvIGludmVydGVkIGdyZXlzIChkYXJrIGJhY2tncm91bmQg4oaSIGJyaWdodCBzaWduYWwpLCB3aGljaCByZWFkcyBhc1xuICAvLyB0aGUgbmF0dXJhbCBncmF5c2NhbGUgZm9yIHRoZXNlIG1pY3Jvc2NvcHkgaW1hZ2VzLlxuICBwcml2YXRlIHJlYWRvbmx5IGNvbG9ybWFwJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihcbiAgICBDT0xPUk1BUF9PUFRJT05TWzBdLmNoaWxkcmVuLmZpbmQoKGM6IGFueSkgPT4gYy5sYWJlbCA9PT0gJ0dyZXlzIEludicpID8/IENPTE9STUFQX09QVElPTlNbMF0uY2hpbGRyZW5bMF0sXG4gICk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmV2ZXJzZVNjYWxlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8vIOKUgOKUgCBJbWFnZSBtZXRhZGF0YSAocGh5c2ljYWwgcGl4ZWwgc2l6ZSwgY2hhbm5lbHMsIOKApikg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHByaXZhdGUgcmVhZG9ubHkgaW1hZ2VNZXRhJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SUltYWdlTWV0YWRhdGFbXT4oW10pO1xuXG4gIC8vIOKUgOKUgCBDaGFubmVscyAmIGhpc3RvZ3JhbSBkaXNwbGF5IHN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBQZXItY2hhbm5lbCBkaXNwbGF5IHdpbmRvdy9nYW1tYS92aXNpYmlsaXR5L2NvbG91ciwgZGVyaXZlZCBmcm9tIHRoZSBpbWFnZVxuICAvLyBtZXRhZGF0YSBvbiBsb2FkICgxIFwiSW50ZW5zaXR5XCIgY2hhbm5lbCBmb3IgZ3JheXNjYWxlOyBSL0cvQiBmb3IgUkdCKS4gVGhlXG4gIC8vIENoYW5uZWxzICYgSGlzdG9ncmFtIHBhbmUgZWRpdHMgdGhlc2UgYW5kIGJvdGggYmFja2VuZHMgcmVjb2xvciBsaXZlLlxuICBwcml2YXRlIHJlYWRvbmx5IGNoYW5uZWxTdGF0ZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJQ2hhbm5lbFN0YXRlW10+KFtdKTtcbiAgLyoqIEluZGV4IG9mIHRoZSBjaGFubmVsIHNlbGVjdGVkIGluIHRoZSBDaGFubmVscyBwYW5lIOKAlCB0aGUgT05FIGJhbmQgYVxuICAgKiAgc2luZ2xlLXNjYWxhciAzRCB2aWV3ICh0aGUgbmFwYXJpIFN1cmZhY2UpIGZvbGxvd3MgZm9yIGEgbXVsdGljaGFubmVsIGltYWdlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNlbGVjdGVkQ2hhbm5lbCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG4gIC8vIFRoZSBkZXJpdmVkIGRlZmF1bHRzIChmdWxsIHdpbmRvdywgZ2FtbWEgMSwgZGVmYXVsdCB0aW50KSBmb3IgdGhlIGN1cnJlbnRcbiAgLy8gaW1hZ2UsIGtlcHQgc28gXCJSZXNldFwiIGNhbiByZXN0b3JlIGEgY2hhbm5lbCdzIHdpbmRvdy9nYW1tYS9jb2xvdXIuXG4gIHByaXZhdGUgZGVmYXVsdENoYW5uZWxTdGF0ZXM6IElDaGFubmVsU3RhdGVbXSA9IFtdO1xuICAvKiogVGhlIGltYWdlIHRoZSBjdXJyZW50IGNoYW5uZWwgc3RhdGVzIHdlcmUgZGVyaXZlZCBmb3IgKHNlZSBzZXRJbWFnZU1ldGEpLiAqL1xuICBwcml2YXRlIGNoYW5uZWxJbWFnZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvLyBHcmF5c2NhbGUgZGlzcGxheSAoaWdub3JlIHRoZSBjaGFubmVsIHRpbnRzKSBhbmQgaW52ZXJ0ZWQgYmFja2dyb3VuZCDigJQgYm90aFxuICAvLyBnbG9iYWwgZGlzcGxheSBmbGFncywgbGlrZSB0aGUgY29sb3JtYXAuXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JheXNjYWxlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGludmVydCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAvLyDilIDilIAgQW5ub3RhdGlvbiBjbGFzcyBwcmVzZXRzIChqaXQtdWkjNzApIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBUaGUgcGVyLXVzZXIsIHNlcnZlci1wZXJzaXN0ZWQgc291cmNlIG9mIHRydXRoIGZvciByZWdpb24gY29sb3Vycywgc2VlZGVkXG4gIC8vIGZyb20gdGhlIGhpc3RvcmljYWwgZGVmYXVsdCBjbGFzc2VzLiBMb2FkZWQvc2F2ZWQgdmlhIHRoZSBvcHRpb25hbFxuICAvLyBQcmVmZXJlbmNlc1BvcnQgKGFwcC1zaWRlIGFkYXB0ZXIg4oaSIGppdC1zZXJ2aWNlKS4gZ2V0Q2xhc3NpZmljYXRpb25Db2xvcnMoKVxuICAvLyBiZWxvdyBzdGF5cyBhcyBhIG5hbWXihpJjb2xvdXIgdmlldyBmb3IgdGhlIGJhY2tlbmRzJyByZWdpb24gcmVuZGVyZXJzLlxuICBwcml2YXRlIHByZXNldFNldDogUHJlc2V0U2V0ID0gZGVmYXVsdFByZXNldFNldCgpO1xuICAvKiogU2Vzc2lvbi1vbmx5IGNsYXNzIGNvbG91cnMgZnJvbSBpbXBvcnRlZCBmaWxlcyAoc2VlIFByZXNldFNldC5pbXBvcnRlZENvbG9ycykuICovXG4gIHByaXZhdGUgaW1wb3J0ZWRDb2xvcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcmVzZXRTZXQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxQcmVzZXRTZXQ+KHRoaXMucHJlc2V0U2V0KTtcbiAgcHJpdmF0ZSByZWFkb25seSBzYXZlUHJlc2V0cyQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIHByZXNldHNMb2FkZWQgPSBmYWxzZTtcblxuICAvLyDilIDilIAgQWN0aXZlIG9uLWNhbnZhcyB0b29sIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBXaGljaCB0b29sIHRoZSB1c2VyIGhhcyBhcm1lZCAocGFuLCB6b29tLCBkcmF3cmVjdCwgd2FuZCwgZXJhc2VyLCDigKYpIG9yXG4gIC8vIG51bGwgd2hlbiBub25lIGlzIGFjdGl2ZS4gVGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRvb2wgc3RhdGUgYWNyb3NzXG4gIC8vIHRoZSB0b29sYmFyIGFuZCB3aGljaGV2ZXIgYmFja2VuZCdzIG92ZXJsYXkgaGFuZGxlcyB0aGUgcG9pbnRlci5cbiAgcHJpdmF0ZSByZWFkb25seSBhY3RpdmVUb29sJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqIFNwYXRpYWwtb21pY3MgZGlzcGxheSBzdGF0ZSAoY29sb3VyIHNvdXJjZSwgcG9pbnQgc2l6ZSwgYWxwaGEsIHNjYWxpbmcpLlxuICAgKiAgSGVsZCBoZXJlLCBuZXh0IHRvIHRoZSBjb2xvcm1hcC9jaGFubmVsIHN0YXRlLCBzbyB0aGUgYWN0aXZlIGJhY2tlbmQgcmVhY3RzXG4gICAqICB0byBhbiBlZGl0IGV4YWN0bHkgYXMgaXQgZG9lcyBmb3IgYW4gaW1hZ2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc3BhdGlhbFZpZXckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTcGF0aWFsVmlld1N0YXRlPih7IC4uLkRFRkFVTFRfU1BBVElBTF9WSUVXIH0pO1xuXG4gIC8vIE9wdGlvbmFsICsgbnVsbCBkZWZhdWx0IHNvIHRoZSBzdG9yZSBjYW4gYmUgY29uc3RydWN0ZWQgYm90aCB2aWEgREkgYW5kXG4gIC8vIGRpcmVjdGx5IChgbmV3IFZpc3VhbGl6ZXJTdG9yZSgpYCBpbiB1bml0IHRlc3RzKTsgcHJlc2V0IGxvYWQvc2F2ZSBuby1vcFxuICAvLyB3aGVuIHRoZSBwb3J0IGlzIGFic2VudC5cbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQEluamVjdChQUkVGRVJFTkNFU19QT1JUKSBwcml2YXRlIHJlYWRvbmx5IHByZWZzUG9ydDogUHJlZmVyZW5jZXNQb3J0IHwgbnVsbCA9IG51bGwpIHtcbiAgICB0aGlzLmluaXRQcmVzZXRQZXJzaXN0ZW5jZSgpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFByZXNldCBwZXJzaXN0ZW5jZSAoaml0LXVpIzcwKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgcHJpdmF0ZSBpbml0UHJlc2V0UGVyc2lzdGVuY2UoKTogdm9pZCB7XG4gICAgLy8gRGVib3VuY2VkIHdyaXRlLWJhY2sgc28gYSBidXJzdCBvZiBlZGl0cyBjb2xsYXBzZXMgaW50byBvbmUgUFVULlxuICAgIHRoaXMuc2F2ZVByZXNldHMkLnBpcGUoZGVib3VuY2VUaW1lKDgwMCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnByZWZzUG9ydD8uc2F2ZVByZXNldFNldCh0aGlzLnByZXNldFNldCkuc3Vic2NyaWJlKHtcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICAvKiBrZWVwIGxvY2FsIGNvcHkgKi9cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIC8vIExvYWQgdGhlIHVzZXIncyBzYXZlZCBzZXQgKGlmIGFueSk7IG90aGVyd2lzZSBrZWVwIHRoZSBzZWVkZWQgZGVmYXVsdHMuXG4gICAgdGhpcy5wcmVmc1BvcnQ/LmxvYWRQcmVzZXRTZXQoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHNldCkgPT4ge1xuICAgICAgICBpZiAoc2V0ICYmIEFycmF5LmlzQXJyYXkoc2V0LmNsYXNzZXMpICYmIHNldC5jbGFzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLnByZXNldFNldCA9IHRoaXMubm9ybWFsaXplUHJlc2V0U2V0KHNldCk7XG4gICAgICAgICAgdGhpcy5lbWl0UHJlc2V0U2V0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmVzZXRzTG9hZGVkID0gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICB0aGlzLnByZXNldHNMb2FkZWQgPSB0cnVlO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBQdWJsaXNoIHRoZSBwcmVzZXQgc2V0IHdpdGggdGhpcyBzZXNzaW9uJ3MgaW1wb3J0ZWQgY2xhc3MgY29sb3Vycy4gKi9cbiAgcHJpdmF0ZSBlbWl0UHJlc2V0U2V0KCk6IHZvaWQge1xuICAgIHRoaXMucHJlc2V0U2V0JC5uZXh0KHsgLi4udGhpcy5wcmVzZXRTZXQsIGltcG9ydGVkQ29sb3JzOiB0aGlzLmltcG9ydGVkQ29sb3JzIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVQcmVzZXRTZXQoc2V0OiBQcmVzZXRTZXQpOiBQcmVzZXRTZXQge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gZGVmYXVsdFByZXNldFNldCgpO1xuICAgIC8vIENsb25lIHRoZSBuZXN0ZWQgYXJyYXlzL29iamVjdHMgc28gb3V0c2lkZSBjYWxsZXJzIGNhbid0IG11dGF0ZSB0aGUgc3RvcmUnc1xuICAgIC8vIGludGVybmFsIHN0YXRlIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCBzZXRQcmVzZXRTZXQoKS91cHNlcnRDbGFzcygpLlxuICAgIHJldHVybiB7XG4gICAgICBjbGFzc2VzOiBBcnJheS5pc0FycmF5KHNldC5jbGFzc2VzKSA/IHNldC5jbGFzc2VzLm1hcCgoYykgPT4gKHsgLi4uYyB9KSkgOiBbXSxcbiAgICAgIGZhbGxiYWNrUGFsZXR0ZTpcbiAgICAgICAgQXJyYXkuaXNBcnJheShzZXQuZmFsbGJhY2tQYWxldHRlKSAmJiBzZXQuZmFsbGJhY2tQYWxldHRlLmxlbmd0aFxuICAgICAgICAgID8gWy4uLnNldC5mYWxsYmFja1BhbGV0dGVdXG4gICAgICAgICAgOiBkZWZhdWx0cy5mYWxsYmFja1BhbGV0dGUsXG4gICAgICBhdXRvUHJvbW90ZTogISFzZXQuYXV0b1Byb21vdGUsXG4gICAgICBtYXRjaE1vZGU6IHNldC5tYXRjaE1vZGUgPT09ICdub3JtYWxpemVkJyA/ICdub3JtYWxpemVkJyA6ICdleGFjdCcsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBRdWV1ZSBhIGRlYm91bmNlZCBzYXZlLiBOby1vcHMgdW50aWwgdGhlIGluaXRpYWwgbG9hZCByZXNvbHZlcyAoYW5kIHdoZW4gbm8gcG9ydCBpcyBib3VuZCkuICovXG4gIHByaXZhdGUgcXVldWVQcmVzZXRTYXZlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByZXNldHNMb2FkZWQpIHRoaXMuc2F2ZVByZXNldHMkLm5leHQoKTtcbiAgfVxuXG4gIC8qKiBQZXJzaXN0IHRoZSBjdXJyZW50IHByZXNldCBzZXQgaW1tZWRpYXRlbHksIGJ5cGFzc2luZyB0aGUgaW5jcmVtZW50YWwtZWRpdFxuICAgKiAgZGVib3VuY2UuIFVzZWQgZm9yIGV4cGxpY2l0IGJ1bGsgYWN0aW9ucyAoQXBwbHkgLyBJbXBvcnQgLyBSZXNldCkuICovXG4gIHByaXZhdGUgc2F2ZVByZXNldHNOb3coKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJlc2V0c0xvYWRlZCkge1xuICAgICAgdGhpcy5wcmVmc1BvcnQ/LnNhdmVQcmVzZXRTZXQodGhpcy5wcmVzZXRTZXQpLnN1YnNjcmliZSh7XG4gICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgLyoga2VlcCBsb2NhbCBjb3B5ICovXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogVGhlIGF2YWlsYWJsZSBjb2xvcm1hcCBvcHRpb25zICh0cmVlIGZvciB0aGUgTFVUIGRyb3Bkb3duKS4gKi9cbiAgZ2V0Q29sb3JtYXBPcHRpb25zKCk6IGFueSB7XG4gICAgcmV0dXJuIENPTE9STUFQX09QVElPTlM7XG4gIH1cblxuICBnZXRDb2xvcm1hcCgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmNvbG9ybWFwJC5hc09ic2VydmFibGUoKTtcbiAgfVxuICAvKiogU3luY2hyb25vdXMgY3VycmVudCB2YWx1ZSDigJQgZm9yIHJlbmRlciBwYXRocyB0aGF0IHJlYWQgaXQgd2hpbGUgYnVpbGRpbmdcbiAgICogIGEgZnJhbWUgKGUuZy4gUGxvdGx5J3MgY29sb3JzY2FsZSkgcmF0aGVyIHRoYW4gc3Vic2NyaWJpbmcuICovXG4gIGN1cnJlbnRDb2xvcm1hcCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmNvbG9ybWFwJC52YWx1ZTtcbiAgfVxuICBzZXRDb2xvcm1hcChjb2xvcm1hcDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5jb2xvcm1hcCQubmV4dChjb2xvcm1hcCk7XG4gIH1cblxuICBnZXRSZXZlcnNlU2NhbGUoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMucmV2ZXJzZVNjYWxlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuICBjdXJyZW50UmV2ZXJzZVNjYWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJldmVyc2VTY2FsZSQudmFsdWU7XG4gIH1cbiAgc2V0UmV2ZXJzZVNjYWxlKHJldmVyc2U6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJldmVyc2VTY2FsZSQubmV4dChyZXZlcnNlKTtcbiAgfVxuXG4gIGdldEltYWdlTWV0YSgpOiBPYnNlcnZhYmxlPElJbWFnZU1ldGFkYXRhW10+IHtcbiAgICByZXR1cm4gdGhpcy5pbWFnZU1ldGEkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhdGNoIHRoZSBwaHlzaWNhbCBwaXhlbCBzaXplICjCtW0vcGl4ZWwpIG9udG8gdGhlIGN1cnJlbnQgaW1hZ2UgbWV0YSBhbmRcbiAgICogcmUtZW1pdCwgd2l0aG91dCB0b3VjaGluZyB0aGUgZGVyaXZlZCBjaGFubmVscy4gVGhlIE9TRCB0aWxlIGRlc2NyaXB0b3JcbiAgICogKGZyb20gdGhlIHNlcnZlcidzIEJpby1Gb3JtYXRzIGAvdGlsZXMvaW5mb2ApIGlzIGF1dGhvcml0YXRpdmUgZm9yIHNjYWxlZFxuICAgKiBpbWFnZXMg4oCUIGBpbWFnZUluZm8uaW1hZ2VNZXRhYCBvZnRlbiBjYXJyaWVzIG5vIG1wcCDigJQgc28gdGhlIHJlbmRlcmVyIGZlZWRzXG4gICAqIGl0IGhlcmUgb25jZSB0aGUgZGVzY3JpcHRvciBsb2FkcywgbGV0dGluZyBhcmVhL3NjYWxlIGNvbnN1bWVycyAodGhlIFJlZ2lvblxuICAgKiBFZGl0b3IpIHNob3cgwrVtwrIvbW3CsiBpbnN0ZWFkIG9mIHB4wrIuIE5vLW9wIHdoZW4gbmVpdGhlciBheGlzIGlzIHBvc2l0aXZlLlxuICAgKi9cbiAgc2V0UGh5c2ljYWxQaXhlbFNpemUobXBwWD86IG51bWJlciwgbXBwWT86IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGhhc1ggPSAobXBwWCA/PyAwKSA+IDAsXG4gICAgICBoYXNZID0gKG1wcFkgPz8gMCkgPiAwO1xuICAgIGlmICghaGFzWCAmJiAhaGFzWSkgcmV0dXJuO1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuaW1hZ2VNZXRhJC52YWx1ZTtcbiAgICBjb25zdCBtZXRhID0gKGN1ciAmJiBjdXIubGVuZ3RoID8gY3VyIDogW3t9IGFzIElJbWFnZU1ldGFkYXRhXSkubWFwKChlKSA9PiAoeyAuLi5lIH0pKTtcbiAgICBpZiAoaGFzWCkgbWV0YVswXS5tcHBYID0gbXBwWDtcbiAgICBpZiAoaGFzWSkgbWV0YVswXS5tcHBZID0gbXBwWTtcbiAgICB0aGlzLmltYWdlTWV0YSQubmV4dChtZXRhKTtcbiAgfVxuICAvKipcbiAgICogUHVibGlzaCB0aGUgY3VycmVudCBpbWFnZSdzIG1ldGFkYXRhIGFuZCBkZXJpdmUgaXRzIGNoYW5uZWxzLlxuICAgKlxuICAgKiBgaW1hZ2VLZXlgIGlkZW50aWZpZXMgdGhlIGltYWdlIChpdHMgZmlsZSBuYW1lKS4gQSByZS1wbG90IG9mIHRoZSBTQU1FIGltYWdlXG4gICAqIGtlZXBzIHRoZSB1c2VyJ3Mgd2luZG93L2dhbW1hL3RpbnQgZWRpdHM7IGEgZGlmZmVyZW50IGltYWdlIGdldHMgaXRzIG93blxuICAgKiBkZXJpdmVkIGNoYW5uZWxzIGV2ZW4gYXQgdGhlIHNhbWUgY2hhbm5lbCBjb3VudCDigJQga2V5aW5nIG9uIHRoZSBjb3VudCBhbG9uZVxuICAgKiBsZWZ0IGEgREFQSS9HRlAvUkZQIHN0YWNrJ3MgbmFtZXMsIHRpbnRzIGFuZCB3aW5kb3dzIG9uIGEgZm9sbG93aW5nXG4gICAqIENEMy9DRDgvUGFuQ0sgb25lLiBXaXRob3V0IGEga2V5LCBvbmx5IGEgY2hhbmdlIG9mIGNoYW5uZWwgY291bnQgcmUtZGVyaXZlcy5cbiAgICovXG4gIHNldEltYWdlTWV0YShpbWFnZU1ldGE6IElJbWFnZU1ldGFkYXRhW10sIGltYWdlS2V5Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5pbWFnZU1ldGEkLm5leHQoaW1hZ2VNZXRhKTtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5kZXJpdmVDaGFubmVscyhpbWFnZU1ldGEpO1xuICAgIC8vIEFsd2F5cyByZWZyZXNoIHRoZSByZXNldCBiYXNlbGluZSB0byB0aGUgY3VycmVudCBpbWFnZSdzIGRlcml2ZWQgZGVmYXVsdHNcbiAgICAvLyAobmFtZXMvY29sb3VycyBjYW4gZGlmZmVyIGV2ZW4gYXQgdGhlIHNhbWUgY2hhbm5lbCBjb3VudCkuXG4gICAgdGhpcy5kZWZhdWx0Q2hhbm5lbFN0YXRlcyA9IG5leHQubWFwKChjKSA9PiAoeyAuLi5jIH0pKTtcbiAgICBjb25zdCBvdGhlckltYWdlID0gaW1hZ2VLZXkgIT09IHVuZGVmaW5lZCAmJiBpbWFnZUtleSAhPT0gdGhpcy5jaGFubmVsSW1hZ2VLZXk7XG4gICAgaWYgKGltYWdlS2V5ICE9PSB1bmRlZmluZWQpIHRoaXMuY2hhbm5lbEltYWdlS2V5ID0gaW1hZ2VLZXk7XG4gICAgaWYgKG90aGVySW1hZ2UgfHwgbmV4dC5sZW5ndGggIT09IHRoaXMuY2hhbm5lbFN0YXRlcyQudmFsdWUubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNoYW5uZWxTdGF0ZXMkLm5leHQobmV4dCk7XG4gICAgICB0aGlzLnNlbGVjdGVkQ2hhbm5lbCQubmV4dCgwKTsgLy8gbmV3IGltYWdlIC8gY2hhbm5lbCBzdHJ1Y3R1cmUg4oaSIHJlc2V0IHRoZSBzZWxlY3RlZCBiYW5kXG4gICAgfVxuICB9XG5cbiAgLyoqIENoYW5uZWxzIGZvciBhbiBpbWFnZTpcbiAgICogICAtIFJHQiAocmdiQ2hhbm5lbHMg4omlIDMpIOKGkiBSZWQvR3JlZW4vQmx1ZTtcbiAgICogICAtIG11bHRpY2hhbm5lbCBmbHVvcmVzY2VuY2UgKGNoYW5uZWxDb3VudCA+IDEpIOKGkiBvbmUgY2hhbm5lbCBwZXIgYmFuZCxcbiAgICogICAgIG5hbWVkL3RpbnRlZCBmcm9tIHRoZSBzZXJ2ZXIgYGNoYW5uZWxJbmZvYCB3aGVuIHByZXNlbnQsIGVsc2UgYSBwYWxldHRlO1xuICAgKiAgIC0gb3RoZXJ3aXNlIGEgc2luZ2xlIGdyYXlzY2FsZSBcIkludGVuc2l0eVwiIGNoYW5uZWwuICovXG4gIHByaXZhdGUgZGVyaXZlQ2hhbm5lbHMobWV0YTogSUltYWdlTWV0YWRhdGFbXSk6IElDaGFubmVsU3RhdGVbXSB7XG4gICAgY29uc3QgYmFzZSA9IHsgbWluOiAwLCBtYXg6IDI1NSwgZ2FtbWE6IDEsIHZpc2libGU6IHRydWUgfTtcbiAgICBjb25zdCBtID0gbWV0YT8uWzBdO1xuICAgIGlmICgobT8ucmdiQ2hhbm5lbHMgPz8gMSkgPj0gMykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgeyBpbmRleDogMCwgbmFtZTogJ1JlZCcsIGNvbG9yOiAnI2ZmMDAwMCcsIC4uLmJhc2UgfSxcbiAgICAgICAgeyBpbmRleDogMSwgbmFtZTogJ0dyZWVuJywgY29sb3I6ICcjMDBmZjAwJywgLi4uYmFzZSB9LFxuICAgICAgICB7IGluZGV4OiAyLCBuYW1lOiAnQmx1ZScsIGNvbG9yOiAnIzAwMDBmZicsIC4uLmJhc2UgfSxcbiAgICAgIF07XG4gICAgfVxuICAgIGNvbnN0IGNvdW50ID0gbT8uY2hhbm5lbENvdW50ID8/IDE7XG4gICAgaWYgKGNvdW50ID4gMSkge1xuICAgICAgY29uc3QgaW5mbyA9IG0/LmNoYW5uZWxJbmZvO1xuICAgICAgLy8gRmFsbGJhY2sgdGludHMgKEZpamktaXNoKSB3aGVuIHRoZSBzZXJ2ZXIgZG9lc24ndCBzdXBwbHkgYSBjb2xvci5cbiAgICAgIGNvbnN0IHBhbGV0dGUgPSBbJyNmZjAwMDAnLCAnIzAwZmYwMCcsICcjMDAwMGZmJywgJyNmZmZmZmYnLCAnIzAwZmZmZicsICcjZmYwMGZmJywgJyNmZmZmMDAnXTtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoXywgaSkgPT4gKHtcbiAgICAgICAgaW5kZXg6IGksXG4gICAgICAgIG5hbWU6IGluZm8/LltpXT8ubmFtZSB8fCBgQ2hhbm5lbCAke2kgKyAxfWAsXG4gICAgICAgIGNvbG9yOiBpbmZvPy5baV0/LmNvbG9yIHx8IHBhbGV0dGVbaSAlIHBhbGV0dGUubGVuZ3RoXSxcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIFt7IGluZGV4OiAwLCBuYW1lOiAnSW50ZW5zaXR5JywgY29sb3I6ICcjZmZmZmZmJywgLi4uYmFzZSB9XTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDaGFubmVscyAmIGhpc3RvZ3JhbSBzdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgZ2V0Q2hhbm5lbFN0YXRlcygpOiBPYnNlcnZhYmxlPElDaGFubmVsU3RhdGVbXT4ge1xuICAgIHJldHVybiB0aGlzLmNoYW5uZWxTdGF0ZXMkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGN1cnJlbnRDaGFubmVsU3RhdGVzKCk6IElDaGFubmVsU3RhdGVbXSB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbm5lbFN0YXRlcyQudmFsdWU7XG4gIH1cbiAgLyoqIFRoZSBjaGFubmVsIHNlbGVjdGVkIGluIHRoZSBwYW5lIChkcml2ZXMgYSBzaW5nbGUtc2NhbGFyIDNEIFN1cmZhY2UpLiAqL1xuICBnZXRTZWxlY3RlZENoYW5uZWwoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZENoYW5uZWwkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGN1cnJlbnRTZWxlY3RlZENoYW5uZWwoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZENoYW5uZWwkLnZhbHVlO1xuICB9XG4gIHNldFNlbGVjdGVkQ2hhbm5lbChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRDaGFubmVsJC52YWx1ZSAhPT0gaW5kZXgpIHRoaXMuc2VsZWN0ZWRDaGFubmVsJC5uZXh0KGluZGV4KTtcbiAgfVxuICAvKiogUGF0Y2ggb25lIGNoYW5uZWwgYnkgaW5kZXggKGltbXV0YWJsZSB1cGRhdGUpLiAqL1xuICBzZXRDaGFubmVsU3RhdGUoaW5kZXg6IG51bWJlciwgcGFydGlhbDogUGFydGlhbDxJQ2hhbm5lbFN0YXRlPik6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLmNoYW5uZWxTdGF0ZXMkLnZhbHVlLm1hcCgoYykgPT5cbiAgICAgIGMuaW5kZXggPT09IGluZGV4ID8geyAuLi5jLCAuLi5wYXJ0aWFsLCBpbmRleDogYy5pbmRleCB9IDogYyxcbiAgICApO1xuICAgIHRoaXMuY2hhbm5lbFN0YXRlcyQubmV4dChuZXh0KTtcbiAgfVxuICAvKiogUmVwbGFjZSBhbGwgY2hhbm5lbCBzdGF0ZXMgKHVzZWQgYnkgYXV0by9yZXNldCkuICovXG4gIHNldENoYW5uZWxTdGF0ZXMoc3RhdGVzOiBJQ2hhbm5lbFN0YXRlW10pOiB2b2lkIHtcbiAgICB0aGlzLmNoYW5uZWxTdGF0ZXMkLm5leHQoc3RhdGVzKTtcbiAgfVxuICAvKiogUmVzZXQgb25lIGNoYW5uZWwncyBkaXNwbGF5IHdpbmRvdywgZ2FtbWEgQU5EIGNvbG91ciB0byB0aGUgdmFsdWVzIGRlcml2ZWRcbiAgICogIGZvciB0aGUgY3VycmVudCBpbWFnZSAoZnVsbCAwLi4yNTUgcmFuZ2UsIGdhbW1hIDEsIHRoZSBjaGFubmVsJ3MgZGVmYXVsdFxuICAgKiAgdGludCkuIEZhbGxzIGJhY2sgdG8gbmV1dHJhbCBkZWZhdWx0cyBpZiBubyBiYXNlbGluZSB3YXMgY2FwdHVyZWQuICovXG4gIHJlc2V0Q2hhbm5lbFN0YXRlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBkZWYgPSB0aGlzLmRlZmF1bHRDaGFubmVsU3RhdGVzLmZpbmQoKGMpID0+IGMuaW5kZXggPT09IGluZGV4KTtcbiAgICB0aGlzLnNldENoYW5uZWxTdGF0ZShpbmRleCwge1xuICAgICAgbWluOiBkZWY/Lm1pbiA/PyAwLFxuICAgICAgbWF4OiBkZWY/Lm1heCA/PyAyNTUsXG4gICAgICBnYW1tYTogZGVmPy5nYW1tYSA/PyAxLFxuICAgICAgY29sb3I6IGRlZj8uY29sb3IgPz8gJyNmZmZmZmYnLFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0R3JheXNjYWxlKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmdyYXlzY2FsZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgY3VycmVudEdyYXlzY2FsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ncmF5c2NhbGUkLnZhbHVlO1xuICB9XG4gIHNldEdyYXlzY2FsZShvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZ3JheXNjYWxlJC5uZXh0KG9uKTtcbiAgfVxuXG4gIGdldEludmVydCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5pbnZlcnQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGN1cnJlbnRJbnZlcnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaW52ZXJ0JC52YWx1ZTtcbiAgfVxuICBzZXRJbnZlcnQob246IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmludmVydCQubmV4dChvbik7XG4gIH1cblxuICAvKiogTmFtZeKGkmNvbG91ciB2aWV3IG9mIHRoZSBjdXJyZW50IHByZXNldCBzZXQgKGNvbXBhdCBmb3IgYmFja2VuZCByZW5kZXJlcnNcbiAgICogIHRoYXQgc3RpbGwgcmVhZCBhIE1hcCkuICovXG4gIGdldENsYXNzaWZpY2F0aW9uQ29sb3JzKCk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgTWFwKHRoaXMucHJlc2V0U2V0LmNsYXNzZXMubWFwKChjKSA9PiBbYy5uYW1lLCBjLmNvbG9yXSkpO1xuICB9XG4gIC8qKiBVcHNlcnQgYSBzaW5nbGUgY2xhc3MgY29sb3VyICh1c2VkIGJ5IHRoZSBlZGl0b3IncyBwZXItY2xhc3MgY29sb3VyIHBpY2tlcikuICovXG4gIHNldENsYXNzaWZpY2F0aW9uQ29sb3IobGFiZWw6IHN0cmluZywgY29sb3I6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudXBzZXJ0Q2xhc3MoeyBuYW1lOiBsYWJlbCwgY29sb3IgfSk7XG4gIH1cblxuICAvLyDilIDilIAgQW5ub3RhdGlvbi1jbGFzcyBwcmVzZXQgc2V0IGFjY2Vzc29ycyAoaml0LXVpIzcwKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgZ2V0UHJlc2V0U2V0KCk6IFByZXNldFNldCB7XG4gICAgLy8gRGVmZW5zaXZlIGNvcHk6IGNhbGxlcnMgbXVzdCBub3QgbXV0YXRlIHRoZSBzdG9yZSdzIHN0YXRlIGluIHBsYWNlIOKAlFxuICAgIC8vIGFsbCBjaGFuZ2VzIGdvIHRocm91Z2ggc2V0UHJlc2V0U2V0KCkvdXBzZXJ0Q2xhc3MoKS9yZW1vdmVDbGFzcygpIHNvXG4gICAgLy8gcHJlc2V0U2V0JCBhbmQgcGVyc2lzdGVuY2Ugc3RheSBpbiBzeW5jLlxuICAgIHJldHVybiB7XG4gICAgICBjbGFzc2VzOiB0aGlzLnByZXNldFNldC5jbGFzc2VzLm1hcCgoYykgPT4gKHsgLi4uYyB9KSksXG4gICAgICBmYWxsYmFja1BhbGV0dGU6IFsuLi50aGlzLnByZXNldFNldC5mYWxsYmFja1BhbGV0dGVdLFxuICAgICAgYXV0b1Byb21vdGU6IHRoaXMucHJlc2V0U2V0LmF1dG9Qcm9tb3RlLFxuICAgICAgbWF0Y2hNb2RlOiB0aGlzLnByZXNldFNldC5tYXRjaE1vZGUsXG4gICAgICBpbXBvcnRlZENvbG9yczogeyAuLi50aGlzLmltcG9ydGVkQ29sb3JzIH0sXG4gICAgfTtcbiAgfVxuICAvKipcbiAgICogUmVtZW1iZXIgdGhlIGNsYXNzIGNvbG91cnMgYW4gaW1wb3J0ZWQgZmlsZSBjYXJyaWVkIChsYWJlbCDihpIgY29sb3VyKSwgc28gaXRzIHJlZ2lvbnMga2VlcFxuICAgKiB0aGVtOiBhIGNsYXNzIHdpdGggYSBwcmVzZXQga2VlcHMgdGhlIHByZXNldCdzIGNvbG91ciwgYW5kIHRoZSBsYXRlc3QgaW1wb3J0IHdpbnMgZm9yIHRoZVxuICAgKiByZXN0LiBOb3QgcGVyc2lzdGVkLlxuICAgKi9cbiAgcmVtZW1iZXJJbXBvcnRlZENsYXNzQ29sb3JzKGNvbG9yczogUmVhZG9ubHlNYXA8c3RyaW5nLCBzdHJpbmc+KTogdm9pZCB7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IFtsYWJlbCwgY29sb3JdIG9mIGNvbG9ycykge1xuICAgICAgaWYgKCFsYWJlbCB8fCBmaW5kUHJlc2V0KGxhYmVsLCB0aGlzLnByZXNldFNldCkpIGNvbnRpbnVlO1xuICAgICAgY29uc3Qga2V5ID0gcHJlc2V0S2V5KHRoaXMucHJlc2V0U2V0LCBsYWJlbCk7XG4gICAgICBpZiAodGhpcy5pbXBvcnRlZENvbG9yc1trZXldID09PSBjb2xvcikgY29udGludWU7XG4gICAgICB0aGlzLmltcG9ydGVkQ29sb3JzID0geyAuLi50aGlzLmltcG9ydGVkQ29sb3JzLCBba2V5XTogY29sb3IgfTtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlZCkgdGhpcy5lbWl0UHJlc2V0U2V0KCk7XG4gIH1cbiAgZ2V0UHJlc2V0U2V0JCgpOiBPYnNlcnZhYmxlPFByZXNldFNldD4ge1xuICAgIHJldHVybiB0aGlzLnByZXNldFNldCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgc2V0UHJlc2V0U2V0KHNldDogUHJlc2V0U2V0KTogdm9pZCB7XG4gICAgdGhpcy5wcmVzZXRTZXQgPSB0aGlzLm5vcm1hbGl6ZVByZXNldFNldChzZXQpO1xuICAgIHRoaXMuZW1pdFByZXNldFNldCgpO1xuICAgIHRoaXMuc2F2ZVByZXNldHNOb3coKTsgLy8gZXhwbGljaXQgYnVsayBhcHBseS9pbXBvcnQg4oaSIHBlcnNpc3QgaW1tZWRpYXRlbHlcbiAgfVxuICAvKiogQWRkIG9yIHVwZGF0ZSBhIGNsYXNzIChrZXllZCBieSBleGFjdCBzdG9yZWQgYG5hbWVgKS4gKi9cbiAgdXBzZXJ0Q2xhc3MocHJlc2V0OiBDbGFzc1ByZXNldCk6IHZvaWQge1xuICAgIGNvbnN0IGNsYXNzZXMgPSBbLi4udGhpcy5wcmVzZXRTZXQuY2xhc3Nlc107XG4gICAgY29uc3QgaSA9IGNsYXNzZXMuZmluZEluZGV4KChjKSA9PiBjLm5hbWUgPT09IHByZXNldC5uYW1lKTtcbiAgICBpZiAoaSA+PSAwKSBjbGFzc2VzW2ldID0geyAuLi5jbGFzc2VzW2ldLCAuLi5wcmVzZXQgfTtcbiAgICBlbHNlIGNsYXNzZXMucHVzaCh7IC4uLnByZXNldCB9KTtcbiAgICB0aGlzLnByZXNldFNldCA9IHsgLi4udGhpcy5wcmVzZXRTZXQsIGNsYXNzZXMgfTtcbiAgICB0aGlzLmVtaXRQcmVzZXRTZXQoKTtcbiAgICB0aGlzLnF1ZXVlUHJlc2V0U2F2ZSgpO1xuICB9XG4gIHJlbW92ZUNsYXNzKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucHJlc2V0U2V0ID0geyAuLi50aGlzLnByZXNldFNldCwgY2xhc3NlczogdGhpcy5wcmVzZXRTZXQuY2xhc3Nlcy5maWx0ZXIoKGMpID0+IGMubmFtZSAhPT0gbmFtZSkgfTtcbiAgICB0aGlzLmVtaXRQcmVzZXRTZXQoKTtcbiAgICB0aGlzLnF1ZXVlUHJlc2V0U2F2ZSgpO1xuICB9XG4gIHJlc2V0UHJlc2V0cygpOiB2b2lkIHtcbiAgICB0aGlzLnByZXNldFNldCA9IGRlZmF1bHRQcmVzZXRTZXQoKTtcbiAgICB0aGlzLmVtaXRQcmVzZXRTZXQoKTtcbiAgICB0aGlzLnNhdmVQcmVzZXRzTm93KCk7IC8vIGV4cGxpY2l0IHJlc2V0IOKGkiBwZXJzaXN0IGltbWVkaWF0ZWx5XG4gIH1cblxuICAvLyDilIDilIAgc3BhdGlhbC1vbWljcyB2aWV3IHN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBnZXRTcGF0aWFsVmlldyQoKTogT2JzZXJ2YWJsZTxTcGF0aWFsVmlld1N0YXRlPiB7XG4gICAgcmV0dXJuIHRoaXMuc3BhdGlhbFZpZXckLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqIFN5bmNocm9ub3VzIHJlYWQsIGZvciBhIHJlbmRlcmVyIGJ1aWxkaW5nIGl0cyBmaXJzdCBmcmFtZS4gKi9cbiAgY3VycmVudFNwYXRpYWxWaWV3KCk6IFNwYXRpYWxWaWV3U3RhdGUge1xuICAgIHJldHVybiB0aGlzLnNwYXRpYWxWaWV3JC52YWx1ZTtcbiAgfVxuXG4gIC8qKiBQYXRjaCB0aGUgc3BhdGlhbCB2aWV3IHN0YXRlOyBlbWl0cyBvbmNlIHdpdGggdGhlIG1lcmdlZCB2YWx1ZS4gKi9cbiAgc2V0U3BhdGlhbFZpZXcocGFydGlhbDogUGFydGlhbDxTcGF0aWFsVmlld1N0YXRlPik6IHZvaWQge1xuICAgIHRoaXMuc3BhdGlhbFZpZXckLm5leHQoeyAuLi50aGlzLnNwYXRpYWxWaWV3JC52YWx1ZSwgLi4ucGFydGlhbCB9KTtcbiAgfVxuXG4gIGdldEFjdGl2ZVRvb2wkKCk6IE9ic2VydmFibGU8c3RyaW5nIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZVRvb2wkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIHNldEFjdGl2ZVRvb2wodG9vbDogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlVG9vbCQubmV4dCh0b29sKTtcbiAgfVxufVxuIl19
439
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zdG9yZS92aXN1YWxpemVyLXN0b3JlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5QyxPQUFPLEVBQTBCLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQW1CLE1BQU0scUNBQXFDLENBQUM7QUFHeEYsT0FBTyxFQUFFLHFCQUFxQixFQUFpQixNQUFNLDZDQUE2QyxDQUFDO0FBQ25HLE9BQU8sRUFBRSxvQkFBb0IsRUFBb0IsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFFckQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsTUFBTSxPQUFPLGVBQWU7SUFxRDFCLDBFQUEwRTtJQUMxRSwyRUFBMkU7SUFDM0UsMkJBQTJCO0lBQzNCLFlBQW1FLFlBQW9DLElBQUk7UUFBeEMsY0FBUyxHQUFULFNBQVMsQ0FBK0I7UUF2RDNHLHdFQUF3RTtRQUN4RSw4RUFBOEU7UUFDOUUscURBQXFEO1FBQ3BDLGNBQVMsR0FBRyxJQUFJLGVBQWUsQ0FDOUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxXQUFXLENB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OzJCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE9wdGlvbmFsLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBDbGFzc1ByZXNldCwgUHJlc2V0U2V0LCBkZWZhdWx0UHJlc2V0U2V0IH0gZnJvbSAnLi4vbW9kZWxzL2NsYXNzLXByZXNldCc7XG5pbXBvcnQgeyBmaW5kUHJlc2V0LCBwcmVzZXRLZXkgfSBmcm9tICcuL2NsYXNzLWNvbG9yLnV0aWwnO1xuaW1wb3J0IHsgUFJFRkVSRU5DRVNfUE9SVCwgUHJlZmVyZW5jZXNQb3J0IH0gZnJvbSAnLi4vY29udHJhY3RzL3BvcnRzL3ByZWZlcmVuY2VzLnBvcnQnO1xuXG5pbXBvcnQgeyBJQ2hhbm5lbEluZm8sIElJbWFnZU1ldGFkYXRhIH0gZnJvbSAnLi4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IGRlZmF1bHRDaGFubmVsVmlzaWJsZSwgSUNoYW5uZWxTdGF0ZSB9IGZyb20gJy4uL2NvbnRyYWN0cy9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHsgREVGQVVMVF9TUEFUSUFMX1ZJRVcsIFNwYXRpYWxWaWV3U3RhdGUgfSBmcm9tICcuLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBDT0xPUk1BUF9PUFRJT05TIH0gZnJvbSAnLi4vcGxvdC51dGlsaXRpZXMnO1xuXG4vKipcbiAqIEJhY2tlbmQtbmV1dHJhbCBzdG9yZSBmb3IgdGhlICoqdmlzdWFsaXphdGlvbiBzZXNzaW9uKiog4oCUIHRoZSBzdGF0ZSB0aGF0XG4gKiBkZXNjcmliZXMgKmhvdyogdGhlIGN1cnJlbnQgaW1hZ2UgaXMgYmVpbmcgdmlld2VkLCBpbmRlcGVuZGVudCBvZiB3aGljaFxuICogcmVuZGVyaW5nIGJhY2tlbmQgKFBsb3RseSwgT3BlblNlYWRyYWdvbiBvciBuYXBhcmktanMpIGlzIG9uIHNjcmVlbjpcbiAqXG4gKiAgLSB0aGUgYWN0aXZlIGNvbG9ybWFwIC8gTFVUIGFuZCBpdHMgcmV2ZXJzZS1zY2FsZSB0b2dnbGUsXG4gKiAgLSB0aGUgY3VycmVudCBpbWFnZSdzIHBoeXNpY2FsIG1ldGFkYXRhICjCtW0vcGl4ZWwgZXRjLikgYW5kIGl0cyBwZXItY2hhbm5lbFxuICogICAgZGlzcGxheSBzdGF0ZSAod2luZG93LCBnYW1tYSwgdGludCwgdmlzaWJpbGl0eTsgZ3JheXNjYWxlIC8gaW52ZXJ0KSxcbiAqICAtIHRoZSBhbm5vdGF0aW9uLWNsYXNzIHByZXNldHMgKHRoZSBjbGFzc2lmaWNhdGlvbiBsYWJlbCDihpIgY29sb3VyIG1hcCksXG4gKiAgLSB0aGUgc3BhdGlhbC1vbWljcyB2aWV3IHN0YXRlLFxuICogIC0gd2hpY2ggb24tY2FudmFzIHRvb2wgaXMgY3VycmVudGx5IGFjdGl2ZS5cbiAqXG4gKiBFdmVyeSBiYWNrZW5kIHJlYWRzIGFuZCB3cml0ZXMgdGhpcyBzaW5nbGUgaW5zdGFuY2UgKG9uZSBwZXIgdmlzdWFsaXplciBjaGFpbiksXG4gKiBzbyB0aGV5IHN0YXkgaW4gbG9jay1zdGVwIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggb25lIGlzIHJlbmRlcmluZzsgbm9uZSBvZiB0aGVtXG4gKiBvd25zIHRoZSBzZXNzaW9uIHN0YXRlLiBSZWdpb24gZ2VvbWV0cnkgbGl2ZXMgaW4gdGhlIHNpYmxpbmcgYFJlZ2lvblN0b3JlYC5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBWaXN1YWxpemVyU3RvcmUge1xuICAvLyDilIDilIAgQ29sb3JtYXAgLyBMVVQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIERlZmF1bHQgdG8gaW52ZXJ0ZWQgZ3JleXMgKGRhcmsgYmFja2dyb3VuZCDihpIgYnJpZ2h0IHNpZ25hbCksIHdoaWNoIHJlYWRzIGFzXG4gIC8vIHRoZSBuYXR1cmFsIGdyYXlzY2FsZSBmb3IgdGhlc2UgbWljcm9zY29weSBpbWFnZXMuXG4gIHByaXZhdGUgcmVhZG9ubHkgY29sb3JtYXAkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KFxuICAgIENPTE9STUFQX09QVElPTlNbMF0uY2hpbGRyZW4uZmluZCgoYzogYW55KSA9PiBjLmxhYmVsID09PSAnR3JleXMgSW52JykgPz8gQ09MT1JNQVBfT1BUSU9OU1swXS5jaGlsZHJlblswXSxcbiAgKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZXZlcnNlU2NhbGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgLy8g4pSA4pSAIEltYWdlIG1ldGFkYXRhIChwaHlzaWNhbCBwaXhlbCBzaXplLCBjaGFubmVscywg4oCmKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgcHJpdmF0ZSByZWFkb25seSBpbWFnZU1ldGEkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJSW1hZ2VNZXRhZGF0YVtdPihbXSk7XG5cbiAgLy8g4pSA4pSAIENoYW5uZWxzICYgaGlzdG9ncmFtIGRpc3BsYXkgc3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFBlci1jaGFubmVsIGRpc3BsYXkgd2luZG93L2dhbW1hL3Zpc2liaWxpdHkvY29sb3VyLCBkZXJpdmVkIGZyb20gdGhlIGltYWdlXG4gIC8vIG1ldGFkYXRhIG9uIGxvYWQgKDEgXCJJbnRlbnNpdHlcIiBjaGFubmVsIGZvciBncmF5c2NhbGU7IFIvRy9CIGZvciBSR0IpLiBUaGVcbiAgLy8gQ2hhbm5lbHMgJiBIaXN0b2dyYW0gcGFuZSBlZGl0cyB0aGVzZSBhbmQgYm90aCBiYWNrZW5kcyByZWNvbG9yIGxpdmUuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhbm5lbFN0YXRlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElDaGFubmVsU3RhdGVbXT4oW10pO1xuICAvKiogSW5kZXggb2YgdGhlIGNoYW5uZWwgc2VsZWN0ZWQgaW4gdGhlIENoYW5uZWxzIHBhbmUg4oCUIHRoZSBPTkUgYmFuZCBhXG4gICAqICBzaW5nbGUtc2NhbGFyIDNEIHZpZXcgKHRoZSBuYXBhcmkgU3VyZmFjZSkgZm9sbG93cyBmb3IgYSBtdWx0aWNoYW5uZWwgaW1hZ2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0ZWRDaGFubmVsJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgLy8gVGhlIGRlcml2ZWQgZGVmYXVsdHMgKGZ1bGwgd2luZG93LCBnYW1tYSAxLCBkZWZhdWx0IHRpbnQpIGZvciB0aGUgY3VycmVudFxuICAvLyBpbWFnZSwga2VwdCBzbyBcIlJlc2V0XCIgY2FuIHJlc3RvcmUgYSBjaGFubmVsJ3Mgd2luZG93L2dhbW1hL2NvbG91ci5cbiAgcHJpdmF0ZSBkZWZhdWx0Q2hhbm5lbFN0YXRlczogSUNoYW5uZWxTdGF0ZVtdID0gW107XG4gIC8qKiBUaGUgaW1hZ2UgdGhlIGN1cnJlbnQgY2hhbm5lbCBzdGF0ZXMgd2VyZSBkZXJpdmVkIGZvciAoc2VlIHNldEltYWdlTWV0YSkuICovXG4gIHByaXZhdGUgY2hhbm5lbEltYWdlS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8vIEdyYXlzY2FsZSBkaXNwbGF5IChpZ25vcmUgdGhlIGNoYW5uZWwgdGludHMpIGFuZCBpbnZlcnRlZCBiYWNrZ3JvdW5kIOKAlCBib3RoXG4gIC8vIGdsb2JhbCBkaXNwbGF5IGZsYWdzLCBsaWtlIHRoZSBjb2xvcm1hcC5cbiAgcHJpdmF0ZSByZWFkb25seSBncmF5c2NhbGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW52ZXJ0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8vIOKUgOKUgCBBbm5vdGF0aW9uIGNsYXNzIHByZXNldHMgKGppdC11aSM3MCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFRoZSBwZXItdXNlciwgc2VydmVyLXBlcnNpc3RlZCBzb3VyY2Ugb2YgdHJ1dGggZm9yIHJlZ2lvbiBjb2xvdXJzLCBzZWVkZWRcbiAgLy8gZnJvbSB0aGUgaGlzdG9yaWNhbCBkZWZhdWx0IGNsYXNzZXMuIExvYWRlZC9zYXZlZCB2aWEgdGhlIG9wdGlvbmFsXG4gIC8vIFByZWZlcmVuY2VzUG9ydCAoYXBwLXNpZGUgYWRhcHRlciDihpIgaml0LXNlcnZpY2UpLiBnZXRDbGFzc2lmaWNhdGlvbkNvbG9ycygpXG4gIC8vIGJlbG93IHN0YXlzIGFzIGEgbmFtZeKGkmNvbG91ciB2aWV3IGZvciB0aGUgYmFja2VuZHMnIHJlZ2lvbiByZW5kZXJlcnMuXG4gIHByaXZhdGUgcHJlc2V0U2V0OiBQcmVzZXRTZXQgPSBkZWZhdWx0UHJlc2V0U2V0KCk7XG4gIC8qKiBTZXNzaW9uLW9ubHkgY2xhc3MgY29sb3VycyBmcm9tIGltcG9ydGVkIGZpbGVzIChzZWUgUHJlc2V0U2V0LmltcG9ydGVkQ29sb3JzKS4gKi9cbiAgcHJpdmF0ZSBpbXBvcnRlZENvbG9yczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IHByZXNldFNldCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFByZXNldFNldD4odGhpcy5wcmVzZXRTZXQpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNhdmVQcmVzZXRzJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgcHJlc2V0c0xvYWRlZCA9IGZhbHNlO1xuXG4gIC8vIOKUgOKUgCBBY3RpdmUgb24tY2FudmFzIHRvb2wg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFdoaWNoIHRvb2wgdGhlIHVzZXIgaGFzIGFybWVkIChwYW4sIHpvb20sIGRyYXdyZWN0LCB3YW5kLCBlcmFzZXIsIOKApikgb3JcbiAgLy8gbnVsbCB3aGVuIG5vbmUgaXMgYWN0aXZlLiBUaGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdG9vbCBzdGF0ZSBhY3Jvc3NcbiAgLy8gdGhlIHRvb2xiYXIgYW5kIHdoaWNoZXZlciBiYWNrZW5kJ3Mgb3ZlcmxheSBoYW5kbGVzIHRoZSBwb2ludGVyLlxuICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2ZVRvb2wkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAvKiogU3BhdGlhbC1vbWljcyBkaXNwbGF5IHN0YXRlIChjb2xvdXIgc291cmNlLCBwb2ludCBzaXplLCBhbHBoYSwgc2NhbGluZykuXG4gICAqICBIZWxkIGhlcmUsIG5leHQgdG8gdGhlIGNvbG9ybWFwL2NoYW5uZWwgc3RhdGUsIHNvIHRoZSBhY3RpdmUgYmFja2VuZCByZWFjdHNcbiAgICogIHRvIGFuIGVkaXQgZXhhY3RseSBhcyBpdCBkb2VzIGZvciBhbiBpbWFnZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzcGF0aWFsVmlldyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNwYXRpYWxWaWV3U3RhdGU+KHsgLi4uREVGQVVMVF9TUEFUSUFMX1ZJRVcgfSk7XG5cbiAgLy8gT3B0aW9uYWwgKyBudWxsIGRlZmF1bHQgc28gdGhlIHN0b3JlIGNhbiBiZSBjb25zdHJ1Y3RlZCBib3RoIHZpYSBESSBhbmRcbiAgLy8gZGlyZWN0bHkgKGBuZXcgVmlzdWFsaXplclN0b3JlKClgIGluIHVuaXQgdGVzdHMpOyBwcmVzZXQgbG9hZC9zYXZlIG5vLW9wXG4gIC8vIHdoZW4gdGhlIHBvcnQgaXMgYWJzZW50LlxuICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBASW5qZWN0KFBSRUZFUkVOQ0VTX1BPUlQpIHByaXZhdGUgcmVhZG9ubHkgcHJlZnNQb3J0OiBQcmVmZXJlbmNlc1BvcnQgfCBudWxsID0gbnVsbCkge1xuICAgIHRoaXMuaW5pdFByZXNldFBlcnNpc3RlbmNlKCk7XG4gIH1cblxuICAvLyDilIDilIAgUHJlc2V0IHBlcnNpc3RlbmNlIChqaXQtdWkjNzApIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBwcml2YXRlIGluaXRQcmVzZXRQZXJzaXN0ZW5jZSgpOiB2b2lkIHtcbiAgICAvLyBEZWJvdW5jZWQgd3JpdGUtYmFjayBzbyBhIGJ1cnN0IG9mIGVkaXRzIGNvbGxhcHNlcyBpbnRvIG9uZSBQVVQuXG4gICAgdGhpcy5zYXZlUHJlc2V0cyQucGlwZShkZWJvdW5jZVRpbWUoODAwKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMucHJlZnNQb3J0Py5zYXZlUHJlc2V0U2V0KHRoaXMucHJlc2V0U2V0KS5zdWJzY3JpYmUoe1xuICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgIC8qIGtlZXAgbG9jYWwgY29weSAqL1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgLy8gTG9hZCB0aGUgdXNlcidzIHNhdmVkIHNldCAoaWYgYW55KTsgb3RoZXJ3aXNlIGtlZXAgdGhlIHNlZWRlZCBkZWZhdWx0cy5cbiAgICB0aGlzLnByZWZzUG9ydD8ubG9hZFByZXNldFNldCgpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoc2V0KSA9PiB7XG4gICAgICAgIGlmIChzZXQgJiYgQXJyYXkuaXNBcnJheShzZXQuY2xhc3NlcykgJiYgc2V0LmNsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMucHJlc2V0U2V0ID0gdGhpcy5ub3JtYWxpemVQcmVzZXRTZXQoc2V0KTtcbiAgICAgICAgICB0aGlzLmVtaXRQcmVzZXRTZXQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZXNldHNMb2FkZWQgPSB0cnVlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMucHJlc2V0c0xvYWRlZCA9IHRydWU7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFB1Ymxpc2ggdGhlIHByZXNldCBzZXQgd2l0aCB0aGlzIHNlc3Npb24ncyBpbXBvcnRlZCBjbGFzcyBjb2xvdXJzLiAqL1xuICBwcml2YXRlIGVtaXRQcmVzZXRTZXQoKTogdm9pZCB7XG4gICAgdGhpcy5wcmVzZXRTZXQkLm5leHQoeyAuLi50aGlzLnByZXNldFNldCwgaW1wb3J0ZWRDb2xvcnM6IHRoaXMuaW1wb3J0ZWRDb2xvcnMgfSk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZVByZXNldFNldChzZXQ6IFByZXNldFNldCk6IFByZXNldFNldCB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSBkZWZhdWx0UHJlc2V0U2V0KCk7XG4gICAgLy8gQ2xvbmUgdGhlIG5lc3RlZCBhcnJheXMvb2JqZWN0cyBzbyBvdXRzaWRlIGNhbGxlcnMgY2FuJ3QgbXV0YXRlIHRoZSBzdG9yZSdzXG4gICAgLy8gaW50ZXJuYWwgc3RhdGUgd2l0aG91dCBnb2luZyB0aHJvdWdoIHNldFByZXNldFNldCgpL3Vwc2VydENsYXNzKCkuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNsYXNzZXM6IEFycmF5LmlzQXJyYXkoc2V0LmNsYXNzZXMpID8gc2V0LmNsYXNzZXMubWFwKChjKSA9PiAoeyAuLi5jIH0pKSA6IFtdLFxuICAgICAgZmFsbGJhY2tQYWxldHRlOlxuICAgICAgICBBcnJheS5pc0FycmF5KHNldC5mYWxsYmFja1BhbGV0dGUpICYmIHNldC5mYWxsYmFja1BhbGV0dGUubGVuZ3RoXG4gICAgICAgICAgPyBbLi4uc2V0LmZhbGxiYWNrUGFsZXR0ZV1cbiAgICAgICAgICA6IGRlZmF1bHRzLmZhbGxiYWNrUGFsZXR0ZSxcbiAgICAgIGF1dG9Qcm9tb3RlOiAhIXNldC5hdXRvUHJvbW90ZSxcbiAgICAgIG1hdGNoTW9kZTogc2V0Lm1hdGNoTW9kZSA9PT0gJ25vcm1hbGl6ZWQnID8gJ25vcm1hbGl6ZWQnIDogJ2V4YWN0JyxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFF1ZXVlIGEgZGVib3VuY2VkIHNhdmUuIE5vLW9wcyB1bnRpbCB0aGUgaW5pdGlhbCBsb2FkIHJlc29sdmVzIChhbmQgd2hlbiBubyBwb3J0IGlzIGJvdW5kKS4gKi9cbiAgcHJpdmF0ZSBxdWV1ZVByZXNldFNhdmUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJlc2V0c0xvYWRlZCkgdGhpcy5zYXZlUHJlc2V0cyQubmV4dCgpO1xuICB9XG5cbiAgLyoqIFBlcnNpc3QgdGhlIGN1cnJlbnQgcHJlc2V0IHNldCBpbW1lZGlhdGVseSwgYnlwYXNzaW5nIHRoZSBpbmNyZW1lbnRhbC1lZGl0XG4gICAqICBkZWJvdW5jZS4gVXNlZCBmb3IgZXhwbGljaXQgYnVsayBhY3Rpb25zIChBcHBseSAvIEltcG9ydCAvIFJlc2V0KS4gKi9cbiAgcHJpdmF0ZSBzYXZlUHJlc2V0c05vdygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcmVzZXRzTG9hZGVkKSB7XG4gICAgICB0aGlzLnByZWZzUG9ydD8uc2F2ZVByZXNldFNldCh0aGlzLnByZXNldFNldCkuc3Vic2NyaWJlKHtcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICAvKiBrZWVwIGxvY2FsIGNvcHkgKi9cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgYXZhaWxhYmxlIGNvbG9ybWFwIG9wdGlvbnMgKHRyZWUgZm9yIHRoZSBMVVQgZHJvcGRvd24pLiAqL1xuICBnZXRDb2xvcm1hcE9wdGlvbnMoKTogYW55IHtcbiAgICByZXR1cm4gQ09MT1JNQVBfT1BUSU9OUztcbiAgfVxuXG4gIGdldENvbG9ybWFwKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuY29sb3JtYXAkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIC8qKiBTeW5jaHJvbm91cyBjdXJyZW50IHZhbHVlIOKAlCBmb3IgcmVuZGVyIHBhdGhzIHRoYXQgcmVhZCBpdCB3aGlsZSBidWlsZGluZ1xuICAgKiAgYSBmcmFtZSAoZS5nLiBQbG90bHkncyBjb2xvcnNjYWxlKSByYXRoZXIgdGhhbiBzdWJzY3JpYmluZy4gKi9cbiAgY3VycmVudENvbG9ybWFwKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuY29sb3JtYXAkLnZhbHVlO1xuICB9XG4gIHNldENvbG9ybWFwKGNvbG9ybWFwOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmNvbG9ybWFwJC5uZXh0KGNvbG9ybWFwKTtcbiAgfVxuXG4gIGdldFJldmVyc2VTY2FsZSgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5yZXZlcnNlU2NhbGUkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGN1cnJlbnRSZXZlcnNlU2NhbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmV2ZXJzZVNjYWxlJC52YWx1ZTtcbiAgfVxuICBzZXRSZXZlcnNlU2NhbGUocmV2ZXJzZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucmV2ZXJzZVNjYWxlJC5uZXh0KHJldmVyc2UpO1xuICB9XG5cbiAgZ2V0SW1hZ2VNZXRhKCk6IE9ic2VydmFibGU8SUltYWdlTWV0YWRhdGFbXT4ge1xuICAgIHJldHVybiB0aGlzLmltYWdlTWV0YSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogUGF0Y2ggdGhlIHBoeXNpY2FsIHBpeGVsIHNpemUgKMK1bS9waXhlbCkgb250byB0aGUgY3VycmVudCBpbWFnZSBtZXRhIGFuZFxuICAgKiByZS1lbWl0LCB3aXRob3V0IHRvdWNoaW5nIHRoZSBkZXJpdmVkIGNoYW5uZWxzLiBUaGUgT1NEIHRpbGUgZGVzY3JpcHRvclxuICAgKiAoZnJvbSB0aGUgc2VydmVyJ3MgQmlvLUZvcm1hdHMgYC90aWxlcy9pbmZvYCkgaXMgYXV0aG9yaXRhdGl2ZSBmb3Igc2NhbGVkXG4gICAqIGltYWdlcyDigJQgYGltYWdlSW5mby5pbWFnZU1ldGFgIG9mdGVuIGNhcnJpZXMgbm8gbXBwIOKAlCBzbyB0aGUgcmVuZGVyZXIgZmVlZHNcbiAgICogaXQgaGVyZSBvbmNlIHRoZSBkZXNjcmlwdG9yIGxvYWRzLCBsZXR0aW5nIGFyZWEvc2NhbGUgY29uc3VtZXJzICh0aGUgUmVnaW9uXG4gICAqIEVkaXRvcikgc2hvdyDCtW3Csi9tbcKyIGluc3RlYWQgb2YgcHjCsi4gTm8tb3Agd2hlbiBuZWl0aGVyIGF4aXMgaXMgcG9zaXRpdmUuXG4gICAqL1xuICBzZXRQaHlzaWNhbFBpeGVsU2l6ZShtcHBYPzogbnVtYmVyLCBtcHBZPzogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgaGFzWCA9IChtcHBYID8/IDApID4gMCxcbiAgICAgIGhhc1kgPSAobXBwWSA/PyAwKSA+IDA7XG4gICAgaWYgKCFoYXNYICYmICFoYXNZKSByZXR1cm47XG4gICAgY29uc3QgY3VyID0gdGhpcy5pbWFnZU1ldGEkLnZhbHVlO1xuICAgIGNvbnN0IG1ldGEgPSAoY3VyICYmIGN1ci5sZW5ndGggPyBjdXIgOiBbe30gYXMgSUltYWdlTWV0YWRhdGFdKS5tYXAoKGUpID0+ICh7IC4uLmUgfSkpO1xuICAgIGlmIChoYXNYKSBtZXRhWzBdLm1wcFggPSBtcHBYO1xuICAgIGlmIChoYXNZKSBtZXRhWzBdLm1wcFkgPSBtcHBZO1xuICAgIHRoaXMuaW1hZ2VNZXRhJC5uZXh0KG1ldGEpO1xuICB9XG4gIC8qKlxuICAgKiBGaWxsIGluIHRoZSBjaGFubmVsIG5hbWVzIGFuZCB0aW50cyB0aGUgaG9zdCdzIGltYWdlIG1ldGEgbGVmdCBvdXQsIGZyb20gdGhlIGltYWdlJ3MgdGlsZVxuICAgKiBkZXNjcmlwdG9yOiB0aGUgc2VydmVyIHJlYWRzIHRoZW0gZnJvbSB0aGUgZmlsZSAoYW4gT01FLVRJRkYncyBjaGFubmVsIG5hbWVzLCBzdWNoIGFzIEN5dG9zJ3NcbiAgICogXCJBY3RpblwiIG9yIFwiQ2VsbC1NZW1icmFuZVwiKSwgd2hlcmUgYSBob3N0J3MgbWV0YWRhdGEgKGppdC11aSdzIGAvbWV0YWRhdGFgKSBjYXJyaWVzIG5vbmUsIHNvXG4gICAqIHRoZSBDaGFubmVscyBwYW5lIHNob3dlZCBcIkNoYW5uZWwgMVwiLCBcIkNoYW5uZWwgMlwi4oCmIFRoZSBob3N0J3Mgb3duIG5hbWVzIGFuZCB0aW50cyB3aW47IG9ubHkgYVxuICAgKiBjaGFubmVsIHN0aWxsIHNob3dpbmcgaXRzIGRlcml2ZWQgZGVmYXVsdCB0YWtlcyB0aGUgZGVzY3JpcHRvcidzLCBzbyBhbiBlZGl0IG1hZGUgaW4gdGhlIHBhbmVcbiAgICogc3RheXMuIEEgbm8tb3Agd2hlbiB0aGUgY2hhbm5lbCBjb3VudHMgZGlmZmVyLCBvciBmb3IgUkdCLlxuICAgKi9cbiAgYWRvcHRDaGFubmVsSW5mbyhpbmZvOiBSZWFkb25seUFycmF5PHsgbmFtZT86IHN0cmluZzsgY29sb3I/OiBzdHJpbmcgfT4gfCBudWxsIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuaW1hZ2VNZXRhJC52YWx1ZTtcbiAgICBjb25zdCBtMCA9IG1ldGE/LlswXTtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jaGFubmVsU3RhdGVzJC52YWx1ZTtcbiAgICBpZiAoIWluZm8/Lmxlbmd0aCB8fCAhbTAgfHwgKG0wLnJnYkNoYW5uZWxzID8/IDEpID49IDMpIHJldHVybjtcbiAgICBpZiAoKG0wLmNoYW5uZWxDb3VudCA/PyAxKSAhPT0gaW5mby5sZW5ndGggfHwgY3VycmVudC5sZW5ndGggIT09IGluZm8ubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgaG9zdCA9IG0wLmNoYW5uZWxJbmZvID8/IFtdO1xuICAgIGNvbnN0IG1lcmdlZDogSUNoYW5uZWxJbmZvW10gPSBpbmZvLm1hcCgoZCwgaSkgPT4gKHtcbiAgICAgIC4uLihob3N0W2ldID8/IHt9KSxcbiAgICAgIG5hbWU6IGhvc3RbaV0/Lm5hbWUgfHwgZC5uYW1lIHx8ICcnLFxuICAgICAgY29sb3I6IGhvc3RbaV0/LmNvbG9yIHx8IGQuY29sb3IgfHwgJycsXG4gICAgfSkpO1xuICAgIGNvbnN0IGJlZm9yZSA9IHRoaXMuZGVmYXVsdENoYW5uZWxTdGF0ZXM7XG4gICAgY29uc3QgbmV4dE1ldGEgPSBtZXRhLm1hcCgoZSwgaykgPT4gKGsgPT09IDAgPyB7IC4uLmUsIGNoYW5uZWxJbmZvOiBtZXJnZWQgfSA6IGUpKTtcbiAgICB0aGlzLmltYWdlTWV0YSQubmV4dChuZXh0TWV0YSk7XG4gICAgY29uc3QgbmV4dCA9IHRoaXMuZGVyaXZlQ2hhbm5lbHMobmV4dE1ldGEpO1xuICAgIHRoaXMuZGVmYXVsdENoYW5uZWxTdGF0ZXMgPSBuZXh0Lm1hcCgoYykgPT4gKHsgLi4uYyB9KSk7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBjb25zdCBzdGF0ZXMgPSBjdXJyZW50Lm1hcCgoc3QsIGkpID0+IHtcbiAgICAgIGNvbnN0IHdhcyA9IGJlZm9yZVtpXTtcbiAgICAgIGNvbnN0IG5vdyA9IG5leHRbaV07XG4gICAgICBpZiAoIXdhcyB8fCAhbm93KSByZXR1cm4gc3Q7XG4gICAgICBjb25zdCBwYXRjaDogUGFydGlhbDxJQ2hhbm5lbFN0YXRlPiA9IHt9O1xuICAgICAgaWYgKHN0Lm5hbWUgPT09IHdhcy5uYW1lICYmIG5vdy5uYW1lICE9PSB3YXMubmFtZSkgcGF0Y2gubmFtZSA9IG5vdy5uYW1lO1xuICAgICAgaWYgKHN0LmNvbG9yID09PSB3YXMuY29sb3IgJiYgbm93LmNvbG9yICE9PSB3YXMuY29sb3IpIHBhdGNoLmNvbG9yID0gbm93LmNvbG9yO1xuICAgICAgaWYgKCFPYmplY3Qua2V5cyhwYXRjaCkubGVuZ3RoKSByZXR1cm4gc3Q7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIHJldHVybiB7IC4uLnN0LCAuLi5wYXRjaCB9O1xuICAgIH0pO1xuICAgIGlmIChjaGFuZ2VkKSB0aGlzLmNoYW5uZWxTdGF0ZXMkLm5leHQoc3RhdGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoIHRoZSBjdXJyZW50IGltYWdlJ3MgbWV0YWRhdGEgYW5kIGRlcml2ZSBpdHMgY2hhbm5lbHMuXG4gICAqXG4gICAqIGBpbWFnZUtleWAgaWRlbnRpZmllcyB0aGUgaW1hZ2UgKGl0cyBmaWxlIG5hbWUpLiBBIHJlLXBsb3Qgb2YgdGhlIFNBTUUgaW1hZ2VcbiAgICoga2VlcHMgdGhlIHVzZXIncyB3aW5kb3cvZ2FtbWEvdGludCBlZGl0czsgYSBkaWZmZXJlbnQgaW1hZ2UgZ2V0cyBpdHMgb3duXG4gICAqIGRlcml2ZWQgY2hhbm5lbHMgZXZlbiBhdCB0aGUgc2FtZSBjaGFubmVsIGNvdW50IOKAlCBrZXlpbmcgb24gdGhlIGNvdW50IGFsb25lXG4gICAqIGxlZnQgYSBEQVBJL0dGUC9SRlAgc3RhY2sncyBuYW1lcywgdGludHMgYW5kIHdpbmRvd3Mgb24gYSBmb2xsb3dpbmdcbiAgICogQ0QzL0NEOC9QYW5DSyBvbmUuIFdpdGhvdXQgYSBrZXksIG9ubHkgYSBjaGFuZ2Ugb2YgY2hhbm5lbCBjb3VudCByZS1kZXJpdmVzLlxuICAgKi9cbiAgc2V0SW1hZ2VNZXRhKGltYWdlTWV0YTogSUltYWdlTWV0YWRhdGFbXSwgaW1hZ2VLZXk/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmltYWdlTWV0YSQubmV4dChpbWFnZU1ldGEpO1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLmRlcml2ZUNoYW5uZWxzKGltYWdlTWV0YSk7XG4gICAgLy8gQWx3YXlzIHJlZnJlc2ggdGhlIHJlc2V0IGJhc2VsaW5lIHRvIHRoZSBjdXJyZW50IGltYWdlJ3MgZGVyaXZlZCBkZWZhdWx0c1xuICAgIC8vIChuYW1lcy9jb2xvdXJzIGNhbiBkaWZmZXIgZXZlbiBhdCB0aGUgc2FtZSBjaGFubmVsIGNvdW50KS5cbiAgICB0aGlzLmRlZmF1bHRDaGFubmVsU3RhdGVzID0gbmV4dC5tYXAoKGMpID0+ICh7IC4uLmMgfSkpO1xuICAgIGNvbnN0IG90aGVySW1hZ2UgPSBpbWFnZUtleSAhPT0gdW5kZWZpbmVkICYmIGltYWdlS2V5ICE9PSB0aGlzLmNoYW5uZWxJbWFnZUtleTtcbiAgICBpZiAoaW1hZ2VLZXkgIT09IHVuZGVmaW5lZCkgdGhpcy5jaGFubmVsSW1hZ2VLZXkgPSBpbWFnZUtleTtcbiAgICBpZiAob3RoZXJJbWFnZSB8fCBuZXh0Lmxlbmd0aCAhPT0gdGhpcy5jaGFubmVsU3RhdGVzJC52YWx1ZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY2hhbm5lbFN0YXRlcyQubmV4dChuZXh0KTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRDaGFubmVsJC5uZXh0KDApOyAvLyBuZXcgaW1hZ2UgLyBjaGFubmVsIHN0cnVjdHVyZSDihpIgcmVzZXQgdGhlIHNlbGVjdGVkIGJhbmRcbiAgICB9XG4gIH1cblxuICAvKiogQ2hhbm5lbHMgZm9yIGFuIGltYWdlOlxuICAgKiAgIC0gUkdCIChyZ2JDaGFubmVscyDiiaUgMykg4oaSIFJlZC9HcmVlbi9CbHVlO1xuICAgKiAgIC0gbXVsdGljaGFubmVsIGZsdW9yZXNjZW5jZSAoY2hhbm5lbENvdW50ID4gMSkg4oaSIG9uZSBjaGFubmVsIHBlciBiYW5kLFxuICAgKiAgICAgbmFtZWQvdGludGVkIGZyb20gdGhlIHNlcnZlciBgY2hhbm5lbEluZm9gIHdoZW4gcHJlc2VudCwgZWxzZSBhIHBhbGV0dGU7XG4gICAqICAgICBvbmx5IHRoZSBmaXJzdCBgREVGQVVMVF9WSVNJQkxFX0NIQU5ORUxTYCBzdGFydCB2aXNpYmxlIChzZWUgYGRlZmF1bHRDaGFubmVsVmlzaWJsZWApO1xuICAgKiAgIC0gb3RoZXJ3aXNlIGEgc2luZ2xlIGdyYXlzY2FsZSBcIkludGVuc2l0eVwiIGNoYW5uZWwuICovXG4gIHByaXZhdGUgZGVyaXZlQ2hhbm5lbHMobWV0YTogSUltYWdlTWV0YWRhdGFbXSk6IElDaGFubmVsU3RhdGVbXSB7XG4gICAgY29uc3QgYmFzZSA9IHsgbWluOiAwLCBtYXg6IDI1NSwgZ2FtbWE6IDEsIHZpc2libGU6IHRydWUgfTtcbiAgICBjb25zdCBtID0gbWV0YT8uWzBdO1xuICAgIGlmICgobT8ucmdiQ2hhbm5lbHMgPz8gMSkgPj0gMykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgeyBpbmRleDogMCwgbmFtZTogJ1JlZCcsIGNvbG9yOiAnI2ZmMDAwMCcsIC4uLmJhc2UgfSxcbiAgICAgICAgeyBpbmRleDogMSwgbmFtZTogJ0dyZWVuJywgY29sb3I6ICcjMDBmZjAwJywgLi4uYmFzZSB9LFxuICAgICAgICB7IGluZGV4OiAyLCBuYW1lOiAnQmx1ZScsIGNvbG9yOiAnIzAwMDBmZicsIC4uLmJhc2UgfSxcbiAgICAgIF07XG4gICAgfVxuICAgIGNvbnN0IGNvdW50ID0gbT8uY2hhbm5lbENvdW50ID8/IDE7XG4gICAgaWYgKGNvdW50ID4gMSkge1xuICAgICAgY29uc3QgaW5mbyA9IG0/LmNoYW5uZWxJbmZvO1xuICAgICAgLy8gRmFsbGJhY2sgdGludHMgKEZpamktaXNoKSB3aGVuIHRoZSBzZXJ2ZXIgZG9lc24ndCBzdXBwbHkgYSBjb2xvci5cbiAgICAgIGNvbnN0IHBhbGV0dGUgPSBbJyNmZjAwMDAnLCAnIzAwZmYwMCcsICcjMDAwMGZmJywgJyNmZmZmZmYnLCAnIzAwZmZmZicsICcjZmYwMGZmJywgJyNmZmZmMDAnXTtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoXywgaSkgPT4gKHtcbiAgICAgICAgaW5kZXg6IGksXG4gICAgICAgIG5hbWU6IGluZm8/LltpXT8ubmFtZSB8fCBgQ2hhbm5lbCAke2kgKyAxfWAsXG4gICAgICAgIGNvbG9yOiBpbmZvPy5baV0/LmNvbG9yIHx8IHBhbGV0dGVbaSAlIHBhbGV0dGUubGVuZ3RoXSxcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgdmlzaWJsZTogZGVmYXVsdENoYW5uZWxWaXNpYmxlKGksIGNvdW50LCBpbmZvPy5baV0/LnZpc2libGUpLFxuICAgICAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4gW3sgaW5kZXg6IDAsIG5hbWU6ICdJbnRlbnNpdHknLCBjb2xvcjogJyNmZmZmZmYnLCAuLi5iYXNlIH1dO1xuICB9XG5cbiAgLy8g4pSA4pSAIENoYW5uZWxzICYgaGlzdG9ncmFtIHN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBnZXRDaGFubmVsU3RhdGVzKCk6IE9ic2VydmFibGU8SUNoYW5uZWxTdGF0ZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbm5lbFN0YXRlcyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgY3VycmVudENoYW5uZWxTdGF0ZXMoKTogSUNoYW5uZWxTdGF0ZVtdIHtcbiAgICByZXR1cm4gdGhpcy5jaGFubmVsU3RhdGVzJC52YWx1ZTtcbiAgfVxuICAvKiogVGhlIGNoYW5uZWwgc2VsZWN0ZWQgaW4gdGhlIHBhbmUgKGRyaXZlcyBhIHNpbmdsZS1zY2FsYXIgM0QgU3VyZmFjZSkuICovXG4gIGdldFNlbGVjdGVkQ2hhbm5lbCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkQ2hhbm5lbCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgY3VycmVudFNlbGVjdGVkQ2hhbm5lbCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkQ2hhbm5lbCQudmFsdWU7XG4gIH1cbiAgc2V0U2VsZWN0ZWRDaGFubmVsKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZENoYW5uZWwkLnZhbHVlICE9PSBpbmRleCkgdGhpcy5zZWxlY3RlZENoYW5uZWwkLm5leHQoaW5kZXgpO1xuICB9XG4gIC8qKiBQYXRjaCBvbmUgY2hhbm5lbCBieSBpbmRleCAoaW1tdXRhYmxlIHVwZGF0ZSkuICovXG4gIHNldENoYW5uZWxTdGF0ZShpbmRleDogbnVtYmVyLCBwYXJ0aWFsOiBQYXJ0aWFsPElDaGFubmVsU3RhdGU+KTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IHRoaXMuY2hhbm5lbFN0YXRlcyQudmFsdWUubWFwKChjKSA9PlxuICAgICAgYy5pbmRleCA9PT0gaW5kZXggPyB7IC4uLmMsIC4uLnBhcnRpYWwsIGluZGV4OiBjLmluZGV4IH0gOiBjLFxuICAgICk7XG4gICAgdGhpcy5jaGFubmVsU3RhdGVzJC5uZXh0KG5leHQpO1xuICB9XG4gIC8qKiBSZXBsYWNlIGFsbCBjaGFubmVsIHN0YXRlcyAodXNlZCBieSBhdXRvL3Jlc2V0KS4gKi9cbiAgc2V0Q2hhbm5lbFN0YXRlcyhzdGF0ZXM6IElDaGFubmVsU3RhdGVbXSk6IHZvaWQge1xuICAgIHRoaXMuY2hhbm5lbFN0YXRlcyQubmV4dChzdGF0ZXMpO1xuICB9XG4gIC8qKiBSZXNldCBvbmUgY2hhbm5lbCdzIGRpc3BsYXkgd2luZG93LCBnYW1tYSBBTkQgY29sb3VyIHRvIHRoZSB2YWx1ZXMgZGVyaXZlZFxuICAgKiAgZm9yIHRoZSBjdXJyZW50IGltYWdlIChmdWxsIDAuLjI1NSByYW5nZSwgZ2FtbWEgMSwgdGhlIGNoYW5uZWwncyBkZWZhdWx0XG4gICAqICB0aW50KS4gRmFsbHMgYmFjayB0byBuZXV0cmFsIGRlZmF1bHRzIGlmIG5vIGJhc2VsaW5lIHdhcyBjYXB0dXJlZC4gKi9cbiAgcmVzZXRDaGFubmVsU3RhdGUoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGRlZiA9IHRoaXMuZGVmYXVsdENoYW5uZWxTdGF0ZXMuZmluZCgoYykgPT4gYy5pbmRleCA9PT0gaW5kZXgpO1xuICAgIHRoaXMuc2V0Q2hhbm5lbFN0YXRlKGluZGV4LCB7XG4gICAgICBtaW46IGRlZj8ubWluID8/IDAsXG4gICAgICBtYXg6IGRlZj8ubWF4ID8/IDI1NSxcbiAgICAgIGdhbW1hOiBkZWY/LmdhbW1hID8/IDEsXG4gICAgICBjb2xvcjogZGVmPy5jb2xvciA/PyAnI2ZmZmZmZicsXG4gICAgfSk7XG4gIH1cblxuICBnZXRHcmF5c2NhbGUoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JheXNjYWxlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuICBjdXJyZW50R3JheXNjYWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdyYXlzY2FsZSQudmFsdWU7XG4gIH1cbiAgc2V0R3JheXNjYWxlKG9uOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5ncmF5c2NhbGUkLm5leHQob24pO1xuICB9XG5cbiAgZ2V0SW52ZXJ0KCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmludmVydCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgY3VycmVudEludmVydCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pbnZlcnQkLnZhbHVlO1xuICB9XG4gIHNldEludmVydChvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaW52ZXJ0JC5uZXh0KG9uKTtcbiAgfVxuXG4gIC8qKiBOYW1l4oaSY29sb3VyIHZpZXcgb2YgdGhlIGN1cnJlbnQgcHJlc2V0IHNldCAoY29tcGF0IGZvciBiYWNrZW5kIHJlbmRlcmVyc1xuICAgKiAgdGhhdCBzdGlsbCByZWFkIGEgTWFwKS4gKi9cbiAgZ2V0Q2xhc3NpZmljYXRpb25Db2xvcnMoKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBNYXAodGhpcy5wcmVzZXRTZXQuY2xhc3Nlcy5tYXAoKGMpID0+IFtjLm5hbWUsIGMuY29sb3JdKSk7XG4gIH1cbiAgLyoqIFVwc2VydCBhIHNpbmdsZSBjbGFzcyBjb2xvdXIgKHVzZWQgYnkgdGhlIGVkaXRvcidzIHBlci1jbGFzcyBjb2xvdXIgcGlja2VyKS4gKi9cbiAgc2V0Q2xhc3NpZmljYXRpb25Db2xvcihsYWJlbDogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy51cHNlcnRDbGFzcyh7IG5hbWU6IGxhYmVsLCBjb2xvciB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBBbm5vdGF0aW9uLWNsYXNzIHByZXNldCBzZXQgYWNjZXNzb3JzIChqaXQtdWkjNzApIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBnZXRQcmVzZXRTZXQoKTogUHJlc2V0U2V0IHtcbiAgICAvLyBEZWZlbnNpdmUgY29weTogY2FsbGVycyBtdXN0IG5vdCBtdXRhdGUgdGhlIHN0b3JlJ3Mgc3RhdGUgaW4gcGxhY2Ug4oCUXG4gICAgLy8gYWxsIGNoYW5nZXMgZ28gdGhyb3VnaCBzZXRQcmVzZXRTZXQoKS91cHNlcnRDbGFzcygpL3JlbW92ZUNsYXNzKCkgc29cbiAgICAvLyBwcmVzZXRTZXQkIGFuZCBwZXJzaXN0ZW5jZSBzdGF5IGluIHN5bmMuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNsYXNzZXM6IHRoaXMucHJlc2V0U2V0LmNsYXNzZXMubWFwKChjKSA9PiAoeyAuLi5jIH0pKSxcbiAgICAgIGZhbGxiYWNrUGFsZXR0ZTogWy4uLnRoaXMucHJlc2V0U2V0LmZhbGxiYWNrUGFsZXR0ZV0sXG4gICAgICBhdXRvUHJvbW90ZTogdGhpcy5wcmVzZXRTZXQuYXV0b1Byb21vdGUsXG4gICAgICBtYXRjaE1vZGU6IHRoaXMucHJlc2V0U2V0Lm1hdGNoTW9kZSxcbiAgICAgIGltcG9ydGVkQ29sb3JzOiB7IC4uLnRoaXMuaW1wb3J0ZWRDb2xvcnMgfSxcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBSZW1lbWJlciB0aGUgY2xhc3MgY29sb3VycyBhbiBpbXBvcnRlZCBmaWxlIGNhcnJpZWQgKGxhYmVsIOKGkiBjb2xvdXIpLCBzbyBpdHMgcmVnaW9ucyBrZWVwXG4gICAqIHRoZW06IGEgY2xhc3Mgd2l0aCBhIHByZXNldCBrZWVwcyB0aGUgcHJlc2V0J3MgY29sb3VyLCBhbmQgdGhlIGxhdGVzdCBpbXBvcnQgd2lucyBmb3IgdGhlXG4gICAqIHJlc3QuIE5vdCBwZXJzaXN0ZWQuXG4gICAqL1xuICByZW1lbWJlckltcG9ydGVkQ2xhc3NDb2xvcnMoY29sb3JzOiBSZWFkb25seU1hcDxzdHJpbmcsIHN0cmluZz4pOiB2b2lkIHtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgW2xhYmVsLCBjb2xvcl0gb2YgY29sb3JzKSB7XG4gICAgICBpZiAoIWxhYmVsIHx8IGZpbmRQcmVzZXQobGFiZWwsIHRoaXMucHJlc2V0U2V0KSkgY29udGludWU7XG4gICAgICBjb25zdCBrZXkgPSBwcmVzZXRLZXkodGhpcy5wcmVzZXRTZXQsIGxhYmVsKTtcbiAgICAgIGlmICh0aGlzLmltcG9ydGVkQ29sb3JzW2tleV0gPT09IGNvbG9yKSBjb250aW51ZTtcbiAgICAgIHRoaXMuaW1wb3J0ZWRDb2xvcnMgPSB7IC4uLnRoaXMuaW1wb3J0ZWRDb2xvcnMsIFtrZXldOiBjb2xvciB9O1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VkKSB0aGlzLmVtaXRQcmVzZXRTZXQoKTtcbiAgfVxuICBnZXRQcmVzZXRTZXQkKCk6IE9ic2VydmFibGU8UHJlc2V0U2V0PiB7XG4gICAgcmV0dXJuIHRoaXMucHJlc2V0U2V0JC5hc09ic2VydmFibGUoKTtcbiAgfVxuICBzZXRQcmVzZXRTZXQoc2V0OiBQcmVzZXRTZXQpOiB2b2lkIHtcbiAgICB0aGlzLnByZXNldFNldCA9IHRoaXMubm9ybWFsaXplUHJlc2V0U2V0KHNldCk7XG4gICAgdGhpcy5lbWl0UHJlc2V0U2V0KCk7XG4gICAgdGhpcy5zYXZlUHJlc2V0c05vdygpOyAvLyBleHBsaWNpdCBidWxrIGFwcGx5L2ltcG9ydCDihpIgcGVyc2lzdCBpbW1lZGlhdGVseVxuICB9XG4gIC8qKiBBZGQgb3IgdXBkYXRlIGEgY2xhc3MgKGtleWVkIGJ5IGV4YWN0IHN0b3JlZCBgbmFtZWApLiAqL1xuICB1cHNlcnRDbGFzcyhwcmVzZXQ6IENsYXNzUHJlc2V0KTogdm9pZCB7XG4gICAgY29uc3QgY2xhc3NlcyA9IFsuLi50aGlzLnByZXNldFNldC5jbGFzc2VzXTtcbiAgICBjb25zdCBpID0gY2xhc3Nlcy5maW5kSW5kZXgoKGMpID0+IGMubmFtZSA9PT0gcHJlc2V0Lm5hbWUpO1xuICAgIGlmIChpID49IDApIGNsYXNzZXNbaV0gPSB7IC4uLmNsYXNzZXNbaV0sIC4uLnByZXNldCB9O1xuICAgIGVsc2UgY2xhc3Nlcy5wdXNoKHsgLi4ucHJlc2V0IH0pO1xuICAgIHRoaXMucHJlc2V0U2V0ID0geyAuLi50aGlzLnByZXNldFNldCwgY2xhc3NlcyB9O1xuICAgIHRoaXMuZW1pdFByZXNldFNldCgpO1xuICAgIHRoaXMucXVldWVQcmVzZXRTYXZlKCk7XG4gIH1cbiAgcmVtb3ZlQ2xhc3MobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wcmVzZXRTZXQgPSB7IC4uLnRoaXMucHJlc2V0U2V0LCBjbGFzc2VzOiB0aGlzLnByZXNldFNldC5jbGFzc2VzLmZpbHRlcigoYykgPT4gYy5uYW1lICE9PSBuYW1lKSB9O1xuICAgIHRoaXMuZW1pdFByZXNldFNldCgpO1xuICAgIHRoaXMucXVldWVQcmVzZXRTYXZlKCk7XG4gIH1cbiAgcmVzZXRQcmVzZXRzKCk6IHZvaWQge1xuICAgIHRoaXMucHJlc2V0U2V0ID0gZGVmYXVsdFByZXNldFNldCgpO1xuICAgIHRoaXMuZW1pdFByZXNldFNldCgpO1xuICAgIHRoaXMuc2F2ZVByZXNldHNOb3coKTsgLy8gZXhwbGljaXQgcmVzZXQg4oaSIHBlcnNpc3QgaW1tZWRpYXRlbHlcbiAgfVxuXG4gIC8vIOKUgOKUgCBzcGF0aWFsLW9taWNzIHZpZXcgc3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGdldFNwYXRpYWxWaWV3JCgpOiBPYnNlcnZhYmxlPFNwYXRpYWxWaWV3U3RhdGU+IHtcbiAgICByZXR1cm4gdGhpcy5zcGF0aWFsVmlldyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKiogU3luY2hyb25vdXMgcmVhZCwgZm9yIGEgcmVuZGVyZXIgYnVpbGRpbmcgaXRzIGZpcnN0IGZyYW1lLiAqL1xuICBjdXJyZW50U3BhdGlhbFZpZXcoKTogU3BhdGlhbFZpZXdTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuc3BhdGlhbFZpZXckLnZhbHVlO1xuICB9XG5cbiAgLyoqIFBhdGNoIHRoZSBzcGF0aWFsIHZpZXcgc3RhdGU7IGVtaXRzIG9uY2Ugd2l0aCB0aGUgbWVyZ2VkIHZhbHVlLiAqL1xuICBzZXRTcGF0aWFsVmlldyhwYXJ0aWFsOiBQYXJ0aWFsPFNwYXRpYWxWaWV3U3RhdGU+KTogdm9pZCB7XG4gICAgdGhpcy5zcGF0aWFsVmlldyQubmV4dCh7IC4uLnRoaXMuc3BhdGlhbFZpZXckLnZhbHVlLCAuLi5wYXJ0aWFsIH0pO1xuICB9XG5cbiAgZ2V0QWN0aXZlVG9vbCQoKTogT2JzZXJ2YWJsZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlVG9vbCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgc2V0QWN0aXZlVG9vbCh0b29sOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVUb29sJC5uZXh0KHRvb2wpO1xuICB9XG59XG4iXX0=