@luxonis/visualizer-protobuf 2.18.0 → 2.19.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 (71) hide show
  1. package/dist/{deserialization.worker-DsG76nP8.js → deserialization.worker-BDgy77kA.js} +6 -202
  2. package/dist/{index-CJRhjhJ0.js → index-B1_cFt58.js} +4 -3
  3. package/dist/{index-CcP1Qppv.js → index-B6d3C39p.js} +4 -3
  4. package/dist/{index-BeQ1w8aW.js → index-BF-L7R8k.js} +4 -3
  5. package/dist/{index-4PQpGzhb.js → index-BRgjaS3P.js} +4 -3
  6. package/dist/{index-DdKOhCXT.js → index-BXzxh_oS.js} +4 -3
  7. package/dist/{index-BWittpbR.js → index-C6w97GVV.js} +4 -3
  8. package/dist/{index-DchGURxJ.js → index-CFKwgCnj.js} +4 -3
  9. package/dist/{index-DUUnuN10.js → index-CKOuXheK.js} +4 -3
  10. package/dist/{index-BomoqOv5.js → index-CKUSCjJy.js} +4 -3
  11. package/dist/{index-Ci0X5xT3.js → index-Cjg9XUXR.js} +4 -3
  12. package/dist/{index-BT9CBn7l.js → index-Cx171sUA.js} +4 -3
  13. package/dist/{index-CcIi7pJR.js → index-D9x4CxvS.js} +4 -3
  14. package/dist/{index-CXThSQcL.js → index-DBd5WrbC.js} +4 -3
  15. package/dist/{index-BQecGu9I.js → index-DXrTzXm5.js} +4 -3
  16. package/dist/{index-CXIVXFcJ.js → index-Dhhaoay-.js} +6 -5
  17. package/dist/{index-CrtBH66u.js → index-DvIT_wMb.js} +4 -3
  18. package/dist/{index-ByIsztCr.js → index-FQIyjNd9.js} +4 -3
  19. package/dist/{index-CR6XGTJc.js → index-YYxpyccB.js} +118 -45
  20. package/dist/{index-BFMXTxLw.js → index-qH54Wded.js} +4 -3
  21. package/dist/index.js +4 -3
  22. package/dist/lib/src/components/PanelToolbar.d.ts.map +1 -1
  23. package/dist/lib/src/components/PanelToolbar.js +2 -4
  24. package/dist/lib/src/components/PanelToolbar.js.map +1 -1
  25. package/dist/lib/src/connection/foxglove-connection.d.ts +8 -4
  26. package/dist/lib/src/connection/foxglove-connection.d.ts.map +1 -1
  27. package/dist/lib/src/connection/foxglove-connection.js +20 -6
  28. package/dist/lib/src/connection/foxglove-connection.js.map +1 -1
  29. package/dist/lib/src/messaging/deserialization/pointcloud/pointcloudFromDepth.worker.d.ts +2 -0
  30. package/dist/lib/src/messaging/deserialization/pointcloud/pointcloudFromDepth.worker.d.ts.map +1 -0
  31. package/dist/lib/src/messaging/deserialization/pointcloud/pointcloudFromDepth.worker.js +286 -0
  32. package/dist/lib/src/messaging/deserialization/pointcloud/pointcloudFromDepth.worker.js.map +1 -0
  33. package/dist/lib/src/messaging/deserialization/pointcloud/utils.d.ts +9 -2
  34. package/dist/lib/src/messaging/deserialization/pointcloud/utils.d.ts.map +1 -1
  35. package/dist/lib/src/messaging/deserialization/pointcloud/utils.js +12 -42
  36. package/dist/lib/src/messaging/deserialization/pointcloud/utils.js.map +1 -1
  37. package/dist/lib/src/messaging/deserialization/video/color.js +1 -1
  38. package/dist/lib/src/messaging/deserialization/video/color.js.map +1 -1
  39. package/dist/lib/src/messaging/deserialization/video/depth.d.ts +2 -2
  40. package/dist/lib/src/messaging/deserialization/video/depth.d.ts.map +1 -1
  41. package/dist/lib/src/messaging/deserialization/video/depth.js +2 -167
  42. package/dist/lib/src/messaging/deserialization/video/depth.js.map +1 -1
  43. package/dist/lib/src/messaging/deserialization/video/h264.d.ts.map +1 -1
  44. package/dist/lib/src/messaging/deserialization/video/h264.js.map +1 -1
  45. package/dist/lib/src/messaging/deserialization.worker.d.ts +15 -11
  46. package/dist/lib/src/messaging/deserialization.worker.d.ts.map +1 -1
  47. package/dist/lib/src/messaging/deserialization.worker.js +3 -2
  48. package/dist/lib/src/messaging/deserialization.worker.js.map +1 -1
  49. package/dist/lib/src/messaging/message-handler.d.ts.map +1 -1
  50. package/dist/lib/src/messaging/message-handler.js +2 -1
  51. package/dist/lib/src/messaging/message-handler.js.map +1 -1
  52. package/dist/lib/src/panels/ImagePanel.js +2 -2
  53. package/dist/lib/src/panels/ImagePanel.js.map +1 -1
  54. package/dist/lib/src/panels/PointCloudPanel.js +2 -2
  55. package/dist/lib/src/panels/PointCloudPanel.js.map +1 -1
  56. package/dist/lib/src/utils/metrics-manager.d.ts +9 -1
  57. package/dist/lib/src/utils/metrics-manager.d.ts.map +1 -1
  58. package/dist/lib/src/utils/metrics-manager.js +33 -2
  59. package/dist/lib/src/utils/metrics-manager.js.map +1 -1
  60. package/dist/lib/src/utils/poitcloud-sync.d.ts.map +1 -1
  61. package/dist/lib/src/utils/poitcloud-sync.js +18 -5
  62. package/dist/lib/src/utils/poitcloud-sync.js.map +1 -1
  63. package/dist/pointcloudFromDepth.worker-CNKyMUU-.js +326 -0
  64. package/dist/{tslib.es6-D98N6tjc.js → tslib.es6-C73eoP_E.js} +6 -36
  65. package/dist/{useMessageReducer-Cg30zaG9.js → useMessageReducer-jNx5e6JW.js} +1 -1
  66. package/dist/{i420ToRgbaToPoitcloud.worker-CzFC0VI1.js → utils-Cmsz3FxA.js} +37 -5
  67. package/package.json +1 -1
  68. package/dist/lib/src/protobuf.generated/IMUData.d.ts +0 -122
  69. package/dist/lib/src/protobuf.generated/IMUData.d.ts.map +0 -1
  70. package/dist/lib/src/protobuf.generated/IMUData.js +0 -691
  71. package/dist/lib/src/protobuf.generated/IMUData.js.map +0 -1
@@ -0,0 +1,326 @@
1
+ import { e as expose } from './comlink-DHMAu6X7.js';
2
+ import { i as i420ToRgbaToPointcloud } from './utils-Cmsz3FxA.js';
3
+
4
+ // This Source Code Form is subject to the terms of the Mozilla Public
5
+ // License, v2.0. If a copy of the MPL was not distributed with this
6
+ // file, You can obtain one at http://mozilla.org/MPL/2.0/
7
+ /// <reference types="@webgpu/types" />
8
+ function depthToPointCloudBuffer(uint16Array, width, height, fx, fy, cx, cy) {
9
+ const depthData = Array.from({
10
+ length: height
11
+ }, () => new Array(width));
12
+ for (let v = 0; v < height; v++) {
13
+ depthData[v] = depthData[v] ?? [];
14
+ for (let u = 0; u < width; u++) {
15
+ const d = uint16Array[v * width + u] ?? -1;
16
+ // biome-ignore lint/style/noNonNullAssertion: <explanation>
17
+ depthData[v][u] = d > 0 ? d : -1;
18
+ }
19
+ }
20
+ const points = [];
21
+ // Accumulate the x, y, z values for each pixel.
22
+ for (let v = 0; v < height; v++) {
23
+ const row = depthData[v];
24
+ if (!row) {
25
+ continue;
26
+ }
27
+ for (let u = 0; u < width; u++) {
28
+ const z = row[u] ?? 0;
29
+ const x = (cx - u) * z / fx;
30
+ const y = (cy - v) * z / fy;
31
+ points.push(x, y, z);
32
+ }
33
+ }
34
+ const pointCount = points.length / 3;
35
+ const buffer = new ArrayBuffer(pointCount * 16);
36
+ const view = new DataView(buffer);
37
+ for (let i = 0; i < pointCount; i++) {
38
+ const offset = i * 16;
39
+ view.setFloat32(offset, points[i * 3] ?? 0, true); //X
40
+ view.setFloat32(offset + 4, points[i * 3 + 1] ?? 0, true); //Y
41
+ view.setFloat32(offset + 8, points[i * 3 + 2] ?? 0, true); //Z
42
+ view.setUint8(offset + 12, 0); // R
43
+ view.setUint8(offset + 13, 0); // G
44
+ view.setUint8(offset + 14, 0); // B
45
+ view.setUint8(offset + 15, 255); // A
46
+ }
47
+ return new Uint8Array(buffer);
48
+ }
49
+ const shader = `
50
+ @group(0) @binding(1) var<storage, read> intrinsics: array<f32>;
51
+
52
+ struct PointOutput {
53
+ x: f32,
54
+ y: f32,
55
+ z: f32,
56
+ color: u32,
57
+ };
58
+
59
+ @group(0) @binding(0) var<storage, read> depthBuffer: array<u32>;
60
+ @group(0) @binding(2) var<storage, read_write> xyzColorBuffer: array<PointOutput>;
61
+ @group(0) @binding(3) var<storage, read> i420Buffer: array<u32>; // Correct type
62
+
63
+ @compute @workgroup_size(256, 1, 1)
64
+ fn main(@builtin(global_invocation_id) global_id: vec3<u32>) {
65
+ let i = global_id.x;
66
+
67
+ // Read dimensions
68
+ let depthWidth = intrinsics[5];
69
+ let depthHeight = intrinsics[6];
70
+ let numPixels = u32(depthWidth * depthHeight);
71
+
72
+ // Bounds check
73
+ if (i >= numPixels || depthWidth <= 0.0 || depthHeight <= 0.0 ) { return; }
74
+
75
+ // Read other intrinsics
76
+ let fx = intrinsics[0];
77
+ let fy = intrinsics[1];
78
+ let cx = intrinsics[2];
79
+ let cy = intrinsics[3];
80
+ let depthScale = intrinsics[4]; // Make sure this is correct (e.g., 0.001)
81
+ let i420Width = intrinsics[7];
82
+ let i420Height = intrinsics[8];
83
+
84
+ let u = f32(i % u32(depthWidth));
85
+ let v = f32(i / u32(depthWidth));
86
+
87
+ // --- Extract u16 depth from u32 buffer ---
88
+ let depthIndex32 = i / 2u;
89
+ // Add bounds check for safety, though numPixels check should cover it
90
+ if (depthIndex32 >= arrayLength(&depthBuffer)) { return; }
91
+ let packedDepthU32 = depthBuffer[depthIndex32];
92
+ var rawDepthU32 : u32;
93
+ if (i % 2u == 0u) {
94
+ rawDepthU32 = packedDepthU32 & 0xFFFFu; // Lower 16 bits
95
+ } else {
96
+ rawDepthU32 = (packedDepthU32 >> 16) & 0xFFFFu; // Upper 16 bits
97
+ }
98
+ // --- End depth extraction ---
99
+
100
+ // Default point output (black, opaque)
101
+ var outputPoint: PointOutput;
102
+ outputPoint.x = 0.0;
103
+ outputPoint.y = 0.0;
104
+ outputPoint.z = 0.0;
105
+ outputPoint.color = 0u | (0u << 8) | (0u << 16) | (255u << 24);
106
+
107
+ // Process only valid depth pixels and valid intrinsics
108
+ if (rawDepthU32 > 0u && fx != 0.0 && fy != 0.0 && depthScale > 0.0) {
109
+ let z = f32(rawDepthU32) * depthScale;
110
+ outputPoint.x = (cx- u) * z / fx;
111
+ outputPoint.y = (cy- v) * z / fy;
112
+ outputPoint.z = z;
113
+
114
+ // --- I420 Color Calculation with u8 extraction from u32 buffer ---
115
+ if (i420Width > 0.0 && i420Height > 0.0) {
116
+ let i420WidthU = u32(i420Width);
117
+ let i420HeightU = u32(i420Height);
118
+
119
+ let i420X = min(i420WidthU - 1u, u32( floor(u * (i420Width / depthWidth)) ));
120
+ let i420Y = min(i420HeightU - 1u, u32( floor(v * (i420Height / depthHeight)) ));
121
+
122
+ // Calculate original byte indices
123
+ let frameSize = i420WidthU * i420HeightU;
124
+ let uvWidth = (i420WidthU + 1u) / 2u;
125
+ let uvHeight = (i420HeightU + 1u) / 2u;
126
+ let uOffset = frameSize;
127
+ let vOffset = frameSize + uvWidth * uvHeight;
128
+
129
+ let yIndex = i420Y * i420WidthU + i420X;
130
+ let uvX = i420X / 2u;
131
+ let uvY = i420Y / 2u;
132
+ let uvIndex = uvY * uvWidth + uvX;
133
+ let uIndex = uOffset + uvIndex;
134
+ let vIndex = vOffset + uvIndex;
135
+
136
+ // --- Extract Y byte ---
137
+ let yIndex32 = yIndex / 4u;
138
+ let yOffsetIn32 = yIndex % 4u;
139
+ // Bounds check (use original byte length concept for check)
140
+ let bufferByteLength = arrayLength(&i420Buffer) * 4u; // Conceptual byte length
141
+ if (yIndex32 < arrayLength(&i420Buffer) && yIndex < bufferByteLength) { // Check index and conceptual byte index
142
+ let packedY = i420Buffer[yIndex32];
143
+ let y_byte = (packedY >> (yOffsetIn32 * 8u)) & 0xFFu;
144
+ let y_f = f32(y_byte);
145
+
146
+ // --- Extract U byte ---
147
+ let uIndex32 = uIndex / 4u;
148
+ let uOffsetIn32 = uIndex % 4u;
149
+ if (uIndex32 < arrayLength(&i420Buffer) && uIndex < bufferByteLength) { // Check index and conceptual byte index
150
+ let packedU = i420Buffer[uIndex32];
151
+ let u_byte = (packedU >> (uOffsetIn32 * 8u)) & 0xFFu;
152
+ let u_f = f32(u_byte) - 128.0;
153
+
154
+ // --- Extract V byte ---
155
+ let vIndex32 = vIndex / 4u;
156
+ let vOffsetIn32 = vIndex % 4u;
157
+ if (vIndex32 < arrayLength(&i420Buffer) && vIndex < bufferByteLength) { // Check index and conceptual byte index
158
+ let packedV = i420Buffer[vIndex32];
159
+ let v_byte = (packedV >> (vOffsetIn32 * 8u)) & 0xFFu;
160
+ let v_f = f32(v_byte) - 128.0;
161
+
162
+ // --- YUV to RGB ---
163
+ var r_f = y_f + 1.402 * v_f;
164
+ var g_f = y_f - 0.344136 * u_f - 0.714136 * v_f;
165
+ var b_f = y_f + 1.772 * u_f;
166
+
167
+ let r = u32(clamp(r_f, 0.0, 255.0));
168
+ let g = u32(clamp(g_f, 0.0, 255.0));
169
+ let b = u32(clamp(b_f, 0.0, 255.0));
170
+ let a = 255u;
171
+
172
+ outputPoint.color = (r & 0xFFu) | ((g & 0xFFu) << 8) | ((b & 0xFFu) << 16) | (a << 24);
173
+ } // End V valid
174
+ } // End U valid
175
+ } // End Y valid
176
+ } // End if i420 dimensions valid
177
+ } // End if rawDepth valid
178
+
179
+ xyzColorBuffer[i] = outputPoint;
180
+ }
181
+ `;
182
+ async function depthToPointcloudGPU(depthArray, depthWidth, depthHeight, fx, fy, cx, cy, i420Data, i420Width, i420Height) {
183
+ const depthScale = 1;
184
+ if (depthWidth <= 0 || depthHeight <= 0) {
185
+ throw new Error("Invalid depth dimensions!");
186
+ }
187
+
188
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
189
+ if (!navigator.gpu) {
190
+ const xyzData = depthToPointCloudBuffer(depthArray, depthWidth, depthHeight, fx, fy, cx, cy);
191
+ return i420ToRgbaToPointcloud(i420Data, i420Width, i420Height, depthWidth, depthHeight, xyzData);
192
+ }
193
+ const adapter = await navigator.gpu.requestAdapter();
194
+ if (!adapter) {
195
+ const xyzData = depthToPointCloudBuffer(depthArray, depthWidth, depthHeight, fx, fy, cx, cy);
196
+ return i420ToRgbaToPointcloud(i420Data, i420Width, i420Height, depthWidth, depthHeight, xyzData);
197
+ }
198
+ const device = await adapter.requestDevice();
199
+ const queue = device.queue;
200
+ const numPixels = depthWidth * depthHeight;
201
+ const outputBufferSize = numPixels * 16;
202
+ const depthBuffer = device.createBuffer({
203
+ size: depthArray.byteLength,
204
+ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
205
+ mappedAtCreation: true
206
+ });
207
+ new Uint16Array(depthBuffer.getMappedRange()).set(depthArray);
208
+ depthBuffer.unmap();
209
+ const intrinsicsData = new Float32Array([fx, fy, cx, cy, depthScale, depthWidth, depthHeight, i420Width, i420Height]);
210
+ const intrinsicsBufferSize = Math.max(intrinsicsData.byteLength, 40);
211
+ const intrinsicsBuffer = device.createBuffer({
212
+ size: intrinsicsBufferSize,
213
+ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST
214
+ });
215
+ queue.writeBuffer(intrinsicsBuffer, 0, intrinsicsData);
216
+ const i420BufferSize = i420Data.byteLength;
217
+ const i420GpuBuffer = device.createBuffer({
218
+ size: i420BufferSize,
219
+ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
220
+ mappedAtCreation: true
221
+ });
222
+ new Uint8Array(i420GpuBuffer.getMappedRange()).set(i420Data);
223
+ i420GpuBuffer.unmap();
224
+ const xyzColorBuffer = device.createBuffer({
225
+ size: outputBufferSize,
226
+ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC
227
+ });
228
+ const bindGroupLayout = device.createBindGroupLayout({
229
+ entries: [{
230
+ binding: 0,
231
+ visibility: GPUShaderStage.COMPUTE,
232
+ buffer: {
233
+ type: "read-only-storage"
234
+ }
235
+ }, {
236
+ binding: 1,
237
+ visibility: GPUShaderStage.COMPUTE,
238
+ buffer: {
239
+ type: "read-only-storage"
240
+ }
241
+ }, {
242
+ binding: 2,
243
+ visibility: GPUShaderStage.COMPUTE,
244
+ buffer: {
245
+ type: "storage"
246
+ }
247
+ }, {
248
+ binding: 3,
249
+ visibility: GPUShaderStage.COMPUTE,
250
+ buffer: {
251
+ type: "read-only-storage"
252
+ }
253
+ }]
254
+ });
255
+ const bindGroup = device.createBindGroup({
256
+ layout: bindGroupLayout,
257
+ entries: [{
258
+ binding: 0,
259
+ resource: {
260
+ buffer: depthBuffer
261
+ }
262
+ }, {
263
+ binding: 1,
264
+ resource: {
265
+ buffer: intrinsicsBuffer
266
+ }
267
+ }, {
268
+ binding: 2,
269
+ resource: {
270
+ buffer: xyzColorBuffer
271
+ }
272
+ }, {
273
+ binding: 3,
274
+ resource: {
275
+ buffer: i420GpuBuffer
276
+ }
277
+ }]
278
+ });
279
+ const shaderModule = device.createShaderModule({
280
+ code: shader
281
+ });
282
+ const pipeline = device.createComputePipeline({
283
+ layout: device.createPipelineLayout({
284
+ bindGroupLayouts: [bindGroupLayout]
285
+ }),
286
+ compute: {
287
+ module: shaderModule,
288
+ entryPoint: "main"
289
+ }
290
+ });
291
+ const commandEncoder = device.createCommandEncoder();
292
+ const passEncoder = commandEncoder.beginComputePass();
293
+ passEncoder.setPipeline(pipeline);
294
+ passEncoder.setBindGroup(0, bindGroup);
295
+ const workgroupSize = 256;
296
+ const numWorkgroups = Math.ceil(numPixels / workgroupSize);
297
+ passEncoder.dispatchWorkgroups(numWorkgroups);
298
+ passEncoder.end();
299
+ const readbackBuffer = device.createBuffer({
300
+ size: outputBufferSize,
301
+ usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
302
+ });
303
+ commandEncoder.copyBufferToBuffer(xyzColorBuffer, 0, readbackBuffer, 0, outputBufferSize);
304
+ queue.submit([commandEncoder.finish()]);
305
+ try {
306
+ await readbackBuffer.mapAsync(GPUMapMode.READ);
307
+ const mappedRange = readbackBuffer.getMappedRange();
308
+ const result = new Uint8Array(mappedRange.byteLength);
309
+ result.set(new Uint8Array(mappedRange));
310
+ readbackBuffer.unmap();
311
+ depthBuffer.destroy();
312
+ intrinsicsBuffer.destroy();
313
+ i420GpuBuffer.destroy();
314
+ xyzColorBuffer.destroy();
315
+ readbackBuffer.destroy();
316
+ return result;
317
+ } catch (error) {
318
+ console.error("Error mapping readback buffer:", error);
319
+ console.warn("GPU processing failed during readback. Falling back to CPU.");
320
+ const xyzData = depthToPointCloudBuffer(depthArray, depthWidth, depthHeight, fx, fy, cx, cy);
321
+ return i420ToRgbaToPointcloud(i420Data, i420Width, i420Height, depthWidth, depthHeight, xyzData);
322
+ }
323
+ }
324
+ expose({
325
+ depthToPointcloudGPU
326
+ });
@@ -1,9 +1,8 @@
1
- import { w as wrap } from './comlink-DHMAu6X7.js';
2
1
  import { useContext, useRef, useLayoutEffect, createContext, useReducer, useState, useCallback } from 'react';
3
2
  import { isParent, getLeaves, createRemoveUpdate, updateTree, getNodeAtPath } from 'react-mosaic-component';
4
3
  import { c as commonjsGlobal, g as getDefaultExportFromCjs } from './_commonjsHelpers-E-ZsRS8r.js';
5
4
  import { useTheme } from '@mui/material';
6
- import { k as isObjectLike, l as baseGetTag, S as Symbol$1, i as isArray, m as getNative, r as root, n as overArg, g as isPrototype, c as isArrayLike, p as arrayLikeKeys, M as MapCache, f as isArguments, t as toSource, q as Map$1, u as eq, U as Uint8Array$1, d as isBuffer, v as Stack, e as isTypedArray, h as isObject, w as isLength, j as isIndex, x as identity, y as baseFor, b as baseRest, a as isArrayLikeObject } from './isArrayLikeObject-Bytw9p-q.js';
5
+ import { k as isObjectLike, l as baseGetTag, S as Symbol$1, i as isArray, m as getNative, r as root, n as overArg, g as isPrototype, c as isArrayLike, p as arrayLikeKeys, M as MapCache, f as isArguments, t as toSource, q as Map$1, u as eq, U as Uint8Array, d as isBuffer, v as Stack, e as isTypedArray, h as isObject, w as isLength, j as isIndex, x as identity, y as baseFor, b as baseRest, a as isArrayLikeObject } from './isArrayLikeObject-Bytw9p-q.js';
7
6
 
8
7
  var dist = {};
9
8
 
@@ -619,35 +618,6 @@ function estimateObjectSize(obj) {
619
618
  return SMALL_INTEGER_SIZE;
620
619
  }
621
620
 
622
- // This Source Code Form is subject to the terms of the Mozilla Public
623
- // License, v2.0. If a copy of the MPL was not distributed with this
624
- // file, You can obtain one at http://mozilla.org/MPL/2.0/
625
- /// <reference types="@webgpu/types" />
626
- function uint8ArrayToUint16Array(uint8Array) {
627
- if (uint8Array.length % 2 !== 0) {
628
- throw new Error("Uint8Array length must be a multiple of 2 for conversion to Uint16Array");
629
- }
630
- const uint16Array = new Uint16Array(uint8Array.length / 2);
631
- for (let i = 0; i < uint16Array.length; i++) {
632
- const lowByte = uint8Array[i * 2];
633
- const highByte = uint8Array[i * 2 + 1];
634
-
635
- // eslint-disable-next-line @foxglove/strict-equality
636
- if (highByte === undefined || lowByte === undefined) {
637
- throw new Error("Invalid data in uint8Array");
638
- }
639
- uint16Array[i] = highByte << 8 | lowByte;
640
- }
641
- return uint16Array;
642
- }
643
- const worker = new Worker(new URL("i420ToRgbaToPoitcloud.worker-CzFC0VI1.js", import.meta.url), {
644
- type: "module"
645
- });
646
- const workerApi = wrap(worker);
647
- async function i420ToRgbaToPointcloudWorker(i420Data, i420Width, i420Height, depthWidth, depthHeight, data) {
648
- return await workerApi.i420ToRgbaToPointcloud(i420Data, i420Width, i420Height, depthWidth, depthHeight, data);
649
- }
650
-
651
621
  // This Source Code Form is subject to the terms of the Mozilla Public
652
622
  // License, v2.0. If a copy of the MPL was not distributed with this
653
623
  // file, You can obtain one at http://mozilla.org/MPL/2.0/
@@ -1363,7 +1333,7 @@ function getAllKeys(object) {
1363
1333
  }
1364
1334
 
1365
1335
  /* Built-in method references that are verified to be native. */
1366
- var DataView$1 = getNative(root, 'DataView');
1336
+ var DataView = getNative(root, 'DataView');
1367
1337
 
1368
1338
  /* Built-in method references that are verified to be native. */
1369
1339
  var Promise$1 = getNative(root, 'Promise');
@@ -1381,7 +1351,7 @@ var mapTag$1 = '[object Map]',
1381
1351
  var dataViewTag$1 = '[object DataView]';
1382
1352
 
1383
1353
  /** Used to detect maps, sets, and weakmaps. */
1384
- var dataViewCtorString = toSource(DataView$1),
1354
+ var dataViewCtorString = toSource(DataView),
1385
1355
  mapCtorString = toSource(Map$1),
1386
1356
  promiseCtorString = toSource(Promise$1),
1387
1357
  setCtorString = toSource(Set$1),
@@ -1397,7 +1367,7 @@ var dataViewCtorString = toSource(DataView$1),
1397
1367
  var getTag = baseGetTag;
1398
1368
 
1399
1369
  // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
1400
- if ((DataView$1 && getTag(new DataView$1(new ArrayBuffer(1))) != dataViewTag$1) ||
1370
+ if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag$1) ||
1401
1371
  (Map$1 && getTag(new Map$1) != mapTag$1) ||
1402
1372
  (Promise$1 && getTag(Promise$1.resolve()) != promiseTag) ||
1403
1373
  (Set$1 && getTag(new Set$1) != setTag$1) ||
@@ -1701,7 +1671,7 @@ function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
1701
1671
 
1702
1672
  case arrayBufferTag:
1703
1673
  if ((object.byteLength != other.byteLength) ||
1704
- !equalFunc(new Uint8Array$1(object), new Uint8Array$1(other))) {
1674
+ !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
1705
1675
  return false;
1706
1676
  }
1707
1677
  return true;
@@ -4113,4 +4083,4 @@ var tslib_es6$1 = /*#__PURE__*/Object.freeze({
4113
4083
  default: tslib_es6
4114
4084
  });
4115
4085
 
4116
- export { arrayPush as $, AppError as A, inlineTabPanelLayouts as B, getAllPanelIds as C, getConfigsForNestedPanelsInsideTab as D, reorderTabWithinTabPanel as E, moveTabBetweenTabPanels as F, isTabPanelConfig as G, DEFAULT_TAB_PANEL_CONFIG as H, addPanelToTab as I, createAddUpdates as J, filterMap as K, Logger$1 as L, uniq as M, useShallowMemo as N, CurrentLayoutContext as O, MessageOrderTracker as P, AppConfigurationContext as Q, __rest as R, __spreadArray as S, TAB_PANEL_TYPE as T, uint8ArrayToUint16Array as U, isSymbol as V, toString as W, keys as X, getSymbols as Y, stubArray as Z, __assign as _, baseEach as a, baseGetAllKeys as a0, getAllKeys as a1, arrayMap as a2, baseUniq as a3, useMustNotChange as a4, useCurrentLayoutActions as a5, useCurrentLayoutSelector as a6, usePanelMosaicId as a7, useSelectedPanels as a8, PANEL_TITLE_CONFIG_KEY as a9, noop as aa, useAppConfiguration as ab, useValueChangedDebugLog as ac, useJsonTreeTheme as ad, tslib_es6$1 as ae, baseFlatten as b, baseIteratee as c, dist as d, estimateObjectSize as e, baseDifference as f, getTag as g, baseKeys as h, i420ToRgbaToPointcloudWorker as i, baseIsEqual as j, castPath as k, baseGet as l, hasIn as m, shallowequal$1 as n, getPanelIdsInsideTabPanels as o, getPanelTypeFromId as p, removePanelFromTabPanel as q, reportError as r, sendNotification as s, toKey as t, useGuaranteedContext as u, getPanelIdForType as v, getPathFromNode as w, updateTabPanelLayout as x, getSaveConfigsPayloadForAddedPanel as y, replaceAndRemovePanels as z };
4086
+ export { getAllKeys as $, AppError as A, getAllPanelIds as B, getConfigsForNestedPanelsInsideTab as C, reorderTabWithinTabPanel as D, moveTabBetweenTabPanels as E, isTabPanelConfig as F, DEFAULT_TAB_PANEL_CONFIG as G, addPanelToTab as H, createAddUpdates as I, filterMap as J, uniq as K, Logger$1 as L, useShallowMemo as M, CurrentLayoutContext as N, MessageOrderTracker as O, AppConfigurationContext as P, __rest as Q, __spreadArray as R, isSymbol as S, TAB_PANEL_TYPE as T, toString as U, keys as V, getSymbols as W, stubArray as X, arrayPush as Y, baseGetAllKeys as Z, __assign as _, baseEach as a, arrayMap as a0, baseUniq as a1, useMustNotChange as a2, useCurrentLayoutActions as a3, useCurrentLayoutSelector as a4, usePanelMosaicId as a5, useSelectedPanels as a6, PANEL_TITLE_CONFIG_KEY as a7, noop as a8, useAppConfiguration as a9, useValueChangedDebugLog as aa, useJsonTreeTheme as ab, tslib_es6$1 as ac, baseFlatten as b, baseIteratee as c, dist as d, estimateObjectSize as e, baseDifference as f, getTag as g, baseKeys as h, baseIsEqual as i, castPath as j, baseGet as k, hasIn as l, shallowequal$1 as m, getPanelIdsInsideTabPanels as n, getPanelTypeFromId as o, removePanelFromTabPanel as p, getPanelIdForType as q, reportError as r, sendNotification as s, toKey as t, useGuaranteedContext as u, getPathFromNode as v, updateTabPanelLayout as w, getSaveConfigsPayloadForAddedPanel as x, replaceAndRemovePanels as y, inlineTabPanelLayouts as z };
@@ -1,4 +1,4 @@
1
- import { ae as tslib_es6, L as Logger } from './tslib.es6-D98N6tjc.js';
1
+ import { ac as tslib_es6, L as Logger } from './tslib.es6-C73eoP_E.js';
2
2
  import { a as getAugmentedNamespace } from './_commonjsHelpers-E-ZsRS8r.js';
3
3
  import 'react';
4
4
  import 'zustand';
@@ -1,8 +1,43 @@
1
- import { e as expose } from './comlink-DHMAu6X7.js';
1
+ import { w as wrap } from './comlink-DHMAu6X7.js';
2
2
 
3
3
  // This Source Code Form is subject to the terms of the Mozilla Public
4
4
  // License, v2.0. If a copy of the MPL was not distributed with this
5
5
  // file, You can obtain one at http://mozilla.org/MPL/2.0/
6
+ /// <reference types="@webgpu/types" />
7
+ function uint8ArrayToUint16Array(uint8Array) {
8
+ if (uint8Array.length % 2 !== 0) {
9
+ throw new Error("Uint8Array length must be a multiple of 2 for conversion to Uint16Array");
10
+ }
11
+ const uint16Array = new Uint16Array(uint8Array.length / 2);
12
+ for (let i = 0; i < uint16Array.length; i++) {
13
+ const lowByte = uint8Array[i * 2];
14
+ const highByte = uint8Array[i * 2 + 1];
15
+
16
+ // eslint-disable-next-line @foxglove/strict-equality
17
+ if (highByte === undefined || lowByte === undefined) {
18
+ throw new Error("Invalid data in uint8Array");
19
+ }
20
+ uint16Array[i] = highByte << 8 | lowByte;
21
+ }
22
+ return uint16Array;
23
+ }
24
+ const WORKER_COUNT = 4;
25
+ class depthToPointcloudWorkerPool {
26
+ lastUsedWorkerIndex = 0;
27
+ constructor() {
28
+ this.workerApis = new Array(WORKER_COUNT).fill(undefined).map(() => wrap(new Worker(new URL("pointcloudFromDepth.worker-CNKyMUU-.js", import.meta.url), {
29
+ type: "module"
30
+ })));
31
+ }
32
+ async depthToPointcloudGPU(depthArray, width, height, fx, fy, cx, cy, i420Data, i420Width, i420Height) {
33
+ // biome-ignore lint/style/noNonNullAssertion: This should work
34
+ const workerApi = this.workerApis[this.lastUsedWorkerIndex];
35
+ this.lastUsedWorkerIndex = (this.lastUsedWorkerIndex + 1) % WORKER_COUNT;
36
+ return await workerApi.depthToPointcloudGPU(depthArray, width, height, fx, fy, cx, cy, i420Data, i420Width, i420Height);
37
+ }
38
+ }
39
+
40
+ /* H264 (i420) to RGBA */
6
41
  function i420ToRgbaToPointcloud(i420Data, i420Width, i420Height, depthWidth, depthHeight, data) {
7
42
  const frameSize = i420Width * i420Height;
8
43
  const uOffset = frameSize;
@@ -42,7 +77,4 @@ function i420ToRgbaToPointcloud(i420Data, i420Width, i420Height, depthWidth, dep
42
77
  return new Uint8Array(buffer);
43
78
  }
44
79
 
45
- // Expose the function using Comlink
46
- expose({
47
- i420ToRgbaToPointcloud
48
- });
80
+ export { depthToPointcloudWorkerPool as d, i420ToRgbaToPointcloud as i, uint8ArrayToUint16Array as u };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@luxonis/visualizer-protobuf",
3
- "version": "2.18.0",
3
+ "version": "2.19.0",
4
4
  "type": "module",
5
5
  "description": "RobotHub Visualizer Library",
6
6
  "author": "Luxonis Corp",
@@ -1,122 +0,0 @@
1
- import _m0 from "protobufjs/minimal";
2
- import { Timestamp } from "./common";
3
- export declare const protobufPackage = "dai.proto.imu_data";
4
- export declare enum Accuracy {
5
- UNRELIABLE = 0,
6
- LOW = 1,
7
- MEDIUM = 2,
8
- HIGH = 3,
9
- UNRECOGNIZED = -1
10
- }
11
- export declare function accuracyFromJSON(object: any): Accuracy;
12
- export declare function accuracyToJSON(object: Accuracy): string;
13
- export interface IMUVec {
14
- x: number;
15
- y: number;
16
- z: number;
17
- }
18
- export interface IMUQuat {
19
- x: number;
20
- y: number;
21
- z: number;
22
- w: number;
23
- }
24
- export interface IMUReport {
25
- sequence: number;
26
- accuracy: Accuracy;
27
- ts: Timestamp | undefined;
28
- tsDevice: Timestamp | undefined;
29
- }
30
- export interface IMUReportVec {
31
- report: IMUReport | undefined;
32
- vec: IMUVec | undefined;
33
- }
34
- export interface IMUReportQuatWAcc {
35
- report: IMUReport | undefined;
36
- quat: IMUQuat | undefined;
37
- rotationVectorAccuracy: number;
38
- }
39
- export interface IMUPacket {
40
- accelerometer: IMUReportVec | undefined;
41
- gyroscope: IMUReportVec | undefined;
42
- magnetometer: IMUReportVec | undefined;
43
- rotationVector: IMUReportQuatWAcc | undefined;
44
- }
45
- export interface IMUData {
46
- packets: IMUPacket[];
47
- /** Sequence number */
48
- sequenceNum: number;
49
- /** Timestamp */
50
- ts: Timestamp | undefined;
51
- /** Timestamp from device */
52
- tsDevice: Timestamp | undefined;
53
- }
54
- export declare const IMUVec: {
55
- encode(message: IMUVec, writer?: _m0.Writer): _m0.Writer;
56
- decode(input: _m0.Reader | Uint8Array, length?: number): IMUVec;
57
- fromJSON(object: any): IMUVec;
58
- toJSON(message: IMUVec): unknown;
59
- create<I extends Exact<DeepPartial<IMUVec>, I>>(base?: I): IMUVec;
60
- fromPartial<I extends Exact<DeepPartial<IMUVec>, I>>(object: I): IMUVec;
61
- };
62
- export declare const IMUQuat: {
63
- encode(message: IMUQuat, writer?: _m0.Writer): _m0.Writer;
64
- decode(input: _m0.Reader | Uint8Array, length?: number): IMUQuat;
65
- fromJSON(object: any): IMUQuat;
66
- toJSON(message: IMUQuat): unknown;
67
- create<I extends Exact<DeepPartial<IMUQuat>, I>>(base?: I): IMUQuat;
68
- fromPartial<I extends Exact<DeepPartial<IMUQuat>, I>>(object: I): IMUQuat;
69
- };
70
- export declare const IMUReport: {
71
- encode(message: IMUReport, writer?: _m0.Writer): _m0.Writer;
72
- decode(input: _m0.Reader | Uint8Array, length?: number): IMUReport;
73
- fromJSON(object: any): IMUReport;
74
- toJSON(message: IMUReport): unknown;
75
- create<I extends Exact<DeepPartial<IMUReport>, I>>(base?: I): IMUReport;
76
- fromPartial<I extends Exact<DeepPartial<IMUReport>, I>>(object: I): IMUReport;
77
- };
78
- export declare const IMUReportVec: {
79
- encode(message: IMUReportVec, writer?: _m0.Writer): _m0.Writer;
80
- decode(input: _m0.Reader | Uint8Array, length?: number): IMUReportVec;
81
- fromJSON(object: any): IMUReportVec;
82
- toJSON(message: IMUReportVec): unknown;
83
- create<I extends Exact<DeepPartial<IMUReportVec>, I>>(base?: I): IMUReportVec;
84
- fromPartial<I extends Exact<DeepPartial<IMUReportVec>, I>>(object: I): IMUReportVec;
85
- };
86
- export declare const IMUReportQuatWAcc: {
87
- encode(message: IMUReportQuatWAcc, writer?: _m0.Writer): _m0.Writer;
88
- decode(input: _m0.Reader | Uint8Array, length?: number): IMUReportQuatWAcc;
89
- fromJSON(object: any): IMUReportQuatWAcc;
90
- toJSON(message: IMUReportQuatWAcc): unknown;
91
- create<I extends Exact<DeepPartial<IMUReportQuatWAcc>, I>>(base?: I): IMUReportQuatWAcc;
92
- fromPartial<I extends Exact<DeepPartial<IMUReportQuatWAcc>, I>>(object: I): IMUReportQuatWAcc;
93
- };
94
- export declare const IMUPacket: {
95
- encode(message: IMUPacket, writer?: _m0.Writer): _m0.Writer;
96
- decode(input: _m0.Reader | Uint8Array, length?: number): IMUPacket;
97
- fromJSON(object: any): IMUPacket;
98
- toJSON(message: IMUPacket): unknown;
99
- create<I extends Exact<DeepPartial<IMUPacket>, I>>(base?: I): IMUPacket;
100
- fromPartial<I extends Exact<DeepPartial<IMUPacket>, I>>(object: I): IMUPacket;
101
- };
102
- export declare const IMUData: {
103
- encode(message: IMUData, writer?: _m0.Writer): _m0.Writer;
104
- decode(input: _m0.Reader | Uint8Array, length?: number): IMUData;
105
- fromJSON(object: any): IMUData;
106
- toJSON(message: IMUData): unknown;
107
- create<I extends Exact<DeepPartial<IMUData>, I>>(base?: I): IMUData;
108
- fromPartial<I extends Exact<DeepPartial<IMUData>, I>>(object: I): IMUData;
109
- };
110
- type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined;
111
- export type DeepPartial<T> = T extends Builtin ? T : T extends globalThis.Array<infer U> ? globalThis.Array<DeepPartial<U>> : T extends ReadonlyArray<infer U> ? ReadonlyArray<DeepPartial<U>> : T extends {} ? {
112
- [K in keyof T]?: DeepPartial<T[K]>;
113
- } : Partial<T>;
114
- type KeysOfUnion<T> = T extends T ? keyof T : never;
115
- export type Exact<P, I extends P> = P extends Builtin ? P : P & {
116
- [K in keyof P]: Exact<P[K], I[K]>;
117
- } & {
118
- [K in Exclude<keyof I, KeysOfUnion<P>>]: never;
119
- };
120
- export declare const protobufName = "IMUData";
121
- export {};
122
- //# sourceMappingURL=IMUData.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"IMUData.d.ts","sourceRoot":"","sources":["../../../../src/protobuf.generated/IMUData.ts"],"names":[],"mappings":"AAQA,OAAO,GAAG,MAAM,oBAAoB,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,eAAO,MAAM,eAAe,uBAAuB,CAAC;AAEpD,oBAAY,QAAQ;IAClB,UAAU,IAAI;IACd,GAAG,IAAI;IACP,MAAM,IAAI;IACV,IAAI,IAAI;IACR,YAAY,KAAK;CAClB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,GAAG,GAAG,QAAQ,CAmBtD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,CAcvD;AAED,MAAM,WAAW,MAAM;IACrB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,OAAO;IACtB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,EAAE,EAAE,SAAS,GAAG,SAAS,CAAC;IAC1B,QAAQ,EAAE,SAAS,GAAG,SAAS,CAAC;CACjC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,SAAS;IACxB,aAAa,EAAE,YAAY,GAAG,SAAS,CAAC;IACxC,SAAS,EAAE,YAAY,GAAG,SAAS,CAAC;IACpC,YAAY,EAAE,YAAY,GAAG,SAAS,CAAC;IACvC,cAAc,EAAE,iBAAiB,GAAG,SAAS,CAAC;CAC/C;AAED,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,sBAAsB;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB;IAChB,EAAE,EACE,SAAS,GACT,SAAS,CAAC;IACd,4BAA4B;IAC5B,QAAQ,EAAE,SAAS,GAAG,SAAS,CAAC;CACjC;AAMD,eAAO,MAAM,MAAM;oBACD,MAAM,WAAU,GAAG,CAAC,MAAM,GAAyB,GAAG,CAAC,MAAM;kBAa/D,GAAG,CAAC,MAAM,GAAG,UAAU,WAAW,MAAM,GAAG,MAAM;qBAqC9C,GAAG,GAAG,MAAM;oBAQb,MAAM,GAAG,OAAO;WAczB,CAAC,SAAS,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,MAAM;gBAGrD,CAAC,SAAS,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,MAAM;CAOxE,CAAC;AAMF,eAAO,MAAM,OAAO;oBACF,OAAO,WAAU,GAAG,CAAC,MAAM,GAAyB,GAAG,CAAC,MAAM;kBAgBhE,GAAG,CAAC,MAAM,GAAG,UAAU,WAAW,MAAM,GAAG,OAAO;qBA4C/C,GAAG,GAAG,OAAO;oBASd,OAAO,GAAG,OAAO;WAiB1B,CAAC,SAAS,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,OAAO;gBAGvD,CAAC,SAAS,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,OAAO;CAQ1E,CAAC;AAMF,eAAO,MAAM,SAAS;oBACJ,SAAS,WAAU,GAAG,CAAC,MAAM,GAAyB,GAAG,CAAC,MAAM;kBAgBlE,GAAG,CAAC,MAAM,GAAG,UAAU,WAAW,MAAM,GAAG,SAAS;qBA4CjD,GAAG,GAAG,SAAS;oBAShB,SAAS,GAAG,OAAO;WAiB5B,CAAC,SAAS,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,SAAS;gBAG3D,CAAC,SAAS,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,SAAS;CAU9E,CAAC;AAMF,eAAO,MAAM,YAAY;oBACP,YAAY,WAAU,GAAG,CAAC,MAAM,GAAyB,GAAG,CAAC,MAAM;kBAUrE,GAAG,CAAC,MAAM,GAAG,UAAU,WAAW,MAAM,GAAG,YAAY;qBA8BpD,GAAG,GAAG,YAAY;oBAOnB,YAAY,GAAG,OAAO;WAW/B,CAAC,SAAS,KAAK,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,YAAY;gBAGjE,CAAC,SAAS,KAAK,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,YAAY;CAQpF,CAAC;AAMF,eAAO,MAAM,iBAAiB;oBACZ,iBAAiB,WAAU,GAAG,CAAC,MAAM,GAAyB,GAAG,CAAC,MAAM;kBAa1E,GAAG,CAAC,MAAM,GAAG,UAAU,WAAW,MAAM,GAAG,iBAAiB;qBAqCzD,GAAG,GAAG,iBAAiB;oBAUxB,iBAAiB,GAAG,OAAO;WAcpC,CAAC,SAAS,KAAK,CAAC,WAAW,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,iBAAiB;gBAG3E,CAAC,SAAS,KAAK,CAAC,WAAW,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,iBAAiB;CAS9F,CAAC;AAMF,eAAO,MAAM,SAAS;oBACJ,SAAS,WAAU,GAAG,CAAC,MAAM,GAAyB,GAAG,CAAC,MAAM;kBAgBlE,GAAG,CAAC,MAAM,GAAG,UAAU,WAAW,MAAM,GAAG,SAAS;qBA4CjD,GAAG,GAAG,SAAS;oBAShB,SAAS,GAAG,OAAO;WAiB5B,CAAC,SAAS,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,SAAS;gBAG3D,CAAC,SAAS,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,SAAS;CAgB9E,CAAC;AAMF,eAAO,MAAM,OAAO;oBACF,OAAO,WAAU,GAAG,CAAC,MAAM,GAAyB,GAAG,CAAC,MAAM;kBAgBhE,GAAG,CAAC,MAAM,GAAG,UAAU,WAAW,MAAM,GAAG,OAAO;qBA4C/C,GAAG,GAAG,OAAO;oBASd,OAAO,GAAG,OAAO;WAiB1B,CAAC,SAAS,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,OAAO;gBAGvD,CAAC,SAAS,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,OAAO;CAU1E,CAAC;AAEF,KAAK,OAAO,GAAG,IAAI,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;AAEpF,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,OAAO,GAAG,CAAC,GAC9C,CAAC,SAAS,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GACtE,CAAC,SAAS,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAChE,CAAC,SAAS,EAAE,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GACrD,OAAO,CAAC,CAAC,CAAC,CAAC;AAEf,KAAK,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,GAAG,KAAK,CAAC;AACpD,MAAM,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,OAAO,GAAG,CAAC,GACrD,CAAC,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG;KAAG,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK;CAAE,CAAC;AAoBnG,eAAO,MAAM,YAAY,YAAY,CAAC"}