@genome-spy/core 0.48.1 → 0.49.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 (241) hide show
  1. package/dist/bundle/index.es.js +7485 -7097
  2. package/dist/bundle/index.js +124 -111
  3. package/dist/schema.json +838 -344
  4. package/dist/src/data/collector.d.ts +10 -8
  5. package/dist/src/data/collector.d.ts.map +1 -1
  6. package/dist/src/data/collector.js +131 -33
  7. package/dist/src/data/collector.test.d.ts +2 -0
  8. package/dist/src/data/collector.test.d.ts.map +1 -0
  9. package/dist/src/data/collector.test.js +55 -1
  10. package/dist/src/data/dataFlow.test.d.ts +2 -0
  11. package/dist/src/data/dataFlow.test.d.ts.map +1 -0
  12. package/dist/src/data/flow.test.d.ts +2 -0
  13. package/dist/src/data/flow.test.d.ts.map +1 -0
  14. package/dist/src/data/flow.test.js +19 -14
  15. package/dist/src/data/flowNode.test.d.ts +2 -0
  16. package/dist/src/data/flowNode.test.d.ts.map +1 -0
  17. package/dist/src/data/flowOptimizer.test.d.ts +2 -0
  18. package/dist/src/data/flowOptimizer.test.d.ts.map +1 -0
  19. package/dist/src/data/flowOptimizer.test.js +9 -10
  20. package/dist/src/data/formats/fasta.test.d.ts +2 -0
  21. package/dist/src/data/formats/fasta.test.d.ts.map +1 -0
  22. package/dist/src/data/sources/inlineSource.test.d.ts +2 -0
  23. package/dist/src/data/sources/inlineSource.test.d.ts.map +1 -0
  24. package/dist/src/data/sources/inlineSource.test.js +23 -16
  25. package/dist/src/data/sources/sequenceSource.test.d.ts +2 -0
  26. package/dist/src/data/sources/sequenceSource.test.d.ts.map +1 -0
  27. package/dist/src/data/sources/sequenceSource.test.js +59 -42
  28. package/dist/src/data/transforms/clone.test.d.ts +2 -0
  29. package/dist/src/data/transforms/clone.test.d.ts.map +1 -0
  30. package/dist/src/data/transforms/coverage.test.d.ts +2 -0
  31. package/dist/src/data/transforms/coverage.test.d.ts.map +1 -0
  32. package/dist/src/data/transforms/coverage.test.js +1 -1
  33. package/dist/src/data/transforms/filter.d.ts +10 -0
  34. package/dist/src/data/transforms/filter.d.ts.map +1 -1
  35. package/dist/src/data/transforms/filter.js +30 -1
  36. package/dist/src/data/transforms/filter.test.d.ts +2 -0
  37. package/dist/src/data/transforms/filter.test.d.ts.map +1 -0
  38. package/dist/src/data/transforms/flatten.test.d.ts +2 -0
  39. package/dist/src/data/transforms/flatten.test.d.ts.map +1 -0
  40. package/dist/src/data/transforms/flatten.test.js +10 -7
  41. package/dist/src/data/transforms/flattenDelimited.test.d.ts +2 -0
  42. package/dist/src/data/transforms/flattenDelimited.test.d.ts.map +1 -0
  43. package/dist/src/data/transforms/flattenDelimited.test.js +16 -13
  44. package/dist/src/data/transforms/flattenSequence.test.d.ts +2 -0
  45. package/dist/src/data/transforms/flattenSequence.test.d.ts.map +1 -0
  46. package/dist/src/data/transforms/flattenSequence.test.js +1 -1
  47. package/dist/src/data/transforms/formula.test.d.ts +2 -0
  48. package/dist/src/data/transforms/formula.test.d.ts.map +1 -0
  49. package/dist/src/data/transforms/formula.test.js +1 -1
  50. package/dist/src/data/transforms/identifier.d.ts +1 -1
  51. package/dist/src/data/transforms/identifier.d.ts.map +1 -1
  52. package/dist/src/data/transforms/identifier.js +2 -2
  53. package/dist/src/data/transforms/identifier.test.d.ts +2 -0
  54. package/dist/src/data/transforms/identifier.test.d.ts.map +1 -0
  55. package/dist/src/data/transforms/identifier.test.js +23 -14
  56. package/dist/src/data/transforms/pileup.test.d.ts +2 -0
  57. package/dist/src/data/transforms/pileup.test.d.ts.map +1 -0
  58. package/dist/src/data/transforms/project.test.d.ts +2 -0
  59. package/dist/src/data/transforms/project.test.d.ts.map +1 -0
  60. package/dist/src/data/transforms/project.test.js +1 -1
  61. package/dist/src/data/transforms/regexExtract.test.d.ts +2 -0
  62. package/dist/src/data/transforms/regexExtract.test.d.ts.map +1 -0
  63. package/dist/src/data/transforms/regexExtract.test.js +6 -3
  64. package/dist/src/data/transforms/regexFold.test.d.ts +2 -0
  65. package/dist/src/data/transforms/regexFold.test.d.ts.map +1 -0
  66. package/dist/src/data/transforms/sample.test.d.ts +2 -0
  67. package/dist/src/data/transforms/sample.test.d.ts.map +1 -0
  68. package/dist/src/data/transforms/stack.test.d.ts +2 -0
  69. package/dist/src/data/transforms/stack.test.d.ts.map +1 -0
  70. package/dist/src/data/transforms/stack.test.js +8 -8
  71. package/dist/src/encoder/accessor.d.ts +17 -14
  72. package/dist/src/encoder/accessor.d.ts.map +1 -1
  73. package/dist/src/encoder/accessor.js +127 -56
  74. package/dist/src/encoder/accessor.test.d.ts +2 -0
  75. package/dist/src/encoder/accessor.test.d.ts.map +1 -0
  76. package/dist/src/encoder/accessor.test.js +145 -31
  77. package/dist/src/encoder/encoder.d.ts +26 -13
  78. package/dist/src/encoder/encoder.d.ts.map +1 -1
  79. package/dist/src/encoder/encoder.js +98 -114
  80. package/dist/src/encoder/encoder.test.d.ts +2 -0
  81. package/dist/src/encoder/encoder.test.d.ts.map +1 -0
  82. package/dist/src/encoder/encoder.test.js +85 -82
  83. package/dist/src/fonts/bmFontManager.d.ts.map +1 -1
  84. package/dist/src/fonts/bmFontManager.js +10 -4
  85. package/dist/src/genome/genome.test.d.ts +2 -0
  86. package/dist/src/genome/genome.test.d.ts.map +1 -0
  87. package/dist/src/genome/scaleIndex.test.d.ts +2 -0
  88. package/dist/src/genome/scaleIndex.test.d.ts.map +1 -0
  89. package/dist/src/genome/scaleLocus.test.d.ts +2 -0
  90. package/dist/src/genome/scaleLocus.test.d.ts.map +1 -0
  91. package/dist/src/genomeSpy.d.ts +3 -2
  92. package/dist/src/genomeSpy.d.ts.map +1 -1
  93. package/dist/src/genomeSpy.js +29 -21
  94. package/dist/src/gl/dataToVertices.d.ts +5 -7
  95. package/dist/src/gl/dataToVertices.d.ts.map +1 -1
  96. package/dist/src/gl/dataToVertices.js +42 -30
  97. package/dist/src/gl/glslScaleGenerator.d.ts +84 -15
  98. package/dist/src/gl/glslScaleGenerator.d.ts.map +1 -1
  99. package/dist/src/gl/glslScaleGenerator.js +260 -73
  100. package/dist/src/gl/includes/picking.vertex.glsl.js +1 -1
  101. package/dist/src/marks/link.common.glsl.js +1 -1
  102. package/dist/src/marks/link.d.ts.map +1 -1
  103. package/dist/src/marks/link.js +10 -0
  104. package/dist/src/marks/link.vertex.glsl.js +1 -1
  105. package/dist/src/marks/mark.d.ts +6 -9
  106. package/dist/src/marks/mark.d.ts.map +1 -1
  107. package/dist/src/marks/mark.js +212 -95
  108. package/dist/src/marks/point.d.ts.map +1 -1
  109. package/dist/src/marks/point.js +5 -1
  110. package/dist/src/marks/rect.d.ts.map +1 -1
  111. package/dist/src/marks/rect.js +9 -4
  112. package/dist/src/marks/rule.d.ts.map +1 -1
  113. package/dist/src/marks/rule.js +4 -0
  114. package/dist/src/marks/text.d.ts.map +1 -1
  115. package/dist/src/marks/text.js +5 -1
  116. package/dist/src/scale/scale.test.d.ts +2 -0
  117. package/dist/src/scale/scale.test.d.ts.map +1 -0
  118. package/dist/src/scale/scale.test.js +2 -0
  119. package/dist/src/scale/ticks.test.d.ts +2 -0
  120. package/dist/src/scale/ticks.test.d.ts.map +1 -0
  121. package/dist/src/scale/ticks.test.js +6 -0
  122. package/dist/src/selection/selection.d.ts +39 -0
  123. package/dist/src/selection/selection.d.ts.map +1 -0
  124. package/dist/src/selection/selection.js +78 -0
  125. package/dist/src/spec/channel.d.ts +137 -83
  126. package/dist/src/spec/mark.d.ts +9 -0
  127. package/dist/src/spec/parameter.d.ts +112 -3
  128. package/dist/src/spec/root.d.ts +0 -1
  129. package/dist/src/spec/transform.d.ts +19 -1
  130. package/dist/src/spec/view.d.ts +3 -3
  131. package/dist/src/tooltip/dataTooltipHandler.js +1 -1
  132. package/dist/src/types/encoder.d.ts +80 -26
  133. package/dist/src/types/rendering.d.ts +1 -0
  134. package/dist/src/types/selectionTypes.d.ts +44 -0
  135. package/dist/src/types/viewContext.d.ts +1 -4
  136. package/dist/src/utils/addBaseUrl.test.d.ts +2 -0
  137. package/dist/src/utils/addBaseUrl.test.d.ts.map +1 -0
  138. package/dist/src/utils/animator.d.ts.map +1 -1
  139. package/dist/src/utils/animator.js +3 -1
  140. package/dist/src/utils/binnedIndex.test.d.ts +2 -0
  141. package/dist/src/utils/binnedIndex.test.d.ts.map +1 -0
  142. package/dist/src/utils/cloner.test.d.ts +2 -0
  143. package/dist/src/utils/cloner.test.d.ts.map +1 -0
  144. package/dist/src/utils/coalesce.test.d.ts +2 -0
  145. package/dist/src/utils/coalesce.test.d.ts.map +1 -0
  146. package/dist/src/utils/concatIterables.test.d.ts +2 -0
  147. package/dist/src/utils/concatIterables.test.d.ts.map +1 -0
  148. package/dist/src/utils/domainArray.test.d.ts +2 -0
  149. package/dist/src/utils/domainArray.test.d.ts.map +1 -0
  150. package/dist/src/utils/expression.d.ts +2 -2
  151. package/dist/src/utils/expression.d.ts.map +1 -1
  152. package/dist/src/utils/expression.js +11 -2
  153. package/dist/src/utils/indexer.test.d.ts +2 -0
  154. package/dist/src/utils/indexer.test.d.ts.map +1 -0
  155. package/dist/src/utils/inertia.d.ts.map +1 -1
  156. package/dist/src/utils/inertia.js +4 -0
  157. package/dist/src/utils/inputBinding.d.ts.map +1 -1
  158. package/dist/src/utils/inputBinding.js +4 -0
  159. package/dist/src/utils/iterateNestedMaps.d.ts +4 -3
  160. package/dist/src/utils/iterateNestedMaps.d.ts.map +1 -1
  161. package/dist/src/utils/iterateNestedMaps.js +3 -2
  162. package/dist/src/utils/iterateNestedMaps.test.d.ts +2 -0
  163. package/dist/src/utils/iterateNestedMaps.test.d.ts.map +1 -0
  164. package/dist/src/utils/kWayMerge.test.d.ts +2 -0
  165. package/dist/src/utils/kWayMerge.test.d.ts.map +1 -0
  166. package/dist/src/utils/mergeObjects.test.d.ts +2 -0
  167. package/dist/src/utils/mergeObjects.test.d.ts.map +1 -0
  168. package/dist/src/utils/numberExtractor.test.d.ts +2 -0
  169. package/dist/src/utils/numberExtractor.test.d.ts.map +1 -0
  170. package/dist/src/utils/propertyCacher.test.d.ts +2 -0
  171. package/dist/src/utils/propertyCacher.test.d.ts.map +1 -0
  172. package/dist/src/utils/propertyCoalescer.test.d.ts +2 -0
  173. package/dist/src/utils/propertyCoalescer.test.d.ts.map +1 -0
  174. package/dist/src/utils/propertyCoalescer.test.js +3 -0
  175. package/dist/src/utils/radixSort.d.ts +9 -0
  176. package/dist/src/utils/radixSort.d.ts.map +1 -0
  177. package/dist/src/utils/radixSort.js +130 -0
  178. package/dist/src/utils/radixSort.test.d.ts +2 -0
  179. package/dist/src/utils/radixSort.test.d.ts.map +1 -0
  180. package/dist/src/utils/radixSort.test.js +51 -0
  181. package/dist/src/utils/reservationMap.test.d.ts +2 -0
  182. package/dist/src/utils/reservationMap.test.d.ts.map +1 -0
  183. package/dist/src/utils/ringBuffer.test.d.ts +2 -0
  184. package/dist/src/utils/ringBuffer.test.d.ts.map +1 -0
  185. package/dist/src/utils/topK.test.d.ts +2 -0
  186. package/dist/src/utils/topK.test.d.ts.map +1 -0
  187. package/dist/src/utils/trees.test.d.ts +2 -0
  188. package/dist/src/utils/trees.test.d.ts.map +1 -0
  189. package/dist/src/utils/trees.test.js +8 -3
  190. package/dist/src/utils/variableTools.test.d.ts +2 -0
  191. package/dist/src/utils/variableTools.test.d.ts.map +1 -0
  192. package/dist/src/view/axisResolution.d.ts +19 -6
  193. package/dist/src/view/axisResolution.d.ts.map +1 -1
  194. package/dist/src/view/axisResolution.js +16 -7
  195. package/dist/src/view/axisResolution.test.d.ts +2 -0
  196. package/dist/src/view/axisResolution.test.d.ts.map +1 -0
  197. package/dist/src/view/axisResolution.test.js +16 -11
  198. package/dist/src/view/facetView.d.ts +1 -1
  199. package/dist/src/view/facetView.d.ts.map +1 -1
  200. package/dist/src/view/flowBuilder.d.ts +1 -1
  201. package/dist/src/view/flowBuilder.d.ts.map +1 -1
  202. package/dist/src/view/flowBuilder.js +34 -5
  203. package/dist/src/view/flowBuilder.test.d.ts +2 -0
  204. package/dist/src/view/flowBuilder.test.d.ts.map +1 -0
  205. package/dist/src/view/gridView.d.ts +0 -6
  206. package/dist/src/view/gridView.d.ts.map +1 -1
  207. package/dist/src/view/layerView.d.ts +0 -6
  208. package/dist/src/view/layerView.d.ts.map +1 -1
  209. package/dist/src/view/layout/flexLayout.test.d.ts +2 -0
  210. package/dist/src/view/layout/flexLayout.test.d.ts.map +1 -0
  211. package/dist/src/view/layout/grid.test.d.ts +2 -0
  212. package/dist/src/view/layout/grid.test.d.ts.map +1 -0
  213. package/dist/src/view/layout/rectangle.test.d.ts +2 -0
  214. package/dist/src/view/layout/rectangle.test.d.ts.map +1 -0
  215. package/dist/src/view/paramMediator.d.ts +32 -5
  216. package/dist/src/view/paramMediator.d.ts.map +1 -1
  217. package/dist/src/view/paramMediator.js +97 -9
  218. package/dist/src/view/paramMediator.test.d.ts +2 -0
  219. package/dist/src/view/paramMediator.test.d.ts.map +1 -0
  220. package/dist/src/view/paramMediator.test.js +17 -1
  221. package/dist/src/view/scaleResolution.d.ts +17 -9
  222. package/dist/src/view/scaleResolution.d.ts.map +1 -1
  223. package/dist/src/view/scaleResolution.js +51 -34
  224. package/dist/src/view/scaleResolution.test.d.ts +2 -0
  225. package/dist/src/view/scaleResolution.test.d.ts.map +1 -0
  226. package/dist/src/view/scaleResolution.test.js +2 -0
  227. package/dist/src/view/testUtils.d.ts.map +1 -1
  228. package/dist/src/view/testUtils.js +15 -3
  229. package/dist/src/view/unitView.d.ts +5 -15
  230. package/dist/src/view/unitView.d.ts.map +1 -1
  231. package/dist/src/view/unitView.js +81 -101
  232. package/dist/src/view/view.d.ts +1 -1
  233. package/dist/src/view/view.d.ts.map +1 -1
  234. package/dist/src/view/view.test.d.ts +2 -0
  235. package/dist/src/view/view.test.d.ts.map +1 -0
  236. package/dist/src/view/view.test.js +73 -55
  237. package/dist/src/view/viewFactory.test.d.ts +2 -0
  238. package/dist/src/view/viewFactory.test.d.ts.map +1 -0
  239. package/dist/src/view/viewFactory.test.js +2 -2
  240. package/dist/src/view/zoom.js +2 -2
  241. package/package.json +5 -2
@@ -6,7 +6,6 @@ import SPINNER from "./img/90-ring-with-bg.svg";
6
6
  import css from "./styles/genome-spy.css.js";
7
7
  import Tooltip from "./utils/ui/tooltip.js";
8
8
 
9
- import AccessorFactory from "./encoder/accessor.js";
10
9
  import {
11
10
  checkForDuplicateScaleNames,
12
11
  setImplicitScaleNames,
@@ -71,7 +70,6 @@ export default class GenomeSpy {
71
70
  /** Root level configuration object */
72
71
  this.spec = spec;
73
72
 
74
- this.accessorFactory = new AccessorFactory();
75
73
  this.viewFactory = new ViewFactory();
76
74
 
77
75
  /** @type {(function(string):object[])[]} */
@@ -148,6 +146,9 @@ export default class GenomeSpy {
148
146
  * @type {HTMLElement}
149
147
  */
150
148
  this._inputBindingContainer = undefined;
149
+
150
+ /** @type {Point} */
151
+ this._mouseDownCoords = undefined;
151
152
  }
152
153
 
153
154
  get #canvasWrapper() {
@@ -434,7 +435,6 @@ export default class GenomeSpy {
434
435
  /** @type {import("./types/viewContext.js").default} */
435
436
  const context = {
436
437
  dataFlow: new DataFlow(),
437
- accessorFactory: this.accessorFactory,
438
438
  glHelper: this._glHelper,
439
439
  animator: this.animator,
440
440
  genomeStore: this.genomeStore,
@@ -785,7 +785,14 @@ export default class GenomeSpy {
785
785
  ?.forEach((listener) => listener(e));
786
786
  }
787
787
 
788
- dispatchEvent(event);
788
+ if (
789
+ event.type != "click" ||
790
+ // Suppress click events if the mouse has been dragged
791
+ this._mouseDownCoords?.subtract(Point.fromMouseEvent(event))
792
+ .length < 3
793
+ ) {
794
+ dispatchEvent(event);
795
+ }
789
796
  }
790
797
  };
791
798
 
@@ -799,7 +806,9 @@ export default class GenomeSpy {
799
806
  "contextmenu",
800
807
  ].forEach((type) => canvas.addEventListener(type, listener));
801
808
 
802
- canvas.addEventListener("mousedown", () => {
809
+ canvas.addEventListener("mousedown", (/** @type {MouseEvent} */ e) => {
810
+ this._mouseDownCoords = Point.fromMouseEvent(e);
811
+
803
812
  document.addEventListener(
804
813
  "mouseup",
805
814
  () => this.tooltip.popEnabledState(),
@@ -822,7 +831,10 @@ export default class GenomeSpy {
822
831
  const pixelValue = this._glHelper.readPickingPixel(x, y);
823
832
 
824
833
  const uniqueId =
825
- pixelValue[0] | (pixelValue[1] << 8) | (pixelValue[2] << 16);
834
+ pixelValue[0] |
835
+ (pixelValue[1] << 8) |
836
+ (pixelValue[2] << 16) |
837
+ (pixelValue[3] << 24);
826
838
 
827
839
  if (uniqueId == 0) {
828
840
  this._currentHover = null;
@@ -834,10 +846,6 @@ export default class GenomeSpy {
834
846
  }
835
847
 
836
848
  if (!this._currentHover) {
837
- // We are doing an exhaustive search of the data. This is a bit slow with
838
- // millions of items.
839
- // TODO: Optimize by indexing or something
840
-
841
849
  this.viewRoot.visit((view) => {
842
850
  if (view instanceof UnitView) {
843
851
  if (
@@ -846,16 +854,16 @@ export default class GenomeSpy {
846
854
  coords.containsPoint(x, y)
847
855
  )
848
856
  ) {
849
- const accessor = view.mark.encoders.uniqueId.accessor;
850
- view.getCollector().visitData((d) => {
851
- if (accessor(d) == uniqueId) {
852
- this._currentHover = {
853
- mark: view.mark,
854
- datum: d,
855
- uniqueId,
856
- };
857
- }
858
- });
857
+ const datum = view
858
+ .getCollector()
859
+ .findDatumByUniqueId(uniqueId);
860
+ if (datum) {
861
+ this._currentHover = {
862
+ mark: view.mark,
863
+ datum,
864
+ uniqueId,
865
+ };
866
+ }
859
867
  }
860
868
  if (this._currentHover) {
861
869
  return VISIT_STOP;
@@ -973,7 +981,7 @@ export default class GenomeSpy {
973
981
  /** @type {UnitView[]} */
974
982
  const views = [];
975
983
  this.viewRoot.visit((view) => {
976
- if (view instanceof UnitView && view.getAccessor("search")) {
984
+ if (view instanceof UnitView && view.getDataAccessor("search")) {
977
985
  views.push(view);
978
986
  }
979
987
  });
@@ -11,20 +11,18 @@ export class GeometryBuilder {
11
11
  */
12
12
  /**
13
13
  * @param {object} object
14
- * @param {Record<string, Encoder>} object.encoders
14
+ * @param {Record<import("../spec/channel.js").Channel, Encoder>} object.encoders
15
15
  * @param {string[]} [object.attributes]
16
16
  * @param {number} [object.numVertices] If the number of data items is known, a
17
17
  * preallocated TypedArray is used
18
18
  */
19
19
  constructor({ encoders, numVertices, attributes }: {
20
- encoders: Record<string, import("../types/encoder.js").Encoder>;
20
+ encoders: Record<import("../spec/channel.js").Channel, import("../types/encoder.js").Encoder>;
21
21
  attributes?: string[];
22
22
  numVertices?: number;
23
23
  });
24
- encoders: Record<string, import("../types/encoder.js").Encoder>;
25
- variableEncoders: {
26
- [k: string]: import("../types/encoder.js").Encoder;
27
- };
24
+ encoders: Record<import("../spec/channel.js").Channel, import("../types/encoder.js").Encoder>;
25
+ variableEncoders: Record<import("../spec/channel.js").Channel, import("../types/encoder.js").Encoder>;
28
26
  allocatedVertices: number;
29
27
  variableBuilder: ArrayBuilder;
30
28
  lastOffset: number;
@@ -59,7 +57,7 @@ export class GeometryBuilder {
59
57
  */
60
58
  addToXIndex(datum: import("../data/flowNode.js").Datum): void;
61
59
  xIndexer: {
62
- (datum: any, startVertexIndex: number, endVertexIndex: number): void;
60
+ (datum: import("../data/flowNode.js").Datum, startVertexIndex: number, endVertexIndex: number): void;
63
61
  getIndex: () => import("../utils/binnedIndex.js").Lookup;
64
62
  };
65
63
  toArrays(): {
@@ -1 +1 @@
1
- {"version":3,"file":"dataToVertices.d.ts","sourceRoot":"","sources":["../../../src/gl/dataToVertices.js"],"names":[],"mappings":"AAgBA;;;;;GAKG;AACH;IACI;;;OAGG;IAEH;;;;;;OAMG;IACH;;qBAJW,MAAM,EAAE;sBACR,MAAM;OA6EhB;IAzEG,gEAAwB;IAGxB;;MAKC;IAQD,0BAAoC;IAEpC,8BAAoD;IAmDpD,mBAAmB;IAEnB,yFAAyF;IACzF,UADW,IAAI,GAAG,EAAE,UAAU,CAAC,CACkB;IAGrD;;;;OAIG;IACH,mBAFW,GAAG,QAcb;IAED;;OAEG;IACH,oBAFW,IAAI,GAAG,EAAE,MAAM,EAAE,CAAC,QAM5B;IAED;;;OAGG;IACH,cAHW,GAAG,QACH,MAAM,EAAE,kCAYlB;IAED;;;;OAIG;IACH,sBAJW,OAAO,qBAAqB,EAAE,IAAI,OAClC,MAAM,OACN,MAAM,QA+DhB;IAED;;;;;OAKG;IACH,mBAFW,OAAO,qBAAqB,EAAE,KAAK,QAI7C;IA/DO;;;MAAyB;IAiEjC;QAEQ,kJAAkJ;gBAAvI,OAAO,MAAM,EAAE;YAAC,IAAI,EAAE,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,YAAY,CAAC;YAAC,aAAa,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAC,CAAC;QAE9I,8BAA8B;;QAE9B,8CAA8C;;;MAIrD;CACJ;AAED;IACI;;;;;;OAMG;IACH;;oBAHW,MAAM,EAAE;mBACR,MAAM;OA+BhB;IAnBG,qBAkBW;CA8BlB;AAED;IACI;;;;;;;;;OASG;IACH;;oBANW,MAAM,EAAE;gCACR,MAAM;uBAEN,MAAM,EAAE;mBACR,MAAM;OAwBhB;IARG,uBAAgC;IAEhC,8BAA8D;IAE9D,6CAA+D;IAC/D,4CAA6D;CA6CpE;AAED;IACI;;;;;;OAMG;IACH;;oBAHW,MAAM,EAAE;mBACR,MAAM;OAShB;CACJ;AAED;IACI;;;;;OAKG;IACH;;oBAHW,MAAM,EAAE;mBACR,MAAM;OAShB;CAYJ;AAED;IACI;;;;;;;;;OASG;IACH;;oBANW,MAAM,EAAE;qBACR,OAAO,2BAA2B,EAAE,aAAa;oBACjD,OAAO,MAAM,EAAE,GAAG,CAAC;wBACnB,MAAM;sBACN,OAAO;OA8CjB;IA/BG,4DAA2B;IAC3B,2DAA0B;IAE1B,gCAA4B;IAQ5B,qCAAqC;IACrC,sBADmB,GAAG,KAAK,MAAM,CAMf;IAElB,oDAGC;IACD,qDAGC;IAED,8CAAiE;CAgJxE;;;;;;;;YAvmBS,MAAM;;;;WACN,MAAM;YACN,OAAO,yBAAyB,EAAE,MAAM;;yBAjBzB,mBAAmB"}
1
+ {"version":3,"file":"dataToVertices.d.ts","sourceRoot":"","sources":["../../../src/gl/dataToVertices.js"],"names":[],"mappings":"AAgBA;;;;;GAKG;AACH;IACI;;;OAGG;IAEH;;;;;;OAMG;IACH;;qBAJW,MAAM,EAAE;sBACR,MAAM;OAyFhB;IArFG,8FAAwB;IAIxB,sGAQK;IAQL,0BAAoC;IAEpC,8BAAoD;IA2DpD,mBAAmB;IAEnB,yFAAyF;IACzF,UADW,IAAI,GAAG,EAAE,UAAU,CAAC,CACkB;IAGrD;;;;OAIG;IACH,mBAFW,GAAG,QAcb;IAED;;OAEG;IACH,oBAFW,IAAI,GAAG,EAAE,MAAM,EAAE,CAAC,QAM5B;IAED;;;OAGG;IACH,cAHW,GAAG,QACH,MAAM,EAAE,kCAYlB;IAED;;;;OAIG;IACH,sBAJW,OAAO,qBAAqB,EAAE,IAAI,OAClC,MAAM,OACN,MAAM,QAgEhB;IAED;;;;;OAKG;IACH,mBAFW,OAAO,qBAAqB,EAAE,KAAK,QAI7C;IAhEO;;;MAAyB;IAkEjC;QAEQ,kJAAkJ;gBAAvI,OAAO,MAAM,EAAE;YAAC,IAAI,EAAE,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,YAAY,CAAC;YAAC,aAAa,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAC,CAAC;QAE9I,8BAA8B;;QAE9B,8CAA8C;;;MAIrD;CACJ;AAED;IACI;;;;;;OAMG;IACH;;oBAHW,MAAM,EAAE;mBACR,MAAM;OA+BhB;IAnBG,qBAkBW;CA8BlB;AAED;IACI;;;;;;;;;OASG;IACH;;oBANW,MAAM,EAAE;gCACR,MAAM;uBAEN,MAAM,EAAE;mBACR,MAAM;OAwBhB;IARG,uBAAgC;IAEhC,8BAA8D;IAE9D,6CAA+D;IAC/D,4CAA6D;CA6CpE;AAED;IACI;;;;;;OAMG;IACH;;oBAHW,MAAM,EAAE;mBACR,MAAM;OAShB;CACJ;AAED;IACI;;;;;OAKG;IACH;;oBAHW,MAAM,EAAE;mBACR,MAAM;OAShB;CAYJ;AAED;IACI;;;;;;;;;OASG;IACH;;oBANW,MAAM,EAAE;qBACR,OAAO,2BAA2B,EAAE,aAAa;oBACjD,OAAO,MAAM,EAAE,GAAG,CAAC;wBACnB,MAAM;sBACN,OAAO;OA6CjB;IA9BG,4DAA2B;IAC3B,2DAA0B;IAE1B,gCAA4B;IAO5B,qCAAqC;IACrC,sBADmB,GAAG,KAAK,MAAM,CAMf;IAElB,oDAGC;IACD,qDAGC;IAED,8CAAiE;CAgJxE;;;;;;;;YAnnBS,MAAM;;;;WACN,MAAM;YACN,OAAO,yBAAyB,EAAE,MAAM;;yBAjBzB,mBAAmB"}
@@ -7,12 +7,12 @@ import { createBinningRangeIndexer } from "../utils/binnedIndex.js";
7
7
  import { isValueDef } from "../encoder/encoder.js";
8
8
  import {
9
9
  dedupeEncodingFields,
10
- isHighPrecisionScale,
11
- isLargeGenome,
10
+ getAttributeAndArrayTypes,
12
11
  makeAttributeName,
13
12
  splitLargeHighPrecision,
14
13
  } from "./glslScaleGenerator.js";
15
- import { isContinuous, isDiscrete } from "vega-scale";
14
+ import { isContinuous } from "vega-scale";
15
+ import createIndexer from "../utils/indexer.js";
16
16
 
17
17
  /**
18
18
  * @typedef {object} RangeEntry Represents a location of a vertex subset
@@ -28,7 +28,7 @@ export class GeometryBuilder {
28
28
 
29
29
  /**
30
30
  * @param {object} object
31
- * @param {Record<string, Encoder>} object.encoders
31
+ * @param {Record<import("../spec/channel.js").Channel, Encoder>} object.encoders
32
32
  * @param {string[]} [object.attributes]
33
33
  * @param {number} [object.numVertices] If the number of data items is known, a
34
34
  * preallocated TypedArray is used
@@ -37,12 +37,16 @@ export class GeometryBuilder {
37
37
  this.encoders = encoders;
38
38
 
39
39
  // Encoders for variable channels
40
- this.variableEncoders = Object.fromEntries(
41
- Object.entries(encoders).filter(
42
- ([channel, e]) =>
43
- attributes.includes(channel) && e && e.scale && !e.constant
44
- )
45
- );
40
+
41
+ this.variableEncoders =
42
+ /** @type {Record<import("../spec/channel.js").Channel, Encoder>} */ (
43
+ Object.fromEntries(
44
+ Object.entries(encoders).filter(
45
+ ([channel, e]) =>
46
+ attributes.includes(channel) && e && !e.constant
47
+ )
48
+ )
49
+ );
46
50
 
47
51
  const dedupedEncodingFields = [
48
52
  ...dedupeEncodingFields(encoders).entries(),
@@ -56,6 +60,11 @@ export class GeometryBuilder {
56
60
 
57
61
  // Create converters and updaters for all variable channels.
58
62
  for (const [channel, ce] of Object.entries(this.variableEncoders)) {
63
+ const accessor = ce.dataAccessor;
64
+ if (!accessor) {
65
+ continue;
66
+ }
67
+
59
68
  // Only add the first of the shared channels as all the rest are same
60
69
  // For example, if both x and x2 are using the same field, only x is
61
70
  // added to the array builder with the name "x_x2".
@@ -66,13 +75,19 @@ export class GeometryBuilder {
66
75
  continue;
67
76
  }
68
77
 
69
- const accessor = ce.accessor;
78
+ const numberAccessor = accessor.asNumberAccessor();
79
+ const scale = ce.scale;
70
80
 
71
- const hp = isHighPrecisionScale(ce.scale.type);
72
- const largeHp = hp && isLargeGenome(ce.scale.domain());
81
+ const { largeHp, arrayConstructor, discrete, numComponents } =
82
+ getAttributeAndArrayTypes(scale, channel);
73
83
  const largeHpArray = [0, 0];
74
84
 
75
- const indexer = ce.indexer;
85
+ /** @type {ReturnType<typeof createIndexer>} */
86
+ let indexer;
87
+ if (scale && discrete && "domain" in scale) {
88
+ indexer = createIndexer();
89
+ indexer.addAll(scale.domain());
90
+ }
76
91
 
77
92
  /**
78
93
  * Discrete variables both numeric and strings must be "indexed",
@@ -84,8 +99,9 @@ export class GeometryBuilder {
84
99
  const f = indexer
85
100
  ? (d) => indexer(accessor(d))
86
101
  : largeHp
87
- ? (d) => splitLargeHighPrecision(accessor(d), largeHpArray)
88
- : accessor;
102
+ ? (d) =>
103
+ splitLargeHighPrecision(numberAccessor(d), largeHpArray)
104
+ : numberAccessor;
89
105
 
90
106
  const attributeName = sharedChannels
91
107
  ? makeAttributeName(sharedChannels)
@@ -93,13 +109,9 @@ export class GeometryBuilder {
93
109
 
94
110
  this.variableBuilder.addConverter(attributeName, {
95
111
  f,
96
- numComponents: largeHp ? 2 : 1,
112
+ numComponents,
97
113
  arrayReference: largeHp ? largeHpArray : undefined,
98
- targetArrayType: isDiscrete(ce.scale.type)
99
- ? Uint16Array
100
- : hp
101
- ? Uint32Array
102
- : Float32Array,
114
+ targetArrayType: arrayConstructor,
103
115
  });
104
116
  }
105
117
 
@@ -187,9 +199,10 @@ export class GeometryBuilder {
187
199
  const xe = getContinuousEncoder(this.variableEncoders.x);
188
200
  const x2e = getContinuousEncoder(this.variableEncoders.x2);
189
201
 
190
- if (xe) {
191
- const xa = xe.accessor;
192
- const x2a = x2e ? x2e.accessor : xa;
202
+ // Only index variable data
203
+ if (xe && !xe.constant && (!x2e || !x2e.constant)) {
204
+ const xa = xe.dataAccessor.asNumberAccessor();
205
+ const x2a = x2e ? x2e.dataAccessor.asNumberAccessor() : xa;
193
206
 
194
207
  /** @type {[number, number]} */
195
208
  const dataDomain = [xa(data[lo]), x2a(data[hi - 1])];
@@ -466,10 +479,9 @@ export class TextVertexBuilder extends GeometryBuilder {
466
479
 
467
480
  const e = encoders;
468
481
 
469
- const channelDef =
470
- /** @type {import("../spec/channel.js").TextDef<string>} */ (
471
- e.text.channelDef
472
- );
482
+ const channelDef = /** @type {import("../spec/channel.js").TextDef} */ (
483
+ e.text.channelDef
484
+ );
473
485
  /** @type {(value: any) => string} */
474
486
  this.numberFormat =
475
487
  !isValueDef(channelDef) &&
@@ -519,7 +531,7 @@ export class TextVertexBuilder extends GeometryBuilder {
519
531
  // alphabetic
520
532
  }
521
533
 
522
- const accessor = this.encoders.text.accessor || this.encoders.text; // accessor or constant value
534
+ const accessor = this.encoders.text; // accessor or constant value
523
535
 
524
536
  const vertexCoord = [0, 0];
525
537
  this.updateVertexCoord(vertexCoord);
@@ -1,41 +1,92 @@
1
1
  /// <reference types="external-typings/internmap.js" />
2
+ /**
3
+ *
4
+ * @param {Channel} channel
5
+ * @param {number} conditionNumber
6
+ * @returns {string}
7
+ */
8
+ export function makeAccessorFunctionName(channel: Channel, conditionNumber: number): string;
9
+ /**
10
+ * @typedef {object} AccessorParts
11
+ * @prop {Channel} channel
12
+ * @prop {string} accessorGlsl
13
+ * @prop {string} accessorFunctionName
14
+ * @prop {string} [attributeName]
15
+ * @prop {string} [attributeGlsl]
16
+ * @prop {string} [uniformName]
17
+ * @prop {string} [uniformGlsl]
18
+ * @prop {(x: any) => any} [adjuster]
19
+ */
2
20
  /**
3
21
  * Generates GLSL code for a constant value.
4
22
  *
5
23
  * @param {Channel} channel
24
+ * @param {number} conditionNumber
6
25
  * @param {number | number[] | string | boolean} value
26
+ * @returns {AccessorParts}
7
27
  */
8
- export function generateConstantValueGlsl(channel: Channel, value: number | number[] | string | boolean): string;
28
+ export function generateConstantValueGlsl(channel: Channel, conditionNumber: number, value: number | number[] | string | boolean): AccessorParts;
9
29
  /**
10
30
  * Generates GLSL code for a dynamic, parameter-driven values. These are mainly
11
31
  * used as dynamic mark properties that map to encoding channels.
12
32
  *
13
33
  * @param {Channel} channel
34
+ * @param {number} conditionNumber
35
+ * @returns {AccessorParts}
14
36
  */
15
- export function generateDynamicValueGlslAndUniform(channel: Channel): {
16
- channel: import("../spec/channel.js").Channel;
17
- uniformName: string;
18
- uniformGlsl: string;
19
- scaleGlsl: string;
20
- adjuster: (x: any) => any;
21
- };
37
+ export function generateDynamicValueGlslAndUniform(channel: Channel, conditionNumber: number): AccessorParts;
38
+ /**
39
+ * @param {Channel} channel
40
+ * @param {any} scale
41
+ * @param {number} conditionNumber
42
+ * @param {Channel[]} [sharedQuantitativeChannels] Channels that share the same quantitative field
43
+ * @returns {AccessorParts}
44
+ */
45
+ export function generateDataGlsl(channel: Channel, scale: any, conditionNumber: number, sharedQuantitativeChannels?: Channel[]): AccessorParts;
46
+ /**
47
+ * @param {Channel} channel
48
+ * @param {any} scale
49
+ * @param {number} conditionNumber
50
+ * @returns {AccessorParts}
51
+ */
52
+ export function generateDatumGlslAndUniform(channel: Channel, scale: any, conditionNumber: number): AccessorParts;
22
53
  /**
23
54
  *
24
55
  * @param {Channel} channel
25
- * @param {import("../view/scaleResolution.js").default} scaleResolution TODO: typing
56
+ * @param {any} scale
26
57
  * @param {import("../spec/channel.js").ChannelDef} channelDef
27
- * @param {Channel[]} [sharedQuantitativeChannels] Channels that share the same quantitative field
28
58
  */
29
- export function generateScaleGlsl(channel: Channel, scaleResolution: import("../view/scaleResolution.js").default, channelDef: import("../spec/channel.js").ChannelDef, sharedQuantitativeChannels?: Channel[]): {
30
- attributeName: string;
31
- attributeGlsl: string;
32
- markUniformGlsl: string;
59
+ export function generateScaleGlsl(channel: Channel, scale: any, channelDef: import("../spec/channel.js").ChannelDef): {
33
60
  glsl: string;
34
61
  domainUniformName: string;
35
62
  domainUniform: string;
36
- rangeName: string;
63
+ rangeUniformName: string;
37
64
  rangeUniform: string;
38
65
  };
66
+ /**
67
+ *
68
+ * @param {Channel} channel
69
+ * @param {import("../types/encoder.js").Accessor[]} accessors
70
+ */
71
+ export function generateConditionalEncoderGlsl(channel: Channel, accessors: import("../types/encoder.js").Accessor[]): string;
72
+ /**
73
+ * @param {Channel} channel
74
+ */
75
+ export function getScaledDataTypeForChannel(channel: Channel): "float" | "vec3" | "uint";
76
+ /**
77
+ *
78
+ * @param {import("../types/encoder.js").VegaScale} scale
79
+ * @param {import("../spec/channel.js").Channel} channel
80
+ */
81
+ export function getAttributeAndArrayTypes(scale: import("../types/encoder.js").VegaScale, channel: import("../spec/channel.js").Channel): {
82
+ attributeType: string;
83
+ arrayConstructor: Uint32ArrayConstructor | Uint16ArrayConstructor | Float32ArrayConstructor;
84
+ } & {
85
+ numComponents: number;
86
+ discrete: boolean;
87
+ hp: boolean;
88
+ largeHp: boolean;
89
+ };
39
90
  /**
40
91
  * True if scale needs more than 24 bits (float32) of precision.
41
92
  *
@@ -76,14 +127,32 @@ export function dedupeEncodingFields(encoders: Partial<Record<import("../spec/ch
76
127
  * @param {import("../spec/channel.js").Channel | import("../spec/channel.js").Channel[]} channel
77
128
  */
78
129
  export function makeAttributeName(channel: import("../spec/channel.js").Channel | import("../spec/channel.js").Channel[]): string;
130
+ /**
131
+ * @param {string[]} conditions
132
+ * @param {string[]} statements
133
+ * @returns {string}
134
+ */
135
+ export function ifElseGlsl(conditions: string[], statements: string[]): string;
79
136
  export const ATTRIBUTE_PREFIX: "attr_";
80
137
  export const DOMAIN_PREFIX: "uDomain_";
81
138
  export const RANGE_PREFIX: "range_";
139
+ export const ACCESSOR_FUNCTION_PREFIX: "accessor_";
82
140
  export const SCALE_FUNCTION_PREFIX: "scale_";
83
141
  export const SCALED_FUNCTION_PREFIX: "getScaled_";
84
142
  export const RANGE_TEXTURE_PREFIX: "uRangeTexture_";
143
+ export const PARAM_PREFIX: "uParam_";
85
144
  export function getRangeForGlsl(scale: any, channel: Channel): number[];
86
145
  export type Channel = import("../spec/channel.js").Channel;
146
+ export type AccessorParts = {
147
+ channel: Channel;
148
+ accessorGlsl: string;
149
+ accessorFunctionName: string;
150
+ attributeName?: string;
151
+ attributeGlsl?: string;
152
+ uniformName?: string;
153
+ uniformGlsl?: string;
154
+ adjuster?: (x: any) => any;
155
+ };
87
156
  /**
88
157
  * Turns a number or number array to float or vec[234] string.
89
158
  */
@@ -1 +1 @@
1
- {"version":3,"file":"glslScaleGenerator.d.ts","sourceRoot":"","sources":["../../../src/gl/glslScaleGenerator.js"],"names":[],"mappings":";AAqDA;;;;;GAKG;AACH,mDAHW,OAAO,SACP,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,GAAG,OAAO,UAoC9C;AAED;;;;;GAKG;AACH,4DAFW,OAAO;;;;;kBAIC,GAAG,KAAK,GAAG;EA0B7B;AAED;;;;;;GAMG;AAEH,2CANW,OAAO,mBACP,OAAO,4BAA4B,EAAE,OAAO,cAC5C,OAAO,oBAAoB,EAAE,UAAU,+BACvC,OAAO,EAAE;;;;;;;;;EAiTnB;AAgHD;;;;GAIG;AACH,2CAFW,MAAM,WAIhB;AAED;;;;GAIG;AACH,sCAFW,MAAM,EAAE,WAIlB;AAMD;;;GAGG;AACH,sCAHW,MAAM,QACN,MAAM,EAAE,YAYlB;AAED;;;GAGG;AACH,2CAHW,MAAM,QACN,MAAM,EAAE,YAUlB;AAYD;;GAEG;AACH,qDAFW,MAAM,EAAE,YAIlB;AAED;;GAEG;AAEH;;;;;GAKG;AACH,+CAFW,QAAQ,OAAO,OAAO,oBAAoB,EAAE,OAAO,EAAE,OAAO,qBAAqB,EAAE,OAAO,CAAC,CAAC,+DA4BtG;AAED;;GAEG;AACH,2CAFW,OAAO,oBAAoB,EAAE,OAAO,GAAG,OAAO,oBAAoB,EAAE,OAAO,EAAE,UAIvF;AAloBD,uCAAwC;AACxC,uCAAwC;AACxC,oCAAqC;AACrC,6CAA8C;AAC9C,kDAAmD;AACnD,oDAAqD;AA6oB9C,uCAJI,GAAG,WACH,OAAO,GACL,MAAM,EAAE,CAQF;sBA7oBN,OAAO,oBAAoB,EAAE,OAAO;;;;8BAubpC,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE;;;;uBAsJhD,CAAC,MAAM,EAAE,OAAO,CAAC;0BA5lBJ,WAAW"}
1
+ {"version":3,"file":"glslScaleGenerator.d.ts","sourceRoot":"","sources":["../../../src/gl/glslScaleGenerator.js"],"names":[],"mappings":";AAqDA;;;;;GAKG;AACH,kDAJW,OAAO,mBACP,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;;;;;GAUG;AAEH;;;;;;;GAOG;AACH,mDALW,OAAO,mBACP,MAAM,SACN,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,GAAG,OAAO,GAClC,aAAa,CA4CzB;AAED;;;;;;;GAOG;AACH,4DAJW,OAAO,mBACP,MAAM,GACJ,aAAa,CAkCzB;AAED;;;;;;GAMG;AACH,0CANW,OAAO,SACP,GAAG,mBACH,MAAM,+BACN,OAAO,EAAE,GACP,aAAa,CA+BzB;AACD;;;;;GAKG;AACH,qDALW,OAAO,SACP,GAAG,mBACH,MAAM,GACJ,aAAa,CAyBzB;AAED;;;;;GAKG;AAEH,2CALW,OAAO,SACP,GAAG,cACH,OAAO,oBAAoB,EAAE,UAAU;;;;;;EAwQjD;AAED;;;;GAIG;AACH,wDAHW,OAAO,aACP,OAAO,qBAAqB,EAAE,QAAQ,EAAE,UAuClD;AAmED;;GAEG;AACH,qDAFW,OAAO,6BAQjB;AA+CD;;;;GAIG;AACH,iDAHW,OAAO,qBAAqB,EAAE,SAAS,WACvC,OAAO,oBAAoB,EAAE,OAAO;mBAQjB,MAAM;sBAAoB,sBAAsB,GAAG,sBAAsB,GAAG,uBAAuB;;;;;;EAkBhI;AAED;;;;GAIG;AACH,2CAFW,MAAM,WAIhB;AAED;;;;GAIG;AACH,sCAFW,MAAM,EAAE,WAIlB;AAMD;;;GAGG;AACH,sCAHW,MAAM,QACN,MAAM,EAAE,YAYlB;AAED;;;GAGG;AACH,2CAHW,MAAM,QACN,MAAM,EAAE,YAUlB;AAYD;;GAEG;AACH,qDAFW,MAAM,EAAE,YAIlB;AAED;;GAEG;AAEH;;;;;GAKG;AACH,+CAFW,QAAQ,OAAO,OAAO,oBAAoB,EAAE,OAAO,EAAE,OAAO,qBAAqB,EAAE,OAAO,CAAC,CAAC,+DA4BtG;AAED;;GAEG;AACH,2CAFW,OAAO,oBAAoB,EAAE,OAAO,GAAG,OAAO,oBAAoB,EAAE,OAAO,EAAE,UAIvF;AAwBD;;;;GAIG;AACH,uCAJW,MAAM,EAAE,cACR,MAAM,EAAE,GACN,MAAM,CAgClB;AAr1BD,uCAAwC;AACxC,uCAAwC;AACxC,oCAAqC;AACrC,mDAAoD;AACpD,6CAA8C;AAC9C,kDAAmD;AACnD,oDAAqD;AACrD,qCAAsC;AAmyB/B,uCAJI,GAAG,WACH,OAAO,GACL,MAAM,EAAE,CAQF;sBAnyBN,OAAO,oBAAoB,EAAE,OAAO;;aA+BvC,OAAO;kBACP,MAAM;0BACN,MAAM;oBACN,MAAM;oBACN,MAAM;kBACN,MAAM;kBACN,MAAM;mBACF,GAAG,KAAK,GAAG;;;;;8BA6fZ,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE;;;;uBAgMhD,CAAC,MAAM,EAAE,OAAO,CAAC;0BApvBJ,WAAW"}