@principles/core 1.240.7 → 1.240.8

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.
@@ -0,0 +1,530 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { join } from 'path';
3
+ import { mkdirSync, rmSync } from 'fs';
4
+ import { isValidLifecycleTransition, getAllowedTransitions, addPrincipleToLedger, updatePrinciple, createRule, createImplementation, updateRule, deleteRule, updateImplementation, deleteImplementation, transitionImplementationState, listImplementationsForRule, findActiveImplementation, listRuleImplementationsByState, getPrincipleSubtree, loadLedger, } from './principle-tree-ledger.js';
5
+ // ---------------------------------------------------------------------------
6
+ // Factory helpers
7
+ // ---------------------------------------------------------------------------
8
+ function makePrinciple(overrides = {}) {
9
+ return {
10
+ id: 'p-1',
11
+ version: 1,
12
+ text: 'Test principle',
13
+ triggerPattern: 'always',
14
+ action: 'enforce',
15
+ status: 'active',
16
+ priority: 'P1',
17
+ scope: 'general',
18
+ evaluability: 'manual_only',
19
+ valueScore: 0.5,
20
+ adherenceRate: 0.8,
21
+ painPreventedCount: 0,
22
+ derivedFromPainIds: [],
23
+ ruleIds: [],
24
+ conflictsWithPrincipleIds: [],
25
+ createdAt: '2026-01-01T00:00:00.000Z',
26
+ updatedAt: '2026-01-01T00:00:00.000Z',
27
+ ...overrides,
28
+ };
29
+ }
30
+ function makeRule(overrides = {}) {
31
+ return {
32
+ id: 'r-1',
33
+ principleId: 'p-1',
34
+ implementationIds: [],
35
+ ...overrides,
36
+ };
37
+ }
38
+ function makeImplementation(overrides = {}) {
39
+ return {
40
+ id: 'impl-1',
41
+ ruleId: 'r-1',
42
+ lifecycleState: 'candidate',
43
+ ...overrides,
44
+ };
45
+ }
46
+ // ---------------------------------------------------------------------------
47
+ // Temp directory helper
48
+ // ---------------------------------------------------------------------------
49
+ let tmpDir;
50
+ beforeEach(() => {
51
+ tmpDir = join(process.cwd(), 'tmp-test-ledger-lifecycle-' + Date.now());
52
+ mkdirSync(tmpDir, { recursive: true });
53
+ });
54
+ afterEach(() => {
55
+ try {
56
+ rmSync(tmpDir, { recursive: true, force: true });
57
+ }
58
+ catch {
59
+ // Best-effort cleanup
60
+ }
61
+ });
62
+ // ---------------------------------------------------------------------------
63
+ // 1. Pure lifecycle transition tests
64
+ // ---------------------------------------------------------------------------
65
+ describe('isValidLifecycleTransition', () => {
66
+ it('allows candidate → active', () => {
67
+ expect(isValidLifecycleTransition('candidate', 'active')).toBe(true);
68
+ });
69
+ it('allows candidate → archived', () => {
70
+ expect(isValidLifecycleTransition('candidate', 'archived')).toBe(true);
71
+ });
72
+ it('allows active → disabled', () => {
73
+ expect(isValidLifecycleTransition('active', 'disabled')).toBe(true);
74
+ });
75
+ it('allows active → archived', () => {
76
+ expect(isValidLifecycleTransition('active', 'archived')).toBe(true);
77
+ });
78
+ it('allows disabled → active', () => {
79
+ expect(isValidLifecycleTransition('disabled', 'active')).toBe(true);
80
+ });
81
+ it('allows disabled → archived', () => {
82
+ expect(isValidLifecycleTransition('disabled', 'archived')).toBe(true);
83
+ });
84
+ it('rejects candidate → candidate (self-loop)', () => {
85
+ expect(isValidLifecycleTransition('candidate', 'candidate')).toBe(false);
86
+ });
87
+ it('rejects candidate → disabled', () => {
88
+ expect(isValidLifecycleTransition('candidate', 'disabled')).toBe(false);
89
+ });
90
+ it('rejects active → candidate', () => {
91
+ expect(isValidLifecycleTransition('active', 'candidate')).toBe(false);
92
+ });
93
+ it('rejects active → active (self-loop)', () => {
94
+ expect(isValidLifecycleTransition('active', 'active')).toBe(false);
95
+ });
96
+ it('rejects disabled → candidate', () => {
97
+ expect(isValidLifecycleTransition('disabled', 'candidate')).toBe(false);
98
+ });
99
+ it('rejects disabled → disabled (self-loop)', () => {
100
+ expect(isValidLifecycleTransition('disabled', 'disabled')).toBe(false);
101
+ });
102
+ it('rejects all transitions from archived (terminal state)', () => {
103
+ expect(isValidLifecycleTransition('archived', 'candidate')).toBe(false);
104
+ expect(isValidLifecycleTransition('archived', 'active')).toBe(false);
105
+ expect(isValidLifecycleTransition('archived', 'disabled')).toBe(false);
106
+ expect(isValidLifecycleTransition('archived', 'archived')).toBe(false);
107
+ });
108
+ });
109
+ describe('getAllowedTransitions', () => {
110
+ it('returns [active, archived] for candidate', () => {
111
+ expect(getAllowedTransitions('candidate')).toEqual(['active', 'archived']);
112
+ });
113
+ it('returns [disabled, archived] for active', () => {
114
+ expect(getAllowedTransitions('active')).toEqual(['disabled', 'archived']);
115
+ });
116
+ it('returns [active, archived] for disabled', () => {
117
+ expect(getAllowedTransitions('disabled')).toEqual(['active', 'archived']);
118
+ });
119
+ it('returns [] for archived', () => {
120
+ expect(getAllowedTransitions('archived')).toEqual([]);
121
+ });
122
+ });
123
+ // ---------------------------------------------------------------------------
124
+ // 2. CRUD operations
125
+ // ---------------------------------------------------------------------------
126
+ describe('addPrincipleToLedger', () => {
127
+ it('adds a principle and returns it', () => {
128
+ const p = makePrinciple();
129
+ const result = addPrincipleToLedger(tmpDir, p);
130
+ expect(result.id).toBe('p-1');
131
+ const ledger = loadLedger(tmpDir);
132
+ expect(ledger.tree.principles['p-1']).toBeDefined();
133
+ const principle = ledger.tree.principles['p-1'];
134
+ if (!principle)
135
+ throw new Error('Expected non-null principle');
136
+ expect(principle.id).toBe('p-1');
137
+ });
138
+ });
139
+ describe('updatePrinciple', () => {
140
+ it('updates fields on an existing principle', () => {
141
+ addPrincipleToLedger(tmpDir, makePrinciple());
142
+ const updated = updatePrinciple(tmpDir, 'p-1', { text: 'Updated text', priority: 'P0' });
143
+ expect(updated.text).toBe('Updated text');
144
+ expect(updated.priority).toBe('P0');
145
+ expect(updated.id).toBe('p-1');
146
+ });
147
+ it('preserves fields not in updates', () => {
148
+ addPrincipleToLedger(tmpDir, makePrinciple());
149
+ const updated = updatePrinciple(tmpDir, 'p-1', { text: 'New text' });
150
+ expect(updated.scope).toBe('general');
151
+ expect(updated.ruleIds).toEqual([]);
152
+ });
153
+ it('deduplicates ruleIds', () => {
154
+ addPrincipleToLedger(tmpDir, makePrinciple());
155
+ const updated = updatePrinciple(tmpDir, 'p-1', { ruleIds: ['r-1', 'r-1', 'r-2'] });
156
+ expect(updated.ruleIds).toEqual(['r-1', 'r-2']);
157
+ });
158
+ it('throws when principle does not exist', () => {
159
+ expect(() => updatePrinciple(tmpDir, 'nonexistent', { text: 'x' })).toThrow(/Cannot update missing principle/);
160
+ });
161
+ });
162
+ describe('createRule', () => {
163
+ it('creates a rule and adds it to the parent principle ruleIds', () => {
164
+ addPrincipleToLedger(tmpDir, makePrinciple());
165
+ const rule = makeRule();
166
+ const result = createRule(tmpDir, rule);
167
+ expect(result.id).toBe('r-1');
168
+ expect(result.principleId).toBe('p-1');
169
+ const ledger = loadLedger(tmpDir);
170
+ expect(ledger.tree.rules['r-1']).toBeDefined();
171
+ const principle = ledger.tree.principles['p-1'];
172
+ if (!principle)
173
+ throw new Error('Expected non-null principle');
174
+ expect(principle.ruleIds).toContain('r-1');
175
+ });
176
+ it('deduplicates implementationIds', () => {
177
+ addPrincipleToLedger(tmpDir, makePrinciple());
178
+ const rule = makeRule({ implementationIds: ['a', 'a', 'b'] });
179
+ const result = createRule(tmpDir, rule);
180
+ expect(result.implementationIds).toEqual(['a', 'b']);
181
+ });
182
+ });
183
+ describe('createImplementation', () => {
184
+ it('creates an implementation and adds it to the parent rule implementationIds', () => {
185
+ addPrincipleToLedger(tmpDir, makePrinciple());
186
+ createRule(tmpDir, makeRule());
187
+ const impl = makeImplementation();
188
+ const result = createImplementation(tmpDir, impl);
189
+ expect(result.id).toBe('impl-1');
190
+ expect(result.ruleId).toBe('r-1');
191
+ const ledger = loadLedger(tmpDir);
192
+ expect(ledger.tree.implementations['impl-1']).toBeDefined();
193
+ const rule = ledger.tree.rules['r-1'];
194
+ if (!rule)
195
+ throw new Error('Expected non-null rule');
196
+ expect(rule.implementationIds).toContain('impl-1');
197
+ });
198
+ });
199
+ describe('updateRule', () => {
200
+ it('updates fields on an existing rule', () => {
201
+ addPrincipleToLedger(tmpDir, makePrinciple());
202
+ createRule(tmpDir, makeRule());
203
+ const updated = updateRule(tmpDir, 'r-1', { name: 'Updated rule' });
204
+ expect(updated.name).toBe('Updated rule');
205
+ expect(updated.id).toBe('r-1');
206
+ });
207
+ it('supports cross-principle migration (moves ruleIds)', () => {
208
+ addPrincipleToLedger(tmpDir, makePrinciple({ id: 'p-1' }));
209
+ addPrincipleToLedger(tmpDir, makePrinciple({ id: 'p-2' }));
210
+ createRule(tmpDir, makeRule({ id: 'r-1', principleId: 'p-1' }));
211
+ const updated = updateRule(tmpDir, 'r-1', { principleId: 'p-2' });
212
+ expect(updated.principleId).toBe('p-2');
213
+ const ledger = loadLedger(tmpDir);
214
+ const p1 = ledger.tree.principles['p-1'];
215
+ if (!p1)
216
+ throw new Error('Expected non-null principle p-1');
217
+ expect(p1.ruleIds).not.toContain('r-1');
218
+ const p2 = ledger.tree.principles['p-2'];
219
+ if (!p2)
220
+ throw new Error('Expected non-null principle p-2');
221
+ expect(p2.ruleIds).toContain('r-1');
222
+ });
223
+ it('throws when rule does not exist', () => {
224
+ expect(() => updateRule(tmpDir, 'nonexistent', { name: 'x' })).toThrow(/Cannot update missing rule/);
225
+ });
226
+ it('throws when target principle does not exist', () => {
227
+ addPrincipleToLedger(tmpDir, makePrinciple());
228
+ createRule(tmpDir, makeRule());
229
+ expect(() => updateRule(tmpDir, 'r-1', { principleId: 'ghost' })).toThrow(/Cannot move rule.*missing principle/);
230
+ });
231
+ });
232
+ describe('deleteRule', () => {
233
+ it('deletes the rule and removes it from parent principle ruleIds', () => {
234
+ addPrincipleToLedger(tmpDir, makePrinciple());
235
+ createRule(tmpDir, makeRule());
236
+ const deleted = deleteRule(tmpDir, 'r-1');
237
+ expect(deleted).toBeDefined();
238
+ if (!deleted)
239
+ throw new Error('Expected non-null deleted');
240
+ expect(deleted.id).toBe('r-1');
241
+ const ledger = loadLedger(tmpDir);
242
+ expect(ledger.tree.rules['r-1']).toBeUndefined();
243
+ const principle = ledger.tree.principles['p-1'];
244
+ if (!principle)
245
+ throw new Error('Expected non-null principle');
246
+ expect(principle.ruleIds).not.toContain('r-1');
247
+ });
248
+ it('cascade deletes implementations', () => {
249
+ addPrincipleToLedger(tmpDir, makePrinciple());
250
+ createRule(tmpDir, makeRule());
251
+ createImplementation(tmpDir, makeImplementation({ id: 'impl-1' }));
252
+ createImplementation(tmpDir, makeImplementation({ id: 'impl-2' }));
253
+ deleteRule(tmpDir, 'r-1');
254
+ const ledger = loadLedger(tmpDir);
255
+ expect(ledger.tree.implementations['impl-1']).toBeUndefined();
256
+ expect(ledger.tree.implementations['impl-2']).toBeUndefined();
257
+ });
258
+ it('returns undefined when rule does not exist', () => {
259
+ const result = deleteRule(tmpDir, 'nonexistent');
260
+ expect(result).toBeUndefined();
261
+ });
262
+ });
263
+ describe('updateImplementation', () => {
264
+ it('updates fields on an existing implementation', () => {
265
+ addPrincipleToLedger(tmpDir, makePrinciple());
266
+ createRule(tmpDir, makeRule());
267
+ createImplementation(tmpDir, makeImplementation());
268
+ const updated = updateImplementation(tmpDir, 'impl-1', { version: '2.0' });
269
+ expect(updated.version).toBe('2.0');
270
+ expect(updated.id).toBe('impl-1');
271
+ });
272
+ it('supports cross-rule migration (moves implementationIds)', () => {
273
+ addPrincipleToLedger(tmpDir, makePrinciple());
274
+ createRule(tmpDir, makeRule({ id: 'r-1' }));
275
+ createRule(tmpDir, makeRule({ id: 'r-2' }));
276
+ createImplementation(tmpDir, makeImplementation({ id: 'impl-1', ruleId: 'r-1' }));
277
+ const updated = updateImplementation(tmpDir, 'impl-1', { ruleId: 'r-2' });
278
+ expect(updated.ruleId).toBe('r-2');
279
+ const ledger = loadLedger(tmpDir);
280
+ const r1 = ledger.tree.rules['r-1'];
281
+ if (!r1)
282
+ throw new Error('Expected non-null rule r-1');
283
+ expect(r1.implementationIds).not.toContain('impl-1');
284
+ const r2 = ledger.tree.rules['r-2'];
285
+ if (!r2)
286
+ throw new Error('Expected non-null rule r-2');
287
+ expect(r2.implementationIds).toContain('impl-1');
288
+ });
289
+ it('throws when implementation does not exist', () => {
290
+ expect(() => updateImplementation(tmpDir, 'nonexistent', { version: '1' })).toThrow(/Cannot update missing implementation/);
291
+ });
292
+ it('throws when target rule does not exist', () => {
293
+ addPrincipleToLedger(tmpDir, makePrinciple());
294
+ createRule(tmpDir, makeRule());
295
+ createImplementation(tmpDir, makeImplementation());
296
+ expect(() => updateImplementation(tmpDir, 'impl-1', { ruleId: 'ghost' })).toThrow(/Cannot move implementation.*missing rule/);
297
+ });
298
+ });
299
+ describe('deleteImplementation', () => {
300
+ it('deletes the implementation and removes it from parent rule implementationIds', () => {
301
+ addPrincipleToLedger(tmpDir, makePrinciple());
302
+ createRule(tmpDir, makeRule());
303
+ createImplementation(tmpDir, makeImplementation());
304
+ const deleted = deleteImplementation(tmpDir, 'impl-1');
305
+ expect(deleted).toBeDefined();
306
+ if (!deleted)
307
+ throw new Error('Expected non-null deleted');
308
+ expect(deleted.id).toBe('impl-1');
309
+ const ledger = loadLedger(tmpDir);
310
+ expect(ledger.tree.implementations['impl-1']).toBeUndefined();
311
+ const rule = ledger.tree.rules['r-1'];
312
+ if (!rule)
313
+ throw new Error('Expected non-null rule');
314
+ expect(rule.implementationIds).not.toContain('impl-1');
315
+ });
316
+ it('returns undefined when implementation does not exist', () => {
317
+ const result = deleteImplementation(tmpDir, 'nonexistent');
318
+ expect(result).toBeUndefined();
319
+ });
320
+ });
321
+ // ---------------------------------------------------------------------------
322
+ // 3. Lifecycle state machine tests
323
+ // ---------------------------------------------------------------------------
324
+ describe('transitionImplementationState', () => {
325
+ function setupWithCandidate() {
326
+ addPrincipleToLedger(tmpDir, makePrinciple());
327
+ createRule(tmpDir, makeRule());
328
+ createImplementation(tmpDir, makeImplementation({ lifecycleState: 'candidate' }));
329
+ return tmpDir;
330
+ }
331
+ it('transitions candidate → active', () => {
332
+ setupWithCandidate();
333
+ const result = transitionImplementationState(tmpDir, 'impl-1', 'active');
334
+ expect(result.lifecycleState).toBe('active');
335
+ });
336
+ it('transitions candidate → archived', () => {
337
+ setupWithCandidate();
338
+ const result = transitionImplementationState(tmpDir, 'impl-1', 'archived');
339
+ expect(result.lifecycleState).toBe('archived');
340
+ });
341
+ it('transitions active → disabled', () => {
342
+ setupWithCandidate();
343
+ transitionImplementationState(tmpDir, 'impl-1', 'active');
344
+ const result = transitionImplementationState(tmpDir, 'impl-1', 'disabled');
345
+ expect(result.lifecycleState).toBe('disabled');
346
+ });
347
+ it('transitions active → archived', () => {
348
+ setupWithCandidate();
349
+ transitionImplementationState(tmpDir, 'impl-1', 'active');
350
+ const result = transitionImplementationState(tmpDir, 'impl-1', 'archived');
351
+ expect(result.lifecycleState).toBe('archived');
352
+ });
353
+ it('transitions disabled → active', () => {
354
+ setupWithCandidate();
355
+ transitionImplementationState(tmpDir, 'impl-1', 'active');
356
+ transitionImplementationState(tmpDir, 'impl-1', 'disabled');
357
+ const result = transitionImplementationState(tmpDir, 'impl-1', 'active');
358
+ expect(result.lifecycleState).toBe('active');
359
+ });
360
+ it('transitions disabled → archived', () => {
361
+ setupWithCandidate();
362
+ transitionImplementationState(tmpDir, 'impl-1', 'active');
363
+ transitionImplementationState(tmpDir, 'impl-1', 'disabled');
364
+ const result = transitionImplementationState(tmpDir, 'impl-1', 'archived');
365
+ expect(result.lifecycleState).toBe('archived');
366
+ });
367
+ it('treats undefined lifecycleState as candidate', () => {
368
+ addPrincipleToLedger(tmpDir, makePrinciple());
369
+ createRule(tmpDir, makeRule());
370
+ // Implementation without explicit lifecycleState
371
+ createImplementation(tmpDir, { id: 'impl-1', ruleId: 'r-1' });
372
+ const result = transitionImplementationState(tmpDir, 'impl-1', 'active');
373
+ expect(result.lifecycleState).toBe('active');
374
+ });
375
+ it('throws on invalid transition candidate → disabled', () => {
376
+ setupWithCandidate();
377
+ expect(() => transitionImplementationState(tmpDir, 'impl-1', 'disabled')).toThrow(/Invalid lifecycle transition/);
378
+ });
379
+ it('throws on transition from archived (terminal)', () => {
380
+ setupWithCandidate();
381
+ transitionImplementationState(tmpDir, 'impl-1', 'archived');
382
+ expect(() => transitionImplementationState(tmpDir, 'impl-1', 'active')).toThrow(/Invalid lifecycle transition.*none \(terminal state\)/);
383
+ });
384
+ it('throws when implementation does not exist', () => {
385
+ expect(() => transitionImplementationState(tmpDir, 'ghost', 'active')).toThrow(/Implementation not found/);
386
+ });
387
+ });
388
+ describe('listRuleImplementationsByState', () => {
389
+ it('returns only implementations matching the given state', () => {
390
+ addPrincipleToLedger(tmpDir, makePrinciple());
391
+ createRule(tmpDir, makeRule({ implementationIds: [] }));
392
+ createImplementation(tmpDir, makeImplementation({ id: 'impl-a', lifecycleState: 'candidate' }));
393
+ createImplementation(tmpDir, makeImplementation({ id: 'impl-b', lifecycleState: 'active' }));
394
+ createImplementation(tmpDir, makeImplementation({ id: 'impl-c', lifecycleState: 'disabled' }));
395
+ const candidates = listRuleImplementationsByState(tmpDir, 'r-1', 'candidate');
396
+ expect(candidates).toHaveLength(1);
397
+ const [candidate] = candidates;
398
+ if (!candidate)
399
+ throw new Error('Expected non-null candidate');
400
+ expect(candidate.id).toBe('impl-a');
401
+ const actives = listRuleImplementationsByState(tmpDir, 'r-1', 'active');
402
+ expect(actives).toHaveLength(1);
403
+ const [active] = actives;
404
+ if (!active)
405
+ throw new Error('Expected non-null active');
406
+ expect(active.id).toBe('impl-b');
407
+ const disableds = listRuleImplementationsByState(tmpDir, 'r-1', 'disabled');
408
+ expect(disableds).toHaveLength(1);
409
+ const [disabled] = disableds;
410
+ if (!disabled)
411
+ throw new Error('Expected non-null disabled');
412
+ expect(disabled.id).toBe('impl-c');
413
+ expect(listRuleImplementationsByState(tmpDir, 'r-1', 'archived')).toHaveLength(0);
414
+ });
415
+ it('treats undefined lifecycleState as candidate', () => {
416
+ addPrincipleToLedger(tmpDir, makePrinciple());
417
+ createRule(tmpDir, makeRule({ implementationIds: [] }));
418
+ createImplementation(tmpDir, { id: 'impl-x', ruleId: 'r-1' });
419
+ const candidates = listRuleImplementationsByState(tmpDir, 'r-1', 'candidate');
420
+ expect(candidates).toHaveLength(1);
421
+ const [candidate] = candidates;
422
+ if (!candidate)
423
+ throw new Error('Expected non-null candidate');
424
+ expect(candidate.id).toBe('impl-x');
425
+ });
426
+ });
427
+ describe('findActiveImplementation', () => {
428
+ it('returns the active implementation for a rule', () => {
429
+ addPrincipleToLedger(tmpDir, makePrinciple());
430
+ createRule(tmpDir, makeRule({ implementationIds: [] }));
431
+ createImplementation(tmpDir, makeImplementation({ id: 'impl-a', lifecycleState: 'candidate' }));
432
+ createImplementation(tmpDir, makeImplementation({ id: 'impl-b', lifecycleState: 'active' }));
433
+ const active = findActiveImplementation(tmpDir, 'r-1');
434
+ expect(active).not.toBeNull();
435
+ if (!active)
436
+ throw new Error('Expected non-null active');
437
+ expect(active.id).toBe('impl-b');
438
+ });
439
+ it('returns null when no active implementation exists', () => {
440
+ addPrincipleToLedger(tmpDir, makePrinciple());
441
+ createRule(tmpDir, makeRule({ implementationIds: [] }));
442
+ createImplementation(tmpDir, makeImplementation({ id: 'impl-a', lifecycleState: 'candidate' }));
443
+ expect(findActiveImplementation(tmpDir, 'r-1')).toBeNull();
444
+ });
445
+ it('returns null when rule does not exist', () => {
446
+ expect(findActiveImplementation(tmpDir, 'nonexistent')).toBeNull();
447
+ });
448
+ });
449
+ // ---------------------------------------------------------------------------
450
+ // 4. Subtree query tests
451
+ // ---------------------------------------------------------------------------
452
+ describe('getPrincipleSubtree', () => {
453
+ it('returns the full subtree for a principle', () => {
454
+ addPrincipleToLedger(tmpDir, makePrinciple({ id: 'p-1' }));
455
+ createRule(tmpDir, makeRule({ id: 'r-1', implementationIds: [] }));
456
+ createImplementation(tmpDir, makeImplementation({ id: 'impl-1', ruleId: 'r-1' }));
457
+ const subtree = getPrincipleSubtree(tmpDir, 'p-1');
458
+ expect(subtree).toBeDefined();
459
+ if (!subtree)
460
+ throw new Error('Expected non-null subtree');
461
+ expect(subtree.principle.id).toBe('p-1');
462
+ expect(subtree.rules).toHaveLength(1);
463
+ const [ruleEntry] = subtree.rules;
464
+ if (!ruleEntry)
465
+ throw new Error('Expected non-null rule entry');
466
+ expect(ruleEntry.rule.id).toBe('r-1');
467
+ expect(ruleEntry.implementations).toHaveLength(1);
468
+ const [implEntry] = ruleEntry.implementations;
469
+ if (!implEntry)
470
+ throw new Error('Expected non-null implementation entry');
471
+ expect(implEntry.id).toBe('impl-1');
472
+ });
473
+ it('returns undefined for missing principle', () => {
474
+ expect(getPrincipleSubtree(tmpDir, 'ghost')).toBeUndefined();
475
+ });
476
+ it('returns empty rules array for principle with no rules', () => {
477
+ addPrincipleToLedger(tmpDir, makePrinciple({ id: 'p-1' }));
478
+ const subtree = getPrincipleSubtree(tmpDir, 'p-1');
479
+ expect(subtree).toBeDefined();
480
+ if (!subtree)
481
+ throw new Error('Expected non-null subtree');
482
+ expect(subtree.rules).toEqual([]);
483
+ });
484
+ });
485
+ describe('listImplementationsForRule', () => {
486
+ it('returns implementations for a given rule', () => {
487
+ addPrincipleToLedger(tmpDir, makePrinciple());
488
+ createRule(tmpDir, makeRule({ implementationIds: [] }));
489
+ createImplementation(tmpDir, makeImplementation({ id: 'impl-1' }));
490
+ createImplementation(tmpDir, makeImplementation({ id: 'impl-2' }));
491
+ const impls = listImplementationsForRule(tmpDir, 'r-1');
492
+ expect(impls).toHaveLength(2);
493
+ expect(impls.map((i) => i.id).sort()).toEqual(['impl-1', 'impl-2']);
494
+ });
495
+ it('returns empty array for missing rule', () => {
496
+ expect(listImplementationsForRule(tmpDir, 'nonexistent')).toEqual([]);
497
+ });
498
+ });
499
+ // ---------------------------------------------------------------------------
500
+ // 5. Error cases
501
+ // ---------------------------------------------------------------------------
502
+ describe('error cases', () => {
503
+ it('createRule throws if parent principle is missing', () => {
504
+ expect(() => createRule(tmpDir, makeRule({ principleId: 'ghost' }))).toThrow(/Cannot create rule.*missing principle/);
505
+ });
506
+ it('createRule throws if rule already exists', () => {
507
+ addPrincipleToLedger(tmpDir, makePrinciple());
508
+ createRule(tmpDir, makeRule({ id: 'r-1' }));
509
+ expect(() => createRule(tmpDir, makeRule({ id: 'r-1' }))).toThrow(/already exists.*Use updateRule/);
510
+ });
511
+ it('createImplementation throws if parent rule is missing', () => {
512
+ expect(() => createImplementation(tmpDir, makeImplementation({ ruleId: 'ghost' }))).toThrow(/Cannot create implementation.*missing rule/);
513
+ });
514
+ it('createImplementation throws if implementation already exists', () => {
515
+ addPrincipleToLedger(tmpDir, makePrinciple());
516
+ createRule(tmpDir, makeRule());
517
+ createImplementation(tmpDir, makeImplementation({ id: 'impl-1' }));
518
+ expect(() => createImplementation(tmpDir, makeImplementation({ id: 'impl-1' }))).toThrow(/already exists.*Use updateImplementation/);
519
+ });
520
+ it('transitionImplementationState throws on invalid transition', () => {
521
+ addPrincipleToLedger(tmpDir, makePrinciple());
522
+ createRule(tmpDir, makeRule());
523
+ createImplementation(tmpDir, makeImplementation({ lifecycleState: 'active' }));
524
+ expect(() => transitionImplementationState(tmpDir, 'impl-1', 'candidate')).toThrow(/Invalid lifecycle transition/);
525
+ });
526
+ it('transitionImplementationState throws when implementation missing', () => {
527
+ expect(() => transitionImplementationState(tmpDir, 'no-such-impl', 'active')).toThrow(/Implementation not found/);
528
+ });
529
+ });
530
+ //# sourceMappingURL=principle-tree-ledger-lifecycle.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"principle-tree-ledger-lifecycle.test.js","sourceRoot":"","sources":["../src/principle-tree-ledger-lifecycle.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAMvC,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,UAAU,EACV,UAAU,EACV,oBAAoB,EACpB,oBAAoB,EACpB,6BAA6B,EAC7B,0BAA0B,EAC1B,wBAAwB,EACxB,8BAA8B,EAC9B,mBAAmB,EACnB,UAAU,GACX,MAAM,4BAA4B,CAAC;AAEpC,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,SAAS,aAAa,CAAC,YAAsC,EAAE;IAC7D,OAAO;QACL,EAAE,EAAE,KAAK;QACT,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,gBAAgB;QACtB,cAAc,EAAE,QAAQ;QACxB,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,SAAS;QAChB,YAAY,EAAE,aAAa;QAC3B,UAAU,EAAE,GAAG;QACf,aAAa,EAAE,GAAG;QAClB,kBAAkB,EAAE,CAAC;QACrB,kBAAkB,EAAE,EAAE;QACtB,OAAO,EAAE,EAAE;QACX,yBAAyB,EAAE,EAAE;QAC7B,SAAS,EAAE,0BAA0B;QACrC,SAAS,EAAE,0BAA0B;QACrC,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,YAAiC,EAAE;IACnD,OAAO;QACL,EAAE,EAAE,KAAK;QACT,WAAW,EAAE,KAAK;QAClB,iBAAiB,EAAE,EAAE;QACrB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,YAAqC,EAAE;IACjE,OAAO;QACL,EAAE,EAAE,QAAQ;QACZ,MAAM,EAAE,KAAK;QACb,cAAc,EAAE,WAAW;QAC3B,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E,IAAI,MAAc,CAAC;AAEnB,UAAU,CAAC,GAAG,EAAE;IACd,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,4BAA4B,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACxE,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACb,IAAI,CAAC;QACH,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,sBAAsB;IACxB,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,qCAAqC;AACrC,8EAA8E;AAE9E,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,0BAA0B,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,0BAA0B,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,0BAA0B,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,0BAA0B,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,0BAA0B,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,0BAA0B,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,0BAA0B,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,0BAA0B,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,0BAA0B,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,0BAA0B,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,0BAA0B,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,0BAA0B,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,0BAA0B,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxE,MAAM,CAAC,0BAA0B,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrE,MAAM,CAAC,0BAA0B,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,CAAC,0BAA0B,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,GAAG,aAAa,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,oBAAoB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE9B,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACpD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC/D,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACzF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QACrE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QACnF,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CACzE,iCAAiC,CAClC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEvC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC/D,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,iBAAiB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC9C,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAElC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC9C,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/B,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACpE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,oBAAoB,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC3D,oBAAoB,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC3D,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAEhE,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QAClE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAExC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QAC5D,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QAC5D,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CACpE,4BAA4B,CAC7B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC9C,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/B,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CACvE,qCAAqC,CACtC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC9C,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/B,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC3D,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE/B,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QACjD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC/D,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC9C,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/B,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QACnE,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QAEnE,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAE1B,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC9C,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/B,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3E,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC9C,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC5C,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC5C,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAElF,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1E,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEnC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QACvD,MAAM,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACrD,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QACvD,MAAM,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CACjF,sCAAsC,CACvC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC9C,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/B,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAC/E,0CAA0C,CAC3C,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;QACtF,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC9C,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/B,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAEnD,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACvD,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC3D,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAElC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAC9D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,MAAM,GAAG,oBAAoB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,mCAAmC;AACnC,8EAA8E;AAE9E,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,SAAS,kBAAkB;QACzB,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC9C,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/B,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QAClF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,kBAAkB,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,6BAA6B,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACzE,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,kBAAkB,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,6BAA6B,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC3E,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,kBAAkB,EAAE,CAAC;QACrB,6BAA6B,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,6BAA6B,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC3E,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,kBAAkB,EAAE,CAAC;QACrB,6BAA6B,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,6BAA6B,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC3E,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,kBAAkB,EAAE,CAAC;QACrB,6BAA6B,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC1D,6BAA6B,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,6BAA6B,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACzE,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,kBAAkB,EAAE,CAAC;QACrB,6BAA6B,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC1D,6BAA6B,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,6BAA6B,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC3E,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC9C,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/B,iDAAiD;QACjD,oBAAoB,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,6BAA6B,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACzE,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,kBAAkB,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,EAAE,CAAC,6BAA6B,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAC/E,8BAA8B,CAC/B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,kBAAkB,EAAE,CAAC;QACrB,6BAA6B,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC5D,MAAM,CAAC,GAAG,EAAE,CAAC,6BAA6B,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAC7E,uDAAuD,CACxD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,GAAG,EAAE,CAAC,6BAA6B,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAC5E,0BAA0B,CAC3B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC9C,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACxD,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QAChG,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC7F,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;QAE/F,MAAM,UAAU,GAAG,8BAA8B,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;QAC9E,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,SAAS,CAAC,GAAG,UAAU,CAAC;QAC/B,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC/D,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEpC,MAAM,OAAO,GAAG,8BAA8B,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QACxE,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;QACzB,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEjC,MAAM,SAAS,GAAG,8BAA8B,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QAC5E,MAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;QAC7B,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC7D,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEnC,MAAM,CAAC,8BAA8B,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC9C,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACxD,oBAAoB,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAE9D,MAAM,UAAU,GAAG,8BAA8B,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;QAC9E,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,SAAS,CAAC,GAAG,UAAU,CAAC;QAC/B,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC/D,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC9C,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACxD,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QAChG,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QAE7F,MAAM,MAAM,GAAG,wBAAwB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC9C,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACxD,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QAEhG,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,oBAAoB,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC3D,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACnE,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAElF,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC3D,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;QAClC,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAChE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,eAAe,CAAC;QAC9C,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC1E,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,oBAAoB,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC3D,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC9C,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACxD,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QACnE,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QAEnE,MAAM,KAAK,GAAG,0BAA0B,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACxD,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,0BAA0B,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAC1E,uCAAuC,CACxC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC9C,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAC/D,gCAAgC,CACjC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CACzF,4CAA4C,CAC7C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC9C,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/B,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QACnE,MAAM,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CACtF,0CAA0C,CAC3C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC9C,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/B,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC/E,MAAM,CAAC,GAAG,EAAE,CAAC,6BAA6B,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAChF,8BAA8B,CAC/B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,CAAC,GAAG,EAAE,CAAC,6BAA6B,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CACnF,0BAA0B,CAC3B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=report-generator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-generator.test.d.ts","sourceRoot":"","sources":["../../../src/quality-scorecard/__tests__/report-generator.test.ts"],"names":[],"mappings":""}