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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/esm2022/lib/contracts/display-types.mjs +3 -2
  2. package/esm2022/lib/contracts/image.contract.mjs +1 -1
  3. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +1 -1
  4. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  5. package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
  6. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +1 -1
  7. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  8. package/esm2022/lib/geometry/cell-meshes.mjs +37 -0
  9. package/esm2022/lib/geometry/place.mjs +47 -0
  10. package/esm2022/lib/implementations/napari-js/napari-camera-depth.mjs +93 -0
  11. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +1 -1
  12. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +2 -2
  13. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
  14. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +81 -15
  15. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-cells.mjs +746 -0
  16. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +325 -18
  17. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-transcripts.mjs +182 -24
  18. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +95 -5
  19. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +15 -1
  20. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +30 -2
  21. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +40 -1
  22. package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +111 -28
  23. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +14 -2
  24. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +180 -48
  25. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +28 -8
  26. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +2 -2
  27. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +10 -1
  28. package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +30 -3
  29. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +15 -3
  30. package/esm2022/lib/region-editor/region-editor.component.mjs +24 -4
  31. package/esm2022/lib/region-source/region-source-ops.mjs +7 -1
  32. package/esm2022/lib/region-source/region-tiles.mjs +1 -1
  33. package/esm2022/lib/region-source/worker-region-source.mjs +24 -1
  34. package/esm2022/lib/routing-visualizer.service.mjs +404 -7
  35. package/esm2022/lib/spatial/observations-in-selection.mjs +83 -0
  36. package/esm2022/lib/spatial/plane-cells.mjs +119 -0
  37. package/esm2022/lib/spatial/spatial-controls.facade.mjs +298 -5
  38. package/esm2022/lib/spatial/spatial-encoding.mjs +35 -3
  39. package/esm2022/lib/spatial/spatial-hover.mjs +34 -1
  40. package/esm2022/lib/spatial/spatial-planes.mjs +49 -0
  41. package/esm2022/lib/spatial/spatial-selection.mjs +2 -2
  42. package/esm2022/lib/spatial/spatial-tile-merge.mjs +38 -1
  43. package/esm2022/lib/spatial/transcripts-in-selection.mjs +208 -0
  44. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +42 -65
  45. package/esm2022/lib/spatial-controls/spatial-color-by/spatial-color-by.component.mjs +187 -0
  46. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +47 -12
  47. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +3 -3
  48. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +38 -10
  49. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +3 -3
  50. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +3 -3
  51. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +79 -57
  52. package/esm2022/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.mjs +101 -0
  53. package/esm2022/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.mjs +94 -0
  54. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +9 -3
  55. package/esm2022/lib/store/region-source-scope.mjs +10 -1
  56. package/esm2022/lib/store/region-store.service.mjs +33 -2
  57. package/esm2022/lib/toolbar/toolbar.component.mjs +10 -3
  58. package/esm2022/lib/visualizer/spatial-region-set.mjs +95 -0
  59. package/esm2022/lib/visualizer.component.mjs +40 -4
  60. package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CBiLcnE6.mjs} +4521 -759
  61. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CBiLcnE6.mjs.map +1 -0
  62. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-CKEUwNta.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-BXHjv4PE.mjs} +2 -2
  63. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-CKEUwNta.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-BXHjv4PE.mjs.map} +1 -1
  64. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1 -1
  65. package/fesm2022/region-source.worker.js +84 -2
  66. package/lib/contracts/display-types.d.ts +90 -4
  67. package/lib/contracts/image.contract.d.ts +6 -0
  68. package/lib/contracts/ports/spatial-data.port.d.ts +7 -0
  69. package/lib/contracts/region-editor-api.contract.d.ts +9 -0
  70. package/lib/contracts/region-store.contract.d.ts +6 -0
  71. package/lib/contracts/spatial-dataset.contract.d.ts +7 -1
  72. package/lib/contracts/visualizer.contract.d.ts +43 -1
  73. package/lib/geometry/cell-meshes.d.ts +27 -0
  74. package/lib/geometry/place.d.ts +45 -0
  75. package/lib/implementations/napari-js/napari-camera-depth.d.ts +23 -0
  76. package/lib/implementations/napari-js/napari-loading-state.d.ts +1 -1
  77. package/lib/implementations/napari-js/napari-scene.d.ts +12 -0
  78. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +19 -3
  79. package/lib/implementations/napari-js/napari-spatial-3d-cells.d.ts +141 -0
  80. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +87 -0
  81. package/lib/implementations/napari-js/napari-spatial-3d-transcripts.d.ts +49 -8
  82. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +22 -0
  83. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +12 -0
  84. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +15 -0
  85. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +27 -1
  86. package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +38 -19
  87. package/lib/implementations/napari-js/napari-volume-scene.d.ts +2 -0
  88. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +53 -0
  89. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +11 -2
  90. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +7 -0
  91. package/lib/region-editor/class-tree/class-tree.component.d.ts +16 -1
  92. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +10 -1
  93. package/lib/region-editor/region-editor.component.d.ts +4 -0
  94. package/lib/region-source/region-source-ops.d.ts +12 -0
  95. package/lib/region-source/region-tiles.d.ts +8 -0
  96. package/lib/region-source/worker-region-source.d.ts +18 -0
  97. package/lib/routing-visualizer.service.d.ts +140 -1
  98. package/lib/spatial/observations-in-selection.d.ts +43 -0
  99. package/lib/spatial/plane-cells.d.ts +37 -0
  100. package/lib/spatial/spatial-controls.facade.d.ts +59 -0
  101. package/lib/spatial/spatial-encoding.d.ts +14 -1
  102. package/lib/spatial/spatial-hover.d.ts +23 -0
  103. package/lib/spatial/spatial-planes.d.ts +22 -0
  104. package/lib/spatial/spatial-selection.d.ts +2 -1
  105. package/lib/spatial/spatial-tile-merge.d.ts +9 -0
  106. package/lib/spatial/transcripts-in-selection.d.ts +95 -0
  107. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +19 -28
  108. package/lib/spatial-controls/spatial-color-by/spatial-color-by.component.d.ts +64 -0
  109. package/lib/spatial-controls/spatial-controls.component.d.ts +17 -2
  110. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +16 -6
  111. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +26 -23
  112. package/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.d.ts +48 -0
  113. package/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.d.ts +43 -0
  114. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +3 -1
  115. package/lib/store/region-source-scope.d.ts +4 -0
  116. package/lib/store/region-store.service.d.ts +21 -0
  117. package/lib/toolbar/toolbar.component.d.ts +6 -1
  118. package/lib/visualizer/spatial-region-set.d.ts +55 -0
  119. package/lib/visualizer.component.d.ts +14 -0
  120. package/package.json +1 -1
  121. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs.map +0 -1
@@ -1,4 +1,4 @@
1
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, NgZone, } from '@angular/core';
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, NgZone, Output, } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { FormsModule } from '@angular/forms';
4
4
  import { SharedModule } from 'primeng/api';
@@ -19,12 +19,14 @@ import * as i4 from "primeng/checkbox";
19
19
  import * as i5 from "primeng/dropdown";
20
20
  import * as i6 from "primeng/overlaypanel";
21
21
  /**
22
- * The cells' grouping, as Xenium Explorer's Groups section: the group picker (columns under
23
- * their section heading, a k-means family once, with its k beside it), CSV import of a new
22
+ * The observations' grouping, as Xenium Explorer's Groups section: the group picker (columns
23
+ * under their section heading, a k-means family once, with its k beside it), CSV import of a new
24
24
  * grouping, and the grouping's categories with their colours (each one's swatch opens a colour
25
- * picker), cell counts and show/hide switches.
25
+ * picker), cell counts and show/hide switches. A group's name selects its observations.
26
26
  *
27
- * Writes only through `controls.setViewState` (`cellTypeColumn`, `hiddenGroups`, `groupColors`).
27
+ * The Observations section's "Colour by" in Group mode: the grouping colours the markers and the
28
+ * cells alike. Writes only through `controls.setViewState` (`cellTypeColumn` with `colorBy` and
29
+ * `cellColorMode`, `hiddenGroups`, `groupColors`).
28
30
  */
29
31
  export class SpatialGroupsPanelComponent {
30
32
  constructor(zone, cdr) {
@@ -36,6 +38,10 @@ export class SpatialGroupsPanelComponent {
36
38
  this.dataset = null;
37
39
  /** The current spatial view state: what is drawn, and how. */
38
40
  this.view = DEFAULT_SPATIAL_VIEW;
41
+ /** The category selected (its code in the grouping), for highlighting its row. */
42
+ this.selectedCategory = null;
43
+ /** A group's name was clicked: its category's code in the grouping, to select its observations. */
44
+ this.categoryClicked = new EventEmitter();
39
45
  /**
40
46
  * The group picker: categorical columns under their section heading, a family of
41
47
  * variants (k-means at k = 2…10) listed once. Values are a column name, or
@@ -98,8 +104,26 @@ export class SpatialGroupsPanelComponent {
98
104
  this.onCellTypeColumn(name);
99
105
  }
100
106
  onCellTypeColumn(name) {
101
- // Switched-off groups belong to the grouping they were switched off in.
102
- this.controls?.setViewState({ cellTypeColumn: name, hiddenGroups: [] });
107
+ // Switched-off groups belong to the grouping they were switched off in. The grouping colours
108
+ // the markers (colorBy) and the cells (cellColorMode) alike.
109
+ this.controls?.setViewState({
110
+ cellTypeColumn: name,
111
+ hiddenGroups: [],
112
+ cellColorMode: 'group',
113
+ ...(name ? { colorBy: { kind: 'column', name } } : {}),
114
+ });
115
+ }
116
+ /** Group `label`'s category code in the active grouping, or -1. */
117
+ codeOf(label) {
118
+ const name = this.activeCellTypeColumn;
119
+ const meta = this.dataset?.columns.find((c) => c.name === name);
120
+ return meta?.kind === 'categorical' ? meta.categories.indexOf(label) : -1;
121
+ }
122
+ /** Select (or, selected already, clear) group `label`'s observations. */
123
+ onGroupClicked(label) {
124
+ const code = this.codeOf(label);
125
+ if (code >= 0)
126
+ this.categoryClicked.emit(code);
103
127
  }
104
128
  isGroupShown(label) {
105
129
  return !this.hiddenGroups.has(label);
@@ -223,7 +247,7 @@ export class SpatialGroupsPanelComponent {
223
247
  });
224
248
  }
225
249
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SpatialGroupsPanelComponent, deps: [{ token: i0.NgZone }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
226
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: SpatialGroupsPanelComponent, isStandalone: true, selector: "spatial-groups-panel", inputs: { controls: "controls", dataset: "dataset", view: "view" }, usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"groupOptions.length\">\n <div class=\"sc-subhead\">Groups</div>\n <div class=\"sc-row sc-row-picker\">\n <p-dropdown\n [options]=\"groupOptions\"\n [group]=\"true\"\n optionLabel=\"label\"\n optionValue=\"value\"\n optionGroupLabel=\"label\"\n optionGroupChildren=\"items\"\n [ngModel]=\"activeGroupEntry\"\n (ngModelChange)=\"onGroupEntry($event)\"\n appendTo=\"body\"\n styleClass=\"sc-full\"\n >\n <ng-template let-group pTemplate=\"group\">\n <span class=\"sc-group-heading\">{{ group.label }}</span>\n </ng-template>\n </p-dropdown>\n <p-dropdown\n *ngIf=\"groupVariantOptions.length\"\n [options]=\"groupVariantOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n styleClass=\"sc-variant\"\n [ngModel]=\"activeCellTypeColumn\"\n (ngModelChange)=\"onGroupVariant($event)\"\n appendTo=\"body\"\n ></p-dropdown>\n <button\n *ngIf=\"canImportGroups\"\n type=\"button\"\n class=\"sc-icon-btn\"\n [disabled]=\"groupImporting\"\n (click)=\"groupFile.click()\"\n title=\"Import cell groups (CSV of cell_id, group)\"\n >\n <i\n class=\"pi\"\n [class.pi-plus-circle]=\"!groupImporting\"\n [class.pi-spin]=\"groupImporting\"\n [class.pi-spinner]=\"groupImporting\"\n ></i>\n </button>\n <input #groupFile type=\"file\" accept=\".csv,.tsv,.txt\" hidden (change)=\"onImportGroupsFile(groupFile)\" />\n </div>\n <small class=\"sc-hint sc-error\" *ngIf=\"groupImportError\">{{ groupImportError }}</small>\n\n <div class=\"sc-group-list\" *ngIf=\"groupRows.length\">\n <div class=\"sc-group-row sc-group-all\">\n <p-checkbox\n [binary]=\"true\"\n [ngModel]=\"allGroupsShown\"\n (onChange)=\"onAllGroupsShown($event.checked)\"\n ></p-checkbox>\n <span class=\"sc-group-label\">All groups</span>\n <span class=\"sc-count\">({{ groupTotal | number }})</span>\n <button type=\"button\" class=\"sc-icon-btn\" (click)=\"groupsExpanded = !groupsExpanded\">\n <i class=\"pi\" [class.pi-chevron-down]=\"groupsExpanded\" [class.pi-chevron-right]=\"!groupsExpanded\"></i>\n </button>\n </div>\n <ng-container *ngIf=\"groupsExpanded\">\n <div class=\"sc-group-row\" *ngFor=\"let row of groupRows; trackBy: trackByLabel\">\n <p-checkbox\n [binary]=\"true\"\n [ngModel]=\"isGroupShown(row.label)\"\n (onChange)=\"onGroupShown(row.label, $event.checked)\"\n ></p-checkbox>\n <!-- The group's colour; clicking it opens the colour picker. -->\n <button\n type=\"button\"\n class=\"sc-dot sc-dot-btn\"\n [style.background]=\"row.color\"\n [attr.aria-label]=\"'Colour for ' + row.label\"\n title=\"Colour\"\n (click)=\"openGroupStyle($event, row.label, groupPop)\"\n ></button>\n <span class=\"sc-group-label\" [title]=\"row.label\">{{ row.label }}</span>\n <span class=\"sc-count\">({{ row.count | number }})</span>\n </div>\n </ng-container>\n </div>\n <!-- One picker for every group row, filled for the group that opened it. -->\n <p-overlayPanel #groupPop styleClass=\"sc-gene-style\" appendTo=\"body\">\n <ng-template pTemplate=\"content\">\n <spatial-gene-style\n *ngIf=\"styleGroup as group\"\n [gene]=\"group\"\n what=\"Group\"\n [color]=\"groupColorOf(group)\"\n [showIcons]=\"false\"\n (colorChange)=\"onGroupColor(group, $event)\"\n (resetStyle)=\"resetGroupColor(group)\"\n ></spatial-gene-style>\n </ng-template>\n </p-overlayPanel>\n</ng-container>\n", styles: [".sc-hint{font-size:.75rem;color:var(--text-color-secondary, #6c757d)}.sc-error{color:var(--red-600, #c62828)}.sc-section{display:flex;flex-direction:column;gap:.35rem}.sc-lbl{font-size:.78rem;color:var(--text-color-secondary, #6c757d);white-space:nowrap}.sc-row{display:flex;align-items:center;gap:.6rem}.sc-row p-slider,.sc-row p-dropdown,.sc-row p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row p-slider .p-slider{width:100%}:host ::ng-deep .sc-row p-dropdown .p-dropdown,:host ::ng-deep .sc-row p-treeSelect .p-treeselect{width:100%}.sc-row .sc-lbl{flex:0 0 calc(50% - .6rem);min-width:0;overflow:hidden;text-overflow:ellipsis}.sc-cmap-option{display:inline-flex;align-items:center;gap:.4rem}.sc-cmap-swatch{width:3.5rem;height:.7rem;border-radius:2px;display:block}.sc-val{flex:0 0 4rem;text-align:right;font-size:.78rem;font-variant-numeric:tabular-nums;white-space:nowrap}:host ::ng-deep .sc-full,:host ::ng-deep .sc-full .p-dropdown,:host ::ng-deep .sc-full .p-autocomplete,:host ::ng-deep .sc-full input{width:100%}.sc-colorbar{height:.75rem;border-radius:2px;border:1px solid rgba(0,0,0,.2)}.sc-colorbar-ends{display:flex;justify-content:space-between;font-size:.7rem;color:var(--text-color-secondary, #6c757d);margin-top:.2rem}.sc-panel{border:1px solid var(--surface-border, #dee2e6);border-radius:6px;margin-bottom:.5rem;overflow:hidden}.sc-panel-head{display:flex;align-items:center;gap:.6rem;padding:.5rem .7rem;cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--surface-100, #f5f6f7)}.sc-panel-head .sc-panel-title{flex:1;font-weight:600}.sc-panel.open>.sc-panel-head{background:var(--primary-color, #2196f3);color:var(--primary-color-text, #fff)}.sc-panel-body{display:flex;flex-direction:column;gap:.45rem;padding:.6rem .75rem .75rem}.sc-subhead{display:flex;align-items:center;gap:.5rem;margin-top:.4rem;font-size:.72rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-color-secondary, #6c757d)}.sc-subhead:after{content:\"\";flex:1;border-top:1px solid var(--surface-border, #dee2e6)}:host ::ng-deep .sc-buttons .p-button{padding:.35rem .75rem;font-size:.85rem}.sc-row-picker p-dropdown,.sc-row-picker p-multiSelect,.sc-row-picker p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row-picker .sc-variant{width:6.5rem}:host ::ng-deep .sc-row-picker p-multiselect .p-multiselect{width:100%}:host ::ng-deep .sc-row-picker p-dropdown:has(.sc-variant){flex:0 0 6.5rem}:host ::ng-deep .sc-row-picker p-treeselect:has(.sc-palette){flex:0 0 3rem}:host ::ng-deep .sc-palette .p-treeselect-label{width:0;padding:0}.sc-icon-btn{flex:0 0 auto;border:0;background:transparent;cursor:pointer;padding:.25rem .35rem;font:inherit;font-size:1.05rem;color:var(--text-color, #333);border-radius:4px}.sc-icon-btn:hover{background:var(--surface-200, #e9ecef)}.sc-icon-btn.active{color:var(--primary-color, #2196f3);font-weight:700}.sc-icon-btn:disabled{opacity:.5;cursor:default}.sc-small-btn{margin-left:auto;border:1px solid var(--surface-border, #ced4da);background:var(--surface-0, #fff);border-radius:4px;padding:.2rem .6rem;font:inherit;font-size:.8rem;cursor:pointer}:host ::ng-deep .sc-group-heading{font-size:.7rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase;opacity:.7}.sc-group-list,.sc-gene-tree{max-height:16rem;overflow-y:auto;border:1px solid var(--surface-border, #dee2e6);border-radius:4px;padding:.25rem .4rem}.sc-group-row,.sc-gene-row{display:flex;align-items:center;gap:.45rem;padding:.15rem 0;font-size:.88rem}.sc-group-row .sc-group-label,.sc-gene-row .sc-group-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-group-all,.sc-gene-root,.sc-gene-group{font-weight:600}.sc-group-all .sc-icon-btn,.sc-gene-root .sc-icon-btn,.sc-gene-group .sc-icon-btn{margin-left:auto;font-size:.85rem}.sc-count{flex:0 0 auto;font-size:.78rem;color:var(--text-color-secondary, #6c757d)}.sc-glyph-option{display:inline-flex;align-items:center;gap:.4rem}.sc-glyph-svg{width:1rem;height:1rem;fill:currentColor}:host ::ng-deep .sc-glyph-pick .p-dropdown-label{padding:.2rem .4rem}.sc-color-input{width:2.5rem;height:1.8rem;border:1px solid var(--surface-border, #ced4da);border-radius:4px;padding:0;background:none}.sc-row-number p-slider,.sc-row-range p-slider{flex:1 1 0;min-width:0}:host ::ng-deep .sc-num{width:4.5rem;padding:.3rem .4rem;text-align:center}:host ::ng-deep .sc-row-number p-inputnumber,:host ::ng-deep .sc-row-range p-inputnumber{flex:0 0 auto}.sc-gene-icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:1.4rem;height:1.4rem;padding:0;border:1px solid transparent;border-radius:4px;background:transparent;cursor:pointer}.sc-gene-icon:hover,.sc-gene-icon:focus-visible{border-color:var(--surface-border, rgba(0, 0, 0, .2))}:host{display:contents}.sc-dot{flex:0 0 auto;width:.7rem;height:.7rem;border-radius:50%;border:1px solid rgba(0,0,0,.2)}.sc-dot-btn{padding:0;cursor:pointer}.sc-dot-btn:hover,.sc-dot-btn:focus-visible{outline:2px solid var(--surface-border, rgba(0, 0, 0, .35));outline-offset:1px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SharedModule }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: CheckboxModule }, { kind: "component", type: i4.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i5.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "autoShowPanelOnPrintableCharacterKeyDown", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: OverlayPanelModule }, { kind: "component", type: i6.OverlayPanel, selector: "p-overlayPanel", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "component", type: SpatialGeneStyleComponent, selector: "spatial-gene-style", inputs: ["gene", "what", "color", "glyph", "iconHint", "showIcons"], outputs: ["colorChange", "glyphChange", "resetStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
250
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: SpatialGroupsPanelComponent, isStandalone: true, selector: "spatial-groups-panel", inputs: { controls: "controls", dataset: "dataset", view: "view", selectedCategory: "selectedCategory" }, outputs: { categoryClicked: "categoryClicked" }, usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"groupOptions.length\">\n <div class=\"sc-subhead\">Groups</div>\n <div class=\"sc-row sc-row-picker\">\n <p-dropdown\n [options]=\"groupOptions\"\n [group]=\"true\"\n optionLabel=\"label\"\n optionValue=\"value\"\n optionGroupLabel=\"label\"\n optionGroupChildren=\"items\"\n [ngModel]=\"activeGroupEntry\"\n (ngModelChange)=\"onGroupEntry($event)\"\n appendTo=\"body\"\n styleClass=\"sc-full\"\n >\n <ng-template let-group pTemplate=\"group\">\n <span class=\"sc-group-heading\">{{ group.label }}</span>\n </ng-template>\n </p-dropdown>\n <p-dropdown\n *ngIf=\"groupVariantOptions.length\"\n [options]=\"groupVariantOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n styleClass=\"sc-variant\"\n [ngModel]=\"activeCellTypeColumn\"\n (ngModelChange)=\"onGroupVariant($event)\"\n appendTo=\"body\"\n ></p-dropdown>\n <button\n *ngIf=\"canImportGroups\"\n type=\"button\"\n class=\"sc-icon-btn\"\n [disabled]=\"groupImporting\"\n (click)=\"groupFile.click()\"\n title=\"Import cell groups (CSV of cell_id, group)\"\n >\n <i\n class=\"pi\"\n [class.pi-plus-circle]=\"!groupImporting\"\n [class.pi-spin]=\"groupImporting\"\n [class.pi-spinner]=\"groupImporting\"\n ></i>\n </button>\n <input #groupFile type=\"file\" accept=\".csv,.tsv,.txt\" hidden (change)=\"onImportGroupsFile(groupFile)\" />\n </div>\n <small class=\"sc-hint sc-error\" *ngIf=\"groupImportError\">{{ groupImportError }}</small>\n\n <div class=\"sc-group-list\" *ngIf=\"groupRows.length\">\n <div class=\"sc-group-row sc-group-all\">\n <p-checkbox\n [binary]=\"true\"\n [ngModel]=\"allGroupsShown\"\n (onChange)=\"onAllGroupsShown($event.checked)\"\n ></p-checkbox>\n <span class=\"sc-group-label\">All groups</span>\n <span class=\"sc-count\">({{ groupTotal | number }})</span>\n <button type=\"button\" class=\"sc-icon-btn\" (click)=\"groupsExpanded = !groupsExpanded\">\n <i class=\"pi\" [class.pi-chevron-down]=\"groupsExpanded\" [class.pi-chevron-right]=\"!groupsExpanded\"></i>\n </button>\n </div>\n <ng-container *ngIf=\"groupsExpanded\">\n <div class=\"sc-group-row\" *ngFor=\"let row of groupRows; trackBy: trackByLabel\">\n <p-checkbox\n [binary]=\"true\"\n [ngModel]=\"isGroupShown(row.label)\"\n (onChange)=\"onGroupShown(row.label, $event.checked)\"\n ></p-checkbox>\n <!-- The group's colour; clicking it opens the colour picker. -->\n <button\n type=\"button\"\n class=\"sc-dot sc-dot-btn\"\n [style.background]=\"row.color\"\n [attr.aria-label]=\"'Colour for ' + row.label\"\n title=\"Colour\"\n (click)=\"openGroupStyle($event, row.label, groupPop)\"\n ></button>\n <!-- The name selects the group's observations; again, clears. -->\n <button\n type=\"button\"\n class=\"sc-group-label sc-group-select\"\n [class.selected]=\"selectedCategory !== null && selectedCategory === codeOf(row.label)\"\n [title]=\"'Select ' + row.label\"\n (click)=\"onGroupClicked(row.label)\"\n >\n {{ row.label }}\n </button>\n <span class=\"sc-count\">({{ row.count | number }})</span>\n </div>\n </ng-container>\n </div>\n <!-- One picker for every group row, filled for the group that opened it. -->\n <p-overlayPanel #groupPop styleClass=\"sc-gene-style\" appendTo=\"body\">\n <ng-template pTemplate=\"content\">\n <spatial-gene-style\n *ngIf=\"styleGroup as group\"\n [gene]=\"group\"\n what=\"Group\"\n [color]=\"groupColorOf(group)\"\n [showIcons]=\"false\"\n (colorChange)=\"onGroupColor(group, $event)\"\n (resetStyle)=\"resetGroupColor(group)\"\n ></spatial-gene-style>\n </ng-template>\n </p-overlayPanel>\n</ng-container>\n", styles: [".sc-hint{font-size:.75rem;color:var(--text-color-secondary, #6c757d)}.sc-error{color:var(--red-600, #c62828)}.sc-section{display:flex;flex-direction:column;gap:.35rem}.sc-lbl{font-size:.78rem;color:var(--text-color-secondary, #6c757d);white-space:nowrap}.sc-row{display:flex;align-items:center;gap:.6rem}.sc-row p-slider,.sc-row p-dropdown,.sc-row p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row p-slider .p-slider{width:100%}:host ::ng-deep .sc-row p-dropdown .p-dropdown,:host ::ng-deep .sc-row p-treeSelect .p-treeselect{width:100%}.sc-row .sc-lbl{flex:0 0 calc(50% - .6rem);min-width:0;overflow:hidden;text-overflow:ellipsis}.sc-cmap-option{display:inline-flex;align-items:center;gap:.4rem}.sc-cmap-swatch{width:3.5rem;height:.7rem;border-radius:2px;display:block}.sc-val{flex:0 0 4rem;text-align:right;font-size:.78rem;font-variant-numeric:tabular-nums;white-space:nowrap}:host ::ng-deep .sc-full,:host ::ng-deep .sc-full .p-dropdown,:host ::ng-deep .sc-full .p-autocomplete,:host ::ng-deep .sc-full input{width:100%}.sc-colorbar{height:.75rem;border-radius:2px;border:1px solid rgba(0,0,0,.2)}.sc-colorbar-ends{display:flex;justify-content:space-between;font-size:.7rem;color:var(--text-color-secondary, #6c757d);margin-top:.2rem}.sc-panel{border:1px solid var(--surface-border, #dee2e6);border-radius:6px;margin-bottom:.5rem;overflow:hidden}.sc-panel-head{display:flex;align-items:center;gap:.6rem;padding:.5rem .7rem;cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--surface-100, #f5f6f7)}.sc-panel-head .sc-panel-title{flex:1;font-weight:600}.sc-panel.open>.sc-panel-head{background:var(--primary-color, #2196f3);color:var(--primary-color-text, #fff)}.sc-panel-body{display:flex;flex-direction:column;gap:.45rem;padding:.6rem .75rem .75rem}.sc-subhead{display:flex;align-items:center;gap:.5rem;margin-top:.4rem;font-size:.72rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-color-secondary, #6c757d)}.sc-subhead:after{content:\"\";flex:1;border-top:1px solid var(--surface-border, #dee2e6)}.sc-subsection{display:flex;flex-direction:column;gap:.45rem}.sc-subsection-head{cursor:pointer;-webkit-user-select:none;user-select:none}.sc-subsection-head i{font-size:.65rem}.sc-subsection-head:hover .sc-subsection-title{color:var(--primary-color, #3b82f6)}.sc-subsection-body{display:flex;flex-direction:column;gap:.45rem;padding-left:.6rem;border-left:2px solid var(--surface-border, #dee2e6)}:host ::ng-deep .sc-buttons .p-button{padding:.35rem .75rem;font-size:.85rem}.sc-row-picker p-dropdown,.sc-row-picker p-multiSelect,.sc-row-picker p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row-picker .sc-variant{width:6.5rem}:host ::ng-deep .sc-row-picker p-multiselect .p-multiselect{width:100%}:host ::ng-deep .sc-row-picker p-dropdown:has(.sc-variant){flex:0 0 6.5rem}:host ::ng-deep .sc-row-picker p-treeselect:has(.sc-palette){flex:0 0 3rem}:host ::ng-deep .sc-palette .p-treeselect-label{width:0;padding:0}.sc-icon-btn{flex:0 0 auto;border:0;background:transparent;cursor:pointer;padding:.25rem .35rem;font:inherit;font-size:1.05rem;color:var(--text-color, #333);border-radius:4px}.sc-icon-btn:hover{background:var(--surface-200, #e9ecef)}.sc-icon-btn.active{color:var(--primary-color, #2196f3);font-weight:700}.sc-icon-btn:disabled{opacity:.5;cursor:default}.sc-small-btn{margin-left:auto;border:1px solid var(--surface-border, #ced4da);background:var(--surface-0, #fff);border-radius:4px;padding:.2rem .6rem;font:inherit;font-size:.8rem;cursor:pointer}:host ::ng-deep .sc-group-heading{font-size:.7rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase;opacity:.7}.sc-group-list,.sc-gene-tree{max-height:16rem;overflow-y:auto;border:1px solid var(--surface-border, #dee2e6);border-radius:4px;padding:.25rem .4rem}.sc-group-row,.sc-gene-row{display:flex;align-items:center;gap:.45rem;padding:.15rem 0;font-size:.88rem}.sc-group-row .sc-group-label,.sc-gene-row .sc-group-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-group-all,.sc-gene-root,.sc-gene-group{font-weight:600}.sc-group-all .sc-icon-btn,.sc-gene-root .sc-icon-btn,.sc-gene-group .sc-icon-btn{margin-left:auto;font-size:.85rem}.sc-count{flex:0 0 auto;font-size:.78rem;color:var(--text-color-secondary, #6c757d)}.sc-glyph-option{display:inline-flex;align-items:center;gap:.4rem}.sc-glyph-svg{width:1rem;height:1rem;fill:currentColor}:host ::ng-deep .sc-glyph-pick .p-dropdown-label{padding:.2rem .4rem}.sc-color-input{width:2.5rem;height:1.8rem;border:1px solid var(--surface-border, #ced4da);border-radius:4px;padding:0;background:none}.sc-row-number p-slider,.sc-row-range p-slider{flex:1 1 0;min-width:0}:host ::ng-deep .sc-num{width:4.5rem;padding:.3rem .4rem;text-align:center}:host ::ng-deep .sc-row-number p-inputnumber,:host ::ng-deep .sc-row-range p-inputnumber{flex:0 0 auto}.sc-gene-icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:1.4rem;height:1.4rem;padding:0;border:1px solid transparent;border-radius:4px;background:transparent;cursor:pointer}.sc-gene-icon:hover,.sc-gene-icon:focus-visible{border-color:var(--surface-border, rgba(0, 0, 0, .2))}.sc-seltx-toggle{width:100%;padding:0;background:none;border:0;cursor:pointer;font-family:inherit;text-align:left}.sc-seltx-toggle i{font-size:.65rem}.sc-seltx-toggle:hover{color:var(--primary-color, #3b82f6)}.sc-seltx{display:flex;flex-direction:column;gap:.35rem}.sc-seltx-head{display:flex;align-items:baseline;gap:.5rem;min-width:0}.sc-seltx-label{font-size:.82rem;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-seltx-summary{display:flex;align-items:center;justify-content:space-between;font-size:.78rem}.sc-seltx-list{list-style:none;margin:0;padding:0;max-height:16rem;overflow-y:auto;font-size:.78rem}.sc-seltx-list.stale{opacity:.55}.sc-seltx-list li{display:grid;grid-template-columns:minmax(4rem,7rem) 1fr auto;align-items:center;gap:.5rem;padding:.1rem 0}.sc-seltx-gene{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-seltx-bar{height:.45rem;border-radius:2px;background:var(--surface-200, #e9ecef);overflow:hidden}.sc-seltx-bar span{display:block;height:100%;background:var(--primary-color, #3b82f6)}.sc-seltx-count{font-variant-numeric:tabular-nums;text-align:right;min-width:3rem}.sc-seltx-swatch{display:inline-block;width:.6rem;height:.6rem;margin-right:.35rem;border-radius:2px;vertical-align:baseline}.sc-seltx-measures{display:grid;grid-template-columns:minmax(4rem,1fr) auto;gap:.1rem .75rem;margin:0;font-size:.78rem}.sc-seltx-measures dt{color:var(--text-color-secondary, #6c757d);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-seltx-measures dd{margin:0;text-align:right;font-variant-numeric:tabular-nums}:host{display:contents}.sc-dot{flex:0 0 auto;width:.7rem;height:.7rem;border-radius:50%;border:1px solid rgba(0,0,0,.2)}.sc-dot-btn{padding:0;cursor:pointer}.sc-dot-btn:hover,.sc-dot-btn:focus-visible{outline:2px solid var(--surface-border, rgba(0, 0, 0, .35));outline-offset:1px}.sc-group-select{padding:0 .2rem;border:0;border-radius:3px;background:none;color:inherit;font:inherit;text-align:left;cursor:pointer}.sc-group-select:hover{background:var(--surface-hover, rgba(0, 0, 0, .05))}.sc-group-select.selected{background:var(--highlight-bg, rgba(33, 150, 243, .15));font-weight:600}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SharedModule }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: CheckboxModule }, { kind: "component", type: i4.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i5.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "autoShowPanelOnPrintableCharacterKeyDown", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: OverlayPanelModule }, { kind: "component", type: i6.OverlayPanel, selector: "p-overlayPanel", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "component", type: SpatialGeneStyleComponent, selector: "spatial-gene-style", inputs: ["gene", "what", "color", "glyph", "iconHint", "showIcons"], outputs: ["colorChange", "glyphChange", "resetStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
227
251
  }
228
252
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SpatialGroupsPanelComponent, decorators: [{
229
253
  type: Component,
@@ -235,12 +259,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
235
259
  DropdownModule,
236
260
  OverlayPanelModule,
237
261
  SpatialGeneStyleComponent,
238
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"groupOptions.length\">\n <div class=\"sc-subhead\">Groups</div>\n <div class=\"sc-row sc-row-picker\">\n <p-dropdown\n [options]=\"groupOptions\"\n [group]=\"true\"\n optionLabel=\"label\"\n optionValue=\"value\"\n optionGroupLabel=\"label\"\n optionGroupChildren=\"items\"\n [ngModel]=\"activeGroupEntry\"\n (ngModelChange)=\"onGroupEntry($event)\"\n appendTo=\"body\"\n styleClass=\"sc-full\"\n >\n <ng-template let-group pTemplate=\"group\">\n <span class=\"sc-group-heading\">{{ group.label }}</span>\n </ng-template>\n </p-dropdown>\n <p-dropdown\n *ngIf=\"groupVariantOptions.length\"\n [options]=\"groupVariantOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n styleClass=\"sc-variant\"\n [ngModel]=\"activeCellTypeColumn\"\n (ngModelChange)=\"onGroupVariant($event)\"\n appendTo=\"body\"\n ></p-dropdown>\n <button\n *ngIf=\"canImportGroups\"\n type=\"button\"\n class=\"sc-icon-btn\"\n [disabled]=\"groupImporting\"\n (click)=\"groupFile.click()\"\n title=\"Import cell groups (CSV of cell_id, group)\"\n >\n <i\n class=\"pi\"\n [class.pi-plus-circle]=\"!groupImporting\"\n [class.pi-spin]=\"groupImporting\"\n [class.pi-spinner]=\"groupImporting\"\n ></i>\n </button>\n <input #groupFile type=\"file\" accept=\".csv,.tsv,.txt\" hidden (change)=\"onImportGroupsFile(groupFile)\" />\n </div>\n <small class=\"sc-hint sc-error\" *ngIf=\"groupImportError\">{{ groupImportError }}</small>\n\n <div class=\"sc-group-list\" *ngIf=\"groupRows.length\">\n <div class=\"sc-group-row sc-group-all\">\n <p-checkbox\n [binary]=\"true\"\n [ngModel]=\"allGroupsShown\"\n (onChange)=\"onAllGroupsShown($event.checked)\"\n ></p-checkbox>\n <span class=\"sc-group-label\">All groups</span>\n <span class=\"sc-count\">({{ groupTotal | number }})</span>\n <button type=\"button\" class=\"sc-icon-btn\" (click)=\"groupsExpanded = !groupsExpanded\">\n <i class=\"pi\" [class.pi-chevron-down]=\"groupsExpanded\" [class.pi-chevron-right]=\"!groupsExpanded\"></i>\n </button>\n </div>\n <ng-container *ngIf=\"groupsExpanded\">\n <div class=\"sc-group-row\" *ngFor=\"let row of groupRows; trackBy: trackByLabel\">\n <p-checkbox\n [binary]=\"true\"\n [ngModel]=\"isGroupShown(row.label)\"\n (onChange)=\"onGroupShown(row.label, $event.checked)\"\n ></p-checkbox>\n <!-- The group's colour; clicking it opens the colour picker. -->\n <button\n type=\"button\"\n class=\"sc-dot sc-dot-btn\"\n [style.background]=\"row.color\"\n [attr.aria-label]=\"'Colour for ' + row.label\"\n title=\"Colour\"\n (click)=\"openGroupStyle($event, row.label, groupPop)\"\n ></button>\n <span class=\"sc-group-label\" [title]=\"row.label\">{{ row.label }}</span>\n <span class=\"sc-count\">({{ row.count | number }})</span>\n </div>\n </ng-container>\n </div>\n <!-- One picker for every group row, filled for the group that opened it. -->\n <p-overlayPanel #groupPop styleClass=\"sc-gene-style\" appendTo=\"body\">\n <ng-template pTemplate=\"content\">\n <spatial-gene-style\n *ngIf=\"styleGroup as group\"\n [gene]=\"group\"\n what=\"Group\"\n [color]=\"groupColorOf(group)\"\n [showIcons]=\"false\"\n (colorChange)=\"onGroupColor(group, $event)\"\n (resetStyle)=\"resetGroupColor(group)\"\n ></spatial-gene-style>\n </ng-template>\n </p-overlayPanel>\n</ng-container>\n", styles: [".sc-hint{font-size:.75rem;color:var(--text-color-secondary, #6c757d)}.sc-error{color:var(--red-600, #c62828)}.sc-section{display:flex;flex-direction:column;gap:.35rem}.sc-lbl{font-size:.78rem;color:var(--text-color-secondary, #6c757d);white-space:nowrap}.sc-row{display:flex;align-items:center;gap:.6rem}.sc-row p-slider,.sc-row p-dropdown,.sc-row p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row p-slider .p-slider{width:100%}:host ::ng-deep .sc-row p-dropdown .p-dropdown,:host ::ng-deep .sc-row p-treeSelect .p-treeselect{width:100%}.sc-row .sc-lbl{flex:0 0 calc(50% - .6rem);min-width:0;overflow:hidden;text-overflow:ellipsis}.sc-cmap-option{display:inline-flex;align-items:center;gap:.4rem}.sc-cmap-swatch{width:3.5rem;height:.7rem;border-radius:2px;display:block}.sc-val{flex:0 0 4rem;text-align:right;font-size:.78rem;font-variant-numeric:tabular-nums;white-space:nowrap}:host ::ng-deep .sc-full,:host ::ng-deep .sc-full .p-dropdown,:host ::ng-deep .sc-full .p-autocomplete,:host ::ng-deep .sc-full input{width:100%}.sc-colorbar{height:.75rem;border-radius:2px;border:1px solid rgba(0,0,0,.2)}.sc-colorbar-ends{display:flex;justify-content:space-between;font-size:.7rem;color:var(--text-color-secondary, #6c757d);margin-top:.2rem}.sc-panel{border:1px solid var(--surface-border, #dee2e6);border-radius:6px;margin-bottom:.5rem;overflow:hidden}.sc-panel-head{display:flex;align-items:center;gap:.6rem;padding:.5rem .7rem;cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--surface-100, #f5f6f7)}.sc-panel-head .sc-panel-title{flex:1;font-weight:600}.sc-panel.open>.sc-panel-head{background:var(--primary-color, #2196f3);color:var(--primary-color-text, #fff)}.sc-panel-body{display:flex;flex-direction:column;gap:.45rem;padding:.6rem .75rem .75rem}.sc-subhead{display:flex;align-items:center;gap:.5rem;margin-top:.4rem;font-size:.72rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-color-secondary, #6c757d)}.sc-subhead:after{content:\"\";flex:1;border-top:1px solid var(--surface-border, #dee2e6)}:host ::ng-deep .sc-buttons .p-button{padding:.35rem .75rem;font-size:.85rem}.sc-row-picker p-dropdown,.sc-row-picker p-multiSelect,.sc-row-picker p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row-picker .sc-variant{width:6.5rem}:host ::ng-deep .sc-row-picker p-multiselect .p-multiselect{width:100%}:host ::ng-deep .sc-row-picker p-dropdown:has(.sc-variant){flex:0 0 6.5rem}:host ::ng-deep .sc-row-picker p-treeselect:has(.sc-palette){flex:0 0 3rem}:host ::ng-deep .sc-palette .p-treeselect-label{width:0;padding:0}.sc-icon-btn{flex:0 0 auto;border:0;background:transparent;cursor:pointer;padding:.25rem .35rem;font:inherit;font-size:1.05rem;color:var(--text-color, #333);border-radius:4px}.sc-icon-btn:hover{background:var(--surface-200, #e9ecef)}.sc-icon-btn.active{color:var(--primary-color, #2196f3);font-weight:700}.sc-icon-btn:disabled{opacity:.5;cursor:default}.sc-small-btn{margin-left:auto;border:1px solid var(--surface-border, #ced4da);background:var(--surface-0, #fff);border-radius:4px;padding:.2rem .6rem;font:inherit;font-size:.8rem;cursor:pointer}:host ::ng-deep .sc-group-heading{font-size:.7rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase;opacity:.7}.sc-group-list,.sc-gene-tree{max-height:16rem;overflow-y:auto;border:1px solid var(--surface-border, #dee2e6);border-radius:4px;padding:.25rem .4rem}.sc-group-row,.sc-gene-row{display:flex;align-items:center;gap:.45rem;padding:.15rem 0;font-size:.88rem}.sc-group-row .sc-group-label,.sc-gene-row .sc-group-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-group-all,.sc-gene-root,.sc-gene-group{font-weight:600}.sc-group-all .sc-icon-btn,.sc-gene-root .sc-icon-btn,.sc-gene-group .sc-icon-btn{margin-left:auto;font-size:.85rem}.sc-count{flex:0 0 auto;font-size:.78rem;color:var(--text-color-secondary, #6c757d)}.sc-glyph-option{display:inline-flex;align-items:center;gap:.4rem}.sc-glyph-svg{width:1rem;height:1rem;fill:currentColor}:host ::ng-deep .sc-glyph-pick .p-dropdown-label{padding:.2rem .4rem}.sc-color-input{width:2.5rem;height:1.8rem;border:1px solid var(--surface-border, #ced4da);border-radius:4px;padding:0;background:none}.sc-row-number p-slider,.sc-row-range p-slider{flex:1 1 0;min-width:0}:host ::ng-deep .sc-num{width:4.5rem;padding:.3rem .4rem;text-align:center}:host ::ng-deep .sc-row-number p-inputnumber,:host ::ng-deep .sc-row-range p-inputnumber{flex:0 0 auto}.sc-gene-icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:1.4rem;height:1.4rem;padding:0;border:1px solid transparent;border-radius:4px;background:transparent;cursor:pointer}.sc-gene-icon:hover,.sc-gene-icon:focus-visible{border-color:var(--surface-border, rgba(0, 0, 0, .2))}:host{display:contents}.sc-dot{flex:0 0 auto;width:.7rem;height:.7rem;border-radius:50%;border:1px solid rgba(0,0,0,.2)}.sc-dot-btn{padding:0;cursor:pointer}.sc-dot-btn:hover,.sc-dot-btn:focus-visible{outline:2px solid var(--surface-border, rgba(0, 0, 0, .35));outline-offset:1px}\n"] }]
262
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"groupOptions.length\">\n <div class=\"sc-subhead\">Groups</div>\n <div class=\"sc-row sc-row-picker\">\n <p-dropdown\n [options]=\"groupOptions\"\n [group]=\"true\"\n optionLabel=\"label\"\n optionValue=\"value\"\n optionGroupLabel=\"label\"\n optionGroupChildren=\"items\"\n [ngModel]=\"activeGroupEntry\"\n (ngModelChange)=\"onGroupEntry($event)\"\n appendTo=\"body\"\n styleClass=\"sc-full\"\n >\n <ng-template let-group pTemplate=\"group\">\n <span class=\"sc-group-heading\">{{ group.label }}</span>\n </ng-template>\n </p-dropdown>\n <p-dropdown\n *ngIf=\"groupVariantOptions.length\"\n [options]=\"groupVariantOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n styleClass=\"sc-variant\"\n [ngModel]=\"activeCellTypeColumn\"\n (ngModelChange)=\"onGroupVariant($event)\"\n appendTo=\"body\"\n ></p-dropdown>\n <button\n *ngIf=\"canImportGroups\"\n type=\"button\"\n class=\"sc-icon-btn\"\n [disabled]=\"groupImporting\"\n (click)=\"groupFile.click()\"\n title=\"Import cell groups (CSV of cell_id, group)\"\n >\n <i\n class=\"pi\"\n [class.pi-plus-circle]=\"!groupImporting\"\n [class.pi-spin]=\"groupImporting\"\n [class.pi-spinner]=\"groupImporting\"\n ></i>\n </button>\n <input #groupFile type=\"file\" accept=\".csv,.tsv,.txt\" hidden (change)=\"onImportGroupsFile(groupFile)\" />\n </div>\n <small class=\"sc-hint sc-error\" *ngIf=\"groupImportError\">{{ groupImportError }}</small>\n\n <div class=\"sc-group-list\" *ngIf=\"groupRows.length\">\n <div class=\"sc-group-row sc-group-all\">\n <p-checkbox\n [binary]=\"true\"\n [ngModel]=\"allGroupsShown\"\n (onChange)=\"onAllGroupsShown($event.checked)\"\n ></p-checkbox>\n <span class=\"sc-group-label\">All groups</span>\n <span class=\"sc-count\">({{ groupTotal | number }})</span>\n <button type=\"button\" class=\"sc-icon-btn\" (click)=\"groupsExpanded = !groupsExpanded\">\n <i class=\"pi\" [class.pi-chevron-down]=\"groupsExpanded\" [class.pi-chevron-right]=\"!groupsExpanded\"></i>\n </button>\n </div>\n <ng-container *ngIf=\"groupsExpanded\">\n <div class=\"sc-group-row\" *ngFor=\"let row of groupRows; trackBy: trackByLabel\">\n <p-checkbox\n [binary]=\"true\"\n [ngModel]=\"isGroupShown(row.label)\"\n (onChange)=\"onGroupShown(row.label, $event.checked)\"\n ></p-checkbox>\n <!-- The group's colour; clicking it opens the colour picker. -->\n <button\n type=\"button\"\n class=\"sc-dot sc-dot-btn\"\n [style.background]=\"row.color\"\n [attr.aria-label]=\"'Colour for ' + row.label\"\n title=\"Colour\"\n (click)=\"openGroupStyle($event, row.label, groupPop)\"\n ></button>\n <!-- The name selects the group's observations; again, clears. -->\n <button\n type=\"button\"\n class=\"sc-group-label sc-group-select\"\n [class.selected]=\"selectedCategory !== null && selectedCategory === codeOf(row.label)\"\n [title]=\"'Select ' + row.label\"\n (click)=\"onGroupClicked(row.label)\"\n >\n {{ row.label }}\n </button>\n <span class=\"sc-count\">({{ row.count | number }})</span>\n </div>\n </ng-container>\n </div>\n <!-- One picker for every group row, filled for the group that opened it. -->\n <p-overlayPanel #groupPop styleClass=\"sc-gene-style\" appendTo=\"body\">\n <ng-template pTemplate=\"content\">\n <spatial-gene-style\n *ngIf=\"styleGroup as group\"\n [gene]=\"group\"\n what=\"Group\"\n [color]=\"groupColorOf(group)\"\n [showIcons]=\"false\"\n (colorChange)=\"onGroupColor(group, $event)\"\n (resetStyle)=\"resetGroupColor(group)\"\n ></spatial-gene-style>\n </ng-template>\n </p-overlayPanel>\n</ng-container>\n", styles: [".sc-hint{font-size:.75rem;color:var(--text-color-secondary, #6c757d)}.sc-error{color:var(--red-600, #c62828)}.sc-section{display:flex;flex-direction:column;gap:.35rem}.sc-lbl{font-size:.78rem;color:var(--text-color-secondary, #6c757d);white-space:nowrap}.sc-row{display:flex;align-items:center;gap:.6rem}.sc-row p-slider,.sc-row p-dropdown,.sc-row p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row p-slider .p-slider{width:100%}:host ::ng-deep .sc-row p-dropdown .p-dropdown,:host ::ng-deep .sc-row p-treeSelect .p-treeselect{width:100%}.sc-row .sc-lbl{flex:0 0 calc(50% - .6rem);min-width:0;overflow:hidden;text-overflow:ellipsis}.sc-cmap-option{display:inline-flex;align-items:center;gap:.4rem}.sc-cmap-swatch{width:3.5rem;height:.7rem;border-radius:2px;display:block}.sc-val{flex:0 0 4rem;text-align:right;font-size:.78rem;font-variant-numeric:tabular-nums;white-space:nowrap}:host ::ng-deep .sc-full,:host ::ng-deep .sc-full .p-dropdown,:host ::ng-deep .sc-full .p-autocomplete,:host ::ng-deep .sc-full input{width:100%}.sc-colorbar{height:.75rem;border-radius:2px;border:1px solid rgba(0,0,0,.2)}.sc-colorbar-ends{display:flex;justify-content:space-between;font-size:.7rem;color:var(--text-color-secondary, #6c757d);margin-top:.2rem}.sc-panel{border:1px solid var(--surface-border, #dee2e6);border-radius:6px;margin-bottom:.5rem;overflow:hidden}.sc-panel-head{display:flex;align-items:center;gap:.6rem;padding:.5rem .7rem;cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--surface-100, #f5f6f7)}.sc-panel-head .sc-panel-title{flex:1;font-weight:600}.sc-panel.open>.sc-panel-head{background:var(--primary-color, #2196f3);color:var(--primary-color-text, #fff)}.sc-panel-body{display:flex;flex-direction:column;gap:.45rem;padding:.6rem .75rem .75rem}.sc-subhead{display:flex;align-items:center;gap:.5rem;margin-top:.4rem;font-size:.72rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-color-secondary, #6c757d)}.sc-subhead:after{content:\"\";flex:1;border-top:1px solid var(--surface-border, #dee2e6)}.sc-subsection{display:flex;flex-direction:column;gap:.45rem}.sc-subsection-head{cursor:pointer;-webkit-user-select:none;user-select:none}.sc-subsection-head i{font-size:.65rem}.sc-subsection-head:hover .sc-subsection-title{color:var(--primary-color, #3b82f6)}.sc-subsection-body{display:flex;flex-direction:column;gap:.45rem;padding-left:.6rem;border-left:2px solid var(--surface-border, #dee2e6)}:host ::ng-deep .sc-buttons .p-button{padding:.35rem .75rem;font-size:.85rem}.sc-row-picker p-dropdown,.sc-row-picker p-multiSelect,.sc-row-picker p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row-picker .sc-variant{width:6.5rem}:host ::ng-deep .sc-row-picker p-multiselect .p-multiselect{width:100%}:host ::ng-deep .sc-row-picker p-dropdown:has(.sc-variant){flex:0 0 6.5rem}:host ::ng-deep .sc-row-picker p-treeselect:has(.sc-palette){flex:0 0 3rem}:host ::ng-deep .sc-palette .p-treeselect-label{width:0;padding:0}.sc-icon-btn{flex:0 0 auto;border:0;background:transparent;cursor:pointer;padding:.25rem .35rem;font:inherit;font-size:1.05rem;color:var(--text-color, #333);border-radius:4px}.sc-icon-btn:hover{background:var(--surface-200, #e9ecef)}.sc-icon-btn.active{color:var(--primary-color, #2196f3);font-weight:700}.sc-icon-btn:disabled{opacity:.5;cursor:default}.sc-small-btn{margin-left:auto;border:1px solid var(--surface-border, #ced4da);background:var(--surface-0, #fff);border-radius:4px;padding:.2rem .6rem;font:inherit;font-size:.8rem;cursor:pointer}:host ::ng-deep .sc-group-heading{font-size:.7rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase;opacity:.7}.sc-group-list,.sc-gene-tree{max-height:16rem;overflow-y:auto;border:1px solid var(--surface-border, #dee2e6);border-radius:4px;padding:.25rem .4rem}.sc-group-row,.sc-gene-row{display:flex;align-items:center;gap:.45rem;padding:.15rem 0;font-size:.88rem}.sc-group-row .sc-group-label,.sc-gene-row .sc-group-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-group-all,.sc-gene-root,.sc-gene-group{font-weight:600}.sc-group-all .sc-icon-btn,.sc-gene-root .sc-icon-btn,.sc-gene-group .sc-icon-btn{margin-left:auto;font-size:.85rem}.sc-count{flex:0 0 auto;font-size:.78rem;color:var(--text-color-secondary, #6c757d)}.sc-glyph-option{display:inline-flex;align-items:center;gap:.4rem}.sc-glyph-svg{width:1rem;height:1rem;fill:currentColor}:host ::ng-deep .sc-glyph-pick .p-dropdown-label{padding:.2rem .4rem}.sc-color-input{width:2.5rem;height:1.8rem;border:1px solid var(--surface-border, #ced4da);border-radius:4px;padding:0;background:none}.sc-row-number p-slider,.sc-row-range p-slider{flex:1 1 0;min-width:0}:host ::ng-deep .sc-num{width:4.5rem;padding:.3rem .4rem;text-align:center}:host ::ng-deep .sc-row-number p-inputnumber,:host ::ng-deep .sc-row-range p-inputnumber{flex:0 0 auto}.sc-gene-icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:1.4rem;height:1.4rem;padding:0;border:1px solid transparent;border-radius:4px;background:transparent;cursor:pointer}.sc-gene-icon:hover,.sc-gene-icon:focus-visible{border-color:var(--surface-border, rgba(0, 0, 0, .2))}.sc-seltx-toggle{width:100%;padding:0;background:none;border:0;cursor:pointer;font-family:inherit;text-align:left}.sc-seltx-toggle i{font-size:.65rem}.sc-seltx-toggle:hover{color:var(--primary-color, #3b82f6)}.sc-seltx{display:flex;flex-direction:column;gap:.35rem}.sc-seltx-head{display:flex;align-items:baseline;gap:.5rem;min-width:0}.sc-seltx-label{font-size:.82rem;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-seltx-summary{display:flex;align-items:center;justify-content:space-between;font-size:.78rem}.sc-seltx-list{list-style:none;margin:0;padding:0;max-height:16rem;overflow-y:auto;font-size:.78rem}.sc-seltx-list.stale{opacity:.55}.sc-seltx-list li{display:grid;grid-template-columns:minmax(4rem,7rem) 1fr auto;align-items:center;gap:.5rem;padding:.1rem 0}.sc-seltx-gene{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-seltx-bar{height:.45rem;border-radius:2px;background:var(--surface-200, #e9ecef);overflow:hidden}.sc-seltx-bar span{display:block;height:100%;background:var(--primary-color, #3b82f6)}.sc-seltx-count{font-variant-numeric:tabular-nums;text-align:right;min-width:3rem}.sc-seltx-swatch{display:inline-block;width:.6rem;height:.6rem;margin-right:.35rem;border-radius:2px;vertical-align:baseline}.sc-seltx-measures{display:grid;grid-template-columns:minmax(4rem,1fr) auto;gap:.1rem .75rem;margin:0;font-size:.78rem}.sc-seltx-measures dt{color:var(--text-color-secondary, #6c757d);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-seltx-measures dd{margin:0;text-align:right;font-variant-numeric:tabular-nums}:host{display:contents}.sc-dot{flex:0 0 auto;width:.7rem;height:.7rem;border-radius:50%;border:1px solid rgba(0,0,0,.2)}.sc-dot-btn{padding:0;cursor:pointer}.sc-dot-btn:hover,.sc-dot-btn:focus-visible{outline:2px solid var(--surface-border, rgba(0, 0, 0, .35));outline-offset:1px}.sc-group-select{padding:0 .2rem;border:0;border-radius:3px;background:none;color:inherit;font:inherit;text-align:left;cursor:pointer}.sc-group-select:hover{background:var(--surface-hover, rgba(0, 0, 0, .05))}.sc-group-select.selected{background:var(--highlight-bg, rgba(33, 150, 243, .15));font-weight:600}\n"] }]
239
263
  }], ctorParameters: () => [{ type: i0.NgZone }, { type: i0.ChangeDetectorRef }], propDecorators: { controls: [{
240
264
  type: Input
241
265
  }], dataset: [{
242
266
  type: Input
243
267
  }], view: [{
244
268
  type: Input
269
+ }], selectedCategory: [{
270
+ type: Input
271
+ }], categoryClicked: [{
272
+ type: Output
245
273
  }] } });
246
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1ncm91cHMtcGFuZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zcGF0aWFsLWNvbnRyb2xzL3NwYXRpYWwtZ3JvdXBzLXBhbmVsL3NwYXRpYWwtZ3JvdXBzLXBhbmVsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC1jb250cm9scy9zcGF0aWFsLWdyb3Vwcy1wYW5lbC9zcGF0aWFsLWdyb3Vwcy1wYW5lbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sR0FHUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUkxRCxPQUFPLEVBQUUsb0JBQW9CLEVBQW9CLE1BQU0sK0JBQStCLENBQUM7QUFDdkYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBQy9GLE9BQU8sRUFDTCxhQUFhLEVBSWIsY0FBYyxFQUNkLGFBQWEsRUFDYixhQUFhLEVBQ2IsWUFBWSxFQUNaLG1CQUFtQixF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Q2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFNoYXJlZE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IENoZWNrYm94TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9jaGVja2JveCc7XG5pbXBvcnQgeyBEcm9wZG93bk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZHJvcGRvd24nO1xuaW1wb3J0IHsgT3ZlcmxheVBhbmVsTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9vdmVybGF5cGFuZWwnO1xuXG5pbXBvcnQgdHlwZSB7IElTcGF0aWFsQ29udHJvbHMgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgdHlwZSB7IFNwYXRpYWxEYXRhc2V0IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgeyBERUZBVUxUX1NQQVRJQUxfVklFVywgU3BhdGlhbFZpZXdTdGF0ZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7IGNlbGxUeXBlQ29sdW1uRm9yIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXRpbGVzJztcbmltcG9ydCB7IGdyb3VwQ29sb3JzS2V5IH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLWVuY29kaW5nJztcbmltcG9ydCB7IFNwYXRpYWxHZW5lU3R5bGVDb21wb25lbnQgfSBmcm9tICcuLi9zcGF0aWFsLWdlbmUtc3R5bGUvc3BhdGlhbC1nZW5lLXN0eWxlLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBGQU1JTFlfUFJFRklYLFxuICBHcm91cE9wdGlvblNlY3Rpb24sXG4gIEdyb3VwUm93LFxuICBQYW5lbE9wdGlvbixcbiAgY291bnRHcm91cFJvd3MsXG4gIGZhbWlseU1lbWJlcnMsXG4gIGdyb3VwRW50cnlGb3IsXG4gIGdyb3VwT3B0aW9ucyxcbiAgZ3JvdXBWYXJpYW50T3B0aW9ucyxcbiAgdG9nZ2xlSGlkZGVuLFxufSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtcGFuZWwtbW9kZWwnO1xuaW1wb3J0IHsgU3VwZXJzZWRlIH0gZnJvbSAnLi4vLi4vdXRpbC9zdXBlcnNlZGUnO1xuXG4vKipcbiAqIFRoZSBjZWxscycgZ3JvdXBpbmcsIGFzIFhlbml1bSBFeHBsb3JlcidzIEdyb3VwcyBzZWN0aW9uOiB0aGUgZ3JvdXAgcGlja2VyIChjb2x1bW5zIHVuZGVyXG4gKiB0aGVpciBzZWN0aW9uIGhlYWRpbmcsIGEgay1tZWFucyBmYW1pbHkgb25jZSwgd2l0aCBpdHMgayBiZXNpZGUgaXQpLCBDU1YgaW1wb3J0IG9mIGEgbmV3XG4gKiBncm91cGluZywgYW5kIHRoZSBncm91cGluZydzIGNhdGVnb3JpZXMgd2l0aCB0aGVpciBjb2xvdXJzIChlYWNoIG9uZSdzIHN3YXRjaCBvcGVucyBhIGNvbG91clxuICogcGlja2VyKSwgY2VsbCBjb3VudHMgYW5kIHNob3cvaGlkZSBzd2l0Y2hlcy5cbiAqXG4gKiBXcml0ZXMgb25seSB0aHJvdWdoIGBjb250cm9scy5zZXRWaWV3U3RhdGVgIChgY2VsbFR5cGVDb2x1bW5gLCBgaGlkZGVuR3JvdXBzYCwgYGdyb3VwQ29sb3JzYCkuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NwYXRpYWwtZ3JvdXBzLXBhbmVsJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBTaGFyZWRNb2R1bGUsXG4gICAgQ2hlY2tib3hNb2R1bGUsXG4gICAgRHJvcGRvd25Nb2R1bGUsXG4gICAgT3ZlcmxheVBhbmVsTW9kdWxlLFxuICAgIFNwYXRpYWxHZW5lU3R5bGVDb21wb25lbnQsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9zcGF0aWFsLWdyb3Vwcy1wYW5lbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NwYXRpYWwtZ3JvdXBzLXBhbmVsLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTcGF0aWFsR3JvdXBzUGFuZWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAvKiogVGhlIHNwYXRpYWwgY29udHJvbHMgdGhpcyBwYW5lbCByZWFkcyBhbmQgd3JpdGVzIHRocm91Z2g7IG51bGwgd2l0aG91dCBhIGBTUEFUSUFMX0RBVEFfUE9SVGAuICovXG4gIEBJbnB1dCgpIGNvbnRyb2xzOiBJU3BhdGlhbENvbnRyb2xzIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgZGF0YXNldCBvbiBvZmZlciwgb3IgbnVsbC4gKi9cbiAgQElucHV0KCkgZGF0YXNldDogU3BhdGlhbERhdGFzZXQgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBjdXJyZW50IHNwYXRpYWwgdmlldyBzdGF0ZTogd2hhdCBpcyBkcmF3biwgYW5kIGhvdy4gKi9cbiAgQElucHV0KCkgdmlldzogU3BhdGlhbFZpZXdTdGF0ZSA9IERFRkFVTFRfU1BBVElBTF9WSUVXO1xuXG4gIC8qKlxuICAgKiBUaGUgZ3JvdXAgcGlja2VyOiBjYXRlZ29yaWNhbCBjb2x1bW5zIHVuZGVyIHRoZWlyIHNlY3Rpb24gaGVhZGluZywgYSBmYW1pbHkgb2ZcbiAgICogdmFyaWFudHMgKGstbWVhbnMgYXQgayA9IDLigKYxMCkgbGlzdGVkIG9uY2UuIFZhbHVlcyBhcmUgYSBjb2x1bW4gbmFtZSwgb3JcbiAgICogYGZhbWlseTo8aWQ+YCBmb3IgYSBmYW1pbHkuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ3JvdXBPcHRpb25zOiBHcm91cE9wdGlvblNlY3Rpb25bXSA9IFtdO1xuICAvKiogVmFyaWFudHMgb2YgdGhlIGFjdGl2ZSBmYW1pbHkgKGsgPSAy4oCmMTApLCB3aGVuIGEgZmFtaWx5IGlzIGFjdGl2ZS4gKi9cbiAgcHJvdGVjdGVkIGdyb3VwVmFyaWFudE9wdGlvbnM6IFBhbmVsT3B0aW9uPHN0cmluZz5bXSA9IFtdO1xuICAvKiogVGhlIGxhc3QgdmFyaWFudCBjaG9zZW4gcGVyIGZhbWlseSwgc28gc3dpdGNoaW5nIGF3YXkgYW5kIGJhY2sga2VlcHMgay4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBmYW1pbHlDaG9pY2UgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIC8qKiBUaGUgYWN0aXZlIGdyb3VwaW5nJ3MgY2F0ZWdvcmllcyB3aXRoIGNvbG91cnMgYW5kIGNlbGwgY291bnRzLCBsYXJnZXN0IGZpcnN0LiAqL1xuICBwcm90ZWN0ZWQgZ3JvdXBSb3dzOiBHcm91cFJvd1tdID0gW107XG4gIHByb3RlY3RlZCBncm91cFRvdGFsID0gMDtcbiAgcHJvdGVjdGVkIGdyb3Vwc0V4cGFuZGVkID0gdHJ1ZTtcbiAgLyoqIFRoZSBncm91cGluZyB7QGxpbmsgZ3JvdXBSb3dzfSBzaG93cyBvciBpcyBsb2FkaW5nIOKAlCBhIHJlcGVhdCByZXF1ZXN0IGZvciBpdCBpcyBhIG5vLW9wLiAqL1xuICBwcml2YXRlIGdyb3VwUm93c0Zvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBMYXRlc3Qgd2lucyBhbW9uZyBncm91cC1yb3cgbG9hZHMsIHNvIGEgc2xvdyBvbmUgZm9yIGFuIGVhcmxpZXIgZ3JvdXBpbmcgKG9yIHRoZVxuICAgKiAgcHJldmlvdXMgZGF0YXNldCdzIGNvbHVtbiBvZiB0aGUgc2FtZSBuYW1lKSBjYW5ub3QgbGFuZCBvdmVyIHRoZSBjdXJyZW50IG9uZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBncm91cFJvd3NMb2FkID0gbmV3IFN1cGVyc2VkZSgpO1xuICBwcm90ZWN0ZWQgZ3JvdXBJbXBvcnRFcnJvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCBncm91cEltcG9ydGluZyA9IGZhbHNlO1xuICAvKiogVGhlIGdyb3VwIHRoZSBvcGVuIGNvbG91ciBwaWNrZXIgZWRpdHMuICovXG4gIHByb3RlY3RlZCBzdHlsZUdyb3VwOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHpvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICkge31cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3ZpZXcnXSkgdGhpcy5oaWRkZW5Hcm91cHMgPSBuZXcgU2V0KHRoaXMudmlldy5oaWRkZW5Hcm91cHMpO1xuICAgIGlmIChjaGFuZ2VzWydkYXRhc2V0J10pIHtcbiAgICAgIHRoaXMuZ3JvdXBPcHRpb25zID0gZ3JvdXBPcHRpb25zKHRoaXMuZGF0YXNldCk7XG4gICAgICAvLyBBIHNhbWUtbmFtZWQgZ3JvdXBpbmcgb2YgYSBuZXcgZGF0YXNldCBpcyBub3QgdGhlIG9sZCBvbmUuXG4gICAgICB0aGlzLmdyb3VwUm93c0ZvciA9IG51bGw7XG4gICAgfVxuICAgIHZvaWQgdGhpcy5yZWZyZXNoR3JvdXBzKCk7XG4gIH1cblxuICAvKiogVGhlIGNhdGVnb3JpY2FsIGNvbHVtbiB0aGUgY2VsbHMgYXJlIGdyb3VwZWQgYnkuICovXG4gIHByb3RlY3RlZCBnZXQgYWN0aXZlQ2VsbFR5cGVDb2x1bW4oKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YXNldCA/IGNlbGxUeXBlQ29sdW1uRm9yKHRoaXMuZGF0YXNldCwgdGhpcy52aWV3KSA6IG51bGw7XG4gIH1cblxuICAvKiogVGhlIHBpY2tlcidzIHZhbHVlIGZvciB0aGUgYWN0aXZlIGdyb3VwIGNvbHVtbi4gKi9cbiAgcHJvdGVjdGVkIGdldCBhY3RpdmVHcm91cEVudHJ5KCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiBncm91cEVudHJ5Rm9yKHRoaXMuZGF0YXNldCwgdGhpcy5hY3RpdmVDZWxsVHlwZUNvbHVtbik7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Hcm91cEVudHJ5KHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUuc3RhcnRzV2l0aChGQU1JTFlfUFJFRklYKSkge1xuICAgICAgY29uc3QgaWQgPSB2YWx1ZS5zbGljZShGQU1JTFlfUFJFRklYLmxlbmd0aCk7XG4gICAgICBjb25zdCBuYW1lID0gdGhpcy5mYW1pbHlDaG9pY2UuZ2V0KGlkKSA/PyBmYW1pbHlNZW1iZXJzKHRoaXMuZGF0YXNldCwgaWQpWzBdPy5uYW1lO1xuICAgICAgaWYgKG5hbWUpIHRoaXMub25DZWxsVHlwZUNvbHVtbihuYW1lKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vbkNlbGxUeXBlQ29sdW1uKHZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkdyb3VwVmFyaWFudChuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5kYXRhc2V0Py5jb2x1bW5zLmZpbmQoKGMpID0+IGMubmFtZSA9PT0gbmFtZSk7XG4gICAgaWYgKG1ldGE/LmtpbmQgPT09ICdjYXRlZ29yaWNhbCcgJiYgbWV0YS5mYW1pbHkpIHRoaXMuZmFtaWx5Q2hvaWNlLnNldChtZXRhLmZhbWlseS5pZCwgbmFtZSk7XG4gICAgdGhpcy5vbkNlbGxUeXBlQ29sdW1uKG5hbWUpO1xuICB9XG5cbiAgb25DZWxsVHlwZUNvbHVtbihuYW1lOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgLy8gU3dpdGNoZWQtb2ZmIGdyb3VwcyBiZWxvbmcgdG8gdGhlIGdyb3VwaW5nIHRoZXkgd2VyZSBzd2l0Y2hlZCBvZmYgaW4uXG4gICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHsgY2VsbFR5cGVDb2x1bW46IG5hbWUsIGhpZGRlbkdyb3VwczogW10gfSk7XG4gIH1cblxuICAvKioge0BsaW5rIFNwYXRpYWxWaWV3U3RhdGUuaGlkZGVuR3JvdXBzfSBhcyBhIHNldCwgZm9yIHRoZSBwZXItcm93IGNoZWNrcy4gKi9cbiAgcHJpdmF0ZSBoaWRkZW5Hcm91cHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBwcm90ZWN0ZWQgaXNHcm91cFNob3duKGxhYmVsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaGlkZGVuR3JvdXBzLmhhcyhsYWJlbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGFsbEdyb3Vwc1Nob3duKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZpZXcuaGlkZGVuR3JvdXBzLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkdyb3VwU2hvd24obGFiZWw6IHN0cmluZywgb246IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xzPy5zZXRWaWV3U3RhdGUoeyBoaWRkZW5Hcm91cHM6IHRvZ2dsZUhpZGRlbih0aGlzLnZpZXcuaGlkZGVuR3JvdXBzLCBbbGFiZWxdLCBvbikgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25BbGxHcm91cHNTaG93bihvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbHM/LnNldFZpZXdTdGF0ZSh7IGhpZGRlbkdyb3Vwczogb24gPyBbXSA6IHRoaXMuZ3JvdXBSb3dzLm1hcCgocikgPT4gci5sYWJlbCkgfSk7XG4gIH1cblxuICAvLyDilIDilIAgcGVyLWdyb3VwIGNvbG91ciBwaWNrZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJvdGVjdGVkIG9wZW5Hcm91cFN0eWxlKGV2ZW50OiBFdmVudCwgbGFiZWw6IHN0cmluZywgcGFuZWw6IHsgdG9nZ2xlKGU6IEV2ZW50KTogdm9pZDsgaGlkZSgpOiB2b2lkIH0pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdHlsZUdyb3VwID09PSBsYWJlbCkge1xuICAgICAgcGFuZWwudG9nZ2xlKGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zdHlsZUdyb3VwID0gbGFiZWw7XG4gICAgcGFuZWwuaGlkZSgpO1xuICAgIC8vIFJlLW9wZW4gYW5jaG9yZWQgb24gdGhlIHJvdyB0aGF0IHdhcyBjbGlja2VkLCBvbmNlIHRoZSBwYW5lbCBoYXMgY2xvc2VkLlxuICAgIHNldFRpbWVvdXQoKCkgPT4gcGFuZWwudG9nZ2xlKGV2ZW50KSk7XG4gIH1cblxuICAvKiogVGhlIGNvbG91ciBncm91cCBgbGFiZWxgIGlzIGRyYXduIGluIG5vdyAodGhlIHVzZXIncywgZWxzZSB0aGUgY29sdW1uJ3Mgb3IgdGhlIHBhbGV0dGUncykuICovXG4gIHByb3RlY3RlZCBncm91cENvbG9yT2YobGFiZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ3JvdXBSb3dzLmZpbmQoKHIpID0+IHIubGFiZWwgPT09IGxhYmVsKT8uY29sb3IgPz8gJyM5OTk5OTknO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uR3JvdXBDb2xvcihsYWJlbDogc3RyaW5nLCBoZXg6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuYWN0aXZlQ2VsbFR5cGVDb2x1bW47XG4gICAgaWYgKCFjb2x1bW4pIHJldHVybjtcbiAgICBjb25zdCBhbGwgPSB0aGlzLnZpZXcuZ3JvdXBDb2xvcnMgPz8ge307XG4gICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHsgZ3JvdXBDb2xvcnM6IHsgLi4uYWxsLCBbY29sdW1uXTogeyAuLi5hbGxbY29sdW1uXSwgW2xhYmVsXTogaGV4IH0gfSB9KTtcbiAgfVxuXG4gIC8qKiBCYWNrIHRvIHRoZSBncm91cCdzIG93biBjb2xvdXIgKHRoZSBjb2x1bW4ncywgZWxzZSB0aGUgcGFsZXR0ZSdzKS4gKi9cbiAgcHJvdGVjdGVkIHJlc2V0R3JvdXBDb2xvcihsYWJlbDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5hY3RpdmVDZWxsVHlwZUNvbHVtbjtcbiAgICBjb25zdCBvd24gPSBjb2x1bW4gPyB0aGlzLnZpZXcuZ3JvdXBDb2xvcnM/Lltjb2x1bW5dIDogdW5kZWZpbmVkO1xuICAgIGlmICghY29sdW1uIHx8ICFvd24gfHwgIShsYWJlbCBpbiBvd24pKSByZXR1cm47XG4gICAgY29uc3QgcmVzdCA9IHsgLi4ub3duIH07XG4gICAgZGVsZXRlIHJlc3RbbGFiZWxdO1xuICAgIGNvbnN0IGFsbCA9IHsgLi4udGhpcy52aWV3Lmdyb3VwQ29sb3JzIH07XG4gICAgaWYgKE9iamVjdC5rZXlzKHJlc3QpLmxlbmd0aCkgYWxsW2NvbHVtbl0gPSByZXN0O1xuICAgIGVsc2UgZGVsZXRlIGFsbFtjb2x1bW5dO1xuICAgIHRoaXMuY29udHJvbHM/LnNldFZpZXdTdGF0ZSh7IGdyb3VwQ29sb3JzOiBhbGwgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGNhbkltcG9ydEdyb3VwcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmNvbnRyb2xzPy5pbXBvcnRHcm91cHM7XG4gIH1cblxuICAvKiogJysnOiBhIENTVi9UU1Ygb2YgYGNlbGxfaWRgIGFuZCBncm91cCwgbmFtZWQgYWZ0ZXIgdGhlIGZpbGUuICovXG4gIHByb3RlY3RlZCBhc3luYyBvbkltcG9ydEdyb3Vwc0ZpbGUoaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmaWxlID0gaW5wdXQuZmlsZXM/LlswXTtcbiAgICBpbnB1dC52YWx1ZSA9ICcnO1xuICAgIGlmICghZmlsZSB8fCAhdGhpcy5jb250cm9scz8uaW1wb3J0R3JvdXBzKSByZXR1cm47XG4gICAgdGhpcy5ncm91cEltcG9ydEVycm9yID0gbnVsbDtcbiAgICB0aGlzLmdyb3VwSW1wb3J0aW5nID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbGFiZWwgPSBmaWxlLm5hbWUucmVwbGFjZSgvXFwuKGNzdnx0c3Z8dHh0KSQvaSwgJycpO1xuICAgICAgY29uc3QgeyBjb2x1bW4gfSA9IGF3YWl0IHRoaXMuY29udHJvbHMuaW1wb3J0R3JvdXBzKGxhYmVsLCBhd2FpdCBmaWxlLnRleHQoKSk7XG4gICAgICB0aGlzLmFwcGx5KCgpID0+IHRoaXMub25DZWxsVHlwZUNvbHVtbihjb2x1bW4ubmFtZSkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5hcHBseSgoKSA9PiB7XG4gICAgICAgIHRoaXMuZ3JvdXBJbXBvcnRFcnJvciA9IFN0cmluZygoZXJyIGFzIEVycm9yKT8ubWVzc2FnZSA/PyBlcnIpO1xuICAgICAgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuYXBwbHkoKCkgPT4ge1xuICAgICAgICB0aGlzLmdyb3VwSW1wb3J0aW5nID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdHJhY2tCeUxhYmVsID0gKF9pOiBudW1iZXIsIHJvdzogeyBsYWJlbDogc3RyaW5nIH0pID0+IHJvdy5sYWJlbDtcblxuICBwcml2YXRlIHJlZnJlc2hWYXJpYW50cygpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gZ3JvdXBWYXJpYW50T3B0aW9ucyh0aGlzLmRhdGFzZXQsIHRoaXMuYWN0aXZlQ2VsbFR5cGVDb2x1bW4pO1xuICAgIGlmIChKU09OLnN0cmluZ2lmeShuZXh0KSAhPT0gSlNPTi5zdHJpbmdpZnkodGhpcy5ncm91cFZhcmlhbnRPcHRpb25zKSkgdGhpcy5ncm91cFZhcmlhbnRPcHRpb25zID0gbmV4dDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaEdyb3VwcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnJlZnJlc2hWYXJpYW50cygpO1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmFjdGl2ZUNlbGxUeXBlQ29sdW1uO1xuICAgIGlmICghbmFtZSB8fCAhdGhpcy5jb250cm9scykge1xuICAgICAgdGhpcy5ncm91cFJvd3NMb2FkLmNhbmNlbCgpO1xuICAgICAgdGhpcy5ncm91cFJvd3MgPSBbXTtcbiAgICAgIHRoaXMuZ3JvdXBUb3RhbCA9IDA7XG4gICAgICB0aGlzLmdyb3VwUm93c0ZvciA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFRoZSB1c2VyJ3MgY29sb3VycyBmb3IgdGhlIGdyb3VwaW5nIGFyZSBwYXJ0IG9mIHdoYXQgdGhlIHJvd3Mgc2hvdy5cbiAgICBjb25zdCBrZXkgPSBgJHtuYW1lfVxcdTAwMDEke2dyb3VwQ29sb3JzS2V5KG5hbWUsIHRoaXMudmlldy5ncm91cENvbG9ycyl9YDtcbiAgICBpZiAoa2V5ID09PSB0aGlzLmdyb3VwUm93c0ZvcikgcmV0dXJuO1xuICAgIHRoaXMuZ3JvdXBSb3dzRm9yID0ga2V5O1xuICAgIGNvbnN0IHRhc2sgPSB0aGlzLmdyb3VwUm93c0xvYWQubmV4dCgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB2ID0gYXdhaXQgdGhpcy5jb250cm9scy5jYXRlZ29yaWNhbFZpZXcobmFtZSk7XG4gICAgICBpZiAoIXRhc2suaXNDdXJyZW50KCkpIHJldHVybjtcbiAgICAgIGNvbnN0IHsgcm93cywgdG90YWwgfSA9IGNvdW50R3JvdXBSb3dzKHYpO1xuICAgICAgdGhpcy5hcHBseSgoKSA9PiB7XG4gICAgICAgIHRoaXMuZ3JvdXBSb3dzID0gcm93cztcbiAgICAgICAgdGhpcy5ncm91cFRvdGFsID0gdG90YWw7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE9ubHkgdGhlIGN1cnJlbnQgbG9hZCdzIGZhaWx1cmUgcmUtb3BlbnMgdGhlIGtleTogYSBzdXBlcnNlZGVkIG9uZSBjbGVhcmluZyBpdFxuICAgICAgLy8gd291bGQgbWFrZSB0aGUgbmV3ZXIgbG9hZCdzIHJlc3VsdCBsb29rIHN0YWxlIGFuZCBiZSBkcm9wcGVkLlxuICAgICAgaWYgKHRhc2suaXNDdXJyZW50KCkpIHRoaXMuZ3JvdXBSb3dzRm9yID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKiogQXBwbHkgYW4gYXN5bmMgcmVzdWx0IGluc2lkZSB0aGUgem9uZSBhbmQgcmUtcmVuZGVyIHRoaXMgT25QdXNoIHBhbmVsLiAqL1xuICBwcml2YXRlIGFwcGx5KGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICBmbigpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJncm91cE9wdGlvbnMubGVuZ3RoXCI+XG4gIDxkaXYgY2xhc3M9XCJzYy1zdWJoZWFkXCI+R3JvdXBzPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJzYy1yb3cgc2Mtcm93LXBpY2tlclwiPlxuICAgIDxwLWRyb3Bkb3duXG4gICAgICBbb3B0aW9uc109XCJncm91cE9wdGlvbnNcIlxuICAgICAgW2dyb3VwXT1cInRydWVcIlxuICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXG4gICAgICBvcHRpb25WYWx1ZT1cInZhbHVlXCJcbiAgICAgIG9wdGlvbkdyb3VwTGFiZWw9XCJsYWJlbFwiXG4gICAgICBvcHRpb25Hcm91cENoaWxkcmVuPVwiaXRlbXNcIlxuICAgICAgW25nTW9kZWxdPVwiYWN0aXZlR3JvdXBFbnRyeVwiXG4gICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkdyb3VwRW50cnkoJGV2ZW50KVwiXG4gICAgICBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgc3R5bGVDbGFzcz1cInNjLWZ1bGxcIlxuICAgID5cbiAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtZ3JvdXAgcFRlbXBsYXRlPVwiZ3JvdXBcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzYy1ncm91cC1oZWFkaW5nXCI+e3sgZ3JvdXAubGFiZWwgfX08L3NwYW4+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvcC1kcm9wZG93bj5cbiAgICA8cC1kcm9wZG93blxuICAgICAgKm5nSWY9XCJncm91cFZhcmlhbnRPcHRpb25zLmxlbmd0aFwiXG4gICAgICBbb3B0aW9uc109XCJncm91cFZhcmlhbnRPcHRpb25zXCJcbiAgICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxuICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXG4gICAgICBzdHlsZUNsYXNzPVwic2MtdmFyaWFudFwiXG4gICAgICBbbmdNb2RlbF09XCJhY3RpdmVDZWxsVHlwZUNvbHVtblwiXG4gICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkdyb3VwVmFyaWFudCgkZXZlbnQpXCJcbiAgICAgIGFwcGVuZFRvPVwiYm9keVwiXG4gICAgPjwvcC1kcm9wZG93bj5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdJZj1cImNhbkltcG9ydEdyb3Vwc1wiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzPVwic2MtaWNvbi1idG5cIlxuICAgICAgW2Rpc2FibGVkXT1cImdyb3VwSW1wb3J0aW5nXCJcbiAgICAgIChjbGljayk9XCJncm91cEZpbGUuY2xpY2soKVwiXG4gICAgICB0aXRsZT1cIkltcG9ydCBjZWxsIGdyb3VwcyAoQ1NWIG9mIGNlbGxfaWQsIGdyb3VwKVwiXG4gICAgPlxuICAgICAgPGlcbiAgICAgICAgY2xhc3M9XCJwaVwiXG4gICAgICAgIFtjbGFzcy5waS1wbHVzLWNpcmNsZV09XCIhZ3JvdXBJbXBvcnRpbmdcIlxuICAgICAgICBbY2xhc3MucGktc3Bpbl09XCJncm91cEltcG9ydGluZ1wiXG4gICAgICAgIFtjbGFzcy5waS1zcGlubmVyXT1cImdyb3VwSW1wb3J0aW5nXCJcbiAgICAgID48L2k+XG4gICAgPC9idXR0b24+XG4gICAgPGlucHV0ICNncm91cEZpbGUgdHlwZT1cImZpbGVcIiBhY2NlcHQ9XCIuY3N2LC50c3YsLnR4dFwiIGhpZGRlbiAoY2hhbmdlKT1cIm9uSW1wb3J0R3JvdXBzRmlsZShncm91cEZpbGUpXCIgLz5cbiAgPC9kaXY+XG4gIDxzbWFsbCBjbGFzcz1cInNjLWhpbnQgc2MtZXJyb3JcIiAqbmdJZj1cImdyb3VwSW1wb3J0RXJyb3JcIj57eyBncm91cEltcG9ydEVycm9yIH19PC9zbWFsbD5cblxuICA8ZGl2IGNsYXNzPVwic2MtZ3JvdXAtbGlzdFwiICpuZ0lmPVwiZ3JvdXBSb3dzLmxlbmd0aFwiPlxuICAgIDxkaXYgY2xhc3M9XCJzYy1ncm91cC1yb3cgc2MtZ3JvdXAtYWxsXCI+XG4gICAgICA8cC1jaGVja2JveFxuICAgICAgICBbYmluYXJ5XT1cInRydWVcIlxuICAgICAgICBbbmdNb2RlbF09XCJhbGxHcm91cHNTaG93blwiXG4gICAgICAgIChvbkNoYW5nZSk9XCJvbkFsbEdyb3Vwc1Nob3duKCRldmVudC5jaGVja2VkKVwiXG4gICAgICA+PC9wLWNoZWNrYm94PlxuICAgICAgPHNwYW4gY2xhc3M9XCJzYy1ncm91cC1sYWJlbFwiPkFsbCBncm91cHM8L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cInNjLWNvdW50XCI+KHt7IGdyb3VwVG90YWwgfCBudW1iZXIgfX0pPC9zcGFuPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzYy1pY29uLWJ0blwiIChjbGljayk9XCJncm91cHNFeHBhbmRlZCA9ICFncm91cHNFeHBhbmRlZFwiPlxuICAgICAgICA8aSBjbGFzcz1cInBpXCIgW2NsYXNzLnBpLWNoZXZyb24tZG93bl09XCJncm91cHNFeHBhbmRlZFwiIFtjbGFzcy5waS1jaGV2cm9uLXJpZ2h0XT1cIiFncm91cHNFeHBhbmRlZFwiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJncm91cHNFeHBhbmRlZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNjLWdyb3VwLXJvd1wiICpuZ0Zvcj1cImxldCByb3cgb2YgZ3JvdXBSb3dzOyB0cmFja0J5OiB0cmFja0J5TGFiZWxcIj5cbiAgICAgICAgPHAtY2hlY2tib3hcbiAgICAgICAgICBbYmluYXJ5XT1cInRydWVcIlxuICAgICAgICAgIFtuZ01vZGVsXT1cImlzR3JvdXBTaG93bihyb3cubGFiZWwpXCJcbiAgICAgICAgICAob25DaGFuZ2UpPVwib25Hcm91cFNob3duKHJvdy5sYWJlbCwgJGV2ZW50LmNoZWNrZWQpXCJcbiAgICAgICAgPjwvcC1jaGVja2JveD5cbiAgICAgICAgPCEtLSBUaGUgZ3JvdXAncyBjb2xvdXI7IGNsaWNraW5nIGl0IG9wZW5zIHRoZSBjb2xvdXIgcGlja2VyLiAtLT5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwic2MtZG90IHNjLWRvdC1idG5cIlxuICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cInJvdy5jb2xvclwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInQ29sb3VyIGZvciAnICsgcm93LmxhYmVsXCJcbiAgICAgICAgICB0aXRsZT1cIkNvbG91clwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9wZW5Hcm91cFN0eWxlKCRldmVudCwgcm93LmxhYmVsLCBncm91cFBvcClcIlxuICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2MtZ3JvdXAtbGFiZWxcIiBbdGl0bGVdPVwicm93LmxhYmVsXCI+e3sgcm93LmxhYmVsIH19PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNjLWNvdW50XCI+KHt7IHJvdy5jb3VudCB8IG51bWJlciB9fSk8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG4gIDwhLS0gT25lIHBpY2tlciBmb3IgZXZlcnkgZ3JvdXAgcm93LCBmaWxsZWQgZm9yIHRoZSBncm91cCB0aGF0IG9wZW5lZCBpdC4gLS0+XG4gIDxwLW92ZXJsYXlQYW5lbCAjZ3JvdXBQb3Agc3R5bGVDbGFzcz1cInNjLWdlbmUtc3R5bGVcIiBhcHBlbmRUbz1cImJvZHlcIj5cbiAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiY29udGVudFwiPlxuICAgICAgPHNwYXRpYWwtZ2VuZS1zdHlsZVxuICAgICAgICAqbmdJZj1cInN0eWxlR3JvdXAgYXMgZ3JvdXBcIlxuICAgICAgICBbZ2VuZV09XCJncm91cFwiXG4gICAgICAgIHdoYXQ9XCJHcm91cFwiXG4gICAgICAgIFtjb2xvcl09XCJncm91cENvbG9yT2YoZ3JvdXApXCJcbiAgICAgICAgW3Nob3dJY29uc109XCJmYWxzZVwiXG4gICAgICAgIChjb2xvckNoYW5nZSk9XCJvbkdyb3VwQ29sb3IoZ3JvdXAsICRldmVudClcIlxuICAgICAgICAocmVzZXRTdHlsZSk9XCJyZXNldEdyb3VwQ29sb3IoZ3JvdXApXCJcbiAgICAgID48L3NwYXRpYWwtZ2VuZS1zdHlsZT5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L3Atb3ZlcmxheVBhbmVsPlxuPC9uZy1jb250YWluZXI+XG4iXX0=
274
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1ncm91cHMtcGFuZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zcGF0aWFsLWNvbnRyb2xzL3NwYXRpYWwtZ3JvdXBzLXBhbmVsL3NwYXRpYWwtZ3JvdXBzLXBhbmVsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC1jb250cm9scy9zcGF0aWFsLWdyb3Vwcy1wYW5lbC9zcGF0aWFsLWdyb3Vwcy1wYW5lbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBRU4sTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBSTFELE9BQU8sRUFBRSxvQkFBb0IsRUFBb0IsTUFBTSwrQkFBK0IsQ0FBQztBQUN2RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDL0YsT0FBTyxFQUNMLGFBQWEsRUFJYixjQUFjLEVBQ2QsYUFBYSxFQUNiLGFBQWEsRUFD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QUFHLEtBQUssQ0FBQztZQUMxQixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxpRkFBaUY7WUFDakYsZ0VBQWdFO1lBQ2hFLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFBRSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQztJQUVELDZFQUE2RTtJQUNyRSxLQUFLLENBQUMsRUFBYztRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDakIsRUFBRSxFQUFFLENBQUM7WUFDTCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs4R0FwT1UsMkJBQTJCO2tHQUEzQiwyQkFBMkIsZ1FDaEV4QywyL0hBMEdBLGd4T0R0REksWUFBWSx1VEFDWixXQUFXLDhWQUNYLFlBQVkscUlBQ1osY0FBYyxnWkFDZCxjQUFjLHV0Q0FDZCxrQkFBa0IsbVdBQ2xCLHlCQUF5Qjs7MkZBTWhCLDJCQUEyQjtrQkFoQnZDLFNBQVM7K0JBQ0Usc0JBQXNCLGNBQ3BCLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsWUFBWTt3QkFDWixjQUFjO3dCQUNkLGNBQWM7d0JBQ2Qsa0JBQWtCO3dCQUNsQix5QkFBeUI7cUJBQzFCLG1CQUdnQix1QkFBdUIsQ0FBQyxNQUFNOzJHQUl0QyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVhLGVBQWU7c0JBQWpDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkNoYW5nZXMsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTaGFyZWRNb2R1bGUgfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQgeyBDaGVja2JveE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvY2hlY2tib3gnO1xuaW1wb3J0IHsgRHJvcGRvd25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2Ryb3Bkb3duJztcbmltcG9ydCB7IE92ZXJsYXlQYW5lbE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvb3ZlcmxheXBhbmVsJztcblxuaW1wb3J0IHR5cGUgeyBJU3BhdGlhbENvbnRyb2xzIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHR5cGUgeyBTcGF0aWFsRGF0YXNldCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgREVGQVVMVF9TUEFUSUFMX1ZJRVcsIFNwYXRpYWxWaWV3U3RhdGUgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBjZWxsVHlwZUNvbHVtbkZvciB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC10aWxlcyc7XG5pbXBvcnQgeyBncm91cENvbG9yc0tleSB9IGZyb20gJy4uLy4uL3NwYXRpYWwvc3BhdGlhbC1lbmNvZGluZyc7XG5pbXBvcnQgeyBTcGF0aWFsR2VuZVN0eWxlQ29tcG9uZW50IH0gZnJvbSAnLi4vc3BhdGlhbC1nZW5lLXN0eWxlL3NwYXRpYWwtZ2VuZS1zdHlsZS5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgRkFNSUxZX1BSRUZJWCxcbiAgR3JvdXBPcHRpb25TZWN0aW9uLFxuICBHcm91cFJvdyxcbiAgUGFuZWxPcHRpb24sXG4gIGNvdW50R3JvdXBSb3dzLFxuICBmYW1pbHlNZW1iZXJzLFxuICBncm91cEVudHJ5Rm9yLFxuICBncm91cE9wdGlvbnMsXG4gIGdyb3VwVmFyaWFudE9wdGlvbnMsXG4gIHRvZ2dsZUhpZGRlbixcbn0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXBhbmVsLW1vZGVsJztcbmltcG9ydCB7IFN1cGVyc2VkZSB9IGZyb20gJy4uLy4uL3V0aWwvc3VwZXJzZWRlJztcblxuLyoqXG4gKiBUaGUgb2JzZXJ2YXRpb25zJyBncm91cGluZywgYXMgWGVuaXVtIEV4cGxvcmVyJ3MgR3JvdXBzIHNlY3Rpb246IHRoZSBncm91cCBwaWNrZXIgKGNvbHVtbnNcbiAqIHVuZGVyIHRoZWlyIHNlY3Rpb24gaGVhZGluZywgYSBrLW1lYW5zIGZhbWlseSBvbmNlLCB3aXRoIGl0cyBrIGJlc2lkZSBpdCksIENTViBpbXBvcnQgb2YgYSBuZXdcbiAqIGdyb3VwaW5nLCBhbmQgdGhlIGdyb3VwaW5nJ3MgY2F0ZWdvcmllcyB3aXRoIHRoZWlyIGNvbG91cnMgKGVhY2ggb25lJ3Mgc3dhdGNoIG9wZW5zIGEgY29sb3VyXG4gKiBwaWNrZXIpLCBjZWxsIGNvdW50cyBhbmQgc2hvdy9oaWRlIHN3aXRjaGVzLiBBIGdyb3VwJ3MgbmFtZSBzZWxlY3RzIGl0cyBvYnNlcnZhdGlvbnMuXG4gKlxuICogVGhlIE9ic2VydmF0aW9ucyBzZWN0aW9uJ3MgXCJDb2xvdXIgYnlcIiBpbiBHcm91cCBtb2RlOiB0aGUgZ3JvdXBpbmcgY29sb3VycyB0aGUgbWFya2VycyBhbmQgdGhlXG4gKiBjZWxscyBhbGlrZS4gV3JpdGVzIG9ubHkgdGhyb3VnaCBgY29udHJvbHMuc2V0Vmlld1N0YXRlYCAoYGNlbGxUeXBlQ29sdW1uYCB3aXRoIGBjb2xvckJ5YCBhbmRcbiAqIGBjZWxsQ29sb3JNb2RlYCwgYGhpZGRlbkdyb3Vwc2AsIGBncm91cENvbG9yc2ApLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzcGF0aWFsLWdyb3Vwcy1wYW5lbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgU2hhcmVkTW9kdWxlLFxuICAgIENoZWNrYm94TW9kdWxlLFxuICAgIERyb3Bkb3duTW9kdWxlLFxuICAgIE92ZXJsYXlQYW5lbE1vZHVsZSxcbiAgICBTcGF0aWFsR2VuZVN0eWxlQ29tcG9uZW50LFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vc3BhdGlhbC1ncm91cHMtcGFuZWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zcGF0aWFsLWdyb3Vwcy1wYW5lbC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU3BhdGlhbEdyb3Vwc1BhbmVsQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgLyoqIFRoZSBzcGF0aWFsIGNvbnRyb2xzIHRoaXMgcGFuZWwgcmVhZHMgYW5kIHdyaXRlcyB0aHJvdWdoOyBudWxsIHdpdGhvdXQgYSBgU1BBVElBTF9EQVRBX1BPUlRgLiAqL1xuICBASW5wdXQoKSBjb250cm9sczogSVNwYXRpYWxDb250cm9scyB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGRhdGFzZXQgb24gb2ZmZXIsIG9yIG51bGwuICovXG4gIEBJbnB1dCgpIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgY3VycmVudCBzcGF0aWFsIHZpZXcgc3RhdGU6IHdoYXQgaXMgZHJhd24sIGFuZCBob3cuICovXG4gIEBJbnB1dCgpIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUgPSBERUZBVUxUX1NQQVRJQUxfVklFVztcbiAgLyoqIFRoZSBjYXRlZ29yeSBzZWxlY3RlZCAoaXRzIGNvZGUgaW4gdGhlIGdyb3VwaW5nKSwgZm9yIGhpZ2hsaWdodGluZyBpdHMgcm93LiAqL1xuICBASW5wdXQoKSBzZWxlY3RlZENhdGVnb3J5OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIEEgZ3JvdXAncyBuYW1lIHdhcyBjbGlja2VkOiBpdHMgY2F0ZWdvcnkncyBjb2RlIGluIHRoZSBncm91cGluZywgdG8gc2VsZWN0IGl0cyBvYnNlcnZhdGlvbnMuICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBjYXRlZ29yeUNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAvKipcbiAgICogVGhlIGdyb3VwIHBpY2tlcjogY2F0ZWdvcmljYWwgY29sdW1ucyB1bmRlciB0aGVpciBzZWN0aW9uIGhlYWRpbmcsIGEgZmFtaWx5IG9mXG4gICAqIHZhcmlhbnRzIChrLW1lYW5zIGF0IGsgPSAy4oCmMTApIGxpc3RlZCBvbmNlLiBWYWx1ZXMgYXJlIGEgY29sdW1uIG5hbWUsIG9yXG4gICAqIGBmYW1pbHk6PGlkPmAgZm9yIGEgZmFtaWx5LlxuICAgKi9cbiAgcHJvdGVjdGVkIGdyb3VwT3B0aW9uczogR3JvdXBPcHRpb25TZWN0aW9uW10gPSBbXTtcbiAgLyoqIFZhcmlhbnRzIG9mIHRoZSBhY3RpdmUgZmFtaWx5IChrID0gMuKApjEwKSwgd2hlbiBhIGZhbWlseSBpcyBhY3RpdmUuICovXG4gIHByb3RlY3RlZCBncm91cFZhcmlhbnRPcHRpb25zOiBQYW5lbE9wdGlvbjxzdHJpbmc+W10gPSBbXTtcbiAgLyoqIFRoZSBsYXN0IHZhcmlhbnQgY2hvc2VuIHBlciBmYW1pbHksIHNvIHN3aXRjaGluZyBhd2F5IGFuZCBiYWNrIGtlZXBzIGsuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZmFtaWx5Q2hvaWNlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICAvKiogVGhlIGFjdGl2ZSBncm91cGluZydzIGNhdGVnb3JpZXMgd2l0aCBjb2xvdXJzIGFuZCBjZWxsIGNvdW50cywgbGFyZ2VzdCBmaXJzdC4gKi9cbiAgcHJvdGVjdGVkIGdyb3VwUm93czogR3JvdXBSb3dbXSA9IFtdO1xuICBwcm90ZWN0ZWQgZ3JvdXBUb3RhbCA9IDA7XG4gIHByb3RlY3RlZCBncm91cHNFeHBhbmRlZCA9IHRydWU7XG4gIC8qKiBUaGUgZ3JvdXBpbmcge0BsaW5rIGdyb3VwUm93c30gc2hvd3Mgb3IgaXMgbG9hZGluZyDigJQgYSByZXBlYXQgcmVxdWVzdCBmb3IgaXQgaXMgYSBuby1vcC4gKi9cbiAgcHJpdmF0ZSBncm91cFJvd3NGb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogTGF0ZXN0IHdpbnMgYW1vbmcgZ3JvdXAtcm93IGxvYWRzLCBzbyBhIHNsb3cgb25lIGZvciBhbiBlYXJsaWVyIGdyb3VwaW5nIChvciB0aGVcbiAgICogIHByZXZpb3VzIGRhdGFzZXQncyBjb2x1bW4gb2YgdGhlIHNhbWUgbmFtZSkgY2Fubm90IGxhbmQgb3ZlciB0aGUgY3VycmVudCBvbmUuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JvdXBSb3dzTG9hZCA9IG5ldyBTdXBlcnNlZGUoKTtcbiAgcHJvdGVjdGVkIGdyb3VwSW1wb3J0RXJyb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcm90ZWN0ZWQgZ3JvdXBJbXBvcnRpbmcgPSBmYWxzZTtcbiAgLyoqIFRoZSBncm91cCB0aGUgb3BlbiBjb2xvdXIgcGlja2VyIGVkaXRzLiAqL1xuICBwcm90ZWN0ZWQgc3R5bGVHcm91cDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSB6b25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICApIHt9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWyd2aWV3J10pIHRoaXMuaGlkZGVuR3JvdXBzID0gbmV3IFNldCh0aGlzLnZpZXcuaGlkZGVuR3JvdXBzKTtcbiAgICBpZiAoY2hhbmdlc1snZGF0YXNldCddKSB7XG4gICAgICB0aGlzLmdyb3VwT3B0aW9ucyA9IGdyb3VwT3B0aW9ucyh0aGlzLmRhdGFzZXQpO1xuICAgICAgLy8gQSBzYW1lLW5hbWVkIGdyb3VwaW5nIG9mIGEgbmV3IGRhdGFzZXQgaXMgbm90IHRoZSBvbGQgb25lLlxuICAgICAgdGhpcy5ncm91cFJvd3NGb3IgPSBudWxsO1xuICAgIH1cbiAgICB2b2lkIHRoaXMucmVmcmVzaEdyb3VwcygpO1xuICB9XG5cbiAgLyoqIFRoZSBjYXRlZ29yaWNhbCBjb2x1bW4gdGhlIGNlbGxzIGFyZSBncm91cGVkIGJ5LiAqL1xuICBwcm90ZWN0ZWQgZ2V0IGFjdGl2ZUNlbGxUeXBlQ29sdW1uKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmRhdGFzZXQgPyBjZWxsVHlwZUNvbHVtbkZvcih0aGlzLmRhdGFzZXQsIHRoaXMudmlldykgOiBudWxsO1xuICB9XG5cbiAgLyoqIFRoZSBwaWNrZXIncyB2YWx1ZSBmb3IgdGhlIGFjdGl2ZSBncm91cCBjb2x1bW4uICovXG4gIHByb3RlY3RlZCBnZXQgYWN0aXZlR3JvdXBFbnRyeSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gZ3JvdXBFbnRyeUZvcih0aGlzLmRhdGFzZXQsIHRoaXMuYWN0aXZlQ2VsbFR5cGVDb2x1bW4pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uR3JvdXBFbnRyeSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoRkFNSUxZX1BSRUZJWCkpIHtcbiAgICAgIGNvbnN0IGlkID0gdmFsdWUuc2xpY2UoRkFNSUxZX1BSRUZJWC5sZW5ndGgpO1xuICAgICAgY29uc3QgbmFtZSA9IHRoaXMuZmFtaWx5Q2hvaWNlLmdldChpZCkgPz8gZmFtaWx5TWVtYmVycyh0aGlzLmRhdGFzZXQsIGlkKVswXT8ubmFtZTtcbiAgICAgIGlmIChuYW1lKSB0aGlzLm9uQ2VsbFR5cGVDb2x1bW4obmFtZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub25DZWxsVHlwZUNvbHVtbih2YWx1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Hcm91cFZhcmlhbnQobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZGF0YXNldD8uY29sdW1ucy5maW5kKChjKSA9PiBjLm5hbWUgPT09IG5hbWUpO1xuICAgIGlmIChtZXRhPy5raW5kID09PSAnY2F0ZWdvcmljYWwnICYmIG1ldGEuZmFtaWx5KSB0aGlzLmZhbWlseUNob2ljZS5zZXQobWV0YS5mYW1pbHkuaWQsIG5hbWUpO1xuICAgIHRoaXMub25DZWxsVHlwZUNvbHVtbihuYW1lKTtcbiAgfVxuXG4gIG9uQ2VsbFR5cGVDb2x1bW4obmFtZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIC8vIFN3aXRjaGVkLW9mZiBncm91cHMgYmVsb25nIHRvIHRoZSBncm91cGluZyB0aGV5IHdlcmUgc3dpdGNoZWQgb2ZmIGluLiBUaGUgZ3JvdXBpbmcgY29sb3Vyc1xuICAgIC8vIHRoZSBtYXJrZXJzIChjb2xvckJ5KSBhbmQgdGhlIGNlbGxzIChjZWxsQ29sb3JNb2RlKSBhbGlrZS5cbiAgICB0aGlzLmNvbnRyb2xzPy5zZXRWaWV3U3RhdGUoe1xuICAgICAgY2VsbFR5cGVDb2x1bW46IG5hbWUsXG4gICAgICBoaWRkZW5Hcm91cHM6IFtdLFxuICAgICAgY2VsbENvbG9yTW9kZTogJ2dyb3VwJyxcbiAgICAgIC4uLihuYW1lID8geyBjb2xvckJ5OiB7IGtpbmQ6ICdjb2x1bW4nLCBuYW1lIH0gfSA6IHt9KSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBHcm91cCBgbGFiZWxgJ3MgY2F0ZWdvcnkgY29kZSBpbiB0aGUgYWN0aXZlIGdyb3VwaW5nLCBvciAtMS4gKi9cbiAgcHJvdGVjdGVkIGNvZGVPZihsYWJlbDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5hY3RpdmVDZWxsVHlwZUNvbHVtbjtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5kYXRhc2V0Py5jb2x1bW5zLmZpbmQoKGMpID0+IGMubmFtZSA9PT0gbmFtZSk7XG4gICAgcmV0dXJuIG1ldGE/LmtpbmQgPT09ICdjYXRlZ29yaWNhbCcgPyBtZXRhLmNhdGVnb3JpZXMuaW5kZXhPZihsYWJlbCkgOiAtMTtcbiAgfVxuXG4gIC8qKiBTZWxlY3QgKG9yLCBzZWxlY3RlZCBhbHJlYWR5LCBjbGVhcikgZ3JvdXAgYGxhYmVsYCdzIG9ic2VydmF0aW9ucy4gKi9cbiAgcHJvdGVjdGVkIG9uR3JvdXBDbGlja2VkKGxhYmVsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjb2RlID0gdGhpcy5jb2RlT2YobGFiZWwpO1xuICAgIGlmIChjb2RlID49IDApIHRoaXMuY2F0ZWdvcnlDbGlja2VkLmVtaXQoY29kZSk7XG4gIH1cblxuICAvKioge0BsaW5rIFNwYXRpYWxWaWV3U3RhdGUuaGlkZGVuR3JvdXBzfSBhcyBhIHNldCwgZm9yIHRoZSBwZXItcm93IGNoZWNrcy4gKi9cbiAgcHJpdmF0ZSBoaWRkZW5Hcm91cHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBwcm90ZWN0ZWQgaXNHcm91cFNob3duKGxhYmVsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaGlkZGVuR3JvdXBzLmhhcyhsYWJlbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGFsbEdyb3Vwc1Nob3duKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZpZXcuaGlkZGVuR3JvdXBzLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkdyb3VwU2hvd24obGFiZWw6IHN0cmluZywgb246IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xzPy5zZXRWaWV3U3RhdGUoeyBoaWRkZW5Hcm91cHM6IHRvZ2dsZUhpZGRlbih0aGlzLnZpZXcuaGlkZGVuR3JvdXBzLCBbbGFiZWxdLCBvbikgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25BbGxHcm91cHNTaG93bihvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbHM/LnNldFZpZXdTdGF0ZSh7IGhpZGRlbkdyb3Vwczogb24gPyBbXSA6IHRoaXMuZ3JvdXBSb3dzLm1hcCgocikgPT4gci5sYWJlbCkgfSk7XG4gIH1cblxuICAvLyDilIDilIAgcGVyLWdyb3VwIGNvbG91ciBwaWNrZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJvdGVjdGVkIG9wZW5Hcm91cFN0eWxlKGV2ZW50OiBFdmVudCwgbGFiZWw6IHN0cmluZywgcGFuZWw6IHsgdG9nZ2xlKGU6IEV2ZW50KTogdm9pZDsgaGlkZSgpOiB2b2lkIH0pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdHlsZUdyb3VwID09PSBsYWJlbCkge1xuICAgICAgcGFuZWwudG9nZ2xlKGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zdHlsZUdyb3VwID0gbGFiZWw7XG4gICAgcGFuZWwuaGlkZSgpO1xuICAgIC8vIFJlLW9wZW4gYW5jaG9yZWQgb24gdGhlIHJvdyB0aGF0IHdhcyBjbGlja2VkLCBvbmNlIHRoZSBwYW5lbCBoYXMgY2xvc2VkLlxuICAgIHNldFRpbWVvdXQoKCkgPT4gcGFuZWwudG9nZ2xlKGV2ZW50KSk7XG4gIH1cblxuICAvKiogVGhlIGNvbG91ciBncm91cCBgbGFiZWxgIGlzIGRyYXduIGluIG5vdyAodGhlIHVzZXIncywgZWxzZSB0aGUgY29sdW1uJ3Mgb3IgdGhlIHBhbGV0dGUncykuICovXG4gIHByb3RlY3RlZCBncm91cENvbG9yT2YobGFiZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ3JvdXBSb3dzLmZpbmQoKHIpID0+IHIubGFiZWwgPT09IGxhYmVsKT8uY29sb3IgPz8gJyM5OTk5OTknO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uR3JvdXBDb2xvcihsYWJlbDogc3RyaW5nLCBoZXg6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuYWN0aXZlQ2VsbFR5cGVDb2x1bW47XG4gICAgaWYgKCFjb2x1bW4pIHJldHVybjtcbiAgICBjb25zdCBhbGwgPSB0aGlzLnZpZXcuZ3JvdXBDb2xvcnMgPz8ge307XG4gICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHsgZ3JvdXBDb2xvcnM6IHsgLi4uYWxsLCBbY29sdW1uXTogeyAuLi5hbGxbY29sdW1uXSwgW2xhYmVsXTogaGV4IH0gfSB9KTtcbiAgfVxuXG4gIC8qKiBCYWNrIHRvIHRoZSBncm91cCdzIG93biBjb2xvdXIgKHRoZSBjb2x1bW4ncywgZWxzZSB0aGUgcGFsZXR0ZSdzKS4gKi9cbiAgcHJvdGVjdGVkIHJlc2V0R3JvdXBDb2xvcihsYWJlbDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5hY3RpdmVDZWxsVHlwZUNvbHVtbjtcbiAgICBjb25zdCBvd24gPSBjb2x1bW4gPyB0aGlzLnZpZXcuZ3JvdXBDb2xvcnM/Lltjb2x1bW5dIDogdW5kZWZpbmVkO1xuICAgIGlmICghY29sdW1uIHx8ICFvd24gfHwgIShsYWJlbCBpbiBvd24pKSByZXR1cm47XG4gICAgY29uc3QgcmVzdCA9IHsgLi4ub3duIH07XG4gICAgZGVsZXRlIHJlc3RbbGFiZWxdO1xuICAgIGNvbnN0IGFsbCA9IHsgLi4udGhpcy52aWV3Lmdyb3VwQ29sb3JzIH07XG4gICAgaWYgKE9iamVjdC5rZXlzKHJlc3QpLmxlbmd0aCkgYWxsW2NvbHVtbl0gPSByZXN0O1xuICAgIGVsc2UgZGVsZXRlIGFsbFtjb2x1bW5dO1xuICAgIHRoaXMuY29udHJvbHM/LnNldFZpZXdTdGF0ZSh7IGdyb3VwQ29sb3JzOiBhbGwgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGNhbkltcG9ydEdyb3VwcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmNvbnRyb2xzPy5pbXBvcnRHcm91cHM7XG4gIH1cblxuICAvKiogJysnOiBhIENTVi9UU1Ygb2YgYGNlbGxfaWRgIGFuZCBncm91cCwgbmFtZWQgYWZ0ZXIgdGhlIGZpbGUuICovXG4gIHByb3RlY3RlZCBhc3luYyBvbkltcG9ydEdyb3Vwc0ZpbGUoaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmaWxlID0gaW5wdXQuZmlsZXM/LlswXTtcbiAgICBpbnB1dC52YWx1ZSA9ICcnO1xuICAgIGlmICghZmlsZSB8fCAhdGhpcy5jb250cm9scz8uaW1wb3J0R3JvdXBzKSByZXR1cm47XG4gICAgdGhpcy5ncm91cEltcG9ydEVycm9yID0gbnVsbDtcbiAgICB0aGlzLmdyb3VwSW1wb3J0aW5nID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbGFiZWwgPSBmaWxlLm5hbWUucmVwbGFjZSgvXFwuKGNzdnx0c3Z8dHh0KSQvaSwgJycpO1xuICAgICAgY29uc3QgeyBjb2x1bW4gfSA9IGF3YWl0IHRoaXMuY29udHJvbHMuaW1wb3J0R3JvdXBzKGxhYmVsLCBhd2FpdCBmaWxlLnRleHQoKSk7XG4gICAgICB0aGlzLmFwcGx5KCgpID0+IHRoaXMub25DZWxsVHlwZUNvbHVtbihjb2x1bW4ubmFtZSkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5hcHBseSgoKSA9PiB7XG4gICAgICAgIHRoaXMuZ3JvdXBJbXBvcnRFcnJvciA9IFN0cmluZygoZXJyIGFzIEVycm9yKT8ubWVzc2FnZSA/PyBlcnIpO1xuICAgICAgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuYXBwbHkoKCkgPT4ge1xuICAgICAgICB0aGlzLmdyb3VwSW1wb3J0aW5nID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdHJhY2tCeUxhYmVsID0gKF9pOiBudW1iZXIsIHJvdzogeyBsYWJlbDogc3RyaW5nIH0pID0+IHJvdy5sYWJlbDtcblxuICBwcml2YXRlIHJlZnJlc2hWYXJpYW50cygpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gZ3JvdXBWYXJpYW50T3B0aW9ucyh0aGlzLmRhdGFzZXQsIHRoaXMuYWN0aXZlQ2VsbFR5cGVDb2x1bW4pO1xuICAgIGlmIChKU09OLnN0cmluZ2lmeShuZXh0KSAhPT0gSlNPTi5zdHJpbmdpZnkodGhpcy5ncm91cFZhcmlhbnRPcHRpb25zKSkgdGhpcy5ncm91cFZhcmlhbnRPcHRpb25zID0gbmV4dDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaEdyb3VwcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnJlZnJlc2hWYXJpYW50cygpO1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmFjdGl2ZUNlbGxUeXBlQ29sdW1uO1xuICAgIGlmICghbmFtZSB8fCAhdGhpcy5jb250cm9scykge1xuICAgICAgdGhpcy5ncm91cFJvd3NMb2FkLmNhbmNlbCgpO1xuICAgICAgdGhpcy5ncm91cFJvd3MgPSBbXTtcbiAgICAgIHRoaXMuZ3JvdXBUb3RhbCA9IDA7XG4gICAgICB0aGlzLmdyb3VwUm93c0ZvciA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFRoZSB1c2VyJ3MgY29sb3VycyBmb3IgdGhlIGdyb3VwaW5nIGFyZSBwYXJ0IG9mIHdoYXQgdGhlIHJvd3Mgc2hvdy5cbiAgICBjb25zdCBrZXkgPSBgJHtuYW1lfVxcdTAwMDEke2dyb3VwQ29sb3JzS2V5KG5hbWUsIHRoaXMudmlldy5ncm91cENvbG9ycyl9YDtcbiAgICBpZiAoa2V5ID09PSB0aGlzLmdyb3VwUm93c0ZvcikgcmV0dXJuO1xuICAgIHRoaXMuZ3JvdXBSb3dzRm9yID0ga2V5O1xuICAgIGNvbnN0IHRhc2sgPSB0aGlzLmdyb3VwUm93c0xvYWQubmV4dCgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB2ID0gYXdhaXQgdGhpcy5jb250cm9scy5jYXRlZ29yaWNhbFZpZXcobmFtZSk7XG4gICAgICBpZiAoIXRhc2suaXNDdXJyZW50KCkpIHJldHVybjtcbiAgICAgIGNvbnN0IHsgcm93cywgdG90YWwgfSA9IGNvdW50R3JvdXBSb3dzKHYpO1xuICAgICAgdGhpcy5hcHBseSgoKSA9PiB7XG4gICAgICAgIHRoaXMuZ3JvdXBSb3dzID0gcm93cztcbiAgICAgICAgdGhpcy5ncm91cFRvdGFsID0gdG90YWw7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE9ubHkgdGhlIGN1cnJlbnQgbG9hZCdzIGZhaWx1cmUgcmUtb3BlbnMgdGhlIGtleTogYSBzdXBlcnNlZGVkIG9uZSBjbGVhcmluZyBpdFxuICAgICAgLy8gd291bGQgbWFrZSB0aGUgbmV3ZXIgbG9hZCdzIHJlc3VsdCBsb29rIHN0YWxlIGFuZCBiZSBkcm9wcGVkLlxuICAgICAgaWYgKHRhc2suaXNDdXJyZW50KCkpIHRoaXMuZ3JvdXBSb3dzRm9yID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKiogQXBwbHkgYW4gYXN5bmMgcmVzdWx0IGluc2lkZSB0aGUgem9uZSBhbmQgcmUtcmVuZGVyIHRoaXMgT25QdXNoIHBhbmVsLiAqL1xuICBwcml2YXRlIGFwcGx5KGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICBmbigpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJncm91cE9wdGlvbnMubGVuZ3RoXCI+XG4gIDxkaXYgY2xhc3M9XCJzYy1zdWJoZWFkXCI+R3JvdXBzPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJzYy1yb3cgc2Mtcm93LXBpY2tlclwiPlxuICAgIDxwLWRyb3Bkb3duXG4gICAgICBbb3B0aW9uc109XCJncm91cE9wdGlvbnNcIlxuICAgICAgW2dyb3VwXT1cInRydWVcIlxuICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXG4gICAgICBvcHRpb25WYWx1ZT1cInZhbHVlXCJcbiAgICAgIG9wdGlvbkdyb3VwTGFiZWw9XCJsYWJlbFwiXG4gICAgICBvcHRpb25Hcm91cENoaWxkcmVuPVwiaXRlbXNcIlxuICAgICAgW25nTW9kZWxdPVwiYWN0aXZlR3JvdXBFbnRyeVwiXG4gICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkdyb3VwRW50cnkoJGV2ZW50KVwiXG4gICAgICBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgc3R5bGVDbGFzcz1cInNjLWZ1bGxcIlxuICAgID5cbiAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtZ3JvdXAgcFRlbXBsYXRlPVwiZ3JvdXBcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzYy1ncm91cC1oZWFkaW5nXCI+e3sgZ3JvdXAubGFiZWwgfX08L3NwYW4+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvcC1kcm9wZG93bj5cbiAgICA8cC1kcm9wZG93blxuICAgICAgKm5nSWY9XCJncm91cFZhcmlhbnRPcHRpb25zLmxlbmd0aFwiXG4gICAgICBbb3B0aW9uc109XCJncm91cFZhcmlhbnRPcHRpb25zXCJcbiAgICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxuICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXG4gICAgICBzdHlsZUNsYXNzPVwic2MtdmFyaWFudFwiXG4gICAgICBbbmdNb2RlbF09XCJhY3RpdmVDZWxsVHlwZUNvbHVtblwiXG4gICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkdyb3VwVmFyaWFudCgkZXZlbnQpXCJcbiAgICAgIGFwcGVuZFRvPVwiYm9keVwiXG4gICAgPjwvcC1kcm9wZG93bj5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdJZj1cImNhbkltcG9ydEdyb3Vwc1wiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzPVwic2MtaWNvbi1idG5cIlxuICAgICAgW2Rpc2FibGVkXT1cImdyb3VwSW1wb3J0aW5nXCJcbiAgICAgIChjbGljayk9XCJncm91cEZpbGUuY2xpY2soKVwiXG4gICAgICB0aXRsZT1cIkltcG9ydCBjZWxsIGdyb3VwcyAoQ1NWIG9mIGNlbGxfaWQsIGdyb3VwKVwiXG4gICAgPlxuICAgICAgPGlcbiAgICAgICAgY2xhc3M9XCJwaVwiXG4gICAgICAgIFtjbGFzcy5waS1wbHVzLWNpcmNsZV09XCIhZ3JvdXBJbXBvcnRpbmdcIlxuICAgICAgICBbY2xhc3MucGktc3Bpbl09XCJncm91cEltcG9ydGluZ1wiXG4gICAgICAgIFtjbGFzcy5waS1zcGlubmVyXT1cImdyb3VwSW1wb3J0aW5nXCJcbiAgICAgID48L2k+XG4gICAgPC9idXR0b24+XG4gICAgPGlucHV0ICNncm91cEZpbGUgdHlwZT1cImZpbGVcIiBhY2NlcHQ9XCIuY3N2LC50c3YsLnR4dFwiIGhpZGRlbiAoY2hhbmdlKT1cIm9uSW1wb3J0R3JvdXBzRmlsZShncm91cEZpbGUpXCIgLz5cbiAgPC9kaXY+XG4gIDxzbWFsbCBjbGFzcz1cInNjLWhpbnQgc2MtZXJyb3JcIiAqbmdJZj1cImdyb3VwSW1wb3J0RXJyb3JcIj57eyBncm91cEltcG9ydEVycm9yIH19PC9zbWFsbD5cblxuICA8ZGl2IGNsYXNzPVwic2MtZ3JvdXAtbGlzdFwiICpuZ0lmPVwiZ3JvdXBSb3dzLmxlbmd0aFwiPlxuICAgIDxkaXYgY2xhc3M9XCJzYy1ncm91cC1yb3cgc2MtZ3JvdXAtYWxsXCI+XG4gICAgICA8cC1jaGVja2JveFxuICAgICAgICBbYmluYXJ5XT1cInRydWVcIlxuICAgICAgICBbbmdNb2RlbF09XCJhbGxHcm91cHNTaG93blwiXG4gICAgICAgIChvbkNoYW5nZSk9XCJvbkFsbEdyb3Vwc1Nob3duKCRldmVudC5jaGVja2VkKVwiXG4gICAgICA+PC9wLWNoZWNrYm94PlxuICAgICAgPHNwYW4gY2xhc3M9XCJzYy1ncm91cC1sYWJlbFwiPkFsbCBncm91cHM8L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cInNjLWNvdW50XCI+KHt7IGdyb3VwVG90YWwgfCBudW1iZXIgfX0pPC9zcGFuPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzYy1pY29uLWJ0blwiIChjbGljayk9XCJncm91cHNFeHBhbmRlZCA9ICFncm91cHNFeHBhbmRlZFwiPlxuICAgICAgICA8aSBjbGFzcz1cInBpXCIgW2NsYXNzLnBpLWNoZXZyb24tZG93bl09XCJncm91cHNFeHBhbmRlZFwiIFtjbGFzcy5waS1jaGV2cm9uLXJpZ2h0XT1cIiFncm91cHNFeHBhbmRlZFwiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJncm91cHNFeHBhbmRlZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNjLWdyb3VwLXJvd1wiICpuZ0Zvcj1cImxldCByb3cgb2YgZ3JvdXBSb3dzOyB0cmFja0J5OiB0cmFja0J5TGFiZWxcIj5cbiAgICAgICAgPHAtY2hlY2tib3hcbiAgICAgICAgICBbYmluYXJ5XT1cInRydWVcIlxuICAgICAgICAgIFtuZ01vZGVsXT1cImlzR3JvdXBTaG93bihyb3cubGFiZWwpXCJcbiAgICAgICAgICAob25DaGFuZ2UpPVwib25Hcm91cFNob3duKHJvdy5sYWJlbCwgJGV2ZW50LmNoZWNrZWQpXCJcbiAgICAgICAgPjwvcC1jaGVja2JveD5cbiAgICAgICAgPCEtLSBUaGUgZ3JvdXAncyBjb2xvdXI7IGNsaWNraW5nIGl0IG9wZW5zIHRoZSBjb2xvdXIgcGlja2VyLiAtLT5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwic2MtZG90IHNjLWRvdC1idG5cIlxuICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cInJvdy5jb2xvclwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInQ29sb3VyIGZvciAnICsgcm93LmxhYmVsXCJcbiAgICAgICAgICB0aXRsZT1cIkNvbG91clwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9wZW5Hcm91cFN0eWxlKCRldmVudCwgcm93LmxhYmVsLCBncm91cFBvcClcIlxuICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwhLS0gVGhlIG5hbWUgc2VsZWN0cyB0aGUgZ3JvdXAncyBvYnNlcnZhdGlvbnM7IGFnYWluLCBjbGVhcnMuIC0tPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJzYy1ncm91cC1sYWJlbCBzYy1ncm91cC1zZWxlY3RcIlxuICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJzZWxlY3RlZENhdGVnb3J5ICE9PSBudWxsICYmIHNlbGVjdGVkQ2F0ZWdvcnkgPT09IGNvZGVPZihyb3cubGFiZWwpXCJcbiAgICAgICAgICBbdGl0bGVdPVwiJ1NlbGVjdCAnICsgcm93LmxhYmVsXCJcbiAgICAgICAgICAoY2xpY2spPVwib25Hcm91cENsaWNrZWQocm93LmxhYmVsKVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyByb3cubGFiZWwgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2MtY291bnRcIj4oe3sgcm93LmNvdW50IHwgbnVtYmVyIH19KTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbiAgPCEtLSBPbmUgcGlja2VyIGZvciBldmVyeSBncm91cCByb3csIGZpbGxlZCBmb3IgdGhlIGdyb3VwIHRoYXQgb3BlbmVkIGl0LiAtLT5cbiAgPHAtb3ZlcmxheVBhbmVsICNncm91cFBvcCBzdHlsZUNsYXNzPVwic2MtZ2VuZS1zdHlsZVwiIGFwcGVuZFRvPVwiYm9keVwiPlxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJjb250ZW50XCI+XG4gICAgICA8c3BhdGlhbC1nZW5lLXN0eWxlXG4gICAgICAgICpuZ0lmPVwic3R5bGVHcm91cCBhcyBncm91cFwiXG4gICAgICAgIFtnZW5lXT1cImdyb3VwXCJcbiAgICAgICAgd2hhdD1cIkdyb3VwXCJcbiAgICAgICAgW2NvbG9yXT1cImdyb3VwQ29sb3JPZihncm91cClcIlxuICAgICAgICBbc2hvd0ljb25zXT1cImZhbHNlXCJcbiAgICAgICAgKGNvbG9yQ2hhbmdlKT1cIm9uR3JvdXBDb2xvcihncm91cCwgJGV2ZW50KVwiXG4gICAgICAgIChyZXNldFN0eWxlKT1cInJlc2V0R3JvdXBDb2xvcihncm91cClcIlxuICAgICAgPjwvc3BhdGlhbC1nZW5lLXN0eWxlPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvcC1vdmVybGF5UGFuZWw+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==
@@ -84,11 +84,11 @@ export class SpatialKeyComponent {
84
84
  this.controls?.setViewState({ continuousColormap: node?.data?.value ?? null });
85
85
  }
86
86
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SpatialKeyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
87
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: SpatialKeyComponent, isStandalone: true, selector: "spatial-key", inputs: { controls: "controls", dataset: "dataset", view: "view", legend: "legend", colorBarCss: "colorBarCss", selectedCategory: "selectedCategory", colormapOptions: "colormapOptions" }, outputs: { categoryClicked: "categoryClicked" }, usesOnChanges: true, ngImport: i0, template: "<!-- Key: categorical legend or a continuous colour bar, built from the same\n functions the renderer uses so it cannot disagree with the canvas. -->\n<div class=\"sc-section sc-key\" *ngIf=\"view.colorBy\">\n <span class=\"sc-lbl\">{{ colorByLabel }}</span>\n <!-- Derived columns say so, so they are not mistaken for measured data. -->\n <small class=\"sc-hint\" *ngIf=\"activeDescription\">{{ activeDescription }}</small>\n\n <!-- Legend rows are buttons: clicking one selects that category, clicking\n it again clears \u2014 so a click is always reversible. -->\n <ul class=\"sc-legend\" *ngIf=\"isCategorical\">\n <li *ngFor=\"let entry of legend; index as i; trackBy: trackByLabel\">\n <button\n type=\"button\"\n class=\"sc-legend-btn\"\n [class.selected]=\"selectedCategory === i\"\n (click)=\"categoryClicked.emit(i)\"\n [title]=\"'Select ' + entry.label\"\n >\n <span class=\"sc-swatch\" [style.background]=\"entry.color\"></span>\n <span class=\"sc-legend-label\">{{ entry.label }}</span>\n </button>\n </li>\n </ul>\n\n <div *ngIf=\"isContinuous\">\n <div class=\"sc-colorbar\" [style.background]=\"colorBarCss\"></div>\n <div class=\"sc-colorbar-ends\">\n <span>low</span>\n <span class=\"sc-hint\">window from percentiles</span>\n <span>high</span>\n </div>\n <!-- The gradient this bar and the map are drawn with. Sits under the bar\n it controls, with the same swatch previews the image's colormap picker\n uses: which gradient reads best is a visual judgement, so a list of\n names would be the wrong control. Cleared = follow the image's. -->\n <div class=\"sc-row\">\n <span class=\"sc-lbl\">Colormap</span>\n <p-treeSelect\n [options]=\"colormapOptions\"\n [ngModel]=\"selectedColormapNode\"\n selectionMode=\"single\"\n [showClear]=\"true\"\n placeholder=\"Match the image\"\n [scrollHeight]=\"'260px'\"\n appendTo=\"body\"\n pTooltip=\"Colour scale for gene and numeric values \u2014 the markers, the gene map and this bar. Clear it to follow the image's colormap\"\n tooltipPosition=\"top\"\n (onNodeSelect)=\"onContinuousColormap($event.node)\"\n (onClear)=\"onContinuousColormap(null)\"\n >\n <ng-template let-node pTemplate=\"default\">\n <span class=\"sc-cmap-option\">\n <img *ngIf=\"!node.children && node.data?.src\" [src]=\"node.data.src\" class=\"sc-cmap-swatch\" alt=\"\" />\n <span>{{ node.label }}</span>\n </span>\n </ng-template>\n </p-treeSelect>\n <span class=\"sc-val\"></span>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";.sc-hint{font-size:.75rem;color:var(--text-color-secondary, #6c757d)}.sc-error{color:var(--red-600, #c62828)}.sc-section{display:flex;flex-direction:column;gap:.35rem}.sc-lbl{font-size:.78rem;color:var(--text-color-secondary, #6c757d);white-space:nowrap}.sc-row{display:flex;align-items:center;gap:.6rem}.sc-row p-slider,.sc-row p-dropdown,.sc-row p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row p-slider .p-slider{width:100%}:host ::ng-deep .sc-row p-dropdown .p-dropdown,:host ::ng-deep .sc-row p-treeSelect .p-treeselect{width:100%}.sc-row .sc-lbl{flex:0 0 calc(50% - .6rem);min-width:0;overflow:hidden;text-overflow:ellipsis}.sc-cmap-option{display:inline-flex;align-items:center;gap:.4rem}.sc-cmap-swatch{width:3.5rem;height:.7rem;border-radius:2px;display:block}.sc-val{flex:0 0 4rem;text-align:right;font-size:.78rem;font-variant-numeric:tabular-nums;white-space:nowrap}:host ::ng-deep .sc-full,:host ::ng-deep .sc-full .p-dropdown,:host ::ng-deep .sc-full .p-autocomplete,:host ::ng-deep .sc-full input{width:100%}.sc-colorbar{height:.75rem;border-radius:2px;border:1px solid rgba(0,0,0,.2)}.sc-colorbar-ends{display:flex;justify-content:space-between;font-size:.7rem;color:var(--text-color-secondary, #6c757d);margin-top:.2rem}.sc-panel{border:1px solid var(--surface-border, #dee2e6);border-radius:6px;margin-bottom:.5rem;overflow:hidden}.sc-panel-head{display:flex;align-items:center;gap:.6rem;padding:.5rem .7rem;cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--surface-100, #f5f6f7)}.sc-panel-head .sc-panel-title{flex:1;font-weight:600}.sc-panel.open>.sc-panel-head{background:var(--primary-color, #2196f3);color:var(--primary-color-text, #fff)}.sc-panel-body{display:flex;flex-direction:column;gap:.45rem;padding:.6rem .75rem .75rem}.sc-subhead{display:flex;align-items:center;gap:.5rem;margin-top:.4rem;font-size:.72rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-color-secondary, #6c757d)}.sc-subhead:after{content:\"\";flex:1;border-top:1px solid var(--surface-border, #dee2e6)}:host ::ng-deep .sc-buttons .p-button{padding:.35rem .75rem;font-size:.85rem}.sc-row-picker p-dropdown,.sc-row-picker p-multiSelect,.sc-row-picker p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row-picker .sc-variant{width:6.5rem}:host ::ng-deep .sc-row-picker p-multiselect .p-multiselect{width:100%}:host ::ng-deep .sc-row-picker p-dropdown:has(.sc-variant){flex:0 0 6.5rem}:host ::ng-deep .sc-row-picker p-treeselect:has(.sc-palette){flex:0 0 3rem}:host ::ng-deep .sc-palette .p-treeselect-label{width:0;padding:0}.sc-icon-btn{flex:0 0 auto;border:0;background:transparent;cursor:pointer;padding:.25rem .35rem;font:inherit;font-size:1.05rem;color:var(--text-color, #333);border-radius:4px}.sc-icon-btn:hover{background:var(--surface-200, #e9ecef)}.sc-icon-btn.active{color:var(--primary-color, #2196f3);font-weight:700}.sc-icon-btn:disabled{opacity:.5;cursor:default}.sc-small-btn{margin-left:auto;border:1px solid var(--surface-border, #ced4da);background:var(--surface-0, #fff);border-radius:4px;padding:.2rem .6rem;font:inherit;font-size:.8rem;cursor:pointer}:host ::ng-deep .sc-group-heading{font-size:.7rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase;opacity:.7}.sc-group-list,.sc-gene-tree{max-height:16rem;overflow-y:auto;border:1px solid var(--surface-border, #dee2e6);border-radius:4px;padding:.25rem .4rem}.sc-group-row,.sc-gene-row{display:flex;align-items:center;gap:.45rem;padding:.15rem 0;font-size:.88rem}.sc-group-row .sc-group-label,.sc-gene-row .sc-group-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-group-all,.sc-gene-root,.sc-gene-group{font-weight:600}.sc-group-all .sc-icon-btn,.sc-gene-root .sc-icon-btn,.sc-gene-group .sc-icon-btn{margin-left:auto;font-size:.85rem}.sc-count{flex:0 0 auto;font-size:.78rem;color:var(--text-color-secondary, #6c757d)}.sc-glyph-option{display:inline-flex;align-items:center;gap:.4rem}.sc-glyph-svg{width:1rem;height:1rem;fill:currentColor}:host ::ng-deep .sc-glyph-pick .p-dropdown-label{padding:.2rem .4rem}.sc-color-input{width:2.5rem;height:1.8rem;border:1px solid var(--surface-border, #ced4da);border-radius:4px;padding:0;background:none}.sc-row-number p-slider,.sc-row-range p-slider{flex:1 1 0;min-width:0}:host ::ng-deep .sc-num{width:4.5rem;padding:.3rem .4rem;text-align:center}:host ::ng-deep .sc-row-number p-inputnumber,:host ::ng-deep .sc-row-range p-inputnumber{flex:0 0 auto}.sc-gene-icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:1.4rem;height:1.4rem;padding:0;border:1px solid transparent;border-radius:4px;background:transparent;cursor:pointer}.sc-gene-icon:hover,.sc-gene-icon:focus-visible{border-color:var(--surface-border, rgba(0, 0, 0, .2))}:host{display:contents}.sc-key{padding:.5rem 0;border-top:1px solid var(--surface-border, #dee2e6);border-bottom:1px solid var(--surface-border, #dee2e6)}.sc-legend{list-style:none;margin:0;padding:0;max-height:11rem;overflow-y:auto;display:flex;flex-direction:column;gap:.2rem}.sc-legend li{display:flex}.sc-legend-btn{display:flex;align-items:center;gap:.45rem;width:100%;padding:.15rem .3rem;font:inherit;font-size:.8rem;text-align:left;background:none;border:1px solid transparent;border-radius:3px;cursor:pointer;color:inherit}.sc-legend-btn:hover{background:var(--surface-hover, rgba(0, 0, 0, .04))}.sc-legend-btn.selected{border-color:var(--primary-color, #3b82f6);background:var(--surface-hover, rgba(59, 130, 246, .08));font-weight:600}.sc-swatch{width:.85rem;height:.85rem;flex:0 0 auto;border-radius:2px;border:1px solid rgba(0,0,0,.2)}.sc-legend-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SharedModule }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i4.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "ngmodule", type: TreeSelectModule }, { kind: "component", type: i5.TreeSelect, selector: "p-treeSelect", inputs: ["inputId", "scrollHeight", "disabled", "metaKeySelection", "variant", "display", "selectionMode", "tabindex", "ariaLabel", "ariaLabelledBy", "placeholder", "panelClass", "panelStyle", "panelStyleClass", "containerStyle", "containerStyleClass", "labelStyle", "labelStyleClass", "overlayOptions", "emptyMessage", "appendTo", "filter", "filterBy", "filterMode", "filterPlaceholder", "filterLocale", "filterInputAutoFocus", "propagateSelectionDown", "propagateSelectionUp", "showClear", "resetFilterOnHide", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "autofocus", "options", "showTransitionOptions", "hideTransitionOptions", "loading"], outputs: ["onNodeExpand", "onNodeCollapse", "onShow", "onHide", "onClear", "onFilter", "onFocus", "onBlur", "onNodeUnselect", "onNodeSelect"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
87
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: SpatialKeyComponent, isStandalone: true, selector: "spatial-key", inputs: { controls: "controls", dataset: "dataset", view: "view", legend: "legend", colorBarCss: "colorBarCss", selectedCategory: "selectedCategory", colormapOptions: "colormapOptions" }, outputs: { categoryClicked: "categoryClicked" }, usesOnChanges: true, ngImport: i0, template: "<!-- Key: categorical legend or a continuous colour bar, built from the same\n functions the renderer uses so it cannot disagree with the canvas. -->\n<div class=\"sc-section sc-key\" *ngIf=\"view.colorBy\">\n <span class=\"sc-lbl\">{{ colorByLabel }}</span>\n <!-- Derived columns say so, so they are not mistaken for measured data. -->\n <small class=\"sc-hint\" *ngIf=\"activeDescription\">{{ activeDescription }}</small>\n\n <!-- Legend rows are buttons: clicking one selects that category, clicking\n it again clears \u2014 so a click is always reversible. -->\n <ul class=\"sc-legend\" *ngIf=\"isCategorical\">\n <li *ngFor=\"let entry of legend; index as i; trackBy: trackByLabel\">\n <button\n type=\"button\"\n class=\"sc-legend-btn\"\n [class.selected]=\"selectedCategory === i\"\n (click)=\"categoryClicked.emit(i)\"\n [title]=\"'Select ' + entry.label\"\n >\n <span class=\"sc-swatch\" [style.background]=\"entry.color\"></span>\n <span class=\"sc-legend-label\">{{ entry.label }}</span>\n </button>\n </li>\n </ul>\n\n <div *ngIf=\"isContinuous\">\n <div class=\"sc-colorbar\" [style.background]=\"colorBarCss\"></div>\n <div class=\"sc-colorbar-ends\">\n <span>low</span>\n <span class=\"sc-hint\">window from percentiles</span>\n <span>high</span>\n </div>\n <!-- The gradient this bar and the map are drawn with. Sits under the bar\n it controls, with the same swatch previews the image's colormap picker\n uses: which gradient reads best is a visual judgement, so a list of\n names would be the wrong control. Cleared = follow the image's. -->\n <div class=\"sc-row\">\n <span class=\"sc-lbl\">Colormap</span>\n <p-treeSelect\n [options]=\"colormapOptions\"\n [ngModel]=\"selectedColormapNode\"\n selectionMode=\"single\"\n [showClear]=\"true\"\n placeholder=\"Match the image\"\n [scrollHeight]=\"'260px'\"\n appendTo=\"body\"\n pTooltip=\"Colour scale for gene and numeric values \u2014 the markers, the gene map and this bar. Clear it to follow the image's colormap\"\n tooltipPosition=\"top\"\n (onNodeSelect)=\"onContinuousColormap($event.node)\"\n (onClear)=\"onContinuousColormap(null)\"\n >\n <ng-template let-node pTemplate=\"default\">\n <span class=\"sc-cmap-option\">\n <img *ngIf=\"!node.children && node.data?.src\" [src]=\"node.data.src\" class=\"sc-cmap-swatch\" alt=\"\" />\n <span>{{ node.label }}</span>\n </span>\n </ng-template>\n </p-treeSelect>\n <span class=\"sc-val\"></span>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";.sc-hint{font-size:.75rem;color:var(--text-color-secondary, #6c757d)}.sc-error{color:var(--red-600, #c62828)}.sc-section{display:flex;flex-direction:column;gap:.35rem}.sc-lbl{font-size:.78rem;color:var(--text-color-secondary, #6c757d);white-space:nowrap}.sc-row{display:flex;align-items:center;gap:.6rem}.sc-row p-slider,.sc-row p-dropdown,.sc-row p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row p-slider .p-slider{width:100%}:host ::ng-deep .sc-row p-dropdown .p-dropdown,:host ::ng-deep .sc-row p-treeSelect .p-treeselect{width:100%}.sc-row .sc-lbl{flex:0 0 calc(50% - .6rem);min-width:0;overflow:hidden;text-overflow:ellipsis}.sc-cmap-option{display:inline-flex;align-items:center;gap:.4rem}.sc-cmap-swatch{width:3.5rem;height:.7rem;border-radius:2px;display:block}.sc-val{flex:0 0 4rem;text-align:right;font-size:.78rem;font-variant-numeric:tabular-nums;white-space:nowrap}:host ::ng-deep .sc-full,:host ::ng-deep .sc-full .p-dropdown,:host ::ng-deep .sc-full .p-autocomplete,:host ::ng-deep .sc-full input{width:100%}.sc-colorbar{height:.75rem;border-radius:2px;border:1px solid rgba(0,0,0,.2)}.sc-colorbar-ends{display:flex;justify-content:space-between;font-size:.7rem;color:var(--text-color-secondary, #6c757d);margin-top:.2rem}.sc-panel{border:1px solid var(--surface-border, #dee2e6);border-radius:6px;margin-bottom:.5rem;overflow:hidden}.sc-panel-head{display:flex;align-items:center;gap:.6rem;padding:.5rem .7rem;cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--surface-100, #f5f6f7)}.sc-panel-head .sc-panel-title{flex:1;font-weight:600}.sc-panel.open>.sc-panel-head{background:var(--primary-color, #2196f3);color:var(--primary-color-text, #fff)}.sc-panel-body{display:flex;flex-direction:column;gap:.45rem;padding:.6rem .75rem .75rem}.sc-subhead{display:flex;align-items:center;gap:.5rem;margin-top:.4rem;font-size:.72rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-color-secondary, #6c757d)}.sc-subhead:after{content:\"\";flex:1;border-top:1px solid var(--surface-border, #dee2e6)}.sc-subsection{display:flex;flex-direction:column;gap:.45rem}.sc-subsection-head{cursor:pointer;-webkit-user-select:none;user-select:none}.sc-subsection-head i{font-size:.65rem}.sc-subsection-head:hover .sc-subsection-title{color:var(--primary-color, #3b82f6)}.sc-subsection-body{display:flex;flex-direction:column;gap:.45rem;padding-left:.6rem;border-left:2px solid var(--surface-border, #dee2e6)}:host ::ng-deep .sc-buttons .p-button{padding:.35rem .75rem;font-size:.85rem}.sc-row-picker p-dropdown,.sc-row-picker p-multiSelect,.sc-row-picker p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row-picker .sc-variant{width:6.5rem}:host ::ng-deep .sc-row-picker p-multiselect .p-multiselect{width:100%}:host ::ng-deep .sc-row-picker p-dropdown:has(.sc-variant){flex:0 0 6.5rem}:host ::ng-deep .sc-row-picker p-treeselect:has(.sc-palette){flex:0 0 3rem}:host ::ng-deep .sc-palette .p-treeselect-label{width:0;padding:0}.sc-icon-btn{flex:0 0 auto;border:0;background:transparent;cursor:pointer;padding:.25rem .35rem;font:inherit;font-size:1.05rem;color:var(--text-color, #333);border-radius:4px}.sc-icon-btn:hover{background:var(--surface-200, #e9ecef)}.sc-icon-btn.active{color:var(--primary-color, #2196f3);font-weight:700}.sc-icon-btn:disabled{opacity:.5;cursor:default}.sc-small-btn{margin-left:auto;border:1px solid var(--surface-border, #ced4da);background:var(--surface-0, #fff);border-radius:4px;padding:.2rem .6rem;font:inherit;font-size:.8rem;cursor:pointer}:host ::ng-deep .sc-group-heading{font-size:.7rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase;opacity:.7}.sc-group-list,.sc-gene-tree{max-height:16rem;overflow-y:auto;border:1px solid var(--surface-border, #dee2e6);border-radius:4px;padding:.25rem .4rem}.sc-group-row,.sc-gene-row{display:flex;align-items:center;gap:.45rem;padding:.15rem 0;font-size:.88rem}.sc-group-row .sc-group-label,.sc-gene-row .sc-group-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-group-all,.sc-gene-root,.sc-gene-group{font-weight:600}.sc-group-all .sc-icon-btn,.sc-gene-root .sc-icon-btn,.sc-gene-group .sc-icon-btn{margin-left:auto;font-size:.85rem}.sc-count{flex:0 0 auto;font-size:.78rem;color:var(--text-color-secondary, #6c757d)}.sc-glyph-option{display:inline-flex;align-items:center;gap:.4rem}.sc-glyph-svg{width:1rem;height:1rem;fill:currentColor}:host ::ng-deep .sc-glyph-pick .p-dropdown-label{padding:.2rem .4rem}.sc-color-input{width:2.5rem;height:1.8rem;border:1px solid var(--surface-border, #ced4da);border-radius:4px;padding:0;background:none}.sc-row-number p-slider,.sc-row-range p-slider{flex:1 1 0;min-width:0}:host ::ng-deep .sc-num{width:4.5rem;padding:.3rem .4rem;text-align:center}:host ::ng-deep .sc-row-number p-inputnumber,:host ::ng-deep .sc-row-range p-inputnumber{flex:0 0 auto}.sc-gene-icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:1.4rem;height:1.4rem;padding:0;border:1px solid transparent;border-radius:4px;background:transparent;cursor:pointer}.sc-gene-icon:hover,.sc-gene-icon:focus-visible{border-color:var(--surface-border, rgba(0, 0, 0, .2))}.sc-seltx-toggle{width:100%;padding:0;background:none;border:0;cursor:pointer;font-family:inherit;text-align:left}.sc-seltx-toggle i{font-size:.65rem}.sc-seltx-toggle:hover{color:var(--primary-color, #3b82f6)}.sc-seltx{display:flex;flex-direction:column;gap:.35rem}.sc-seltx-head{display:flex;align-items:baseline;gap:.5rem;min-width:0}.sc-seltx-label{font-size:.82rem;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-seltx-summary{display:flex;align-items:center;justify-content:space-between;font-size:.78rem}.sc-seltx-list{list-style:none;margin:0;padding:0;max-height:16rem;overflow-y:auto;font-size:.78rem}.sc-seltx-list.stale{opacity:.55}.sc-seltx-list li{display:grid;grid-template-columns:minmax(4rem,7rem) 1fr auto;align-items:center;gap:.5rem;padding:.1rem 0}.sc-seltx-gene{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-seltx-bar{height:.45rem;border-radius:2px;background:var(--surface-200, #e9ecef);overflow:hidden}.sc-seltx-bar span{display:block;height:100%;background:var(--primary-color, #3b82f6)}.sc-seltx-count{font-variant-numeric:tabular-nums;text-align:right;min-width:3rem}.sc-seltx-swatch{display:inline-block;width:.6rem;height:.6rem;margin-right:.35rem;border-radius:2px;vertical-align:baseline}.sc-seltx-measures{display:grid;grid-template-columns:minmax(4rem,1fr) auto;gap:.1rem .75rem;margin:0;font-size:.78rem}.sc-seltx-measures dt{color:var(--text-color-secondary, #6c757d);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-seltx-measures dd{margin:0;text-align:right;font-variant-numeric:tabular-nums}:host{display:contents}.sc-key{padding:.5rem 0;border-top:1px solid var(--surface-border, #dee2e6);border-bottom:1px solid var(--surface-border, #dee2e6)}.sc-legend{list-style:none;margin:0;padding:0;max-height:11rem;overflow-y:auto;display:flex;flex-direction:column;gap:.2rem}.sc-legend li{display:flex}.sc-legend-btn{display:flex;align-items:center;gap:.45rem;width:100%;padding:.15rem .3rem;font:inherit;font-size:.8rem;text-align:left;background:none;border:1px solid transparent;border-radius:3px;cursor:pointer;color:inherit}.sc-legend-btn:hover{background:var(--surface-hover, rgba(0, 0, 0, .04))}.sc-legend-btn.selected{border-color:var(--primary-color, #3b82f6);background:var(--surface-hover, rgba(59, 130, 246, .08));font-weight:600}.sc-swatch{width:.85rem;height:.85rem;flex:0 0 auto;border-radius:2px;border:1px solid rgba(0,0,0,.2)}.sc-legend-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SharedModule }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i4.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "ngmodule", type: TreeSelectModule }, { kind: "component", type: i5.TreeSelect, selector: "p-treeSelect", inputs: ["inputId", "scrollHeight", "disabled", "metaKeySelection", "variant", "display", "selectionMode", "tabindex", "ariaLabel", "ariaLabelledBy", "placeholder", "panelClass", "panelStyle", "panelStyleClass", "containerStyle", "containerStyleClass", "labelStyle", "labelStyleClass", "overlayOptions", "emptyMessage", "appendTo", "filter", "filterBy", "filterMode", "filterPlaceholder", "filterLocale", "filterInputAutoFocus", "propagateSelectionDown", "propagateSelectionUp", "showClear", "resetFilterOnHide", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "autofocus", "options", "showTransitionOptions", "hideTransitionOptions", "loading"], outputs: ["onNodeExpand", "onNodeCollapse", "onShow", "onHide", "onClear", "onFilter", "onFocus", "onBlur", "onNodeUnselect", "onNodeSelect"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
88
88
  }
89
89
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SpatialKeyComponent, decorators: [{
90
90
  type: Component,
91
- args: [{ selector: 'spatial-key', standalone: true, imports: [CommonModule, FormsModule, SharedModule, TooltipModule, TreeSelectModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Key: categorical legend or a continuous colour bar, built from the same\n functions the renderer uses so it cannot disagree with the canvas. -->\n<div class=\"sc-section sc-key\" *ngIf=\"view.colorBy\">\n <span class=\"sc-lbl\">{{ colorByLabel }}</span>\n <!-- Derived columns say so, so they are not mistaken for measured data. -->\n <small class=\"sc-hint\" *ngIf=\"activeDescription\">{{ activeDescription }}</small>\n\n <!-- Legend rows are buttons: clicking one selects that category, clicking\n it again clears \u2014 so a click is always reversible. -->\n <ul class=\"sc-legend\" *ngIf=\"isCategorical\">\n <li *ngFor=\"let entry of legend; index as i; trackBy: trackByLabel\">\n <button\n type=\"button\"\n class=\"sc-legend-btn\"\n [class.selected]=\"selectedCategory === i\"\n (click)=\"categoryClicked.emit(i)\"\n [title]=\"'Select ' + entry.label\"\n >\n <span class=\"sc-swatch\" [style.background]=\"entry.color\"></span>\n <span class=\"sc-legend-label\">{{ entry.label }}</span>\n </button>\n </li>\n </ul>\n\n <div *ngIf=\"isContinuous\">\n <div class=\"sc-colorbar\" [style.background]=\"colorBarCss\"></div>\n <div class=\"sc-colorbar-ends\">\n <span>low</span>\n <span class=\"sc-hint\">window from percentiles</span>\n <span>high</span>\n </div>\n <!-- The gradient this bar and the map are drawn with. Sits under the bar\n it controls, with the same swatch previews the image's colormap picker\n uses: which gradient reads best is a visual judgement, so a list of\n names would be the wrong control. Cleared = follow the image's. -->\n <div class=\"sc-row\">\n <span class=\"sc-lbl\">Colormap</span>\n <p-treeSelect\n [options]=\"colormapOptions\"\n [ngModel]=\"selectedColormapNode\"\n selectionMode=\"single\"\n [showClear]=\"true\"\n placeholder=\"Match the image\"\n [scrollHeight]=\"'260px'\"\n appendTo=\"body\"\n pTooltip=\"Colour scale for gene and numeric values \u2014 the markers, the gene map and this bar. Clear it to follow the image's colormap\"\n tooltipPosition=\"top\"\n (onNodeSelect)=\"onContinuousColormap($event.node)\"\n (onClear)=\"onContinuousColormap(null)\"\n >\n <ng-template let-node pTemplate=\"default\">\n <span class=\"sc-cmap-option\">\n <img *ngIf=\"!node.children && node.data?.src\" [src]=\"node.data.src\" class=\"sc-cmap-swatch\" alt=\"\" />\n <span>{{ node.label }}</span>\n </span>\n </ng-template>\n </p-treeSelect>\n <span class=\"sc-val\"></span>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";.sc-hint{font-size:.75rem;color:var(--text-color-secondary, #6c757d)}.sc-error{color:var(--red-600, #c62828)}.sc-section{display:flex;flex-direction:column;gap:.35rem}.sc-lbl{font-size:.78rem;color:var(--text-color-secondary, #6c757d);white-space:nowrap}.sc-row{display:flex;align-items:center;gap:.6rem}.sc-row p-slider,.sc-row p-dropdown,.sc-row p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row p-slider .p-slider{width:100%}:host ::ng-deep .sc-row p-dropdown .p-dropdown,:host ::ng-deep .sc-row p-treeSelect .p-treeselect{width:100%}.sc-row .sc-lbl{flex:0 0 calc(50% - .6rem);min-width:0;overflow:hidden;text-overflow:ellipsis}.sc-cmap-option{display:inline-flex;align-items:center;gap:.4rem}.sc-cmap-swatch{width:3.5rem;height:.7rem;border-radius:2px;display:block}.sc-val{flex:0 0 4rem;text-align:right;font-size:.78rem;font-variant-numeric:tabular-nums;white-space:nowrap}:host ::ng-deep .sc-full,:host ::ng-deep .sc-full .p-dropdown,:host ::ng-deep .sc-full .p-autocomplete,:host ::ng-deep .sc-full input{width:100%}.sc-colorbar{height:.75rem;border-radius:2px;border:1px solid rgba(0,0,0,.2)}.sc-colorbar-ends{display:flex;justify-content:space-between;font-size:.7rem;color:var(--text-color-secondary, #6c757d);margin-top:.2rem}.sc-panel{border:1px solid var(--surface-border, #dee2e6);border-radius:6px;margin-bottom:.5rem;overflow:hidden}.sc-panel-head{display:flex;align-items:center;gap:.6rem;padding:.5rem .7rem;cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--surface-100, #f5f6f7)}.sc-panel-head .sc-panel-title{flex:1;font-weight:600}.sc-panel.open>.sc-panel-head{background:var(--primary-color, #2196f3);color:var(--primary-color-text, #fff)}.sc-panel-body{display:flex;flex-direction:column;gap:.45rem;padding:.6rem .75rem .75rem}.sc-subhead{display:flex;align-items:center;gap:.5rem;margin-top:.4rem;font-size:.72rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-color-secondary, #6c757d)}.sc-subhead:after{content:\"\";flex:1;border-top:1px solid var(--surface-border, #dee2e6)}:host ::ng-deep .sc-buttons .p-button{padding:.35rem .75rem;font-size:.85rem}.sc-row-picker p-dropdown,.sc-row-picker p-multiSelect,.sc-row-picker p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row-picker .sc-variant{width:6.5rem}:host ::ng-deep .sc-row-picker p-multiselect .p-multiselect{width:100%}:host ::ng-deep .sc-row-picker p-dropdown:has(.sc-variant){flex:0 0 6.5rem}:host ::ng-deep .sc-row-picker p-treeselect:has(.sc-palette){flex:0 0 3rem}:host ::ng-deep .sc-palette .p-treeselect-label{width:0;padding:0}.sc-icon-btn{flex:0 0 auto;border:0;background:transparent;cursor:pointer;padding:.25rem .35rem;font:inherit;font-size:1.05rem;color:var(--text-color, #333);border-radius:4px}.sc-icon-btn:hover{background:var(--surface-200, #e9ecef)}.sc-icon-btn.active{color:var(--primary-color, #2196f3);font-weight:700}.sc-icon-btn:disabled{opacity:.5;cursor:default}.sc-small-btn{margin-left:auto;border:1px solid var(--surface-border, #ced4da);background:var(--surface-0, #fff);border-radius:4px;padding:.2rem .6rem;font:inherit;font-size:.8rem;cursor:pointer}:host ::ng-deep .sc-group-heading{font-size:.7rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase;opacity:.7}.sc-group-list,.sc-gene-tree{max-height:16rem;overflow-y:auto;border:1px solid var(--surface-border, #dee2e6);border-radius:4px;padding:.25rem .4rem}.sc-group-row,.sc-gene-row{display:flex;align-items:center;gap:.45rem;padding:.15rem 0;font-size:.88rem}.sc-group-row .sc-group-label,.sc-gene-row .sc-group-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-group-all,.sc-gene-root,.sc-gene-group{font-weight:600}.sc-group-all .sc-icon-btn,.sc-gene-root .sc-icon-btn,.sc-gene-group .sc-icon-btn{margin-left:auto;font-size:.85rem}.sc-count{flex:0 0 auto;font-size:.78rem;color:var(--text-color-secondary, #6c757d)}.sc-glyph-option{display:inline-flex;align-items:center;gap:.4rem}.sc-glyph-svg{width:1rem;height:1rem;fill:currentColor}:host ::ng-deep .sc-glyph-pick .p-dropdown-label{padding:.2rem .4rem}.sc-color-input{width:2.5rem;height:1.8rem;border:1px solid var(--surface-border, #ced4da);border-radius:4px;padding:0;background:none}.sc-row-number p-slider,.sc-row-range p-slider{flex:1 1 0;min-width:0}:host ::ng-deep .sc-num{width:4.5rem;padding:.3rem .4rem;text-align:center}:host ::ng-deep .sc-row-number p-inputnumber,:host ::ng-deep .sc-row-range p-inputnumber{flex:0 0 auto}.sc-gene-icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:1.4rem;height:1.4rem;padding:0;border:1px solid transparent;border-radius:4px;background:transparent;cursor:pointer}.sc-gene-icon:hover,.sc-gene-icon:focus-visible{border-color:var(--surface-border, rgba(0, 0, 0, .2))}:host{display:contents}.sc-key{padding:.5rem 0;border-top:1px solid var(--surface-border, #dee2e6);border-bottom:1px solid var(--surface-border, #dee2e6)}.sc-legend{list-style:none;margin:0;padding:0;max-height:11rem;overflow-y:auto;display:flex;flex-direction:column;gap:.2rem}.sc-legend li{display:flex}.sc-legend-btn{display:flex;align-items:center;gap:.45rem;width:100%;padding:.15rem .3rem;font:inherit;font-size:.8rem;text-align:left;background:none;border:1px solid transparent;border-radius:3px;cursor:pointer;color:inherit}.sc-legend-btn:hover{background:var(--surface-hover, rgba(0, 0, 0, .04))}.sc-legend-btn.selected{border-color:var(--primary-color, #3b82f6);background:var(--surface-hover, rgba(59, 130, 246, .08));font-weight:600}.sc-swatch{width:.85rem;height:.85rem;flex:0 0 auto;border-radius:2px;border:1px solid rgba(0,0,0,.2)}.sc-legend-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n"] }]
91
+ args: [{ selector: 'spatial-key', standalone: true, imports: [CommonModule, FormsModule, SharedModule, TooltipModule, TreeSelectModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Key: categorical legend or a continuous colour bar, built from the same\n functions the renderer uses so it cannot disagree with the canvas. -->\n<div class=\"sc-section sc-key\" *ngIf=\"view.colorBy\">\n <span class=\"sc-lbl\">{{ colorByLabel }}</span>\n <!-- Derived columns say so, so they are not mistaken for measured data. -->\n <small class=\"sc-hint\" *ngIf=\"activeDescription\">{{ activeDescription }}</small>\n\n <!-- Legend rows are buttons: clicking one selects that category, clicking\n it again clears \u2014 so a click is always reversible. -->\n <ul class=\"sc-legend\" *ngIf=\"isCategorical\">\n <li *ngFor=\"let entry of legend; index as i; trackBy: trackByLabel\">\n <button\n type=\"button\"\n class=\"sc-legend-btn\"\n [class.selected]=\"selectedCategory === i\"\n (click)=\"categoryClicked.emit(i)\"\n [title]=\"'Select ' + entry.label\"\n >\n <span class=\"sc-swatch\" [style.background]=\"entry.color\"></span>\n <span class=\"sc-legend-label\">{{ entry.label }}</span>\n </button>\n </li>\n </ul>\n\n <div *ngIf=\"isContinuous\">\n <div class=\"sc-colorbar\" [style.background]=\"colorBarCss\"></div>\n <div class=\"sc-colorbar-ends\">\n <span>low</span>\n <span class=\"sc-hint\">window from percentiles</span>\n <span>high</span>\n </div>\n <!-- The gradient this bar and the map are drawn with. Sits under the bar\n it controls, with the same swatch previews the image's colormap picker\n uses: which gradient reads best is a visual judgement, so a list of\n names would be the wrong control. Cleared = follow the image's. -->\n <div class=\"sc-row\">\n <span class=\"sc-lbl\">Colormap</span>\n <p-treeSelect\n [options]=\"colormapOptions\"\n [ngModel]=\"selectedColormapNode\"\n selectionMode=\"single\"\n [showClear]=\"true\"\n placeholder=\"Match the image\"\n [scrollHeight]=\"'260px'\"\n appendTo=\"body\"\n pTooltip=\"Colour scale for gene and numeric values \u2014 the markers, the gene map and this bar. Clear it to follow the image's colormap\"\n tooltipPosition=\"top\"\n (onNodeSelect)=\"onContinuousColormap($event.node)\"\n (onClear)=\"onContinuousColormap(null)\"\n >\n <ng-template let-node pTemplate=\"default\">\n <span class=\"sc-cmap-option\">\n <img *ngIf=\"!node.children && node.data?.src\" [src]=\"node.data.src\" class=\"sc-cmap-swatch\" alt=\"\" />\n <span>{{ node.label }}</span>\n </span>\n </ng-template>\n </p-treeSelect>\n <span class=\"sc-val\"></span>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";.sc-hint{font-size:.75rem;color:var(--text-color-secondary, #6c757d)}.sc-error{color:var(--red-600, #c62828)}.sc-section{display:flex;flex-direction:column;gap:.35rem}.sc-lbl{font-size:.78rem;color:var(--text-color-secondary, #6c757d);white-space:nowrap}.sc-row{display:flex;align-items:center;gap:.6rem}.sc-row p-slider,.sc-row p-dropdown,.sc-row p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row p-slider .p-slider{width:100%}:host ::ng-deep .sc-row p-dropdown .p-dropdown,:host ::ng-deep .sc-row p-treeSelect .p-treeselect{width:100%}.sc-row .sc-lbl{flex:0 0 calc(50% - .6rem);min-width:0;overflow:hidden;text-overflow:ellipsis}.sc-cmap-option{display:inline-flex;align-items:center;gap:.4rem}.sc-cmap-swatch{width:3.5rem;height:.7rem;border-radius:2px;display:block}.sc-val{flex:0 0 4rem;text-align:right;font-size:.78rem;font-variant-numeric:tabular-nums;white-space:nowrap}:host ::ng-deep .sc-full,:host ::ng-deep .sc-full .p-dropdown,:host ::ng-deep .sc-full .p-autocomplete,:host ::ng-deep .sc-full input{width:100%}.sc-colorbar{height:.75rem;border-radius:2px;border:1px solid rgba(0,0,0,.2)}.sc-colorbar-ends{display:flex;justify-content:space-between;font-size:.7rem;color:var(--text-color-secondary, #6c757d);margin-top:.2rem}.sc-panel{border:1px solid var(--surface-border, #dee2e6);border-radius:6px;margin-bottom:.5rem;overflow:hidden}.sc-panel-head{display:flex;align-items:center;gap:.6rem;padding:.5rem .7rem;cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--surface-100, #f5f6f7)}.sc-panel-head .sc-panel-title{flex:1;font-weight:600}.sc-panel.open>.sc-panel-head{background:var(--primary-color, #2196f3);color:var(--primary-color-text, #fff)}.sc-panel-body{display:flex;flex-direction:column;gap:.45rem;padding:.6rem .75rem .75rem}.sc-subhead{display:flex;align-items:center;gap:.5rem;margin-top:.4rem;font-size:.72rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-color-secondary, #6c757d)}.sc-subhead:after{content:\"\";flex:1;border-top:1px solid var(--surface-border, #dee2e6)}.sc-subsection{display:flex;flex-direction:column;gap:.45rem}.sc-subsection-head{cursor:pointer;-webkit-user-select:none;user-select:none}.sc-subsection-head i{font-size:.65rem}.sc-subsection-head:hover .sc-subsection-title{color:var(--primary-color, #3b82f6)}.sc-subsection-body{display:flex;flex-direction:column;gap:.45rem;padding-left:.6rem;border-left:2px solid var(--surface-border, #dee2e6)}:host ::ng-deep .sc-buttons .p-button{padding:.35rem .75rem;font-size:.85rem}.sc-row-picker p-dropdown,.sc-row-picker p-multiSelect,.sc-row-picker p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row-picker .sc-variant{width:6.5rem}:host ::ng-deep .sc-row-picker p-multiselect .p-multiselect{width:100%}:host ::ng-deep .sc-row-picker p-dropdown:has(.sc-variant){flex:0 0 6.5rem}:host ::ng-deep .sc-row-picker p-treeselect:has(.sc-palette){flex:0 0 3rem}:host ::ng-deep .sc-palette .p-treeselect-label{width:0;padding:0}.sc-icon-btn{flex:0 0 auto;border:0;background:transparent;cursor:pointer;padding:.25rem .35rem;font:inherit;font-size:1.05rem;color:var(--text-color, #333);border-radius:4px}.sc-icon-btn:hover{background:var(--surface-200, #e9ecef)}.sc-icon-btn.active{color:var(--primary-color, #2196f3);font-weight:700}.sc-icon-btn:disabled{opacity:.5;cursor:default}.sc-small-btn{margin-left:auto;border:1px solid var(--surface-border, #ced4da);background:var(--surface-0, #fff);border-radius:4px;padding:.2rem .6rem;font:inherit;font-size:.8rem;cursor:pointer}:host ::ng-deep .sc-group-heading{font-size:.7rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase;opacity:.7}.sc-group-list,.sc-gene-tree{max-height:16rem;overflow-y:auto;border:1px solid var(--surface-border, #dee2e6);border-radius:4px;padding:.25rem .4rem}.sc-group-row,.sc-gene-row{display:flex;align-items:center;gap:.45rem;padding:.15rem 0;font-size:.88rem}.sc-group-row .sc-group-label,.sc-gene-row .sc-group-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-group-all,.sc-gene-root,.sc-gene-group{font-weight:600}.sc-group-all .sc-icon-btn,.sc-gene-root .sc-icon-btn,.sc-gene-group .sc-icon-btn{margin-left:auto;font-size:.85rem}.sc-count{flex:0 0 auto;font-size:.78rem;color:var(--text-color-secondary, #6c757d)}.sc-glyph-option{display:inline-flex;align-items:center;gap:.4rem}.sc-glyph-svg{width:1rem;height:1rem;fill:currentColor}:host ::ng-deep .sc-glyph-pick .p-dropdown-label{padding:.2rem .4rem}.sc-color-input{width:2.5rem;height:1.8rem;border:1px solid var(--surface-border, #ced4da);border-radius:4px;padding:0;background:none}.sc-row-number p-slider,.sc-row-range p-slider{flex:1 1 0;min-width:0}:host ::ng-deep .sc-num{width:4.5rem;padding:.3rem .4rem;text-align:center}:host ::ng-deep .sc-row-number p-inputnumber,:host ::ng-deep .sc-row-range p-inputnumber{flex:0 0 auto}.sc-gene-icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:1.4rem;height:1.4rem;padding:0;border:1px solid transparent;border-radius:4px;background:transparent;cursor:pointer}.sc-gene-icon:hover,.sc-gene-icon:focus-visible{border-color:var(--surface-border, rgba(0, 0, 0, .2))}.sc-seltx-toggle{width:100%;padding:0;background:none;border:0;cursor:pointer;font-family:inherit;text-align:left}.sc-seltx-toggle i{font-size:.65rem}.sc-seltx-toggle:hover{color:var(--primary-color, #3b82f6)}.sc-seltx{display:flex;flex-direction:column;gap:.35rem}.sc-seltx-head{display:flex;align-items:baseline;gap:.5rem;min-width:0}.sc-seltx-label{font-size:.82rem;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-seltx-summary{display:flex;align-items:center;justify-content:space-between;font-size:.78rem}.sc-seltx-list{list-style:none;margin:0;padding:0;max-height:16rem;overflow-y:auto;font-size:.78rem}.sc-seltx-list.stale{opacity:.55}.sc-seltx-list li{display:grid;grid-template-columns:minmax(4rem,7rem) 1fr auto;align-items:center;gap:.5rem;padding:.1rem 0}.sc-seltx-gene{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-seltx-bar{height:.45rem;border-radius:2px;background:var(--surface-200, #e9ecef);overflow:hidden}.sc-seltx-bar span{display:block;height:100%;background:var(--primary-color, #3b82f6)}.sc-seltx-count{font-variant-numeric:tabular-nums;text-align:right;min-width:3rem}.sc-seltx-swatch{display:inline-block;width:.6rem;height:.6rem;margin-right:.35rem;border-radius:2px;vertical-align:baseline}.sc-seltx-measures{display:grid;grid-template-columns:minmax(4rem,1fr) auto;gap:.1rem .75rem;margin:0;font-size:.78rem}.sc-seltx-measures dt{color:var(--text-color-secondary, #6c757d);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-seltx-measures dd{margin:0;text-align:right;font-variant-numeric:tabular-nums}:host{display:contents}.sc-key{padding:.5rem 0;border-top:1px solid var(--surface-border, #dee2e6);border-bottom:1px solid var(--surface-border, #dee2e6)}.sc-legend{list-style:none;margin:0;padding:0;max-height:11rem;overflow-y:auto;display:flex;flex-direction:column;gap:.2rem}.sc-legend li{display:flex}.sc-legend-btn{display:flex;align-items:center;gap:.45rem;width:100%;padding:.15rem .3rem;font:inherit;font-size:.8rem;text-align:left;background:none;border:1px solid transparent;border-radius:3px;cursor:pointer;color:inherit}.sc-legend-btn:hover{background:var(--surface-hover, rgba(0, 0, 0, .04))}.sc-legend-btn.selected{border-color:var(--primary-color, #3b82f6);background:var(--surface-hover, rgba(59, 130, 246, .08));font-weight:600}.sc-swatch{width:.85rem;height:.85rem;flex:0 0 auto;border-radius:2px;border:1px solid rgba(0,0,0,.2)}.sc-legend-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n"] }]
92
92
  }], propDecorators: { controls: [{
93
93
  type: Input
94
94
  }], dataset: [{
@@ -129,4 +129,4 @@ export function colormapNodeFor(options, value) {
129
129
  }
130
130
  return null;
131
131
  }
132
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1rZXkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zcGF0aWFsLWNvbnRyb2xzL3NwYXRpYWwta2V5L3NwYXRpYWwta2V5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC1jb250cm9scy9zcGF0aWFsLWtleS9zcGF0aWFsLWtleS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFJdEQsT0FBTyxFQUdMLG9CQUFvQixHQUVyQixNQUFNLCtCQUErQixDQUFDOzs7Ozs7O0FBR3ZDOzs7Ozs7Ozs7R0FTRztBQVNILE1BQU0sT0FBTyxtQkFBbUI7SUFSaEM7UUFTRSxvR0FBb0c7UUFDM0YsYUFBUSxHQUE0QixJQUFJLENBQUM7UUFDbEQscUNBQXFDO1FBQzVCLFlBQU8sR0FBMEIsSUFBSSxDQUFDO1FBQy9DLDhEQUE4RDtRQUNyRCxTQUFJLEdBQXFCLG9CQUFvQixDQUFDO1FBQ3ZELDBFQUEwRTtRQUNqRSxXQUFNLEdBQWdDLElBQUksQ0FBQztRQUNwRCx5REFBeUQ7UUFDaEQsZ0JBQVcsR0FBa0IsSUFBSSxDQUFDO1FBQzNDLG1FQUFtRTtRQUMxRCxxQkFBZ0IsR0FBa0IsSUFBSSxDQUFDO1FBQ2hEOzs7O1dBSUc7UUFDTSxvQkFBZSxHQUFtQixFQUFFLENBQUM7UUFDOUMseUZBQXlGO1FBQ3RFLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUVoRSw4REFBOEQ7UUFDcEQseUJBQW9CLEdBQXdCLElBQUksQ0FBQztRQUMzRCw4REFBOEQ7UUFDcEQsaUJBQVksR0FBRyxhQUFhLENBQUM7UUFDdkM7Ozs7V0FJRztRQUNPLHNCQUFpQixHQUFrQixJQUFJLENBQUM7UUFvQmxEOzs7V0FHRztRQUNILHdGQUF3RjtRQUNyRSxpQkFBWSxHQUFHLENBQUMsQ0FBUyxFQUFFLEtBQXlCLEVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7S0FVakc7SUFqQ0MsV0FBVztRQUNULE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzdCLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsaUJBQWlCO1lBQ3BCLEVBQUUsRUFBRSxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsV0FBVyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDOUcsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBRUQsOERBQThEO0lBQzlELElBQWMsYUFBYTtRQUN6QixPQUFPLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDO0lBQzlCLENBQUM7SUFFRCx1RkFBdUY7SUFDdkYsSUFBYyxZQUFZO1FBQ3hCLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDO0lBQ3JELENBQUM7SUFTUyxvQkFBb0IsQ0FBQyxJQUF5QjtRQUN0RCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1FBQ2pDLCtFQUErRTtRQUMvRSw0RUFBNEU7UUFDNUUsNEVBQTRFO1FBQzVFLDZEQUE2RDtRQUM3RCxJQUFJLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7SUFDakYsQ0FBQzs4R0FqRVUsbUJBQW1CO2tHQUFuQixtQkFBbUIseVVDbkNoQyw0ckZBNkRBLCtxTEQvQlksWUFBWSwrUEFBRSxXQUFXLDhWQUFFLFlBQVkscUlBQUUsYUFBYSxxWEFBRSxnQkFBZ0I7OzJGQUt2RSxtQkFBbUI7a0JBUi9CLFNBQVM7K0JBQ0UsYUFBYSxjQUNYLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsQ0FBQyxtQkFHbEUsdUJBQXVCLENBQUMsTUFBTTs4QkFJdEMsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFNRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVhLGVBQWU7c0JBQWpDLE1BQU07O0FBZ0RULDJEQUEyRDtBQUMzRCxNQUFNLFVBQVUsWUFBWSxDQUFDLElBQXVDO0lBQ2xFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEIsSUFBSSxDQUFDLEVBQUU7UUFBRSxPQUFPLGFBQWEsQ0FBQztJQUM5QixPQUFPLEVBQUUsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQztBQUMvRCxDQUFDO0FBRUQsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSxlQUFlLENBQzdCLE9BQWdDLEVBQ2hDLEtBQTJCO0lBRTNCLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDeEIsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUM1QixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksRUFBRSxFQUFFLENBQUM7WUFDeEMsMEVBQTBFO1lBQzFFLHFFQUFxRTtZQUNyRSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxLQUFLLEtBQUs7Z0JBQUUsT0FBTyxJQUFJLENBQUM7UUFDOUMsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEtBQUssS0FBSztZQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ2hELENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU2hhcmVkTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0IHsgVG9vbHRpcE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdG9vbHRpcCc7XG5pbXBvcnQgeyBUcmVlU2VsZWN0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy90cmVlc2VsZWN0JztcblxuaW1wb3J0IHR5cGUgeyBJU3BhdGlhbENvbnRyb2xzIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHR5cGUgeyBTcGF0aWFsRGF0YXNldCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHtcbiAgQ29sb3JtYXBOb2RlLFxuICBDb2xvcm1hcFZhbHVlLFxuICBERUZBVUxUX1NQQVRJQUxfVklFVyxcbiAgU3BhdGlhbFZpZXdTdGF0ZSxcbn0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2Rpc3BsYXktdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBTcGF0aWFsTGVnZW5kRW50cnkgfSBmcm9tICcuL3NwYXRpYWwta2V5Lm1vZGVsJztcblxuLyoqXG4gKiBUaGUga2V5IGZvciB0aGUgYWN0aXZlIGNvbG91cmluZzogaXRzIG5hbWUsIGEgZGVzY3JpcHRpb24gd2hlbiB0aGUgY29sdW1uIGlzIGRlcml2ZWQsXG4gKiBhbmQgZWl0aGVyIGEgY2F0ZWdvcmljYWwgbGVnZW5kIHdob3NlIHJvd3Mgc2VsZWN0IHRoZWlyIGNhdGVnb3J5IG9yIGEgY29udGludW91cyBjb2xvdXJcbiAqIGJhciB3aXRoIHRoZSBjb2xvcm1hcCBwaWNrZXIgdGhhdCBkcml2ZXMgaXQuXG4gKlxuICogUHJlc2VudGF0aW9uYWwgb3ZlciB7QGxpbmsgU3BhdGlhbEtleU1vZGVsfSwgd2hpY2ggdGhlIGRpYWxvZyBrZWVwcyAodGhlIHJlc3Qgb2YgdGhlXG4gKiBwYW5lbCBuZWVkcyB0byBrbm93IHdoZXRoZXIgdGhlIGNvbG91cmluZyBpcyBjYXRlZ29yaWNhbCBldmVuIHdoaWxlIHRoZSBrZXkgaXMgbm90IG9uXG4gKiBzY3JlZW4pLiBXcml0ZXMgb25seSB0aGUgY29udGludW91cyBjb2xvcm1hcCwgdGhyb3VnaCBgY29udHJvbHMuc2V0Vmlld1N0YXRlYDsgYSBsZWdlbmRcbiAqIGNsaWNrIGdvZXMgdXAgYXMge0BsaW5rIGNhdGVnb3J5Q2xpY2tlZH0sIGJlY2F1c2UgdGhlIHNlbGVjdGlvbiBpcyB0aGUgZGlhbG9nJ3MuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NwYXRpYWwta2V5JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIFNoYXJlZE1vZHVsZSwgVG9vbHRpcE1vZHVsZSwgVHJlZVNlbGVjdE1vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9zcGF0aWFsLWtleS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NwYXRpYWwta2V5LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTcGF0aWFsS2V5Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgLyoqIFRoZSBzcGF0aWFsIGNvbnRyb2xzIHRoaXMgcGFuZWwgcmVhZHMgYW5kIHdyaXRlcyB0aHJvdWdoOyBudWxsIHdpdGhvdXQgYSBgU1BBVElBTF9EQVRBX1BPUlRgLiAqL1xuICBASW5wdXQoKSBjb250cm9sczogSVNwYXRpYWxDb250cm9scyB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGRhdGFzZXQgb24gb2ZmZXIsIG9yIG51bGwuICovXG4gIEBJbnB1dCgpIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgY3VycmVudCBzcGF0aWFsIHZpZXcgc3RhdGU6IHdoYXQgaXMgZHJhd24sIGFuZCBob3cuICovXG4gIEBJbnB1dCgpIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUgPSBERUZBVUxUX1NQQVRJQUxfVklFVztcbiAgLyoqIFRoZSBjYXRlZ29yaWNhbCBsZWdlbmQsIG9yIG51bGwgZm9yIGEgY29udGludW91cyAob3Igbm8pIGNvbG91cmluZy4gKi9cbiAgQElucHV0KCkgbGVnZW5kOiBTcGF0aWFsTGVnZW5kRW50cnlbXSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGNvbnRpbnVvdXMgY29sb3VyIGJhcidzIENTUyBncmFkaWVudCwgb3IgbnVsbC4gKi9cbiAgQElucHV0KCkgY29sb3JCYXJDc3M6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGxlZ2VuZCByb3cgd2hvc2UgY2F0ZWdvcnkgaXMgc2VsZWN0ZWQsIGZvciBoaWdobGlnaHRpbmcuICovXG4gIEBJbnB1dCgpIHNlbGVjdGVkQ2F0ZWdvcnk6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogQ29sb3JtYXAgdHJlZSBmb3IgdGhlIGNvbnRpbnVvdXMgY29sb3VyIHNjYWxlOiB0aGUgbGlicmFyeSdzIG93biBgQ09MT1JNQVBfT1BUSU9OU2AsXG4gICAqIHNob3duIHdpdGggdGhlIHNhbWUgc3dhdGNoZXMgdGhlIGltYWdlJ3MgY29sb3JtYXAgcGlja2VyIHVzZXMg4oCUIGNob29zaW5nIGEgZ3JhZGllbnRcbiAgICogaXMgYSB2aXN1YWwgZGVjaXNpb24sIHNvIGEgbGlzdCBvZiBuYW1lcyB3b3VsZCBiZSB0aGUgd3JvbmcgY29udHJvbC5cbiAgICovXG4gIEBJbnB1dCgpIGNvbG9ybWFwT3B0aW9uczogQ29sb3JtYXBOb2RlW10gPSBbXTtcbiAgLyoqIEEgbGVnZW5kIHJvdyB3YXMgY2xpY2tlZDogc2VsZWN0IHRoYXQgY2F0ZWdvcnkgKG9yIGNsZWFyIGl0LCB3aGVuIGl0IGlzIHNlbGVjdGVkKS4gKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IGNhdGVnb3J5Q2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gIC8qKiBUaGUgbm9kZSBjdXJyZW50bHkgcGlja2VkIGZyb20ge0BsaW5rIGNvbG9ybWFwT3B0aW9uc30uICovXG4gIHByb3RlY3RlZCBzZWxlY3RlZENvbG9ybWFwTm9kZTogQ29sb3JtYXBOb2RlIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBMYWJlbCBmb3IgdGhlIGN1cnJlbnQgY29sb3VyaW5nLCBmb3IgdGhlIGtleSdzIGhlYWRpbmcuICovXG4gIHByb3RlY3RlZCBjb2xvckJ5TGFiZWwgPSAnRmxhdCBjb2xvdXInO1xuICAvKipcbiAgICogRGVzY3JpcHRpb24gb2YgdGhlIGFjdGl2ZSBjb2x1bW4sIHdoZW4gaXQgaGFzIG9uZS4gU3VyZmFjZWQgYmVjYXVzZSBhIERFUklWRUQgY29sdW1uXG4gICAqIChrLW1lYW5zIGNsdXN0ZXJzLCBRQyB0b3RhbHMgY29tcHV0ZWQgYXQgY29udmVyc2lvbikgbXVzdCBub3QgcmVhZCBhcyB0aG91Z2ggaXQgY2FtZVxuICAgKiB3aXRoIHRoZSBkYXRhLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFjdGl2ZURlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICBjb25zdCBieSA9IHRoaXMudmlldy5jb2xvckJ5O1xuICAgIHRoaXMuY29sb3JCeUxhYmVsID0gY29sb3JCeUxhYmVsKHRoaXMudmlldyk7XG4gICAgdGhpcy5hY3RpdmVEZXNjcmlwdGlvbiA9XG4gICAgICBieT8ua2luZCA9PT0gJ2NvbHVtbicgPyAodGhpcy5kYXRhc2V0Py5jb2x1bW5zLmZpbmQoKGMpID0+IGMubmFtZSA9PT0gYnkubmFtZSk/LmRlc2NyaXB0aW9uID8/IG51bGwpIDogbnVsbDtcbiAgICB0aGlzLnNlbGVjdGVkQ29sb3JtYXBOb2RlID0gY29sb3JtYXBOb2RlRm9yKHRoaXMuY29sb3JtYXBPcHRpb25zLCB0aGlzLnZpZXcuY29udGludW91c0NvbG9ybWFwKTtcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gdGhlIGFjdGl2ZSBjb2xvdXJpbmcgaXMgYSBjYXRlZ29yaWNhbCBjb2x1bW4uICovXG4gIHByb3RlY3RlZCBnZXQgaXNDYXRlZ29yaWNhbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sZWdlbmQgIT09IG51bGw7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgY29sb3VyIGJhciBhcHBsaWVzOiB0aGVyZSBpcyBhIGNvbG91cmluZywgYW5kIGl0IGlzIG5vdCBjYXRlZ29yaWNhbC4gKi9cbiAgcHJvdGVjdGVkIGdldCBpc0NvbnRpbnVvdXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy52aWV3LmNvbG9yQnkgJiYgdGhpcy5sZWdlbmQgPT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNvbnRpbnVvdXMgY29sb3VyIHNjYWxlJ3MgY29sb3JtYXAuIENsZWFyaW5nIGl0IGdvZXMgYmFjayB0byBmb2xsb3dpbmcgdGhlXG4gICAqIGltYWdlJ3MsIHdoaWNoIGlzIHRoZSBkZWZhdWx0LlxuICAgKi9cbiAgLyoqIEtlZXBzIHRoZSBsZWdlbmQgcm93cyBhY3Jvc3MgYSByZWZyZXNoIG9mIHRoZSBzYW1lIGNhdGVnb3JpZXMgKG9uZSBwZXIgY2F0ZWdvcnkpLiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdHJhY2tCeUxhYmVsID0gKF86IG51bWJlciwgZW50cnk6IFNwYXRpYWxMZWdlbmRFbnRyeSk6IHN0cmluZyA9PiBlbnRyeS5sYWJlbDtcblxuICBwcm90ZWN0ZWQgb25Db250aW51b3VzQ29sb3JtYXAobm9kZTogQ29sb3JtYXBOb2RlIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRDb2xvcm1hcE5vZGUgPSBub2RlO1xuICAgIC8vIFRoZSB2YWx1ZSBpcyBhIENvbG9ybWFwVmFsdWUsIHdoaWNoIGlzIGEgTkFNRSBmb3IgdGhlIGJ1aWx0LWluIHNjYWxlcyBhbmQgYW5cbiAgICAvLyBpbmxpbmUgYFtzdG9wLCBjb2xvdXJdYCBhcnJheSBmb3IgdGhlIHJlc3Qg4oCUIGhhbGYgdGhlIGxpYnJhcnkncyBjb2xvcm1hcHNcbiAgICAvLyBhcmUgdGhlIGFycmF5IGtpbmQsIHNvIGFueXRoaW5nIHRoYXQgb25seSBhY2NlcHRzIGEgc3RyaW5nIHNpbGVudGx5IGRyb3BzXG4gICAgLy8gdGhlbS4gQSBncm91cCByb3cgY2FycmllcyBubyB2YWx1ZSBhbmQgY2xlYXJzIHRoZSBzZXR0aW5nLlxuICAgIHRoaXMuY29udHJvbHM/LnNldFZpZXdTdGF0ZSh7IGNvbnRpbnVvdXNDb2xvcm1hcDogbm9kZT8uZGF0YT8udmFsdWUgPz8gbnVsbCB9KTtcbiAgfVxufVxuXG4vKiogTGFiZWwgZm9yIGB2aWV3YCdzIGNvbG91cmluZywgZm9yIHRoZSBrZXkncyBoZWFkaW5nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbG9yQnlMYWJlbCh2aWV3OiBQaWNrPFNwYXRpYWxWaWV3U3RhdGUsICdjb2xvckJ5Jz4pOiBzdHJpbmcge1xuICBjb25zdCBieSA9IHZpZXcuY29sb3JCeTtcbiAgaWYgKCFieSkgcmV0dXJuICdGbGF0IGNvbG91cic7XG4gIHJldHVybiBieS5raW5kID09PSAnZmVhdHVyZScgPyBgR2VuZSDCtyAke2J5Lm5hbWV9YCA6IGJ5Lm5hbWU7XG59XG5cbi8qKiBUaGUgdHJlZSBub2RlIGhvbGRpbmcgYSBjb2xvcm1hcCB2YWx1ZSwgc28gdGhlIHBpY2tlciBzaG93cyB3aGF0IGlzIGluIHVzZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xvcm1hcE5vZGVGb3IoXG4gIG9wdGlvbnM6IHJlYWRvbmx5IENvbG9ybWFwTm9kZVtdLFxuICB2YWx1ZTogQ29sb3JtYXBWYWx1ZSB8IG51bGwsXG4pOiBDb2xvcm1hcE5vZGUgfCBudWxsIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gIGZvciAoY29uc3QgZ3JvdXAgb2Ygb3B0aW9ucykge1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBncm91cC5jaGlsZHJlbiA/PyBbXSkge1xuICAgICAgLy8gUmVmZXJlbmNlIGVxdWFsaXR5OiB0aGUgdmFsdWUgY2FtZSBvdXQgb2YgdGhpcyBzYW1lIHRyZWUsIGFuZCBhbiBpbmxpbmVcbiAgICAgIC8vIHNjYWxlIGlzIGEgMjU2LWVudHJ5IGFycmF5IG5vdCB3b3J0aCBjb21wYXJpbmcgZWxlbWVudCBieSBlbGVtZW50LlxuICAgICAgaWYgKG5vZGUuZGF0YT8udmFsdWUgPT09IHZhbHVlKSByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgaWYgKGdyb3VwLmRhdGE/LnZhbHVlID09PSB2YWx1ZSkgcmV0dXJuIGdyb3VwO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuIiwiPCEtLSBLZXk6IGNhdGVnb3JpY2FsIGxlZ2VuZCBvciBhIGNvbnRpbnVvdXMgY29sb3VyIGJhciwgYnVpbHQgZnJvbSB0aGUgc2FtZVxuICAgICBmdW5jdGlvbnMgdGhlIHJlbmRlcmVyIHVzZXMgc28gaXQgY2Fubm90IGRpc2FncmVlIHdpdGggdGhlIGNhbnZhcy4gLS0+XG48ZGl2IGNsYXNzPVwic2Mtc2VjdGlvbiBzYy1rZXlcIiAqbmdJZj1cInZpZXcuY29sb3JCeVwiPlxuICA8c3BhbiBjbGFzcz1cInNjLWxibFwiPnt7IGNvbG9yQnlMYWJlbCB9fTwvc3Bhbj5cbiAgPCEtLSBEZXJpdmVkIGNvbHVtbnMgc2F5IHNvLCBzbyB0aGV5IGFyZSBub3QgbWlzdGFrZW4gZm9yIG1lYXN1cmVkIGRhdGEuIC0tPlxuICA8c21hbGwgY2xhc3M9XCJzYy1oaW50XCIgKm5nSWY9XCJhY3RpdmVEZXNjcmlwdGlvblwiPnt7IGFjdGl2ZURlc2NyaXB0aW9uIH19PC9zbWFsbD5cblxuICA8IS0tIExlZ2VuZCByb3dzIGFyZSBidXR0b25zOiBjbGlja2luZyBvbmUgc2VsZWN0cyB0aGF0IGNhdGVnb3J5LCBjbGlja2luZ1xuICAgICAgIGl0IGFnYWluIGNsZWFycyDigJQgc28gYSBjbGljayBpcyBhbHdheXMgcmV2ZXJzaWJsZS4gLS0+XG4gIDx1bCBjbGFzcz1cInNjLWxlZ2VuZFwiICpuZ0lmPVwiaXNDYXRlZ29yaWNhbFwiPlxuICAgIDxsaSAqbmdGb3I9XCJsZXQgZW50cnkgb2YgbGVnZW5kOyBpbmRleCBhcyBpOyB0cmFja0J5OiB0cmFja0J5TGFiZWxcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwic2MtbGVnZW5kLWJ0blwiXG4gICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJzZWxlY3RlZENhdGVnb3J5ID09PSBpXCJcbiAgICAgICAgKGNsaWNrKT1cImNhdGVnb3J5Q2xpY2tlZC5lbWl0KGkpXCJcbiAgICAgICAgW3RpdGxlXT1cIidTZWxlY3QgJyArIGVudHJ5LmxhYmVsXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzYy1zd2F0Y2hcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJlbnRyeS5jb2xvclwiPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzYy1sZWdlbmQtbGFiZWxcIj57eyBlbnRyeS5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbGk+XG4gIDwvdWw+XG5cbiAgPGRpdiAqbmdJZj1cImlzQ29udGludW91c1wiPlxuICAgIDxkaXYgY2xhc3M9XCJzYy1jb2xvcmJhclwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImNvbG9yQmFyQ3NzXCI+PC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInNjLWNvbG9yYmFyLWVuZHNcIj5cbiAgICAgIDxzcGFuPmxvdzwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwic2MtaGludFwiPndpbmRvdyBmcm9tIHBlcmNlbnRpbGVzPC9zcGFuPlxuICAgICAgPHNwYW4+aGlnaDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIFRoZSBncmFkaWVudCB0aGlzIGJhciBhbmQgdGhlIG1hcCBhcmUgZHJhd24gd2l0aC4gU2l0cyB1bmRlciB0aGUgYmFyXG4gICAgICAgICBpdCBjb250cm9scywgd2l0aCB0aGUgc2FtZSBzd2F0Y2ggcHJldmlld3MgdGhlIGltYWdlJ3MgY29sb3JtYXAgcGlja2VyXG4gICAgICAgICB1c2VzOiB3aGljaCBncmFkaWVudCByZWFkcyBiZXN0IGlzIGEgdmlzdWFsIGp1ZGdlbWVudCwgc28gYSBsaXN0IG9mXG4gICAgICAgICBuYW1lcyB3b3VsZCBiZSB0aGUgd3JvbmcgY29udHJvbC4gQ2xlYXJlZCA9IGZvbGxvdyB0aGUgaW1hZ2Uncy4gLS0+XG4gICAgPGRpdiBjbGFzcz1cInNjLXJvd1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJzYy1sYmxcIj5Db2xvcm1hcDwvc3Bhbj5cbiAgICAgIDxwLXRyZWVTZWxlY3RcbiAgICAgICAgW29wdGlvbnNdPVwiY29sb3JtYXBPcHRpb25zXCJcbiAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRDb2xvcm1hcE5vZGVcIlxuICAgICAgICBzZWxlY3Rpb25Nb2RlPVwic2luZ2xlXCJcbiAgICAgICAgW3Nob3dDbGVhcl09XCJ0cnVlXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJNYXRjaCB0aGUgaW1hZ2VcIlxuICAgICAgICBbc2Nyb2xsSGVpZ2h0XT1cIicyNjBweCdcIlxuICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgICBwVG9vbHRpcD1cIkNvbG91ciBzY2FsZSBmb3IgZ2VuZSBhbmQgbnVtZXJpYyB2YWx1ZXMg4oCUIHRoZSBtYXJrZXJzLCB0aGUgZ2VuZSBtYXAgYW5kIHRoaXMgYmFyLiBDbGVhciBpdCB0byBmb2xsb3cgdGhlIGltYWdlJ3MgY29sb3JtYXBcIlxuICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxuICAgICAgICAob25Ob2RlU2VsZWN0KT1cIm9uQ29udGludW91c0NvbG9ybWFwKCRldmVudC5ub2RlKVwiXG4gICAgICAgIChvbkNsZWFyKT1cIm9uQ29udGludW91c0NvbG9ybWFwKG51bGwpXCJcbiAgICAgID5cbiAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1ub2RlIHBUZW1wbGF0ZT1cImRlZmF1bHRcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNjLWNtYXAtb3B0aW9uXCI+XG4gICAgICAgICAgICA8aW1nICpuZ0lmPVwiIW5vZGUuY2hpbGRyZW4gJiYgbm9kZS5kYXRhPy5zcmNcIiBbc3JjXT1cIm5vZGUuZGF0YS5zcmNcIiBjbGFzcz1cInNjLWNtYXAtc3dhdGNoXCIgYWx0PVwiXCIgLz5cbiAgICAgICAgICAgIDxzcGFuPnt7IG5vZGUubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9wLXRyZWVTZWxlY3Q+XG4gICAgICA8c3BhbiBjbGFzcz1cInNjLXZhbFwiPjwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1rZXkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zcGF0aWFsLWNvbnRyb2xzL3NwYXRpYWwta2V5L3NwYXRpYWwta2V5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC1jb250cm9scy9zcGF0aWFsLWtleS9zcGF0aWFsLWtleS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFJdEQsT0FBTyxFQUdMLG9CQUFvQixHQUVyQixNQUFNLCtCQUErQixDQUFDOzs7Ozs7O0FBR3ZDOzs7Ozs7Ozs7R0FTRztBQVNILE1BQU0sT0FBTyxtQkFBbUI7SUFSaEM7UUFTRSxvR0FBb0c7UUFDM0YsYUFBUSxHQUE0QixJQUFJLENBQUM7UUFDbEQscUNBQXFDO1FBQzVCLFlBQU8sR0FBMEIsSUFBSSxDQUFDO1FBQy9DLDhEQUE4RDtRQUNyRCxTQUFJLEdBQXFCLG9CQUFvQixDQUFDO1FBQ3ZELDBFQUEwRTtRQUNqRSxXQUFNLEdBQWdDLElBQUksQ0FBQztRQUNwRCx5REFBeUQ7UUFDaEQsZ0JBQVcsR0FBa0IsSUFBSSxDQUFDO1FBQzNDLG1FQUFtRTtRQUMxRCxxQkFBZ0IsR0FBa0IsSUFBSSxDQUFDO1FB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QyxVQUFVLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQztBQUMvRCxDQUFDO0FBRUQsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSxlQUFlLENBQzdCLE9BQWdDLEVBQ2hDLEtBQTJCO0lBRTNCLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDeEIsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUM1QixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksRUFBRSxFQUFFLENBQUM7WUFDeEMsMEVBQTBFO1lBQzFFLHFFQUFxRTtZQUNyRSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxLQUFLLEtBQUs7Z0JBQUUsT0FBTyxJQUFJLENBQUM7UUFDOUMsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEtBQUssS0FBSztZQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ2hELENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU2hhcmVkTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0IHsgVG9vbHRpcE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdG9vbHRpcCc7XG5pbXBvcnQgeyBUcmVlU2VsZWN0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy90cmVlc2VsZWN0JztcblxuaW1wb3J0IHR5cGUgeyBJU3BhdGlhbENvbnRyb2xzIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHR5cGUgeyBTcGF0aWFsRGF0YXNldCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHtcbiAgQ29sb3JtYXBOb2RlLFxuICBDb2xvcm1hcFZhbHVlLFxuICBERUZBVUxUX1NQQVRJQUxfVklFVyxcbiAgU3BhdGlhbFZpZXdTdGF0ZSxcbn0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2Rpc3BsYXktdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBTcGF0aWFsTGVnZW5kRW50cnkgfSBmcm9tICcuL3NwYXRpYWwta2V5Lm1vZGVsJztcblxuLyoqXG4gKiBUaGUga2V5IGZvciB0aGUgYWN0aXZlIGNvbG91cmluZzogaXRzIG5hbWUsIGEgZGVzY3JpcHRpb24gd2hlbiB0aGUgY29sdW1uIGlzIGRlcml2ZWQsXG4gKiBhbmQgZWl0aGVyIGEgY2F0ZWdvcmljYWwgbGVnZW5kIHdob3NlIHJvd3Mgc2VsZWN0IHRoZWlyIGNhdGVnb3J5IG9yIGEgY29udGludW91cyBjb2xvdXJcbiAqIGJhciB3aXRoIHRoZSBjb2xvcm1hcCBwaWNrZXIgdGhhdCBkcml2ZXMgaXQuXG4gKlxuICogUHJlc2VudGF0aW9uYWwgb3ZlciB7QGxpbmsgU3BhdGlhbEtleU1vZGVsfSwgd2hpY2ggdGhlIGRpYWxvZyBrZWVwcyAodGhlIHJlc3Qgb2YgdGhlXG4gKiBwYW5lbCBuZWVkcyB0byBrbm93IHdoZXRoZXIgdGhlIGNvbG91cmluZyBpcyBjYXRlZ29yaWNhbCBldmVuIHdoaWxlIHRoZSBrZXkgaXMgbm90IG9uXG4gKiBzY3JlZW4pLiBXcml0ZXMgb25seSB0aGUgY29udGludW91cyBjb2xvcm1hcCwgdGhyb3VnaCBgY29udHJvbHMuc2V0Vmlld1N0YXRlYDsgYSBsZWdlbmRcbiAqIGNsaWNrIGdvZXMgdXAgYXMge0BsaW5rIGNhdGVnb3J5Q2xpY2tlZH0sIGJlY2F1c2UgdGhlIHNlbGVjdGlvbiBpcyB0aGUgZGlhbG9nJ3MuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NwYXRpYWwta2V5JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIFNoYXJlZE1vZHVsZSwgVG9vbHRpcE1vZHVsZSwgVHJlZVNlbGVjdE1vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9zcGF0aWFsLWtleS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NwYXRpYWwta2V5LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTcGF0aWFsS2V5Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgLyoqIFRoZSBzcGF0aWFsIGNvbnRyb2xzIHRoaXMgcGFuZWwgcmVhZHMgYW5kIHdyaXRlcyB0aHJvdWdoOyBudWxsIHdpdGhvdXQgYSBgU1BBVElBTF9EQVRBX1BPUlRgLiAqL1xuICBASW5wdXQoKSBjb250cm9sczogSVNwYXRpYWxDb250cm9scyB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGRhdGFzZXQgb24gb2ZmZXIsIG9yIG51bGwuICovXG4gIEBJbnB1dCgpIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgY3VycmVudCBzcGF0aWFsIHZpZXcgc3RhdGU6IHdoYXQgaXMgZHJhd24sIGFuZCBob3cuICovXG4gIEBJbnB1dCgpIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUgPSBERUZBVUxUX1NQQVRJQUxfVklFVztcbiAgLyoqIFRoZSBjYXRlZ29yaWNhbCBsZWdlbmQsIG9yIG51bGwgZm9yIGEgY29udGludW91cyAob3Igbm8pIGNvbG91cmluZy4gKi9cbiAgQElucHV0KCkgbGVnZW5kOiBTcGF0aWFsTGVnZW5kRW50cnlbXSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGNvbnRpbnVvdXMgY29sb3VyIGJhcidzIENTUyBncmFkaWVudCwgb3IgbnVsbC4gKi9cbiAgQElucHV0KCkgY29sb3JCYXJDc3M6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGxlZ2VuZCByb3cgd2hvc2UgY2F0ZWdvcnkgaXMgc2VsZWN0ZWQsIGZvciBoaWdobGlnaHRpbmcuICovXG4gIEBJbnB1dCgpIHNlbGVjdGVkQ2F0ZWdvcnk6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogQ29sb3JtYXAgdHJlZSBmb3IgdGhlIGNvbnRpbnVvdXMgY29sb3VyIHNjYWxlOiB0aGUgbGlicmFyeSdzIG93biBgQ09MT1JNQVBfT1BUSU9OU2AsXG4gICAqIHNob3duIHdpdGggdGhlIHNhbWUgc3dhdGNoZXMgdGhlIGltYWdlJ3MgY29sb3JtYXAgcGlja2VyIHVzZXMg4oCUIGNob29zaW5nIGEgZ3JhZGllbnRcbiAgICogaXMgYSB2aXN1YWwgZGVjaXNpb24sIHNvIGEgbGlzdCBvZiBuYW1lcyB3b3VsZCBiZSB0aGUgd3JvbmcgY29udHJvbC5cbiAgICovXG4gIEBJbnB1dCgpIGNvbG9ybWFwT3B0aW9uczogQ29sb3JtYXBOb2RlW10gPSBbXTtcbiAgLyoqIEEgbGVnZW5kIHJvdyB3YXMgY2xpY2tlZDogc2VsZWN0IHRoYXQgY2F0ZWdvcnkgKG9yIGNsZWFyIGl0LCB3aGVuIGl0IGlzIHNlbGVjdGVkKS4gKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IGNhdGVnb3J5Q2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gIC8qKiBUaGUgbm9kZSBjdXJyZW50bHkgcGlja2VkIGZyb20ge0BsaW5rIGNvbG9ybWFwT3B0aW9uc30uICovXG4gIHByb3RlY3RlZCBzZWxlY3RlZENvbG9ybWFwTm9kZTogQ29sb3JtYXBOb2RlIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBMYWJlbCBmb3IgdGhlIGN1cnJlbnQgY29sb3VyaW5nLCBmb3IgdGhlIGtleSdzIGhlYWRpbmcuICovXG4gIHByb3RlY3RlZCBjb2xvckJ5TGFiZWwgPSAnRmxhdCBjb2xvdXInO1xuICAvKipcbiAgICogRGVzY3JpcHRpb24gb2YgdGhlIGFjdGl2ZSBjb2x1bW4sIHdoZW4gaXQgaGFzIG9uZS4gU3VyZmFjZWQgYmVjYXVzZSBhIERFUklWRUQgY29sdW1uXG4gICAqIChrLW1lYW5zIGNsdXN0ZXJzLCBRQyB0b3RhbHMgY29tcHV0ZWQgYXQgY29udmVyc2lvbikgbXVzdCBub3QgcmVhZCBhcyB0aG91Z2ggaXQgY2FtZVxuICAgKiB3aXRoIHRoZSBkYXRhLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFjdGl2ZURlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICBjb25zdCBieSA9IHRoaXMudmlldy5jb2xvckJ5O1xuICAgIHRoaXMuY29sb3JCeUxhYmVsID0gY29sb3JCeUxhYmVsKHRoaXMudmlldyk7XG4gICAgdGhpcy5hY3RpdmVEZXNjcmlwdGlvbiA9XG4gICAgICBieT8ua2luZCA9PT0gJ2NvbHVtbicgPyAodGhpcy5kYXRhc2V0Py5jb2x1bW5zLmZpbmQoKGMpID0+IGMubmFtZSA9PT0gYnkubmFtZSk/LmRlc2NyaXB0aW9uID8/IG51bGwpIDogbnVsbDtcbiAgICB0aGlzLnNlbGVjdGVkQ29sb3JtYXBOb2RlID0gY29sb3JtYXBOb2RlRm9yKHRoaXMuY29sb3JtYXBPcHRpb25zLCB0aGlzLnZpZXcuY29udGludW91c0NvbG9ybWFwKTtcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gdGhlIGFjdGl2ZSBjb2xvdXJpbmcgaXMgYSBjYXRlZ29yaWNhbCBjb2x1bW4uICovXG4gIHByb3RlY3RlZCBnZXQgaXNDYXRlZ29yaWNhbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sZWdlbmQgIT09IG51bGw7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgY29sb3VyIGJhciBhcHBsaWVzOiB0aGVyZSBpcyBhIGNvbG91cmluZywgYW5kIGl0IGlzIG5vdCBjYXRlZ29yaWNhbC4gKi9cbiAgcHJvdGVjdGVkIGdldCBpc0NvbnRpbnVvdXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy52aWV3LmNvbG9yQnkgJiYgdGhpcy5sZWdlbmQgPT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNvbnRpbnVvdXMgY29sb3VyIHNjYWxlJ3MgY29sb3JtYXAuIENsZWFyaW5nIGl0IGdvZXMgYmFjayB0byBmb2xsb3dpbmcgdGhlXG4gICAqIGltYWdlJ3MsIHdoaWNoIGlzIHRoZSBkZWZhdWx0LlxuICAgKi9cbiAgLyoqIEtlZXBzIHRoZSBsZWdlbmQgcm93cyBhY3Jvc3MgYSByZWZyZXNoIG9mIHRoZSBzYW1lIGNhdGVnb3JpZXMgKG9uZSBwZXIgY2F0ZWdvcnkpLiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdHJhY2tCeUxhYmVsID0gKF86IG51bWJlciwgZW50cnk6IFNwYXRpYWxMZWdlbmRFbnRyeSk6IHN0cmluZyA9PiBlbnRyeS5sYWJlbDtcblxuICBwcm90ZWN0ZWQgb25Db250aW51b3VzQ29sb3JtYXAobm9kZTogQ29sb3JtYXBOb2RlIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRDb2xvcm1hcE5vZGUgPSBub2RlO1xuICAgIC8vIFRoZSB2YWx1ZSBpcyBhIENvbG9ybWFwVmFsdWUsIHdoaWNoIGlzIGEgTkFNRSBmb3IgdGhlIGJ1aWx0LWluIHNjYWxlcyBhbmQgYW5cbiAgICAvLyBpbmxpbmUgYFtzdG9wLCBjb2xvdXJdYCBhcnJheSBmb3IgdGhlIHJlc3Qg4oCUIGhhbGYgdGhlIGxpYnJhcnkncyBjb2xvcm1hcHNcbiAgICAvLyBhcmUgdGhlIGFycmF5IGtpbmQsIHNvIGFueXRoaW5nIHRoYXQgb25seSBhY2NlcHRzIGEgc3RyaW5nIHNpbGVudGx5IGRyb3BzXG4gICAgLy8gdGhlbS4gQSBncm91cCByb3cgY2FycmllcyBubyB2YWx1ZSBhbmQgY2xlYXJzIHRoZSBzZXR0aW5nLlxuICAgIHRoaXMuY29udHJvbHM/LnNldFZpZXdTdGF0ZSh7IGNvbnRpbnVvdXNDb2xvcm1hcDogbm9kZT8uZGF0YT8udmFsdWUgPz8gbnVsbCB9KTtcbiAgfVxufVxuXG4vKiogTGFiZWwgZm9yIGB2aWV3YCdzIGNvbG91cmluZywgZm9yIHRoZSBrZXkncyBoZWFkaW5nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbG9yQnlMYWJlbCh2aWV3OiBQaWNrPFNwYXRpYWxWaWV3U3RhdGUsICdjb2xvckJ5Jz4pOiBzdHJpbmcge1xuICBjb25zdCBieSA9IHZpZXcuY29sb3JCeTtcbiAgaWYgKCFieSkgcmV0dXJuICdGbGF0IGNvbG91cic7XG4gIHJldHVybiBieS5raW5kID09PSAnZmVhdHVyZScgPyBgR2VuZSDCtyAke2J5Lm5hbWV9YCA6IGJ5Lm5hbWU7XG59XG5cbi8qKiBUaGUgdHJlZSBub2RlIGhvbGRpbmcgYSBjb2xvcm1hcCB2YWx1ZSwgc28gdGhlIHBpY2tlciBzaG93cyB3aGF0IGlzIGluIHVzZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xvcm1hcE5vZGVGb3IoXG4gIG9wdGlvbnM6IHJlYWRvbmx5IENvbG9ybWFwTm9kZVtdLFxuICB2YWx1ZTogQ29sb3JtYXBWYWx1ZSB8IG51bGwsXG4pOiBDb2xvcm1hcE5vZGUgfCBudWxsIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gIGZvciAoY29uc3QgZ3JvdXAgb2Ygb3B0aW9ucykge1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBncm91cC5jaGlsZHJlbiA/PyBbXSkge1xuICAgICAgLy8gUmVmZXJlbmNlIGVxdWFsaXR5OiB0aGUgdmFsdWUgY2FtZSBvdXQgb2YgdGhpcyBzYW1lIHRyZWUsIGFuZCBhbiBpbmxpbmVcbiAgICAgIC8vIHNjYWxlIGlzIGEgMjU2LWVudHJ5IGFycmF5IG5vdCB3b3J0aCBjb21wYXJpbmcgZWxlbWVudCBieSBlbGVtZW50LlxuICAgICAgaWYgKG5vZGUuZGF0YT8udmFsdWUgPT09IHZhbHVlKSByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgaWYgKGdyb3VwLmRhdGE/LnZhbHVlID09PSB2YWx1ZSkgcmV0dXJuIGdyb3VwO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuIiwiPCEtLSBLZXk6IGNhdGVnb3JpY2FsIGxlZ2VuZCBvciBhIGNvbnRpbnVvdXMgY29sb3VyIGJhciwgYnVpbHQgZnJvbSB0aGUgc2FtZVxuICAgICBmdW5jdGlvbnMgdGhlIHJlbmRlcmVyIHVzZXMgc28gaXQgY2Fubm90IGRpc2FncmVlIHdpdGggdGhlIGNhbnZhcy4gLS0+XG48ZGl2IGNsYXNzPVwic2Mtc2VjdGlvbiBzYy1rZXlcIiAqbmdJZj1cInZpZXcuY29sb3JCeVwiPlxuICA8c3BhbiBjbGFzcz1cInNjLWxibFwiPnt7IGNvbG9yQnlMYWJlbCB9fTwvc3Bhbj5cbiAgPCEtLSBEZXJpdmVkIGNvbHVtbnMgc2F5IHNvLCBzbyB0aGV5IGFyZSBub3QgbWlzdGFrZW4gZm9yIG1lYXN1cmVkIGRhdGEuIC0tPlxuICA8c21hbGwgY2xhc3M9XCJzYy1oaW50XCIgKm5nSWY9XCJhY3RpdmVEZXNjcmlwdGlvblwiPnt7IGFjdGl2ZURlc2NyaXB0aW9uIH19PC9zbWFsbD5cblxuICA8IS0tIExlZ2VuZCByb3dzIGFyZSBidXR0b25zOiBjbGlja2luZyBvbmUgc2VsZWN0cyB0aGF0IGNhdGVnb3J5LCBjbGlja2luZ1xuICAgICAgIGl0IGFnYWluIGNsZWFycyDigJQgc28gYSBjbGljayBpcyBhbHdheXMgcmV2ZXJzaWJsZS4gLS0+XG4gIDx1bCBjbGFzcz1cInNjLWxlZ2VuZFwiICpuZ0lmPVwiaXNDYXRlZ29yaWNhbFwiPlxuICAgIDxsaSAqbmdGb3I9XCJsZXQgZW50cnkgb2YgbGVnZW5kOyBpbmRleCBhcyBpOyB0cmFja0J5OiB0cmFja0J5TGFiZWxcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwic2MtbGVnZW5kLWJ0blwiXG4gICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJzZWxlY3RlZENhdGVnb3J5ID09PSBpXCJcbiAgICAgICAgKGNsaWNrKT1cImNhdGVnb3J5Q2xpY2tlZC5lbWl0KGkpXCJcbiAgICAgICAgW3RpdGxlXT1cIidTZWxlY3QgJyArIGVudHJ5LmxhYmVsXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzYy1zd2F0Y2hcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJlbnRyeS5jb2xvclwiPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzYy1sZWdlbmQtbGFiZWxcIj57eyBlbnRyeS5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbGk+XG4gIDwvdWw+XG5cbiAgPGRpdiAqbmdJZj1cImlzQ29udGludW91c1wiPlxuICAgIDxkaXYgY2xhc3M9XCJzYy1jb2xvcmJhclwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImNvbG9yQmFyQ3NzXCI+PC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInNjLWNvbG9yYmFyLWVuZHNcIj5cbiAgICAgIDxzcGFuPmxvdzwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwic2MtaGludFwiPndpbmRvdyBmcm9tIHBlcmNlbnRpbGVzPC9zcGFuPlxuICAgICAgPHNwYW4+aGlnaDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIFRoZSBncmFkaWVudCB0aGlzIGJhciBhbmQgdGhlIG1hcCBhcmUgZHJhd24gd2l0aC4gU2l0cyB1bmRlciB0aGUgYmFyXG4gICAgICAgICBpdCBjb250cm9scywgd2l0aCB0aGUgc2FtZSBzd2F0Y2ggcHJldmlld3MgdGhlIGltYWdlJ3MgY29sb3JtYXAgcGlja2VyXG4gICAgICAgICB1c2VzOiB3aGljaCBncmFkaWVudCByZWFkcyBiZXN0IGlzIGEgdmlzdWFsIGp1ZGdlbWVudCwgc28gYSBsaXN0IG9mXG4gICAgICAgICBuYW1lcyB3b3VsZCBiZSB0aGUgd3JvbmcgY29udHJvbC4gQ2xlYXJlZCA9IGZvbGxvdyB0aGUgaW1hZ2Uncy4gLS0+XG4gICAgPGRpdiBjbGFzcz1cInNjLXJvd1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJzYy1sYmxcIj5Db2xvcm1hcDwvc3Bhbj5cbiAgICAgIDxwLXRyZWVTZWxlY3RcbiAgICAgICAgW29wdGlvbnNdPVwiY29sb3JtYXBPcHRpb25zXCJcbiAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRDb2xvcm1hcE5vZGVcIlxuICAgICAgICBzZWxlY3Rpb25Nb2RlPVwic2luZ2xlXCJcbiAgICAgICAgW3Nob3dDbGVhcl09XCJ0cnVlXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJNYXRjaCB0aGUgaW1hZ2VcIlxuICAgICAgICBbc2Nyb2xsSGVpZ2h0XT1cIicyNjBweCdcIlxuICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgICBwVG9vbHRpcD1cIkNvbG91ciBzY2FsZSBmb3IgZ2VuZSBhbmQgbnVtZXJpYyB2YWx1ZXMg4oCUIHRoZSBtYXJrZXJzLCB0aGUgZ2VuZSBtYXAgYW5kIHRoaXMgYmFyLiBDbGVhciBpdCB0byBmb2xsb3cgdGhlIGltYWdlJ3MgY29sb3JtYXBcIlxuICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxuICAgICAgICAob25Ob2RlU2VsZWN0KT1cIm9uQ29udGludW91c0NvbG9ybWFwKCRldmVudC5ub2RlKVwiXG4gICAgICAgIChvbkNsZWFyKT1cIm9uQ29udGludW91c0NvbG9ybWFwKG51bGwpXCJcbiAgICAgID5cbiAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1ub2RlIHBUZW1wbGF0ZT1cImRlZmF1bHRcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNjLWNtYXAtb3B0aW9uXCI+XG4gICAgICAgICAgICA8aW1nICpuZ0lmPVwiIW5vZGUuY2hpbGRyZW4gJiYgbm9kZS5kYXRhPy5zcmNcIiBbc3JjXT1cIm5vZGUuZGF0YS5zcmNcIiBjbGFzcz1cInNjLWNtYXAtc3dhdGNoXCIgYWx0PVwiXCIgLz5cbiAgICAgICAgICAgIDxzcGFuPnt7IG5vZGUubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9wLXRyZWVTZWxlY3Q+XG4gICAgICA8c3BhbiBjbGFzcz1cInNjLXZhbFwiPjwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==