@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.
- package/dist/{deserialization.worker-DsG76nP8.js → deserialization.worker-BDgy77kA.js} +6 -202
- package/dist/{index-CJRhjhJ0.js → index-B1_cFt58.js} +4 -3
- package/dist/{index-CcP1Qppv.js → index-B6d3C39p.js} +4 -3
- package/dist/{index-BeQ1w8aW.js → index-BF-L7R8k.js} +4 -3
- package/dist/{index-4PQpGzhb.js → index-BRgjaS3P.js} +4 -3
- package/dist/{index-DdKOhCXT.js → index-BXzxh_oS.js} +4 -3
- package/dist/{index-BWittpbR.js → index-C6w97GVV.js} +4 -3
- package/dist/{index-DchGURxJ.js → index-CFKwgCnj.js} +4 -3
- package/dist/{index-DUUnuN10.js → index-CKOuXheK.js} +4 -3
- package/dist/{index-BomoqOv5.js → index-CKUSCjJy.js} +4 -3
- package/dist/{index-Ci0X5xT3.js → index-Cjg9XUXR.js} +4 -3
- package/dist/{index-BT9CBn7l.js → index-Cx171sUA.js} +4 -3
- package/dist/{index-CcIi7pJR.js → index-D9x4CxvS.js} +4 -3
- package/dist/{index-CXThSQcL.js → index-DBd5WrbC.js} +4 -3
- package/dist/{index-BQecGu9I.js → index-DXrTzXm5.js} +4 -3
- package/dist/{index-CXIVXFcJ.js → index-Dhhaoay-.js} +6 -5
- package/dist/{index-CrtBH66u.js → index-DvIT_wMb.js} +4 -3
- package/dist/{index-ByIsztCr.js → index-FQIyjNd9.js} +4 -3
- package/dist/{index-CR6XGTJc.js → index-YYxpyccB.js} +118 -45
- package/dist/{index-BFMXTxLw.js → index-qH54Wded.js} +4 -3
- package/dist/index.js +4 -3
- package/dist/lib/src/components/PanelToolbar.d.ts.map +1 -1
- package/dist/lib/src/components/PanelToolbar.js +2 -4
- package/dist/lib/src/components/PanelToolbar.js.map +1 -1
- package/dist/lib/src/connection/foxglove-connection.d.ts +8 -4
- package/dist/lib/src/connection/foxglove-connection.d.ts.map +1 -1
- package/dist/lib/src/connection/foxglove-connection.js +20 -6
- package/dist/lib/src/connection/foxglove-connection.js.map +1 -1
- package/dist/lib/src/messaging/deserialization/pointcloud/pointcloudFromDepth.worker.d.ts +2 -0
- package/dist/lib/src/messaging/deserialization/pointcloud/pointcloudFromDepth.worker.d.ts.map +1 -0
- package/dist/lib/src/messaging/deserialization/pointcloud/pointcloudFromDepth.worker.js +286 -0
- package/dist/lib/src/messaging/deserialization/pointcloud/pointcloudFromDepth.worker.js.map +1 -0
- package/dist/lib/src/messaging/deserialization/pointcloud/utils.d.ts +9 -2
- package/dist/lib/src/messaging/deserialization/pointcloud/utils.d.ts.map +1 -1
- package/dist/lib/src/messaging/deserialization/pointcloud/utils.js +12 -42
- package/dist/lib/src/messaging/deserialization/pointcloud/utils.js.map +1 -1
- package/dist/lib/src/messaging/deserialization/video/color.js +1 -1
- package/dist/lib/src/messaging/deserialization/video/color.js.map +1 -1
- package/dist/lib/src/messaging/deserialization/video/depth.d.ts +2 -2
- package/dist/lib/src/messaging/deserialization/video/depth.d.ts.map +1 -1
- package/dist/lib/src/messaging/deserialization/video/depth.js +2 -167
- package/dist/lib/src/messaging/deserialization/video/depth.js.map +1 -1
- package/dist/lib/src/messaging/deserialization/video/h264.d.ts.map +1 -1
- package/dist/lib/src/messaging/deserialization/video/h264.js.map +1 -1
- package/dist/lib/src/messaging/deserialization.worker.d.ts +15 -11
- package/dist/lib/src/messaging/deserialization.worker.d.ts.map +1 -1
- package/dist/lib/src/messaging/deserialization.worker.js +3 -2
- package/dist/lib/src/messaging/deserialization.worker.js.map +1 -1
- package/dist/lib/src/messaging/message-handler.d.ts.map +1 -1
- package/dist/lib/src/messaging/message-handler.js +2 -1
- package/dist/lib/src/messaging/message-handler.js.map +1 -1
- package/dist/lib/src/panels/ImagePanel.js +2 -2
- package/dist/lib/src/panels/ImagePanel.js.map +1 -1
- package/dist/lib/src/panels/PointCloudPanel.js +2 -2
- package/dist/lib/src/panels/PointCloudPanel.js.map +1 -1
- package/dist/lib/src/utils/metrics-manager.d.ts +9 -1
- package/dist/lib/src/utils/metrics-manager.d.ts.map +1 -1
- package/dist/lib/src/utils/metrics-manager.js +33 -2
- package/dist/lib/src/utils/metrics-manager.js.map +1 -1
- package/dist/lib/src/utils/poitcloud-sync.d.ts.map +1 -1
- package/dist/lib/src/utils/poitcloud-sync.js +18 -5
- package/dist/lib/src/utils/poitcloud-sync.js.map +1 -1
- package/dist/pointcloudFromDepth.worker-CNKyMUU-.js +326 -0
- package/dist/{tslib.es6-D98N6tjc.js → tslib.es6-C73eoP_E.js} +6 -36
- package/dist/{useMessageReducer-Cg30zaG9.js → useMessageReducer-jNx5e6JW.js} +1 -1
- package/dist/{i420ToRgbaToPoitcloud.worker-CzFC0VI1.js → utils-Cmsz3FxA.js} +37 -5
- package/package.json +1 -1
- package/dist/lib/src/protobuf.generated/IMUData.d.ts +0 -122
- package/dist/lib/src/protobuf.generated/IMUData.d.ts.map +0 -1
- package/dist/lib/src/protobuf.generated/IMUData.js +0 -691
- 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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 {
|
|
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,8 +1,43 @@
|
|
|
1
|
-
import {
|
|
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
|
-
|
|
46
|
-
expose({
|
|
47
|
-
i420ToRgbaToPointcloud
|
|
48
|
-
});
|
|
80
|
+
export { depthToPointcloudWorkerPool as d, i420ToRgbaToPointcloud as i, uint8ArrayToUint16Array as u };
|
package/package.json
CHANGED
|
@@ -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"}
|