@kepler.gl/deckgl-layers 3.2.6 → 3.3.0-alpha.1

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 (65) hide show
  1. package/dist/3d-building-layer/3d-building-layer.d.ts +3 -3
  2. package/dist/3d-building-layer/3d-building-layer.js +9 -12
  3. package/dist/3d-building-layer/types.d.ts +8 -8
  4. package/dist/cluster-layer/cluster-layer.d.ts +16 -26
  5. package/dist/cluster-layer/cluster-layer.js +19 -33
  6. package/dist/column-layer/enhanced-column-layer.d.ts +4 -4
  7. package/dist/column-layer/enhanced-column-layer.js +39 -35
  8. package/dist/deckgl-extensions/filter-arrow-layer.d.ts +33 -6
  9. package/dist/deckgl-extensions/filter-arrow-layer.js +4 -12
  10. package/dist/deckgl-extensions/filter-shader-module.d.ts +32 -4
  11. package/dist/deckgl-extensions/filter-shader-module.js +3 -4
  12. package/dist/grid-layer/enhanced-cpu-grid-layer.d.ts +4913 -6
  13. package/dist/grid-layer/enhanced-cpu-grid-layer.js +67 -44
  14. package/dist/hexagon-layer/enhanced-hexagon-layer.d.ts +4910 -4
  15. package/dist/hexagon-layer/enhanced-hexagon-layer.js +82 -41
  16. package/dist/index.d.ts +1 -0
  17. package/dist/index.js +13 -1
  18. package/dist/layer-utils/aggregation-utils.d.ts +44 -0
  19. package/dist/layer-utils/aggregation-utils.js +181 -0
  20. package/dist/layer-utils/cpu-aggregator.d.ts +74 -27
  21. package/dist/layer-utils/cpu-aggregator.js +224 -19
  22. package/dist/layer-utils/shader-utils.d.ts +1 -0
  23. package/dist/layer-utils/shader-utils.js +10 -1
  24. package/dist/line-layer/line-layer.d.ts +4 -4
  25. package/dist/line-layer/line-layer.js +29 -21
  26. package/dist/raster/images.d.ts +10 -3
  27. package/dist/raster/images.js +154 -60
  28. package/dist/raster/pipeline-validation-patch.d.ts +1 -0
  29. package/dist/raster/pipeline-validation-patch.js +101 -0
  30. package/dist/raster/raster-layer/raster-layer-shaders.d.ts +56 -0
  31. package/dist/raster/raster-layer/raster-layer-shaders.js +163 -0
  32. package/dist/raster/raster-layer/raster-layer.d.ts +6 -6
  33. package/dist/raster/raster-layer/raster-layer.js +90 -88
  34. package/dist/raster/raster-mesh-layer/matrix.d.ts +3 -1
  35. package/dist/raster/raster-mesh-layer/matrix.js +3 -3
  36. package/dist/raster/raster-mesh-layer/raster-mesh-layer-shaders.d.ts +19 -0
  37. package/dist/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +38 -0
  38. package/dist/raster/raster-mesh-layer/raster-mesh-layer.d.ts +7 -6
  39. package/dist/raster/raster-mesh-layer/raster-mesh-layer.js +97 -83
  40. package/dist/raster/raster-processing-uniforms.d.ts +38 -0
  41. package/dist/raster/raster-processing-uniforms.js +124 -0
  42. package/dist/raster/types.d.ts +8 -8
  43. package/dist/raster/types.js +1 -1
  44. package/dist/raster/util.d.ts +15 -0
  45. package/dist/raster/util.js +113 -3
  46. package/dist/raster/webgl/color/colormap.js +13 -7
  47. package/dist/raster/webgl/color/filter.js +22 -12
  48. package/dist/raster/webgl/color/gamma-contrast.js +9 -3
  49. package/dist/raster/webgl/color/linear-rescale.js +9 -5
  50. package/dist/raster/webgl/color/saturation.js +7 -4
  51. package/dist/raster/webgl/color/sigmoidal-contrast.js +9 -5
  52. package/dist/raster/webgl/pansharpen/pansharpen-brovey.js +7 -4
  53. package/dist/raster/webgl/texture/combine-bands.js +1 -1
  54. package/dist/raster/webgl/texture/mask.js +27 -35
  55. package/dist/raster/webgl/texture/reorder-bands.js +8 -5
  56. package/dist/raster/webgl/texture/rgba-image.js +1 -1
  57. package/dist/raster/webgl/types.d.ts +11 -6
  58. package/dist/raster/webgl/types.js +1 -1
  59. package/dist/svg-icon-layer/scatterplot-icon-layer.d.ts +2 -4
  60. package/dist/svg-icon-layer/scatterplot-icon-layer.js +19 -25
  61. package/dist/svg-icon-layer/svg-icon-layer.d.ts +4 -6
  62. package/dist/svg-icon-layer/svg-icon-layer.js +5 -3
  63. package/dist/wms/wms-layer.d.ts +8 -5
  64. package/dist/wms/wms-layer.js +100 -27
  65. package/package.json +21 -17
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.patchPipelineValidation = patchPipelineValidation;
7
+ var _webgl = require("@luma.gl/webgl");
8
+ // SPDX-License-Identifier: MIT
9
+ // Copyright contributors to the kepler.gl project
10
+
11
+ /**
12
+ * Patch luma.gl 9's pipeline validation to tolerate mixed-sampler-type
13
+ * validation errors in _getLinkStatus().
14
+ *
15
+ * WebGL2's validateProgram checks that sampler uniforms of different types
16
+ * (sampler2D, usampler2D, isampler2D) are not assigned to the same texture
17
+ * unit. Programs that mix sampler types (e.g. raster band data as usampler2D +
18
+ * shadow maps as sampler2D) may fail validation even though they linked
19
+ * successfully and work correctly once texture units are assigned at draw time.
20
+ *
21
+ * In luma.gl ≥9.3 the _getLinkStatus method moved from WEBGLRenderPipeline to
22
+ * WEBGLSharedRenderPipeline and now calls _initializeSamplerUniforms() before
23
+ * validateProgram, which fixes most false positives. However, some WebGL
24
+ * drivers still report errors even with unique units, so we keep suppressing
25
+ * the known false-positive about mixed sampler types. We patch _getLinkStatus
26
+ * on whichever pipeline class owns it.
27
+ */
28
+
29
+ // @ts-ignore resolution depends on moduleResolution setting
30
+
31
+ var MIXED_SAMPLER_RE = /different type[s]? use the same sampler location/i;
32
+ var _patched = false;
33
+ function createPatchedLinkStatus(_original) {
34
+ return function _patchedGetLinkStatus() {
35
+ var gl = this.device.gl;
36
+ var linked = gl.getProgramParameter(this.handle, 0x8b82 /* LINK_STATUS */);
37
+ if (!linked) {
38
+ this.linkStatus = 'error';
39
+ return 'link-error';
40
+ }
41
+
42
+ // luma.gl ≥9.3 assigns unique texture units to samplers before
43
+ // validation via _initializeSamplerUniforms. Call it here so that
44
+ // the sampler-to-unit mapping is populated through our patched path.
45
+ if (typeof this._initializeSamplerUniforms === 'function') {
46
+ this._initializeSamplerUniforms();
47
+ }
48
+ gl.validateProgram(this.handle);
49
+ var validated = gl.getProgramParameter(this.handle, 0x8b83 /* VALIDATE_STATUS */);
50
+ if (!validated) {
51
+ var infoLog = gl.getProgramInfoLog(this.handle) || '';
52
+ if (!MIXED_SAMPLER_RE.test(infoLog)) {
53
+ this.linkStatus = 'error';
54
+ return 'validation-error';
55
+ }
56
+ }
57
+ this.linkStatus = 'success';
58
+ return 'success';
59
+ };
60
+ }
61
+ function patchPipelineValidation() {
62
+ if (_patched) return;
63
+ _patched = true;
64
+
65
+ // Strategy 1: luma.gl <9.3 — _getLinkStatus on WEBGLRenderPipeline
66
+ if (_webgl.WEBGLRenderPipeline !== null && _webgl.WEBGLRenderPipeline !== void 0 && _webgl.WEBGLRenderPipeline.prototype && typeof _webgl.WEBGLRenderPipeline.prototype._getLinkStatus === 'function') {
67
+ var original = _webgl.WEBGLRenderPipeline.prototype._getLinkStatus;
68
+ _webgl.WEBGLRenderPipeline.prototype._getLinkStatus = createPatchedLinkStatus(original);
69
+ return;
70
+ }
71
+
72
+ // Strategy 2: luma.gl ≥9.3 — _getLinkStatus moved to WEBGLSharedRenderPipeline.
73
+ // That class is not publicly exported, so we hook the factory on WebGLDevice
74
+ // that creates shared pipelines. The first invocation discovers the class,
75
+ // patches its prototype, then re-validates the instance.
76
+ var deviceProto = _webgl.WebGLDevice === null || _webgl.WebGLDevice === void 0 ? void 0 : _webgl.WebGLDevice.prototype;
77
+ var origFactory = deviceProto === null || deviceProto === void 0 ? void 0 : deviceProto._createSharedRenderPipelineWebGL;
78
+ if (typeof origFactory !== 'function') return;
79
+ deviceProto._createSharedRenderPipelineWebGL = function () {
80
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
81
+ args[_key] = arguments[_key];
82
+ }
83
+ var instance = origFactory.apply(this, args);
84
+ var SharedCtor = Object.getPrototypeOf(instance).constructor;
85
+ if (SharedCtor && SharedCtor !== _webgl.WEBGLRenderPipeline && typeof SharedCtor.prototype._getLinkStatus === 'function') {
86
+ var _original2 = SharedCtor.prototype._getLinkStatus;
87
+ SharedCtor.prototype._getLinkStatus = createPatchedLinkStatus(_original2);
88
+
89
+ // Re-validate this first instance since its _getLinkStatus already ran
90
+ // with the unpatched version during construction.
91
+ if (instance.linkStatus !== 'success') {
92
+ instance._getLinkStatus();
93
+ }
94
+ }
95
+
96
+ // Restore original factory — future instances will use the patched prototype
97
+ deviceProto._createSharedRenderPipelineWebGL = origFactory;
98
+ return instance;
99
+ };
100
+ }
101
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd2ViZ2wiLCJyZXF1aXJlIiwiTUlYRURfU0FNUExFUl9SRSIsIl9wYXRjaGVkIiwiY3JlYXRlUGF0Y2hlZExpbmtTdGF0dXMiLCJfb3JpZ2luYWwiLCJfcGF0Y2hlZEdldExpbmtTdGF0dXMiLCJnbCIsImRldmljZSIsImxpbmtlZCIsImdldFByb2dyYW1QYXJhbWV0ZXIiLCJoYW5kbGUiLCJsaW5rU3RhdHVzIiwiX2luaXRpYWxpemVTYW1wbGVyVW5pZm9ybXMiLCJ2YWxpZGF0ZVByb2dyYW0iLCJ2YWxpZGF0ZWQiLCJpbmZvTG9nIiwiZ2V0UHJvZ3JhbUluZm9Mb2ciLCJ0ZXN0IiwicGF0Y2hQaXBlbGluZVZhbGlkYXRpb24iLCJXRUJHTFJlbmRlclBpcGVsaW5lIiwicHJvdG90eXBlIiwiX2dldExpbmtTdGF0dXMiLCJvcmlnaW5hbCIsImRldmljZVByb3RvIiwiV2ViR0xEZXZpY2UiLCJvcmlnRmFjdG9yeSIsIl9jcmVhdGVTaGFyZWRSZW5kZXJQaXBlbGluZVdlYkdMIiwiX2xlbiIsImFyZ3VtZW50cyIsImxlbmd0aCIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJpbnN0YW5jZSIsImFwcGx5IiwiU2hhcmVkQ3RvciIsIk9iamVjdCIsImdldFByb3RvdHlwZU9mIiwiY29uc3RydWN0b3IiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvcmFzdGVyL3BpcGVsaW5lLXZhbGlkYXRpb24tcGF0Y2gudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuLyoqXG4gKiBQYXRjaCBsdW1hLmdsIDkncyBwaXBlbGluZSB2YWxpZGF0aW9uIHRvIHRvbGVyYXRlIG1peGVkLXNhbXBsZXItdHlwZVxuICogdmFsaWRhdGlvbiBlcnJvcnMgaW4gX2dldExpbmtTdGF0dXMoKS5cbiAqXG4gKiBXZWJHTDIncyB2YWxpZGF0ZVByb2dyYW0gY2hlY2tzIHRoYXQgc2FtcGxlciB1bmlmb3JtcyBvZiBkaWZmZXJlbnQgdHlwZXNcbiAqIChzYW1wbGVyMkQsIHVzYW1wbGVyMkQsIGlzYW1wbGVyMkQpIGFyZSBub3QgYXNzaWduZWQgdG8gdGhlIHNhbWUgdGV4dHVyZVxuICogdW5pdC4gUHJvZ3JhbXMgdGhhdCBtaXggc2FtcGxlciB0eXBlcyAoZS5nLiByYXN0ZXIgYmFuZCBkYXRhIGFzIHVzYW1wbGVyMkQgK1xuICogc2hhZG93IG1hcHMgYXMgc2FtcGxlcjJEKSBtYXkgZmFpbCB2YWxpZGF0aW9uIGV2ZW4gdGhvdWdoIHRoZXkgbGlua2VkXG4gKiBzdWNjZXNzZnVsbHkgYW5kIHdvcmsgY29ycmVjdGx5IG9uY2UgdGV4dHVyZSB1bml0cyBhcmUgYXNzaWduZWQgYXQgZHJhdyB0aW1lLlxuICpcbiAqIEluIGx1bWEuZ2wg4omlOS4zIHRoZSBfZ2V0TGlua1N0YXR1cyBtZXRob2QgbW92ZWQgZnJvbSBXRUJHTFJlbmRlclBpcGVsaW5lIHRvXG4gKiBXRUJHTFNoYXJlZFJlbmRlclBpcGVsaW5lIGFuZCBub3cgY2FsbHMgX2luaXRpYWxpemVTYW1wbGVyVW5pZm9ybXMoKSBiZWZvcmVcbiAqIHZhbGlkYXRlUHJvZ3JhbSwgd2hpY2ggZml4ZXMgbW9zdCBmYWxzZSBwb3NpdGl2ZXMuIEhvd2V2ZXIsIHNvbWUgV2ViR0xcbiAqIGRyaXZlcnMgc3RpbGwgcmVwb3J0IGVycm9ycyBldmVuIHdpdGggdW5pcXVlIHVuaXRzLCBzbyB3ZSBrZWVwIHN1cHByZXNzaW5nXG4gKiB0aGUga25vd24gZmFsc2UtcG9zaXRpdmUgYWJvdXQgbWl4ZWQgc2FtcGxlciB0eXBlcy4gV2UgcGF0Y2ggX2dldExpbmtTdGF0dXNcbiAqIG9uIHdoaWNoZXZlciBwaXBlbGluZSBjbGFzcyBvd25zIGl0LlxuICovXG5cbi8vIEB0cy1pZ25vcmUgcmVzb2x1dGlvbiBkZXBlbmRzIG9uIG1vZHVsZVJlc29sdXRpb24gc2V0dGluZ1xuaW1wb3J0IHtXRUJHTFJlbmRlclBpcGVsaW5lLCBXZWJHTERldmljZX0gZnJvbSAnQGx1bWEuZ2wvd2ViZ2wnO1xuXG5jb25zdCBNSVhFRF9TQU1QTEVSX1JFID0gL2RpZmZlcmVudCB0eXBlW3NdPyB1c2UgdGhlIHNhbWUgc2FtcGxlciBsb2NhdGlvbi9pO1xuXG5sZXQgX3BhdGNoZWQgPSBmYWxzZTtcblxuZnVuY3Rpb24gY3JlYXRlUGF0Y2hlZExpbmtTdGF0dXMoX29yaWdpbmFsOiAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duKSB7XG4gIHJldHVybiBmdW5jdGlvbiBfcGF0Y2hlZEdldExpbmtTdGF0dXModGhpczogYW55KSB7XG4gICAgY29uc3Qge2dsfSA9IHRoaXMuZGV2aWNlO1xuICAgIGNvbnN0IGxpbmtlZCA9IGdsLmdldFByb2dyYW1QYXJhbWV0ZXIodGhpcy5oYW5kbGUsIDB4OGI4MiAvKiBMSU5LX1NUQVRVUyAqLyk7XG4gICAgaWYgKCFsaW5rZWQpIHtcbiAgICAgIHRoaXMubGlua1N0YXR1cyA9ICdlcnJvcic7XG4gICAgICByZXR1cm4gJ2xpbmstZXJyb3InO1xuICAgIH1cblxuICAgIC8vIGx1bWEuZ2wg4omlOS4zIGFzc2lnbnMgdW5pcXVlIHRleHR1cmUgdW5pdHMgdG8gc2FtcGxlcnMgYmVmb3JlXG4gICAgLy8gdmFsaWRhdGlvbiB2aWEgX2luaXRpYWxpemVTYW1wbGVyVW5pZm9ybXMuIENhbGwgaXQgaGVyZSBzbyB0aGF0XG4gICAgLy8gdGhlIHNhbXBsZXItdG8tdW5pdCBtYXBwaW5nIGlzIHBvcHVsYXRlZCB0aHJvdWdoIG91ciBwYXRjaGVkIHBhdGguXG4gICAgaWYgKHR5cGVvZiB0aGlzLl9pbml0aWFsaXplU2FtcGxlclVuaWZvcm1zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLl9pbml0aWFsaXplU2FtcGxlclVuaWZvcm1zKCk7XG4gICAgfVxuXG4gICAgZ2wudmFsaWRhdGVQcm9ncmFtKHRoaXMuaGFuZGxlKTtcbiAgICBjb25zdCB2YWxpZGF0ZWQgPSBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHRoaXMuaGFuZGxlLCAweDhiODMgLyogVkFMSURBVEVfU1RBVFVTICovKTtcbiAgICBpZiAoIXZhbGlkYXRlZCkge1xuICAgICAgY29uc3QgaW5mb0xvZyA9IGdsLmdldFByb2dyYW1JbmZvTG9nKHRoaXMuaGFuZGxlKSB8fCAnJztcbiAgICAgIGlmICghTUlYRURfU0FNUExFUl9SRS50ZXN0KGluZm9Mb2cpKSB7XG4gICAgICAgIHRoaXMubGlua1N0YXR1cyA9ICdlcnJvcic7XG4gICAgICAgIHJldHVybiAndmFsaWRhdGlvbi1lcnJvcic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5saW5rU3RhdHVzID0gJ3N1Y2Nlc3MnO1xuICAgIHJldHVybiAnc3VjY2Vzcyc7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRjaFBpcGVsaW5lVmFsaWRhdGlvbigpOiB2b2lkIHtcbiAgaWYgKF9wYXRjaGVkKSByZXR1cm47XG4gIF9wYXRjaGVkID0gdHJ1ZTtcblxuICAvLyBTdHJhdGVneSAxOiBsdW1hLmdsIDw5LjMg4oCUIF9nZXRMaW5rU3RhdHVzIG9uIFdFQkdMUmVuZGVyUGlwZWxpbmVcbiAgaWYgKFxuICAgIFdFQkdMUmVuZGVyUGlwZWxpbmU/LnByb3RvdHlwZSAmJlxuICAgIHR5cGVvZiAoV0VCR0xSZW5kZXJQaXBlbGluZS5wcm90b3R5cGUgYXMgYW55KS5fZ2V0TGlua1N0YXR1cyA9PT0gJ2Z1bmN0aW9uJ1xuICApIHtcbiAgICBjb25zdCBvcmlnaW5hbCA9IChXRUJHTFJlbmRlclBpcGVsaW5lLnByb3RvdHlwZSBhcyBhbnkpLl9nZXRMaW5rU3RhdHVzO1xuICAgIChXRUJHTFJlbmRlclBpcGVsaW5lLnByb3RvdHlwZSBhcyBhbnkpLl9nZXRMaW5rU3RhdHVzID0gY3JlYXRlUGF0Y2hlZExpbmtTdGF0dXMob3JpZ2luYWwpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFN0cmF0ZWd5IDI6IGx1bWEuZ2wg4omlOS4zIOKAlCBfZ2V0TGlua1N0YXR1cyBtb3ZlZCB0byBXRUJHTFNoYXJlZFJlbmRlclBpcGVsaW5lLlxuICAvLyBUaGF0IGNsYXNzIGlzIG5vdCBwdWJsaWNseSBleHBvcnRlZCwgc28gd2UgaG9vayB0aGUgZmFjdG9yeSBvbiBXZWJHTERldmljZVxuICAvLyB0aGF0IGNyZWF0ZXMgc2hhcmVkIHBpcGVsaW5lcy4gVGhlIGZpcnN0IGludm9jYXRpb24gZGlzY292ZXJzIHRoZSBjbGFzcyxcbiAgLy8gcGF0Y2hlcyBpdHMgcHJvdG90eXBlLCB0aGVuIHJlLXZhbGlkYXRlcyB0aGUgaW5zdGFuY2UuXG4gIGNvbnN0IGRldmljZVByb3RvID0gV2ViR0xEZXZpY2U/LnByb3RvdHlwZSBhcyBhbnk7XG4gIGNvbnN0IG9yaWdGYWN0b3J5ID0gZGV2aWNlUHJvdG8/Ll9jcmVhdGVTaGFyZWRSZW5kZXJQaXBlbGluZVdlYkdMO1xuICBpZiAodHlwZW9mIG9yaWdGYWN0b3J5ICE9PSAnZnVuY3Rpb24nKSByZXR1cm47XG5cbiAgZGV2aWNlUHJvdG8uX2NyZWF0ZVNoYXJlZFJlbmRlclBpcGVsaW5lV2ViR0wgPSBmdW5jdGlvbiAodGhpczogYW55LCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gb3JpZ0ZhY3RvcnkuYXBwbHkodGhpcywgYXJncyk7XG4gICAgY29uc3QgU2hhcmVkQ3RvciA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihpbnN0YW5jZSkuY29uc3RydWN0b3I7XG5cbiAgICBpZiAoXG4gICAgICBTaGFyZWRDdG9yICYmXG4gICAgICBTaGFyZWRDdG9yICE9PSBXRUJHTFJlbmRlclBpcGVsaW5lICYmXG4gICAgICB0eXBlb2YgU2hhcmVkQ3Rvci5wcm90b3R5cGUuX2dldExpbmtTdGF0dXMgPT09ICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsID0gU2hhcmVkQ3Rvci5wcm90b3R5cGUuX2dldExpbmtTdGF0dXM7XG4gICAgICBTaGFyZWRDdG9yLnByb3RvdHlwZS5fZ2V0TGlua1N0YXR1cyA9IGNyZWF0ZVBhdGNoZWRMaW5rU3RhdHVzKG9yaWdpbmFsKTtcblxuICAgICAgLy8gUmUtdmFsaWRhdGUgdGhpcyBmaXJzdCBpbnN0YW5jZSBzaW5jZSBpdHMgX2dldExpbmtTdGF0dXMgYWxyZWFkeSByYW5cbiAgICAgIC8vIHdpdGggdGhlIHVucGF0Y2hlZCB2ZXJzaW9uIGR1cmluZyBjb25zdHJ1Y3Rpb24uXG4gICAgICBpZiAoaW5zdGFuY2UubGlua1N0YXR1cyAhPT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgIGluc3RhbmNlLl9nZXRMaW5rU3RhdHVzKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBvcmlnaW5hbCBmYWN0b3J5IOKAlCBmdXR1cmUgaW5zdGFuY2VzIHdpbGwgdXNlIHRoZSBwYXRjaGVkIHByb3RvdHlwZVxuICAgIGRldmljZVByb3RvLl9jcmVhdGVTaGFyZWRSZW5kZXJQaXBlbGluZVdlYkdMID0gb3JpZ0ZhY3Rvcnk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFzQkEsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBdEJBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFHQSxJQUFNQyxnQkFBZ0IsR0FBRyxtREFBbUQ7QUFFNUUsSUFBSUMsUUFBUSxHQUFHLEtBQUs7QUFFcEIsU0FBU0MsdUJBQXVCQSxDQUFDQyxTQUEwQyxFQUFFO0VBQzNFLE9BQU8sU0FBU0MscUJBQXFCQSxDQUFBLEVBQVk7SUFDL0MsSUFBT0MsRUFBRSxHQUFJLElBQUksQ0FBQ0MsTUFBTSxDQUFqQkQsRUFBRTtJQUNULElBQU1FLE1BQU0sR0FBR0YsRUFBRSxDQUFDRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUNDLE1BQU0sRUFBRSxNQUFNLENBQUMsaUJBQWlCLENBQUM7SUFDNUUsSUFBSSxDQUFDRixNQUFNLEVBQUU7TUFDWCxJQUFJLENBQUNHLFVBQVUsR0FBRyxPQUFPO01BQ3pCLE9BQU8sWUFBWTtJQUNyQjs7SUFFQTtJQUNBO0lBQ0E7SUFDQSxJQUFJLE9BQU8sSUFBSSxDQUFDQywwQkFBMEIsS0FBSyxVQUFVLEVBQUU7TUFDekQsSUFBSSxDQUFDQSwwQkFBMEIsQ0FBQyxDQUFDO0lBQ25DO0lBRUFOLEVBQUUsQ0FBQ08sZUFBZSxDQUFDLElBQUksQ0FBQ0gsTUFBTSxDQUFDO0lBQy9CLElBQU1JLFNBQVMsR0FBR1IsRUFBRSxDQUFDRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUNDLE1BQU0sRUFBRSxNQUFNLENBQUMscUJBQXFCLENBQUM7SUFDbkYsSUFBSSxDQUFDSSxTQUFTLEVBQUU7TUFDZCxJQUFNQyxPQUFPLEdBQUdULEVBQUUsQ0FBQ1UsaUJBQWlCLENBQUMsSUFBSSxDQUFDTixNQUFNLENBQUMsSUFBSSxFQUFFO01BQ3ZELElBQUksQ0FBQ1QsZ0JBQWdCLENBQUNnQixJQUFJLENBQUNGLE9BQU8sQ0FBQyxFQUFFO1FBQ25DLElBQUksQ0FBQ0osVUFBVSxHQUFHLE9BQU87UUFDekIsT0FBTyxrQkFBa0I7TUFDM0I7SUFDRjtJQUVBLElBQUksQ0FBQ0EsVUFBVSxHQUFHLFNBQVM7SUFDM0IsT0FBTyxTQUFTO0VBQ2xCLENBQUM7QUFDSDtBQUVPLFNBQVNPLHVCQUF1QkEsQ0FBQSxFQUFTO0VBQzlDLElBQUloQixRQUFRLEVBQUU7RUFDZEEsUUFBUSxHQUFHLElBQUk7O0VBRWY7RUFDQSxJQUNFaUIsMEJBQW1CLGFBQW5CQSwwQkFBbUIsZUFBbkJBLDBCQUFtQixDQUFFQyxTQUFTLElBQzlCLE9BQVFELDBCQUFtQixDQUFDQyxTQUFTLENBQVNDLGNBQWMsS0FBSyxVQUFVLEVBQzNFO0lBQ0EsSUFBTUMsUUFBUSxHQUFJSCwwQkFBbUIsQ0FBQ0MsU0FBUyxDQUFTQyxjQUFjO0lBQ3JFRiwwQkFBbUIsQ0FBQ0MsU0FBUyxDQUFTQyxjQUFjLEdBQUdsQix1QkFBdUIsQ0FBQ21CLFFBQVEsQ0FBQztJQUN6RjtFQUNGOztFQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsSUFBTUMsV0FBVyxHQUFHQyxrQkFBVyxhQUFYQSxrQkFBVyx1QkFBWEEsa0JBQVcsQ0FBRUosU0FBZ0I7RUFDakQsSUFBTUssV0FBVyxHQUFHRixXQUFXLGFBQVhBLFdBQVcsdUJBQVhBLFdBQVcsQ0FBRUcsZ0NBQWdDO0VBQ2pFLElBQUksT0FBT0QsV0FBVyxLQUFLLFVBQVUsRUFBRTtFQUV2Q0YsV0FBVyxDQUFDRyxnQ0FBZ0MsR0FBRyxZQUFxQztJQUFBLFNBQUFDLElBQUEsR0FBQUMsU0FBQSxDQUFBQyxNQUFBLEVBQWJDLElBQUksT0FBQUMsS0FBQSxDQUFBSixJQUFBLEdBQUFLLElBQUEsTUFBQUEsSUFBQSxHQUFBTCxJQUFBLEVBQUFLLElBQUE7TUFBSkYsSUFBSSxDQUFBRSxJQUFBLElBQUFKLFNBQUEsQ0FBQUksSUFBQTtJQUFBO0lBQ3pFLElBQU1DLFFBQVEsR0FBR1IsV0FBVyxDQUFDUyxLQUFLLENBQUMsSUFBSSxFQUFFSixJQUFJLENBQUM7SUFDOUMsSUFBTUssVUFBVSxHQUFHQyxNQUFNLENBQUNDLGNBQWMsQ0FBQ0osUUFBUSxDQUFDLENBQUNLLFdBQVc7SUFFOUQsSUFDRUgsVUFBVSxJQUNWQSxVQUFVLEtBQUtoQiwwQkFBbUIsSUFDbEMsT0FBT2dCLFVBQVUsQ0FBQ2YsU0FBUyxDQUFDQyxjQUFjLEtBQUssVUFBVSxFQUN6RDtNQUNBLElBQU1DLFVBQVEsR0FBR2EsVUFBVSxDQUFDZixTQUFTLENBQUNDLGNBQWM7TUFDcERjLFVBQVUsQ0FBQ2YsU0FBUyxDQUFDQyxjQUFjLEdBQUdsQix1QkFBdUIsQ0FBQ21CLFVBQVEsQ0FBQzs7TUFFdkU7TUFDQTtNQUNBLElBQUlXLFFBQVEsQ0FBQ3RCLFVBQVUsS0FBSyxTQUFTLEVBQUU7UUFDckNzQixRQUFRLENBQUNaLGNBQWMsQ0FBQyxDQUFDO01BQzNCO0lBQ0Y7O0lBRUE7SUFDQUUsV0FBVyxDQUFDRyxnQ0FBZ0MsR0FBR0QsV0FBVztJQUMxRCxPQUFPUSxRQUFRO0VBQ2pCLENBQUM7QUFDSCIsImlnbm9yZUxpc3QiOltdfQ==
@@ -0,0 +1,56 @@
1
+ import type { ShaderModule as LumaShaderModule } from '../webgl/types';
2
+ export declare const rasterUniforms: {
3
+ name: string;
4
+ vs: string;
5
+ fs: string;
6
+ uniformTypes: {
7
+ bounds: string;
8
+ coordinateConversion: string;
9
+ desaturate: string;
10
+ opacity: string;
11
+ tintColor: string;
12
+ transparentColor: string;
13
+ };
14
+ };
15
+ /**
16
+ * Register custom DECKGL_CREATE_COLOR and DECKGL_MUTATE_COLOR shader hooks
17
+ * with the default ShaderAssembler. These hooks are used by the raster layer's
18
+ * custom shader modules (rgbaImage, combineBands, colormap, etc.).
19
+ *
20
+ * In luma.gl 8.x these were registered via ProgramManager; in luma.gl 9.x
21
+ * we register them with the ShaderAssembler singleton.
22
+ *
23
+ * NOTE: We must check the assembler's hook list every time rather than using
24
+ * a module-level boolean guard, because deck.gl's getShaderAssembler() clears
25
+ * _hookFunctions when a new Deck instance is created (e.g. during image export).
26
+ */
27
+ export declare function ensureRasterHooksRegistered(): void;
28
+ /**
29
+ * Convert kepler.gl's custom raster shader modules into luma.gl 9 compatible
30
+ * format. Ensures fs2 (WebGL2) shaders are used and texture2D -> texture.
31
+ */
32
+ interface LumaModuleOutput {
33
+ name: string;
34
+ fs: string;
35
+ vs?: string;
36
+ defines?: Record<string, string>;
37
+ getUniforms?: (opts: object) => Record<string, unknown> | null;
38
+ uniforms?: Record<string, unknown>;
39
+ uniformTypes?: Record<string, string>;
40
+ inject?: Record<string, string>;
41
+ dependencies?: unknown[];
42
+ deprecations?: unknown[];
43
+ }
44
+ export declare function prepareLumaModules(modules: LumaShaderModule[]): LumaModuleOutput[];
45
+ /**
46
+ * Build the vertex shader for the raster layer.
47
+ * References raster.coordinateConversion from the UBO.
48
+ */
49
+ export declare function buildRasterVertexShader(): string;
50
+ /**
51
+ * Build the fragment shader for the raster layer.
52
+ * Uses DECKGL_CREATE_COLOR and DECKGL_MUTATE_COLOR hooks which are now
53
+ * registered with the ShaderAssembler and populated by module injections.
54
+ */
55
+ export declare function buildRasterFragmentShader(): string;
56
+ export {};
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.buildRasterFragmentShader = buildRasterFragmentShader;
8
+ exports.buildRasterVertexShader = buildRasterVertexShader;
9
+ exports.ensureRasterHooksRegistered = ensureRasterHooksRegistered;
10
+ exports.prepareLumaModules = prepareLumaModules;
11
+ exports.rasterUniforms = void 0;
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
+ var _shadertools = require("@luma.gl/shadertools");
14
+ var _rasterProcessingUniforms = require("../raster-processing-uniforms");
15
+ // SPDX-License-Identifier: MIT
16
+ // Copyright contributors to the kepler.gl project
17
+
18
+ /**
19
+ * UBO-based shader module for raster layer uniforms.
20
+ * Replaces the old standalone `uniform float desaturate` etc.
21
+ */
22
+ var rasterUniformBlock = "uniform rasterUniforms {\n vec4 bounds;\n float coordinateConversion;\n float desaturate;\n float opacity;\n vec3 tintColor;\n vec4 transparentColor;\n} raster;\n";
23
+ var rasterUniforms = exports.rasterUniforms = {
24
+ name: 'raster',
25
+ vs: rasterUniformBlock,
26
+ fs: rasterUniformBlock,
27
+ uniformTypes: {
28
+ bounds: 'vec4<f32>',
29
+ coordinateConversion: 'f32',
30
+ desaturate: 'f32',
31
+ opacity: 'f32',
32
+ tintColor: 'vec3<f32>',
33
+ transparentColor: 'vec4<f32>'
34
+ }
35
+ };
36
+
37
+ /**
38
+ * Register custom DECKGL_CREATE_COLOR and DECKGL_MUTATE_COLOR shader hooks
39
+ * with the default ShaderAssembler. These hooks are used by the raster layer's
40
+ * custom shader modules (rgbaImage, combineBands, colormap, etc.).
41
+ *
42
+ * In luma.gl 8.x these were registered via ProgramManager; in luma.gl 9.x
43
+ * we register them with the ShaderAssembler singleton.
44
+ *
45
+ * NOTE: We must check the assembler's hook list every time rather than using
46
+ * a module-level boolean guard, because deck.gl's getShaderAssembler() clears
47
+ * _hookFunctions when a new Deck instance is created (e.g. during image export).
48
+ */
49
+ function ensureRasterHooksRegistered() {
50
+ var assembler = _shadertools.ShaderAssembler.getDefaultShaderAssembler();
51
+ // @ts-expect-error _hookFunctions is private in ShaderAssembler
52
+ var existingHooks = assembler._hookFunctions || [];
53
+ var hookNames = existingHooks.map(function (h) {
54
+ return typeof h === 'string' ? h : h.hook;
55
+ });
56
+ if (!hookNames.some(function (h) {
57
+ return h === null || h === void 0 ? void 0 : h.includes('DECKGL_CREATE_COLOR');
58
+ })) {
59
+ assembler.addShaderHook('fs:DECKGL_CREATE_COLOR(inout vec4 image, vec2 coord)');
60
+ }
61
+ if (!hookNames.some(function (h) {
62
+ return h === null || h === void 0 ? void 0 : h.includes('DECKGL_MUTATE_COLOR');
63
+ })) {
64
+ assembler.addShaderHook('fs:DECKGL_MUTATE_COLOR(inout vec4 image, vec2 coord)');
65
+ }
66
+ }
67
+
68
+ /**
69
+ * Convert kepler.gl's custom raster shader modules into luma.gl 9 compatible
70
+ * format. Ensures fs2 (WebGL2) shaders are used and texture2D -> texture.
71
+ */
72
+
73
+ function prepareLumaModules(modules) {
74
+ return modules.map(function (mod) {
75
+ var fs = mod.fs2 || mod.fs || '';
76
+ // Replace texture2D with texture for GLSL 300 es
77
+ fs = fs.replace(/texture2D\(/g, 'texture(');
78
+ var nameMap = _rasterProcessingUniforms.UNIFORM_NAME_MAP[mod.name];
79
+ var consolidate = Boolean(nameMap && mod.uniformTypes);
80
+ if (mod.uniformTypes && !nameMap) {
81
+ console.warn("[raster] Module \"".concat(mod.name, "\" has uniformTypes but no UNIFORM_NAME_MAP entry. ") + 'Its UBO will not be consolidated and may push the fragment uniform block count over the WebGL2 limit.');
82
+ }
83
+ if (consolidate) {
84
+ // Strip only this module's uniform block declaration so it doesn't
85
+ // create its own UBO.
86
+ var blockPattern = new RegExp("uniform\\s+".concat(mod.name, "Uniforms\\s*\\{[^}]*\\}\\s*").concat(mod.name, "\\s*;"), 'gs');
87
+ fs = fs.replace(blockPattern, '');
88
+
89
+ // Rewrite moduleName.fieldName references to the shared UBO aliases
90
+ for (var _i = 0, _Object$entries = Object.entries(nameMap); _i < _Object$entries.length; _i++) {
91
+ var _Object$entries$_i = (0, _slicedToArray2["default"])(_Object$entries[_i], 2),
92
+ origField = _Object$entries$_i[0],
93
+ prefixedField = _Object$entries$_i[1];
94
+ var pattern = new RegExp("\\b".concat(mod.name, "\\.").concat(origField, "\\b"), 'g');
95
+ fs = fs.replace(pattern, "".concat(prefixedField, "_ALIAS"));
96
+ }
97
+ }
98
+ var result = {
99
+ name: mod.name,
100
+ fs: fs,
101
+ dependencies: mod.dependencies,
102
+ deprecations: mod.deprecations
103
+ };
104
+ if (mod.vs) {
105
+ result.vs = mod.vs.replace(/texture2D\(/g, 'texture(');
106
+ }
107
+ if (mod.defines) {
108
+ result.defines = mod.defines;
109
+ }
110
+ if (mod.getUniforms) {
111
+ result.getUniforms = mod.getUniforms;
112
+ }
113
+ if (mod.uniforms) {
114
+ result.uniforms = mod.uniforms;
115
+ }
116
+
117
+ // Only keep uniformTypes for modules NOT consolidated into the shared UBO
118
+ if (mod.uniformTypes && !consolidate) {
119
+ result.uniformTypes = mod.uniformTypes;
120
+ }
121
+
122
+ // Convert inject code, replacing texture2D -> texture and UBO references
123
+ if (mod.inject) {
124
+ result.inject = {};
125
+ for (var _i2 = 0, _Object$entries2 = Object.entries(mod.inject); _i2 < _Object$entries2.length; _i2++) {
126
+ var _Object$entries2$_i = (0, _slicedToArray2["default"])(_Object$entries2[_i2], 2),
127
+ hook = _Object$entries2$_i[0],
128
+ code = _Object$entries2$_i[1];
129
+ var codeStr = typeof code === 'string' ? code : code.injection || '';
130
+ codeStr = codeStr.replace(/texture2D\(/g, 'texture(');
131
+ if (consolidate && nameMap) {
132
+ for (var _i3 = 0, _Object$entries3 = Object.entries(nameMap); _i3 < _Object$entries3.length; _i3++) {
133
+ var _Object$entries3$_i = (0, _slicedToArray2["default"])(_Object$entries3[_i3], 2),
134
+ _origField = _Object$entries3$_i[0],
135
+ _prefixedField = _Object$entries3$_i[1];
136
+ var _pattern = new RegExp("\\b".concat(mod.name, "\\.").concat(_origField, "\\b"), 'g');
137
+ codeStr = codeStr.replace(_pattern, "".concat(_prefixedField, "_ALIAS"));
138
+ }
139
+ }
140
+ result.inject[hook] = codeStr;
141
+ }
142
+ }
143
+ return result;
144
+ });
145
+ }
146
+
147
+ /**
148
+ * Build the vertex shader for the raster layer.
149
+ * References raster.coordinateConversion from the UBO.
150
+ */
151
+ function buildRasterVertexShader() {
152
+ return "#version 300 es\n#define SHADER_NAME raster-layer-vertex-shader\n\nprecision mediump float;\n\nin vec2 texCoords;\nin vec3 positions;\nin vec3 positions64Low;\n\nout vec2 vTexCoord;\nout vec2 vTexPos;\n\nconst vec3 pickingColor = vec3(1.0, 0.0, 0.0);\n\nvoid main(void) {\n geometry.worldPosition = positions;\n geometry.uv = texCoords;\n geometry.pickingColor = pickingColor;\n\n gl_Position = project_position_to_clipspace(positions, positions64Low, vec3(0.0), geometry.position);\n DECKGL_FILTER_GL_POSITION(gl_Position, geometry);\n\n vTexCoord = texCoords;\n\n if (raster.coordinateConversion < -0.5) {\n vTexPos = geometry.position.xy + project.commonOrigin.xy;\n } else if (raster.coordinateConversion > 0.5) {\n vTexPos = geometry.worldPosition.xy;\n }\n\n vec4 color = vec4(0.0);\n DECKGL_FILTER_COLOR(color, geometry);\n}\n";
153
+ }
154
+
155
+ /**
156
+ * Build the fragment shader for the raster layer.
157
+ * Uses DECKGL_CREATE_COLOR and DECKGL_MUTATE_COLOR hooks which are now
158
+ * registered with the ShaderAssembler and populated by module injections.
159
+ */
160
+ function buildRasterFragmentShader() {
161
+ return "#version 300 es\n#define SHADER_NAME raster-layer-fragment-shader\n\nprecision mediump float;\nprecision mediump int;\nprecision mediump usampler2D;\n\nin vec2 vTexCoord;\nin vec2 vTexPos;\n\nout vec4 fragColor;\n\n/* projection utils */\nconst float TILE_SIZE = 512.0;\nconst float PI = 3.1415926536;\nconst float WORLD_SCALE = TILE_SIZE / PI / 2.0;\n\nvec2 lnglat_to_mercator(vec2 lnglat) {\n float x = lnglat.x;\n float y = clamp(lnglat.y, -89.9, 89.9);\n return vec2(\n radians(x) + PI,\n PI + log(tan(PI * 0.25 + radians(y) * 0.5))\n ) * WORLD_SCALE;\n}\n\nvec2 mercator_to_lnglat(vec2 xy) {\n xy /= WORLD_SCALE;\n return degrees(vec2(\n xy.x - PI,\n atan(exp(xy.y - PI)) * 2.0 - PI * 0.5\n ));\n}\n\nvec3 color_desaturate(vec3 color) {\n float luminance = (color.r + color.g + color.b) * 0.333333333;\n return mix(color, vec3(luminance), raster.desaturate);\n}\n\nvec3 color_tint(vec3 color) {\n return color * raster.tintColor;\n}\n\nvec4 apply_opacity(vec3 color, float alpha) {\n if (raster.transparentColor.a == 0.0) {\n return vec4(color, alpha);\n }\n float blendedAlpha = alpha + raster.transparentColor.a * (1.0 - alpha);\n float highLightRatio = alpha / blendedAlpha;\n vec3 blendedRGB = mix(raster.transparentColor.rgb, color, highLightRatio);\n return vec4(blendedRGB, blendedAlpha);\n}\n\nvec2 getUV(vec2 pos) {\n return vec2(\n (pos.x - raster.bounds[0]) / (raster.bounds[2] - raster.bounds[0]),\n (pos.y - raster.bounds[3]) / (raster.bounds[1] - raster.bounds[3])\n );\n}\n\nvoid main(void) {\n vec2 uv = vTexCoord;\n if (raster.coordinateConversion < -0.5) {\n vec2 lnglat = mercator_to_lnglat(vTexPos);\n uv = getUV(lnglat);\n } else if (raster.coordinateConversion > 0.5) {\n vec2 commonPos = lnglat_to_mercator(vTexPos);\n uv = getUV(commonPos);\n }\n\n vec4 image = vec4(0.0);\n DECKGL_CREATE_COLOR(image, uv);\n\n DECKGL_MUTATE_COLOR(image, uv);\n\n fragColor = apply_opacity(color_tint(color_desaturate(image.rgb)), raster.opacity);\n\n geometry.uv = uv;\n DECKGL_FILTER_COLOR(fragColor, geometry);\n}\n";
162
+ }
163
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc2hhZGVydG9vbHMiLCJyZXF1aXJlIiwiX3Jhc3RlclByb2Nlc3NpbmdVbmlmb3JtcyIsInJhc3RlclVuaWZvcm1CbG9jayIsInJhc3RlclVuaWZvcm1zIiwiZXhwb3J0cyIsIm5hbWUiLCJ2cyIsImZzIiwidW5pZm9ybVR5cGVzIiwiYm91bmRzIiwiY29vcmRpbmF0ZUNvbnZlcnNpb24iLCJkZXNhdHVyYXRlIiwib3BhY2l0eSIsInRpbnRDb2xvciIsInRyYW5zcGFyZW50Q29sb3IiLCJlbnN1cmVSYXN0ZXJIb29rc1JlZ2lzdGVyZWQiLCJhc3NlbWJsZXIiLCJTaGFkZXJBc3NlbWJsZXIiLCJnZXREZWZhdWx0U2hhZGVyQXNzZW1ibGVyIiwiZXhpc3RpbmdIb29rcyIsIl9ob29rRnVuY3Rpb25zIiwiaG9va05hbWVzIiwibWFwIiwiaCIsImhvb2siLCJzb21lIiwiaW5jbHVkZXMiLCJhZGRTaGFkZXJIb29rIiwicHJlcGFyZUx1bWFNb2R1bGVzIiwibW9kdWxlcyIsIm1vZCIsImZzMiIsInJlcGxhY2UiLCJuYW1lTWFwIiwiVU5JRk9STV9OQU1FX01BUCIsImNvbnNvbGlkYXRlIiwiQm9vbGVhbiIsImNvbnNvbGUiLCJ3YXJuIiwiY29uY2F0IiwiYmxvY2tQYXR0ZXJuIiwiUmVnRXhwIiwiX2kiLCJfT2JqZWN0JGVudHJpZXMiLCJPYmplY3QiLCJlbnRyaWVzIiwibGVuZ3RoIiwiX09iamVjdCRlbnRyaWVzJF9pIiwiX3NsaWNlZFRvQXJyYXkyIiwib3JpZ0ZpZWxkIiwicHJlZml4ZWRGaWVsZCIsInBhdHRlcm4iLCJyZXN1bHQiLCJkZXBlbmRlbmNpZXMiLCJkZXByZWNhdGlvbnMiLCJkZWZpbmVzIiwiZ2V0VW5pZm9ybXMiLCJ1bmlmb3JtcyIsImluamVjdCIsIl9pMiIsIl9PYmplY3QkZW50cmllczIiLCJfT2JqZWN0JGVudHJpZXMyJF9pIiwiY29kZSIsImNvZGVTdHIiLCJpbmplY3Rpb24iLCJfaTMiLCJfT2JqZWN0JGVudHJpZXMzIiwiX09iamVjdCRlbnRyaWVzMyRfaSIsImJ1aWxkUmFzdGVyVmVydGV4U2hhZGVyIiwiYnVpbGRSYXN0ZXJGcmFnbWVudFNoYWRlciJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yYXN0ZXIvcmFzdGVyLWxheWVyL3Jhc3Rlci1sYXllci1zaGFkZXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB7U2hhZGVyQXNzZW1ibGVyfSBmcm9tICdAbHVtYS5nbC9zaGFkZXJ0b29scyc7XG5pbXBvcnQgdHlwZSB7U2hhZGVyTW9kdWxlIGFzIEx1bWFTaGFkZXJNb2R1bGV9IGZyb20gJy4uL3dlYmdsL3R5cGVzJztcbmltcG9ydCB7VU5JRk9STV9OQU1FX01BUH0gZnJvbSAnLi4vcmFzdGVyLXByb2Nlc3NpbmctdW5pZm9ybXMnO1xuXG4vKipcbiAqIFVCTy1iYXNlZCBzaGFkZXIgbW9kdWxlIGZvciByYXN0ZXIgbGF5ZXIgdW5pZm9ybXMuXG4gKiBSZXBsYWNlcyB0aGUgb2xkIHN0YW5kYWxvbmUgYHVuaWZvcm0gZmxvYXQgZGVzYXR1cmF0ZWAgZXRjLlxuICovXG5jb25zdCByYXN0ZXJVbmlmb3JtQmxvY2sgPSBgXFxcbnVuaWZvcm0gcmFzdGVyVW5pZm9ybXMge1xuICB2ZWM0IGJvdW5kcztcbiAgZmxvYXQgY29vcmRpbmF0ZUNvbnZlcnNpb247XG4gIGZsb2F0IGRlc2F0dXJhdGU7XG4gIGZsb2F0IG9wYWNpdHk7XG4gIHZlYzMgdGludENvbG9yO1xuICB2ZWM0IHRyYW5zcGFyZW50Q29sb3I7XG59IHJhc3RlcjtcbmA7XG5cbmV4cG9ydCBjb25zdCByYXN0ZXJVbmlmb3JtcyA9IHtcbiAgbmFtZTogJ3Jhc3RlcicsXG4gIHZzOiByYXN0ZXJVbmlmb3JtQmxvY2ssXG4gIGZzOiByYXN0ZXJVbmlmb3JtQmxvY2ssXG4gIHVuaWZvcm1UeXBlczoge1xuICAgIGJvdW5kczogJ3ZlYzQ8ZjMyPicsXG4gICAgY29vcmRpbmF0ZUNvbnZlcnNpb246ICdmMzInLFxuICAgIGRlc2F0dXJhdGU6ICdmMzInLFxuICAgIG9wYWNpdHk6ICdmMzInLFxuICAgIHRpbnRDb2xvcjogJ3ZlYzM8ZjMyPicsXG4gICAgdHJhbnNwYXJlbnRDb2xvcjogJ3ZlYzQ8ZjMyPidcbiAgfVxufTtcblxuLyoqXG4gKiBSZWdpc3RlciBjdXN0b20gREVDS0dMX0NSRUFURV9DT0xPUiBhbmQgREVDS0dMX01VVEFURV9DT0xPUiBzaGFkZXIgaG9va3NcbiAqIHdpdGggdGhlIGRlZmF1bHQgU2hhZGVyQXNzZW1ibGVyLiBUaGVzZSBob29rcyBhcmUgdXNlZCBieSB0aGUgcmFzdGVyIGxheWVyJ3NcbiAqIGN1c3RvbSBzaGFkZXIgbW9kdWxlcyAocmdiYUltYWdlLCBjb21iaW5lQmFuZHMsIGNvbG9ybWFwLCBldGMuKS5cbiAqXG4gKiBJbiBsdW1hLmdsIDgueCB0aGVzZSB3ZXJlIHJlZ2lzdGVyZWQgdmlhIFByb2dyYW1NYW5hZ2VyOyBpbiBsdW1hLmdsIDkueFxuICogd2UgcmVnaXN0ZXIgdGhlbSB3aXRoIHRoZSBTaGFkZXJBc3NlbWJsZXIgc2luZ2xldG9uLlxuICpcbiAqIE5PVEU6IFdlIG11c3QgY2hlY2sgdGhlIGFzc2VtYmxlcidzIGhvb2sgbGlzdCBldmVyeSB0aW1lIHJhdGhlciB0aGFuIHVzaW5nXG4gKiBhIG1vZHVsZS1sZXZlbCBib29sZWFuIGd1YXJkLCBiZWNhdXNlIGRlY2suZ2wncyBnZXRTaGFkZXJBc3NlbWJsZXIoKSBjbGVhcnNcbiAqIF9ob29rRnVuY3Rpb25zIHdoZW4gYSBuZXcgRGVjayBpbnN0YW5jZSBpcyBjcmVhdGVkIChlLmcuIGR1cmluZyBpbWFnZSBleHBvcnQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlUmFzdGVySG9va3NSZWdpc3RlcmVkKCk6IHZvaWQge1xuICBjb25zdCBhc3NlbWJsZXIgPSBTaGFkZXJBc3NlbWJsZXIuZ2V0RGVmYXVsdFNoYWRlckFzc2VtYmxlcigpO1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIF9ob29rRnVuY3Rpb25zIGlzIHByaXZhdGUgaW4gU2hhZGVyQXNzZW1ibGVyXG4gIGNvbnN0IGV4aXN0aW5nSG9va3MgPSBhc3NlbWJsZXIuX2hvb2tGdW5jdGlvbnMgfHwgW107XG4gIGNvbnN0IGhvb2tOYW1lcyA9IGV4aXN0aW5nSG9va3MubWFwKGggPT4gKHR5cGVvZiBoID09PSAnc3RyaW5nJyA/IGggOiBoLmhvb2spKTtcblxuICBpZiAoIWhvb2tOYW1lcy5zb21lKGggPT4gaD8uaW5jbHVkZXMoJ0RFQ0tHTF9DUkVBVEVfQ09MT1InKSkpIHtcbiAgICBhc3NlbWJsZXIuYWRkU2hhZGVySG9vaygnZnM6REVDS0dMX0NSRUFURV9DT0xPUihpbm91dCB2ZWM0IGltYWdlLCB2ZWMyIGNvb3JkKScpO1xuICB9XG4gIGlmICghaG9va05hbWVzLnNvbWUoaCA9PiBoPy5pbmNsdWRlcygnREVDS0dMX01VVEFURV9DT0xPUicpKSkge1xuICAgIGFzc2VtYmxlci5hZGRTaGFkZXJIb29rKCdmczpERUNLR0xfTVVUQVRFX0NPTE9SKGlub3V0IHZlYzQgaW1hZ2UsIHZlYzIgY29vcmQpJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0IGtlcGxlci5nbCdzIGN1c3RvbSByYXN0ZXIgc2hhZGVyIG1vZHVsZXMgaW50byBsdW1hLmdsIDkgY29tcGF0aWJsZVxuICogZm9ybWF0LiBFbnN1cmVzIGZzMiAoV2ViR0wyKSBzaGFkZXJzIGFyZSB1c2VkIGFuZCB0ZXh0dXJlMkQgLT4gdGV4dHVyZS5cbiAqL1xuaW50ZXJmYWNlIEx1bWFNb2R1bGVPdXRwdXQge1xuICBuYW1lOiBzdHJpbmc7XG4gIGZzOiBzdHJpbmc7XG4gIHZzPzogc3RyaW5nO1xuICBkZWZpbmVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgZ2V0VW5pZm9ybXM/OiAob3B0czogb2JqZWN0KSA9PiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw7XG4gIHVuaWZvcm1zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHVuaWZvcm1UeXBlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGluamVjdD86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGRlcGVuZGVuY2llcz86IHVua25vd25bXTtcbiAgZGVwcmVjYXRpb25zPzogdW5rbm93bltdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUx1bWFNb2R1bGVzKG1vZHVsZXM6IEx1bWFTaGFkZXJNb2R1bGVbXSk6IEx1bWFNb2R1bGVPdXRwdXRbXSB7XG4gIHJldHVybiBtb2R1bGVzLm1hcChtb2QgPT4ge1xuICAgIGxldCBmcyA9IG1vZC5mczIgfHwgbW9kLmZzIHx8ICcnO1xuICAgIC8vIFJlcGxhY2UgdGV4dHVyZTJEIHdpdGggdGV4dHVyZSBmb3IgR0xTTCAzMDAgZXNcbiAgICBmcyA9IGZzLnJlcGxhY2UoL3RleHR1cmUyRFxcKC9nLCAndGV4dHVyZSgnKTtcblxuICAgIGNvbnN0IG5hbWVNYXAgPSBVTklGT1JNX05BTUVfTUFQW21vZC5uYW1lXTtcbiAgICBjb25zdCBjb25zb2xpZGF0ZSA9IEJvb2xlYW4obmFtZU1hcCAmJiBtb2QudW5pZm9ybVR5cGVzKTtcblxuICAgIGlmIChtb2QudW5pZm9ybVR5cGVzICYmICFuYW1lTWFwKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbcmFzdGVyXSBNb2R1bGUgXCIke21vZC5uYW1lfVwiIGhhcyB1bmlmb3JtVHlwZXMgYnV0IG5vIFVOSUZPUk1fTkFNRV9NQVAgZW50cnkuIGAgK1xuICAgICAgICAgICdJdHMgVUJPIHdpbGwgbm90IGJlIGNvbnNvbGlkYXRlZCBhbmQgbWF5IHB1c2ggdGhlIGZyYWdtZW50IHVuaWZvcm0gYmxvY2sgY291bnQgb3ZlciB0aGUgV2ViR0wyIGxpbWl0LidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnNvbGlkYXRlKSB7XG4gICAgICAvLyBTdHJpcCBvbmx5IHRoaXMgbW9kdWxlJ3MgdW5pZm9ybSBibG9jayBkZWNsYXJhdGlvbiBzbyBpdCBkb2Vzbid0XG4gICAgICAvLyBjcmVhdGUgaXRzIG93biBVQk8uXG4gICAgICBjb25zdCBibG9ja1BhdHRlcm4gPSBuZXcgUmVnRXhwKFxuICAgICAgICBgdW5pZm9ybVxcXFxzKyR7bW9kLm5hbWV9VW5pZm9ybXNcXFxccypcXFxce1tefV0qXFxcXH1cXFxccyoke21vZC5uYW1lfVxcXFxzKjtgLFxuICAgICAgICAnZ3MnXG4gICAgICApO1xuICAgICAgZnMgPSBmcy5yZXBsYWNlKGJsb2NrUGF0dGVybiwgJycpO1xuXG4gICAgICAvLyBSZXdyaXRlIG1vZHVsZU5hbWUuZmllbGROYW1lIHJlZmVyZW5jZXMgdG8gdGhlIHNoYXJlZCBVQk8gYWxpYXNlc1xuICAgICAgZm9yIChjb25zdCBbb3JpZ0ZpZWxkLCBwcmVmaXhlZEZpZWxkXSBvZiBPYmplY3QuZW50cmllcyhuYW1lTWFwKSkge1xuICAgICAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cChgXFxcXGIke21vZC5uYW1lfVxcXFwuJHtvcmlnRmllbGR9XFxcXGJgLCAnZycpO1xuICAgICAgICBmcyA9IGZzLnJlcGxhY2UocGF0dGVybiwgYCR7cHJlZml4ZWRGaWVsZH1fQUxJQVNgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQ6IEx1bWFNb2R1bGVPdXRwdXQgPSB7XG4gICAgICBuYW1lOiBtb2QubmFtZSxcbiAgICAgIGZzLFxuICAgICAgZGVwZW5kZW5jaWVzOiBtb2QuZGVwZW5kZW5jaWVzLFxuICAgICAgZGVwcmVjYXRpb25zOiBtb2QuZGVwcmVjYXRpb25zXG4gICAgfTtcblxuICAgIGlmIChtb2QudnMpIHtcbiAgICAgIHJlc3VsdC52cyA9IG1vZC52cy5yZXBsYWNlKC90ZXh0dXJlMkRcXCgvZywgJ3RleHR1cmUoJyk7XG4gICAgfVxuXG4gICAgaWYgKG1vZC5kZWZpbmVzKSB7XG4gICAgICByZXN1bHQuZGVmaW5lcyA9IG1vZC5kZWZpbmVzO1xuICAgIH1cblxuICAgIGlmIChtb2QuZ2V0VW5pZm9ybXMpIHtcbiAgICAgIHJlc3VsdC5nZXRVbmlmb3JtcyA9IG1vZC5nZXRVbmlmb3JtcztcbiAgICB9XG5cbiAgICBpZiAobW9kLnVuaWZvcm1zKSB7XG4gICAgICByZXN1bHQudW5pZm9ybXMgPSBtb2QudW5pZm9ybXM7XG4gICAgfVxuXG4gICAgLy8gT25seSBrZWVwIHVuaWZvcm1UeXBlcyBmb3IgbW9kdWxlcyBOT1QgY29uc29saWRhdGVkIGludG8gdGhlIHNoYXJlZCBVQk9cbiAgICBpZiAobW9kLnVuaWZvcm1UeXBlcyAmJiAhY29uc29saWRhdGUpIHtcbiAgICAgIHJlc3VsdC51bmlmb3JtVHlwZXMgPSBtb2QudW5pZm9ybVR5cGVzO1xuICAgIH1cblxuICAgIC8vIENvbnZlcnQgaW5qZWN0IGNvZGUsIHJlcGxhY2luZyB0ZXh0dXJlMkQgLT4gdGV4dHVyZSBhbmQgVUJPIHJlZmVyZW5jZXNcbiAgICBpZiAobW9kLmluamVjdCkge1xuICAgICAgcmVzdWx0LmluamVjdCA9IHt9O1xuICAgICAgZm9yIChjb25zdCBbaG9vaywgY29kZV0gb2YgT2JqZWN0LmVudHJpZXMobW9kLmluamVjdCkpIHtcbiAgICAgICAgbGV0IGNvZGVTdHIgPVxuICAgICAgICAgIHR5cGVvZiBjb2RlID09PSAnc3RyaW5nJyA/IGNvZGUgOiAoY29kZSBhcyB7aW5qZWN0aW9uPzogc3RyaW5nfSkuaW5qZWN0aW9uIHx8ICcnO1xuICAgICAgICBjb2RlU3RyID0gY29kZVN0ci5yZXBsYWNlKC90ZXh0dXJlMkRcXCgvZywgJ3RleHR1cmUoJyk7XG5cbiAgICAgICAgaWYgKGNvbnNvbGlkYXRlICYmIG5hbWVNYXApIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtvcmlnRmllbGQsIHByZWZpeGVkRmllbGRdIG9mIE9iamVjdC5lbnRyaWVzKG5hbWVNYXApKSB7XG4gICAgICAgICAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cChgXFxcXGIke21vZC5uYW1lfVxcXFwuJHtvcmlnRmllbGR9XFxcXGJgLCAnZycpO1xuICAgICAgICAgICAgY29kZVN0ciA9IGNvZGVTdHIucmVwbGFjZShwYXR0ZXJuLCBgJHtwcmVmaXhlZEZpZWxkfV9BTElBU2ApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdC5pbmplY3RbaG9va10gPSBjb2RlU3RyO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSB2ZXJ0ZXggc2hhZGVyIGZvciB0aGUgcmFzdGVyIGxheWVyLlxuICogUmVmZXJlbmNlcyByYXN0ZXIuY29vcmRpbmF0ZUNvbnZlcnNpb24gZnJvbSB0aGUgVUJPLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRSYXN0ZXJWZXJ0ZXhTaGFkZXIoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBcXFxuI3ZlcnNpb24gMzAwIGVzXG4jZGVmaW5lIFNIQURFUl9OQU1FIHJhc3Rlci1sYXllci12ZXJ0ZXgtc2hhZGVyXG5cbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXG5pbiB2ZWMyIHRleENvb3JkcztcbmluIHZlYzMgcG9zaXRpb25zO1xuaW4gdmVjMyBwb3NpdGlvbnM2NExvdztcblxub3V0IHZlYzIgdlRleENvb3JkO1xub3V0IHZlYzIgdlRleFBvcztcblxuY29uc3QgdmVjMyBwaWNraW5nQ29sb3IgPSB2ZWMzKDEuMCwgMC4wLCAwLjApO1xuXG52b2lkIG1haW4odm9pZCkge1xuICBnZW9tZXRyeS53b3JsZFBvc2l0aW9uID0gcG9zaXRpb25zO1xuICBnZW9tZXRyeS51diA9IHRleENvb3JkcztcbiAgZ2VvbWV0cnkucGlja2luZ0NvbG9yID0gcGlja2luZ0NvbG9yO1xuXG4gIGdsX1Bvc2l0aW9uID0gcHJvamVjdF9wb3NpdGlvbl90b19jbGlwc3BhY2UocG9zaXRpb25zLCBwb3NpdGlvbnM2NExvdywgdmVjMygwLjApLCBnZW9tZXRyeS5wb3NpdGlvbik7XG4gIERFQ0tHTF9GSUxURVJfR0xfUE9TSVRJT04oZ2xfUG9zaXRpb24sIGdlb21ldHJ5KTtcblxuICB2VGV4Q29vcmQgPSB0ZXhDb29yZHM7XG5cbiAgaWYgKHJhc3Rlci5jb29yZGluYXRlQ29udmVyc2lvbiA8IC0wLjUpIHtcbiAgICB2VGV4UG9zID0gZ2VvbWV0cnkucG9zaXRpb24ueHkgKyBwcm9qZWN0LmNvbW1vbk9yaWdpbi54eTtcbiAgfSBlbHNlIGlmIChyYXN0ZXIuY29vcmRpbmF0ZUNvbnZlcnNpb24gPiAwLjUpIHtcbiAgICB2VGV4UG9zID0gZ2VvbWV0cnkud29ybGRQb3NpdGlvbi54eTtcbiAgfVxuXG4gIHZlYzQgY29sb3IgPSB2ZWM0KDAuMCk7XG4gIERFQ0tHTF9GSUxURVJfQ09MT1IoY29sb3IsIGdlb21ldHJ5KTtcbn1cbmA7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGZyYWdtZW50IHNoYWRlciBmb3IgdGhlIHJhc3RlciBsYXllci5cbiAqIFVzZXMgREVDS0dMX0NSRUFURV9DT0xPUiBhbmQgREVDS0dMX01VVEFURV9DT0xPUiBob29rcyB3aGljaCBhcmUgbm93XG4gKiByZWdpc3RlcmVkIHdpdGggdGhlIFNoYWRlckFzc2VtYmxlciBhbmQgcG9wdWxhdGVkIGJ5IG1vZHVsZSBpbmplY3Rpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRSYXN0ZXJGcmFnbWVudFNoYWRlcigpOiBzdHJpbmcge1xuICByZXR1cm4gYFxcXG4jdmVyc2lvbiAzMDAgZXNcbiNkZWZpbmUgU0hBREVSX05BTUUgcmFzdGVyLWxheWVyLWZyYWdtZW50LXNoYWRlclxuXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbnByZWNpc2lvbiBtZWRpdW1wIGludDtcbnByZWNpc2lvbiBtZWRpdW1wIHVzYW1wbGVyMkQ7XG5cbmluIHZlYzIgdlRleENvb3JkO1xuaW4gdmVjMiB2VGV4UG9zO1xuXG5vdXQgdmVjNCBmcmFnQ29sb3I7XG5cbi8qIHByb2plY3Rpb24gdXRpbHMgKi9cbmNvbnN0IGZsb2F0IFRJTEVfU0laRSA9IDUxMi4wO1xuY29uc3QgZmxvYXQgUEkgPSAzLjE0MTU5MjY1MzY7XG5jb25zdCBmbG9hdCBXT1JMRF9TQ0FMRSA9IFRJTEVfU0laRSAvIFBJIC8gMi4wO1xuXG52ZWMyIGxuZ2xhdF90b19tZXJjYXRvcih2ZWMyIGxuZ2xhdCkge1xuICBmbG9hdCB4ID0gbG5nbGF0Lng7XG4gIGZsb2F0IHkgPSBjbGFtcChsbmdsYXQueSwgLTg5LjksIDg5LjkpO1xuICByZXR1cm4gdmVjMihcbiAgICByYWRpYW5zKHgpICsgUEksXG4gICAgUEkgKyBsb2codGFuKFBJICogMC4yNSArIHJhZGlhbnMoeSkgKiAwLjUpKVxuICApICogV09STERfU0NBTEU7XG59XG5cbnZlYzIgbWVyY2F0b3JfdG9fbG5nbGF0KHZlYzIgeHkpIHtcbiAgeHkgLz0gV09STERfU0NBTEU7XG4gIHJldHVybiBkZWdyZWVzKHZlYzIoXG4gICAgeHkueCAtIFBJLFxuICAgIGF0YW4oZXhwKHh5LnkgLSBQSSkpICogMi4wIC0gUEkgKiAwLjVcbiAgKSk7XG59XG5cbnZlYzMgY29sb3JfZGVzYXR1cmF0ZSh2ZWMzIGNvbG9yKSB7XG4gIGZsb2F0IGx1bWluYW5jZSA9IChjb2xvci5yICsgY29sb3IuZyArIGNvbG9yLmIpICogMC4zMzMzMzMzMzM7XG4gIHJldHVybiBtaXgoY29sb3IsIHZlYzMobHVtaW5hbmNlKSwgcmFzdGVyLmRlc2F0dXJhdGUpO1xufVxuXG52ZWMzIGNvbG9yX3RpbnQodmVjMyBjb2xvcikge1xuICByZXR1cm4gY29sb3IgKiByYXN0ZXIudGludENvbG9yO1xufVxuXG52ZWM0IGFwcGx5X29wYWNpdHkodmVjMyBjb2xvciwgZmxvYXQgYWxwaGEpIHtcbiAgaWYgKHJhc3Rlci50cmFuc3BhcmVudENvbG9yLmEgPT0gMC4wKSB7XG4gICAgcmV0dXJuIHZlYzQoY29sb3IsIGFscGhhKTtcbiAgfVxuICBmbG9hdCBibGVuZGVkQWxwaGEgPSBhbHBoYSArIHJhc3Rlci50cmFuc3BhcmVudENvbG9yLmEgKiAoMS4wIC0gYWxwaGEpO1xuICBmbG9hdCBoaWdoTGlnaHRSYXRpbyA9IGFscGhhIC8gYmxlbmRlZEFscGhhO1xuICB2ZWMzIGJsZW5kZWRSR0IgPSBtaXgocmFzdGVyLnRyYW5zcGFyZW50Q29sb3IucmdiLCBjb2xvciwgaGlnaExpZ2h0UmF0aW8pO1xuICByZXR1cm4gdmVjNChibGVuZGVkUkdCLCBibGVuZGVkQWxwaGEpO1xufVxuXG52ZWMyIGdldFVWKHZlYzIgcG9zKSB7XG4gIHJldHVybiB2ZWMyKFxuICAgIChwb3MueCAtIHJhc3Rlci5ib3VuZHNbMF0pIC8gKHJhc3Rlci5ib3VuZHNbMl0gLSByYXN0ZXIuYm91bmRzWzBdKSxcbiAgICAocG9zLnkgLSByYXN0ZXIuYm91bmRzWzNdKSAvIChyYXN0ZXIuYm91bmRzWzFdIC0gcmFzdGVyLmJvdW5kc1szXSlcbiAgKTtcbn1cblxudm9pZCBtYWluKHZvaWQpIHtcbiAgdmVjMiB1diA9IHZUZXhDb29yZDtcbiAgaWYgKHJhc3Rlci5jb29yZGluYXRlQ29udmVyc2lvbiA8IC0wLjUpIHtcbiAgICB2ZWMyIGxuZ2xhdCA9IG1lcmNhdG9yX3RvX2xuZ2xhdCh2VGV4UG9zKTtcbiAgICB1diA9IGdldFVWKGxuZ2xhdCk7XG4gIH0gZWxzZSBpZiAocmFzdGVyLmNvb3JkaW5hdGVDb252ZXJzaW9uID4gMC41KSB7XG4gICAgdmVjMiBjb21tb25Qb3MgPSBsbmdsYXRfdG9fbWVyY2F0b3IodlRleFBvcyk7XG4gICAgdXYgPSBnZXRVVihjb21tb25Qb3MpO1xuICB9XG5cbiAgdmVjNCBpbWFnZSA9IHZlYzQoMC4wKTtcbiAgREVDS0dMX0NSRUFURV9DT0xPUihpbWFnZSwgdXYpO1xuXG4gIERFQ0tHTF9NVVRBVEVfQ09MT1IoaW1hZ2UsIHV2KTtcblxuICBmcmFnQ29sb3IgPSBhcHBseV9vcGFjaXR5KGNvbG9yX3RpbnQoY29sb3JfZGVzYXR1cmF0ZShpbWFnZS5yZ2IpKSwgcmFzdGVyLm9wYWNpdHkpO1xuXG4gIGdlb21ldHJ5LnV2ID0gdXY7XG4gIERFQ0tHTF9GSUxU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
@@ -1,16 +1,16 @@
1
- import { UpdateParameters } from '@deck.gl/core/typed';
2
- import { BitmapLayer } from '@deck.gl/layers/typed';
1
+ import { UpdateParameters } from '@deck.gl/core';
2
+ import { BitmapLayer } from '@deck.gl/layers';
3
3
  import type { RasterLayerAddedProps, ImageState } from '../types';
4
4
  export default class RasterLayer extends BitmapLayer<RasterLayerAddedProps> {
5
5
  state: BitmapLayer<RasterLayerAddedProps>['state'] & {
6
6
  images: ImageState;
7
7
  };
8
+ _redrawScheduled: boolean;
8
9
  initializeState(): void;
9
- draw({ uniforms }: {
10
- uniforms: {
11
- [key: string]: any;
12
- };
10
+ draw(_opts: {
11
+ shaderModuleProps: Record<string, unknown>;
13
12
  }): void;
13
+ _scheduleRedraw(): void;
14
14
  getShaders(): any;
15
15
  updateState(params: UpdateParameters<BitmapLayer<RasterLayerAddedProps>>): void;
16
16
  updateImages({ props, oldProps }: {