ol 7.5.1 → 8.0.0-dev.1692053484481

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 (135) hide show
  1. package/DataTile.d.ts +2 -2
  2. package/DataTile.d.ts.map +1 -1
  3. package/DataTile.js +3 -2
  4. package/Image.d.ts +139 -40
  5. package/Image.d.ts.map +1 -1
  6. package/Image.js +194 -96
  7. package/ImageCanvas.d.ts +2 -2
  8. package/ImageCanvas.d.ts.map +1 -1
  9. package/ImageCanvas.js +2 -2
  10. package/Object.d.ts +7 -0
  11. package/Object.d.ts.map +1 -1
  12. package/Object.js +8 -0
  13. package/dist/ol.js +2 -2
  14. package/dist/ol.js.map +1 -1
  15. package/expr/cpu.d.ts +71 -0
  16. package/expr/cpu.d.ts.map +1 -0
  17. package/expr/cpu.js +312 -0
  18. package/expr/expression.d.ts +97 -0
  19. package/expr/expression.d.ts.map +1 -0
  20. package/expr/expression.js +373 -0
  21. package/has.d.ts +5 -0
  22. package/has.d.ts.map +1 -1
  23. package/has.js +6 -0
  24. package/index.d.ts +1 -2
  25. package/index.js +1 -1
  26. package/layer/Base.d.ts +12 -8
  27. package/layer/Base.d.ts.map +1 -1
  28. package/layer/Base.js +12 -8
  29. package/layer/BaseVector.d.ts.map +1 -1
  30. package/layer/BaseVector.js +67 -33
  31. package/layer/Heatmap.d.ts.map +1 -1
  32. package/layer/Heatmap.js +16 -55
  33. package/layer/Layer.d.ts +2 -2
  34. package/layer/Layer.d.ts.map +1 -1
  35. package/layer/Layer.js +1 -1
  36. package/layer/WebGLPoints.d.ts +7 -12
  37. package/layer/WebGLPoints.d.ts.map +1 -1
  38. package/layer/WebGLPoints.js +7 -12
  39. package/package.json +1 -1
  40. package/render/Feature.d.ts +8 -0
  41. package/render/Feature.d.ts.map +1 -1
  42. package/render/Feature.js +9 -0
  43. package/render/canvas/Immediate.d.ts.map +1 -1
  44. package/render/canvas/Immediate.js +5 -3
  45. package/render/canvas/TextBuilder.js +2 -2
  46. package/render/canvas/style.d.ts +69 -0
  47. package/render/canvas/style.d.ts.map +1 -0
  48. package/render/canvas/style.js +1192 -0
  49. package/render/canvas.js +1 -1
  50. package/render/webgl/VectorStyleRenderer.d.ts.map +1 -1
  51. package/render/webgl/VectorStyleRenderer.js +4 -0
  52. package/renderer/Layer.d.ts +2 -2
  53. package/renderer/Layer.d.ts.map +1 -1
  54. package/renderer/Layer.js +1 -1
  55. package/renderer/canvas/ImageLayer.d.ts +4 -4
  56. package/renderer/canvas/ImageLayer.d.ts.map +1 -1
  57. package/renderer/canvas/ImageLayer.js +17 -12
  58. package/renderer/canvas/Layer.d.ts +2 -2
  59. package/renderer/canvas/Layer.d.ts.map +1 -1
  60. package/renderer/canvas/Layer.js +1 -1
  61. package/renderer/canvas/VectorImageLayer.d.ts.map +1 -1
  62. package/renderer/canvas/VectorImageLayer.js +3 -2
  63. package/renderer/webgl/VectorLayer.d.ts +1 -2
  64. package/renderer/webgl/VectorLayer.d.ts.map +1 -1
  65. package/reproj/Image.d.ts +5 -5
  66. package/reproj/Image.d.ts.map +1 -1
  67. package/reproj/Image.js +6 -6
  68. package/reproj.d.ts +2 -2
  69. package/reproj.d.ts.map +1 -1
  70. package/reproj.js +1 -1
  71. package/resolution.d.ts +13 -0
  72. package/resolution.d.ts.map +1 -0
  73. package/resolution.js +18 -0
  74. package/source/Image.d.ts +44 -7
  75. package/source/Image.d.ts.map +1 -1
  76. package/source/Image.js +97 -8
  77. package/source/ImageArcGISRest.d.ts +0 -23
  78. package/source/ImageArcGISRest.d.ts.map +1 -1
  79. package/source/ImageArcGISRest.js +18 -120
  80. package/source/ImageMapGuide.d.ts +0 -24
  81. package/source/ImageMapGuide.d.ts.map +1 -1
  82. package/source/ImageMapGuide.js +21 -113
  83. package/source/ImageStatic.d.ts +2 -27
  84. package/source/ImageStatic.d.ts.map +1 -1
  85. package/source/ImageStatic.js +20 -70
  86. package/source/ImageWMS.d.ts +2 -46
  87. package/source/ImageWMS.d.ts.map +1 -1
  88. package/source/ImageWMS.js +43 -201
  89. package/source/{Stamen.d.ts → StadiaMaps.d.ts} +17 -7
  90. package/source/StadiaMaps.d.ts.map +1 -0
  91. package/source/{Stamen.js → StadiaMaps.js} +85 -38
  92. package/source/TileArcGISRest.d.ts.map +1 -1
  93. package/source/TileArcGISRest.js +11 -22
  94. package/source/TileWMS.d.ts +0 -1
  95. package/source/TileWMS.d.ts.map +1 -1
  96. package/source/TileWMS.js +43 -106
  97. package/source/arcgisRest.d.ts +88 -0
  98. package/source/arcgisRest.d.ts.map +1 -0
  99. package/source/arcgisRest.js +131 -0
  100. package/source/common.d.ts +5 -0
  101. package/source/common.d.ts.map +1 -1
  102. package/source/common.js +6 -0
  103. package/source/mapguide.d.ts +52 -0
  104. package/source/mapguide.d.ts.map +1 -0
  105. package/source/mapguide.js +116 -0
  106. package/source/static.d.ts +45 -0
  107. package/source/static.d.ts.map +1 -0
  108. package/source/static.js +44 -0
  109. package/source/wms.d.ts +109 -1
  110. package/source/wms.d.ts.map +1 -1
  111. package/source/wms.js +170 -0
  112. package/source.d.ts +5 -1
  113. package/source.d.ts.map +1 -1
  114. package/source.js +5 -1
  115. package/style/flat.d.ts +332 -173
  116. package/style/flat.d.ts.map +1 -1
  117. package/style/flat.js +176 -248
  118. package/style/literal.d.ts +27 -72
  119. package/style/literal.d.ts.map +1 -1
  120. package/style/literal.js +14 -35
  121. package/util.d.ts.map +1 -1
  122. package/util.js +1 -1
  123. package/webgl/Helper.d.ts +7 -2
  124. package/webgl/Helper.d.ts.map +1 -1
  125. package/webgl/Helper.js +16 -27
  126. package/webgl/ShaderBuilder.d.ts +4 -14
  127. package/webgl/ShaderBuilder.d.ts.map +1 -1
  128. package/webgl/ShaderBuilder.js +72 -72
  129. package/webgl/styleparser.d.ts +3 -9
  130. package/webgl/styleparser.d.ts.map +1 -1
  131. package/webgl/styleparser.js +503 -88
  132. package/ImageBase.d.ts +0 -65
  133. package/ImageBase.d.ts.map +0 -1
  134. package/ImageBase.js +0 -98
  135. package/source/Stamen.d.ts.map +0 -1
@@ -17,6 +17,12 @@ uniform vec4 u_renderExtent;
17
17
  uniform mediump int u_hitDetection;
18
18
  `;
19
19
 
20
+ const PRECISION_HEADER = `#ifdef GL_FRAGMENT_PRECISION_HIGH
21
+ precision highp float;
22
+ #else
23
+ precision mediump float;
24
+ #endif`;
25
+
20
26
  const DEFAULT_STYLE = createDefaultStyle();
21
27
 
22
28
  /**
@@ -76,7 +82,7 @@ export class ShaderBuilder {
76
82
  */
77
83
  this.symbolSizeExpression_ = `vec2(${numberToGlsl(
78
84
  DEFAULT_STYLE['circle-radius']
79
- )})`;
85
+ )} + ${numberToGlsl(DEFAULT_STYLE['circle-stroke-width'] * 0.5)})`;
80
86
 
81
87
  /**
82
88
  * @type {string}
@@ -246,6 +252,13 @@ export class ShaderBuilder {
246
252
  return this;
247
253
  }
248
254
 
255
+ /**
256
+ * @return {string} The current symbol offset expression
257
+ */
258
+ getSymbolOffsetExpression() {
259
+ return this.symbolOffsetExpression_;
260
+ }
261
+
249
262
  /**
250
263
  * Sets an expression to compute the color of the shape.
251
264
  * This expression can use all the uniforms, varyings and attributes available
@@ -348,16 +361,6 @@ export class ShaderBuilder {
348
361
 
349
362
  /**
350
363
  * Generates a symbol vertex shader from the builder parameters
351
- *
352
- * The following uniforms are hardcoded in all shaders: `u_projectionMatrix`, `u_offsetScaleMatrix`,
353
- * `u_offsetRotateMatrix`, `u_time`, `u_zoom`, `u_resolution`, `u_hitDetection`.
354
- *
355
- * The following attributes are hardcoded and expected to be present in the vertex buffers:
356
- * `vec2 a_position`, `float a_index` (being the index of the vertex in the quad, 0 to 3), `vec4 a_hitColor`.
357
- *
358
- * The following varyings are hardcoded and gives the coordinate of the pixel both in the quad and on the texture:
359
- * `vec2 v_quadCoord`, `vec2 v_texCoord`, `vec4 v_hitColor`.
360
- *
361
364
  * @return {string|null} The full shader as a string; null if no size or color specified
362
365
  */
363
366
  getSymbolVertexShader() {
@@ -365,17 +368,13 @@ export class ShaderBuilder {
365
368
  return null;
366
369
  }
367
370
 
368
- const offsetMatrix = this.symbolRotateWithView_
369
- ? 'u_offsetScaleMatrix * u_offsetRotateMatrix'
370
- : 'u_offsetScaleMatrix';
371
-
372
- return `precision mediump float;
371
+ return `${PRECISION_HEADER}
373
372
  uniform mat4 u_projectionMatrix;
374
- uniform mat4 u_offsetScaleMatrix;
375
- uniform mat4 u_offsetRotateMatrix;
376
373
  uniform float u_time;
377
374
  uniform float u_zoom;
378
375
  uniform float u_resolution;
376
+ uniform float u_rotation;
377
+ uniform vec2 u_viewportSizePx;
379
378
  uniform mediump int u_hitDetection;
380
379
 
381
380
  ${this.uniforms_
@@ -394,42 +393,60 @@ ${this.attributes_
394
393
  varying vec2 v_texCoord;
395
394
  varying vec2 v_quadCoord;
396
395
  varying vec4 v_hitColor;
396
+ varying vec2 v_centerPx;
397
+ varying float v_angle;
398
+ varying vec2 v_quadSizePx;
397
399
  ${this.varyings_
398
400
  .map(function (varying) {
399
401
  return 'varying ' + varying.type + ' ' + varying.name + ';';
400
402
  })
401
403
  .join('\n')}
402
404
  ${this.vertexShaderFunctions_.join('\n')}
405
+ vec2 pxToScreen(vec2 coordPx) {
406
+ vec2 scaled = coordPx / u_viewportSizePx / 0.5;
407
+ ${
408
+ this.symbolRotateWithView_
409
+ ? 'scaled = vec2(scaled.x * cos(-u_rotation) - scaled.y * sin(-u_rotation), scaled.x * sin(-u_rotation) + scaled.y * cos(-u_rotation));'
410
+ : ''
411
+ }
412
+ return scaled;
413
+ }
414
+
415
+ vec2 screenToPx(vec2 coordScreen) {
416
+ return (coordScreen * 0.5 + 0.5) * u_viewportSizePx;
417
+ }
418
+
403
419
  void main(void) {
404
- mat4 offsetMatrix = ${offsetMatrix};
405
- vec2 halfSize = ${this.symbolSizeExpression_} * 0.5;
406
- vec2 offset = ${this.symbolOffsetExpression_};
407
- float angle = ${this.symbolRotationExpression_};
408
- float offsetX;
409
- float offsetY;
420
+ v_quadSizePx = ${this.symbolSizeExpression_};
421
+ vec2 halfSizePx = v_quadSizePx * 0.5;
422
+ vec2 centerOffsetPx = ${this.symbolOffsetExpression_};
423
+ vec2 offsetPx = centerOffsetPx;
410
424
  if (a_index == 0.0) {
411
- offsetX = (offset.x - halfSize.x) * cos(angle) + (offset.y - halfSize.y) * sin(angle);
412
- offsetY = (offset.y - halfSize.y) * cos(angle) - (offset.x - halfSize.x) * sin(angle);
425
+ offsetPx -= halfSizePx;
413
426
  } else if (a_index == 1.0) {
414
- offsetX = (offset.x + halfSize.x) * cos(angle) + (offset.y - halfSize.y) * sin(angle);
415
- offsetY = (offset.y - halfSize.y) * cos(angle) - (offset.x + halfSize.x) * sin(angle);
427
+ offsetPx += halfSizePx * vec2(1., -1.);
416
428
  } else if (a_index == 2.0) {
417
- offsetX = (offset.x + halfSize.x) * cos(angle) + (offset.y + halfSize.y) * sin(angle);
418
- offsetY = (offset.y + halfSize.y) * cos(angle) - (offset.x + halfSize.x) * sin(angle);
429
+ offsetPx += halfSizePx;
419
430
  } else {
420
- offsetX = (offset.x - halfSize.x) * cos(angle) + (offset.y + halfSize.y) * sin(angle);
421
- offsetY = (offset.y + halfSize.y) * cos(angle) - (offset.x - halfSize.x) * sin(angle);
431
+ offsetPx += halfSizePx * vec2(-1., 1.);
422
432
  }
423
- vec4 offsets = offsetMatrix * vec4(offsetX, offsetY, 0.0, 0.0);
424
- gl_Position = u_projectionMatrix * vec4(a_position, 0.0, 1.0) + offsets;
433
+ float angle = ${this.symbolRotationExpression_};
434
+ float c = cos(-angle);
435
+ float s = sin(-angle);
436
+ offsetPx = vec2(c * offsetPx.x - s * offsetPx.y, s * offsetPx.x + c * offsetPx.y);
437
+ vec4 center = u_projectionMatrix * vec4(a_position, 0.0, 1.0);
438
+ gl_Position = center + vec4(pxToScreen(offsetPx), 0., 0.);
425
439
  vec4 texCoord = ${this.texCoordExpression_};
426
440
  float u = a_index == 0.0 || a_index == 3.0 ? texCoord.s : texCoord.p;
427
441
  float v = a_index == 2.0 || a_index == 3.0 ? texCoord.t : texCoord.q;
428
442
  v_texCoord = vec2(u, v);
429
- u = a_index == 0.0 || a_index == 3.0 ? 0.0 : 1.0;
430
- v = a_index == 2.0 || a_index == 3.0 ? 0.0 : 1.0;
431
- v_quadCoord = vec2(u, v);
432
443
  v_hitColor = a_hitColor;
444
+ v_angle = angle;
445
+ ${this.symbolRotateWithView_ ? 'v_angle += u_rotation;' : ''}
446
+ c = cos(-v_angle);
447
+ s = sin(-v_angle);
448
+ centerOffsetPx = vec2(c * centerOffsetPx.x - s * centerOffsetPx.y, s * centerOffsetPx.x + c * centerOffsetPx.y);
449
+ v_centerPx = screenToPx(center.xy) + centerOffsetPx;
433
450
  ${this.varyings_
434
451
  .map(function (varying) {
435
452
  return ' ' + varying.name + ' = ' + varying.expression + ';';
@@ -440,10 +457,6 @@ ${this.varyings_
440
457
 
441
458
  /**
442
459
  * Generates a symbol fragment shader from the builder parameters
443
- *
444
- * Expects the following varyings to be transmitted by the vertex shader:
445
- * `vec2 v_quadCoord`, `vec2 v_texCoord`, `vec4 v_hitColor`.
446
- *
447
460
  * @return {string|null} The full shader as a string; null if no size or color specified
448
461
  */
449
462
  getSymbolFragmentShader() {
@@ -451,31 +464,34 @@ ${this.varyings_
451
464
  return null;
452
465
  }
453
466
 
454
- return `precision mediump float;
455
- uniform float u_time;
456
- uniform float u_zoom;
457
- uniform float u_resolution;
458
- uniform mediump int u_hitDetection;
467
+ return `${PRECISION_HEADER}
468
+ ${BASE_UNIFORMS}
459
469
  ${this.uniforms_
460
470
  .map(function (uniform) {
461
471
  return 'uniform ' + uniform + ';';
462
472
  })
463
473
  .join('\n')}
464
474
  varying vec2 v_texCoord;
465
- varying vec2 v_quadCoord;
466
475
  varying vec4 v_hitColor;
476
+ varying vec2 v_centerPx;
477
+ varying float v_angle;
478
+ varying vec2 v_quadSizePx;
467
479
  ${this.varyings_
468
480
  .map(function (varying) {
469
481
  return 'varying ' + varying.type + ' ' + varying.name + ';';
470
482
  })
471
483
  .join('\n')}
472
484
  ${this.fragmentShaderFunctions_.join('\n')}
485
+
473
486
  void main(void) {
474
487
  if (${this.discardExpression_}) { discard; }
488
+ vec2 coordsPx = gl_FragCoord.xy / u_pixelRatio - v_centerPx; // relative to center
489
+ float c = cos(v_angle);
490
+ float s = sin(v_angle);
491
+ coordsPx = vec2(c * coordsPx.x - s * coordsPx.y, s * coordsPx.x + c * coordsPx.y);
475
492
  gl_FragColor = ${this.symbolColorExpression_};
476
- gl_FragColor.rgb *= gl_FragColor.a;
477
493
  if (u_hitDetection > 0) {
478
- if (gl_FragColor.a < 0.1) { discard; };
494
+ if (gl_FragColor.a < 0.05) { discard; };
479
495
  gl_FragColor = v_hitColor;
480
496
  }
481
497
  }`;
@@ -490,11 +506,7 @@ void main(void) {
490
506
  return null;
491
507
  }
492
508
 
493
- return `#ifdef GL_FRAGMENT_PRECISION_HIGH
494
- precision highp float;
495
- #else
496
- precision mediump float;
497
- #endif
509
+ return `${PRECISION_HEADER}
498
510
  ${BASE_UNIFORMS}
499
511
  ${this.uniforms_
500
512
  .map(function (uniform) {
@@ -583,11 +595,7 @@ ${this.varyings_
583
595
  return null;
584
596
  }
585
597
 
586
- return `#ifdef GL_FRAGMENT_PRECISION_HIGH
587
- precision highp float;
588
- #else
589
- precision mediump float;
590
- #endif
598
+ return `${PRECISION_HEADER}
591
599
  ${BASE_UNIFORMS}
592
600
  ${this.uniforms_
593
601
  .map(function (uniform) {
@@ -620,9 +628,9 @@ float segmentDistanceField(vec2 point, vec2 start, vec2 end, float radius) {
620
628
  }
621
629
 
622
630
  void main(void) {
623
- vec2 v_currentPoint = gl_FragCoord.xy / u_pixelRatio;
631
+ vec2 currentPoint = gl_FragCoord.xy / u_pixelRatio;
624
632
  #ifdef GL_FRAGMENT_PRECISION_HIGH
625
- vec2 v_worldPos = pxToWorld(v_currentPoint);
633
+ vec2 v_worldPos = pxToWorld(currentPoint);
626
634
  if (
627
635
  abs(u_renderExtent[0] - u_renderExtent[2]) > 0.0 && (
628
636
  v_worldPos[0] < u_renderExtent[0] ||
@@ -636,7 +644,7 @@ void main(void) {
636
644
  #endif
637
645
  if (${this.discardExpression_}) { discard; }
638
646
  gl_FragColor = ${this.strokeColorExpression_} * u_globalAlpha;
639
- gl_FragColor *= segmentDistanceField(v_currentPoint, v_segmentStart, v_segmentEnd, v_width);
647
+ gl_FragColor *= segmentDistanceField(currentPoint, v_segmentStart, v_segmentEnd, v_width);
640
648
  if (u_hitDetection > 0) {
641
649
  if (gl_FragColor.a < 0.1) { discard; };
642
650
  gl_FragColor = v_hitColor;
@@ -654,11 +662,7 @@ void main(void) {
654
662
  return null;
655
663
  }
656
664
 
657
- return `#ifdef GL_FRAGMENT_PRECISION_HIGH
658
- precision highp float;
659
- #else
660
- precision mediump float;
661
- #endif
665
+ return `${PRECISION_HEADER}
662
666
  ${BASE_UNIFORMS}
663
667
  ${this.uniforms_
664
668
  .map(function (uniform) {
@@ -698,11 +702,7 @@ ${this.varyings_
698
702
  return null;
699
703
  }
700
704
 
701
- return `#ifdef GL_FRAGMENT_PRECISION_HIGH
702
- precision highp float;
703
- #else
704
- precision mediump float;
705
- #endif
705
+ return `${PRECISION_HEADER}
706
706
  ${BASE_UNIFORMS}
707
707
  ${this.uniforms_
708
708
  .map(function (uniform) {
@@ -1,9 +1,3 @@
1
- /**
2
- * @param {import('../style/literal.js').SymbolType} type Symbol type
3
- * @param {string} sizeExpressionGlsl Size expression
4
- * @return {string} The GLSL opacity function
5
- */
6
- export function getSymbolOpacityGlslFunction(type: import('../style/literal.js').SymbolType, sizeExpressionGlsl: string): string;
7
1
  /**
8
2
  * Packs all components of a color into a two-floats array
9
3
  * @param {import("../color.js").Color|string} color Color as array of numbers or string
@@ -17,17 +11,17 @@ export function packColor(color: import("../color.js").Color | string): Array<nu
17
11
  * @property {import("../render/webgl/VectorStyleRenderer.js").AttributeDefinitions} attributes Attribute definitions
18
12
  */
19
13
  /**
20
- * Parses a {@link import("../style/literal").LiteralStyle} object and returns a {@link ShaderBuilder}
14
+ * Parses a {@link import("../style/literal.js").LiteralStyle} object and returns a {@link ShaderBuilder}
21
15
  * object that has been configured according to the given style, as well as `attributes` and `uniforms`
22
16
  * arrays to be fed to the `WebGLPointsRenderer` class.
23
17
  *
24
18
  * Also returns `uniforms` and `attributes` properties as expected by the
25
19
  * {@link module:ol/renderer/webgl/PointsLayer~WebGLPointsLayerRenderer}.
26
20
  *
27
- * @param {import("../style/literal").LiteralStyle} style Literal style.
21
+ * @param {import("../style/literal.js").LiteralStyle} style Literal style.
28
22
  * @return {StyleParseResult} Result containing shader params, attributes and uniforms.
29
23
  */
30
- export function parseLiteralStyle(style: import("../style/literal").LiteralStyle): StyleParseResult;
24
+ export function parseLiteralStyle(style: import("../style/literal.js").LiteralStyle): StyleParseResult;
31
25
  export type StyleParseResult = {
32
26
  /**
33
27
  * Shader builder pre-configured according to a given style
@@ -1 +1 @@
1
- {"version":3,"file":"styleparser.d.ts","sourceRoot":"","sources":["styleparser.js"],"names":[],"mappings":"AAaA;;;;GAIG;AACH,mDAJW,OAAO,qBAAqB,EAAE,UAAU,sBACxC,MAAM,GACL,MAAM,CAiBjB;AAED;;;;GAIG;AACH,iCAHW,OAAO,aAAa,EAAE,KAAK,GAAC,MAAM,GACjC,MAAM,MAAM,CAAC,CASxB;AAoLD;;;;;GAKG;AAEH;;;;;;;;;;GAUG;AACH,yCAHW,OAAO,kBAAkB,EAAE,YAAY,GACtC,gBAAgB,CA4I3B;;;;;aA1Ja,aAAa;;;;cACb,OAAO,wCAAwC,EAAE,kBAAkB;;;;gBACnE,OAAO,wCAAwC,EAAE,oBAAoB;;8BAnOvD,oBAAoB"}
1
+ {"version":3,"file":"styleparser.d.ts","sourceRoot":"","sources":["styleparser.js"],"names":[],"mappings":"AAeA;;;;GAIG;AACH,iCAHW,OAAO,aAAa,EAAE,KAAK,GAAC,MAAM,GACjC,MAAM,MAAM,CAAC,CASxB;AAimBD;;;;;GAKG;AAEH;;;;;;;;;;GAUG;AACH,yCAHW,OAAO,qBAAqB,EAAE,YAAY,GACzC,gBAAgB,CAkJ3B;;;;;aAhKa,aAAa;;;;cACb,OAAO,wCAAwC,EAAE,kBAAkB;;;;gBACnE,OAAO,wCAAwC,EAAE,oBAAoB;;8BA5nBvD,oBAAoB"}