@jax-data-science/sci-image-visualizer 0.3.2 → 0.4.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 (93) hide show
  1. package/README.md +215 -11
  2. package/esm2022/index.mjs +20 -1
  3. package/esm2022/lib/contracts/display-types.mjs +20 -2
  4. package/esm2022/lib/contracts/image.contract.mjs +1 -1
  5. package/esm2022/lib/contracts/plot-type.mjs +36 -1
  6. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +3 -0
  7. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +45 -0
  8. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  9. package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +10 -19
  10. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +71 -7
  11. package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +1 -1
  12. package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +96 -0
  13. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +1934 -55
  14. package/esm2022/lib/implementations/napari-js/napari-zoom.mjs +18 -0
  15. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +5 -3
  16. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +3 -4
  17. package/esm2022/lib/implementations/osd/osd-zoom.mjs +20 -0
  18. package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +555 -0
  19. package/esm2022/lib/implementations/plotly/plotly.service.mjs +13 -7
  20. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +304 -0
  21. package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +179 -0
  22. package/esm2022/lib/routing-visualizer.service.mjs +223 -12
  23. package/esm2022/lib/spatial/embedding-compute.mjs +142 -0
  24. package/esm2022/lib/spatial/gene-search.mjs +77 -0
  25. package/esm2022/lib/spatial/spatial-density.mjs +224 -0
  26. package/esm2022/lib/spatial/spatial-encoding.mjs +232 -0
  27. package/esm2022/lib/spatial/spatial-expression.mjs +257 -0
  28. package/esm2022/lib/spatial/spatial-framing.mjs +60 -0
  29. package/esm2022/lib/spatial/spatial-heatmap.mjs +185 -0
  30. package/esm2022/lib/spatial/spatial-hover.mjs +79 -0
  31. package/esm2022/lib/spatial/spatial-sections.mjs +96 -0
  32. package/esm2022/lib/spatial/spatial-selection.mjs +264 -0
  33. package/esm2022/lib/spatial/spatial-volume-image.mjs +163 -0
  34. package/esm2022/lib/spatial/tsne-worker.mjs +10 -0
  35. package/esm2022/lib/spatial/world-grid.mjs +77 -0
  36. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +1278 -0
  37. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +621 -0
  38. package/esm2022/lib/store/spatial-selection.service.mjs +47 -0
  39. package/esm2022/lib/store/visualizer-store.service.mjs +23 -1
  40. package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +2 -2
  41. package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +9 -9
  42. package/esm2022/lib/toolbar/toolbar.component.mjs +30 -7
  43. package/esm2022/lib/visualization.module.mjs +23 -5
  44. package/esm2022/lib/visualizer.component.mjs +283 -22
  45. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-ci1q0xnJ.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs} +6 -4
  46. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-ci1q0xnJ.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map} +1 -1
  47. package/fesm2022/jax-data-science-sci-image-visualizer-tsne-worker-B_nXDGf0.mjs +12 -0
  48. package/fesm2022/jax-data-science-sci-image-visualizer-tsne-worker-B_nXDGf0.mjs.map +1 -0
  49. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +15282 -7829
  50. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  51. package/fesm2022/tsne.worker.js +19091 -0
  52. package/index.d.ts +15 -0
  53. package/lib/contracts/display-types.d.ts +131 -0
  54. package/lib/contracts/image.contract.d.ts +7 -0
  55. package/lib/contracts/plot-type.d.ts +42 -2
  56. package/lib/contracts/ports/spatial-data.port.d.ts +90 -0
  57. package/lib/contracts/spatial-dataset.contract.d.ts +281 -0
  58. package/lib/contracts/visualizer.contract.d.ts +99 -1
  59. package/lib/implementations/napari-js/napari-axes-labels.d.ts +9 -7
  60. package/lib/implementations/napari-js/napari-region-overlay.d.ts +38 -4
  61. package/lib/implementations/napari-js/napari-scale-bar.d.ts +7 -3
  62. package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +32 -0
  63. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +497 -16
  64. package/lib/implementations/napari-js/napari-zoom.d.ts +15 -0
  65. package/lib/implementations/osd/osd-zoom.d.ts +19 -0
  66. package/lib/implementations/plotly/omics-trace-builders.d.ts +193 -0
  67. package/lib/implementations/plotly/plotly.service.d.ts +9 -0
  68. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +123 -0
  69. package/lib/implementations/spatial-data-http/spatial-wire.d.ts +115 -0
  70. package/lib/routing-visualizer.service.d.ts +45 -6
  71. package/lib/spatial/embedding-compute.d.ts +73 -0
  72. package/lib/spatial/gene-search.d.ts +48 -0
  73. package/lib/spatial/spatial-density.d.ts +73 -0
  74. package/lib/spatial/spatial-encoding.d.ts +155 -0
  75. package/lib/spatial/spatial-expression.d.ts +144 -0
  76. package/lib/spatial/spatial-framing.d.ts +37 -0
  77. package/lib/spatial/spatial-heatmap.d.ts +111 -0
  78. package/lib/spatial/spatial-hover.d.ts +49 -0
  79. package/lib/spatial/spatial-sections.d.ts +59 -0
  80. package/lib/spatial/spatial-selection.d.ts +113 -0
  81. package/lib/spatial/spatial-volume-image.d.ts +67 -0
  82. package/lib/spatial/tsne-worker.d.ts +7 -0
  83. package/lib/spatial/world-grid.d.ts +58 -0
  84. package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +439 -0
  85. package/lib/spatial-controls/spatial-controls.component.d.ts +257 -0
  86. package/lib/store/spatial-selection.service.d.ts +27 -0
  87. package/lib/store/visualizer-store.service.d.ts +13 -0
  88. package/lib/toolbar/toolbar.component.d.ts +19 -3
  89. package/lib/visualization.module.d.ts +28 -24
  90. package/lib/visualizer.component.d.ts +73 -2
  91. package/package.json +7 -3
  92. package/src/lib/assets/spatial-omics-3d.svg +31 -0
  93. package/src/lib/assets/spatial-omics.svg +27 -0
@@ -0,0 +1,47 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ import { emptySelection, } from '../spatial/spatial-selection';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * The set of currently-selected spatial observations, shared the way
7
+ * `RegionStore` shares regions: one store, many writers (an ROI selection, a
8
+ * legend click, a future chart brush), one reader per consumer.
9
+ *
10
+ * Deliberately thin — every rule about WHICH observations are selected lives in
11
+ * the pure `spatial-selection.ts`; this only holds the answer and announces it.
12
+ */
13
+ export class SpatialSelectionStore {
14
+ constructor() {
15
+ this.selection$ = new BehaviorSubject(emptySelection());
16
+ }
17
+ /** Emits on every change, including a clear. */
18
+ getSelection$() {
19
+ return this.selection$.asObservable();
20
+ }
21
+ /** Synchronous read, for a renderer building its first frame. */
22
+ current() {
23
+ return this.selection$.value;
24
+ }
25
+ /** True when nothing is selected — the state in which nothing is muted. */
26
+ isEmpty() {
27
+ return this.selection$.value.count === 0;
28
+ }
29
+ /** Replace the selection. An empty result is published like any other, so a
30
+ * "selected nothing" ROI visibly clears rather than silently keeping the
31
+ * previous selection on screen. */
32
+ set(selection) {
33
+ this.selection$.next(selection);
34
+ }
35
+ clear() {
36
+ if (this.selection$.value.count === 0 && this.selection$.value.mask.length === 0)
37
+ return;
38
+ this.selection$.next(emptySelection());
39
+ }
40
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SpatialSelectionStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
41
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SpatialSelectionStore, providedIn: 'root' }); }
42
+ }
43
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SpatialSelectionStore, decorators: [{
44
+ type: Injectable,
45
+ args: [{ providedIn: 'root' }]
46
+ }] });
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1zZWxlY3Rpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3RvcmUvc3BhdGlhbC1zZWxlY3Rpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFFbkQsT0FBTyxFQUNpQixjQUFjLEdBQ3JDLE1BQU0sOEJBQThCLENBQUM7O0FBRXRDOzs7Ozs7O0dBT0c7QUFFSCxNQUFNLE9BQU8scUJBQXFCO0lBRGxDO1FBRW1CLGVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBdUIsY0FBYyxFQUFFLENBQUMsQ0FBQztLQTRCM0Y7SUExQkMsZ0RBQWdEO0lBQ2hELGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVELGlFQUFpRTtJQUNqRSxPQUFPO1FBQ0wsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztJQUMvQixDQUFDO0lBRUQsMkVBQTJFO0lBQzNFLE9BQU87UUFDTCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzt3Q0FFb0M7SUFDcEMsR0FBRyxDQUFDLFNBQStCO1FBQ2pDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxLQUFLO1FBQ0gsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU87UUFDekYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztJQUN6QyxDQUFDOzhHQTVCVSxxQkFBcUI7a0hBQXJCLHFCQUFxQixjQURSLE1BQU07OzJGQUNuQixxQkFBcUI7a0JBRGpDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7XG4gIFNwYXRpYWxTZWxlY3Rpb25NYXNrLCBlbXB0eVNlbGVjdGlvbixcbn0gZnJvbSAnLi4vc3BhdGlhbC9zcGF0aWFsLXNlbGVjdGlvbic7XG5cbi8qKlxuICogVGhlIHNldCBvZiBjdXJyZW50bHktc2VsZWN0ZWQgc3BhdGlhbCBvYnNlcnZhdGlvbnMsIHNoYXJlZCB0aGUgd2F5XG4gKiBgUmVnaW9uU3RvcmVgIHNoYXJlcyByZWdpb25zOiBvbmUgc3RvcmUsIG1hbnkgd3JpdGVycyAoYW4gUk9JIHNlbGVjdGlvbiwgYVxuICogbGVnZW5kIGNsaWNrLCBhIGZ1dHVyZSBjaGFydCBicnVzaCksIG9uZSByZWFkZXIgcGVyIGNvbnN1bWVyLlxuICpcbiAqIERlbGliZXJhdGVseSB0aGluIOKAlCBldmVyeSBydWxlIGFib3V0IFdISUNIIG9ic2VydmF0aW9ucyBhcmUgc2VsZWN0ZWQgbGl2ZXMgaW5cbiAqIHRoZSBwdXJlIGBzcGF0aWFsLXNlbGVjdGlvbi50c2A7IHRoaXMgb25seSBob2xkcyB0aGUgYW5zd2VyIGFuZCBhbm5vdW5jZXMgaXQuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgU3BhdGlhbFNlbGVjdGlvblN0b3JlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzZWxlY3Rpb24kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTcGF0aWFsU2VsZWN0aW9uTWFzaz4oZW1wdHlTZWxlY3Rpb24oKSk7XG5cbiAgLyoqIEVtaXRzIG9uIGV2ZXJ5IGNoYW5nZSwgaW5jbHVkaW5nIGEgY2xlYXIuICovXG4gIGdldFNlbGVjdGlvbiQoKTogT2JzZXJ2YWJsZTxTcGF0aWFsU2VsZWN0aW9uTWFzaz4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbiQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKiogU3luY2hyb25vdXMgcmVhZCwgZm9yIGEgcmVuZGVyZXIgYnVpbGRpbmcgaXRzIGZpcnN0IGZyYW1lLiAqL1xuICBjdXJyZW50KCk6IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24kLnZhbHVlO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiBub3RoaW5nIGlzIHNlbGVjdGVkIOKAlCB0aGUgc3RhdGUgaW4gd2hpY2ggbm90aGluZyBpcyBtdXRlZC4gKi9cbiAgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24kLnZhbHVlLmNvdW50ID09PSAwO1xuICB9XG5cbiAgLyoqIFJlcGxhY2UgdGhlIHNlbGVjdGlvbi4gQW4gZW1wdHkgcmVzdWx0IGlzIHB1Ymxpc2hlZCBsaWtlIGFueSBvdGhlciwgc28gYVxuICAgKiAgXCJzZWxlY3RlZCBub3RoaW5nXCIgUk9JIHZpc2libHkgY2xlYXJzIHJhdGhlciB0aGFuIHNpbGVudGx5IGtlZXBpbmcgdGhlXG4gICAqICBwcmV2aW91cyBzZWxlY3Rpb24gb24gc2NyZWVuLiAqL1xuICBzZXQoc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uJC5uZXh0KHNlbGVjdGlvbik7XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3Rpb24kLnZhbHVlLmNvdW50ID09PSAwICYmIHRoaXMuc2VsZWN0aW9uJC52YWx1ZS5tYXNrLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIHRoaXMuc2VsZWN0aW9uJC5uZXh0KGVtcHR5U2VsZWN0aW9uKCkpO1xuICB9XG59XG4iXX0=
@@ -3,6 +3,7 @@ import { BehaviorSubject, Subject } from 'rxjs';
3
3
  import { debounceTime } from 'rxjs/operators';
4
4
  import { defaultPresetSet } from '../models/class-preset';
5
5
  import { PREFERENCES_PORT } from '../contracts/ports/preferences.port';
6
+ import { DEFAULT_SPATIAL_VIEW } from '../contracts/display-types';
6
7
  import { COLORMAP_OPTIONS } from '../plot.utilities';
7
8
  import * as i0 from "@angular/core";
8
9
  import * as i1 from "@angular/common/http";
@@ -69,6 +70,10 @@ export class VisualizerStore {
69
70
  // null when none is active. The single source of truth for tool state across
70
71
  // the toolbar and whichever backend's overlay handles the pointer.
71
72
  this.activeTool$ = new BehaviorSubject(null);
73
+ /** Spatial-omics display state (colour source, point size, alpha, scaling).
74
+ * Held here, next to the colormap/channel state, so the active backend reacts
75
+ * to an edit exactly as it does for an image. */
76
+ this.spatialView$ = new BehaviorSubject({ ...DEFAULT_SPATIAL_VIEW });
72
77
  this.loadColormapLuts();
73
78
  this.initPresetPersistence();
74
79
  }
@@ -337,6 +342,23 @@ export class VisualizerStore {
337
342
  persistPresets() {
338
343
  this.queuePresetSave();
339
344
  }
345
+ // ── spatial-omics view state ──────────────────────────────────────────
346
+ getSpatialView$() {
347
+ return this.spatialView$.asObservable();
348
+ }
349
+ /** Synchronous read, for a renderer building its first frame. */
350
+ currentSpatialView() {
351
+ return this.spatialView$.value;
352
+ }
353
+ /** Patch the spatial view state; emits once with the merged value. */
354
+ setSpatialView(partial) {
355
+ this.spatialView$.next({ ...this.spatialView$.value, ...partial });
356
+ }
357
+ /** Reset to defaults — e.g. when a different dataset is selected, where the
358
+ * previous colour column almost certainly does not exist. */
359
+ resetSpatialView() {
360
+ this.spatialView$.next({ ...DEFAULT_SPATIAL_VIEW });
361
+ }
340
362
  getActiveTool$() {
341
363
  return this.activeTool$.asObservable();
342
364
  }
@@ -360,4 +382,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
360
382
  type: Inject,
361
383
  args: [PREFERENCES_PORT]
362
384
  }] }] });
363
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zdG9yZS92aXN1YWxpemVyLXN0b3JlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdELE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5QyxPQUFPLEVBQTBCLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEYsT0FBTyxFQUFFLGdCQUFnQixFQUFtQixNQUFNLHFDQUFxQyxDQUFDO0FBSXhGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7QUFFckQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFFSCxNQUFNLE9BQU8sZUFBZTtJQTRDMUIsMkVBQTJFO0lBQzNFLDZFQUE2RTtJQUM3RSxtREFBbUQ7SUFDbkQsWUFDK0IsT0FBMEIsSUFBSSxFQUNKLFlBQW9DLElBQUk7UUFEbEUsU0FBSSxHQUFKLElBQUksQ0FBMEI7UUFDSixjQUFTLEdBQVQsU0FBUyxDQUErQjtRQWhEakcsd0VBQXdFO1FBQ3hFLDhFQUE4RTtRQUM5RSxxREFBcUQ7UUFDcEMsY0FBUyxHQUFHLElBQUksZUFBZSxDQUM5QyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLFdBQVcsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FDMUcsQ0FBQztRQUNlLGtCQUFhLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFFckUsd0VBQXdFO1FBQ3ZELGVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBbUIsRUFBRSxDQUFDLENBQUM7UUFFeEUsd0VBQXdFO1FBQ3hFLDZFQUE2RTtRQUM3RSw2RUFBNkU7UUFDN0Usd0VBQXdFO1FBQ3ZELG1CQUFjLEdBQUcsSUFBSSxlQUFlLENBQWtCLEVBQUUsQ0FBQyxDQUFDO1FBQzNFOzJGQUNtRjtRQUNsRSxxQkFBZ0IsR0FBRyxJQUFJLGVBQWUsQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUNuRSw0RUFBNEU7UUFDNUUsc0VBQXNFO1FBQzlELHlCQUFvQixHQUFvQixFQUFFLENBQUM7UUFDbkQsOEVBQThFO1FBQzlFLDJDQUEyQztRQUMxQixlQUFVLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDakQsWUFBTyxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBRS9ELHdFQUF3RTtRQUN4RSw0RUFBNEU7UUFDNUUscUVBQXFFO1FBQ3JFLDhFQUE4RTtRQUM5RSx3RUFBd0U7UUFDaEUsY0FBUyxHQUFjLGdCQUFnQixFQUFFLENBQUM7UUFDakMsZUFBVSxHQUFHLElBQUksZUFBZSxDQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1RCxpQkFBWSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDNUMsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFFOUIsd0VBQXdFO1FBQ3hFLDBFQUEwRTtRQUMxRSw2RUFBNkU7UUFDN0UsbUVBQW1FO1FBQ2xELGdCQUFXLEdBQUcsSUFBSSxlQUFlLENBQWdCLElBQUksQ0FBQyxDQUFDO1FBU3RFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLGdCQUFnQjtRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFxQyxvQ0FBb0MsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNoRyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDYixLQUFLLE1BQU0sS0FBSyxJQUFJLGdCQUF5QixFQUFFLENBQUM7b0JBQzlDLEtBQUssTUFBTSxLQUFLLElBQUksS0FBSyxDQUFDLFFBQVEsSUFBSSxFQUFFLEVBQUUsQ0FBQzt3QkFDekMsTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUM7d0JBQy9CLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUM7NEJBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUN6RSxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBQ0QsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUF3RCxDQUFDO1NBQ3RFLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCx3RUFBd0U7SUFDaEUscUJBQXFCO1FBQzNCLG1FQUFtRTtRQUNuRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ3ZELElBQUksQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQXlCLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEcsQ0FBQyxDQUFDLENBQUM7UUFDSCwwRUFBMEU7UUFDMUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDeEMsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ1osSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ2hFLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUM5QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3ZDLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7WUFDNUIsQ0FBQztZQUNELEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDNUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGtCQUFrQixDQUFDLEdBQWM7UUFDdkMsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztRQUNwQyw4RUFBOEU7UUFDOUUscUVBQXFFO1FBQ3JFLE9BQU87WUFDTCxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDN0UsZUFBZSxFQUNiLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsTUFBTTtnQkFDOUQsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDO2dCQUMxQixDQUFDLENBQUMsUUFBUSxDQUFDLGVBQWU7WUFDOUIsV0FBVyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVztZQUM5QixTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVMsS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsT0FBTztTQUNuRSxDQUFDO0lBQ0osQ0FBQztJQUVELGtHQUFrRztJQUMxRixlQUFlO1FBQ3JCLElBQUksSUFBSSxDQUFDLGFBQWE7WUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ25ELENBQUM7SUFFRDs2RUFDeUU7SUFDakUsY0FBYztRQUNwQixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUF5QixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RHLENBQUM7SUFDSCxDQUFDO0lBRUQsa0VBQWtFO0lBQ2xFLGtCQUFrQjtRQUNoQixPQUFPLGdCQUFnQixDQUFDO0lBQzFCLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFDRDtzRUFDa0U7SUFDbEUsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7SUFDOUIsQ0FBQztJQUNELFdBQVcsQ0FBQyxRQUFhO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFDRCxtQkFBbUI7UUFDakIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztJQUNsQyxDQUFDO0lBQ0QsZUFBZSxDQUFDLE9BQWdCO1FBQzlCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsb0JBQW9CLENBQUMsSUFBYSxFQUFFLElBQWE7UUFDL0MsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPO1FBQzNCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFvQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2RixJQUFJLElBQUk7WUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUM5QixJQUFJLElBQUk7WUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBQ0QsWUFBWSxDQUFDLFNBQTJCO1FBQ3RDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hDLDZFQUE2RTtRQUM3RSxtRUFBbUU7UUFDbkUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1Qyw0RUFBNEU7UUFDNUUsNkRBQTZEO1FBQzdELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDeEQsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3JELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrREFBa0Q7UUFDbkYsQ0FBQztJQUNILENBQUM7SUFFRDs7OzsrREFJMkQ7SUFDbkQsY0FBYyxDQUFDLElBQXNCO1FBQzNDLE1BQU0sSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQzNELE1BQU0sQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEVBQUUsV0FBVyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQy9CLE9BQU87Z0JBQ0wsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUksRUFBRTtnQkFDcEQsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUksRUFBRTtnQkFDdEQsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUksRUFBRTthQUN0RCxDQUFDO1FBQ0osQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLENBQUMsRUFBRSxZQUFZLElBQUksQ0FBQyxDQUFDO1FBQ25DLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2QsTUFBTSxJQUFJLEdBQUcsQ0FBQyxFQUFFLFdBQVcsQ0FBQztZQUM1QixvRUFBb0U7WUFDcEUsTUFBTSxPQUFPLEdBQUcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUM5RixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUM5QyxLQUFLLEVBQUUsQ0FBQztnQkFDUixJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDM0MsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxPQUFPLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7Z0JBQ3RELEdBQUcsSUFBSTthQUNSLENBQUMsQ0FBQyxDQUFDO1FBQ04sQ0FBQztRQUNELE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLGdCQUFnQjtRQUNkLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBQ0Qsb0JBQW9CO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7SUFDbkMsQ0FBQztJQUNELDRFQUE0RTtJQUM1RSxrQkFBa0IsS0FBeUIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pGLHNCQUFzQixLQUFhLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDeEUsa0JBQWtCLENBQUMsS0FBYTtRQUM5QixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEtBQUssS0FBSztZQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUNELHFEQUFxRDtJQUNyRCxlQUFlLENBQUMsS0FBYSxFQUFFLE9BQStCO1FBQzVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQy9DLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDN0QsQ0FBQztRQUNGLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFDRCx1REFBdUQ7SUFDdkQsZ0JBQWdCLENBQUMsTUFBdUI7UUFDdEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUNEOzs2RUFFeUU7SUFDekUsaUJBQWlCLENBQUMsS0FBYTtRQUM3QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFO1lBQzFCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7WUFDbEIsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRztZQUNwQixLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssSUFBSSxDQUFDO1lBQ3RCLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxJQUFJLFNBQVM7U0FDL0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUNELGdCQUFnQjtRQUNkLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFDL0IsQ0FBQztJQUNELFlBQVksQ0FBQyxFQUFXO1FBQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFDRCxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUM1QixDQUFDO0lBQ0QsU0FBUyxDQUFDLEVBQVc7UUFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVEO2tDQUM4QjtJQUM5Qix1QkFBdUI7UUFDckIsT0FBTyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFDRCxtRkFBbUY7SUFDbkYsc0JBQXNCLENBQUMsS0FBYSxFQUFFLEtBQWE7UUFDakQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLFlBQVk7UUFDVix1RUFBdUU7UUFDdkUsdUVBQXVFO1FBQ3ZFLDJDQUEyQztRQUMzQyxPQUFPO1lBQ0wsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN0RCxlQUFlLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDO1lBQ3BELFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVc7WUFDdkMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUztTQUNwQyxDQUFDO0lBQ0osQ0FBQztJQUNELGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUNELFlBQVksQ0FBQyxHQUFjO1FBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxtREFBbUQ7SUFDNUUsQ0FBQztJQUNELDREQUE0RDtJQUM1RCxXQUFXLENBQUMsTUFBbUI7UUFDN0IsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUMsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLElBQUksQ0FBQztZQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7O1lBQ2pELE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNoRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFDRCxXQUFXLENBQUMsSUFBWTtRQUN0QixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN2RyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFDRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLFNBQVMsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyx1Q0FBdUM7SUFDaEUsQ0FBQztJQUNELGdFQUFnRTtJQUNoRSxjQUFjO1FBQ1osSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFDRCxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztJQUNoQyxDQUFDO0lBQ0QsYUFBYSxDQUFDLElBQW1CO1FBQy9CLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7OEdBbFZVLGVBQWUsNERBaURKLGdCQUFnQjtrSEFqRDNCLGVBQWUsY0FERixNQUFNOzsyRkFDbkIsZUFBZTtrQkFEM0IsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQWlEN0IsUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPcHRpb25hbCwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IENsYXNzUHJlc2V0LCBQcmVzZXRTZXQsIGRlZmF1bHRQcmVzZXRTZXQgfSBmcm9tICcuLi9tb2RlbHMvY2xhc3MtcHJlc2V0JztcbmltcG9ydCB7IFBSRUZFUkVOQ0VTX1BPUlQsIFByZWZlcmVuY2VzUG9ydCB9IGZyb20gJy4uL2NvbnRyYWN0cy9wb3J0cy9wcmVmZXJlbmNlcy5wb3J0JztcblxuaW1wb3J0IHsgSUltYWdlTWV0YWRhdGEgfSBmcm9tICcuLi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuaW1wb3J0IHsgSUNoYW5uZWxTdGF0ZSB9IGZyb20gJy4uL2NvbnRyYWN0cy9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHsgQ09MT1JNQVBfT1BUSU9OUyB9IGZyb20gJy4uL3Bsb3QudXRpbGl0aWVzJztcblxuLyoqXG4gKiBCYWNrZW5kLW5ldXRyYWwgc3RvcmUgZm9yIHRoZSAqKnZpc3VhbGl6YXRpb24gc2Vzc2lvbioqIOKAlCB0aGUgc3RhdGUgdGhhdFxuICogZGVzY3JpYmVzICpob3cqIHRoZSBjdXJyZW50IGltYWdlIGlzIGJlaW5nIHZpZXdlZCwgaW5kZXBlbmRlbnQgb2Ygd2hpY2hcbiAqIHJlbmRlcmluZyBiYWNrZW5kIChQbG90bHkgb3IgT3BlblNlYWRyYWdvbikgaXMgb24gc2NyZWVuOlxuICpcbiAqICAtIHRoZSBhY3RpdmUgY29sb3JtYXAgLyBMVVQgYW5kIGl0cyByZXZlcnNlLXNjYWxlIHRvZ2dsZSxcbiAqICAtIHRoZSBjdXJyZW50IGltYWdlJ3MgcGh5c2ljYWwgbWV0YWRhdGEgKMK1bS9waXhlbCBldGMuKSxcbiAqICAtIHRoZSBjbGFzc2lmaWNhdGlvbiBsYWJlbCDihpIgY29sb3VyIG1hcCxcbiAqICAtIHdoaWNoIG9uLWNhbnZhcyB0b29sIGlzIGN1cnJlbnRseSBhY3RpdmUuXG4gKlxuICogQm90aCBiYWNrZW5kcyByZWFkIGFuZCB3cml0ZSB0aGlzIHNpbmdsZSBpbnN0YW5jZSwgc28gdGhleSBzdGF5IGluIGxvY2stc3RlcFxuICogcmVnYXJkbGVzcyBvZiB3aGljaCBvbmUgaXMgcmVuZGVyaW5nLiBQcmV2aW91c2x5IHRoaXMgc3RhdGUgbGl2ZWQgaW5zaWRlXG4gKiBgUGxvdGx5U2VydmljZWAsIHdoaWNoIGZvcmNlZCB0aGUgT3BlblNlYWRyYWdvbiBiYWNrZW5kIHRvIGRlcGVuZCBvbiB0aGVcbiAqIFBsb3RseSBzZXJ2aWNlIHB1cmVseSB0byByZWFkIHRoZSBzaGFyZWQgY29sb3JtYXA7IHRoaXMgc3RvcmUgcmVtb3ZlcyB0aGF0XG4gKiBjb3VwbGluZyDigJQgbmVpdGhlciBiYWNrZW5kIG93bnMgdGhlIHNlc3Npb24gc3RhdGUuXG4gKlxuICogTk9URTogcmVnaW9uICpnZW9tZXRyeSogKHRoZSBkcmF3biBzaGFwZXMgLyBwZXItaW1hZ2UgcmVnaW9uIGNhY2hlKSBzdGlsbFxuICogbGl2ZXMgaW4gYFBsb3RseVNlcnZpY2VgIGZvciBub3c7IGV4dHJhY3RpbmcgaXQgaW50byBhIHNpYmxpbmcgcmVnaW9uIHN0b3JlXG4gKiBpcyBhIHNlcGFyYXRlIGZvbGxvdy11cC5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBWaXN1YWxpemVyU3RvcmUge1xuICAvLyDilIDilIAgQ29sb3JtYXAgLyBMVVQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIERlZmF1bHQgdG8gaW52ZXJ0ZWQgZ3JleXMgKGRhcmsgYmFja2dyb3VuZCDihpIgYnJpZ2h0IHNpZ25hbCksIHdoaWNoIHJlYWRzIGFzXG4gIC8vIHRoZSBuYXR1cmFsIGdyYXlzY2FsZSBmb3IgdGhlc2UgbWljcm9zY29weSBpbWFnZXMuXG4gIHByaXZhdGUgcmVhZG9ubHkgY29sb3JtYXAkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KFxuICAgIENPTE9STUFQX09QVElPTlNbMF0uY2hpbGRyZW4uZmluZCgoYzogYW55KSA9PiBjLmxhYmVsID09PSAnR3JleXMgSW52JykgPz8gQ09MT1JNQVBfT1BUSU9OU1swXS5jaGlsZHJlblswXSxcbiAgKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZXZlcnNlU2NhbGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgLy8g4pSA4pSAIEltYWdlIG1ldGFkYXRhIChwaHlzaWNhbCBwaXhlbCBzaXplLCBjaGFubmVscywg4oCmKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgcHJpdmF0ZSByZWFkb25seSBpbWFnZU1ldGEkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJSW1hZ2VNZXRhZGF0YVtdPihbXSk7XG5cbiAgLy8g4pSA4pSAIENoYW5uZWxzICYgaGlzdG9ncmFtIGRpc3BsYXkgc3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFBlci1jaGFubmVsIGRpc3BsYXkgd2luZG93L2dhbW1hL3Zpc2liaWxpdHkvY29sb3VyLCBkZXJpdmVkIGZyb20gdGhlIGltYWdlXG4gIC8vIG1ldGFkYXRhIG9uIGxvYWQgKDEgXCJJbnRlbnNpdHlcIiBjaGFubmVsIGZvciBncmF5c2NhbGU7IFIvRy9CIGZvciBSR0IpLiBUaGVcbiAgLy8gQ2hhbm5lbHMgJiBIaXN0b2dyYW0gcGFuZSBlZGl0cyB0aGVzZSBhbmQgYm90aCBiYWNrZW5kcyByZWNvbG9yIGxpdmUuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhbm5lbFN0YXRlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElDaGFubmVsU3RhdGVbXT4oW10pO1xuICAvKiogSW5kZXggb2YgdGhlIGNoYW5uZWwgc2VsZWN0ZWQgaW4gdGhlIENoYW5uZWxzIHBhbmUg4oCUIHRoZSBPTkUgYmFuZCBhXG4gICAqICBzaW5nbGUtc2NhbGFyIDNEIHZpZXcgKHRoZSBuYXBhcmkgU3VyZmFjZSkgZm9sbG93cyBmb3IgYSBtdWx0aWNoYW5uZWwgaW1hZ2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0ZWRDaGFubmVsJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgLy8gVGhlIGRlcml2ZWQgZGVmYXVsdHMgKGZ1bGwgd2luZG93LCBnYW1tYSAxLCBkZWZhdWx0IHRpbnQpIGZvciB0aGUgY3VycmVudFxuICAvLyBpbWFnZSwga2VwdCBzbyBcIlJlc2V0XCIgY2FuIHJlc3RvcmUgYSBjaGFubmVsJ3Mgd2luZG93L2dhbW1hL2NvbG91ci5cbiAgcHJpdmF0ZSBkZWZhdWx0Q2hhbm5lbFN0YXRlczogSUNoYW5uZWxTdGF0ZVtdID0gW107XG4gIC8vIEdyYXlzY2FsZSBkaXNwbGF5IChpZ25vcmUgdGhlIGNoYW5uZWwgdGludHMpIGFuZCBpbnZlcnRlZCBiYWNrZ3JvdW5kIOKAlCBib3RoXG4gIC8vIGdsb2JhbCBkaXNwbGF5IGZsYWdzLCBsaWtlIHRoZSBjb2xvcm1hcC5cbiAgcHJpdmF0ZSByZWFkb25seSBncmF5c2NhbGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW52ZXJ0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8vIOKUgOKUgCBBbm5vdGF0aW9uIGNsYXNzIHByZXNldHMgKGppdC11aSM3MCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFRoZSBwZXItdXNlciwgc2VydmVyLXBlcnNpc3RlZCBzb3VyY2Ugb2YgdHJ1dGggZm9yIHJlZ2lvbiBjb2xvdXJzLCBzZWVkZWRcbiAgLy8gZnJvbSB0aGUgaGlzdG9yaWNhbCBkZWZhdWx0IGNsYXNzZXMuIExvYWRlZC9zYXZlZCB2aWEgdGhlIG9wdGlvbmFsXG4gIC8vIFByZWZlcmVuY2VzUG9ydCAoYXBwLXNpZGUgYWRhcHRlciDihpIgaml0LXNlcnZpY2UpLiBnZXRDbGFzc2lmaWNhdGlvbkNvbG9ycygpXG4gIC8vIGJlbG93IHN0YXlzIGFzIGEgbmFtZeKGkmNvbG91ciB2aWV3IGZvciB0aGUgYmFja2VuZHMnIHJlZ2lvbiByZW5kZXJlcnMuXG4gIHByaXZhdGUgcHJlc2V0U2V0OiBQcmVzZXRTZXQgPSBkZWZhdWx0UHJlc2V0U2V0KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJlc2V0U2V0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UHJlc2V0U2V0Pih0aGlzLnByZXNldFNldCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2F2ZVByZXNldHMkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBwcmVzZXRzTG9hZGVkID0gZmFsc2U7XG5cbiAgLy8g4pSA4pSAIEFjdGl2ZSBvbi1jYW52YXMgdG9vbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gV2hpY2ggdG9vbCB0aGUgdXNlciBoYXMgYXJtZWQgKHBhbiwgem9vbSwgZHJhd3JlY3QsIHdhbmQsIGVyYXNlciwg4oCmKSBvclxuICAvLyBudWxsIHdoZW4gbm9uZSBpcyBhY3RpdmUuIFRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciB0b29sIHN0YXRlIGFjcm9zc1xuICAvLyB0aGUgdG9vbGJhciBhbmQgd2hpY2hldmVyIGJhY2tlbmQncyBvdmVybGF5IGhhbmRsZXMgdGhlIHBvaW50ZXIuXG4gIHByaXZhdGUgcmVhZG9ubHkgYWN0aXZlVG9vbCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8vIE9wdGlvbmFsICsgbnVsbCBkZWZhdWx0cyBzbyB0aGUgc3RvcmUgY2FuIGJlIGNvbnN0cnVjdGVkIGJvdGggdmlhIERJIGFuZFxuICAvLyBkaXJlY3RseSAoYG5ldyBWaXN1YWxpemVyU3RvcmUoKWAgaW4gdW5pdCB0ZXN0cyk7IHRoZSBMVVQgZmV0Y2ggYW5kIHByZXNldFxuICAvLyBsb2FkL3NhdmUgbm8tb3Agd2hlbiB0aGVpciBkZXBlbmRlbmN5IGlzIGFic2VudC5cbiAgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSByZWFkb25seSBodHRwOiBIdHRwQ2xpZW50IHwgbnVsbCA9IG51bGwsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChQUkVGRVJFTkNFU19QT1JUKSBwcml2YXRlIHJlYWRvbmx5IHByZWZzUG9ydDogUHJlZmVyZW5jZXNQb3J0IHwgbnVsbCA9IG51bGwsXG4gICkge1xuICAgIHRoaXMubG9hZENvbG9ybWFwTHV0cygpO1xuICAgIHRoaXMuaW5pdFByZXNldFBlcnNpc3RlbmNlKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgY29sb3JtYXAgdHJlZSdzIExVVCBrZXlzIChlLmcuIFwiR1JFWVNfTFVUXCIpIHRvIHRoZWlyIGNvbG91clxuICAgKiBhcnJheXMgZnJvbSBhIHNlcnZlZCBKU09OIGFzc2V0LiBUaGUgfjYzMCBLQiBvZiBMVVQgZGF0YSBsaXZlcyBvdXRzaWRlIHRoZVxuICAgKiBidW5kbGUgKGFzIGAvYXNzZXRzL3Bsb3R0aW5nL2NvbG9ybWFwLWx1dHMuanNvbmApIHNvIGl0IG5ldmVyIGVudGVycyB0aGUgVFNcbiAgICogLyB3ZWJwYWNrIG1vZHVsZSBncmFwaCDigJQgdGhhdCBkYXRhLWluLXNvdXJjZSB3YXMgdGhlIG1haW4gZHJpdmVyIG9mIHRoZVxuICAgKiBidWlsZCdzID4yIEdCIGhlYXAuIE5hbWVkIFBsb3RseSBzY2FsZXMgKGUuZy4gXCJWaXJpZGlzXCIpIGFyZW4ndCBrZXlzIGluIHRoZVxuICAgKiBKU09OLCBzbyB0aGV5J3JlIGxlZnQgdW50b3VjaGVkLiBUaGUgZGVmYXVsdCBMVVQgKFwiR3JleXMgSW52XCIg4oaSIHRoZSBQbG90bHlcbiAgICogXCJHcmV5c1wiIHNjYWxlKSBuZWVkcyBubyBKU09OLCBzbyB0aGUgZmlyc3QgcmVuZGVyIHdvcmtzIGJlZm9yZSB0aGlzIHJlc29sdmVzLlxuICAgKi9cbiAgcHJpdmF0ZSBsb2FkQ29sb3JtYXBMdXRzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5odHRwKSByZXR1cm47XG4gICAgdGhpcy5odHRwLmdldDxSZWNvcmQ8c3RyaW5nLCBbbnVtYmVyLCBzdHJpbmddW10+PignYXNzZXRzL3Bsb3R0aW5nL2NvbG9ybWFwLWx1dHMuanNvbicpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAobHV0cykgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIENPTE9STUFQX09QVElPTlMgYXMgYW55W10pIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGdyb3VwLmNoaWxkcmVuID8/IFtdKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBjaGlsZD8uZGF0YT8udmFsdWU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYgbHV0c1trZXldKSBjaGlsZC5kYXRhLnZhbHVlID0gbHV0c1trZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7IC8qIGxlYXZlIGtleXMgdW5yZXNvbHZlZDsgbmFtZWQgc2NhbGVzIHN0aWxsIHdvcmsgKi8gfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQcmVzZXQgcGVyc2lzdGVuY2UgKGppdC11aSM3MCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHByaXZhdGUgaW5pdFByZXNldFBlcnNpc3RlbmNlKCk6IHZvaWQge1xuICAgIC8vIERlYm91bmNlZCB3cml0ZS1iYWNrIHNvIGEgYnVyc3Qgb2YgZWRpdHMgY29sbGFwc2VzIGludG8gb25lIFBVVC5cbiAgICB0aGlzLnNhdmVQcmVzZXRzJC5waXBlKGRlYm91bmNlVGltZSg4MDApKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5wcmVmc1BvcnQ/LnNhdmVQcmVzZXRTZXQodGhpcy5wcmVzZXRTZXQpLnN1YnNjcmliZSh7IGVycm9yOiAoKSA9PiB7IC8qIGtlZXAgbG9jYWwgY29weSAqLyB9IH0pO1xuICAgIH0pO1xuICAgIC8vIExvYWQgdGhlIHVzZXIncyBzYXZlZCBzZXQgKGlmIGFueSk7IG90aGVyd2lzZSBrZWVwIHRoZSBzZWVkZWQgZGVmYXVsdHMuXG4gICAgdGhpcy5wcmVmc1BvcnQ/LmxvYWRQcmVzZXRTZXQoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHNldCkgPT4ge1xuICAgICAgICBpZiAoc2V0ICYmIEFycmF5LmlzQXJyYXkoc2V0LmNsYXNzZXMpICYmIHNldC5jbGFzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLnByZXNldFNldCA9IHRoaXMubm9ybWFsaXplUHJlc2V0U2V0KHNldCk7XG4gICAgICAgICAgdGhpcy5wcmVzZXRTZXQkLm5leHQodGhpcy5wcmVzZXRTZXQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJlc2V0c0xvYWRlZCA9IHRydWU7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHsgdGhpcy5wcmVzZXRzTG9hZGVkID0gdHJ1ZTsgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplUHJlc2V0U2V0KHNldDogUHJlc2V0U2V0KTogUHJlc2V0U2V0IHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IGRlZmF1bHRQcmVzZXRTZXQoKTtcbiAgICAvLyBDbG9uZSB0aGUgbmVzdGVkIGFycmF5cy9vYmplY3RzIHNvIG91dHNpZGUgY2FsbGVycyBjYW4ndCBtdXRhdGUgdGhlIHN0b3JlJ3NcbiAgICAvLyBpbnRlcm5hbCBzdGF0ZSB3aXRob3V0IGdvaW5nIHRocm91Z2ggc2V0UHJlc2V0U2V0KCkvdXBzZXJ0Q2xhc3MoKS5cbiAgICByZXR1cm4ge1xuICAgICAgY2xhc3NlczogQXJyYXkuaXNBcnJheShzZXQuY2xhc3NlcykgPyBzZXQuY2xhc3Nlcy5tYXAoKGMpID0+ICh7IC4uLmMgfSkpIDogW10sXG4gICAgICBmYWxsYmFja1BhbGV0dGU6XG4gICAgICAgIEFycmF5LmlzQXJyYXkoc2V0LmZhbGxiYWNrUGFsZXR0ZSkgJiYgc2V0LmZhbGxiYWNrUGFsZXR0ZS5sZW5ndGhcbiAgICAgICAgICA/IFsuLi5zZXQuZmFsbGJhY2tQYWxldHRlXVxuICAgICAgICAgIDogZGVmYXVsdHMuZmFsbGJhY2tQYWxldHRlLFxuICAgICAgYXV0b1Byb21vdGU6ICEhc2V0LmF1dG9Qcm9tb3RlLFxuICAgICAgbWF0Y2hNb2RlOiBzZXQubWF0Y2hNb2RlID09PSAnbm9ybWFsaXplZCcgPyAnbm9ybWFsaXplZCcgOiAnZXhhY3QnLFxuICAgIH07XG4gIH1cblxuICAvKiogUXVldWUgYSBkZWJvdW5jZWQgc2F2ZS4gTm8tb3BzIHVudGlsIHRoZSBpbml0aWFsIGxvYWQgcmVzb2x2ZXMgKGFuZCB3aGVuIG5vIHBvcnQgaXMgYm91bmQpLiAqL1xuICBwcml2YXRlIHF1ZXVlUHJlc2V0U2F2ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcmVzZXRzTG9hZGVkKSB0aGlzLnNhdmVQcmVzZXRzJC5uZXh0KCk7XG4gIH1cblxuICAvKiogUGVyc2lzdCB0aGUgY3VycmVudCBwcmVzZXQgc2V0IGltbWVkaWF0ZWx5LCBieXBhc3NpbmcgdGhlIGluY3JlbWVudGFsLWVkaXRcbiAgICogIGRlYm91bmNlLiBVc2VkIGZvciBleHBsaWNpdCBidWxrIGFjdGlvbnMgKEFwcGx5IC8gSW1wb3J0IC8gUmVzZXQpLiAqL1xuICBwcml2YXRlIHNhdmVQcmVzZXRzTm93KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByZXNldHNMb2FkZWQpIHtcbiAgICAgIHRoaXMucHJlZnNQb3J0Py5zYXZlUHJlc2V0U2V0KHRoaXMucHJlc2V0U2V0KS5zdWJzY3JpYmUoeyBlcnJvcjogKCkgPT4geyAvKiBrZWVwIGxvY2FsIGNvcHkgKi8gfSB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogVGhlIGF2YWlsYWJsZSBjb2xvcm1hcCBvcHRpb25zICh0cmVlIGZvciB0aGUgTFVUIGRyb3Bkb3duKS4gKi9cbiAgZ2V0Q29sb3JtYXBPcHRpb25zKCk6IGFueSB7XG4gICAgcmV0dXJuIENPTE9STUFQX09QVElPTlM7XG4gIH1cblxuICBnZXRDb2xvcm1hcCgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmNvbG9ybWFwJC5hc09ic2VydmFibGUoKTtcbiAgfVxuICAvKiogU3luY2hyb25vdXMgY3VycmVudCB2YWx1ZSDigJQgZm9yIHJlbmRlciBwYXRocyB0aGF0IHJlYWQgaXQgd2hpbGUgYnVpbGRpbmdcbiAgICogIGEgZnJhbWUgKGUuZy4gUGxvdGx5J3MgY29sb3JzY2FsZSkgcmF0aGVyIHRoYW4gc3Vic2NyaWJpbmcuICovXG4gIGN1cnJlbnRDb2xvcm1hcCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmNvbG9ybWFwJC52YWx1ZTtcbiAgfVxuICBzZXRDb2xvcm1hcChjb2xvcm1hcDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5jb2xvcm1hcCQubmV4dChjb2xvcm1hcCk7XG4gIH1cblxuICBnZXRSZXZlcnNlU2NhbGUoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMucmV2ZXJzZVNjYWxlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuICBjdXJyZW50UmV2ZXJzZVNjYWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJldmVyc2VTY2FsZSQudmFsdWU7XG4gIH1cbiAgc2V0UmV2ZXJzZVNjYWxlKHJldmVyc2U6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJldmVyc2VTY2FsZSQubmV4dChyZXZlcnNlKTtcbiAgfVxuXG4gIGdldEltYWdlTWV0YSgpOiBPYnNlcnZhYmxlPElJbWFnZU1ldGFkYXRhW10+IHtcbiAgICByZXR1cm4gdGhpcy5pbWFnZU1ldGEkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhdGNoIHRoZSBwaHlzaWNhbCBwaXhlbCBzaXplICjCtW0vcGl4ZWwpIG9udG8gdGhlIGN1cnJlbnQgaW1hZ2UgbWV0YSBhbmRcbiAgICogcmUtZW1pdCwgd2l0aG91dCB0b3VjaGluZyB0aGUgZGVyaXZlZCBjaGFubmVscy4gVGhlIE9TRCB0aWxlIGRlc2NyaXB0b3JcbiAgICogKGZyb20gdGhlIHNlcnZlcidzIEJpby1Gb3JtYXRzIGAvdGlsZXMvaW5mb2ApIGlzIGF1dGhvcml0YXRpdmUgZm9yIHNjYWxlZFxuICAgKiBpbWFnZXMg4oCUIGBpbWFnZUluZm8uaW1hZ2VNZXRhYCBvZnRlbiBjYXJyaWVzIG5vIG1wcCDigJQgc28gdGhlIHJlbmRlcmVyIGZlZWRzXG4gICAqIGl0IGhlcmUgb25jZSB0aGUgZGVzY3JpcHRvciBsb2FkcywgbGV0dGluZyBhcmVhL3NjYWxlIGNvbnN1bWVycyAodGhlIFJlZ2lvblxuICAgKiBFZGl0b3IpIHNob3cgwrVtwrIvbW3CsiBpbnN0ZWFkIG9mIHB4wrIuIE5vLW9wIHdoZW4gbmVpdGhlciBheGlzIGlzIHBvc2l0aXZlLlxuICAgKi9cbiAgc2V0UGh5c2ljYWxQaXhlbFNpemUobXBwWD86IG51bWJlciwgbXBwWT86IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGhhc1ggPSAobXBwWCA/PyAwKSA+IDAsIGhhc1kgPSAobXBwWSA/PyAwKSA+IDA7XG4gICAgaWYgKCFoYXNYICYmICFoYXNZKSByZXR1cm47XG4gICAgY29uc3QgY3VyID0gdGhpcy5pbWFnZU1ldGEkLnZhbHVlO1xuICAgIGNvbnN0IG1ldGEgPSAoY3VyICYmIGN1ci5sZW5ndGggPyBjdXIgOiBbe30gYXMgSUltYWdlTWV0YWRhdGFdKS5tYXAoKGUpID0+ICh7IC4uLmUgfSkpO1xuICAgIGlmIChoYXNYKSBtZXRhWzBdLm1wcFggPSBtcHBYO1xuICAgIGlmIChoYXNZKSBtZXRhWzBdLm1wcFkgPSBtcHBZO1xuICAgIHRoaXMuaW1hZ2VNZXRhJC5uZXh0KG1ldGEpO1xuICB9XG4gIHNldEltYWdlTWV0YShpbWFnZU1ldGE6IElJbWFnZU1ldGFkYXRhW10pOiB2b2lkIHtcbiAgICB0aGlzLmltYWdlTWV0YSQubmV4dChpbWFnZU1ldGEpO1xuICAgIC8vIFJlLWRlcml2ZSBjaGFubmVscyBvbmx5IHdoZW4gdGhlaXIgc3RydWN0dXJlIGNoYW5nZXMgKGNvdW50KSwgc28gYSByZS1wbG90XG4gICAgLy8gb2YgdGhlIHNhbWUgaW1hZ2UgZG9lc24ndCBjbG9iYmVyIHRoZSB1c2VyJ3Mgd2luZG93L2dhbW1hIGVkaXRzLlxuICAgIGNvbnN0IG5leHQgPSB0aGlzLmRlcml2ZUNoYW5uZWxzKGltYWdlTWV0YSk7XG4gICAgLy8gQWx3YXlzIHJlZnJlc2ggdGhlIHJlc2V0IGJhc2VsaW5lIHRvIHRoZSBjdXJyZW50IGltYWdlJ3MgZGVyaXZlZCBkZWZhdWx0c1xuICAgIC8vIChuYW1lcy9jb2xvdXJzIGNhbiBkaWZmZXIgZXZlbiBhdCB0aGUgc2FtZSBjaGFubmVsIGNvdW50KS5cbiAgICB0aGlzLmRlZmF1bHRDaGFubmVsU3RhdGVzID0gbmV4dC5tYXAoKGMpID0+ICh7IC4uLmMgfSkpO1xuICAgIGlmIChuZXh0Lmxlbmd0aCAhPT0gdGhpcy5jaGFubmVsU3RhdGVzJC52YWx1ZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY2hhbm5lbFN0YXRlcyQubmV4dChuZXh0KTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRDaGFubmVsJC5uZXh0KDApOyAvLyBuZXcgY2hhbm5lbCBzdHJ1Y3R1cmUg4oaSIHJlc2V0IHRoZSBzZWxlY3RlZCBiYW5kXG4gICAgfVxuICB9XG5cbiAgLyoqIENoYW5uZWxzIGZvciBhbiBpbWFnZTpcbiAgICogICAtIFJHQiAocmdiQ2hhbm5lbHMg4omlIDMpIOKGkiBSZWQvR3JlZW4vQmx1ZTtcbiAgICogICAtIG11bHRpY2hhbm5lbCBmbHVvcmVzY2VuY2UgKGNoYW5uZWxDb3VudCA+IDEpIOKGkiBvbmUgY2hhbm5lbCBwZXIgYmFuZCxcbiAgICogICAgIG5hbWVkL3RpbnRlZCBmcm9tIHRoZSBzZXJ2ZXIgYGNoYW5uZWxJbmZvYCB3aGVuIHByZXNlbnQsIGVsc2UgYSBwYWxldHRlO1xuICAgKiAgIC0gb3RoZXJ3aXNlIGEgc2luZ2xlIGdyYXlzY2FsZSBcIkludGVuc2l0eVwiIGNoYW5uZWwuICovXG4gIHByaXZhdGUgZGVyaXZlQ2hhbm5lbHMobWV0YTogSUltYWdlTWV0YWRhdGFbXSk6IElDaGFubmVsU3RhdGVbXSB7XG4gICAgY29uc3QgYmFzZSA9IHsgbWluOiAwLCBtYXg6IDI1NSwgZ2FtbWE6IDEsIHZpc2libGU6IHRydWUgfTtcbiAgICBjb25zdCBtID0gbWV0YT8uWzBdO1xuICAgIGlmICgobT8ucmdiQ2hhbm5lbHMgPz8gMSkgPj0gMykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgeyBpbmRleDogMCwgbmFtZTogJ1JlZCcsIGNvbG9yOiAnI2ZmMDAwMCcsIC4uLmJhc2UgfSxcbiAgICAgICAgeyBpbmRleDogMSwgbmFtZTogJ0dyZWVuJywgY29sb3I6ICcjMDBmZjAwJywgLi4uYmFzZSB9LFxuICAgICAgICB7IGluZGV4OiAyLCBuYW1lOiAnQmx1ZScsIGNvbG9yOiAnIzAwMDBmZicsIC4uLmJhc2UgfSxcbiAgICAgIF07XG4gICAgfVxuICAgIGNvbnN0IGNvdW50ID0gbT8uY2hhbm5lbENvdW50ID8/IDE7XG4gICAgaWYgKGNvdW50ID4gMSkge1xuICAgICAgY29uc3QgaW5mbyA9IG0/LmNoYW5uZWxJbmZvO1xuICAgICAgLy8gRmFsbGJhY2sgdGludHMgKEZpamktaXNoKSB3aGVuIHRoZSBzZXJ2ZXIgZG9lc24ndCBzdXBwbHkgYSBjb2xvci5cbiAgICAgIGNvbnN0IHBhbGV0dGUgPSBbJyNmZjAwMDAnLCAnIzAwZmYwMCcsICcjMDAwMGZmJywgJyNmZmZmZmYnLCAnIzAwZmZmZicsICcjZmYwMGZmJywgJyNmZmZmMDAnXTtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoXywgaSkgPT4gKHtcbiAgICAgICAgaW5kZXg6IGksXG4gICAgICAgIG5hbWU6IGluZm8/LltpXT8ubmFtZSB8fCBgQ2hhbm5lbCAke2kgKyAxfWAsXG4gICAgICAgIGNvbG9yOiBpbmZvPy5baV0/LmNvbG9yIHx8IHBhbGV0dGVbaSAlIHBhbGV0dGUubGVuZ3RoXSxcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIFt7IGluZGV4OiAwLCBuYW1lOiAnSW50ZW5zaXR5JywgY29sb3I6ICcjZmZmZmZmJywgLi4uYmFzZSB9XTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDaGFubmVscyAmIGhpc3RvZ3JhbSBzdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgZ2V0Q2hhbm5lbFN0YXRlcygpOiBPYnNlcnZhYmxlPElDaGFubmVsU3RhdGVbXT4ge1xuICAgIHJldHVybiB0aGlzLmNoYW5uZWxTdGF0ZXMkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGN1cnJlbnRDaGFubmVsU3RhdGVzKCk6IElDaGFubmVsU3RhdGVbXSB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbm5lbFN0YXRlcyQudmFsdWU7XG4gIH1cbiAgLyoqIFRoZSBjaGFubmVsIHNlbGVjdGVkIGluIHRoZSBwYW5lIChkcml2ZXMgYSBzaW5nbGUtc2NhbGFyIDNEIFN1cmZhY2UpLiAqL1xuICBnZXRTZWxlY3RlZENoYW5uZWwoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHsgcmV0dXJuIHRoaXMuc2VsZWN0ZWRDaGFubmVsJC5hc09ic2VydmFibGUoKTsgfVxuICBjdXJyZW50U2VsZWN0ZWRDaGFubmVsKCk6IG51bWJlciB7IHJldHVybiB0aGlzLnNlbGVjdGVkQ2hhbm5lbCQudmFsdWU7IH1cbiAgc2V0U2VsZWN0ZWRDaGFubmVsKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZENoYW5uZWwkLnZhbHVlICE9PSBpbmRleCkgdGhpcy5zZWxlY3RlZENoYW5uZWwkLm5leHQoaW5kZXgpO1xuICB9XG4gIC8qKiBQYXRjaCBvbmUgY2hhbm5lbCBieSBpbmRleCAoaW1tdXRhYmxlIHVwZGF0ZSkuICovXG4gIHNldENoYW5uZWxTdGF0ZShpbmRleDogbnVtYmVyLCBwYXJ0aWFsOiBQYXJ0aWFsPElDaGFubmVsU3RhdGU+KTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IHRoaXMuY2hhbm5lbFN0YXRlcyQudmFsdWUubWFwKChjKSA9PlxuICAgICAgYy5pbmRleCA9PT0gaW5kZXggPyB7IC4uLmMsIC4uLnBhcnRpYWwsIGluZGV4OiBjLmluZGV4IH0gOiBjLFxuICAgICk7XG4gICAgdGhpcy5jaGFubmVsU3RhdGVzJC5uZXh0KG5leHQpO1xuICB9XG4gIC8qKiBSZXBsYWNlIGFsbCBjaGFubmVsIHN0YXRlcyAodXNlZCBieSBhdXRvL3Jlc2V0KS4gKi9cbiAgc2V0Q2hhbm5lbFN0YXRlcyhzdGF0ZXM6IElDaGFubmVsU3RhdGVbXSk6IHZvaWQge1xuICAgIHRoaXMuY2hhbm5lbFN0YXRlcyQubmV4dChzdGF0ZXMpO1xuICB9XG4gIC8qKiBSZXNldCBvbmUgY2hhbm5lbCdzIGRpc3BsYXkgd2luZG93LCBnYW1tYSBBTkQgY29sb3VyIHRvIHRoZSB2YWx1ZXMgZGVyaXZlZFxuICAgKiAgZm9yIHRoZSBjdXJyZW50IGltYWdlIChmdWxsIDAuLjI1NSByYW5nZSwgZ2FtbWEgMSwgdGhlIGNoYW5uZWwncyBkZWZhdWx0XG4gICAqICB0aW50KS4gRmFsbHMgYmFjayB0byBuZXV0cmFsIGRlZmF1bHRzIGlmIG5vIGJhc2VsaW5lIHdhcyBjYXB0dXJlZC4gKi9cbiAgcmVzZXRDaGFubmVsU3RhdGUoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGRlZiA9IHRoaXMuZGVmYXVsdENoYW5uZWxTdGF0ZXMuZmluZCgoYykgPT4gYy5pbmRleCA9PT0gaW5kZXgpO1xuICAgIHRoaXMuc2V0Q2hhbm5lbFN0YXRlKGluZGV4LCB7XG4gICAgICBtaW46IGRlZj8ubWluID8/IDAsXG4gICAgICBtYXg6IGRlZj8ubWF4ID8/IDI1NSxcbiAgICAgIGdhbW1hOiBkZWY/LmdhbW1hID8/IDEsXG4gICAgICBjb2xvcjogZGVmPy5jb2xvciA/PyAnI2ZmZmZmZicsXG4gICAgfSk7XG4gIH1cblxuICBnZXRHcmF5c2NhbGUoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JheXNjYWxlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuICBjdXJyZW50R3JheXNjYWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdyYXlzY2FsZSQudmFsdWU7XG4gIH1cbiAgc2V0R3JheXNjYWxlKG9uOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5ncmF5c2NhbGUkLm5leHQob24pO1xuICB9XG5cbiAgZ2V0SW52ZXJ0KCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmludmVydCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgY3VycmVudEludmVydCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pbnZlcnQkLnZhbHVlO1xuICB9XG4gIHNldEludmVydChvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaW52ZXJ0JC5uZXh0KG9uKTtcbiAgfVxuXG4gIC8qKiBOYW1l4oaSY29sb3VyIHZpZXcgb2YgdGhlIGN1cnJlbnQgcHJlc2V0IHNldCAoY29tcGF0IGZvciBiYWNrZW5kIHJlbmRlcmVyc1xuICAgKiAgdGhhdCBzdGlsbCByZWFkIGEgTWFwKS4gKi9cbiAgZ2V0Q2xhc3NpZmljYXRpb25Db2xvcnMoKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBNYXAodGhpcy5wcmVzZXRTZXQuY2xhc3Nlcy5tYXAoKGMpID0+IFtjLm5hbWUsIGMuY29sb3JdKSk7XG4gIH1cbiAgLyoqIFVwc2VydCBhIHNpbmdsZSBjbGFzcyBjb2xvdXIgKHVzZWQgYnkgdGhlIGVkaXRvcidzIHBlci1jbGFzcyBjb2xvdXIgcGlja2VyKS4gKi9cbiAgc2V0Q2xhc3NpZmljYXRpb25Db2xvcihsYWJlbDogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy51cHNlcnRDbGFzcyh7IG5hbWU6IGxhYmVsLCBjb2xvciB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBBbm5vdGF0aW9uLWNsYXNzIHByZXNldCBzZXQgYWNjZXNzb3JzIChqaXQtdWkjNzApIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBnZXRQcmVzZXRTZXQoKTogUHJlc2V0U2V0IHtcbiAgICAvLyBEZWZlbnNpdmUgY29weTogY2FsbGVycyBtdXN0IG5vdCBtdXRhdGUgdGhlIHN0b3JlJ3Mgc3RhdGUgaW4gcGxhY2Ug4oCUXG4gICAgLy8gYWxsIGNoYW5nZXMgZ28gdGhyb3VnaCBzZXRQcmVzZXRTZXQoKS91cHNlcnRDbGFzcygpL3JlbW92ZUNsYXNzKCkgc29cbiAgICAvLyBwcmVzZXRTZXQkIGFuZCBwZXJzaXN0ZW5jZSBzdGF5IGluIHN5bmMuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNsYXNzZXM6IHRoaXMucHJlc2V0U2V0LmNsYXNzZXMubWFwKChjKSA9PiAoeyAuLi5jIH0pKSxcbiAgICAgIGZhbGxiYWNrUGFsZXR0ZTogWy4uLnRoaXMucHJlc2V0U2V0LmZhbGxiYWNrUGFsZXR0ZV0sXG4gICAgICBhdXRvUHJvbW90ZTogdGhpcy5wcmVzZXRTZXQuYXV0b1Byb21vdGUsXG4gICAgICBtYXRjaE1vZGU6IHRoaXMucHJlc2V0U2V0Lm1hdGNoTW9kZSxcbiAgICB9O1xuICB9XG4gIGdldFByZXNldFNldCQoKTogT2JzZXJ2YWJsZTxQcmVzZXRTZXQ+IHtcbiAgICByZXR1cm4gdGhpcy5wcmVzZXRTZXQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIHNldFByZXNldFNldChzZXQ6IFByZXNldFNldCk6IHZvaWQge1xuICAgIHRoaXMucHJlc2V0U2V0ID0gdGhpcy5ub3JtYWxpemVQcmVzZXRTZXQoc2V0KTtcbiAgICB0aGlzLnByZXNldFNldCQubmV4dCh0aGlzLnByZXNldFNldCk7XG4gICAgdGhpcy5zYXZlUHJlc2V0c05vdygpOyAvLyBleHBsaWNpdCBidWxrIGFwcGx5L2ltcG9ydCDihpIgcGVyc2lzdCBpbW1lZGlhdGVseVxuICB9XG4gIC8qKiBBZGQgb3IgdXBkYXRlIGEgY2xhc3MgKGtleWVkIGJ5IGV4YWN0IHN0b3JlZCBgbmFtZWApLiAqL1xuICB1cHNlcnRDbGFzcyhwcmVzZXQ6IENsYXNzUHJlc2V0KTogdm9pZCB7XG4gICAgY29uc3QgY2xhc3NlcyA9IFsuLi50aGlzLnByZXNldFNldC5jbGFzc2VzXTtcbiAgICBjb25zdCBpID0gY2xhc3Nlcy5maW5kSW5kZXgoKGMpID0+IGMubmFtZSA9PT0gcHJlc2V0Lm5hbWUpO1xuICAgIGlmIChpID49IDApIGNsYXNzZXNbaV0gPSB7IC4uLmNsYXNzZXNbaV0sIC4uLnByZXNldCB9O1xuICAgIGVsc2UgY2xhc3Nlcy5wdXNoKHsgLi4ucHJlc2V0IH0pO1xuICAgIHRoaXMucHJlc2V0U2V0ID0geyAuLi50aGlzLnByZXNldFNldCwgY2xhc3NlcyB9O1xuICAgIHRoaXMucHJlc2V0U2V0JC5uZXh0KHRoaXMucHJlc2V0U2V0KTtcbiAgICB0aGlzLnF1ZXVlUHJlc2V0U2F2ZSgpO1xuICB9XG4gIHJlbW92ZUNsYXNzKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucHJlc2V0U2V0ID0geyAuLi50aGlzLnByZXNldFNldCwgY2xhc3NlczogdGhpcy5wcmVzZXRTZXQuY2xhc3Nlcy5maWx0ZXIoKGMpID0+IGMubmFtZSAhPT0gbmFtZSkgfTtcbiAgICB0aGlzLnByZXNldFNldCQubmV4dCh0aGlzLnByZXNldFNldCk7XG4gICAgdGhpcy5xdWV1ZVByZXNldFNhdmUoKTtcbiAgfVxuICByZXNldFByZXNldHMoKTogdm9pZCB7XG4gICAgdGhpcy5wcmVzZXRTZXQgPSBkZWZhdWx0UHJlc2V0U2V0KCk7XG4gICAgdGhpcy5wcmVzZXRTZXQkLm5leHQodGhpcy5wcmVzZXRTZXQpO1xuICAgIHRoaXMuc2F2ZVByZXNldHNOb3coKTsgLy8gZXhwbGljaXQgcmVzZXQg4oaSIHBlcnNpc3QgaW1tZWRpYXRlbHlcbiAgfVxuICAvKiogRm9yY2UgYSAoZGVib3VuY2VkKSB3cml0ZS1iYWNrIG9mIHRoZSBjdXJyZW50IHByZXNldCBzZXQuICovXG4gIHBlcnNpc3RQcmVzZXRzKCk6IHZvaWQge1xuICAgIHRoaXMucXVldWVQcmVzZXRTYXZlKCk7XG4gIH1cblxuICBnZXRBY3RpdmVUb29sJCgpOiBPYnNlcnZhYmxlPHN0cmluZyB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVUb29sJC5hc09ic2VydmFibGUoKTtcbiAgfVxuICBnZXRBY3RpdmVUb29sKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZVRvb2wkLnZhbHVlO1xuICB9XG4gIHNldEFjdGl2ZVRvb2wodG9vbDogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlVG9vbCQubmV4dCh0b29sKTtcbiAgfVxufVxuIl19
385
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zdG9yZS92aXN1YWxpemVyLXN0b3JlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdELE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5QyxPQUFPLEVBQTBCLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEYsT0FBTyxFQUFFLGdCQUFnQixFQUFtQixNQUFNLHFDQUFxQyxDQUFDO0FBSXhGLE9BQU8sRUFBRSxvQkFBb0IsRUFBb0IsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7O0FBRXJEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUgsTUFBTSxPQUFPLGVBQWU7SUFpRDFCLDJFQUEyRTtJQUMzRSw2RUFBNkU7SUFDN0UsbURBQW1EO0lBQ25ELFlBQytCLE9BQTBCLElBQUksRUFDSixZQUFvQyxJQUFJO1FBRGxFLFNBQUksR0FBSixJQUFJLENBQTBCO1FBQ0osY0FBUyxHQUFULFNBQVMsQ0FBK0I7UUFyRGpHLHdFQUF3RTtRQUN4RSw4RUFBOEU7UUFDOUUscURBQXFEO1FBQ3BDLGNBQVMsR0FBRyxJQUFJLGVBQWUsQ0FDOUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxXQUFXLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxD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RSxjQUFjLENBQUMsT0FBa0M7UUFDL0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQ7a0VBQzhEO0lBQzlELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxvQkFBb0IsRUFBRSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUNELGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO0lBQ2hDLENBQUM7SUFDRCxhQUFhLENBQUMsSUFBbUI7UUFDL0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsQ0FBQzs4R0E1V1UsZUFBZSw0REFzREosZ0JBQWdCO2tIQXREM0IsZUFBZSxjQURGLE1BQU07OzJGQUNuQixlQUFlO2tCQUQzQixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7MEJBc0Q3QixRQUFROzswQkFDUixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE9wdGlvbmFsLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQ2xhc3NQcmVzZXQsIFByZXNldFNldCwgZGVmYXVsdFByZXNldFNldCB9IGZyb20gJy4uL21vZGVscy9jbGFzcy1wcmVzZXQnO1xuaW1wb3J0IHsgUFJFRkVSRU5DRVNfUE9SVCwgUHJlZmVyZW5jZXNQb3J0IH0gZnJvbSAnLi4vY29udHJhY3RzL3BvcnRzL3ByZWZlcmVuY2VzLnBvcnQnO1xuXG5pbXBvcnQgeyBJSW1hZ2VNZXRhZGF0YSB9IGZyb20gJy4uL2NvbnRyYWN0cy9pbWFnZS5jb250cmFjdCc7XG5pbXBvcnQgeyBJQ2hhbm5lbFN0YXRlIH0gZnJvbSAnLi4vY29udHJhY3RzL2NoYW5uZWwtaGlzdG9ncmFtLWFwaS5jb250cmFjdCc7XG5pbXBvcnQgeyBERUZBVUxUX1NQQVRJQUxfVklFVywgU3BhdGlhbFZpZXdTdGF0ZSB9IGZyb20gJy4uL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7IENPTE9STUFQX09QVElPTlMgfSBmcm9tICcuLi9wbG90LnV0aWxpdGllcyc7XG5cbi8qKlxuICogQmFja2VuZC1uZXV0cmFsIHN0b3JlIGZvciB0aGUgKip2aXN1YWxpemF0aW9uIHNlc3Npb24qKiDigJQgdGhlIHN0YXRlIHRoYXRcbiAqIGRlc2NyaWJlcyAqaG93KiB0aGUgY3VycmVudCBpbWFnZSBpcyBiZWluZyB2aWV3ZWQsIGluZGVwZW5kZW50IG9mIHdoaWNoXG4gKiByZW5kZXJpbmcgYmFja2VuZCAoUGxvdGx5IG9yIE9wZW5TZWFkcmFnb24pIGlzIG9uIHNjcmVlbjpcbiAqXG4gKiAgLSB0aGUgYWN0aXZlIGNvbG9ybWFwIC8gTFVUIGFuZCBpdHMgcmV2ZXJzZS1zY2FsZSB0b2dnbGUsXG4gKiAgLSB0aGUgY3VycmVudCBpbWFnZSdzIHBoeXNpY2FsIG1ldGFkYXRhICjCtW0vcGl4ZWwgZXRjLiksXG4gKiAgLSB0aGUgY2xhc3NpZmljYXRpb24gbGFiZWwg4oaSIGNvbG91ciBtYXAsXG4gKiAgLSB3aGljaCBvbi1jYW52YXMgdG9vbCBpcyBjdXJyZW50bHkgYWN0aXZlLlxuICpcbiAqIEJvdGggYmFja2VuZHMgcmVhZCBhbmQgd3JpdGUgdGhpcyBzaW5nbGUgaW5zdGFuY2UsIHNvIHRoZXkgc3RheSBpbiBsb2NrLXN0ZXBcbiAqIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggb25lIGlzIHJlbmRlcmluZy4gUHJldmlvdXNseSB0aGlzIHN0YXRlIGxpdmVkIGluc2lkZVxuICogYFBsb3RseVNlcnZpY2VgLCB3aGljaCBmb3JjZWQgdGhlIE9wZW5TZWFkcmFnb24gYmFja2VuZCB0byBkZXBlbmQgb24gdGhlXG4gKiBQbG90bHkgc2VydmljZSBwdXJlbHkgdG8gcmVhZCB0aGUgc2hhcmVkIGNvbG9ybWFwOyB0aGlzIHN0b3JlIHJlbW92ZXMgdGhhdFxuICogY291cGxpbmcg4oCUIG5laXRoZXIgYmFja2VuZCBvd25zIHRoZSBzZXNzaW9uIHN0YXRlLlxuICpcbiAqIE5PVEU6IHJlZ2lvbiAqZ2VvbWV0cnkqICh0aGUgZHJhd24gc2hhcGVzIC8gcGVyLWltYWdlIHJlZ2lvbiBjYWNoZSkgc3RpbGxcbiAqIGxpdmVzIGluIGBQbG90bHlTZXJ2aWNlYCBmb3Igbm93OyBleHRyYWN0aW5nIGl0IGludG8gYSBzaWJsaW5nIHJlZ2lvbiBzdG9yZVxuICogaXMgYSBzZXBhcmF0ZSBmb2xsb3ctdXAuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgVmlzdWFsaXplclN0b3JlIHtcbiAgLy8g4pSA4pSAIENvbG9ybWFwIC8gTFVUIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBEZWZhdWx0IHRvIGludmVydGVkIGdyZXlzIChkYXJrIGJhY2tncm91bmQg4oaSIGJyaWdodCBzaWduYWwpLCB3aGljaCByZWFkcyBhc1xuICAvLyB0aGUgbmF0dXJhbCBncmF5c2NhbGUgZm9yIHRoZXNlIG1pY3Jvc2NvcHkgaW1hZ2VzLlxuICBwcml2YXRlIHJlYWRvbmx5IGNvbG9ybWFwJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihcbiAgICBDT0xPUk1BUF9PUFRJT05TWzBdLmNoaWxkcmVuLmZpbmQoKGM6IGFueSkgPT4gYy5sYWJlbCA9PT0gJ0dyZXlzIEludicpID8/IENPTE9STUFQX09QVElPTlNbMF0uY2hpbGRyZW5bMF0sXG4gICk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmV2ZXJzZVNjYWxlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8vIOKUgOKUgCBJbWFnZSBtZXRhZGF0YSAocGh5c2ljYWwgcGl4ZWwgc2l6ZSwgY2hhbm5lbHMsIOKApikg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHByaXZhdGUgcmVhZG9ubHkgaW1hZ2VNZXRhJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SUltYWdlTWV0YWRhdGFbXT4oW10pO1xuXG4gIC8vIOKUgOKUgCBDaGFubmVscyAmIGhpc3RvZ3JhbSBkaXNwbGF5IHN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBQZXItY2hhbm5lbCBkaXNwbGF5IHdpbmRvdy9nYW1tYS92aXNpYmlsaXR5L2NvbG91ciwgZGVyaXZlZCBmcm9tIHRoZSBpbWFnZVxuICAvLyBtZXRhZGF0YSBvbiBsb2FkICgxIFwiSW50ZW5zaXR5XCIgY2hhbm5lbCBmb3IgZ3JheXNjYWxlOyBSL0cvQiBmb3IgUkdCKS4gVGhlXG4gIC8vIENoYW5uZWxzICYgSGlzdG9ncmFtIHBhbmUgZWRpdHMgdGhlc2UgYW5kIGJvdGggYmFja2VuZHMgcmVjb2xvciBsaXZlLlxuICBwcml2YXRlIHJlYWRvbmx5IGNoYW5uZWxTdGF0ZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJQ2hhbm5lbFN0YXRlW10+KFtdKTtcbiAgLyoqIEluZGV4IG9mIHRoZSBjaGFubmVsIHNlbGVjdGVkIGluIHRoZSBDaGFubmVscyBwYW5lIOKAlCB0aGUgT05FIGJhbmQgYVxuICAgKiAgc2luZ2xlLXNjYWxhciAzRCB2aWV3ICh0aGUgbmFwYXJpIFN1cmZhY2UpIGZvbGxvd3MgZm9yIGEgbXVsdGljaGFubmVsIGltYWdlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNlbGVjdGVkQ2hhbm5lbCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG4gIC8vIFRoZSBkZXJpdmVkIGRlZmF1bHRzIChmdWxsIHdpbmRvdywgZ2FtbWEgMSwgZGVmYXVsdCB0aW50KSBmb3IgdGhlIGN1cnJlbnRcbiAgLy8gaW1hZ2UsIGtlcHQgc28gXCJSZXNldFwiIGNhbiByZXN0b3JlIGEgY2hhbm5lbCdzIHdpbmRvdy9nYW1tYS9jb2xvdXIuXG4gIHByaXZhdGUgZGVmYXVsdENoYW5uZWxTdGF0ZXM6IElDaGFubmVsU3RhdGVbXSA9IFtdO1xuICAvLyBHcmF5c2NhbGUgZGlzcGxheSAoaWdub3JlIHRoZSBjaGFubmVsIHRpbnRzKSBhbmQgaW52ZXJ0ZWQgYmFja2dyb3VuZCDigJQgYm90aFxuICAvLyBnbG9iYWwgZGlzcGxheSBmbGFncywgbGlrZSB0aGUgY29sb3JtYXAuXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JheXNjYWxlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGludmVydCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAvLyDilIDilIAgQW5ub3RhdGlvbiBjbGFzcyBwcmVzZXRzIChqaXQtdWkjNzApIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBUaGUgcGVyLXVzZXIsIHNlcnZlci1wZXJzaXN0ZWQgc291cmNlIG9mIHRydXRoIGZvciByZWdpb24gY29sb3Vycywgc2VlZGVkXG4gIC8vIGZyb20gdGhlIGhpc3RvcmljYWwgZGVmYXVsdCBjbGFzc2VzLiBMb2FkZWQvc2F2ZWQgdmlhIHRoZSBvcHRpb25hbFxuICAvLyBQcmVmZXJlbmNlc1BvcnQgKGFwcC1zaWRlIGFkYXB0ZXIg4oaSIGppdC1zZXJ2aWNlKS4gZ2V0Q2xhc3NpZmljYXRpb25Db2xvcnMoKVxuICAvLyBiZWxvdyBzdGF5cyBhcyBhIG5hbWXihpJjb2xvdXIgdmlldyBmb3IgdGhlIGJhY2tlbmRzJyByZWdpb24gcmVuZGVyZXJzLlxuICBwcml2YXRlIHByZXNldFNldDogUHJlc2V0U2V0ID0gZGVmYXVsdFByZXNldFNldCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IHByZXNldFNldCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFByZXNldFNldD4odGhpcy5wcmVzZXRTZXQpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNhdmVQcmVzZXRzJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgcHJlc2V0c0xvYWRlZCA9IGZhbHNlO1xuXG4gIC8vIOKUgOKUgCBBY3RpdmUgb24tY2FudmFzIHRvb2wg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFdoaWNoIHRvb2wgdGhlIHVzZXIgaGFzIGFybWVkIChwYW4sIHpvb20sIGRyYXdyZWN0LCB3YW5kLCBlcmFzZXIsIOKApikgb3JcbiAgLy8gbnVsbCB3aGVuIG5vbmUgaXMgYWN0aXZlLiBUaGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdG9vbCBzdGF0ZSBhY3Jvc3NcbiAgLy8gdGhlIHRvb2xiYXIgYW5kIHdoaWNoZXZlciBiYWNrZW5kJ3Mgb3ZlcmxheSBoYW5kbGVzIHRoZSBwb2ludGVyLlxuICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2ZVRvb2wkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAvKiogU3BhdGlhbC1vbWljcyBkaXNwbGF5IHN0YXRlIChjb2xvdXIgc291cmNlLCBwb2ludCBzaXplLCBhbHBoYSwgc2NhbGluZykuXG4gICAqICBIZWxkIGhlcmUsIG5leHQgdG8gdGhlIGNvbG9ybWFwL2NoYW5uZWwgc3RhdGUsIHNvIHRoZSBhY3RpdmUgYmFja2VuZCByZWFjdHNcbiAgICogIHRvIGFuIGVkaXQgZXhhY3RseSBhcyBpdCBkb2VzIGZvciBhbiBpbWFnZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzcGF0aWFsVmlldyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNwYXRpYWxWaWV3U3RhdGU+KHsgLi4uREVGQVVMVF9TUEFUSUFMX1ZJRVcgfSk7XG5cbiAgLy8gT3B0aW9uYWwgKyBudWxsIGRlZmF1bHRzIHNvIHRoZSBzdG9yZSBjYW4gYmUgY29uc3RydWN0ZWQgYm90aCB2aWEgREkgYW5kXG4gIC8vIGRpcmVjdGx5IChgbmV3IFZpc3VhbGl6ZXJTdG9yZSgpYCBpbiB1bml0IHRlc3RzKTsgdGhlIExVVCBmZXRjaCBhbmQgcHJlc2V0XG4gIC8vIGxvYWQvc2F2ZSBuby1vcCB3aGVuIHRoZWlyIGRlcGVuZGVuY3kgaXMgYWJzZW50LlxuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHJlYWRvbmx5IGh0dHA6IEh0dHBDbGllbnQgfCBudWxsID0gbnVsbCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFBSRUZFUkVOQ0VTX1BPUlQpIHByaXZhdGUgcmVhZG9ubHkgcHJlZnNQb3J0OiBQcmVmZXJlbmNlc1BvcnQgfCBudWxsID0gbnVsbCxcbiAgKSB7XG4gICAgdGhpcy5sb2FkQ29sb3JtYXBMdXRzKCk7XG4gICAgdGhpcy5pbml0UHJlc2V0UGVyc2lzdGVuY2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSBjb2xvcm1hcCB0cmVlJ3MgTFVUIGtleXMgKGUuZy4gXCJHUkVZU19MVVRcIikgdG8gdGhlaXIgY29sb3VyXG4gICAqIGFycmF5cyBmcm9tIGEgc2VydmVkIEpTT04gYXNzZXQuIFRoZSB+NjMwIEtCIG9mIExVVCBkYXRhIGxpdmVzIG91dHNpZGUgdGhlXG4gICAqIGJ1bmRsZSAoYXMgYC9hc3NldHMvcGxvdHRpbmcvY29sb3JtYXAtbHV0cy5qc29uYCkgc28gaXQgbmV2ZXIgZW50ZXJzIHRoZSBUU1xuICAgKiAvIHdlYnBhY2sgbW9kdWxlIGdyYXBoIOKAlCB0aGF0IGRhdGEtaW4tc291cmNlIHdhcyB0aGUgbWFpbiBkcml2ZXIgb2YgdGhlXG4gICAqIGJ1aWxkJ3MgPjIgR0IgaGVhcC4gTmFtZWQgUGxvdGx5IHNjYWxlcyAoZS5nLiBcIlZpcmlkaXNcIikgYXJlbid0IGtleXMgaW4gdGhlXG4gICAqIEpTT04sIHNvIHRoZXkncmUgbGVmdCB1bnRvdWNoZWQuIFRoZSBkZWZhdWx0IExVVCAoXCJHcmV5cyBJbnZcIiDihpIgdGhlIFBsb3RseVxuICAgKiBcIkdyZXlzXCIgc2NhbGUpIG5lZWRzIG5vIEpTT04sIHNvIHRoZSBmaXJzdCByZW5kZXIgd29ya3MgYmVmb3JlIHRoaXMgcmVzb2x2ZXMuXG4gICAqL1xuICBwcml2YXRlIGxvYWRDb2xvcm1hcEx1dHMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmh0dHApIHJldHVybjtcbiAgICB0aGlzLmh0dHAuZ2V0PFJlY29yZDxzdHJpbmcsIFtudW1iZXIsIHN0cmluZ11bXT4+KCdhc3NldHMvcGxvdHRpbmcvY29sb3JtYXAtbHV0cy5qc29uJykuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChsdXRzKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgQ09MT1JNQVBfT1BUSU9OUyBhcyBhbnlbXSkge1xuICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZ3JvdXAuY2hpbGRyZW4gPz8gW10pIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGNoaWxkPy5kYXRhPy52YWx1ZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiBsdXRzW2tleV0pIGNoaWxkLmRhdGEudmFsdWUgPSBsdXRzW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHsgLyogbGVhdmUga2V5cyB1bnJlc29sdmVkOyBuYW1lZCBzY2FsZXMgc3RpbGwgd29yayAqLyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIFByZXNldCBwZXJzaXN0ZW5jZSAoaml0LXVpIzcwKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgcHJpdmF0ZSBpbml0UHJlc2V0UGVyc2lzdGVuY2UoKTogdm9pZCB7XG4gICAgLy8gRGVib3VuY2VkIHdyaXRlLWJhY2sgc28gYSBidXJzdCBvZiBlZGl0cyBjb2xsYXBzZXMgaW50byBvbmUgUFVULlxuICAgIHRoaXMuc2F2ZVByZXNldHMkLnBpcGUoZGVib3VuY2VUaW1lKDgwMCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnByZWZzUG9ydD8uc2F2ZVByZXNldFNldCh0aGlzLnByZXNldFNldCkuc3Vic2NyaWJlKHsgZXJyb3I6ICgpID0+IHsgLyoga2VlcCBsb2NhbCBjb3B5ICovIH0gfSk7XG4gICAgfSk7XG4gICAgLy8gTG9hZCB0aGUgdXNlcidzIHNhdmVkIHNldCAoaWYgYW55KTsgb3RoZXJ3aXNlIGtlZXAgdGhlIHNlZWRlZCBkZWZhdWx0cy5cbiAgICB0aGlzLnByZWZzUG9ydD8ubG9hZFByZXNldFNldCgpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoc2V0KSA9PiB7XG4gICAgICAgIGlmIChzZXQgJiYgQXJyYXkuaXNBcnJheShzZXQuY2xhc3NlcykgJiYgc2V0LmNsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMucHJlc2V0U2V0ID0gdGhpcy5ub3JtYWxpemVQcmVzZXRTZXQoc2V0KTtcbiAgICAgICAgICB0aGlzLnByZXNldFNldCQubmV4dCh0aGlzLnByZXNldFNldCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmVzZXRzTG9hZGVkID0gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4geyB0aGlzLnByZXNldHNMb2FkZWQgPSB0cnVlOyB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVQcmVzZXRTZXQoc2V0OiBQcmVzZXRTZXQpOiBQcmVzZXRTZXQge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gZGVmYXVsdFByZXNldFNldCgpO1xuICAgIC8vIENsb25lIHRoZSBuZXN0ZWQgYXJyYXlzL29iamVjdHMgc28gb3V0c2lkZSBjYWxsZXJzIGNhbid0IG11dGF0ZSB0aGUgc3RvcmUnc1xuICAgIC8vIGludGVybmFsIHN0YXRlIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCBzZXRQcmVzZXRTZXQoKS91cHNlcnRDbGFzcygpLlxuICAgIHJldHVybiB7XG4gICAgICBjbGFzc2VzOiBBcnJheS5pc0FycmF5KHNldC5jbGFzc2VzKSA/IHNldC5jbGFzc2VzLm1hcCgoYykgPT4gKHsgLi4uYyB9KSkgOiBbXSxcbiAgICAgIGZhbGxiYWNrUGFsZXR0ZTpcbiAgICAgICAgQXJyYXkuaXNBcnJheShzZXQuZmFsbGJhY2tQYWxldHRlKSAmJiBzZXQuZmFsbGJhY2tQYWxldHRlLmxlbmd0aFxuICAgICAgICAgID8gWy4uLnNldC5mYWxsYmFja1BhbGV0dGVdXG4gICAgICAgICAgOiBkZWZhdWx0cy5mYWxsYmFja1BhbGV0dGUsXG4gICAgICBhdXRvUHJvbW90ZTogISFzZXQuYXV0b1Byb21vdGUsXG4gICAgICBtYXRjaE1vZGU6IHNldC5tYXRjaE1vZGUgPT09ICdub3JtYWxpemVkJyA/ICdub3JtYWxpemVkJyA6ICdleGFjdCcsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBRdWV1ZSBhIGRlYm91bmNlZCBzYXZlLiBOby1vcHMgdW50aWwgdGhlIGluaXRpYWwgbG9hZCByZXNvbHZlcyAoYW5kIHdoZW4gbm8gcG9ydCBpcyBib3VuZCkuICovXG4gIHByaXZhdGUgcXVldWVQcmVzZXRTYXZlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByZXNldHNMb2FkZWQpIHRoaXMuc2F2ZVByZXNldHMkLm5leHQoKTtcbiAgfVxuXG4gIC8qKiBQZXJzaXN0IHRoZSBjdXJyZW50IHByZXNldCBzZXQgaW1tZWRpYXRlbHksIGJ5cGFzc2luZyB0aGUgaW5jcmVtZW50YWwtZWRpdFxuICAgKiAgZGVib3VuY2UuIFVzZWQgZm9yIGV4cGxpY2l0IGJ1bGsgYWN0aW9ucyAoQXBwbHkgLyBJbXBvcnQgLyBSZXNldCkuICovXG4gIHByaXZhdGUgc2F2ZVByZXNldHNOb3coKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJlc2V0c0xvYWRlZCkge1xuICAgICAgdGhpcy5wcmVmc1BvcnQ/LnNhdmVQcmVzZXRTZXQodGhpcy5wcmVzZXRTZXQpLnN1YnNjcmliZSh7IGVycm9yOiAoKSA9PiB7IC8qIGtlZXAgbG9jYWwgY29weSAqLyB9IH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgYXZhaWxhYmxlIGNvbG9ybWFwIG9wdGlvbnMgKHRyZWUgZm9yIHRoZSBMVVQgZHJvcGRvd24pLiAqL1xuICBnZXRDb2xvcm1hcE9wdGlvbnMoKTogYW55IHtcbiAgICByZXR1cm4gQ09MT1JNQVBfT1BUSU9OUztcbiAgfVxuXG4gIGdldENvbG9ybWFwKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuY29sb3JtYXAkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIC8qKiBTeW5jaHJvbm91cyBjdXJyZW50IHZhbHVlIOKAlCBmb3IgcmVuZGVyIHBhdGhzIHRoYXQgcmVhZCBpdCB3aGlsZSBidWlsZGluZ1xuICAgKiAgYSBmcmFtZSAoZS5nLiBQbG90bHkncyBjb2xvcnNjYWxlKSByYXRoZXIgdGhhbiBzdWJzY3JpYmluZy4gKi9cbiAgY3VycmVudENvbG9ybWFwKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuY29sb3JtYXAkLnZhbHVlO1xuICB9XG4gIHNldENvbG9ybWFwKGNvbG9ybWFwOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmNvbG9ybWFwJC5uZXh0KGNvbG9ybWFwKTtcbiAgfVxuXG4gIGdldFJldmVyc2VTY2FsZSgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5yZXZlcnNlU2NhbGUkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGN1cnJlbnRSZXZlcnNlU2NhbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmV2ZXJzZVNjYWxlJC52YWx1ZTtcbiAgfVxuICBzZXRSZXZlcnNlU2NhbGUocmV2ZXJzZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucmV2ZXJzZVNjYWxlJC5uZXh0KHJldmVyc2UpO1xuICB9XG5cbiAgZ2V0SW1hZ2VNZXRhKCk6IE9ic2VydmFibGU8SUltYWdlTWV0YWRhdGFbXT4ge1xuICAgIHJldHVybiB0aGlzLmltYWdlTWV0YSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogUGF0Y2ggdGhlIHBoeXNpY2FsIHBpeGVsIHNpemUgKMK1bS9waXhlbCkgb250byB0aGUgY3VycmVudCBpbWFnZSBtZXRhIGFuZFxuICAgKiByZS1lbWl0LCB3aXRob3V0IHRvdWNoaW5nIHRoZSBkZXJpdmVkIGNoYW5uZWxzLiBUaGUgT1NEIHRpbGUgZGVzY3JpcHRvclxuICAgKiAoZnJvbSB0aGUgc2VydmVyJ3MgQmlvLUZvcm1hdHMgYC90aWxlcy9pbmZvYCkgaXMgYXV0aG9yaXRhdGl2ZSBmb3Igc2NhbGVkXG4gICAqIGltYWdlcyDigJQgYGltYWdlSW5mby5pbWFnZU1ldGFgIG9mdGVuIGNhcnJpZXMgbm8gbXBwIOKAlCBzbyB0aGUgcmVuZGVyZXIgZmVlZHNcbiAgICogaXQgaGVyZSBvbmNlIHRoZSBkZXNjcmlwdG9yIGxvYWRzLCBsZXR0aW5nIGFyZWEvc2NhbGUgY29uc3VtZXJzICh0aGUgUmVnaW9uXG4gICAqIEVkaXRvcikgc2hvdyDCtW3Csi9tbcKyIGluc3RlYWQgb2YgcHjCsi4gTm8tb3Agd2hlbiBuZWl0aGVyIGF4aXMgaXMgcG9zaXRpdmUuXG4gICAqL1xuICBzZXRQaHlzaWNhbFBpeGVsU2l6ZShtcHBYPzogbnVtYmVyLCBtcHBZPzogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgaGFzWCA9IChtcHBYID8/IDApID4gMCwgaGFzWSA9IChtcHBZID8/IDApID4gMDtcbiAgICBpZiAoIWhhc1ggJiYgIWhhc1kpIHJldHVybjtcbiAgICBjb25zdCBjdXIgPSB0aGlzLmltYWdlTWV0YSQudmFsdWU7XG4gICAgY29uc3QgbWV0YSA9IChjdXIgJiYgY3VyLmxlbmd0aCA/IGN1ciA6IFt7fSBhcyBJSW1hZ2VNZXRhZGF0YV0pLm1hcCgoZSkgPT4gKHsgLi4uZSB9KSk7XG4gICAgaWYgKGhhc1gpIG1ldGFbMF0ubXBwWCA9IG1wcFg7XG4gICAgaWYgKGhhc1kpIG1ldGFbMF0ubXBwWSA9IG1wcFk7XG4gICAgdGhpcy5pbWFnZU1ldGEkLm5leHQobWV0YSk7XG4gIH1cbiAgc2V0SW1hZ2VNZXRhKGltYWdlTWV0YTogSUltYWdlTWV0YWRhdGFbXSk6IHZvaWQge1xuICAgIHRoaXMuaW1hZ2VNZXRhJC5uZXh0KGltYWdlTWV0YSk7XG4gICAgLy8gUmUtZGVyaXZlIGNoYW5uZWxzIG9ubHkgd2hlbiB0aGVpciBzdHJ1Y3R1cmUgY2hhbmdlcyAoY291bnQpLCBzbyBhIHJlLXBsb3RcbiAgICAvLyBvZiB0aGUgc2FtZSBpbWFnZSBkb2Vzbid0IGNsb2JiZXIgdGhlIHVzZXIncyB3aW5kb3cvZ2FtbWEgZWRpdHMuXG4gICAgY29uc3QgbmV4dCA9IHRoaXMuZGVyaXZlQ2hhbm5lbHMoaW1hZ2VNZXRhKTtcbiAgICAvLyBBbHdheXMgcmVmcmVzaCB0aGUgcmVzZXQgYmFzZWxpbmUgdG8gdGhlIGN1cnJlbnQgaW1hZ2UncyBkZXJpdmVkIGRlZmF1bHRzXG4gICAgLy8gKG5hbWVzL2NvbG91cnMgY2FuIGRpZmZlciBldmVuIGF0IHRoZSBzYW1lIGNoYW5uZWwgY291bnQpLlxuICAgIHRoaXMuZGVmYXVsdENoYW5uZWxTdGF0ZXMgPSBuZXh0Lm1hcCgoYykgPT4gKHsgLi4uYyB9KSk7XG4gICAgaWYgKG5leHQubGVuZ3RoICE9PSB0aGlzLmNoYW5uZWxTdGF0ZXMkLnZhbHVlLmxlbmd0aCkge1xuICAgICAgdGhpcy5jaGFubmVsU3RhdGVzJC5uZXh0KG5leHQpO1xuICAgICAgdGhpcy5zZWxlY3RlZENoYW5uZWwkLm5leHQoMCk7IC8vIG5ldyBjaGFubmVsIHN0cnVjdHVyZSDihpIgcmVzZXQgdGhlIHNlbGVjdGVkIGJhbmRcbiAgICB9XG4gIH1cblxuICAvKiogQ2hhbm5lbHMgZm9yIGFuIGltYWdlOlxuICAgKiAgIC0gUkdCIChyZ2JDaGFubmVscyDiiaUgMykg4oaSIFJlZC9HcmVlbi9CbHVlO1xuICAgKiAgIC0gbXVsdGljaGFubmVsIGZsdW9yZXNjZW5jZSAoY2hhbm5lbENvdW50ID4gMSkg4oaSIG9uZSBjaGFubmVsIHBlciBiYW5kLFxuICAgKiAgICAgbmFtZWQvdGludGVkIGZyb20gdGhlIHNlcnZlciBgY2hhbm5lbEluZm9gIHdoZW4gcHJlc2VudCwgZWxzZSBhIHBhbGV0dGU7XG4gICAqICAgLSBvdGhlcndpc2UgYSBzaW5nbGUgZ3JheXNjYWxlIFwiSW50ZW5zaXR5XCIgY2hhbm5lbC4gKi9cbiAgcHJpdmF0ZSBkZXJpdmVDaGFubmVscyhtZXRhOiBJSW1hZ2VNZXRhZGF0YVtdKTogSUNoYW5uZWxTdGF0ZVtdIHtcbiAgICBjb25zdCBiYXNlID0geyBtaW46IDAsIG1heDogMjU1LCBnYW1tYTogMSwgdmlzaWJsZTogdHJ1ZSB9O1xuICAgIGNvbnN0IG0gPSBtZXRhPy5bMF07XG4gICAgaWYgKChtPy5yZ2JDaGFubmVscyA/PyAxKSA+PSAzKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB7IGluZGV4OiAwLCBuYW1lOiAnUmVkJywgY29sb3I6ICcjZmYwMDAwJywgLi4uYmFzZSB9LFxuICAgICAgICB7IGluZGV4OiAxLCBuYW1lOiAnR3JlZW4nLCBjb2xvcjogJyMwMGZmMDAnLCAuLi5iYXNlIH0sXG4gICAgICAgIHsgaW5kZXg6IDIsIG5hbWU6ICdCbHVlJywgY29sb3I6ICcjMDAwMGZmJywgLi4uYmFzZSB9LFxuICAgICAgXTtcbiAgICB9XG4gICAgY29uc3QgY291bnQgPSBtPy5jaGFubmVsQ291bnQgPz8gMTtcbiAgICBpZiAoY291bnQgPiAxKSB7XG4gICAgICBjb25zdCBpbmZvID0gbT8uY2hhbm5lbEluZm87XG4gICAgICAvLyBGYWxsYmFjayB0aW50cyAoRmlqaS1pc2gpIHdoZW4gdGhlIHNlcnZlciBkb2Vzbid0IHN1cHBseSBhIGNvbG9yLlxuICAgICAgY29uc3QgcGFsZXR0ZSA9IFsnI2ZmMDAwMCcsICcjMDBmZjAwJywgJyMwMDAwZmYnLCAnI2ZmZmZmZicsICcjMDBmZmZmJywgJyNmZjAwZmYnLCAnI2ZmZmYwMCddO1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IGNvdW50IH0sIChfLCBpKSA9PiAoe1xuICAgICAgICBpbmRleDogaSxcbiAgICAgICAgbmFtZTogaW5mbz8uW2ldPy5uYW1lIHx8IGBDaGFubmVsICR7aSArIDF9YCxcbiAgICAgICAgY29sb3I6IGluZm8/LltpXT8uY29sb3IgfHwgcGFsZXR0ZVtpICUgcGFsZXR0ZS5sZW5ndGhdLFxuICAgICAgICAuLi5iYXNlLFxuICAgICAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4gW3sgaW5kZXg6IDAsIG5hbWU6ICdJbnRlbnNpdHknLCBjb2xvcjogJyNmZmZmZmYnLCAuLi5iYXNlIH1dO1xuICB9XG5cbiAgLy8g4pSA4pSAIENoYW5uZWxzICYgaGlzdG9ncmFtIHN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBnZXRDaGFubmVsU3RhdGVzKCk6IE9ic2VydmFibGU8SUNoYW5uZWxTdGF0ZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbm5lbFN0YXRlcyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgY3VycmVudENoYW5uZWxTdGF0ZXMoKTogSUNoYW5uZWxTdGF0ZVtdIHtcbiAgICByZXR1cm4gdGhpcy5jaGFubmVsU3RhdGVzJC52YWx1ZTtcbiAgfVxuICAvKiogVGhlIGNoYW5uZWwgc2VsZWN0ZWQgaW4gdGhlIHBhbmUgKGRyaXZlcyBhIHNpbmdsZS1zY2FsYXIgM0QgU3VyZmFjZSkuICovXG4gIGdldFNlbGVjdGVkQ2hhbm5lbCgpOiBPYnNlcnZhYmxlPG51bWJlcj4geyByZXR1cm4gdGhpcy5zZWxlY3RlZENoYW5uZWwkLmFzT2JzZXJ2YWJsZSgpOyB9XG4gIGN1cnJlbnRTZWxlY3RlZENoYW5uZWwoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuc2VsZWN0ZWRDaGFubmVsJC52YWx1ZTsgfVxuICBzZXRTZWxlY3RlZENoYW5uZWwoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkQ2hhbm5lbCQudmFsdWUgIT09IGluZGV4KSB0aGlzLnNlbGVjdGVkQ2hhbm5lbCQubmV4dChpbmRleCk7XG4gIH1cbiAgLyoqIFBhdGNoIG9uZSBjaGFubmVsIGJ5IGluZGV4IChpbW11dGFibGUgdXBkYXRlKS4gKi9cbiAgc2V0Q2hhbm5lbFN0YXRlKGluZGV4OiBudW1iZXIsIHBhcnRpYWw6IFBhcnRpYWw8SUNoYW5uZWxTdGF0ZT4pOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5jaGFubmVsU3RhdGVzJC52YWx1ZS5tYXAoKGMpID0+XG4gICAgICBjLmluZGV4ID09PSBpbmRleCA/IHsgLi4uYywgLi4ucGFydGlhbCwgaW5kZXg6IGMuaW5kZXggfSA6IGMsXG4gICAgKTtcbiAgICB0aGlzLmNoYW5uZWxTdGF0ZXMkLm5leHQobmV4dCk7XG4gIH1cbiAgLyoqIFJlcGxhY2UgYWxsIGNoYW5uZWwgc3RhdGVzICh1c2VkIGJ5IGF1dG8vcmVzZXQpLiAqL1xuICBzZXRDaGFubmVsU3RhdGVzKHN0YXRlczogSUNoYW5uZWxTdGF0ZVtdKTogdm9pZCB7XG4gICAgdGhpcy5jaGFubmVsU3RhdGVzJC5uZXh0KHN0YXRlcyk7XG4gIH1cbiAgLyoqIFJlc2V0IG9uZSBjaGFubmVsJ3MgZGlzcGxheSB3aW5kb3csIGdhbW1hIEFORCBjb2xvdXIgdG8gdGhlIHZhbHVlcyBkZXJpdmVkXG4gICAqICBmb3IgdGhlIGN1cnJlbnQgaW1hZ2UgKGZ1bGwgMC4uMjU1IHJhbmdlLCBnYW1tYSAxLCB0aGUgY2hhbm5lbCdzIGRlZmF1bHRcbiAgICogIHRpbnQpLiBGYWxscyBiYWNrIHRvIG5ldXRyYWwgZGVmYXVsdHMgaWYgbm8gYmFzZWxpbmUgd2FzIGNhcHR1cmVkLiAqL1xuICByZXNldENoYW5uZWxTdGF0ZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZGVmID0gdGhpcy5kZWZhdWx0Q2hhbm5lbFN0YXRlcy5maW5kKChjKSA9PiBjLmluZGV4ID09PSBpbmRleCk7XG4gICAgdGhpcy5zZXRDaGFubmVsU3RhdGUoaW5kZXgsIHtcbiAgICAgIG1pbjogZGVmPy5taW4gPz8gMCxcbiAgICAgIG1heDogZGVmPy5tYXggPz8gMjU1LFxuICAgICAgZ2FtbWE6IGRlZj8uZ2FtbWEgPz8gMSxcbiAgICAgIGNvbG9yOiBkZWY/LmNvbG9yID8/ICcjZmZmZmZmJyxcbiAgICB9KTtcbiAgfVxuXG4gIGdldEdyYXlzY2FsZSgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5ncmF5c2NhbGUkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGN1cnJlbnRHcmF5c2NhbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JheXNjYWxlJC52YWx1ZTtcbiAgfVxuICBzZXRHcmF5c2NhbGUob246IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmdyYXlzY2FsZSQubmV4dChvbik7XG4gIH1cblxuICBnZXRJbnZlcnQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuaW52ZXJ0JC5hc09ic2VydmFibGUoKTtcbiAgfVxuICBjdXJyZW50SW52ZXJ0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmludmVydCQudmFsdWU7XG4gIH1cbiAgc2V0SW52ZXJ0KG9uOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pbnZlcnQkLm5leHQob24pO1xuICB9XG5cbiAgLyoqIE5hbWXihpJjb2xvdXIgdmlldyBvZiB0aGUgY3VycmVudCBwcmVzZXQgc2V0IChjb21wYXQgZm9yIGJhY2tlbmQgcmVuZGVyZXJzXG4gICAqICB0aGF0IHN0aWxsIHJlYWQgYSBNYXApLiAqL1xuICBnZXRDbGFzc2lmaWNhdGlvbkNvbG9ycygpOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IE1hcCh0aGlzLnByZXNldFNldC5jbGFzc2VzLm1hcCgoYykgPT4gW2MubmFtZSwgYy5jb2xvcl0pKTtcbiAgfVxuICAvKiogVXBzZXJ0IGEgc2luZ2xlIGNsYXNzIGNvbG91ciAodXNlZCBieSB0aGUgZWRpdG9yJ3MgcGVyLWNsYXNzIGNvbG91ciBwaWNrZXIpLiAqL1xuICBzZXRDbGFzc2lmaWNhdGlvbkNvbG9yKGxhYmVsOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnVwc2VydENsYXNzKHsgbmFtZTogbGFiZWwsIGNvbG9yIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIEFubm90YXRpb24tY2xhc3MgcHJlc2V0IHNldCBhY2Nlc3NvcnMgKGppdC11aSM3MCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGdldFByZXNldFNldCgpOiBQcmVzZXRTZXQge1xuICAgIC8vIERlZmVuc2l2ZSBjb3B5OiBjYWxsZXJzIG11c3Qgbm90IG11dGF0ZSB0aGUgc3RvcmUncyBzdGF0ZSBpbiBwbGFjZSDigJRcbiAgICAvLyBhbGwgY2hhbmdlcyBnbyB0aHJvdWdoIHNldFByZXNldFNldCgpL3Vwc2VydENsYXNzKCkvcmVtb3ZlQ2xhc3MoKSBzb1xuICAgIC8vIHByZXNldFNldCQgYW5kIHBlcnNpc3RlbmNlIHN0YXkgaW4gc3luYy5cbiAgICByZXR1cm4ge1xuICAgICAgY2xhc3NlczogdGhpcy5wcmVzZXRTZXQuY2xhc3Nlcy5tYXAoKGMpID0+ICh7IC4uLmMgfSkpLFxuICAgICAgZmFsbGJhY2tQYWxldHRlOiBbLi4udGhpcy5wcmVzZXRTZXQuZmFsbGJhY2tQYWxldHRlXSxcbiAgICAgIGF1dG9Qcm9tb3RlOiB0aGlzLnByZXNldFNldC5hdXRvUHJvbW90ZSxcbiAgICAgIG1hdGNoTW9kZTogdGhpcy5wcmVzZXRTZXQubWF0Y2hNb2RlLFxuICAgIH07XG4gIH1cbiAgZ2V0UHJlc2V0U2V0JCgpOiBPYnNlcnZhYmxlPFByZXNldFNldD4ge1xuICAgIHJldHVybiB0aGlzLnByZXNldFNldCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgc2V0UHJlc2V0U2V0KHNldDogUHJlc2V0U2V0KTogdm9pZCB7XG4gICAgdGhpcy5wcmVzZXRTZXQgPSB0aGlzLm5vcm1hbGl6ZVByZXNldFNldChzZXQpO1xuICAgIHRoaXMucHJlc2V0U2V0JC5uZXh0KHRoaXMucHJlc2V0U2V0KTtcbiAgICB0aGlzLnNhdmVQcmVzZXRzTm93KCk7IC8vIGV4cGxpY2l0IGJ1bGsgYXBwbHkvaW1wb3J0IOKGkiBwZXJzaXN0IGltbWVkaWF0ZWx5XG4gIH1cbiAgLyoqIEFkZCBvciB1cGRhdGUgYSBjbGFzcyAoa2V5ZWQgYnkgZXhhY3Qgc3RvcmVkIGBuYW1lYCkuICovXG4gIHVwc2VydENsYXNzKHByZXNldDogQ2xhc3NQcmVzZXQpOiB2b2lkIHtcbiAgICBjb25zdCBjbGFzc2VzID0gWy4uLnRoaXMucHJlc2V0U2V0LmNsYXNzZXNdO1xuICAgIGNvbnN0IGkgPSBjbGFzc2VzLmZpbmRJbmRleCgoYykgPT4gYy5uYW1lID09PSBwcmVzZXQubmFtZSk7XG4gICAgaWYgKGkgPj0gMCkgY2xhc3Nlc1tpXSA9IHsgLi4uY2xhc3Nlc1tpXSwgLi4ucHJlc2V0IH07XG4gICAgZWxzZSBjbGFzc2VzLnB1c2goeyAuLi5wcmVzZXQgfSk7XG4gICAgdGhpcy5wcmVzZXRTZXQgPSB7IC4uLnRoaXMucHJlc2V0U2V0LCBjbGFzc2VzIH07XG4gICAgdGhpcy5wcmVzZXRTZXQkLm5leHQodGhpcy5wcmVzZXRTZXQpO1xuICAgIHRoaXMucXVldWVQcmVzZXRTYXZlKCk7XG4gIH1cbiAgcmVtb3ZlQ2xhc3MobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wcmVzZXRTZXQgPSB7IC4uLnRoaXMucHJlc2V0U2V0LCBjbGFzc2VzOiB0aGlzLnByZXNldFNldC5jbGFzc2VzLmZpbHRlcigoYykgPT4gYy5uYW1lICE9PSBuYW1lKSB9O1xuICAgIHRoaXMucHJlc2V0U2V0JC5uZXh0KHRoaXMucHJlc2V0U2V0KTtcbiAgICB0aGlzLnF1ZXVlUHJlc2V0U2F2ZSgpO1xuICB9XG4gIHJlc2V0UHJlc2V0cygpOiB2b2lkIHtcbiAgICB0aGlzLnByZXNldFNldCA9IGRlZmF1bHRQcmVzZXRTZXQoKTtcbiAgICB0aGlzLnByZXNldFNldCQubmV4dCh0aGlzLnByZXNldFNldCk7XG4gICAgdGhpcy5zYXZlUHJlc2V0c05vdygpOyAvLyBleHBsaWNpdCByZXNldCDihpIgcGVyc2lzdCBpbW1lZGlhdGVseVxuICB9XG4gIC8qKiBGb3JjZSBhIChkZWJvdW5jZWQpIHdyaXRlLWJhY2sgb2YgdGhlIGN1cnJlbnQgcHJlc2V0IHNldC4gKi9cbiAgcGVyc2lzdFByZXNldHMoKTogdm9pZCB7XG4gICAgdGhpcy5xdWV1ZVByZXNldFNhdmUoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBzcGF0aWFsLW9taWNzIHZpZXcgc3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGdldFNwYXRpYWxWaWV3JCgpOiBPYnNlcnZhYmxlPFNwYXRpYWxWaWV3U3RhdGU+IHtcbiAgICByZXR1cm4gdGhpcy5zcGF0aWFsVmlldyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKiogU3luY2hyb25vdXMgcmVhZCwgZm9yIGEgcmVuZGVyZXIgYnVpbGRpbmcgaXRzIGZpcnN0IGZyYW1lLiAqL1xuICBjdXJyZW50U3BhdGlhbFZpZXcoKTogU3BhdGlhbFZpZXdTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuc3BhdGlhbFZpZXckLnZhbHVlO1xuICB9XG5cbiAgLyoqIFBhdGNoIHRoZSBzcGF0aWFsIHZpZXcgc3RhdGU7IGVtaXRzIG9uY2Ugd2l0aCB0aGUgbWVyZ2VkIHZhbHVlLiAqL1xuICBzZXRTcGF0aWFsVmlldyhwYXJ0aWFsOiBQYXJ0aWFsPFNwYXRpYWxWaWV3U3RhdGU+KTogdm9pZCB7XG4gICAgdGhpcy5zcGF0aWFsVmlldyQubmV4dCh7IC4uLnRoaXMuc3BhdGlhbFZpZXckLnZhbHVlLCAuLi5wYXJ0aWFsIH0pO1xuICB9XG5cbiAgLyoqIFJlc2V0IHRvIGRlZmF1bHRzIOKAlCBlLmcuIHdoZW4gYSBkaWZmZXJlbnQgZGF0YXNldCBpcyBzZWxlY3RlZCwgd2hlcmUgdGhlXG4gICAqICBwcmV2aW91cyBjb2xvdXIgY29sdW1uIGFsbW9zdCBjZXJ0YWlubHkgZG9lcyBub3QgZXhpc3QuICovXG4gIHJlc2V0U3BhdGlhbFZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5zcGF0aWFsVmlldyQubmV4dCh7IC4uLkRFRkFVTFRfU1BBVElBTF9WSUVXIH0pO1xuICB9XG5cbiAgZ2V0QWN0aXZlVG9vbCQoKTogT2JzZXJ2YWJsZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlVG9vbCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgZ2V0QWN0aXZlVG9vbCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVUb29sJC52YWx1ZTtcbiAgfVxuICBzZXRBY3RpdmVUb29sKHRvb2w6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZVRvb2wkLm5leHQodG9vbCk7XG4gIH1cbn1cbiJdfQ==
@@ -2,7 +2,7 @@ import { Injectable } from '@angular/core';
2
2
  import { getOrtWasmBase } from './ort-runtime-config';
3
3
  import * as i0 from "@angular/core";
4
4
  /** Hosted cellpose-SAM ONNX (CPSAM, fp16). Override via {@link setModelUrl}. */
5
- const DEFAULT_MODEL_URL = 'https://huggingface.co/ballon999/cellpose-sam-onnx/resolve/main/cpsam_fp16.onnx';
5
+ const DEFAULT_MODEL_URL = 'https://huggingface.co/jax-image-tools/cellpose-sam-onnx/resolve/main/cpsam_fp16.onnx';
6
6
  /**
7
7
  * Default in-library {@link ICellSegmenter} backed by cellpose-js (WebGPU/WASM
8
8
  * ONNX) — so the toolbar's automatic **Cellpose** tool works out of the box in
@@ -82,4 +82,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
82
82
  type: Injectable,
83
83
  args: [{ providedIn: 'root' }]
84
84
  }] });
85
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VsbHBvc2Utc2VnbWVudGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rvb2xiYXIvc2VnbWVudGF0aW9uL2NlbGxwb3NlLXNlZ21lbnRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDOztBQUt0RCxnRkFBZ0Y7QUFDaEYsTUFBTSxpQkFBaUIsR0FDckIsaUZBQWlGLENBQUM7QUFFcEY7Ozs7Ozs7Ozs7OztHQVlHO0FBRUgsTUFBTSxPQUFPLHdCQUF3QjtJQURyQztRQUVVLGFBQVEsR0FBb0IsSUFBSSxDQUFDO1FBQ2pDLFlBQU8sR0FBNkIsSUFBSSxDQUFDO1FBQ3pDLGFBQVEsR0FBRyxpQkFBaUIsQ0FBQztLQXNFdEM7SUFwRUMsK0VBQStFO0lBQy9FLFdBQVcsQ0FBQyxHQUFXO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWSxDQUNoQixLQUFpRSxFQUNqRSxRQUE4QjtRQUU5QixJQUFJLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUM5QixNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQzVCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2hCLElBQUksS0FBSztnQkFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDO1lBQ2xELElBQUksTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3JDLGlCQUFpQixHQUFHLElBQUksQ0FBQztnQkFDekIsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLGlDQUFpQyxDQUFDLENBQUM7WUFDMUQsQ0FBQztRQUNILENBQUMsRUFDRCxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUN6QyxDQUFDO1FBQ0YsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDN0MsTUFBTSxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUMxQixFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFDM0U7WUFDRSwwRUFBMEU7WUFDMUUseUVBQXlFO1lBQ3pFLDBDQUEwQztZQUMxQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQ25ELElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixJQUFJLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLDBCQUEwQixDQUN6RjtTQUNGLENBQ0YsQ0FBQztRQUNGLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3ZGLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxRQUFRLENBQ04sVUFBMkQsRUFDM0QsUUFBbUM7UUFFbkMsSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQ3pCLHNFQUFzRTtnQkFDdEUsTUFBTSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDL0QsWUFBWSxDQUFDLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDOUMsTUFBTSxFQUFFLEdBQUcsTUFBTSxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7b0JBQ3RELE9BQU8sRUFBRSxJQUFJO29CQUNiLFVBQVUsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDO29CQUM5RCxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDL0IsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO2dCQUNuQixPQUFPLEVBQUUsQ0FBQztZQUNaLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCx5REFBeUQ7SUFDekQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUM7SUFDaEMsQ0FBQzs4R0F4RVUsd0JBQXdCO2tIQUF4Qix3QkFBd0IsY0FEWCxNQUFNOzsyRkFDbkIsd0JBQXdCO2tCQURwQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGdldE9ydFdhc21CYXNlIH0gZnJvbSAnLi9vcnQtcnVudGltZS1jb25maWcnO1xuXG5pbXBvcnQgdHlwZSB7IElDZWxsU2VnbWVudGVyLCBDZWxsU2VnbWVudGF0aW9uLCBDZWxsU2VnbWVudFByb2dyZXNzIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NlbGwtc2VnbWVudGVyLmNvbnRyYWN0JztcbmltcG9ydCB0eXBlIHsgQ2VsbHBvc2UgfSBmcm9tICdjZWxscG9zZS1qcyc7XG5cbi8qKiBIb3N0ZWQgY2VsbHBvc2UtU0FNIE9OTlggKENQU0FNLCBmcDE2KS4gT3ZlcnJpZGUgdmlhIHtAbGluayBzZXRNb2RlbFVybH0uICovXG5jb25zdCBERUZBVUxUX01PREVMX1VSTCA9XG4gICdodHRwczovL2h1Z2dpbmdmYWNlLmNvL2JhbGxvbjk5OS9jZWxscG9zZS1zYW0tb25ueC9yZXNvbHZlL21haW4vY3BzYW1fZnAxNi5vbm54JztcblxuLyoqXG4gKiBEZWZhdWx0IGluLWxpYnJhcnkge0BsaW5rIElDZWxsU2VnbWVudGVyfSBiYWNrZWQgYnkgY2VsbHBvc2UtanMgKFdlYkdQVS9XQVNNXG4gKiBPTk5YKSDigJQgc28gdGhlIHRvb2xiYXIncyBhdXRvbWF0aWMgKipDZWxscG9zZSoqIHRvb2wgd29ya3Mgb3V0IG9mIHRoZSBib3ggaW5cbiAqIGFueSBhcHAsIHdpdGggbm8gaG9zdCB3aXJpbmcgKGppdC11aSM5MCkuIGBjZWxscG9zZS1qc2AgaXMgYSByZWd1bGFyXG4gKiBkZXBlbmRlbmN5IOKAlCBpbnN0YWxsZWQgYXV0b21hdGljYWxseSwgbGlrZSBgbmFwYXJpLWpzYCDigJQgYnV0IGl0IGlzXG4gKiAqKmxhenktaW1wb3J0ZWQqKiBvbiBmaXJzdCB1c2UsIHNvIGFwcHMgdGhhdCBuZXZlciBydW4gQ2VsbHBvc2UgcGF5IG5vdGhpbmdcbiAqIGZvciBpdCBpbiB0aGUgYnVuZGxlLiBBIGhvc3QgY2FuIHN0aWxsIG92ZXJyaWRlIHRoZSB7QGxpbmsgQ0VMTF9TRUdNRU5URVJ9XG4gKiB0b2tlbiB0byBzdXBwbHkgYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24uXG4gKlxuICogT3ducyBhIHNpbmdsZSBzaGFyZWQge0BsaW5rIENlbGxwb3NlfSBpbnN0YW5jZSAob25lIG1vZGVsIGxvYWQsIG9uZSBXZWJHUFVcbiAqIHNlc3Npb24sIG9uZSB3b3JrZXIpLiB7QGxpbmsgZ2V0TW9kZWx9IGV4cG9zZXMgdGhhdCBpbnN0YW5jZSBzbyBhIGhvc3Qnc1xuICogcHJvY2Vzc2luZyBwaXBlbGluZSBjYW4gcmV1c2UgaXQgaW5zdGVhZCBvZiBsb2FkaW5nIHRoZSB+NTg4IE1CIG1vZGVsIHR3aWNlLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIENlbGxwb3NlU2VnbWVudGVyU2VydmljZSBpbXBsZW1lbnRzIElDZWxsU2VnbWVudGVyIHtcbiAgcHJpdmF0ZSBpbnN0YW5jZTogQ2VsbHBvc2UgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsb2FkaW5nOiBQcm9taXNlPENlbGxwb3NlPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1vZGVsVXJsID0gREVGQVVMVF9NT0RFTF9VUkw7XG5cbiAgLyoqIFBvaW50IHRoZSBzZWdtZW50ZXIgYXQgYSBkaWZmZXJlbnQgaG9zdGVkIENQU0FNIE9OTlggKGJlZm9yZSBmaXJzdCB1c2UpLiAqL1xuICBzZXRNb2RlbFVybCh1cmw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubW9kZWxVcmwgPSB1cmw7XG4gIH1cblxuICBhc3luYyBzZWdtZW50Q2VsbHMoXG4gICAgaW1hZ2U6IHsgZGF0YTogVWludDhDbGFtcGVkQXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0sXG4gICAgcHJvZ3Jlc3M/OiBDZWxsU2VnbWVudFByb2dyZXNzLFxuICApOiBQcm9taXNlPENlbGxTZWdtZW50YXRpb24+IHtcbiAgICBsZXQgYW5ub3VuY2VkRG93bmxvYWQgPSBmYWxzZTtcbiAgICBjb25zdCBjcCA9IGF3YWl0IHRoaXMuZ2V0TW9kZWwoXG4gICAgICAobG9hZGVkLCB0b3RhbCkgPT4ge1xuICAgICAgICBpZiAodG90YWwpIHByb2dyZXNzPy5vblByb2dyZXNzPy4obG9hZGVkIC8gdG90YWwpO1xuICAgICAgICBpZiAobG9hZGVkID4gMCAmJiAhYW5ub3VuY2VkRG93bmxvYWQpIHtcbiAgICAgICAgICBhbm5vdW5jZWREb3dubG9hZCA9IHRydWU7XG4gICAgICAgICAgcHJvZ3Jlc3M/Lm9uU3RhdHVzPy4oJ0Rvd25sb2FkaW5nIENlbGxwb3NlLVNBTSBtb2RlbOKApicpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKHN0YXR1cykgPT4gcHJvZ3Jlc3M/Lm9uU3RhdHVzPy4oc3RhdHVzKSxcbiAgICApO1xuICAgIHByb2dyZXNzPy5vblN0YXR1cz8uKCdQcmVwcm9jZXNzaW5nIGltYWdl4oCmJyk7XG4gICAgY29uc3Qgb3V0ID0gYXdhaXQgY3Auc2VnbWVudChcbiAgICAgIHsgZGF0YTogaW1hZ2UuZGF0YSwgd2lkdGg6IGltYWdlLndpZHRoLCBoZWlnaHQ6IGltYWdlLmhlaWdodCwgY2hhbm5lbHM6IDQgfSxcbiAgICAgIHtcbiAgICAgICAgLy8gY2VsbHBvc2UtanMgcnVucyBpbmZlcmVuY2UgaW4gaXRzIHdvcmtlciAodGhlc2UgZmlyZSBiZXR3ZWVuIHRpbGVzKSBhbmRcbiAgICAgICAgLy8gYXZlcmFnaW5nL2R5bmFtaWNzIG9uIHRoZSBtYWluIHRocmVhZDsgc3VyZmFjZSBib3RoIHNvIHRoZSB0b2FzdCBzaG93c1xuICAgICAgICAvLyByZWFsIHByb2dyZXNzIGluc3RlYWQgb2YgbG9va2luZyBzdHVjay5cbiAgICAgICAgb25UaWxlUHJvZ3Jlc3M6IChkb25lLCB0b3RhbCkgPT4gcHJvZ3Jlc3M/Lm9uU3RhdHVzPy4oXG4gICAgICAgICAgZG9uZSA8IHRvdGFsID8gYFJ1bm5pbmcgaW5mZXJlbmNlICh0aWxlICR7ZG9uZX0vJHt0b3RhbH0p4oCmYCA6ICdDb21wdXRpbmcgZmxvdyBkeW5hbWljc+KApicsXG4gICAgICAgICksXG4gICAgICB9LFxuICAgICk7XG4gICAgcmV0dXJuIHsgbGFiZWxzOiBvdXQubWFza3MsIHdpZHRoOiBvdXQud2lkdGgsIGhlaWdodDogb3V0LmhlaWdodCwgY291bnQ6IG91dC5jb3VudCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzaGFyZWQgQ2VsbHBvc2UgaW5zdGFuY2UsIGxhemlseSBjcmVhdGVkIG9uIGZpcnN0IHVzZSBhbmQgcmV1c2VkXG4gICAqIHRoZXJlYWZ0ZXIgKGRlZHVwZWQgYWNyb3NzIGNvbmN1cnJlbnQgY2FsbGVycykuIEV4cG9zZWQgc28gYSBob3N0IHBpcGVsaW5lXG4gICAqIGVuZ2luZSBjYW4gcnVuIHJpY2hlciBgc2VnbWVudCgpYCBvcHRpb25zIG9uIHRoZSBzYW1lIGluc3RhbmNlLiBgb25Qcm9ncmVzc2BcbiAgICogcmVwb3J0cyByYXcgZG93bmxvYWRlZC90b3RhbCBieXRlcyAoYHRvdGFsYCBpcyBudWxsIHdoZW4gdW5rbm93bik7IGBvblN0YXR1c2BcbiAgICogcmVwb3J0cyB3b3JrZXItaW5pdCBwaGFzZSBzdHJpbmdzLlxuICAgKi9cbiAgZ2V0TW9kZWwoXG4gICAgb25Qcm9ncmVzcz86IChsb2FkZWQ6IG51bWJlciwgdG90YWw6IG51bWJlciB8IG51bGwpID0+IHZvaWQsXG4gICAgb25TdGF0dXM/OiAoc3RhdHVzOiBzdHJpbmcpID0+IHZvaWQsXG4gICk6IFByb21pc2U8Q2VsbHBvc2U+IHtcbiAgICBpZiAodGhpcy5pbnN0YW5jZSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmluc3RhbmNlKTtcbiAgICBpZiAoIXRoaXMubG9hZGluZykge1xuICAgICAgdGhpcy5sb2FkaW5nID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gTGF6eToga2VlcCBjZWxscG9zZS1qcyArIGl0cyBPUlQgcnVudGltZSBvdXQgb2YgdGhlIGluaXRpYWwgYnVuZGxlLlxuICAgICAgICBjb25zdCB7IENlbGxwb3NlLCBjb25maWd1cmVPcnQgfSA9IGF3YWl0IGltcG9ydCgnY2VsbHBvc2UtanMnKTtcbiAgICAgICAgY29uZmlndXJlT3J0KHsgd2FzbVBhdGhzOiBnZXRPcnRXYXNtQmFzZSgpIH0pO1xuICAgICAgICBjb25zdCBjcCA9IGF3YWl0IENlbGxwb3NlLmZyb21QcmV0cmFpbmVkKHRoaXMubW9kZWxVcmwsIHtcbiAgICAgICAgICBwcmVsb2FkOiB0cnVlLFxuICAgICAgICAgIG9uUHJvZ3Jlc3M6ICh7IGxvYWRlZCwgdG90YWwgfSkgPT4gb25Qcm9ncmVzcz8uKGxvYWRlZCwgdG90YWwpLFxuICAgICAgICAgIG9uU3RhdHVzOiAocykgPT4gb25TdGF0dXM/LihzKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UgPSBjcDtcbiAgICAgICAgcmV0dXJuIGNwO1xuICAgICAgfSkoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubG9hZGluZztcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSBzaGFyZWQgbW9kZWwgaXMgYWxyZWFkeSBsb2FkZWQgKHdhcm0pLiAqL1xuICBpc0xvYWRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW5jZSAhPT0gbnVsbDtcbiAgfVxufVxuIl19
85
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VsbHBvc2Utc2VnbWVudGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rvb2xiYXIvc2VnbWVudGF0aW9uL2NlbGxwb3NlLXNlZ21lbnRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDOztBQUt0RCxnRkFBZ0Y7QUFDaEYsTUFBTSxpQkFBaUIsR0FDckIsdUZBQXVGLENBQUM7QUFFMUY7Ozs7Ozs7Ozs7OztHQVlHO0FBRUgsTUFBTSxPQUFPLHdCQUF3QjtJQURyQztRQUVVLGFBQVEsR0FBb0IsSUFBSSxDQUFDO1FBQ2pDLFlBQU8sR0FBNkIsSUFBSSxDQUFDO1FBQ3pDLGFBQVEsR0FBRyxpQkFBaUIsQ0FBQztLQXNFdEM7SUFwRUMsK0VBQStFO0lBQy9FLFdBQVcsQ0FBQyxHQUFXO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWSxDQUNoQixLQUFpRSxFQUNqRSxRQUE4QjtRQUU5QixJQUFJLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUM5QixNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQzVCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2hCLElBQUksS0FBSztnQkFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDO1lBQ2xELElBQUksTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3JDLGlCQUFpQixHQUFHLElBQUksQ0FBQztnQkFDekIsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLGlDQUFpQyxDQUFDLENBQUM7WUFDMUQsQ0FBQztRQUNILENBQUMsRUFDRCxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUN6QyxDQUFDO1FBQ0YsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDN0MsTUFBTSxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUMxQixFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFDM0U7WUFDRSwwRUFBMEU7WUFDMUUseUVBQXlFO1lBQ3pFLDBDQUEwQztZQUMxQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQ25ELElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixJQUFJLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLDBCQUEwQixDQUN6RjtTQUNGLENBQ0YsQ0FBQztRQUNGLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3ZGLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxRQUFRLENBQ04sVUFBMkQsRUFDM0QsUUFBbUM7UUFFbkMsSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQ3pCLHNFQUFzRTtnQkFDdEUsTUFBTSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDL0QsWUFBWSxDQUFDLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDOUMsTUFBTSxFQUFFLEdBQUcsTUFBTSxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7b0JBQ3RELE9BQU8sRUFBRSxJQUFJO29CQUNiLFVBQVUsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDO29CQUM5RCxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDL0IsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO2dCQUNuQixPQUFPLEVBQUUsQ0FBQztZQUNaLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCx5REFBeUQ7SUFDekQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUM7SUFDaEMsQ0FBQzs4R0F4RVUsd0JBQXdCO2tIQUF4Qix3QkFBd0IsY0FEWCxNQUFNOzsyRkFDbkIsd0JBQXdCO2tCQURwQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGdldE9ydFdhc21CYXNlIH0gZnJvbSAnLi9vcnQtcnVudGltZS1jb25maWcnO1xuXG5pbXBvcnQgdHlwZSB7IElDZWxsU2VnbWVudGVyLCBDZWxsU2VnbWVudGF0aW9uLCBDZWxsU2VnbWVudFByb2dyZXNzIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NlbGwtc2VnbWVudGVyLmNvbnRyYWN0JztcbmltcG9ydCB0eXBlIHsgQ2VsbHBvc2UgfSBmcm9tICdjZWxscG9zZS1qcyc7XG5cbi8qKiBIb3N0ZWQgY2VsbHBvc2UtU0FNIE9OTlggKENQU0FNLCBmcDE2KS4gT3ZlcnJpZGUgdmlhIHtAbGluayBzZXRNb2RlbFVybH0uICovXG5jb25zdCBERUZBVUxUX01PREVMX1VSTCA9XG4gICdodHRwczovL2h1Z2dpbmdmYWNlLmNvL2pheC1pbWFnZS10b29scy9jZWxscG9zZS1zYW0tb25ueC9yZXNvbHZlL21haW4vY3BzYW1fZnAxNi5vbm54JztcblxuLyoqXG4gKiBEZWZhdWx0IGluLWxpYnJhcnkge0BsaW5rIElDZWxsU2VnbWVudGVyfSBiYWNrZWQgYnkgY2VsbHBvc2UtanMgKFdlYkdQVS9XQVNNXG4gKiBPTk5YKSDigJQgc28gdGhlIHRvb2xiYXIncyBhdXRvbWF0aWMgKipDZWxscG9zZSoqIHRvb2wgd29ya3Mgb3V0IG9mIHRoZSBib3ggaW5cbiAqIGFueSBhcHAsIHdpdGggbm8gaG9zdCB3aXJpbmcgKGppdC11aSM5MCkuIGBjZWxscG9zZS1qc2AgaXMgYSByZWd1bGFyXG4gKiBkZXBlbmRlbmN5IOKAlCBpbnN0YWxsZWQgYXV0b21hdGljYWxseSwgbGlrZSBgbmFwYXJpLWpzYCDigJQgYnV0IGl0IGlzXG4gKiAqKmxhenktaW1wb3J0ZWQqKiBvbiBmaXJzdCB1c2UsIHNvIGFwcHMgdGhhdCBuZXZlciBydW4gQ2VsbHBvc2UgcGF5IG5vdGhpbmdcbiAqIGZvciBpdCBpbiB0aGUgYnVuZGxlLiBBIGhvc3QgY2FuIHN0aWxsIG92ZXJyaWRlIHRoZSB7QGxpbmsgQ0VMTF9TRUdNRU5URVJ9XG4gKiB0b2tlbiB0byBzdXBwbHkgYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24uXG4gKlxuICogT3ducyBhIHNpbmdsZSBzaGFyZWQge0BsaW5rIENlbGxwb3NlfSBpbnN0YW5jZSAob25lIG1vZGVsIGxvYWQsIG9uZSBXZWJHUFVcbiAqIHNlc3Npb24sIG9uZSB3b3JrZXIpLiB7QGxpbmsgZ2V0TW9kZWx9IGV4cG9zZXMgdGhhdCBpbnN0YW5jZSBzbyBhIGhvc3Qnc1xuICogcHJvY2Vzc2luZyBwaXBlbGluZSBjYW4gcmV1c2UgaXQgaW5zdGVhZCBvZiBsb2FkaW5nIHRoZSB+NTg4IE1CIG1vZGVsIHR3aWNlLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIENlbGxwb3NlU2VnbWVudGVyU2VydmljZSBpbXBsZW1lbnRzIElDZWxsU2VnbWVudGVyIHtcbiAgcHJpdmF0ZSBpbnN0YW5jZTogQ2VsbHBvc2UgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsb2FkaW5nOiBQcm9taXNlPENlbGxwb3NlPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1vZGVsVXJsID0gREVGQVVMVF9NT0RFTF9VUkw7XG5cbiAgLyoqIFBvaW50IHRoZSBzZWdtZW50ZXIgYXQgYSBkaWZmZXJlbnQgaG9zdGVkIENQU0FNIE9OTlggKGJlZm9yZSBmaXJzdCB1c2UpLiAqL1xuICBzZXRNb2RlbFVybCh1cmw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubW9kZWxVcmwgPSB1cmw7XG4gIH1cblxuICBhc3luYyBzZWdtZW50Q2VsbHMoXG4gICAgaW1hZ2U6IHsgZGF0YTogVWludDhDbGFtcGVkQXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0sXG4gICAgcHJvZ3Jlc3M/OiBDZWxsU2VnbWVudFByb2dyZXNzLFxuICApOiBQcm9taXNlPENlbGxTZWdtZW50YXRpb24+IHtcbiAgICBsZXQgYW5ub3VuY2VkRG93bmxvYWQgPSBmYWxzZTtcbiAgICBjb25zdCBjcCA9IGF3YWl0IHRoaXMuZ2V0TW9kZWwoXG4gICAgICAobG9hZGVkLCB0b3RhbCkgPT4ge1xuICAgICAgICBpZiAodG90YWwpIHByb2dyZXNzPy5vblByb2dyZXNzPy4obG9hZGVkIC8gdG90YWwpO1xuICAgICAgICBpZiAobG9hZGVkID4gMCAmJiAhYW5ub3VuY2VkRG93bmxvYWQpIHtcbiAgICAgICAgICBhbm5vdW5jZWREb3dubG9hZCA9IHRydWU7XG4gICAgICAgICAgcHJvZ3Jlc3M/Lm9uU3RhdHVzPy4oJ0Rvd25sb2FkaW5nIENlbGxwb3NlLVNBTSBtb2RlbOKApicpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKHN0YXR1cykgPT4gcHJvZ3Jlc3M/Lm9uU3RhdHVzPy4oc3RhdHVzKSxcbiAgICApO1xuICAgIHByb2dyZXNzPy5vblN0YXR1cz8uKCdQcmVwcm9jZXNzaW5nIGltYWdl4oCmJyk7XG4gICAgY29uc3Qgb3V0ID0gYXdhaXQgY3Auc2VnbWVudChcbiAgICAgIHsgZGF0YTogaW1hZ2UuZGF0YSwgd2lkdGg6IGltYWdlLndpZHRoLCBoZWlnaHQ6IGltYWdlLmhlaWdodCwgY2hhbm5lbHM6IDQgfSxcbiAgICAgIHtcbiAgICAgICAgLy8gY2VsbHBvc2UtanMgcnVucyBpbmZlcmVuY2UgaW4gaXRzIHdvcmtlciAodGhlc2UgZmlyZSBiZXR3ZWVuIHRpbGVzKSBhbmRcbiAgICAgICAgLy8gYXZlcmFnaW5nL2R5bmFtaWNzIG9uIHRoZSBtYWluIHRocmVhZDsgc3VyZmFjZSBib3RoIHNvIHRoZSB0b2FzdCBzaG93c1xuICAgICAgICAvLyByZWFsIHByb2dyZXNzIGluc3RlYWQgb2YgbG9va2luZyBzdHVjay5cbiAgICAgICAgb25UaWxlUHJvZ3Jlc3M6IChkb25lLCB0b3RhbCkgPT4gcHJvZ3Jlc3M/Lm9uU3RhdHVzPy4oXG4gICAgICAgICAgZG9uZSA8IHRvdGFsID8gYFJ1bm5pbmcgaW5mZXJlbmNlICh0aWxlICR7ZG9uZX0vJHt0b3RhbH0p4oCmYCA6ICdDb21wdXRpbmcgZmxvdyBkeW5hbWljc+KApicsXG4gICAgICAgICksXG4gICAgICB9LFxuICAgICk7XG4gICAgcmV0dXJuIHsgbGFiZWxzOiBvdXQubWFza3MsIHdpZHRoOiBvdXQud2lkdGgsIGhlaWdodDogb3V0LmhlaWdodCwgY291bnQ6IG91dC5jb3VudCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzaGFyZWQgQ2VsbHBvc2UgaW5zdGFuY2UsIGxhemlseSBjcmVhdGVkIG9uIGZpcnN0IHVzZSBhbmQgcmV1c2VkXG4gICAqIHRoZXJlYWZ0ZXIgKGRlZHVwZWQgYWNyb3NzIGNvbmN1cnJlbnQgY2FsbGVycykuIEV4cG9zZWQgc28gYSBob3N0IHBpcGVsaW5lXG4gICAqIGVuZ2luZSBjYW4gcnVuIHJpY2hlciBgc2VnbWVudCgpYCBvcHRpb25zIG9uIHRoZSBzYW1lIGluc3RhbmNlLiBgb25Qcm9ncmVzc2BcbiAgICogcmVwb3J0cyByYXcgZG93bmxvYWRlZC90b3RhbCBieXRlcyAoYHRvdGFsYCBpcyBudWxsIHdoZW4gdW5rbm93bik7IGBvblN0YXR1c2BcbiAgICogcmVwb3J0cyB3b3JrZXItaW5pdCBwaGFzZSBzdHJpbmdzLlxuICAgKi9cbiAgZ2V0TW9kZWwoXG4gICAgb25Qcm9ncmVzcz86IChsb2FkZWQ6IG51bWJlciwgdG90YWw6IG51bWJlciB8IG51bGwpID0+IHZvaWQsXG4gICAgb25TdGF0dXM/OiAoc3RhdHVzOiBzdHJpbmcpID0+IHZvaWQsXG4gICk6IFByb21pc2U8Q2VsbHBvc2U+IHtcbiAgICBpZiAodGhpcy5pbnN0YW5jZSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmluc3RhbmNlKTtcbiAgICBpZiAoIXRoaXMubG9hZGluZykge1xuICAgICAgdGhpcy5sb2FkaW5nID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gTGF6eToga2VlcCBjZWxscG9zZS1qcyArIGl0cyBPUlQgcnVudGltZSBvdXQgb2YgdGhlIGluaXRpYWwgYnVuZGxlLlxuICAgICAgICBjb25zdCB7IENlbGxwb3NlLCBjb25maWd1cmVPcnQgfSA9IGF3YWl0IGltcG9ydCgnY2VsbHBvc2UtanMnKTtcbiAgICAgICAgY29uZmlndXJlT3J0KHsgd2FzbVBhdGhzOiBnZXRPcnRXYXNtQmFzZSgpIH0pO1xuICAgICAgICBjb25zdCBjcCA9IGF3YWl0IENlbGxwb3NlLmZyb21QcmV0cmFpbmVkKHRoaXMubW9kZWxVcmwsIHtcbiAgICAgICAgICBwcmVsb2FkOiB0cnVlLFxuICAgICAgICAgIG9uUHJvZ3Jlc3M6ICh7IGxvYWRlZCwgdG90YWwgfSkgPT4gb25Qcm9ncmVzcz8uKGxvYWRlZCwgdG90YWwpLFxuICAgICAgICAgIG9uU3RhdHVzOiAocykgPT4gb25TdGF0dXM/LihzKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UgPSBjcDtcbiAgICAgICAgcmV0dXJuIGNwO1xuICAgICAgfSkoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubG9hZGluZztcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSBzaGFyZWQgbW9kZWwgaXMgYWxyZWFkeSBsb2FkZWQgKHdhcm0pLiAqL1xuICBpc0xvYWRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW5jZSAhPT0gbnVsbDtcbiAgfVxufVxuIl19
@@ -18,8 +18,8 @@ export const SAM_MODELS = [
18
18
  {
19
19
  id: 'microsam-vit-t-lm',
20
20
  label: 'micro-sam ViT-T',
21
- encoderUrl: 'https://huggingface.co/Ballon999/microsam-vit-t-lm-onnx/resolve/main/encoder.fp16.onnx',
22
- decoderUrl: 'https://huggingface.co/Ballon999/microsam-vit-t-lm-onnx/resolve/main/decoder.onnx',
21
+ encoderUrl: 'https://huggingface.co/jax-image-tools/microsam-vit-t-lm-onnx/resolve/main/encoder.fp16.onnx',
22
+ decoderUrl: 'https://huggingface.co/jax-image-tools/microsam-vit-t-lm-onnx/resolve/main/decoder.onnx',
23
23
  variant: 'sam1',
24
24
  inputSize: 1024,
25
25
  microscopy: true,
@@ -35,8 +35,8 @@ export const SAM_MODELS = [
35
35
  {
36
36
  id: 'microsam-vit-b-lm',
37
37
  label: 'micro-sam ViT-B',
38
- encoderUrl: 'https://huggingface.co/Ballon999/microsam-vit-b-lm-onnx/resolve/main/encoder.fp16.onnx',
39
- decoderUrl: 'https://huggingface.co/Ballon999/microsam-vit-b-lm-onnx/resolve/main/decoder.onnx',
38
+ encoderUrl: 'https://huggingface.co/jax-image-tools/microsam-vit-b-lm-onnx/resolve/main/encoder.fp16.onnx',
39
+ decoderUrl: 'https://huggingface.co/jax-image-tools/microsam-vit-b-lm-onnx/resolve/main/decoder.onnx',
40
40
  variant: 'sam1',
41
41
  inputSize: 1024,
42
42
  microscopy: true,
@@ -44,8 +44,8 @@ export const SAM_MODELS = [
44
44
  {
45
45
  id: 'patho-sam-vit-b',
46
46
  label: 'patho-sam ViT-B',
47
- encoderUrl: 'https://huggingface.co/Ballon999/patho-sam-vit-b-onnx/resolve/main/encoder.fp16.onnx',
48
- decoderUrl: 'https://huggingface.co/Ballon999/patho-sam-vit-b-onnx/resolve/main/decoder.onnx',
47
+ encoderUrl: 'https://huggingface.co/jax-image-tools/patho-sam-vit-b-onnx/resolve/main/encoder.fp16.onnx',
48
+ decoderUrl: 'https://huggingface.co/jax-image-tools/patho-sam-vit-b-onnx/resolve/main/decoder.onnx',
49
49
  variant: 'sam1',
50
50
  inputSize: 1024,
51
51
  microscopy: true,
@@ -53,8 +53,8 @@ export const SAM_MODELS = [
53
53
  {
54
54
  id: 'patho-sam-vit-b-int8',
55
55
  label: 'patho-sam ViT-B (int8)',
56
- encoderUrl: 'https://huggingface.co/Ballon999/patho-sam-vit-b-onnx/resolve/main/encoder.int8.onnx',
57
- decoderUrl: 'https://huggingface.co/Ballon999/patho-sam-vit-b-onnx/resolve/main/decoder.onnx',
56
+ encoderUrl: 'https://huggingface.co/jax-image-tools/patho-sam-vit-b-onnx/resolve/main/encoder.int8.onnx',
57
+ decoderUrl: 'https://huggingface.co/jax-image-tools/patho-sam-vit-b-onnx/resolve/main/decoder.onnx',
58
58
  variant: 'sam1',
59
59
  inputSize: 1024,
60
60
  microscopy: true,
@@ -105,4 +105,4 @@ export function setSamModelUrls(id, encoderUrl, decoderUrl) {
105
105
  activeDefaultId = id;
106
106
  }
107
107
  }
108
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FtLW1vZGVsLXJlZ2lzdHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tbW9kZWwtcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFrQjtJQUN2QztRQUNFLEVBQUUsRUFBRSxtQkFBbUI7UUFDdkIsS0FBSyxFQUFFLGlCQUFpQjtRQUN4QixVQUFVLEVBQUUsd0ZBQXdGO1FBQ3BHLFVBQVUsRUFBRSxtRkFBbUY7UUFDL0YsT0FBTyxFQUFFLE1BQU07UUFDZixTQUFTLEVBQUUsSUFBSTtRQUNmLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLDBFQUEwRTtRQUMxRSx3RUFBd0U7UUFDeEUsaUVBQWlFO1FBQ2pFLGdCQUFnQixFQUFFLENBQUMsTUFBTSxDQUFDO1FBQzFCLHFFQUFxRTtRQUNyRSwyRUFBMkU7UUFDM0UseUNBQXlDO1FBQ3pDLFNBQVMsRUFBRSxJQUFJO0tBQ2hCO0lBQ0Q7UUFDRSxFQUFFLEVBQUUsbUJBQW1CO1FBQ3ZCLEtBQUssRUFBRSxpQkFBaUI7UUFDeEIsVUFBVSxFQUFFLHdGQUF3RjtRQUNwRyxVQUFVLEVBQUUsbUZBQW1GO1FBQy9GLE9BQU8sRUFBRSxNQUFNO1FBQ2YsU0FBUyxFQUFFLElBQUk7UUFDZixVQUFVLEVBQUUsSUFBSTtLQUNqQjtJQUNEO1FBQ0UsRUFBRSxFQUFFLGlCQUFpQjtRQUNyQixLQUFLLEVBQUUsaUJBQWlCO1FBQ3hCLFVBQVUsRUFBRSxzRkFBc0Y7UUFDbEcsVUFBVSxFQUFFLGlGQUFpRjtRQUM3RixPQUFPLEVBQUUsTUFBTTtRQUNmLFNBQVMsRUFBRSxJQUFJO1FBQ2YsVUFBVSxFQUFFLElBQUk7S0FDakI7SUFDRDtRQUNFLEVBQUUsRUFBRSxzQkFBc0I7UUFDMUIsS0FBSyxFQUFFLHdCQUF3QjtRQUMvQixVQUFVLEVBQUUsc0ZBQXNGO1FBQ2xHLFVBQVUsRUFBRSxpRkFBaUY7UUFDN0YsT0FBTyxFQUFFLE1BQU07UUFDZixTQUFTLEVBQUUsSUFBSTtRQUNmLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLDRFQUE0RTtRQUM1RSw0RUFBNEU7UUFDNUUseUVBQXlFO1FBQ3pFLGdCQUFnQixFQUFFLENBQUMsTUFBTSxDQUFDO0tBQzNCO0NBQ0YsQ0FBQztBQUVGO2lEQUNpRDtBQUNqRCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBRXJEO29GQUNvRjtBQUNwRixJQUFJLGVBQWUsR0FBRyxvQkFBb0IsQ0FBQztBQUUzQztzQkFDc0I7QUFDdEIsTUFBTSxVQUFVLFdBQVcsQ0FBQyxFQUFXO0lBQ3JDLE1BQU0sTUFBTSxHQUFHLEVBQUUsSUFBSSxlQUFlLENBQUM7SUFDckMsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLE1BQU0sQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUQsMEVBQTBFO0FBQzFFLE1BQU0sVUFBVSxvQkFBb0I7SUFDbEMsT0FBTyxlQUFlLENBQUM7QUFDekIsQ0FBQztBQUVELG9FQUFvRTtBQUNwRSxNQUFNLFVBQVUsa0JBQWtCLENBQUMsRUFBVTtJQUMzQyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQUUsZUFBZSxHQUFHLEVBQUUsQ0FBQztBQUNoRSxDQUFDO0FBRUQsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBa0I7SUFDaEQsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztBQUNsRCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsRUFBVSxFQUFFLFVBQWtCLEVBQUUsVUFBa0I7SUFDaEYsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUM5QyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ04sQ0FBQyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDMUIsQ0FBQyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDMUIseUVBQXlFO1FBQ3pFLHVFQUF1RTtRQUN2RSxJQUFJLFVBQVUsSUFBSSxVQUFVO1lBQUUsZUFBZSxHQUFHLEVBQUUsQ0FBQztJQUNyRCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNhbU1vZGVsRGVmIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3NhbS5jb250cmFjdCc7XG5cbi8qKlxuICogUmVnaXN0cnkgb2YgcHJvbXB0YWJsZSBTQU0gbW9kZWxzIGZvciB0aGUgYnJvd3NlciBzZWdtZW50IHRvb2wuXG4gKlxuICogbWljcm8tc2FtIChtaWNyb3Njb3B5LWZpbmV0dW5lZCwgcHJvbXB0YWJsZSkgYW5kIHBhdGhvLXNhbSAoaGlzdG9wYXRob2xvZ3ktXG4gKiBmaW5ldHVuZWQpIGFyZSBlbnRyaWVzOyBTQU0zIHNsb3RzIGluIGhlcmUgb25jZSBpdHMgcXVhbnRpemVkIE9OTlggZXhwb3J0IGFuZFxuICogYSBgdmFyaWFudDogJ3NhbTMnYCBkZWNvZGVyIHBhdGggYXJlIHB1Ymxpc2hlZC4gVGhlXG4gKiBhdXRvbWF0aWMgY2VsbHBvc2UtU0FNIG1vZGVsIGlzIGludGVudGlvbmFsbHkgTk9UIGhlcmUg4oCUIGl0J3Mgbm90IHByb21wdGFibGVcbiAqIGFuZCBsaXZlcyBpbiB0aGUgcHJvY2Vzc2luZy1waXBlbGluZSdzIGNlbGxwb3NlIGVuZ2luZSBhcyB0aGUgYXV0b21hdGljIHRvb2wuXG4gKlxuICogYGVuY29kZXJVcmxgIC8gYGRlY29kZXJVcmxgIHBvaW50IGF0IHRoZSBwdWJsaWMgSEYtaG9zdGVkIE9OTlggcGFpcnMgYnlcbiAqIGRlZmF1bHQsIHNvIHRoZSBzZWdtZW50IHRvb2xzIHdvcmsgb3V0IG9mIHRoZSBib3ggaW4gYW55IGhvc3QgKG1pcnJvcmluZyB0aGVcbiAqIGNlbGxwb3NlIGRlZmF1bHQpLiBBIGhvc3QgY2FuIHJlcG9pbnQgdGhlbSBhdCBpdHMgb3duIGhvc3RpbmcgKGUuZy4gYSBHQ1NcbiAqIGJ1Y2tldCkgYXQgcnVudGltZSB2aWEge0BsaW5rIHNldFNhbU1vZGVsVXJsc307IGFuIGVtcHR5IFVSTCBkaXNhYmxlcyBhIG1vZGVsXG4gKiAodGhlIHNlc3Npb24gdGhyb3dzIGEgY2xlYXIgXCJub3QgY29uZmlndXJlZFwiIGVycm9yKS4gRXhwb3J0L3F1YW50aXphdGlvblxuICogdG9vbGluZzogdGhlIHNpYmxpbmcgYGJyb3dzZXItb25ueC10b29sc2AgcHJvamVjdDsgc2VlIGRvY3Mvc2FtLXNlZ21lbnRhdGlvbi1kZXNpZ24ubWQuXG4gKi9cbmV4cG9ydCBjb25zdCBTQU1fTU9ERUxTOiBTYW1Nb2RlbERlZltdID0gW1xuICB7XG4gICAgaWQ6ICdtaWNyb3NhbS12aXQtdC1sbScsXG4gICAgbGFiZWw6ICdtaWNyby1zYW0gVmlULVQnLFxuICAgIGVuY29kZXJVcmw6ICdodHRwczovL2h1Z2dpbmdmYWNlLmNvL0JhbGxvbjk5OS9taWNyb3NhbS12aXQtdC1sbS1vbm54L3Jlc29sdmUvbWFpbi9lbmNvZGVyLmZwMTYub25ueCcsXG4gICAgZGVjb2RlclVybDogJ2h0dHBzOi8vaHVnZ2luZ2ZhY2UuY28vQmFsbG9uOTk5L21pY3Jvc2FtLXZpdC10LWxtLW9ubngvcmVzb2x2ZS9tYWluL2RlY29kZXIub25ueCcsXG4gICAgdmFyaWFudDogJ3NhbTEnLFxuICAgIGlucHV0U2l6ZTogMTAyNCxcbiAgICBtaWNyb3Njb3B5OiB0cnVlLFxuICAgIC8vIFRpbnlWaVQncyBmcDE2IGF0dGVudGlvbiBvdmVyZmxvd3Mgb24gdGhlIG9ubnhydW50aW1lLXdlYiBXZWJHUFUgRVAgYW5kXG4gICAgLy8gcmV0dXJucyBhbiBlbXB0eSBtYXNrIChcIk5vIG1hc2tzIGZvdW5kXCIpOyBpdCdzIG51bWVyaWNhbGx5IGNvcnJlY3Qgb25cbiAgICAvLyBXQVNNLCBhbmQgdGhlIGVuY29kZXIgaXMgdGlueSAofjE0IE1CKSBzbyBXQVNNIGlzIHBsZW50eSBmYXN0LlxuICAgIGVuY29kZXJQcm92aWRlcnM6IFsnd2FzbSddLFxuICAgIC8vIFNtYWxsIGVub3VnaCB0byBydW4gaW4tcHJvY2VzcyBvbiB0aGUgbWFpbiB0aHJlYWQg4oCUIGF2b2lkcyB0aGUgV2ViXG4gICAgLy8gV29ya2VyJ3Mgc3Bhd24gLyBzZWNvbmQtT1JULXJ1bnRpbWUgLyByb3VuZC10cmlwIG92ZXJoZWFkLCB3aGljaCBtYWRlIGl0XG4gICAgLy8gbm90aWNlYWJseSBzbG93ZXIgdG8gbG9hZCBhbmQgc2VnbWVudC5cbiAgICBpblByb2Nlc3M6IHRydWUsXG4gIH0sXG4gIHtcbiAgICBpZDogJ21pY3Jvc2FtLXZpdC1iLWxtJyxcbiAgICBsYWJlbDogJ21pY3JvLXNhbSBWaVQtQicsXG4gICAgZW5jb2RlclVybDogJ2h0dHBzOi8vaHVnZ2luZ2ZhY2UuY28vQmFsbG9uOTk5L21pY3Jvc2FtLXZpdC1iLWxtLW9ubngvcmVzb2x2ZS9tYWluL2VuY29kZXIuZnAxNi5vbm54JyxcbiAgICBkZWNvZGVyVXJsOiAnaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9CYWxsb245OTkvbWljcm9zYW0tdml0LWItbG0tb25ueC9yZXNvbHZlL21haW4vZGVjb2Rlci5vbm54JyxcbiAgICB2YXJpYW50OiAnc2FtMScsXG4gICAgaW5wdXRTaXplOiAxMDI0LFxuICAgIG1pY3Jvc2NvcHk6IHRydWUsXG4gIH0sXG4gIHtcbiAgICBpZDogJ3BhdGhvLXNhbS12aXQtYicsXG4gICAgbGFiZWw6ICdwYXRoby1zYW0gVmlULUInLFxuICAgIGVuY29kZXJVcmw6ICdodHRwczovL2h1Z2dpbmdmYWNlLmNvL0JhbGxvbjk5OS9wYXRoby1zYW0tdml0LWItb25ueC9yZXNvbHZlL21haW4vZW5jb2Rlci5mcDE2Lm9ubngnLFxuICAgIGRlY29kZXJVcmw6ICdodHRwczovL2h1Z2dpbmdmYWNlLmNvL0JhbGxvbjk5OS9wYXRoby1zYW0tdml0LWItb25ueC9yZXNvbHZlL21haW4vZGVjb2Rlci5vbm54JyxcbiAgICB2YXJpYW50OiAnc2FtMScsXG4gICAgaW5wdXRTaXplOiAxMDI0LFxuICAgIG1pY3Jvc2NvcHk6IHRydWUsXG4gIH0sXG4gIHtcbiAgICBpZDogJ3BhdGhvLXNhbS12aXQtYi1pbnQ4JyxcbiAgICBsYWJlbDogJ3BhdGhvLXNhbSBWaVQtQiAoaW50OCknLFxuICAgIGVuY29kZXJVcmw6ICdodHRwczovL2h1Z2dpbmdmYWNlLmNvL0JhbGxvbjk5OS9wYXRoby1zYW0tdml0LWItb25ueC9yZXNvbHZlL21haW4vZW5jb2Rlci5pbnQ4Lm9ubngnLFxuICAgIGRlY29kZXJVcmw6ICdodHRwczovL2h1Z2dpbmdmYWNlLmNvL0JhbGxvbjk5OS9wYXRoby1zYW0tdml0LWItb25ueC9yZXNvbHZlL21haW4vZGVjb2Rlci5vbm54JyxcbiAgICB2YXJpYW50OiAnc2FtMScsXG4gICAgaW5wdXRTaXplOiAxMDI0LFxuICAgIG1pY3Jvc2NvcHk6IHRydWUsXG4gICAgLy8gaW50OCBkeW5hbWljLXF1YW50aXplZCBlbmNvZGVyICh+MTAwIE1CIHZzIH4xODAgTUIgZnAxNiwgSW9VIH4wLjk5IG9uIHRoZVxuICAgIC8vIHNhbml0eSB0ZXN0KS4gb25ueHJ1bnRpbWUtd2ViJ3MgV2ViR1BVIEVQIGRvZXNuJ3Qgc3VwcG9ydCBpbnQ4IG1hdG11bCwgc29cbiAgICAvLyBpdCBydW5zIG9uIFdBU00g4oCUIHNtYWxsZXIgZG93bmxvYWQsIHNsb3dlciBlbmNvZGUgdGhhbiB0aGUgZnAxNiBlbnRyeS5cbiAgICBlbmNvZGVyUHJvdmlkZXJzOiBbJ3dhc20nXSxcbiAgfSxcbl07XG5cbi8qKiBJbml0aWFsIGRlZmF1bHQgbW9kZWwgaWQgKG92ZXJyaWRkZW4gYXQgcnVudGltZSBvbmNlIHRoZSBob3N0IGNvbmZpZ3VyZXMgYVxuICogIGhvc3RlZCBtb2RlbCB2aWEge0BsaW5rIHNldFNhbU1vZGVsVXJsc30pLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0FNX01PREVMX0lEID0gU0FNX01PREVMU1swXS5pZDtcblxuLyoqIFRoZSBhY3RpdmUgZGVmYXVsdCDigJQgdXBkYXRlZCB3aGVuIHRoZSBob3N0IGNvbmZpZ3VyZXMgYSBtb2RlbCdzIE9OTlggVVJMcyxcbiAqICBzbyB0aGUgdG9vbCB1c2VzIHRoZSBtb2RlbCB0aGF0J3MgYWN0dWFsbHkgaG9zdGVkIChub3QganVzdCB0aGUgZmlyc3QgZW50cnkpLiAqL1xubGV0IGFjdGl2ZURlZmF1bHRJZCA9IERFRkFVTFRfU0FNX01PREVMX0lEO1xuXG4vKiogTG9vayB1cCBhIG1vZGVsIGJ5IGlkOyBmYWxscyBiYWNrIHRvIHRoZSBhY3RpdmUgZGVmYXVsdCB3aGVuIGlkIGlzXG4gKiAgdW5rbm93bi9hYnNlbnQuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2FtTW9kZWwoaWQ/OiBzdHJpbmcpOiBTYW1Nb2RlbERlZiB7XG4gIGNvbnN0IHdhbnRlZCA9IGlkID8/IGFjdGl2ZURlZmF1bHRJZDtcbiAgcmV0dXJuIFNBTV9NT0RFTFMuZmluZCgobSkgPT4gbS5pZCA9PT0gd2FudGVkKSA/PyBTQU1fTU9ERUxTWzBdO1xufVxuXG4vKiogVGhlIGFjdGl2ZSBkZWZhdWx0IG1vZGVsIGlkICh3aGF0IHRoZSB0b29scy9waWNrZXIgdXNlIHdoZW4gdW5zZXQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRTYW1Nb2RlbElkKCk6IHN0cmluZyB7XG4gIHJldHVybiBhY3RpdmVEZWZhdWx0SWQ7XG59XG5cbi8qKiBTZXQgdGhlIGFjdGl2ZSBkZWZhdWx0IG1vZGVsIGlkIChtdXN0IGJlIGEgcmVnaXN0ZXJlZCBtb2RlbCkuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RGVmYXVsdFNhbU1vZGVsKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKFNBTV9NT0RFTFMuc29tZSgobSkgPT4gbS5pZCA9PT0gaWQpKSBhY3RpdmVEZWZhdWx0SWQgPSBpZDtcbn1cblxuLyoqIFRydWUgd2hlbiBhIG1vZGVsIGhhcyBib3RoIE9OTlggVVJMcyBjb25maWd1cmVkIChpLmUuIGl0IGNhbiBhY3R1YWxseSBydW4pLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2FtTW9kZWxSZWFkeShtb2RlbDogU2FtTW9kZWxEZWYpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhbW9kZWwuZW5jb2RlclVybCAmJiAhIW1vZGVsLmRlY29kZXJVcmw7XG59XG5cbi8qKlxuICogUG9pbnQgYSByZWdpc3RlcmVkIG1vZGVsIGF0IGl0cyBob3N0ZWQgT05OWCBwYWlyIChIRiAvIEdDUykuIENhbGxlZCBieSB0aGVcbiAqIGhvc3QncyBjb21wb3NpdGlvbiByb290IG9uY2UgaG9zdGluZyBpcyBkZWNpZGVkLCBrZWVwaW5nIGRlcGxveW1lbnQgVVJMcyBvdXRcbiAqIG9mIHRoZSBsaWJyYXJ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0U2FtTW9kZWxVcmxzKGlkOiBzdHJpbmcsIGVuY29kZXJVcmw6IHN0cmluZywgZGVjb2RlclVybDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IG0gPSBTQU1fTU9ERUxTLmZpbmQoKHgpID0+IHguaWQgPT09IGlkKTtcbiAgaWYgKG0pIHtcbiAgICBtLmVuY29kZXJVcmwgPSBlbmNvZGVyVXJsO1xuICAgIG0uZGVjb2RlclVybCA9IGRlY29kZXJVcmw7XG4gICAgLy8gVGhlIGNvbmZpZ3VyZWQgKGhvc3RlZCkgbW9kZWwgYmVjb21lcyB0aGUgYWN0aXZlIGRlZmF1bHQsIHNvIHRoZSB0b29sc1xuICAgIC8vIHVzZSBpdCByYXRoZXIgdGhhbiB0aGUgZmlyc3QgcmVnaXN0cnkgZW50cnkgKHdoaWNoIG1heSBiZSB1bmhvc3RlZCkuXG4gICAgaWYgKGVuY29kZXJVcmwgJiYgZGVjb2RlclVybCkgYWN0aXZlRGVmYXVsdElkID0gaWQ7XG4gIH1cbn1cbiJdfQ==
108
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FtLW1vZGVsLXJlZ2lzdHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tbW9kZWwtcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFrQjtJQUN2QztRQUNFLEVBQUUsRUFBRSxtQkFBbUI7UUFDdkIsS0FBSyxFQUFFLGlCQUFpQjtRQUN4QixVQUFVLEVBQUUsOEZBQThGO1FBQzFHLFVBQVUsRUFBRSx5RkFBeUY7UUFDckcsT0FBTyxFQUFFLE1BQU07UUFDZixTQUFTLEVBQUUsSUFBSTtRQUNmLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLDBFQUEwRTtRQUMxRSx3RUFBd0U7UUFDeEUsaUVBQWlFO1FBQ2pFLGdCQUFnQixFQUFFLENBQUMsTUFBTSxDQUFDO1FBQzFCLHFFQUFxRTtRQUNyRSwyRUFBMkU7UUFDM0UseUNBQXlDO1FBQ3pDLFNBQVMsRUFBRSxJQUFJO0tBQ2hCO0lBQ0Q7UUFDRSxFQUFFLEVBQUUsbUJBQW1CO1FBQ3ZCLEtBQUssRUFBRSxpQkFBaUI7UUFDeEIsVUFBVSxFQUFFLDhGQUE4RjtRQUMxRyxVQUFVLEVBQUUseUZBQXlGO1FBQ3JHLE9BQU8sRUFBRSxNQUFNO1FBQ2YsU0FBUyxFQUFFLElBQUk7UUFDZixVQUFVLEVBQUUsSUFBSTtLQUNqQjtJQUNEO1FBQ0UsRUFBRSxFQUFFLGlCQUFpQjtRQUNyQixLQUFLLEVBQUUsaUJBQWlCO1FBQ3hCLFVBQVUsRUFBRSw0RkFBNEY7UUFDeEcsVUFBVSxFQUFFLHVGQUF1RjtRQUNuRyxPQUFPLEVBQUUsTUFBTTtRQUNmLFNBQVMsRUFBRSxJQUFJO1FBQ2YsVUFBVSxFQUFFLElBQUk7S0FDakI7SUFDRDtRQUNFLEVBQUUsRUFBRSxzQkFBc0I7UUFDMUIsS0FBSyxFQUFFLHdCQUF3QjtRQUMvQixVQUFVLEVBQUUsNEZBQTRGO1FBQ3hHLFVBQVUsRUFBRSx1RkFBdUY7UUFDbkcsT0FBTyxFQUFFLE1BQU07UUFDZixTQUFTLEVBQUUsSUFBSTtRQUNmLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLDRFQUE0RTtRQUM1RSw0RUFBNEU7UUFDNUUseUVBQXlFO1FBQ3pFLGdCQUFnQixFQUFFLENBQUMsTUFBTSxDQUFDO0tBQzNCO0NBQ0YsQ0FBQztBQUVGO2lEQUNpRDtBQUNqRCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBRXJEO29GQUNvRjtBQUNwRixJQUFJLGVBQWUsR0FBRyxvQkFBb0IsQ0FBQztBQUUzQztzQkFDc0I7QUFDdEIsTUFBTSxVQUFVLFdBQVcsQ0FBQyxFQUFXO0lBQ3JDLE1BQU0sTUFBTSxHQUFHLEVBQUUsSUFBSSxlQUFlLENBQUM7SUFDckMsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLE1BQU0sQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUQsMEVBQTBFO0FBQzFFLE1BQU0sVUFBVSxvQkFBb0I7SUFDbEMsT0FBTyxlQUFlLENBQUM7QUFDekIsQ0FBQztBQUVELG9FQUFvRTtBQUNwRSxNQUFNLFVBQVUsa0JBQWtCLENBQUMsRUFBVTtJQUMzQyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQUUsZUFBZSxHQUFHLEVBQUUsQ0FBQztBQUNoRSxDQUFDO0FBRUQsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBa0I7SUFDaEQsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztBQUNsRCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsRUFBVSxFQUFFLFVBQWtCLEVBQUUsVUFBa0I7SUFDaEYsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUM5QyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ04sQ0FBQyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDMUIsQ0FBQyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDMUIseUVBQXlFO1FBQ3pFLHVFQUF1RTtRQUN2RSxJQUFJLFVBQVUsSUFBSSxVQUFVO1lBQUUsZUFBZSxHQUFHLEVBQUUsQ0FBQztJQUNyRCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNhbU1vZGVsRGVmIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3NhbS5jb250cmFjdCc7XG5cbi8qKlxuICogUmVnaXN0cnkgb2YgcHJvbXB0YWJsZSBTQU0gbW9kZWxzIGZvciB0aGUgYnJvd3NlciBzZWdtZW50IHRvb2wuXG4gKlxuICogbWljcm8tc2FtIChtaWNyb3Njb3B5LWZpbmV0dW5lZCwgcHJvbXB0YWJsZSkgYW5kIHBhdGhvLXNhbSAoaGlzdG9wYXRob2xvZ3ktXG4gKiBmaW5ldHVuZWQpIGFyZSBlbnRyaWVzOyBTQU0zIHNsb3RzIGluIGhlcmUgb25jZSBpdHMgcXVhbnRpemVkIE9OTlggZXhwb3J0IGFuZFxuICogYSBgdmFyaWFudDogJ3NhbTMnYCBkZWNvZGVyIHBhdGggYXJlIHB1Ymxpc2hlZC4gVGhlXG4gKiBhdXRvbWF0aWMgY2VsbHBvc2UtU0FNIG1vZGVsIGlzIGludGVudGlvbmFsbHkgTk9UIGhlcmUg4oCUIGl0J3Mgbm90IHByb21wdGFibGVcbiAqIGFuZCBsaXZlcyBpbiB0aGUgcHJvY2Vzc2luZy1waXBlbGluZSdzIGNlbGxwb3NlIGVuZ2luZSBhcyB0aGUgYXV0b21hdGljIHRvb2wuXG4gKlxuICogYGVuY29kZXJVcmxgIC8gYGRlY29kZXJVcmxgIHBvaW50IGF0IHRoZSBwdWJsaWMgSEYtaG9zdGVkIE9OTlggcGFpcnMgYnlcbiAqIGRlZmF1bHQsIHNvIHRoZSBzZWdtZW50IHRvb2xzIHdvcmsgb3V0IG9mIHRoZSBib3ggaW4gYW55IGhvc3QgKG1pcnJvcmluZyB0aGVcbiAqIGNlbGxwb3NlIGRlZmF1bHQpLiBBIGhvc3QgY2FuIHJlcG9pbnQgdGhlbSBhdCBpdHMgb3duIGhvc3RpbmcgKGUuZy4gYSBHQ1NcbiAqIGJ1Y2tldCkgYXQgcnVudGltZSB2aWEge0BsaW5rIHNldFNhbU1vZGVsVXJsc307IGFuIGVtcHR5IFVSTCBkaXNhYmxlcyBhIG1vZGVsXG4gKiAodGhlIHNlc3Npb24gdGhyb3dzIGEgY2xlYXIgXCJub3QgY29uZmlndXJlZFwiIGVycm9yKS4gRXhwb3J0L3F1YW50aXphdGlvblxuICogdG9vbGluZzogdGhlIHNpYmxpbmcgYGJyb3dzZXItb25ueC10b29sc2AgcHJvamVjdDsgc2VlIGRvY3Mvc2FtLXNlZ21lbnRhdGlvbi1kZXNpZ24ubWQuXG4gKi9cbmV4cG9ydCBjb25zdCBTQU1fTU9ERUxTOiBTYW1Nb2RlbERlZltdID0gW1xuICB7XG4gICAgaWQ6ICdtaWNyb3NhbS12aXQtdC1sbScsXG4gICAgbGFiZWw6ICdtaWNyby1zYW0gVmlULVQnLFxuICAgIGVuY29kZXJVcmw6ICdodHRwczovL2h1Z2dpbmdmYWNlLmNvL2pheC1pbWFnZS10b29scy9taWNyb3NhbS12aXQtdC1sbS1vbm54L3Jlc29sdmUvbWFpbi9lbmNvZGVyLmZwMTYub25ueCcsXG4gICAgZGVjb2RlclVybDogJ2h0dHBzOi8vaHVnZ2luZ2ZhY2UuY28vamF4LWltYWdlLXRvb2xzL21pY3Jvc2FtLXZpdC10LWxtLW9ubngvcmVzb2x2ZS9tYWluL2RlY29kZXIub25ueCcsXG4gICAgdmFyaWFudDogJ3NhbTEnLFxuICAgIGlucHV0U2l6ZTogMTAyNCxcbiAgICBtaWNyb3Njb3B5OiB0cnVlLFxuICAgIC8vIFRpbnlWaVQncyBmcDE2IGF0dGVudGlvbiBvdmVyZmxvd3Mgb24gdGhlIG9ubnhydW50aW1lLXdlYiBXZWJHUFUgRVAgYW5kXG4gICAgLy8gcmV0dXJucyBhbiBlbXB0eSBtYXNrIChcIk5vIG1hc2tzIGZvdW5kXCIpOyBpdCdzIG51bWVyaWNhbGx5IGNvcnJlY3Qgb25cbiAgICAvLyBXQVNNLCBhbmQgdGhlIGVuY29kZXIgaXMgdGlueSAofjE0IE1CKSBzbyBXQVNNIGlzIHBsZW50eSBmYXN0LlxuICAgIGVuY29kZXJQcm92aWRlcnM6IFsnd2FzbSddLFxuICAgIC8vIFNtYWxsIGVub3VnaCB0byBydW4gaW4tcHJvY2VzcyBvbiB0aGUgbWFpbiB0aHJlYWQg4oCUIGF2b2lkcyB0aGUgV2ViXG4gICAgLy8gV29ya2VyJ3Mgc3Bhd24gLyBzZWNvbmQtT1JULXJ1bnRpbWUgLyByb3VuZC10cmlwIG92ZXJoZWFkLCB3aGljaCBtYWRlIGl0XG4gICAgLy8gbm90aWNlYWJseSBzbG93ZXIgdG8gbG9hZCBhbmQgc2VnbWVudC5cbiAgICBpblByb2Nlc3M6IHRydWUsXG4gIH0sXG4gIHtcbiAgICBpZDogJ21pY3Jvc2FtLXZpdC1iLWxtJyxcbiAgICBsYWJlbDogJ21pY3JvLXNhbSBWaVQtQicsXG4gICAgZW5jb2RlclVybDogJ2h0dHBzOi8vaHVnZ2luZ2ZhY2UuY28vamF4LWltYWdlLXRvb2xzL21pY3Jvc2FtLXZpdC1iLWxtLW9ubngvcmVzb2x2ZS9tYWluL2VuY29kZXIuZnAxNi5vbm54JyxcbiAgICBkZWNvZGVyVXJsOiAnaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9qYXgtaW1hZ2UtdG9vbHMvbWljcm9zYW0tdml0LWItbG0tb25ueC9yZXNvbHZlL21haW4vZGVjb2Rlci5vbm54JyxcbiAgICB2YXJpYW50OiAnc2FtMScsXG4gICAgaW5wdXRTaXplOiAxMDI0LFxuICAgIG1pY3Jvc2NvcHk6IHRydWUsXG4gIH0sXG4gIHtcbiAgICBpZDogJ3BhdGhvLXNhbS12aXQtYicsXG4gICAgbGFiZWw6ICdwYXRoby1zYW0gVmlULUInLFxuICAgIGVuY29kZXJVcmw6ICdodHRwczovL2h1Z2dpbmdmYWNlLmNvL2pheC1pbWFnZS10b29scy9wYXRoby1zYW0tdml0LWItb25ueC9yZXNvbHZlL21haW4vZW5jb2Rlci5mcDE2Lm9ubngnLFxuICAgIGRlY29kZXJVcmw6ICdodHRwczovL2h1Z2dpbmdmYWNlLmNvL2pheC1pbWFnZS10b29scy9wYXRoby1zYW0tdml0LWItb25ueC9yZXNvbHZlL21haW4vZGVjb2Rlci5vbm54JyxcbiAgICB2YXJpYW50OiAnc2FtMScsXG4gICAgaW5wdXRTaXplOiAxMDI0LFxuICAgIG1pY3Jvc2NvcHk6IHRydWUsXG4gIH0sXG4gIHtcbiAgICBpZDogJ3BhdGhvLXNhbS12aXQtYi1pbnQ4JyxcbiAgICBsYWJlbDogJ3BhdGhvLXNhbSBWaVQtQiAoaW50OCknLFxuICAgIGVuY29kZXJVcmw6ICdodHRwczovL2h1Z2dpbmdmYWNlLmNvL2pheC1pbWFnZS10b29scy9wYXRoby1zYW0tdml0LWItb25ueC9yZXNvbHZlL21haW4vZW5jb2Rlci5pbnQ4Lm9ubngnLFxuICAgIGRlY29kZXJVcmw6ICdodHRwczovL2h1Z2dpbmdmYWNlLmNvL2pheC1pbWFnZS10b29scy9wYXRoby1zYW0tdml0LWItb25ueC9yZXNvbHZlL21haW4vZGVjb2Rlci5vbm54JyxcbiAgICB2YXJpYW50OiAnc2FtMScsXG4gICAgaW5wdXRTaXplOiAxMDI0LFxuICAgIG1pY3Jvc2NvcHk6IHRydWUsXG4gICAgLy8gaW50OCBkeW5hbWljLXF1YW50aXplZCBlbmNvZGVyICh+MTAwIE1CIHZzIH4xODAgTUIgZnAxNiwgSW9VIH4wLjk5IG9uIHRoZVxuICAgIC8vIHNhbml0eSB0ZXN0KS4gb25ueHJ1bnRpbWUtd2ViJ3MgV2ViR1BVIEVQIGRvZXNuJ3Qgc3VwcG9ydCBpbnQ4IG1hdG11bCwgc29cbiAgICAvLyBpdCBydW5zIG9uIFdBU00g4oCUIHNtYWxsZXIgZG93bmxvYWQsIHNsb3dlciBlbmNvZGUgdGhhbiB0aGUgZnAxNiBlbnRyeS5cbiAgICBlbmNvZGVyUHJvdmlkZXJzOiBbJ3dhc20nXSxcbiAgfSxcbl07XG5cbi8qKiBJbml0aWFsIGRlZmF1bHQgbW9kZWwgaWQgKG92ZXJyaWRkZW4gYXQgcnVudGltZSBvbmNlIHRoZSBob3N0IGNvbmZpZ3VyZXMgYVxuICogIGhvc3RlZCBtb2RlbCB2aWEge0BsaW5rIHNldFNhbU1vZGVsVXJsc30pLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0FNX01PREVMX0lEID0gU0FNX01PREVMU1swXS5pZDtcblxuLyoqIFRoZSBhY3RpdmUgZGVmYXVsdCDigJQgdXBkYXRlZCB3aGVuIHRoZSBob3N0IGNvbmZpZ3VyZXMgYSBtb2RlbCdzIE9OTlggVVJMcyxcbiAqICBzbyB0aGUgdG9vbCB1c2VzIHRoZSBtb2RlbCB0aGF0J3MgYWN0dWFsbHkgaG9zdGVkIChub3QganVzdCB0aGUgZmlyc3QgZW50cnkpLiAqL1xubGV0IGFjdGl2ZURlZmF1bHRJZCA9IERFRkFVTFRfU0FNX01PREVMX0lEO1xuXG4vKiogTG9vayB1cCBhIG1vZGVsIGJ5IGlkOyBmYWxscyBiYWNrIHRvIHRoZSBhY3RpdmUgZGVmYXVsdCB3aGVuIGlkIGlzXG4gKiAgdW5rbm93bi9hYnNlbnQuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2FtTW9kZWwoaWQ/OiBzdHJpbmcpOiBTYW1Nb2RlbERlZiB7XG4gIGNvbnN0IHdhbnRlZCA9IGlkID8/IGFjdGl2ZURlZmF1bHRJZDtcbiAgcmV0dXJuIFNBTV9NT0RFTFMuZmluZCgobSkgPT4gbS5pZCA9PT0gd2FudGVkKSA/PyBTQU1fTU9ERUxTWzBdO1xufVxuXG4vKiogVGhlIGFjdGl2ZSBkZWZhdWx0IG1vZGVsIGlkICh3aGF0IHRoZSB0b29scy9waWNrZXIgdXNlIHdoZW4gdW5zZXQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRTYW1Nb2RlbElkKCk6IHN0cmluZyB7XG4gIHJldHVybiBhY3RpdmVEZWZhdWx0SWQ7XG59XG5cbi8qKiBTZXQgdGhlIGFjdGl2ZSBkZWZhdWx0IG1vZGVsIGlkIChtdXN0IGJlIGEgcmVnaXN0ZXJlZCBtb2RlbCkuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RGVmYXVsdFNhbU1vZGVsKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKFNBTV9NT0RFTFMuc29tZSgobSkgPT4gbS5pZCA9PT0gaWQpKSBhY3RpdmVEZWZhdWx0SWQgPSBpZDtcbn1cblxuLyoqIFRydWUgd2hlbiBhIG1vZGVsIGhhcyBib3RoIE9OTlggVVJMcyBjb25maWd1cmVkIChpLmUuIGl0IGNhbiBhY3R1YWxseSBydW4pLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2FtTW9kZWxSZWFkeShtb2RlbDogU2FtTW9kZWxEZWYpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhbW9kZWwuZW5jb2RlclVybCAmJiAhIW1vZGVsLmRlY29kZXJVcmw7XG59XG5cbi8qKlxuICogUG9pbnQgYSByZWdpc3RlcmVkIG1vZGVsIGF0IGl0cyBob3N0ZWQgT05OWCBwYWlyIChIRiAvIEdDUykuIENhbGxlZCBieSB0aGVcbiAqIGhvc3QncyBjb21wb3NpdGlvbiByb290IG9uY2UgaG9zdGluZyBpcyBkZWNpZGVkLCBrZWVwaW5nIGRlcGxveW1lbnQgVVJMcyBvdXRcbiAqIG9mIHRoZSBsaWJyYXJ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0U2FtTW9kZWxVcmxzKGlkOiBzdHJpbmcsIGVuY29kZXJVcmw6IHN0cmluZywgZGVjb2RlclVybDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IG0gPSBTQU1fTU9ERUxTLmZpbmQoKHgpID0+IHguaWQgPT09IGlkKTtcbiAgaWYgKG0pIHtcbiAgICBtLmVuY29kZXJVcmwgPSBlbmNvZGVyVXJsO1xuICAgIG0uZGVjb2RlclVybCA9IGRlY29kZXJVcmw7XG4gICAgLy8gVGhlIGNvbmZpZ3VyZWQgKGhvc3RlZCkgbW9kZWwgYmVjb21lcyB0aGUgYWN0aXZlIGRlZmF1bHQsIHNvIHRoZSB0b29sc1xuICAgIC8vIHVzZSBpdCByYXRoZXIgdGhhbiB0aGUgZmlyc3QgcmVnaXN0cnkgZW50cnkgKHdoaWNoIG1heSBiZSB1bmhvc3RlZCkuXG4gICAgaWYgKGVuY29kZXJVcmwgJiYgZGVjb2RlclVybCkgYWN0aXZlRGVmYXVsdElkID0gaWQ7XG4gIH1cbn1cbiJdfQ==