@code3d/core 0.0.1-alpha.0 → 0.0.1-alpha.3
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/README.md +223 -786
- package/THIRD_PARTY.md +40 -0
- package/bld/THIRD_PARTY_NOTICES.txt +182 -0
- package/bld/chunks/chunk-BF55AIEQ.js +31 -0
- package/bld/chunks/chunk-BF55AIEQ.js.map +7 -0
- package/bld/chunks/chunk-P5VGKAEM.js +30 -0
- package/bld/chunks/chunk-P5VGKAEM.js.map +7 -0
- package/bld/chunks/chunk-RPY2WVCB.js +24834 -0
- package/bld/chunks/chunk-RPY2WVCB.js.map +7 -0
- package/bld/chunks/chunk-TJIN6S4R.js +1 -0
- package/bld/chunks/chunk-TJIN6S4R.js.map +7 -0
- package/bld/chunks/chunk-U5G2VU2I.js +19 -0
- package/bld/chunks/chunk-U5G2VU2I.js.map +7 -0
- package/bld/library/cached.d.ts +33 -0
- package/bld/library/cached.d.ts.map +1 -0
- package/bld/library/font.d.ts +39 -0
- package/bld/library/font.d.ts.map +1 -0
- package/bld/library/google-font.d.ts +14 -0
- package/bld/library/google-font.d.ts.map +1 -0
- package/bld/library/index.d.ts +8 -2
- package/bld/library/index.d.ts.map +1 -1
- package/bld/library/index.js +60 -3
- package/bld/library/index.js.map +7 -1
- package/bld/library/kernel-artifact-codec.d.ts.map +1 -1
- package/bld/library/kernel-cache.d.ts +24 -6
- package/bld/library/kernel-cache.d.ts.map +1 -1
- package/bld/library/material.d.ts +1 -1
- package/bld/library/material.d.ts.map +1 -1
- package/bld/library/open-cascade.d.ts +4 -0
- package/bld/library/open-cascade.d.ts.map +1 -0
- package/bld/library/replicad.d.ts +3 -2
- package/bld/library/replicad.d.ts.map +1 -1
- package/bld/library/replicad.js +10 -24
- package/bld/library/replicad.js.map +7 -1
- package/bld/library/retained-memory.d.ts.map +1 -1
- package/bld/library/runtime.d.ts +146 -80
- package/bld/library/runtime.d.ts.map +1 -1
- package/bld/library/sketch-solver.d.ts +1 -1
- package/bld/library/sketch-solver.d.ts.map +1 -1
- package/bld/library/sketch.d.ts +9 -1
- package/bld/library/sketch.d.ts.map +1 -1
- package/bld/library/text.d.ts +53 -0
- package/bld/library/text.d.ts.map +1 -0
- package/bld/library/three.js +3 -3
- package/bld/library/three.js.map +7 -1
- package/bld/library/topology.d.ts.map +1 -1
- package/bld/node/index.d.ts.map +1 -1
- package/bld/node/index.js +62 -14
- package/bld/node/index.js.map +7 -1
- package/bld/node/replicad.js +13 -3
- package/bld/node/replicad.js.map +7 -1
- package/bld/tooling/index.d.ts +17 -15
- package/bld/tooling/index.d.ts.map +1 -1
- package/bld/tooling/index.js +147 -19
- package/bld/tooling/index.js.map +7 -1
- package/package.json +18 -6
- package/src/library/cached.ts +132 -0
- package/src/library/font.ts +186 -0
- package/src/library/google-font.ts +97 -0
- package/src/library/index.ts +8 -3
- package/src/library/kernel-artifact-codec.ts +129 -20
- package/src/library/kernel-cache.ts +128 -34
- package/src/library/loft.ts +4 -0
- package/src/library/material.ts +3 -4
- package/src/library/open-cascade.ts +13 -0
- package/src/library/replicad.ts +5 -5
- package/src/library/retained-memory.ts +6 -1
- package/src/library/runtime.ts +2064 -1730
- package/src/library/sketch-solver.ts +3 -1
- package/src/library/sketch.ts +81 -13
- package/src/library/text.ts +477 -0
- package/src/library/topology.ts +24 -0
- package/src/library/tsconfig.json +2 -1
- package/src/node/index.ts +14 -3
- package/src/node/tsconfig.json +2 -1
- package/src/tooling/index.ts +48 -46
- package/src/tooling/tsconfig.json +2 -1
- package/bld/library/alignment-geometry.js +0 -322
- package/bld/library/alignment-geometry.js.map +0 -1
- package/bld/library/bound-solver.js +0 -252
- package/bld/library/bound-solver.js.map +0 -1
- package/bld/library/extrude.js +0 -28
- package/bld/library/extrude.js.map +0 -1
- package/bld/library/kernel-artifact-codec.js +0 -148
- package/bld/library/kernel-artifact-codec.js.map +0 -1
- package/bld/library/kernel-cache.js +0 -245
- package/bld/library/kernel-cache.js.map +0 -1
- package/bld/library/kernel-shapes.js +0 -108
- package/bld/library/kernel-shapes.js.map +0 -1
- package/bld/library/loft.js +0 -161
- package/bld/library/loft.js.map +0 -1
- package/bld/library/material.js +0 -176
- package/bld/library/material.js.map +0 -1
- package/bld/library/model-color.js +0 -36
- package/bld/library/model-color.js.map +0 -1
- package/bld/library/open-cascade-error.js +0 -22
- package/bld/library/open-cascade-error.js.map +0 -1
- package/bld/library/relation-solver.js +0 -258
- package/bld/library/relation-solver.js.map +0 -1
- package/bld/library/retained-memory.js +0 -27
- package/bld/library/retained-memory.js.map +0 -1
- package/bld/library/runtime.js +0 -2954
- package/bld/library/runtime.js.map +0 -1
- package/bld/library/shell.js +0 -221
- package/bld/library/shell.js.map +0 -1
- package/bld/library/sketch-curve-intersections.js +0 -117
- package/bld/library/sketch-curve-intersections.js.map +0 -1
- package/bld/library/sketch-curves.js +0 -89
- package/bld/library/sketch-curves.js.map +0 -1
- package/bld/library/sketch-drag-rules.js +0 -522
- package/bld/library/sketch-drag-rules.js.map +0 -1
- package/bld/library/sketch-face.js +0 -72
- package/bld/library/sketch-face.js.map +0 -1
- package/bld/library/sketch-incidence.js +0 -114
- package/bld/library/sketch-incidence.js.map +0 -1
- package/bld/library/sketch-precision.js +0 -55
- package/bld/library/sketch-precision.js.map +0 -1
- package/bld/library/sketch-regions.js +0 -193
- package/bld/library/sketch-regions.js.map +0 -1
- package/bld/library/sketch-solver.js +0 -578
- package/bld/library/sketch-solver.js.map +0 -1
- package/bld/library/sketch.js +0 -650
- package/bld/library/sketch.js.map +0 -1
- package/bld/library/spatial.js +0 -195
- package/bld/library/spatial.js.map +0 -1
- package/bld/library/topology-id.js +0 -67
- package/bld/library/topology-id.js.map +0 -1
- package/bld/library/topology-inspection.js +0 -267
- package/bld/library/topology-inspection.js.map +0 -1
- package/bld/library/topology.js +0 -455
- package/bld/library/topology.js.map +0 -1
|
@@ -1,245 +0,0 @@
|
|
|
1
|
-
import { getOC } from 'replicad';
|
|
2
|
-
import { estimateRetainedBytes } from './retained-memory.js';
|
|
3
|
-
import { decodeKernelArtifact, encodeKernelArtifact, } from './kernel-artifact-codec.js';
|
|
4
|
-
export function createKernelOperationCache({ maximumBytes = 2 * 1024 ** 3, nativeAllocatedBytes, }) {
|
|
5
|
-
const entries = new Map();
|
|
6
|
-
const historicalEntries = new Map();
|
|
7
|
-
let retainedEvaluation = new Set();
|
|
8
|
-
let currentEvaluation;
|
|
9
|
-
let hits = 0;
|
|
10
|
-
let misses = 0;
|
|
11
|
-
let estimatedJavaScriptBytes = 0;
|
|
12
|
-
let store;
|
|
13
|
-
let persistentHits = 0;
|
|
14
|
-
let persistentWrites = 0;
|
|
15
|
-
let persistenceErrors = 0;
|
|
16
|
-
const persisted = new Set();
|
|
17
|
-
let externalBytes = 0;
|
|
18
|
-
/** The host accounts for in-flight inputs and all auxiliary native heaps. */
|
|
19
|
-
function setKernelExternalBytes(bytes) {
|
|
20
|
-
externalBytes = bytes;
|
|
21
|
-
evictHistoricalEntries();
|
|
22
|
-
}
|
|
23
|
-
function setKernelArtifactStore(next) {
|
|
24
|
-
store = next;
|
|
25
|
-
persisted.clear();
|
|
26
|
-
}
|
|
27
|
-
function accessStore(action) {
|
|
28
|
-
if (!store)
|
|
29
|
-
return undefined;
|
|
30
|
-
try {
|
|
31
|
-
return action(store);
|
|
32
|
-
}
|
|
33
|
-
catch {
|
|
34
|
-
// Cache storage is optional. Its failures must not change model execution.
|
|
35
|
-
persistenceErrors += 1;
|
|
36
|
-
store = undefined;
|
|
37
|
-
return undefined;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Keep a serial evaluation's complete working set, including snapshot queries.
|
|
42
|
-
* The previous working set stays available until this evaluation finishes so
|
|
43
|
-
* a changed prefix cannot evict unchanged operations that execute later.
|
|
44
|
-
* Outside evaluations, only the bounded historical LRU admits new entries.
|
|
45
|
-
*/
|
|
46
|
-
function beginKernelOperationEvaluation(checkCancelled) {
|
|
47
|
-
const used = new Set();
|
|
48
|
-
currentEvaluation = { used, checkCancelled };
|
|
49
|
-
return () => {
|
|
50
|
-
for (const id of retainedEvaluation) {
|
|
51
|
-
if (!used.has(id))
|
|
52
|
-
historicalEntries.set(id, entries.get(id));
|
|
53
|
-
}
|
|
54
|
-
retainedEvaluation = used;
|
|
55
|
-
currentEvaluation = undefined;
|
|
56
|
-
evictHistoricalEntries();
|
|
57
|
-
accessStore(store => store.flush());
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Reuses one complete, deterministic kernel operation. Arguments describe
|
|
62
|
-
* scalar semantics; inputs carry the content identities of prior operations.
|
|
63
|
-
* The lifecycle keeps the retained value independent from each disposable use.
|
|
64
|
-
*/
|
|
65
|
-
function evaluateKernelOperation(operation, arguments_, inputs, lifecycle, compute) {
|
|
66
|
-
const key = kernelOperationKey(operation, arguments_, inputs);
|
|
67
|
-
const cached = findKernelOperation(key, lifecycle);
|
|
68
|
-
if (cached)
|
|
69
|
-
return cached;
|
|
70
|
-
const value = compute();
|
|
71
|
-
acceptKernelOperation(key, lifecycle, value);
|
|
72
|
-
return { id: key.id, value };
|
|
73
|
-
}
|
|
74
|
-
function findKernelOperation(key, lifecycle) {
|
|
75
|
-
currentEvaluation?.checkCancelled?.();
|
|
76
|
-
const { id, signature } = key;
|
|
77
|
-
let cached = entries.get(id);
|
|
78
|
-
if (!cached) {
|
|
79
|
-
const bytes = accessStore(store => store.get(id));
|
|
80
|
-
if (bytes) {
|
|
81
|
-
let restored;
|
|
82
|
-
try {
|
|
83
|
-
restored = decodeKernelArtifact(bytes, signature);
|
|
84
|
-
}
|
|
85
|
-
catch {
|
|
86
|
-
persistenceErrors += 1;
|
|
87
|
-
accessStore(store => store.delete(id));
|
|
88
|
-
misses += 1;
|
|
89
|
-
return undefined;
|
|
90
|
-
}
|
|
91
|
-
cached = retainEntry(key, lifecycle, restored);
|
|
92
|
-
persistentHits += 1;
|
|
93
|
-
persisted.add(id);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
if (!cached) {
|
|
97
|
-
misses += 1;
|
|
98
|
-
return undefined;
|
|
99
|
-
}
|
|
100
|
-
if (cached.signature !== signature)
|
|
101
|
-
throw new Error(`Kernel operation cache identity collision: ${id}`);
|
|
102
|
-
hits += 1;
|
|
103
|
-
const value = cached.instantiate(cached.value);
|
|
104
|
-
persist(key, cached.value);
|
|
105
|
-
touchEntry(id, cached);
|
|
106
|
-
return { id, value };
|
|
107
|
-
}
|
|
108
|
-
/** Accept completed work even when cancellation arrived during computation. */
|
|
109
|
-
function acceptKernelOperation(key, lifecycle, value) {
|
|
110
|
-
const existing = entries.get(key.id);
|
|
111
|
-
if (existing) {
|
|
112
|
-
if (existing.signature !== key.signature)
|
|
113
|
-
throw new Error(`Kernel operation cache identity collision: ${key.id}`);
|
|
114
|
-
touchEntry(key.id, existing);
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
let retained;
|
|
118
|
-
try {
|
|
119
|
-
retained = lifecycle.retain(value);
|
|
120
|
-
}
|
|
121
|
-
catch (error) {
|
|
122
|
-
lifecycle.release(value);
|
|
123
|
-
throw error;
|
|
124
|
-
}
|
|
125
|
-
const entry = retainEntry(key, lifecycle, retained);
|
|
126
|
-
persist(key, retained);
|
|
127
|
-
touchEntry(key.id, entry);
|
|
128
|
-
}
|
|
129
|
-
function persist(key, value) {
|
|
130
|
-
if (!store || persisted.has(key.id))
|
|
131
|
-
return;
|
|
132
|
-
accessStore(store => {
|
|
133
|
-
if (!store.touch(key.id)) {
|
|
134
|
-
store.set(key.id, encodeKernelArtifact(key.signature, value));
|
|
135
|
-
persistentWrites += 1;
|
|
136
|
-
}
|
|
137
|
-
persisted.add(key.id);
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
function retainEntry(key, lifecycle, retained) {
|
|
141
|
-
const entry = {
|
|
142
|
-
estimatedBytes: 256 +
|
|
143
|
-
estimateRetainedBytes(key.signature) +
|
|
144
|
-
lifecycle.estimateBytes(retained),
|
|
145
|
-
signature: key.signature,
|
|
146
|
-
value: retained,
|
|
147
|
-
instantiate: lifecycle.instantiate,
|
|
148
|
-
release: lifecycle.release,
|
|
149
|
-
};
|
|
150
|
-
entries.set(key.id, entry);
|
|
151
|
-
estimatedJavaScriptBytes += entry.estimatedBytes;
|
|
152
|
-
return entry;
|
|
153
|
-
}
|
|
154
|
-
function touchEntry(id, entry) {
|
|
155
|
-
historicalEntries.delete(id);
|
|
156
|
-
if (currentEvaluation) {
|
|
157
|
-
currentEvaluation.used.delete(id);
|
|
158
|
-
currentEvaluation.used.add(id);
|
|
159
|
-
}
|
|
160
|
-
else if (!retainedEvaluation.has(id)) {
|
|
161
|
-
historicalEntries.set(id, entry);
|
|
162
|
-
}
|
|
163
|
-
evictHistoricalEntries();
|
|
164
|
-
}
|
|
165
|
-
function clearKernelOperationCache() {
|
|
166
|
-
for (const entry of entries.values()) {
|
|
167
|
-
entry.release(entry.value);
|
|
168
|
-
}
|
|
169
|
-
entries.clear();
|
|
170
|
-
historicalEntries.clear();
|
|
171
|
-
retainedEvaluation.clear();
|
|
172
|
-
currentEvaluation?.used.clear();
|
|
173
|
-
hits = 0;
|
|
174
|
-
misses = 0;
|
|
175
|
-
estimatedJavaScriptBytes = 0;
|
|
176
|
-
persistentHits = 0;
|
|
177
|
-
persistentWrites = 0;
|
|
178
|
-
persistenceErrors = 0;
|
|
179
|
-
persisted.clear();
|
|
180
|
-
}
|
|
181
|
-
function kernelOperationCacheStats() {
|
|
182
|
-
return {
|
|
183
|
-
entries: entries.size,
|
|
184
|
-
hits,
|
|
185
|
-
misses,
|
|
186
|
-
historicalEntries: historicalEntries.size,
|
|
187
|
-
estimatedJavaScriptBytes,
|
|
188
|
-
nativeAllocatedBytes: nativeAllocatedBytes(),
|
|
189
|
-
maximumBytes,
|
|
190
|
-
externalBytes,
|
|
191
|
-
persistentHits,
|
|
192
|
-
persistentWrites,
|
|
193
|
-
persistenceErrors,
|
|
194
|
-
};
|
|
195
|
-
}
|
|
196
|
-
function evictHistoricalEntries() {
|
|
197
|
-
while (historicalEntries.size &&
|
|
198
|
-
nativeAllocatedBytes() + estimatedJavaScriptBytes + externalBytes >
|
|
199
|
-
maximumBytes) {
|
|
200
|
-
const [id, entry] = historicalEntries.entries().next().value;
|
|
201
|
-
historicalEntries.delete(id);
|
|
202
|
-
entries.delete(id);
|
|
203
|
-
estimatedJavaScriptBytes -= entry.estimatedBytes;
|
|
204
|
-
entry.release(entry.value);
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
return {
|
|
208
|
-
beginKernelOperationEvaluation,
|
|
209
|
-
evaluateKernelOperation,
|
|
210
|
-
clearKernelOperationCache,
|
|
211
|
-
kernelOperationCacheStats,
|
|
212
|
-
setKernelArtifactStore,
|
|
213
|
-
findKernelOperation,
|
|
214
|
-
acceptKernelOperation,
|
|
215
|
-
setKernelExternalBytes,
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
export const { beginKernelOperationEvaluation, evaluateKernelOperation, clearKernelOperationCache, kernelOperationCacheStats, setKernelArtifactStore, findKernelOperation, acceptKernelOperation, setKernelExternalBytes, } = createKernelOperationCache({
|
|
219
|
-
nativeAllocatedBytes: () => getOC().Code3dMemory.AllocatedBytes(),
|
|
220
|
-
});
|
|
221
|
-
export function kernelOperationKey(operation, arguments_, inputs) {
|
|
222
|
-
const signature = JSON.stringify([
|
|
223
|
-
operation,
|
|
224
|
-
arguments_,
|
|
225
|
-
inputs.map(input => input.id),
|
|
226
|
-
]);
|
|
227
|
-
return { id: contentId(signature), signature };
|
|
228
|
-
}
|
|
229
|
-
function contentId(value) {
|
|
230
|
-
let first = 0x811c9dc5;
|
|
231
|
-
let second = 0x9e3779b9;
|
|
232
|
-
let third = 0x85ebca6b;
|
|
233
|
-
let fourth = 0xc2b2ae35;
|
|
234
|
-
for (let index = 0; index < value.length; index += 1) {
|
|
235
|
-
const code = value.charCodeAt(index);
|
|
236
|
-
first = Math.imul(first ^ code, 0x01000193);
|
|
237
|
-
second = Math.imul(second ^ code, 0x27d4eb2d);
|
|
238
|
-
third = Math.imul(third ^ code, 0x165667b1);
|
|
239
|
-
fourth = Math.imul(fourth ^ code, 0x85ebca77);
|
|
240
|
-
}
|
|
241
|
-
return [first, second, third, fourth]
|
|
242
|
-
.map(part => (part >>> 0).toString(16).padStart(8, '0'))
|
|
243
|
-
.join('');
|
|
244
|
-
}
|
|
245
|
-
//# sourceMappingURL=kernel-cache.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"kernel-cache.js","sourceRoot":"","sources":["../../src/library/kernel-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import { cast, getOC, } from 'replicad';
|
|
2
|
-
export function centeredBoxShape(x, y, z) {
|
|
3
|
-
const oc = getOC();
|
|
4
|
-
const corner = new oc.gp_Pnt(-x / 2, -y / 2, -z / 2);
|
|
5
|
-
try {
|
|
6
|
-
const builder = new oc.BRepPrimAPI_MakeBox(corner, x, y, z);
|
|
7
|
-
try {
|
|
8
|
-
return castOwnedShape3D(builder.Shape());
|
|
9
|
-
}
|
|
10
|
-
finally {
|
|
11
|
-
builder.delete();
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
finally {
|
|
15
|
-
corner.delete();
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
/** Consumes a raw handle; Replicad's cast creates a separate native handle. */
|
|
19
|
-
export function castOwnedShape(shape) {
|
|
20
|
-
try {
|
|
21
|
-
return cast(shape);
|
|
22
|
-
}
|
|
23
|
-
finally {
|
|
24
|
-
shape.delete();
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
export function castOwnedShape3D(shape) {
|
|
28
|
-
const result = castOwnedShape(shape);
|
|
29
|
-
try {
|
|
30
|
-
return result.asShape3D();
|
|
31
|
-
}
|
|
32
|
-
catch (error) {
|
|
33
|
-
result.delete();
|
|
34
|
-
throw error;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
/** Returns owned, distinct subshapes in kernel traversal order. */
|
|
38
|
-
export function shapeSubshapes(shape, kind) {
|
|
39
|
-
const oc = getOC();
|
|
40
|
-
const kinds = {
|
|
41
|
-
vertex: oc.TopAbs_ShapeEnum.TopAbs_VERTEX,
|
|
42
|
-
edge: oc.TopAbs_ShapeEnum.TopAbs_EDGE,
|
|
43
|
-
face: oc.TopAbs_ShapeEnum.TopAbs_FACE,
|
|
44
|
-
wire: oc.TopAbs_ShapeEnum.TopAbs_WIRE,
|
|
45
|
-
};
|
|
46
|
-
const explorer = new oc.TopExp_Explorer(shape.wrapped, kinds[kind], oc.TopAbs_ShapeEnum.TopAbs_SHAPE);
|
|
47
|
-
const values = [];
|
|
48
|
-
try {
|
|
49
|
-
while (explorer.More()) {
|
|
50
|
-
const raw = explorer.Current();
|
|
51
|
-
try {
|
|
52
|
-
if (!values.some(value => value.wrapped.IsSame(raw))) {
|
|
53
|
-
values.push(cast(raw));
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
finally {
|
|
57
|
-
// Current() owns a handle even for duplicate topology occurrences.
|
|
58
|
-
raw.delete();
|
|
59
|
-
}
|
|
60
|
-
explorer.Next();
|
|
61
|
-
}
|
|
62
|
-
return values;
|
|
63
|
-
}
|
|
64
|
-
catch (error) {
|
|
65
|
-
values.forEach(value => value.delete());
|
|
66
|
-
throw error;
|
|
67
|
-
}
|
|
68
|
-
finally {
|
|
69
|
-
explorer.delete();
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
/** Consumes a native list and transfers its owned element handles to the caller. */
|
|
73
|
-
export function consumeShapeList(list) {
|
|
74
|
-
const shapes = [];
|
|
75
|
-
try {
|
|
76
|
-
while (!list.IsEmpty()) {
|
|
77
|
-
shapes.push(list.First());
|
|
78
|
-
list.RemoveFirst();
|
|
79
|
-
}
|
|
80
|
-
return shapes;
|
|
81
|
-
}
|
|
82
|
-
catch (error) {
|
|
83
|
-
shapes.forEach(shape => shape.delete());
|
|
84
|
-
throw error;
|
|
85
|
-
}
|
|
86
|
-
finally {
|
|
87
|
-
list.delete();
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
/** Borrows the input and owns every builder/returned native handle. */
|
|
91
|
-
export function transformShape(source, configure) {
|
|
92
|
-
const oc = getOC();
|
|
93
|
-
const transform = new oc.gp_Trsf();
|
|
94
|
-
try {
|
|
95
|
-
configure(transform);
|
|
96
|
-
const builder = new oc.BRepBuilderAPI_Transform(source.wrapped, transform, true, false);
|
|
97
|
-
try {
|
|
98
|
-
return castOwnedShape(builder.ModifiedShape(source.wrapped));
|
|
99
|
-
}
|
|
100
|
-
finally {
|
|
101
|
-
builder.delete();
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
finally {
|
|
105
|
-
transform.delete();
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
//# sourceMappingURL=kernel-shapes.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"kernel-shapes.js","sourceRoot":"","sources":["../../src/library/kernel-shapes.ts"],"names":[],"mappings":"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"}
|
package/bld/library/loft.js
DELETED
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
import { cast, getOC, } from 'replicad';
|
|
2
|
-
import { castOwnedShape, castOwnedShape3D, consumeShapeList, shapeSubshapes, } from './kernel-shapes.js';
|
|
3
|
-
import { transferShapeTopology, booleanWithTopology, } from './topology.js';
|
|
4
|
-
export function loftWithTopology(sections, spine, ruled) {
|
|
5
|
-
const holes = [];
|
|
6
|
-
let outer;
|
|
7
|
-
let inner;
|
|
8
|
-
try {
|
|
9
|
-
for (const section of sections) {
|
|
10
|
-
const boundary = section.shape.clone().outerWire();
|
|
11
|
-
try {
|
|
12
|
-
const wires = shapeSubshapes(section.shape, 'wire');
|
|
13
|
-
holes.push(wires.filter(wire => {
|
|
14
|
-
if (!wire.isSame(boundary))
|
|
15
|
-
return true;
|
|
16
|
-
wire.delete();
|
|
17
|
-
return false;
|
|
18
|
-
}));
|
|
19
|
-
}
|
|
20
|
-
finally {
|
|
21
|
-
boundary.delete();
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
if (holes.some(wires => wires.length !== holes[0].length))
|
|
25
|
-
throw new Error('Loft sections must have matching hole counts.');
|
|
26
|
-
if (holes[0].length > 1)
|
|
27
|
-
throw new Error('Loft currently supports at most one hole per section; multiple holes need explicit correspondence.');
|
|
28
|
-
outer = loftContoursWithTopology(sections, spine, ruled);
|
|
29
|
-
if (!holes[0].length) {
|
|
30
|
-
const result = outer;
|
|
31
|
-
outer = undefined;
|
|
32
|
-
return result;
|
|
33
|
-
}
|
|
34
|
-
inner = loftContoursWithTopology(sections, spine, ruled, holes.map(wires => wires[0]));
|
|
35
|
-
return booleanWithTopology(outer, inner, 'cut');
|
|
36
|
-
}
|
|
37
|
-
finally {
|
|
38
|
-
inner?.shape.delete();
|
|
39
|
-
outer?.shape.delete();
|
|
40
|
-
holes.flat().forEach(wire => wire.delete());
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
function loftContoursWithTopology(sections, spine, ruled, holes) {
|
|
44
|
-
const oc = getOC();
|
|
45
|
-
const builder = spine
|
|
46
|
-
? new oc.BRepOffsetAPI_MakePipeShell(spine.wrapped)
|
|
47
|
-
: new oc.BRepOffsetAPI_ThruSections(true, ruled, 1e-6);
|
|
48
|
-
const wires = [];
|
|
49
|
-
let result;
|
|
50
|
-
const caps = [];
|
|
51
|
-
try {
|
|
52
|
-
for (const [index, section] of sections.entries())
|
|
53
|
-
wires.push(holes
|
|
54
|
-
? holes[index].clone()
|
|
55
|
-
: section.shape.clone().outerWire());
|
|
56
|
-
if (builder instanceof oc.BRepOffsetAPI_MakePipeShell) {
|
|
57
|
-
builder.SetMode(false);
|
|
58
|
-
for (const wire of wires)
|
|
59
|
-
builder.Add(wire.wrapped, false, false);
|
|
60
|
-
if (!builder.IsReady())
|
|
61
|
-
throw new Error('The loft sections could not be associated with the spine.');
|
|
62
|
-
builder.Build();
|
|
63
|
-
if (!builder.IsDone() || !builder.MakeSolid())
|
|
64
|
-
throw new Error('Could not construct a solid loft along the spine.');
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
builder.SetMutableInput(false);
|
|
68
|
-
for (const wire of wires)
|
|
69
|
-
builder.AddWire(wire.wrapped);
|
|
70
|
-
builder.Build();
|
|
71
|
-
}
|
|
72
|
-
result = castOwnedShape3D(builder.Shape());
|
|
73
|
-
caps[0] = castOwnedShape(builder.FirstShape());
|
|
74
|
-
caps[sections.length - 1] = castOwnedShape(builder.LastShape());
|
|
75
|
-
const topology = transferShapeTopology(sections, result, (input, kind, index) => {
|
|
76
|
-
const cap = caps[index];
|
|
77
|
-
// The builder consumes wires, so the profile faces need explicit cap history.
|
|
78
|
-
if (kind === 'surface')
|
|
79
|
-
return cap && !holes ? [copyShapeHandle(cap.wrapped)] : [];
|
|
80
|
-
const modified = consumeShapeList(builder.Modified(input));
|
|
81
|
-
if (!cap && kind === 'vertex')
|
|
82
|
-
return modified;
|
|
83
|
-
let generated = [];
|
|
84
|
-
let capParts = [];
|
|
85
|
-
let source;
|
|
86
|
-
try {
|
|
87
|
-
generated = consumeShapeList(builder.Generated(input));
|
|
88
|
-
if (cap)
|
|
89
|
-
capParts = shapeSubshapes(cap, kind);
|
|
90
|
-
else
|
|
91
|
-
source = cast(input);
|
|
92
|
-
// Sweeps generate side faces from edges and side edges from vertices.
|
|
93
|
-
// Their intersection with this section's cap identifies its descendants,
|
|
94
|
-
// including splits, without relying on traversal or geometric proximity.
|
|
95
|
-
for (const raw of generated) {
|
|
96
|
-
const shape = cast(raw);
|
|
97
|
-
try {
|
|
98
|
-
const parts = shapeSubshapes(shape, kind);
|
|
99
|
-
try {
|
|
100
|
-
for (const part of capParts) {
|
|
101
|
-
if (parts.some(candidate => candidate.isSame(part)))
|
|
102
|
-
modified.push(copyShapeHandle(part.wrapped));
|
|
103
|
-
}
|
|
104
|
-
// Ruled lofts can copy intermediate profile edges while
|
|
105
|
-
// retaining their vertices. Generated side faces plus the
|
|
106
|
-
// exact endpoint identities establish the copied edge history.
|
|
107
|
-
if (source)
|
|
108
|
-
for (const part of parts)
|
|
109
|
-
if (sameVertices(source, part))
|
|
110
|
-
modified.push(copyShapeHandle(part.wrapped));
|
|
111
|
-
}
|
|
112
|
-
finally {
|
|
113
|
-
parts.forEach(part => part.delete());
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
finally {
|
|
117
|
-
shape.delete();
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
return modified;
|
|
121
|
-
}
|
|
122
|
-
catch (error) {
|
|
123
|
-
modified.forEach(shape => shape.delete());
|
|
124
|
-
throw error;
|
|
125
|
-
}
|
|
126
|
-
finally {
|
|
127
|
-
generated.forEach(shape => shape.delete());
|
|
128
|
-
capParts.forEach(part => part.delete());
|
|
129
|
-
source?.delete();
|
|
130
|
-
}
|
|
131
|
-
});
|
|
132
|
-
return { shape: result, topology };
|
|
133
|
-
}
|
|
134
|
-
catch (error) {
|
|
135
|
-
result?.delete();
|
|
136
|
-
throw error;
|
|
137
|
-
}
|
|
138
|
-
finally {
|
|
139
|
-
caps.forEach(cap => cap?.delete());
|
|
140
|
-
wires.forEach(wire => wire.delete());
|
|
141
|
-
builder.delete();
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
function copyShapeHandle(shape) {
|
|
145
|
-
return shape.Oriented(shape.Orientation());
|
|
146
|
-
}
|
|
147
|
-
function sameVertices(left, right) {
|
|
148
|
-
const leftVertices = shapeSubshapes(left, 'vertex');
|
|
149
|
-
let rightVertices = [];
|
|
150
|
-
try {
|
|
151
|
-
rightVertices = shapeSubshapes(right, 'vertex');
|
|
152
|
-
return (leftVertices.length > 0 &&
|
|
153
|
-
leftVertices.length === rightVertices.length &&
|
|
154
|
-
leftVertices.every(vertex => rightVertices.some(candidate => candidate.isSame(vertex))));
|
|
155
|
-
}
|
|
156
|
-
finally {
|
|
157
|
-
leftVertices.forEach(vertex => vertex.delete());
|
|
158
|
-
rightVertices.forEach(vertex => vertex.delete());
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
//# sourceMappingURL=loft.js.map
|
package/bld/library/loft.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"loft.js","sourceRoot":"","sources":["../../src/library/loft.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,KAAK,GAKN,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,GACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,qBAAqB,EACrB,mBAAmB,GAGpB,MAAM,eAAe,CAAC;AAEvB,MAAM,UAAU,gBAAgB,CAC9B,QAAkC,EAClC,KAAuB,EACvB,KAAc;IAEd,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,KAA4D,CAAC;IACjE,IAAI,KAA4D,CAAC;IACjE,IAAI,CAAC;QACH,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAI,OAAO,CAAC,KAAc,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,CAAC;YAC7D,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACpD,KAAK,CAAC,IAAI,CACR,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;oBAClB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;wBAAE,OAAO,IAAI,CAAC;oBACxC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACd,OAAO,KAAK,CAAC;gBACf,CAAC,CAAC,CACH,CAAC;YACJ,CAAC;oBAAS,CAAC;gBACT,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpB,CAAC;QACH,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC;YACrB,MAAM,IAAI,KAAK,CACb,oGAAoG,CACrG,CAAC;QACJ,KAAK,GAAG,wBAAwB,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACzD,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,KAAK,CAAC;YACrB,KAAK,GAAG,SAAS,CAAC;YAClB,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,KAAK,GAAG,wBAAwB,CAC9B,QAAQ,EACR,KAAK,EACL,KAAK,EACL,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAC7B,CAAC;QACF,OAAO,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;QACtB,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAC/B,QAAkC,EAClC,KAAuB,EACvB,KAAc,EACd,KAAuB;IAEvB,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,OAAO,GAAG,KAAK;QACnB,CAAC,CAAC,IAAI,EAAE,CAAC,2BAA2B,CAAC,KAAK,CAAC,OAAO,CAAC;QACnD,CAAC,CAAC,IAAI,EAAE,CAAC,0BAA0B,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACzD,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,IAAI,MAA2B,CAAC;IAChC,MAAM,IAAI,GAAyB,EAAE,CAAC;IACtC,IAAI,CAAC;QACH,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE;YAC/C,KAAK,CAAC,IAAI,CACR,KAAK;gBACH,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE;gBACtB,CAAC,CAAE,OAAO,CAAC,KAAc,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,CAChD,CAAC;QACJ,IAAI,OAAO,YAAY,EAAE,CAAC,2BAA2B,EAAE,CAAC;YACtD,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACvB,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAClE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;gBACpB,MAAM,IAAI,KAAK,CACb,2DAA2D,CAC5D,CAAC;YACJ,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;gBAC3C,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACzE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC/B,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACxD,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;QACD,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,UAAU,EAAE,CAAS,CAAC;QACvD,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,CAAS,CAAC;QACxE,MAAM,QAAQ,GAAG,qBAAqB,CACpC,QAAQ,EACR,MAAM,EACN,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;YACrB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;YACxB,8EAA8E;YAC9E,IAAI,IAAI,KAAK,SAAS;gBACpB,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3D,IAAI,CAAC,GAAG,IAAI,IAAI,KAAK,QAAQ;gBAAE,OAAO,QAAQ,CAAC;YAC/C,IAAI,SAAS,GAAmB,EAAE,CAAC;YACnC,IAAI,QAAQ,GAAe,EAAE,CAAC;YAC9B,IAAI,MAA4B,CAAC;YACjC,IAAI,CAAC;gBACH,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;gBACvD,IAAI,GAAG;oBAAE,QAAQ,GAAG,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;;oBACzC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC1B,sEAAsE;gBACtE,yEAAyE;gBACzE,yEAAyE;gBACzE,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;oBAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;oBACxB,IAAI,CAAC;wBACH,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;wBAC1C,IAAI,CAAC;4BACH,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;gCAC5B,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oCACjD,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;4BACjD,CAAC;4BACD,wDAAwD;4BACxD,0DAA0D;4BAC1D,+DAA+D;4BAC/D,IAAI,MAAM;gCACR,KAAK,MAAM,IAAI,IAAI,KAAK;oCACtB,IAAI,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC;wCAC5B,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;wBACrD,CAAC;gCAAS,CAAC;4BACT,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;wBACvC,CAAC;oBACH,CAAC;4BAAS,CAAC;wBACT,KAAK,CAAC,MAAM,EAAE,CAAC;oBACjB,CAAC;gBACH,CAAC;gBACD,OAAO,QAAQ,CAAC;YAClB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC1C,MAAM,KAAK,CAAC;YACd,CAAC;oBAAS,CAAC;gBACT,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC3C,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;gBACxC,MAAM,EAAE,MAAM,EAAE,CAAC;YACnB,CAAC;QACH,CAAC,CACF,CAAC;QACF,OAAO,EAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QACnC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,MAAM,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,KAAmB;IAC1C,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,YAAY,CAAC,IAAc,EAAE,KAAe;IACnD,MAAM,YAAY,GAAG,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACpD,IAAI,aAAa,GAAe,EAAE,CAAC;IACnC,IAAI,CAAC;QACH,aAAa,GAAG,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAChD,OAAO,CACL,YAAY,CAAC,MAAM,GAAG,CAAC;YACvB,YAAY,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM;YAC5C,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAC1B,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAC1D,CACF,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAChD,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC"}
|