agl 40.5.1 → 41.0.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 (137) hide show
  1. package/changelog.md +43 -0
  2. package/dist_serve/bundle.js +3514 -3357
  3. package/dist_serve/bundle.js.map +2 -2
  4. package/dist_serve/bundle.js.third-party-notices.json +58 -32
  5. package/dist_serve/bundle.js.third-party-notices.txt +108 -33
  6. package/dist_ts/00_commitinfo_data.js +1 -1
  7. package/dist_ts/aglapi/aglapisurface.document.js +64 -37
  8. package/dist_ts/classes.aglhome.d.ts +5 -0
  9. package/dist_ts/classes.aglhome.js +2 -1
  10. package/dist_ts/classes.authstore.js +5 -1
  11. package/dist_ts/classes.controller.d.ts +8 -0
  12. package/dist_ts/classes.controller.js +119 -22
  13. package/dist_ts/classes.controllereventdelivery.d.ts +72 -0
  14. package/dist_ts/classes.controllereventdelivery.js +233 -0
  15. package/dist_ts/classes.flexmodels.public.js +4 -1
  16. package/dist_ts/classes.flexprojectionreader.d.ts +6 -0
  17. package/dist_ts/classes.flexprojectionreader.js +29 -5
  18. package/dist_ts/classes.flexservice.d.ts +2 -1
  19. package/dist_ts/classes.flexservice.js +34 -6
  20. package/dist_ts/classes.flexstore.d.ts +41 -4
  21. package/dist_ts/classes.flexstore.js +266 -203
  22. package/dist_ts/classes.inferencegateway.d.ts +35 -1
  23. package/dist_ts/classes.inferencegateway.js +86 -26
  24. package/dist_ts/classes.inferenceservice.d.ts +4 -2
  25. package/dist_ts/classes.inferenceservice.js +5 -4
  26. package/dist_ts/classes.proxycontrol.d.ts +58 -4
  27. package/dist_ts/classes.proxycontrol.js +23 -44
  28. package/dist_ts/classes.proxycontrolclient.d.ts +15 -5
  29. package/dist_ts/classes.proxycontrolclient.js +67 -17
  30. package/dist_ts/classes.proxydaemon.d.ts +22 -3
  31. package/dist_ts/classes.proxydaemon.js +73 -12
  32. package/dist_ts/classes.proxyleaseholder.d.ts +43 -14
  33. package/dist_ts/classes.proxyleaseholder.js +66 -22
  34. package/dist_ts/classes.proxystore.d.ts +9 -0
  35. package/dist_ts/classes.proxystore.js +15 -7
  36. package/dist_ts/classes.ticketnotifier.js +4 -2
  37. package/dist_ts/classes.ticketstore.d.ts +50 -2
  38. package/dist_ts/classes.ticketstore.js +195 -78
  39. package/dist_ts/classes.workercallerbindings.d.ts +66 -0
  40. package/dist_ts/classes.workercallerbindings.js +211 -0
  41. package/dist_ts/classes.workercallers.d.ts +63 -2
  42. package/dist_ts/classes.workercallers.js +430 -65
  43. package/dist_ts/driver/classes.drivereventrelay.d.ts +13 -1
  44. package/dist_ts/driver/classes.drivereventrelay.js +99 -6
  45. package/dist_ts/driver/functions.driverinstructions.d.ts +1 -1
  46. package/dist_ts/driver/functions.driverinstructions.js +1 -1
  47. package/dist_ts/driver/functions.drivertools.d.ts +11 -2
  48. package/dist_ts/driver/functions.drivertools.js +19 -9
  49. package/dist_ts/fleet/classes.boardpump.d.ts +8 -2
  50. package/dist_ts/fleet/classes.boardpump.js +38 -20
  51. package/dist_ts/fleet/classes.ticketeffects.d.ts +17 -2
  52. package/dist_ts/fleet/classes.ticketeffects.js +16 -10
  53. package/dist_ts/fleet/classes.workerlaunches.d.ts +12 -5
  54. package/dist_ts/fleet/classes.workerlaunches.js +25 -19
  55. package/dist_ts/fleet/classes.workers.d.ts +21 -0
  56. package/dist_ts/fleet/classes.workers.js +110 -17
  57. package/dist_ts/fleet/functions.workervalidation.js +2 -2
  58. package/dist_ts/functions.flexprivatesnapshot.d.ts +102 -0
  59. package/dist_ts/functions.flexprivatesnapshot.js +461 -0
  60. package/dist_ts/functions.inferencecli.d.ts +3 -2
  61. package/dist_ts/functions.inferencecli.js +67 -5
  62. package/dist_ts/functions.inferencecliarguments.d.ts +6 -2
  63. package/dist_ts/functions.inferencecliarguments.js +29 -2
  64. package/dist_ts/functions.inferencelaunch.d.ts +24 -0
  65. package/dist_ts/functions.inferencelaunch.js +42 -2
  66. package/dist_ts/functions.mcptickettools.d.ts +3 -0
  67. package/dist_ts/functions.mcptickettools.js +2 -2
  68. package/dist_ts/functions.proxycontract.d.ts +11 -0
  69. package/dist_ts/functions.proxycontract.js +12 -1
  70. package/dist_ts/functions.proxysocket.d.ts +6 -0
  71. package/dist_ts/functions.proxysocket.js +46 -0
  72. package/dist_ts/functions.ticketcli.d.ts +1 -1
  73. package/dist_ts/functions.ticketcli.js +8 -4
  74. package/dist_ts/functions.ticketvalidation.d.ts +3 -0
  75. package/dist_ts/functions.ticketvalidation.js +7 -4
  76. package/dist_ts/functions.workerprocessproof.d.ts +6 -0
  77. package/dist_ts/functions.workerprocessproof.js +28 -4
  78. package/dist_ts/interfaces.flexipc.d.ts +21 -2
  79. package/dist_ts/interfaces.flexipc.js +33 -16
  80. package/dist_ts_interfaces/fleetworkers.d.ts +6 -0
  81. package/dist_ts_interfaces/interfaces.d.ts +1 -1
  82. package/dist_ts_interfaces/interfaces.js +1 -1
  83. package/dist_ts_interfaces/requests.tickets.d.ts +8 -12
  84. package/dist_ts_interfaces/tickets.d.ts +37 -9
  85. package/dist_ts_interfaces/tickets.js +7 -1
  86. package/dist_ts_interfaces/workercallers.d.ts +43 -4
  87. package/package.json +7 -7
  88. package/readme.md +156 -23
  89. package/ts/00_commitinfo_data.ts +1 -1
  90. package/ts/aglapi/aglapisurface.document.ts +63 -36
  91. package/ts/classes.aglhome.ts +6 -0
  92. package/ts/classes.authstore.ts +4 -0
  93. package/ts/classes.controller.ts +141 -32
  94. package/ts/classes.controllereventdelivery.ts +289 -0
  95. package/ts/classes.flexmodels.public.ts +10 -0
  96. package/ts/classes.flexprojectionreader.ts +30 -3
  97. package/ts/classes.flexservice.ts +33 -5
  98. package/ts/classes.flexstore.ts +381 -246
  99. package/ts/classes.inferencegateway.ts +104 -23
  100. package/ts/classes.inferenceservice.ts +6 -3
  101. package/ts/classes.proxycontrol.ts +76 -39
  102. package/ts/classes.proxycontrolclient.ts +72 -20
  103. package/ts/classes.proxydaemon.ts +85 -15
  104. package/ts/classes.proxyleaseholder.ts +84 -28
  105. package/ts/classes.proxystore.ts +16 -5
  106. package/ts/classes.ticketnotifier.ts +3 -1
  107. package/ts/classes.ticketstore.ts +201 -75
  108. package/ts/classes.workercallerbindings.ts +147 -0
  109. package/ts/classes.workercallers.ts +410 -59
  110. package/ts/driver/classes.drivereventrelay.ts +89 -4
  111. package/ts/driver/functions.driverinstructions.ts +1 -1
  112. package/ts/driver/functions.drivertools.ts +22 -8
  113. package/ts/fleet/classes.boardpump.ts +51 -19
  114. package/ts/fleet/classes.ticketeffects.ts +25 -11
  115. package/ts/fleet/classes.workerlaunches.ts +23 -15
  116. package/ts/fleet/classes.workers.ts +79 -17
  117. package/ts/fleet/functions.workervalidation.ts +1 -1
  118. package/ts/functions.flexprivatesnapshot.ts +601 -0
  119. package/ts/functions.inferencecli.ts +61 -7
  120. package/ts/functions.inferencecliarguments.ts +32 -1
  121. package/ts/functions.inferencelaunch.ts +49 -2
  122. package/ts/functions.mcptickettools.ts +1 -1
  123. package/ts/functions.proxycontract.ts +12 -0
  124. package/ts/functions.proxysocket.ts +39 -0
  125. package/ts/functions.ticketcli.ts +7 -3
  126. package/ts/functions.ticketvalidation.ts +7 -3
  127. package/ts/functions.workerprocessproof.ts +27 -4
  128. package/ts/interfaces.flexipc.ts +50 -21
  129. package/ts_interfaces/fleetworkers.ts +6 -0
  130. package/ts_interfaces/interfaces.ts +1 -1
  131. package/ts_interfaces/requests.tickets.ts +9 -6
  132. package/ts_interfaces/tickets.ts +32 -1
  133. package/ts_interfaces/workercallers.ts +32 -4
  134. package/ts_web/00_commitinfo_data.ts +1 -1
  135. package/ts_web/elements.harnesscontrollerapp.ts +19 -8
  136. package/ts_web/elements.ticketboard.ts +16 -4
  137. package/ts_web/settings.general.ts +10 -4
@@ -0,0 +1,461 @@
1
+ import * as plugins from './plugins.js';
2
+ import { assertFlexPrivateCandidateDocument, assertFlexPrivateChunkDocument, flexPrivateChunkBytes, } from './classes.flexmodels.private.js';
3
+ /*
4
+ * A private snapshot is stored as the JSON of the snapshot cut into content-addressed chunks
5
+ * (`IFlexPrivateChunkDocument`), listed in order by a candidate (`IFlexPrivateCandidateDocument`)
6
+ * that names the SHA-256 of the whole JSON. The JSON is cut in runs, and a chunk never spans two
7
+ * runs:
8
+ *
9
+ * - a growing list of a projection (`packedLists`) is its own run, packed entry by entry from the
10
+ * list's start into chunks of up to 64 KiB (an entry over the chunk size is cut in slices), so a
11
+ * chunk's end depends only on the entries before it;
12
+ * - everything else, and the whole snapshot of the other domains, is cut into slices of
13
+ * `flexPrivateChunkBytes` from the run's start.
14
+ *
15
+ * A save rebuilds only what its change touches: it keeps the layout of the candidate it replaces
16
+ * (`IFlexPrivateLayout`: each chunk with its bytes and where each list entry lies in them), takes
17
+ * every chunk whose bytes the change leaves in place, and serializes, hashes and encodes only the
18
+ * entries and chunks from the change on. The whole-snapshot SHA-256 is one pass over the chunks'
19
+ * bytes in order. A build without a previous layout is the full path: it serializes every entry.
20
+ * Both produce the bytes AGL 40.5.0 wrote; `test/test.flexprivatesnapshot.node.ts` proves it
21
+ * against that serializer.
22
+ */
23
+ /** The lists of a domain snapshot that grow entry by entry, each packed in its own run. */
24
+ const packedLists = {
25
+ projection: ['messages', 'reversionSegments'],
26
+ };
27
+ /**
28
+ * The list a domain snapshot stores as the last member of its one run. Its entries' bytes stay
29
+ * where they are when the snapshot's other members keep their length, so a save that changes the
30
+ * list's newest entries rebuilds the run's first slice and the slices from the change on.
31
+ */
32
+ const streamedLists = {
33
+ agentEvents: 'events',
34
+ };
35
+ /** A chunk of a growing list stays under this size, so a change rewrites little of the list. */
36
+ const privateListChunkBytes = 64 * 1024;
37
+ const sha256 = (valueArg) => plugins.crypto.createHash('sha256').update(valueArg).digest('hex');
38
+ export const privateCandidateDocumentId = (candidateIdArg) => `flex-private-candidate:${candidateIdArg}`;
39
+ /**
40
+ * Private chunks are addressed by their content within one domain incarnation, so a save stores
41
+ * only the chunks it changed and shares the others with the snapshot it replaces.
42
+ */
43
+ export const privateChunkDocumentId = (ownerArg, chunkDigestArg) => `flex-private-chunk:${sha256(JSON.stringify([
44
+ ownerArg.controllerId,
45
+ ownerArg.storageKey,
46
+ ownerArg.domain,
47
+ ownerArg.sessionId ?? null,
48
+ ownerArg.archiveId ?? null,
49
+ ownerArg.incarnationId,
50
+ chunkDigestArg,
51
+ ]))}`;
52
+ const ownerKey = (ownerArg) => JSON.stringify([
53
+ ownerArg.controllerId,
54
+ ownerArg.storageKey,
55
+ ownerArg.domain,
56
+ ownerArg.sessionId ?? null,
57
+ ownerArg.archiveId ?? null,
58
+ ownerArg.incarnationId,
59
+ ]);
60
+ /** A snapshot that streams `keyArg` when it is the last member and a list; else its JSON whole. */
61
+ const streamedRun = (snapshotArg, keyArg) => {
62
+ const keys = Object.keys(snapshotArg);
63
+ const value = keyArg === undefined ? undefined : Reflect.get(snapshotArg, keyArg);
64
+ if (keyArg === undefined || keys.at(-1) !== keyArg || !Array.isArray(value)) {
65
+ return { kind: 'sliced', head: JSON.stringify(snapshotArg), tail: '' };
66
+ }
67
+ const rest = JSON.stringify(Object.fromEntries(keys.slice(0, -1).map((key) => [key, Reflect.get(snapshotArg, key)])));
68
+ return {
69
+ kind: 'sliced',
70
+ head: `${rest.slice(0, -1)}${rest === '{}' ? '' : ','}${JSON.stringify(keyArg)}:[`,
71
+ list: { key: keyArg, entries: value },
72
+ tail: ']}',
73
+ };
74
+ };
75
+ /** The runs of a snapshot's JSON, in order. */
76
+ const describeRuns = (snapshotArg, domainArg) => {
77
+ if (snapshotArg === null || typeof snapshotArg !== 'object' || Array.isArray(snapshotArg)) {
78
+ return [{ kind: 'sliced', head: JSON.stringify(snapshotArg), tail: '' }];
79
+ }
80
+ const listKeys = packedLists[domainArg] ?? [];
81
+ if (listKeys.length === 0)
82
+ return [streamedRun(snapshotArg, streamedLists[domainArg])];
83
+ const runs = [];
84
+ let frame = '{';
85
+ let first = true;
86
+ for (const [key, value] of Object.entries(snapshotArg)) {
87
+ if (value === undefined)
88
+ continue;
89
+ frame += `${first ? '' : ','}${JSON.stringify(key)}:`;
90
+ first = false;
91
+ if (listKeys.includes(key) && Array.isArray(value) && value.length > 0) {
92
+ runs.push({ kind: 'sliced', head: `${frame}[`, tail: '' });
93
+ runs.push({ kind: 'packed', key, entries: value });
94
+ frame = ']';
95
+ }
96
+ else {
97
+ frame += JSON.stringify(value);
98
+ }
99
+ }
100
+ runs.push({ kind: 'sliced', head: `${frame}}`, tail: '' });
101
+ return runs;
102
+ };
103
+ /** How many entries two lists share from their start, by identity. */
104
+ const sharedPrefix = (leftArg, rightArg) => {
105
+ const limit = Math.min(leftArg.length, rightArg.length);
106
+ let index = 0;
107
+ while (index < limit && leftArg[index] === rightArg[index])
108
+ index++;
109
+ return index;
110
+ };
111
+ const bufferSegment = (bufferArg) => ({
112
+ bytes: bufferArg.byteLength,
113
+ copy: (targetArg, targetOffsetArg, fromArg, toArg) => {
114
+ bufferArg.copy(targetArg, targetOffsetArg, fromArg, toArg);
115
+ },
116
+ });
117
+ /** The bytes `fromArg` to `toArg` of a sliced run, read from its chunks. */
118
+ const previousSegment = (runArg, fromArg, toArg) => ({
119
+ bytes: toArg - fromArg,
120
+ copy: (targetArg, targetOffsetArg, startArg, endArg) => {
121
+ let offset = fromArg + startArg;
122
+ let target = targetOffsetArg;
123
+ while (offset < fromArg + endArg) {
124
+ const index = Math.floor(offset / flexPrivateChunkBytes);
125
+ const within = offset - index * flexPrivateChunkBytes;
126
+ const length = Math.min(fromArg + endArg - offset, flexPrivateChunkBytes - within);
127
+ runArg.chunks[index].data.copy(targetArg, target, within, within + length);
128
+ offset += length;
129
+ target += length;
130
+ }
131
+ },
132
+ });
133
+ /**
134
+ * Fills the chunks `rangesArg` names (sorted, disjoint, in run offsets) from the run's segments in
135
+ * one pass.
136
+ */
137
+ const fillRanges = (segmentsArg, rangesArg) => {
138
+ let rangeIndex = 0;
139
+ let position = 0;
140
+ for (const segment of segmentsArg) {
141
+ const segmentEnd = position + segment.bytes;
142
+ while (rangeIndex < rangesArg.length && rangesArg[rangeIndex].end <= position)
143
+ rangeIndex++;
144
+ for (let index = rangeIndex; index < rangesArg.length && rangesArg[index].start < segmentEnd; index++) {
145
+ const range = rangesArg[index];
146
+ const from = Math.max(range.start, position);
147
+ const to = Math.min(range.end, segmentEnd);
148
+ if (from < to)
149
+ segment.copy(range.data, from - range.start, from - position, to - position);
150
+ }
151
+ position = segmentEnd;
152
+ }
153
+ };
154
+ /** `textArg` as UTF-8 in memory of its own, never a slice of Node's shared buffer pool. */
155
+ const ownBytes = (textArg) => {
156
+ const data = Buffer.alloc(Buffer.byteLength(textArg, 'utf8'));
157
+ data.write(textArg, 'utf8');
158
+ return data;
159
+ };
160
+ const updateSlicedRun = (previousArg, sourceArg, mintArg) => {
161
+ const head = ownBytes(sourceArg.head);
162
+ const tail = ownBytes(sourceArg.tail);
163
+ const entries = sourceArg.list?.entries ?? [];
164
+ const previousList = previousArg?.list !== undefined && previousArg.list.key === sourceArg.list?.key
165
+ ? previousArg.list
166
+ : undefined;
167
+ const kept = previousList ? sharedPrefix(entries, previousList.entries) : 0;
168
+ // The pieces of the kept entries are taken from the previous run's bytes, never serialized again.
169
+ const previousListStart = previousArg?.head.byteLength ?? 0;
170
+ const keptEnd = kept > 0 ? previousList.ends[kept - 1] : previousListStart;
171
+ const fresh = [];
172
+ for (let index = kept; index < entries.length; index++) {
173
+ fresh.push(Buffer.from(`${index === 0 ? '' : ','}${JSON.stringify(entries[index]) ?? 'null'}`, 'utf8'));
174
+ }
175
+ const shift = head.byteLength - previousListStart;
176
+ const ends = [];
177
+ for (let index = 0; index < kept; index++)
178
+ ends.push(previousList.ends[index] + shift);
179
+ let offset = head.byteLength + keptEnd - previousListStart;
180
+ for (const piece of fresh) {
181
+ offset += piece.byteLength;
182
+ ends.push(offset);
183
+ }
184
+ const bytes = offset + tail.byteLength;
185
+ // The bytes from `cleanFrom` to `cleanTo` are the previous run's bytes at the same offsets.
186
+ let cleanFrom = Number.POSITIVE_INFINITY;
187
+ let cleanTo = 0;
188
+ if (previousArg && head.byteLength === previousArg.head.byteLength) {
189
+ cleanFrom = head.equals(previousArg.head) ? 0 : head.byteLength;
190
+ const listUnchanged = previousList
191
+ ? kept === entries.length && kept === previousList.entries.length
192
+ : sourceArg.list === undefined && previousArg.list === undefined;
193
+ cleanTo = listUnchanged && tail.equals(previousArg.tail) ? bytes : keptEnd;
194
+ }
195
+ const count = Math.max(1, Math.ceil(bytes / flexPrivateChunkBytes));
196
+ const chunks = [];
197
+ const ranges = [];
198
+ for (let index = 0; index < count; index++) {
199
+ const start = index * flexPrivateChunkBytes;
200
+ const end = Math.min(start + flexPrivateChunkBytes, bytes);
201
+ const previousChunk = previousArg?.chunks[index];
202
+ if (previousChunk
203
+ && start >= cleanFrom
204
+ && end <= cleanTo
205
+ && Math.min(start + flexPrivateChunkBytes, previousArg.bytes) === end) {
206
+ chunks.push(previousChunk);
207
+ }
208
+ else {
209
+ chunks.push(undefined);
210
+ ranges.push({ index, start, end, data: Buffer.alloc(end - start) });
211
+ }
212
+ }
213
+ if (ranges.length > 0) {
214
+ fillRanges([
215
+ bufferSegment(head),
216
+ ...(kept > 0 ? [previousSegment(previousArg, previousListStart, keptEnd)] : []),
217
+ ...fresh.map(bufferSegment),
218
+ bufferSegment(tail),
219
+ ], ranges);
220
+ for (const range of ranges)
221
+ chunks[range.index] = mintArg(range.data);
222
+ }
223
+ for (const piece of fresh)
224
+ piece.fill(0);
225
+ return {
226
+ kind: 'sliced',
227
+ head,
228
+ ...(sourceArg.list ? { list: { key: sourceArg.list.key, entries, ends } } : {}),
229
+ tail,
230
+ bytes,
231
+ chunks: chunks,
232
+ };
233
+ };
234
+ /** The index of the last chunk that starts at or before piece `pieceArg`: the chunk holding it. */
235
+ const chunkHolding = (chunksArg, pieceArg) => {
236
+ let low = 0;
237
+ let high = chunksArg.length - 1;
238
+ while (low < high) {
239
+ const middle = (low + high + 1) >>> 1;
240
+ if (chunksArg[middle].first <= pieceArg)
241
+ low = middle;
242
+ else
243
+ high = middle - 1;
244
+ }
245
+ return low;
246
+ };
247
+ const copyOf = (partsArg, bytesArg) => {
248
+ const data = Buffer.alloc(bytesArg);
249
+ let offset = 0;
250
+ for (const part of partsArg)
251
+ offset += part.copy(data, offset);
252
+ return data;
253
+ };
254
+ const updatePackedRun = (previousArg, sourceArg, mintArg) => {
255
+ const entries = sourceArg.entries;
256
+ const kept = previousArg ? sharedPrefix(entries, previousArg.entries) : 0;
257
+ if (previousArg && kept === entries.length && kept === previousArg.entries.length) {
258
+ return { ...previousArg, entries };
259
+ }
260
+ // Chunks end where the packing from the list's start ends them, so every chunk before the one
261
+ // holding the last kept piece stays; packing resumes at that chunk's start, where it began
262
+ // empty. A kept piece cut in slices ends its own chunks, so packing resumes after it.
263
+ const chunks = [];
264
+ let restart = 0;
265
+ let restartChunk;
266
+ if (previousArg && kept > 0) {
267
+ const holding = chunkHolding(previousArg.chunks, kept - 1);
268
+ const chunk = previousArg.chunks[holding];
269
+ if (chunk.sliced) {
270
+ chunks.push(...previousArg.chunks.slice(0, holding + 1));
271
+ restart = kept;
272
+ }
273
+ else {
274
+ chunks.push(...previousArg.chunks.slice(0, holding));
275
+ restart = chunk.first;
276
+ restartChunk = chunk;
277
+ }
278
+ }
279
+ const pieceBytes = previousArg ? previousArg.pieceBytes.slice(0, kept) : [];
280
+ let pending = [];
281
+ let pendingBytes = 0;
282
+ let pendingFirst = restart;
283
+ const fresh = [];
284
+ const flush = (endArg) => {
285
+ if (pending.length === 0)
286
+ return;
287
+ chunks.push({
288
+ chunk: mintArg(copyOf(pending, pendingBytes)),
289
+ first: pendingFirst,
290
+ end: endArg,
291
+ sliced: false,
292
+ });
293
+ pending = [];
294
+ pendingBytes = 0;
295
+ };
296
+ let keptOffset = 0;
297
+ for (let index = restart; index < entries.length; index++) {
298
+ let piece;
299
+ if (index < kept) {
300
+ const length = previousArg.pieceBytes[index];
301
+ piece = restartChunk.chunk.data.subarray(keptOffset, keptOffset + length);
302
+ keptOffset += length;
303
+ }
304
+ else {
305
+ piece = Buffer.from(`${index === 0 ? '' : ','}${JSON.stringify(entries[index])}`, 'utf8');
306
+ pieceBytes.push(piece.byteLength);
307
+ fresh.push(piece);
308
+ }
309
+ if (pendingBytes > 0 && pendingBytes + piece.byteLength > privateListChunkBytes)
310
+ flush(index);
311
+ if (piece.byteLength <= flexPrivateChunkBytes - pendingBytes) {
312
+ if (pending.length === 0)
313
+ pendingFirst = index;
314
+ pending.push(piece);
315
+ pendingBytes += piece.byteLength;
316
+ continue;
317
+ }
318
+ flush(index);
319
+ for (let offset = 0; offset < piece.byteLength; offset += flexPrivateChunkBytes) {
320
+ chunks.push({
321
+ chunk: mintArg(copyOf([piece.subarray(offset, Math.min(offset + flexPrivateChunkBytes, piece.byteLength))], Math.min(flexPrivateChunkBytes, piece.byteLength - offset))),
322
+ first: index,
323
+ end: index + 1,
324
+ sliced: true,
325
+ });
326
+ }
327
+ }
328
+ flush(entries.length);
329
+ for (const piece of fresh)
330
+ piece.fill(0);
331
+ return { kind: 'packed', key: sourceArg.key, entries, pieceBytes, chunks };
332
+ };
333
+ /** The candidate and chunk documents that store `snapshot`, and the layout they leave. */
334
+ export const buildFlexPrivateSnapshot = (optionsArg) => {
335
+ const owner = optionsArg.owner;
336
+ const key = ownerKey(owner);
337
+ const previous = optionsArg.previous?.owner === key ? optionsArg.previous : undefined;
338
+ const minted = [];
339
+ const mint = (dataArg) => {
340
+ const digest = sha256(dataArg);
341
+ const chunk = {
342
+ id: privateChunkDocumentId(owner, digest),
343
+ sha256: digest,
344
+ bytes: dataArg.byteLength,
345
+ data: dataArg,
346
+ holders: 0,
347
+ };
348
+ minted.push(chunk);
349
+ return chunk;
350
+ };
351
+ try {
352
+ const previousPacked = new Map();
353
+ const previousSliced = [];
354
+ for (const run of previous?.runs ?? []) {
355
+ if (run.kind === 'packed')
356
+ previousPacked.set(run.key, run);
357
+ else
358
+ previousSliced.push(run);
359
+ }
360
+ let slicedIndex = 0;
361
+ const runs = describeRuns(optionsArg.snapshot, owner.domain).map((source) => (source.kind === 'packed'
362
+ ? updatePackedRun(previousPacked.get(source.key), source, mint)
363
+ : updateSlicedRun(previousSliced[slicedIndex++], source, mint)));
364
+ const chunks = runs.flatMap((run) => (run.kind === 'packed' ? run.chunks.map((entry) => entry.chunk) : run.chunks));
365
+ if (chunks.length === 0)
366
+ chunks.push(mint(Buffer.alloc(0)));
367
+ // The whole-snapshot digest: one pass over the chunks' bytes, never joined into one buffer.
368
+ const hash = plugins.crypto.createHash('sha256');
369
+ let bytes = 0;
370
+ for (const chunk of chunks) {
371
+ hash.update(chunk.data);
372
+ bytes += chunk.bytes;
373
+ }
374
+ const digest = hash.digest('hex');
375
+ const identity = {
376
+ domain: owner.domain,
377
+ incarnationId: owner.incarnationId,
378
+ ...(owner.sessionId !== undefined ? { sessionId: owner.sessionId } : {}),
379
+ ...(owner.archiveId !== undefined ? { archiveId: owner.archiveId } : {}),
380
+ };
381
+ const made = new Set(minted);
382
+ const documents = [];
383
+ chunks.forEach((chunk, index) => {
384
+ if (!made.has(chunk) || optionsArg.sharedChunkIds.has(chunk.id))
385
+ return;
386
+ documents.push({
387
+ id: chunk.id,
388
+ controllerId: owner.controllerId,
389
+ scopeId: owner.storageKey,
390
+ candidateId: optionsArg.candidateId,
391
+ revision: optionsArg.revision,
392
+ index,
393
+ sha256: chunk.sha256,
394
+ bytes: chunk.bytes,
395
+ data: chunk.data.toString('base64'),
396
+ createdAt: optionsArg.createdAt,
397
+ ...identity,
398
+ });
399
+ });
400
+ const candidate = {
401
+ id: privateCandidateDocumentId(optionsArg.candidateId),
402
+ controllerId: owner.controllerId,
403
+ scopeId: owner.storageKey,
404
+ candidateId: optionsArg.candidateId,
405
+ revision: optionsArg.revision,
406
+ sha256: digest,
407
+ bytes,
408
+ chunks: chunks.map(({ id, sha256: chunkDigest, bytes: chunkBytes }, index) => ({
409
+ id, index, sha256: chunkDigest, bytes: chunkBytes,
410
+ })),
411
+ createdAt: optionsArg.createdAt,
412
+ ...identity,
413
+ };
414
+ assertFlexPrivateCandidateDocument(candidate);
415
+ for (const document of documents)
416
+ assertFlexPrivateChunkDocument(document);
417
+ return {
418
+ layout: { owner: key, runs, chunks, bytes, sha256: digest },
419
+ candidate,
420
+ chunks: documents,
421
+ minted,
422
+ };
423
+ }
424
+ catch (errorArg) {
425
+ for (const chunk of minted)
426
+ chunk.data.fill(0);
427
+ throw errorArg;
428
+ }
429
+ };
430
+ /** Marks the layout's chunks as held by one more cached snapshot. */
431
+ export const holdFlexPrivateLayout = (layoutArg) => {
432
+ for (const chunk of new Set(layoutArg.chunks))
433
+ chunk.holders += 1;
434
+ };
435
+ /**
436
+ * Ends one cached snapshot's hold on the layout: zeroes its own run frames and the chunks no
437
+ * layout holds now.
438
+ */
439
+ export const releaseFlexPrivateLayout = (layoutArg) => {
440
+ for (const chunk of new Set(layoutArg.chunks)) {
441
+ chunk.holders -= 1;
442
+ if (chunk.holders <= 0) {
443
+ chunk.holders = 0;
444
+ chunk.data.fill(0);
445
+ }
446
+ }
447
+ for (const run of layoutArg.runs) {
448
+ if (run.kind !== 'sliced')
449
+ continue;
450
+ run.head.fill(0);
451
+ run.tail.fill(0);
452
+ }
453
+ };
454
+ /** Zeroes the chunks no cached layout holds, such as those of a build that was not cached. */
455
+ export const discardFlexPrivateChunks = (chunksArg) => {
456
+ for (const chunk of chunksArg) {
457
+ if (chunk.holders === 0)
458
+ chunk.data.fill(0);
459
+ }
460
+ };
461
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb25zLmZsZXhwcml2YXRlc25hcHNob3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9mdW5jdGlvbnMuZmxleHByaXZhdGVzbmFwc2hvdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBSUwsa0NBQWtDLEVBQ2xDLDhCQUE4QixFQUM5QixxQkFBcUIsR0FDdEIsTUFBTSxpQ0FBaUMsQ0FBQztBQUV6Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUVILDJGQUEyRjtBQUMzRixNQUFNLFdBQVcsR0FBd0Q7SUFDdkUsVUFBVSxFQUFFLENBQUMsVUFBVSxFQUFFLG1CQUFtQixDQUFDO0NBQzlDLENBQUM7QUFFRjs7OztHQUlHO0FBQ0gsTUFBTSxhQUFhLEdBQTZDO0lBQzlELFdBQVcsRUFBRSxRQUFRO0NBQ3RCLENBQUM7QUFFRixnR0FBZ0c7QUFDaEcsTUFBTSxxQkFBcUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBRXhDLE1BQU0sTUFBTSxHQUFHLENBQUMsUUFBNkIsRUFBVSxFQUFFLENBQ3ZELE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFZckUsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxjQUFzQixFQUFVLEVBQUUsQ0FDM0UsMEJBQTBCLGNBQWMsRUFBRSxDQUFDO0FBRTdDOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLENBQ3BDLFFBQW1DLEVBQ25DLGNBQXNCLEVBQ2QsRUFBRSxDQUFDLHNCQUFzQixNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN2RCxRQUFRLENBQUMsWUFBWTtJQUNyQixRQUFRLENBQUMsVUFBVTtJQUNuQixRQUFRLENBQUMsTUFBTTtJQUNmLFFBQVEsQ0FBQyxTQUFTLElBQUksSUFBSTtJQUMxQixRQUFRLENBQUMsU0FBUyxJQUFJLElBQUk7SUFDMUIsUUFBUSxDQUFDLGFBQWE7SUFDdEIsY0FBYztDQUNmLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFFTixNQUFNLFFBQVEsR0FBRyxDQUFDLFFBQW1DLEVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDL0UsUUFBUSxDQUFDLFlBQVk7SUFDckIsUUFBUSxDQUFDLFVBQVU7SUFDbkIsUUFBUSxDQUFDLE1BQU07SUFDZixRQUFRLENBQUMsU0FBUyxJQUFJLElBQUk7SUFDMUIsUUFBUSxDQUFDLFNBQVMsSUFBSSxJQUFJO0lBQzFCLFFBQVEsQ0FBQyxhQUFhO0NBQ3ZCLENBQUMsQ0FBQztBQXNFSCxtR0FBbUc7QUFDbkcsTUFBTSxXQUFXLEdBQUcsQ0FBQyxXQUFtQixFQUFFLE1BQTBCLEVBQWtCLEVBQUU7SUFDdEYsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN0QyxNQUFNLEtBQUssR0FBRyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2xGLElBQUksTUFBTSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzVFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUN6RSxDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUNyRSxDQUFDLENBQUM7SUFDSCxPQUFPO1FBQ0wsSUFBSSxFQUFFLFFBQVE7UUFDZCxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUk7UUFDbEYsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFO1FBQ3JDLElBQUksRUFBRSxJQUFJO0tBQ1gsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLCtDQUErQztBQUMvQyxNQUFNLFlBQVksR0FBRyxDQUFDLFdBQW9CLEVBQUUsU0FBMEIsRUFBb0IsRUFBRTtJQUMxRixJQUFJLFdBQVcsS0FBSyxJQUFJLElBQUksT0FBTyxXQUFXLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUMxRixPQUFPLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFDRCxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzlDLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2RixNQUFNLElBQUksR0FBcUIsRUFBRSxDQUFDO0lBQ2xDLElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQztJQUNoQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7SUFDakIsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUN2RCxJQUFJLEtBQUssS0FBSyxTQUFTO1lBQUUsU0FBUztRQUNsQyxLQUFLLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUN0RCxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ2QsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2RSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyxLQUFLLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMzRCxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDbkQsS0FBSyxHQUFHLEdBQUcsQ0FBQztRQUNkLENBQUM7YUFBTSxDQUFDO1lBQ04sS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyxLQUFLLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMzRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMsQ0FBQztBQUVGLHNFQUFzRTtBQUN0RSxNQUFNLFlBQVksR0FBRyxDQUFDLE9BQTJCLEVBQUUsUUFBNEIsRUFBVSxFQUFFO0lBQ3pGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsT0FBTyxLQUFLLEdBQUcsS0FBSyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQUUsS0FBSyxFQUFFLENBQUM7SUFDcEUsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDLENBQUM7QUFVRixNQUFNLGFBQWEsR0FBRyxDQUFDLFNBQWlCLEVBQW1CLEVBQUUsQ0FBQyxDQUFDO0lBQzdELEtBQUssRUFBRSxTQUFTLENBQUMsVUFBVTtJQUMzQixJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUNuRCxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdELENBQUM7Q0FDRixDQUFDLENBQUM7QUFFSCw0RUFBNEU7QUFDNUUsTUFBTSxlQUFlLEdBQUcsQ0FBQyxNQUFzQixFQUFFLE9BQWUsRUFBRSxLQUFhLEVBQW1CLEVBQUUsQ0FBQyxDQUFDO0lBQ3BHLEtBQUssRUFBRSxLQUFLLEdBQUcsT0FBTztJQUN0QixJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyRCxJQUFJLE1BQU0sR0FBRyxPQUFPLEdBQUcsUUFBUSxDQUFDO1FBQ2hDLElBQUksTUFBTSxHQUFHLGVBQWUsQ0FBQztRQUM3QixPQUFPLE1BQU0sR0FBRyxPQUFPLEdBQUcsTUFBTSxFQUFFLENBQUM7WUFDakMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcscUJBQXFCLENBQUMsQ0FBQztZQUN6RCxNQUFNLE1BQU0sR0FBRyxNQUFNLEdBQUcsS0FBSyxHQUFHLHFCQUFxQixDQUFDO1lBQ3RELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxHQUFHLE1BQU0sR0FBRyxNQUFNLEVBQUUscUJBQXFCLEdBQUcsTUFBTSxDQUFDLENBQUM7WUFDbkYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQztZQUM1RSxNQUFNLElBQUksTUFBTSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxNQUFNLENBQUM7UUFDbkIsQ0FBQztJQUNILENBQUM7Q0FDRixDQUFDLENBQUM7QUFFSDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsR0FBRyxDQUNqQixXQUF1QyxFQUN2QyxTQUFzRSxFQUNoRSxFQUFFO0lBQ1IsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztJQUNqQixLQUFLLE1BQU0sT0FBTyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sVUFBVSxHQUFHLFFBQVEsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQzVDLE9BQU8sVUFBVSxHQUFHLFNBQVMsQ0FBQyxNQUFNLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBRSxDQUFDLEdBQUcsSUFBSSxRQUFRO1lBQUUsVUFBVSxFQUFFLENBQUM7UUFDN0YsS0FBSyxJQUFJLEtBQUssR0FBRyxVQUFVLEVBQUUsS0FBSyxHQUFHLFNBQVMsQ0FBQyxNQUFNLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBRSxDQUFDLEtBQUssR0FBRyxVQUFVLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUN2RyxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFFLENBQUM7WUFDaEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzdDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMzQyxJQUFJLElBQUksR0FBRyxFQUFFO2dCQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEdBQUcsUUFBUSxFQUFFLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQztRQUM5RixDQUFDO1FBQ0QsUUFBUSxHQUFHLFVBQVUsQ0FBQztJQUN4QixDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsMkZBQTJGO0FBQzNGLE1BQU0sUUFBUSxHQUFHLENBQUMsT0FBZSxFQUFVLEVBQUU7SUFDM0MsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzlELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzVCLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyxDQUFDO0FBRUYsTUFBTSxlQUFlLEdBQUcsQ0FDdEIsV0FBdUMsRUFDdkMsU0FBc0QsRUFDdEQsT0FBYyxFQUNFLEVBQUU7SUFDbEIsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUM5QyxNQUFNLFlBQVksR0FBRyxXQUFXLEVBQUUsSUFBSSxLQUFLLFNBQVMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsSUFBSSxFQUFFLEdBQUc7UUFDbEcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJO1FBQ2xCLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDZCxNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUUsa0dBQWtHO0lBQ2xHLE1BQU0saUJBQWlCLEdBQUcsV0FBVyxFQUFFLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDO0lBQzVELE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBRSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztJQUM3RSxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7SUFDM0IsS0FBSyxJQUFJLEtBQUssR0FBRyxJQUFJLEVBQUUsS0FBSyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUN2RCxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLE1BQU0sRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDMUcsQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsaUJBQWlCLENBQUM7SUFDbEQsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFDO0lBQzFCLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxJQUFJLEVBQUUsS0FBSyxFQUFFO1FBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBRSxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQ3pGLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxHQUFHLGlCQUFpQixDQUFDO0lBQzNELEtBQUssTUFBTSxLQUFLLElBQUksS0FBSyxFQUFFLENBQUM7UUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUM7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7SUFFdkMsNEZBQTRGO0lBQzVGLElBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztJQUN6QyxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFDaEIsSUFBSSxXQUFXLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ25FLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ2hFLE1BQU0sYUFBYSxHQUFHLFlBQVk7WUFDaEMsQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsTUFBTSxJQUFJLElBQUksS0FBSyxZQUFZLENBQUMsT0FBTyxDQUFDLE1BQU07WUFDakUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDO1FBQ25FLE9BQU8sR0FBRyxhQUFhLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0lBQzdFLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7SUFDcEUsTUFBTSxNQUFNLEdBQXlDLEVBQUUsQ0FBQztJQUN4RCxNQUFNLE1BQU0sR0FBdUUsRUFBRSxDQUFDO0lBQ3RGLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUMzQyxNQUFNLEtBQUssR0FBRyxLQUFLLEdBQUcscUJBQXFCLENBQUM7UUFDNUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcscUJBQXFCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDM0QsTUFBTSxhQUFhLEdBQUcsV0FBVyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqRCxJQUNFLGFBQWE7ZUFDVixLQUFLLElBQUksU0FBUztlQUNsQixHQUFHLElBQUksT0FBTztlQUNkLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLHFCQUFxQixFQUFFLFdBQVksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEVBQ3RFLENBQUM7WUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzdCLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0RSxDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN0QixVQUFVLENBQUM7WUFDVCxhQUFhLENBQUMsSUFBSSxDQUFDO1lBQ25CLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxXQUFZLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2hGLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUM7WUFDM0IsYUFBYSxDQUFDLElBQUksQ0FBQztTQUNwQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ1gsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNO1lBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFDRCxLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUs7UUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLE9BQU87UUFDTCxJQUFJLEVBQUUsUUFBUTtRQUNkLElBQUk7UUFDSixHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMvRSxJQUFJO1FBQ0osS0FBSztRQUNMLE1BQU0sRUFBRSxNQUE2QjtLQUN0QyxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsbUdBQW1HO0FBQ25HLE1BQU0sWUFBWSxHQUFHLENBQUMsU0FBc0MsRUFBRSxRQUFnQixFQUFVLEVBQUU7SUFDeEYsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ1osSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDaEMsT0FBTyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDbEIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUUsQ0FBQyxLQUFLLElBQUksUUFBUTtZQUFFLEdBQUcsR0FBRyxNQUFNLENBQUM7O1lBQ2xELElBQUksR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMsQ0FBQztBQUVGLE1BQU0sTUFBTSxHQUFHLENBQUMsUUFBMkIsRUFBRSxRQUFnQixFQUFVLEVBQUU7SUFDdkUsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNwQyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDZixLQUFLLE1BQU0sSUFBSSxJQUFJLFFBQVE7UUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDL0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDLENBQUM7QUFFRixNQUFNLGVBQWUsR0FBRyxDQUN0QixXQUF1QyxFQUN2QyxTQUFzRCxFQUN0RCxPQUFjLEVBQ0UsRUFBRTtJQUNsQixNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxRSxJQUFJLFdBQVcsSUFBSSxJQUFJLEtBQUssT0FBTyxDQUFDLE1BQU0sSUFBSSxJQUFJLEtBQUssV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsRixPQUFPLEVBQUUsR0FBRyxXQUFXLEVBQUUsT0FBTyxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUNELDhGQUE4RjtJQUM5RiwyRkFBMkY7SUFDM0Ysc0ZBQXNGO0lBQ3RGLE1BQU0sTUFBTSxHQUF1QixFQUFFLENBQUM7SUFDdEMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCLElBQUksWUFBMEMsQ0FBQztJQUMvQyxJQUFJLFdBQVcsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDNUIsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNELE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFFLENBQUM7UUFDM0MsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6RCxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3JELE9BQU8sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3RCLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDdkIsQ0FBQztJQUNILENBQUM7SUFDRCxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzVFLElBQUksT0FBTyxHQUFhLEVBQUUsQ0FBQztJQUMzQixJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7SUFDckIsSUFBSSxZQUFZLEdBQUcsT0FBTyxDQUFDO0lBQzNCLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUMzQixNQUFNLEtBQUssR0FBRyxDQUFDLE1BQWMsRUFBUSxFQUFFO1FBQ3JDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTztRQUNqQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ1YsS0FBSyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQzdDLEtBQUssRUFBRSxZQUFZO1lBQ25CLEdBQUcsRUFBRSxNQUFNO1lBQ1gsTUFBTSxFQUFFLEtBQUs7U0FDZCxDQUFDLENBQUM7UUFDSCxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUNuQixDQUFDLENBQUM7SUFDRixJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFDbkIsS0FBSyxJQUFJLEtBQUssR0FBRyxPQUFPLEVBQUUsS0FBSyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUMxRCxJQUFJLEtBQWEsQ0FBQztRQUNsQixJQUFJLEtBQUssR0FBRyxJQUFJLEVBQUUsQ0FBQztZQUNqQixNQUFNLE1BQU0sR0FBRyxXQUFZLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBRSxDQUFDO1lBQy9DLEtBQUssR0FBRyxZQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLFVBQVUsR0FBRyxNQUFNLENBQUMsQ0FBQztZQUMzRSxVQUFVLElBQUksTUFBTSxDQUFDO1FBQ3ZCLENBQUM7YUFBTSxDQUFDO1lBQ04sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDMUYsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbEMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQixDQUFDO1FBQ0QsSUFBSSxZQUFZLEdBQUcsQ0FBQyxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUMsVUFBVSxHQUFHLHFCQUFxQjtZQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5RixJQUFJLEtBQUssQ0FBQyxVQUFVLElBQUkscUJBQXFCLEdBQUcsWUFBWSxFQUFFLENBQUM7WUFDN0QsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUM7Z0JBQUUsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUMvQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BCLFlBQVksSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDO1lBQ2pDLFNBQVM7UUFDWCxDQUFDO1FBQ0QsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2IsS0FBSyxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLEtBQUssQ0FBQyxVQUFVLEVBQUUsTUFBTSxJQUFJLHFCQUFxQixFQUFFLENBQUM7WUFDaEYsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDVixLQUFLLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FDbkIsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxxQkFBcUIsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUNwRixJQUFJLENBQUMsR0FBRyxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLENBQzNELENBQUM7Z0JBQ0YsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osR0FBRyxFQUFFLEtBQUssR0FBRyxDQUFDO2dCQUNkLE1BQU0sRUFBRSxJQUFJO2FBQ2IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFDRCxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RCLEtBQUssTUFBTSxLQUFLLElBQUksS0FBSztRQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekMsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUM3RSxDQUFDLENBQUM7QUEwQkYsMEZBQTBGO0FBQzFGLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLENBQ3RDLFVBQTRDLEVBQ2pCLEVBQUU7SUFDN0IsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztJQUMvQixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUIsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLFFBQVEsRUFBRSxLQUFLLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDdEYsTUFBTSxNQUFNLEdBQXdCLEVBQUUsQ0FBQztJQUN2QyxNQUFNLElBQUksR0FBVSxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzlCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQixNQUFNLEtBQUssR0FBc0I7WUFDL0IsRUFBRSxFQUFFLHNCQUFzQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUM7WUFDekMsTUFBTSxFQUFFLE1BQU07WUFDZCxLQUFLLEVBQUUsT0FBTyxDQUFDLFVBQVU7WUFDekIsSUFBSSxFQUFFLE9BQU87WUFDYixPQUFPLEVBQUUsQ0FBQztTQUNYLENBQUM7UUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25CLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0lBQ0YsSUFBSSxDQUFDO1FBQ0gsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQTBCLENBQUM7UUFDekQsTUFBTSxjQUFjLEdBQXFCLEVBQUUsQ0FBQztRQUM1QyxLQUFLLE1BQU0sR0FBRyxJQUFJLFFBQVEsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLENBQUM7WUFDdkMsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVE7Z0JBQUUsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztnQkFDdkQsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQW1CLEVBQUUsQ0FBQyxDQUM1RixNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVE7WUFDdEIsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDO1lBQy9ELENBQUMsQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUNqRSxDQUFDLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUNuQyxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FDNUUsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RCw0RkFBNEY7UUFDNUYsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QixLQUFLLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQztRQUN2QixDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxNQUFNLFFBQVEsR0FBRztZQUNmLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtZQUNwQixhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWE7WUFDbEMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN4RSxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ3pFLENBQUM7UUFDRixNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixNQUFNLFNBQVMsR0FBZ0MsRUFBRSxDQUFDO1FBQ2xELE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksVUFBVSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFBRSxPQUFPO1lBQ3hFLFNBQVMsQ0FBQyxJQUFJLENBQUM7Z0JBQ2IsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFO2dCQUNaLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtnQkFDaEMsT0FBTyxFQUFFLEtBQUssQ0FBQyxVQUFVO2dCQUN6QixXQUFXLEVBQUUsVUFBVSxDQUFDLFdBQVc7Z0JBQ25DLFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUTtnQkFDN0IsS0FBSztnQkFDTCxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07Z0JBQ3BCLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztnQkFDbEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztnQkFDbkMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTO2dCQUMvQixHQUFHLFFBQVE7YUFDWixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sU0FBUyxHQUFrQztZQUMvQyxFQUFFLEVBQUUsMEJBQTBCLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztZQUN0RCxZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVk7WUFDaEMsT0FBTyxFQUFFLEtBQUssQ0FBQyxVQUFVO1lBQ3pCLFdBQVcsRUFBRSxVQUFVLENBQUMsV0FBVztZQUNuQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVE7WUFDN0IsTUFBTSxFQUFFLE1BQU07WUFDZCxLQUFLO1lBQ0wsTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQzdFLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsVUFBVTthQUNsRCxDQUFDLENBQUM7WUFDSCxTQUFTLEVBQUUsVUFBVSxDQUFDLFNBQVM7WUFDL0IsR0FBRyxRQUFRO1NBQ1osQ0FBQztRQUNGLGtDQUFrQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlDLEtBQUssTUFBTSxRQUFRLElBQUksU0FBUztZQUFFLDhCQUE4QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNFLE9BQU87WUFDTCxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUU7WUFDM0QsU0FBUztZQUNULE1BQU0sRUFBRSxTQUFTO1lBQ2pCLE1BQU07U0FDUCxDQUFDO0lBQ0osQ0FBQztJQUFDLE9BQU8sUUFBUSxFQUFFLENBQUM7UUFDbEIsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNO1lBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0MsTUFBTSxRQUFRLENBQUM7SUFDakIsQ0FBQztBQUNILENBQUMsQ0FBQztBQUVGLHFFQUFxRTtBQUNyRSxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLFNBQTZCLEVBQVEsRUFBRTtJQUMzRSxLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFBRSxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQztBQUNwRSxDQUFDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLFNBQTZCLEVBQVEsRUFBRTtJQUM5RSxLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQzlDLEtBQUssQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDO1FBQ25CLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN2QixLQUFLLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztZQUNsQixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUNELEtBQUssTUFBTSxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pDLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRO1lBQUUsU0FBUztRQUNwQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsOEZBQThGO0FBQzlGLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLENBQUMsU0FBdUMsRUFBUSxFQUFFO0lBQ3hGLEtBQUssTUFBTSxLQUFLLElBQUksU0FBUyxFQUFFLENBQUM7UUFDOUIsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLENBQUM7WUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0FBQ0gsQ0FBQyxDQUFDIn0=
@@ -3,9 +3,10 @@ import type { IAglProxyStatus } from './classes.proxycontrol.js';
3
3
  type TAccountPlacementKey = 'lifecycle' | 'lapsesAt' | 'placementScore' | 'placementRank' | 'lastResort';
4
4
  /**
5
5
  * The status a running proxy answers with: one started from an AGL before 38.3.0 reports no accounts and no usage
6
- * observations, and one before 38.4.0 no lifecycle, placement or placement journal.
6
+ * observations, one before 38.4.0 no lifecycle, placement or placement journal, and one before confined runs neither
7
+ * its confined listener nor its runs.
7
8
  */
8
- export type TReportedProxyStatus = Omit<IAglProxyStatus, 'accounts' | 'usageObservations' | 'nextPlacement' | 'recentPlacements'> & Partial<Pick<IAglProxyStatus, 'usageObservations' | 'nextPlacement' | 'recentPlacements'>> & {
9
+ export type TReportedProxyStatus = Omit<IAglProxyStatus, 'accounts' | 'usageObservations' | 'nextPlacement' | 'recentPlacements' | 'confinedSocketPath' | 'confinedRuns'> & Partial<Pick<IAglProxyStatus, 'usageObservations' | 'nextPlacement' | 'recentPlacements' | 'confinedSocketPath' | 'confinedRuns'>> & {
9
10
  accounts?: Array<Omit<IAglProxyStatus['accounts'][number], TAccountPlacementKey> & Partial<Pick<IAglProxyStatus['accounts'][number], TAccountPlacementKey>>>;
10
11
  };
11
12
  export declare const formatProxyStatus: (unitArg: string, statusArg: TReportedProxyStatus | undefined) => string;