@driftengine/drft 3.61.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 (67) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +9 -0
  3. package/README.md +9 -0
  4. package/dist/animationData.d.ts +53 -0
  5. package/dist/animationData.js +13 -0
  6. package/dist/coarseFirst.d.ts +27 -0
  7. package/dist/coarseFirst.js +118 -0
  8. package/dist/drftColliders.d.ts +53 -0
  9. package/dist/drftColliders.js +137 -0
  10. package/dist/drftFormat.d.ts +454 -0
  11. package/dist/drftFormat.js +350 -0
  12. package/dist/drftRead.d.ts +121 -0
  13. package/dist/drftRead.js +487 -0
  14. package/dist/drftSkin.d.ts +40 -0
  15. package/dist/drftSkin.js +270 -0
  16. package/dist/drftStream.d.ts +170 -0
  17. package/dist/drftStream.js +315 -0
  18. package/dist/drftSubs.d.ts +18 -0
  19. package/dist/drftSubs.js +70 -0
  20. package/dist/drftWrite.d.ts +103 -0
  21. package/dist/drftWrite.js +478 -0
  22. package/dist/fixtures/v1-0.d.ts +9 -0
  23. package/dist/fixtures/v1-0.js +9 -0
  24. package/dist/fixtures/v1-1.d.ts +16 -0
  25. package/dist/fixtures/v1-1.js +16 -0
  26. package/dist/fixtures/v1-11.d.ts +14 -0
  27. package/dist/fixtures/v1-11.js +14 -0
  28. package/dist/fixtures/v1-2.d.ts +19 -0
  29. package/dist/fixtures/v1-2.js +19 -0
  30. package/dist/fixtures/v1-3.d.ts +18 -0
  31. package/dist/fixtures/v1-3.js +18 -0
  32. package/dist/fixtures/v1-4.d.ts +13 -0
  33. package/dist/fixtures/v1-4.js +13 -0
  34. package/dist/fixtures/v1-5.d.ts +14 -0
  35. package/dist/fixtures/v1-5.js +14 -0
  36. package/dist/fixtures/v1-6.d.ts +9 -0
  37. package/dist/fixtures/v1-6.js +9 -0
  38. package/dist/fixtures/v1-7.d.ts +9 -0
  39. package/dist/fixtures/v1-7.js +9 -0
  40. package/dist/fixtures/v1-9.d.ts +9 -0
  41. package/dist/fixtures/v1-9.js +9 -0
  42. package/dist/index.d.ts +26 -0
  43. package/dist/index.js +29 -0
  44. package/dist/meshData.d.ts +210 -0
  45. package/dist/meshData.js +105 -0
  46. package/package.json +57 -0
  47. package/src/animationData.ts +58 -0
  48. package/src/coarseFirst.ts +113 -0
  49. package/src/drftColliders.ts +153 -0
  50. package/src/drftFormat.ts +537 -0
  51. package/src/drftRead.ts +652 -0
  52. package/src/drftSkin.ts +326 -0
  53. package/src/drftStream.ts +436 -0
  54. package/src/drftSubs.ts +86 -0
  55. package/src/drftWrite.ts +613 -0
  56. package/src/fixtures/v1-0.ts +10 -0
  57. package/src/fixtures/v1-1.ts +17 -0
  58. package/src/fixtures/v1-11.ts +15 -0
  59. package/src/fixtures/v1-2.ts +20 -0
  60. package/src/fixtures/v1-3.ts +19 -0
  61. package/src/fixtures/v1-4.ts +14 -0
  62. package/src/fixtures/v1-5.ts +15 -0
  63. package/src/fixtures/v1-6.ts +10 -0
  64. package/src/fixtures/v1-7.ts +10 -0
  65. package/src/fixtures/v1-9.ts +10 -0
  66. package/src/index.ts +56 -0
  67. package/src/meshData.ts +301 -0
@@ -0,0 +1,478 @@
1
+ /**
2
+ * Writing a `.drft`.
3
+ *
4
+ * The writer is the smaller half and the stricter one: it validates what it is given
5
+ * before anything reaches a file, because a malformed asset caught here costs a failed
6
+ * bake, and the same asset caught later costs somebody a night on a device they cannot
7
+ * attach a debugger to. That is not hypothetical — see `validateMeshData`.
8
+ *
9
+ * Runs offline in the baker, so it may allocate freely. Nothing here is on a frame path.
10
+ */
11
+ import { buildClip, buildMorph, buildNodes, buildSkin } from './drftSkin.js';
12
+ import { validateMeshData } from './meshData.js';
13
+ import { ALIGNMENT, ATTR_EMISSIVE_COLOR, ATTR_GRAIN, ATTR_JOINTS, ATTR_RELIEF, ATTR_TANGENT, ATTR_ROUGHNESS, ATTR_SPECULAR, ATTR_UVS, ATTR_WEIGHTS, CHUNK_ENTRY_BYTES, CHUNK_HEAD, CHUNK_ANIM, CHUNK_LODM, CHUNK_LODF, CHUNK_MORP, CHUNK_NODE, CHUNK_SKIN, CHUNK_SPLT, SPLAT_BLOCK_PREFIX, CHUNK_MATL, CHUNK_MESH, CHUNK_REQUIRED, CHUNK_COLL, CHUNK_SUBS, CHUNK_TEXS, MATERIAL_ENTRY_BYTES, DRFT_MAGIC, DRFT_VERSION_MAJOR, DRFT_VERSION_MINOR, DrftError, FLAG_LITTLE_ENDIAN, HEADER_BYTES, align, } from './drftFormat.js';
14
+ import { coarseFirstOrder } from './coarseFirst.js';
15
+ import { buildSubs } from './drftSubs.js';
16
+ import { buildColliders } from './drftColliders.js';
17
+ /**
18
+ * The most blocks a capture is split into, and the fewest splats worth having in one.
19
+ *
20
+ * **A ceiling and a floor rather than a fixed count**, because both ends have a real cost. Every
21
+ * block is a sixteen-byte table entry and a forty-byte payload header, so a thousand blocks of
22
+ * two hundred splats is a table nobody wants; one block of a million splats is a capture that
23
+ * arrives all at once and does not stream at all. Sixteen blocks puts the first sixteenth of a
24
+ * capture on screen, which is what `coarseFirst.ts` is built to make worth looking at.
25
+ *
26
+ * **What would make these wrong** is a measurement on a real connection: a capture that reads as
27
+ * finished after two blocks wants fewer and larger, and one that stutters visibly between blocks
28
+ * wants more and smaller. `DrftSplats.blocks` is how a baker that has taken that measurement says
29
+ * so without waiting for these numbers to move.
30
+ */
31
+ const SPLAT_MAX_BLOCKS = 16;
32
+ const SPLAT_MIN_BLOCK = 4096;
33
+ /**
34
+ * Split a capture into blocks, each a sparse sample of the whole thing.
35
+ *
36
+ * The records are re-ordered on the way out — the file's order is `coarseFirstOrder`'s and not the
37
+ * caller's, which is why nothing here preserves an index. A consumer that needed the original
38
+ * ordering would need it stored, and `CHUNK_SPLT` says so.
39
+ */
40
+ function buildSplats(splats) {
41
+ const { count, wordsPerSplat } = splats;
42
+ if (count <= 0)
43
+ return [];
44
+ if (wordsPerSplat <= 0) {
45
+ throw new DrftError(`drft: a splat record is ${wordsPerSplat} words, which stores nothing`);
46
+ }
47
+ if (splats.records.length < count * wordsPerSplat) {
48
+ throw new DrftError(`drft: ${count} splats of ${wordsPerSplat} words need ${count * wordsPerSplat} entries and ` +
49
+ `the records array has ${splats.records.length}`);
50
+ }
51
+ if (splats.positions.length < count * 3) {
52
+ throw new DrftError(`drft: ${count} splats need ${count * 3} position entries and the array has ` +
53
+ `${splats.positions.length}`);
54
+ }
55
+ const asked = splats.blocks;
56
+ const blocks = asked !== undefined && asked > 0
57
+ ? Math.min(asked, count)
58
+ : Math.max(1, Math.min(SPLAT_MAX_BLOCKS, Math.ceil(count / SPLAT_MIN_BLOCK)));
59
+ const order = coarseFirstOrder(splats.positions, count);
60
+ /* Ceiling, so the last block is the short one and every earlier one is full. A reader takes
61
+ each block's own count from its header rather than deriving it, so a short block is ordinary. */
62
+ const perBlock = Math.ceil(count / blocks);
63
+ const out = [];
64
+ for (let block = 0; block < blocks; block++) {
65
+ const from = block * perBlock;
66
+ if (from >= count)
67
+ break;
68
+ const howMany = Math.min(perBlock, count - from);
69
+ const bytes = new Uint8Array(SPLAT_BLOCK_PREFIX + howMany * wordsPerSplat * 4);
70
+ const view = new DataView(bytes.buffer);
71
+ view.setUint32(0, howMany, true);
72
+ view.setUint32(4, count, true);
73
+ view.setUint32(8, wordsPerSplat, true);
74
+ view.setUint32(12, splats.sphericalHarmonics ?? 0, true);
75
+ for (let axis = 0; axis < 3; axis++) {
76
+ view.setFloat32(16 + axis * 4, splats.boundsMin[axis] ?? 0, true);
77
+ view.setFloat32(28 + axis * 4, splats.boundsMax[axis] ?? 0, true);
78
+ }
79
+ const records = new Uint32Array(bytes.buffer, SPLAT_BLOCK_PREFIX, howMany * wordsPerSplat);
80
+ for (let slot = 0; slot < howMany; slot++) {
81
+ const splat = order[from + slot] ?? 0;
82
+ records.set(splats.records.subarray(splat * wordsPerSplat, (splat + 1) * wordsPerSplat), slot * wordsPerSplat);
83
+ }
84
+ /* Optional, so a reader that predates 1.5 skips every one of these in silence. */
85
+ out.push({ code: CHUNK_SPLT, flags: 0, bytes });
86
+ }
87
+ return out;
88
+ }
89
+ const encoder = new TextEncoder();
90
+ /** A length-prefixed UTF-8 string, padded so what follows it stays aligned. */
91
+ function encodeString(value) {
92
+ const text = encoder.encode(value);
93
+ const bytes = new Uint8Array(align(4 + text.length));
94
+ new DataView(bytes.buffer).setUint32(0, text.length, true);
95
+ bytes.set(text, 4);
96
+ return bytes;
97
+ }
98
+ function buildHead(head, meshes) {
99
+ /*
100
+ * Bounds are computed rather than taken on trust. A caller that gets them wrong would
101
+ * produce an asset that culls itself out of frame, which looks like a rendering bug and
102
+ * is not one — and the writer is holding every vertex anyway.
103
+ */
104
+ let minX = Infinity;
105
+ let minY = Infinity;
106
+ let minZ = Infinity;
107
+ let maxX = -Infinity;
108
+ let maxY = -Infinity;
109
+ let maxZ = -Infinity;
110
+ for (const mesh of meshes) {
111
+ for (let at = 0; at + 2 < mesh.positions.length; at += 3) {
112
+ const x = mesh.positions[at];
113
+ const y = mesh.positions[at + 1];
114
+ const z = mesh.positions[at + 2];
115
+ if (x < minX)
116
+ minX = x;
117
+ if (y < minY)
118
+ minY = y;
119
+ if (z < minZ)
120
+ minZ = z;
121
+ if (x > maxX)
122
+ maxX = x;
123
+ if (y > maxY)
124
+ maxY = y;
125
+ if (z > maxZ)
126
+ maxZ = z;
127
+ }
128
+ }
129
+ if (!Number.isFinite(minX)) {
130
+ minX = 0;
131
+ minY = 0;
132
+ minZ = 0;
133
+ maxX = 0;
134
+ maxY = 0;
135
+ maxZ = 0;
136
+ }
137
+ const name = encodeString(head?.name ?? '');
138
+ const generator = encodeString(head?.generator ?? 'drft');
139
+ const numbers = new Float32Array([head?.unitScale ?? 1, minX, minY, minZ, maxX, maxY, maxZ]);
140
+ const bytes = new Uint8Array(numbers.byteLength + name.length + generator.length);
141
+ bytes.set(new Uint8Array(numbers.buffer), 0);
142
+ bytes.set(name, numbers.byteLength);
143
+ bytes.set(generator, numbers.byteLength + name.length);
144
+ return { code: CHUNK_HEAD, flags: CHUNK_REQUIRED, bytes };
145
+ }
146
+ /**
147
+ * One mesh payload, under whichever FourCC is carrying it.
148
+ *
149
+ * `MESH` and `LODM` are the same bytes on purpose: a coarse level *is* a mesh, and giving it
150
+ * its own layout would be a second thing to keep in step with the frozen attribute order for
151
+ * no gain. What differs is the code and the flag — a level of detail is optional, so a reader
152
+ * that has never heard of one skips it and draws the model, per rule 2 of §4.4.
153
+ */
154
+ function buildMesh(mesh, code = CHUNK_MESH, flags = CHUNK_REQUIRED) {
155
+ /*
156
+ * The check that this whole format exists downstream of. An attribute array not
157
+ * covering every vertex is drawn by some drivers and causes others to drop the draw
158
+ * outright, with no GL error on either path — so it is caught here, where the message
159
+ * can name the array, rather than on somebody's phone where it cannot.
160
+ */
161
+ validateMeshData(mesh);
162
+ const vertices = mesh.positions.length / 3;
163
+ let attributes = 0;
164
+ if (mesh.specular !== undefined)
165
+ attributes |= ATTR_SPECULAR;
166
+ if (mesh.uvs !== undefined)
167
+ attributes |= ATTR_UVS;
168
+ if (mesh.emissiveColor !== undefined)
169
+ attributes |= ATTR_EMISSIVE_COLOR;
170
+ if (mesh.roughness !== undefined)
171
+ attributes |= ATTR_ROUGHNESS;
172
+ if (mesh.grain !== undefined)
173
+ attributes |= ATTR_GRAIN;
174
+ if (mesh.relief !== undefined)
175
+ attributes |= ATTR_RELIEF;
176
+ if (mesh.tangents !== undefined)
177
+ attributes |= ATTR_TANGENT;
178
+ /* Both or neither: `validateMeshData` above has already refused one without the other, so
179
+ these two bits are always set together and the reader may rely on it. */
180
+ if (mesh.joints !== undefined)
181
+ attributes |= ATTR_JOINTS;
182
+ if (mesh.weights !== undefined)
183
+ attributes |= ATTR_WEIGHTS;
184
+ /* Order is frozen: mandatory arrays, then optional ones by ascending bit. */
185
+ const arrays = [
186
+ mesh.positions,
187
+ mesh.normals,
188
+ mesh.colors,
189
+ mesh.emissive,
190
+ ];
191
+ if (mesh.specular !== undefined)
192
+ arrays.push(mesh.specular);
193
+ if (mesh.uvs !== undefined)
194
+ arrays.push(mesh.uvs);
195
+ if (mesh.emissiveColor !== undefined)
196
+ arrays.push(mesh.emissiveColor);
197
+ if (mesh.roughness !== undefined)
198
+ arrays.push(mesh.roughness);
199
+ if (mesh.grain !== undefined)
200
+ arrays.push(mesh.grain);
201
+ if (mesh.relief !== undefined)
202
+ arrays.push(mesh.relief);
203
+ if (mesh.tangents !== undefined)
204
+ arrays.push(mesh.tangents);
205
+ /* Last, because the order is frozen and these are the newest bits. See ATTR_JOINTS: the
206
+ container validated this pair for four minor versions while writing neither of them. */
207
+ if (mesh.joints !== undefined)
208
+ arrays.push(mesh.joints);
209
+ if (mesh.weights !== undefined)
210
+ arrays.push(mesh.weights);
211
+ arrays.push(mesh.indices);
212
+ const PREFIX = 16;
213
+ let total = PREFIX;
214
+ for (const array of arrays)
215
+ total += array.byteLength;
216
+ const bytes = new Uint8Array(total);
217
+ const view = new DataView(bytes.buffer);
218
+ view.setUint32(0, vertices, true);
219
+ view.setUint32(4, mesh.indices.length, true);
220
+ view.setUint32(8, attributes, true);
221
+ view.setUint32(12, 0, true);
222
+ let at = PREFIX;
223
+ for (const array of arrays) {
224
+ bytes.set(new Uint8Array(array.buffer, array.byteOffset, array.byteLength), at);
225
+ at += array.byteLength;
226
+ }
227
+ return { code, flags, bytes };
228
+ }
229
+ /**
230
+ * One embedded image: its codec and size, then the compressed bytes untouched.
231
+ *
232
+ * The payload is not re-encoded. A JPEG the artist exported is already the size it is going
233
+ * to be, and decoding it here to compress it again would cost quality for nothing.
234
+ */
235
+ function buildTexture(texture) {
236
+ const PREFIX = 16;
237
+ /* The name follows the payload rather than preceding it, so the image still starts at a
238
+ fixed offset and a reader that predates the name simply stops before it. */
239
+ const name = encodeString(texture.name);
240
+ const nameAt = align(PREFIX + texture.bytes.length);
241
+ const bytes = new Uint8Array(nameAt + name.length);
242
+ const view = new DataView(bytes.buffer);
243
+ view.setUint32(0, texture.codec, true);
244
+ view.setUint32(4, texture.width, true);
245
+ view.setUint32(8, texture.height, true);
246
+ view.setUint32(12, texture.bytes.length, true);
247
+ bytes.set(texture.bytes, PREFIX);
248
+ bytes.set(name, nameAt);
249
+ return { code: CHUNK_TEXS, flags: 0, bytes };
250
+ }
251
+ /**
252
+ * Every material in one chunk: they are small, and the loader wants them all before it uploads.
253
+ *
254
+ * **The entry stride is written down rather than implied**, which is what makes a new material
255
+ * field additive instead of a break. A reader takes the fields it knows and steps by the
256
+ * stride it was told, so a file carrying an eleventh float opens in a reader that knows ten.
257
+ * Without it, appending one field changes the meaning of every byte after the first entry,
258
+ * which is precisely what rule 4 of §4.4 forbids, and the failure is silent: every material
259
+ * after the first would describe the wrong surface.
260
+ *
261
+ * Names follow the entries as a length-prefixed block, because they are the one variable
262
+ * length thing here and putting them inline would cost the fixed stride that buys the above.
263
+ */
264
+ function buildMaterials(materials) {
265
+ const names = materials.map((material) => encodeString(material.name));
266
+ let nameBytes = 0;
267
+ for (const name of names)
268
+ nameBytes += name.length;
269
+ const bytes = new Uint8Array(align(8 + materials.length * MATERIAL_ENTRY_BYTES + nameBytes));
270
+ const view = new DataView(bytes.buffer);
271
+ view.setUint32(0, materials.length, true);
272
+ view.setUint32(4, MATERIAL_ENTRY_BYTES, true);
273
+ let namesAt = 8 + materials.length * MATERIAL_ENTRY_BYTES;
274
+ for (const name of names) {
275
+ bytes.set(name, namesAt);
276
+ namesAt += name.length;
277
+ }
278
+ let at = 8;
279
+ for (const material of materials) {
280
+ view.setFloat32(at, material.color[0], true);
281
+ view.setFloat32(at + 4, material.color[1], true);
282
+ view.setFloat32(at + 8, material.color[2], true);
283
+ view.setFloat32(at + 12, material.specular, true);
284
+ view.setFloat32(at + 16, material.roughness, true);
285
+ view.setFloat32(at + 20, material.emissive, true);
286
+ view.setFloat32(at + 24, material.emissiveColor[0], true);
287
+ view.setFloat32(at + 28, material.emissiveColor[1], true);
288
+ view.setFloat32(at + 32, material.emissiveColor[2], true);
289
+ view.setFloat32(at + 36, material.opacity, true);
290
+ view.setInt32(at + 40, material.albedo, true);
291
+ view.setFloat32(at + 44, material.reflectivity, true);
292
+ view.setInt32(at + 48, material.normalMap, true);
293
+ view.setInt32(at + 52, material.ormMap, true);
294
+ view.setInt32(at + 56, material.emissiveMap, true);
295
+ view.setFloat32(at + 60, material.roughnessScale, true);
296
+ view.setFloat32(at + 64, material.metallicScale, true);
297
+ view.setFloat32(at + 68, material.occlusionStrength, true);
298
+ view.setFloat32(at + 72, material.cutout, true);
299
+ at += MATERIAL_ENTRY_BYTES;
300
+ }
301
+ return { code: CHUNK_MATL, flags: 0, bytes };
302
+ }
303
+ /**
304
+ * Bake a `.drft` into one `ArrayBuffer`.
305
+ *
306
+ * Every payload lands 4-byte aligned, which is what lets the reader view the vertex data
307
+ * in place rather than copying it out.
308
+ */
309
+ export function writeDrft(source) {
310
+ /*
311
+ * **Geometry *or* a capture, since 1.5.** This said "at least one mesh" while a mesh was the
312
+ * only thing an asset could be made of; a file holding one Gaussian splat capture is an
313
+ * ordinary asset and the reader accepts it, so refusing to write one would be the two halves of
314
+ * the format disagreeing about what a file may contain.
315
+ */
316
+ if (source.meshes.length === 0 && (source.splats === undefined || source.splats.count === 0)) {
317
+ throw new DrftError('an asset must contain at least one mesh or a capture with splats in it');
318
+ }
319
+ const materials = source.materials;
320
+ if (materials !== undefined && materials.length !== source.meshes.length) {
321
+ throw new DrftError(`${materials.length} materials for ${source.meshes.length} meshes; they pair by ordinal, so the counts must match`);
322
+ }
323
+ /*
324
+ * **Laid out in the order a viewer needs it, which is docs/FORMAT.md §4.6 and costs nothing.**
325
+ *
326
+ * Offsets are absolute, so where a payload sits is a bake-time choice no reader pays for, and
327
+ * this order is what makes a *plain sequential fetch* refine the model as bytes arrive: no
328
+ * range requests, no server support beyond serving a file. See `drftStream.ts`.
329
+ *
330
+ * `MATL` before the geometry is the part worth explaining. It is about 8 KB for a 187-mesh
331
+ * car against 74 MB of file, and it is what turns arriving parts from grey shapes into a
332
+ * correctly painted model. Paint costs almost nothing and buys the largest single jump in how
333
+ * finished the thing looks, so it goes early; textures are megabytes and buy the smallest, so
334
+ * they go last.
335
+ *
336
+ * `MATL` is optional and therefore skipped in silence by a reader that predates it, per rule 2
337
+ * in §4.4: an older reader draws the asset with its vertex colours and no maps, which is the
338
+ * same asset less its textures rather than a refusal. Moving it earlier in the file changes
339
+ * nothing about that, because a chunk is found through the table rather than by position.
340
+ */
341
+ const chunks = [buildHead(source.head, source.meshes)];
342
+ /*
343
+ * The outline first, ahead of even the paint. It is the one thing that puts a recognisable
344
+ * whole object on screen, it is a few hundred kilobytes against tens of megabytes, and the
345
+ * order it is written in is the order a plain sequential fetch delivers it.
346
+ */
347
+ for (const lod of source.lods ?? [])
348
+ chunks.push(buildMesh(lod, CHUNK_LODM, 0));
349
+ /*
350
+ * Discrete levels, finest first — the opposite of `lods` above, and deliberately. `LODM` is
351
+ * coarsest first because it serves a progressive load, where drawing *something* early is the
352
+ * point; a discrete chain serves distance selection, where level 0 should be the full-detail
353
+ * model the consumer already holds.
354
+ */
355
+ for (const level of source.levels ?? [])
356
+ chunks.push({ code: CHUNK_LODF, flags: 0, bytes: level });
357
+ if (materials !== undefined && materials.length > 0)
358
+ chunks.push(buildMaterials(materials));
359
+ /*
360
+ * After the paint and before the parts. Paint is a few kilobytes and turns everything after it
361
+ * from grey into a finished surface; a capture is the place the parts stand in, and its first
362
+ * block is a recognisable whole. Both come before the meshes for the same reason the outline
363
+ * does: what puts something worth looking at on screen goes early.
364
+ */
365
+ if (source.splats !== undefined)
366
+ chunks.push(...buildSplats(source.splats));
367
+ /*
368
+ * The rig before the geometry it deforms. A streaming consumer that has the skeleton and the
369
+ * clips can start a character the moment the first mesh lands, where the reverse order makes it
370
+ * wait for both; and all three are small beside the parts, so nothing is delayed by much.
371
+ */
372
+ for (const node of source.nodes === undefined ? [] : [source.nodes]) {
373
+ chunks.push({ code: CHUNK_NODE, flags: 0, bytes: buildNodes(node) });
374
+ }
375
+ for (const skin of source.skins ?? []) {
376
+ chunks.push({ code: CHUNK_SKIN, flags: 0, bytes: buildSkin(skin) });
377
+ }
378
+ for (const clip of source.clips ?? []) {
379
+ chunks.push({ code: CHUNK_ANIM, flags: 0, bytes: buildClip(clip) });
380
+ }
381
+ source.meshes.forEach((mesh, ordinal) => {
382
+ /*
383
+ * **Its deltas immediately before it, not after.** A streaming consumer uploads a mesh the
384
+ * moment its chunk lands, so deltas arriving afterwards are deltas for geometry already on the
385
+ * GPU — and a stream cannot rewrite a mesh it has handed over. Written first, the consumer has
386
+ * them in hand when it builds. The mesh ordinal in the payload still does the pairing, so a
387
+ * reader meeting them in another order is unaffected.
388
+ */
389
+ if (mesh.morphTargets !== undefined && mesh.morphTargetCount !== undefined) {
390
+ chunks.push({
391
+ code: CHUNK_MORP,
392
+ flags: 0,
393
+ bytes: buildMorph({
394
+ mesh: ordinal,
395
+ targetCount: mesh.morphTargetCount,
396
+ deltas: mesh.morphTargets,
397
+ }),
398
+ });
399
+ }
400
+ chunks.push(buildMesh(mesh));
401
+ });
402
+ for (const texture of source.textures ?? [])
403
+ chunks.push(buildTexture(texture));
404
+ /* One `SUBS` for the file, and only where something was labelled — an empty chunk would cost
405
+ sixteen bytes to say nothing, and rule 2 already covers its absence. */
406
+ if ((source.substances?.length ?? 0) > 0) {
407
+ chunks.push({
408
+ code: CHUNK_SUBS,
409
+ flags: 0,
410
+ bytes: buildSubs({ entries: source.substances }),
411
+ });
412
+ }
413
+ /*
414
+ * `COLL` last among the small chunks, because collision is the one thing a viewer never needs and
415
+ * a consumer that simulates has already waited for the whole file by the time it builds a world.
416
+ */
417
+ if ((source.colliders?.length ?? 0) > 0) {
418
+ chunks.push({
419
+ code: CHUNK_COLL,
420
+ flags: 0,
421
+ bytes: buildColliders(source.colliders),
422
+ });
423
+ }
424
+ const tableBytes = chunks.length * CHUNK_ENTRY_BYTES;
425
+ let cursor = align(HEADER_BYTES + tableBytes);
426
+ const offsets = [];
427
+ for (const chunk of chunks) {
428
+ offsets.push(cursor);
429
+ cursor = align(cursor + chunk.bytes.length);
430
+ }
431
+ const total = cursor;
432
+ const buffer = new ArrayBuffer(total);
433
+ const bytes = new Uint8Array(buffer);
434
+ const view = new DataView(buffer);
435
+ view.setUint32(0, DRFT_MAGIC, true);
436
+ view.setUint16(4, DRFT_VERSION_MAJOR, true);
437
+ view.setUint16(6, DRFT_VERSION_MINOR, true);
438
+ /*
439
+ * The oldest reader that may open this. Equal to the current major because nothing here
440
+ * needs a newer one — a writer raises it only when it emits something a previous
441
+ * generation would misread, which is exactly what a major bump means.
442
+ */
443
+ view.setUint16(8, DRFT_VERSION_MAJOR, true);
444
+ view.setUint16(10, FLAG_LITTLE_ENDIAN, true);
445
+ view.setUint32(12, chunks.length, true);
446
+ view.setUint32(16, total, true);
447
+ /* Bytes 20..31 stay zero: reserved, and readers must ignore them so they can become
448
+ fields later without a major bump. */
449
+ /*
450
+ * `index` is the ordinal *within a FourCC*, not the chunk's position in the table.
451
+ *
452
+ * It used to be written as the table position, which happened to be right for `MESH`
453
+ * because the meshes come first, and was wrong for everything after them: the six `TEXS`
454
+ * chunks in a 195 chunk file were numbered 188 to 193. Nothing here noticed, because this
455
+ * reader takes textures in the order it meets them rather than by the number they carry.
456
+ * A second implementation reading §4.3 would have used the number, and indexed six
457
+ * textures at 188.
458
+ */
459
+ const ordinals = new Map();
460
+ let entry = HEADER_BYTES;
461
+ for (let i = 0; i < chunks.length; i++) {
462
+ const chunk = chunks[i];
463
+ const offset = offsets[i];
464
+ const ordinal = ordinals.get(chunk.code) ?? 0;
465
+ ordinals.set(chunk.code, ordinal + 1);
466
+ view.setUint32(entry, chunk.code, true);
467
+ view.setUint32(entry + 4, offset, true);
468
+ view.setUint32(entry + 8, chunk.bytes.length, true);
469
+ view.setUint16(entry + 12, chunk.flags, true);
470
+ view.setUint16(entry + 14, ordinal, true);
471
+ entry += CHUNK_ENTRY_BYTES;
472
+ bytes.set(chunk.bytes, offset);
473
+ if (offset % ALIGNMENT !== 0) {
474
+ throw new DrftError(`internal: chunk ${i} landed unaligned at ${offset}`);
475
+ }
476
+ }
477
+ return buffer;
478
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * A `.drft` written by version 1.0, kept byte for byte.
3
+ *
4
+ * **Never regenerate this file.** It exists so today's reader can be tested against
5
+ * genuinely old bytes; rewriting it with a newer writer would only prove that the writer
6
+ * and the reader agree, which they always do, and would silently retire the guarantee it
7
+ * is here to defend.
8
+ */
9
+ export declare const FIXTURE_V1_0 = "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ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+AACAPgAAgD4AAIA+AACAPgAAgD4AAIA+AACAPgAAgD4AAIA+AACAPgAAgD4AAIA+AACAPgAAgD4AAIA+AACAPgAAgD4AAIA+AACAPgAAgD4AAIA+AACAPgAAgD4AAIA+zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPs3MzD7NzMw+zczMPs3MzD7NzMw+zczMPs3MzD7NzMw+zczMPs3MzD7NzMw+zczMPs3MzD7NzMw+zczMPs3MzD7NzMw+zczMPs3MzD7NzMw+zczMPs3MzD7NzMw+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/mpmZPpqZmT6amZk+mpmZPpqZmT6amZk+mpmZPpqZmT6amZk+mpmZPpqZmT6amZk+mpmZPpqZmT6amZk+mpmZPpqZmT6amZk+mpmZPpqZmT6amZk+mpmZPpqZmT6amZk+mpmZPpqZmT6amZk+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TAAAAFYAAABXAAAATAAAAFcAAABNAAAATQAAAFcAAABYAAAATQAAAFgAAABOAAAATgAAAFgAAABZAAAATwAAAFoAAABQAAAAUAAAAFoAAABbAAAAUAAAAFsAAABRAAAAUQAAAFsAAABcAAAAUQAAAFwAAABSAAAAUgAAAFwAAABdAAAAUgAAAF0AAABTAAAAUwAAAF0AAABeAAAAUwAAAF4AAABUAAAAVAAAAF4AAABfAAAAVAAAAF8AAABVAAAAVQAAAF8AAABgAAAAVQAAAGAAAABWAAAAVgAAAGAAAABhAAAAVgAAAGEAAABXAAAAVwAAAGEAAABiAAAAVwAAAGIAAABYAAAAWAAAAGIAAABjAAAAWAAAAGMAAABZAAAAWQAAAGMAAABkAAAAWgAAAGUAAABbAAAAWwAAAGUAAABmAAAAWwAAAGYAAABcAAAAXAAAAGYAAABnAAAAXAAAAGcAAABdAAAAXQAAAGcAAABoAAAAXQAAAGgAAABeAAAAXgAAAGgAAABpAAAAXgAAAGkAAABfAAAAXwAAAGkAAABqAAAAXwAAAGoAAABgAAAAYAAAAGoAAABrAAAAYAAAAGsAAABhAAAAYQAAAGsAAABsAAAAYQAAAGwAAABiAAAAYgAAAGwAAABtAAAAYgAAAG0AAABjAAAAYwAAAG0AAABuAAAAYwAAAG4AAABkAAAAZAAAAG4AAABvAAAAZQAAAHAAAABmAAAAZgAAAHAAAABxAAAAZgAAAHEAAABnAAAAZwAAAHEAAAByAAAAZwAAAHIAAABoAAAAaAAAAHIAAABzAAAAaAAAAHMAAABpAAAAaQAAAHMAAAB0AAAAaQAAAHQAAABqAAAAagAAAHQAAAB1AAAAagAAAHUAAABrAAAAawAAAHUAAAB2AAAAawAAAHYAAABsAAAAbAAAAHYAAAB3AAAAbAAAAHcAAABtAAAAbQAAAHcAAAB4AAAAbQAAAHgAAABuAAAAbgAAAHgAAAB5AAAAbgAAAHkAAABvAAAAbwAAAHkAAAB6AAAAcAAAAHsAAABxAAAAcQAAAHsAAAB8AAAAcQAAAHwAAAByAAAAcgAAAHwAAAB9AAAAcgAAAH0AAABzAAAAcwAAAH0AAAB+AAAAcwAAAH4AAAB0AAAAdAAAAH4AAAB/AAAAdAAAAH8AAAB1AAAAdQAAAH8AAACAAAAAdQAAAIAAAAB2AAAAdgAAAIAAAACBAAAAdgAAAIEAAAB3AAAAdwAAAIEAAACCAAAAdwAAAIIAAAB4AAAAeAAAAIIAAACDAAAAeAAAAIMAAAB5AAAAeQAAAIMAAACEAAAAeQAAAIQAAAB6AAAAegAAAIQAAACFAAAAewAAAIYAAAB8AAAAfAAAAIYAAACHAAAAfAAAAIcAAAB9AAAAfQAAAIcAAACIAAAAfQAAAIgAAAB+AAAAfgAAAIgAAACJAAAAfgAAAIkAAAB/AAAAfwAAAIkAAACKAAAAfwAAAIoAAACAAAAAgAAAAIoAAACLAAAAgAAAAIsAAACBAAAAgQAAAIsAAACMAAAAgQAAAIwAAACCAAAAggAAAIwAAACNAAAAggAAAI0AAACDAAAAgwAAAI0AAACOAAAAgwAAAI4AAACEAAAAhAAAAI4AAACPAAAAhAAAAI8AAACFAAAAhQAAAI8AAACQAAAAhgAAAJEAAACHAAAAhwAAAJEAAACSAAAAhwAAAJIAAACIAAAAiAAAAJIAAACTAAAAiAAAAJMAAACJAAAAiQAAAJMAAACUAAAAiQAAAJQAAACKAAAAigAAAJQAAACVAAAAigAAAJUAAACLAAAAiwAAAJUAAACWAAAAiwAAAJYAAACMAAAAjAAAAJYAAACXAAAAjAAAAJcAAACNAAAAjQAAAJcAAACYAAAAjQAAAJgAAACOAAAAjgAAAJgAAACZAAAAjgAAAJkAAACPAAAAjwAAAJkAAACaAAAAjwAAAJoAAACQAAAAkAAAAJoAAACbAAAAGAAAACQAAAAAAAAAAAAAAAAAGEEAAAC/AAAAvwAAGEEAAAA/AAAAvwAAGEEAAAA/AAAAPwAAGEEAAAC/AAAAPwAACEEAAAC/AAAAPwAACEEAAAA/AAAAPwAACEEAAAA/AAAAvwAACEEAAAC/AAAAvwAACEEAAAA/AAAAvwAACEEAAAA/AAAAPwAAGEEAAAA/AAAAPwAAGEEAAAA/AAAAvwAAGEEAAAC/AAAAvwAAGEEAAAC/AAAAPwAACEEAAAC/AAAAPwAACEEAAAC/AAAAvwAACEEAAAC/AAAAPwAAGEEAAAC/AAAAPwAAGEEAAAA/AAAAPwAACEEAAAA/AAAAPwAACEEAAAA/AAAAvwAAGEEAAAA/AAAAvwAAGEEAAAC/AAAAvwAACEEAAAC/AAAAvwAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAv83MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAAAAAACAAAAAwAAAAQAAAAFAAAABgAAAAQAAAAGAAAABwAAAAgAAAAJAAAACgAAAAgAAAAKAAAACwAAAAwAAAANAAAADgAAAAwAAAAOAAAADwAAABAAAAARAAAAEgAAABAAAAASAAAAEwAAABQAAAAVAAAAFgAAABQAAAAWAAAAFwAAAA==";
@@ -0,0 +1,9 @@
1
+ /**
2
+ * A `.drft` written by version 1.0, kept byte for byte.
3
+ *
4
+ * **Never regenerate this file.** It exists so today's reader can be tested against
5
+ * genuinely old bytes; rewriting it with a newer writer would only prove that the writer
6
+ * and the reader agree, which they always do, and would silently retire the guarantee it
7
+ * is here to defend.
8
+ */
9
+ export const FIXTURE_V1_0 = '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ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+ZmZmP83MzD3NzEw+AACAPgAAgD4AAIA+AACAPgAAgD4AAIA+AACAPgAAgD4AAIA+AACAPgAAgD4AAIA+AACAPgAAgD4AAIA+AACAPgAAgD4AAIA+AACAPgAAgD4AAIA+AACAPgAAgD4AAIA+zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPc3MzD3NzMw9zczMPs3MzD7NzMw+zczMPs3MzD7NzMw+zczMPs3MzD7NzMw+zczMPs3MzD7NzMw+zczMPs3MzD7NzMw+zczMPs3MzD7NzMw+zczMPs3MzD7NzMw+zczMPs3MzD7NzMw+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/zcxMPs3MzD5mZmY/mpmZPpqZmT6amZk+mpmZPpqZmT6amZk+mpmZPpqZmT6amZk+mpmZPpqZmT6amZk+mpmZPpqZmT6amZk+mpmZPpqZmT6amZk+mpmZPpqZmT6amZk+mpmZPpqZmT6amZk+mpmZPpqZmT6amZk+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TAAAAFYAAABXAAAATAAAAFcAAABNAAAATQAAAFcAAABYAAAATQAAAFgAAABOAAAATgAAAFgAAABZAAAATwAAAFoAAABQAAAAUAAAAFoAAABbAAAAUAAAAFsAAABRAAAAUQAAAFsAAABcAAAAUQAAAFwAAABSAAAAUgAAAFwAAABdAAAAUgAAAF0AAABTAAAAUwAAAF0AAABeAAAAUwAAAF4AAABUAAAAVAAAAF4AAABfAAAAVAAAAF8AAABVAAAAVQAAAF8AAABgAAAAVQAAAGAAAABWAAAAVgAAAGAAAABhAAAAVgAAAGEAAABXAAAAVwAAAGEAAABiAAAAVwAAAGIAAABYAAAAWAAAAGIAAABjAAAAWAAAAGMAAABZAAAAWQAAAGMAAABkAAAAWgAAAGUAAABbAAAAWwAAAGUAAABmAAAAWwAAAGYAAABcAAAAXAAAAGYAAABnAAAAXAAAAGcAAABdAAAAXQAAAGcAAABoAAAAXQAAAGgAAABeAAAAXgAAAGgAAABpAAAAXgAAAGkAAABfAAAAXwAAAGkAAABqAAAAXwAAAGoAAABgAAAAYAAAAGoAAABrAAAAYAAAAGsAAABhAAAAYQAAAGsAAABsAAAAYQAAAGwAAABiAAAAYgAAAGwAAABtAAAAYgAAAG0AAABjAAAAYwAAAG0AAABuAAAAYwAAAG4AAABkAAAAZAAAAG4AAABvAAAAZQAAAHAAAABmAAAAZgAAAHAAAABxAAAAZgAAAHEAAABnAAAAZwAAAHEAAAByAAAAZwAAAHIAAABoAAAAaAAAAHIAAABzAAAAaAAAAHMAAABpAAAAaQAAAHMAAAB0AAAAaQAAAHQAAABqAAAAagAAAHQAAAB1AAAAagAAAHUAAABrAAAAawAAAHUAAAB2AAAAawAAAHYAAABsAAAAbAAAAHYAAAB3AAAAbAAAAHcAAABtAAAAbQAAAHcAAAB4AAAAbQAAAHgAAABuAAAAbgAAAHgAAAB5AAAAbgAAAHkAAABvAAAAbwAAAHkAAAB6AAAAcAAAAHsAAABxAAAAcQAAAHsAAAB8AAAAcQAAAHwAAAByAAAAcgAAAHwAAAB9AAAAcgAAAH0AAABzAAAAcwAAAH0AAAB+AAAAcwAAAH4AAAB0AAAAdAAAAH4AAAB/AAAAdAAAAH8AAAB1AAAAdQAAAH8AAACAAAAAdQAAAIAAAAB2AAAAdgAAAIAAAACBAAAAdgAAAIEAAAB3AAAAdwAAAIEAAACCAAAAdwAAAIIAAAB4AAAAeAAAAIIAAACDAAAAeAAAAIMAAAB5AAAAeQAAAIMAAACEAAAAeQAAAIQAAAB6AAAAegAAAIQAAACFAAAAewAAAIYAAAB8AAAAfAAAAIYAAACHAAAAfAAAAIcAAAB9AAAAfQAAAIcAAACIAAAAfQAAAIgAAAB+AAAAfgAAAIgAAACJAAAAfgAAAIkAAAB/AAAAfwAAAIkAAACKAAAAfwAAAIoAAACAAAAAgAAAAIoAAACLAAAAgAAAAIsAAACBAAAAgQAAAIsAAACMAAAAgQAAAIwAAACCAAAAggAAAIwAAACNAAAAggAAAI0AAACDAAAAgwAAAI0AAACOAAAAgwAAAI4AAACEAAAAhAAAAI4AAACPAAAAhAAAAI8AAACFAAAAhQAAAI8AAACQAAAAhgAAAJEAAACHAAAAhwAAAJEAAACSAAAAhwAAAJIAAACIAAAAiAAAAJIAAACTAAAAiAAAAJMAAACJAAAAiQAAAJMAAACUAAAAiQAAAJQAAACKAAAAigAAAJQAAACVAAAAigAAAJUAAACLAAAAiwAAAJUAAACWAAAAiwAAAJYAAACMAAAAjAAAAJYAAACXAAAAjAAAAJcAAACNAAAAjQAAAJcAAACYAAAAjQAAAJgAAACOAAAAjgAAAJgAAACZAAAAjgAAAJkAAACPAAAAjwAAAJkAAACaAAAAjwAAAJoAAACQAAAAkAAAAJoAAACbAAAAGAAAACQAAAAAAAAAAAAAAAAAGEEAAAC/AAAAvwAAGEEAAAA/AAAAvwAAGEEAAAA/AAAAPwAAGEEAAAC/AAAAPwAACEEAAAC/AAAAPwAACEEAAAA/AAAAPwAACEEAAAA/AAAAvwAACEEAAAC/AAAAvwAACEEAAAA/AAAAvwAACEEAAAA/AAAAPwAAGEEAAAA/AAAAPwAAGEEAAAA/AAAAvwAAGEEAAAC/AAAAvwAAGEEAAAC/AAAAPwAACEEAAAC/AAAAPwAACEEAAAC/AAAAvwAACEEAAAC/AAAAPwAAGEEAAAC/AAAAPwAAGEEAAAA/AAAAPwAACEEAAAA/AAAAPwAACEEAAAA/AAAAvwAAGEEAAAA/AAAAvwAAGEEAAAC/AAAAvwAACEEAAAC/AAAAvwAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAv83MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAAAAAACAAAAAwAAAAQAAAAFAAAABgAAAAQAAAAGAAAABwAAAAgAAAAJAAAACgAAAAgAAAAKAAAACwAAAAwAAAANAAAADgAAAAwAAAAOAAAADwAAABAAAAARAAAAEgAAABAAAAASAAAAEwAAABQAAAAVAAAAFgAAABQAAAAWAAAAFwAAAA==';
@@ -0,0 +1,16 @@
1
+ /**
2
+ * A `.drft` written by version 1.1, kept byte for byte.
3
+ *
4
+ * **Never regenerate this file.** Sitting beside `v1-0.ts`, it is worth nothing today and
5
+ * everything later: written by today's writer it only proves that the writer and the reader
6
+ * agree, which they always do. What it defends is the day a future reader stops accepting
7
+ * bytes that nothing in the repository produces any more — and the only moment those bytes
8
+ * can be captured is while this version is the current one.
9
+ *
10
+ * 1.1 added `ATTR_GRAIN`, the first attribute bit appended since the order was frozen, so
11
+ * this file is also the byte-level example of an attribute arriving at the end of a MESH
12
+ * payload rather than beside the attribute it belongs with.
13
+ *
14
+ * Two meshes: one carrying every optional attribute including grain, one carrying none.
15
+ */
16
+ export declare const FIXTURE_V1_1 = "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EAAAABIAAAATAAAAFAAAABUAAAAWAAAAFAAAABYAAAAXAAAAGAAAACQAAAAAAAAAAAAAAAAA4EAAAIC/AACAvwAA4EAAAIA/AACAvwAA4EAAAIA/AACAPwAA4EAAAIC/AACAPwAAoEAAAIC/AACAPwAAoEAAAIA/AACAPwAAoEAAAIA/AACAvwAAoEAAAIC/AACAvwAAoEAAAIA/AACAvwAAoEAAAIA/AACAPwAA4EAAAIA/AACAPwAA4EAAAIA/AACAvwAA4EAAAIC/AACAvwAA4EAAAIC/AACAPwAAoEAAAIC/AACAPwAAoEAAAIC/AACAvwAAoEAAAIC/AACAPwAA4EAAAIC/AACAPwAA4EAAAIA/AACAPwAAoEAAAIA/AACAPwAAoEAAAIA/AACAvwAA4EAAAIA/AACAvwAA4EAAAIC/AACAvwAAoEAAAIC/AACAvwAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAv83MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAAAAAACAAAAAwAAAAQAAAAFAAAABgAAAAQAAAAGAAAABwAAAAgAAAAJAAAACgAAAAgAAAAKAAAACwAAAAwAAAANAAAADgAAAAwAAAAOAAAADwAAABAAAAARAAAAEgAAABAAAAASAAAAEwAAABQAAAAVAAAAFgAAABQAAAAWAAAAFwAAAA==";
@@ -0,0 +1,16 @@
1
+ /**
2
+ * A `.drft` written by version 1.1, kept byte for byte.
3
+ *
4
+ * **Never regenerate this file.** Sitting beside `v1-0.ts`, it is worth nothing today and
5
+ * everything later: written by today's writer it only proves that the writer and the reader
6
+ * agree, which they always do. What it defends is the day a future reader stops accepting
7
+ * bytes that nothing in the repository produces any more — and the only moment those bytes
8
+ * can be captured is while this version is the current one.
9
+ *
10
+ * 1.1 added `ATTR_GRAIN`, the first attribute bit appended since the order was frozen, so
11
+ * this file is also the byte-level example of an attribute arriving at the end of a MESH
12
+ * payload rather than beside the attribute it belongs with.
13
+ *
14
+ * Two meshes: one carrying every optional attribute including grain, one carrying none.
15
+ */
16
+ export const FIXTURE_V1_1 = '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EAAAABIAAAATAAAAFAAAABUAAAAWAAAAFAAAABYAAAAXAAAAGAAAACQAAAAAAAAAAAAAAAAA4EAAAIC/AACAvwAA4EAAAIA/AACAvwAA4EAAAIA/AACAPwAA4EAAAIC/AACAPwAAoEAAAIC/AACAPwAAoEAAAIA/AACAPwAAoEAAAIA/AACAvwAAoEAAAIC/AACAvwAAoEAAAIA/AACAvwAAoEAAAIA/AACAPwAA4EAAAIA/AACAPwAA4EAAAIA/AACAvwAA4EAAAIC/AACAvwAA4EAAAIC/AACAPwAAoEAAAIC/AACAPwAAoEAAAIC/AACAvwAAoEAAAIC/AACAPwAA4EAAAIC/AACAPwAA4EAAAIA/AACAPwAAoEAAAIA/AACAPwAAoEAAAIA/AACAvwAA4EAAAIA/AACAvwAA4EAAAIC/AACAvwAAoEAAAIC/AACAvwAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAv83MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPs3MzD3NzEw+mpmZPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAAAAAACAAAAAwAAAAQAAAAFAAAABgAAAAQAAAAGAAAABwAAAAgAAAAJAAAACgAAAAgAAAAKAAAACwAAAAwAAAANAAAADgAAAAwAAAAOAAAADwAAABAAAAARAAAAEgAAABAAAAASAAAAEwAAABQAAAAVAAAAFgAAABQAAAAWAAAAFwAAAA==';