footprintjs 0.10.0 → 0.10.1

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 (25) hide show
  1. package/dist/esm/lib/engine/narrative/CombinedNarrativeBuilder.js +43 -14
  2. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +267 -0
  3. package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.js +25 -1
  4. package/dist/esm/lib/engine/narrative/index.js +2 -1
  5. package/dist/esm/lib/runner/FlowChartExecutor.js +33 -16
  6. package/dist/esm/lib/scope/recorders/NarrativeRecorder.js +6 -1
  7. package/dist/esm/types/lib/engine/narrative/CombinedNarrativeBuilder.d.ts +15 -2
  8. package/dist/esm/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +63 -0
  9. package/dist/esm/types/lib/engine/narrative/NarrativeFlowRecorder.d.ts +11 -0
  10. package/dist/esm/types/lib/engine/narrative/index.d.ts +2 -0
  11. package/dist/esm/types/lib/runner/FlowChartExecutor.d.ts +8 -1
  12. package/dist/esm/types/lib/scope/recorders/NarrativeRecorder.d.ts +5 -0
  13. package/dist/lib/engine/narrative/CombinedNarrativeBuilder.js +43 -14
  14. package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +271 -0
  15. package/dist/lib/engine/narrative/NarrativeFlowRecorder.js +25 -1
  16. package/dist/lib/engine/narrative/index.js +4 -2
  17. package/dist/lib/runner/FlowChartExecutor.js +33 -16
  18. package/dist/lib/scope/recorders/NarrativeRecorder.js +6 -1
  19. package/dist/types/lib/engine/narrative/CombinedNarrativeBuilder.d.ts +15 -2
  20. package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +63 -0
  21. package/dist/types/lib/engine/narrative/NarrativeFlowRecorder.d.ts +11 -0
  22. package/dist/types/lib/engine/narrative/index.d.ts +2 -0
  23. package/dist/types/lib/runner/FlowChartExecutor.d.ts +8 -1
  24. package/dist/types/lib/scope/recorders/NarrativeRecorder.d.ts +5 -0
  25. package/package.json +1 -1
@@ -8,6 +8,11 @@
8
8
  * Stage 1: "Receive Application"
9
9
  * Step 1: Write applicantName = 'Bob'
10
10
  * [Condition]: risk tier is high → chose "Reject Application"
11
+ *
12
+ * @deprecated Since 0.9.x — Superseded by {@link CombinedNarrativeRecorder} which builds the
13
+ * combined narrative inline during traversal (no post-processing). This class is retained for
14
+ * backward compatibility with consumers that use CombinedNarrativeBuilder directly.
15
+ * Will be removed in v1.0.
11
16
  */
12
17
  // ---------------------------------------------------------------------------
13
18
  // Builder
@@ -21,23 +26,35 @@ export class CombinedNarrativeBuilder {
21
26
  indent: (_c = options === null || options === void 0 ? void 0 : options.indent) !== null && _c !== void 0 ? _c : ' ',
22
27
  };
23
28
  }
24
- buildEntries(flowSentences, recorder) {
29
+ /**
30
+ * @param flowSentences Sentences from the flow recorder (NarrativeFlowRecorder.getSentences()).
31
+ * @param recorder Data-level recorder with per-stage read/write operations.
32
+ * @param sentenceStageNames Optional parallel array of actual stage names for each sentence
33
+ * (from NarrativeFlowRecorder.getSentenceStageNames()). When provided,
34
+ * enables direct lookup instead of fragile regex-based matching.
35
+ * @deprecated Use {@link CombinedNarrativeRecorder} instead, which builds entries inline during traversal.
36
+ */
37
+ buildEntries(flowSentences, recorder, sentenceStageNames) {
38
+ var _a;
25
39
  const entries = [];
26
40
  const stageData = recorder.getStageData();
27
41
  const usedStages = new Set();
28
42
  let stageCounter = 0;
29
- for (const sentence of flowSentences) {
43
+ for (let i = 0; i < flowSentences.length; i++) {
44
+ const sentence = flowSentences[i];
30
45
  const parsed = this.parseSentence(sentence);
46
+ // Prefer the actual stage name from the recorder over regex-parsed description text
47
+ const resolvedStageName = (_a = sentenceStageNames === null || sentenceStageNames === void 0 ? void 0 : sentenceStageNames[i]) !== null && _a !== void 0 ? _a : parsed.stageName;
31
48
  if (parsed.type === 'stage') {
32
49
  stageCounter++;
33
50
  entries.push({
34
51
  type: 'stage',
35
52
  text: `Stage ${stageCounter}: ${sentence}`,
36
53
  depth: 0,
37
- stageName: parsed.stageName,
54
+ stageName: resolvedStageName,
38
55
  });
39
- if (parsed.stageName) {
40
- const data = this.findStageData(parsed.stageName, stageData);
56
+ if (resolvedStageName) {
57
+ const data = this.findStageData(resolvedStageName, stageData);
41
58
  if (data) {
42
59
  usedStages.add(data.stageName);
43
60
  this.addStepEntries(entries, data);
@@ -45,7 +62,8 @@ export class CombinedNarrativeBuilder {
45
62
  }
46
63
  }
47
64
  else if (parsed.type === 'condition') {
48
- entries.push({ type: 'condition', text: `[Condition]: ${sentence}`, depth: 0 });
65
+ entries.push({ type: 'condition', text: `[Condition]: ${sentence}`, depth: 0, stageName: resolvedStageName });
66
+ // For conditions, also look up the chosen branch's data
49
67
  if (parsed.stageName) {
50
68
  const data = this.findStageData(parsed.stageName, stageData);
51
69
  if (data) {
@@ -53,6 +71,17 @@ export class CombinedNarrativeBuilder {
53
71
  this.addStepEntries(entries, data);
54
72
  }
55
73
  }
74
+ // Also mark the decider stage itself as used (the resolvedStageName)
75
+ if (resolvedStageName) {
76
+ const data = this.findStageData(resolvedStageName, stageData);
77
+ if (data) {
78
+ usedStages.add(data.stageName);
79
+ // Only add step entries if the chosen branch didn't already cover it
80
+ if (!parsed.stageName || parsed.stageName !== resolvedStageName) {
81
+ this.addStepEntries(entries, data);
82
+ }
83
+ }
84
+ }
56
85
  }
57
86
  else if (parsed.type === 'fork') {
58
87
  entries.push({ type: 'fork', text: `[Parallel]: ${sentence}`, depth: 0 });
@@ -80,8 +109,8 @@ export class CombinedNarrativeBuilder {
80
109
  }
81
110
  return entries;
82
111
  }
83
- build(flowSentences, recorder) {
84
- return this.buildEntries(flowSentences, recorder).map((entry) => {
112
+ build(flowSentences, recorder, sentenceStageNames) {
113
+ return this.buildEntries(flowSentences, recorder, sentenceStageNames).map((entry) => {
85
114
  const indent = this.options.indent.repeat(entry.depth);
86
115
  return `${indent}${entry.text}`;
87
116
  });
@@ -125,22 +154,22 @@ export class CombinedNarrativeBuilder {
125
154
  return undefined;
126
155
  }
127
156
  parseSentence(sentence) {
128
- var _a, _b, _c, _d;
157
+ var _a, _b, _c, _d, _e, _f;
129
158
  if (sentence.startsWith('The process began')) {
130
159
  const match = sentence.match(/The process began(?:: (.+)| with (.+))\./);
131
- return { type: 'stage', stageName: (_a = match === null || match === void 0 ? void 0 : match[2]) === null || _a === void 0 ? void 0 : _a.trim() };
160
+ return { type: 'stage', stageName: (_b = ((_a = match === null || match === void 0 ? void 0 : match[1]) !== null && _a !== void 0 ? _a : match === null || match === void 0 ? void 0 : match[2])) === null || _b === void 0 ? void 0 : _b.trim() };
132
161
  }
133
162
  if (sentence.startsWith('Next')) {
134
163
  const match = sentence.match(/Next(?:,? it moved on to (.+)| step: (.+))\./);
135
- return { type: 'stage', stageName: (_b = match === null || match === void 0 ? void 0 : match[1]) === null || _b === void 0 ? void 0 : _b.trim() };
164
+ return { type: 'stage', stageName: (_d = ((_c = match === null || match === void 0 ? void 0 : match[1]) !== null && _c !== void 0 ? _c : match === null || match === void 0 ? void 0 : match[2])) === null || _d === void 0 ? void 0 : _d.trim() };
136
165
  }
137
166
  if (sentence.includes('decision was made') || sentence.includes('it chose') || sentence.includes('so it chose')) {
138
167
  const match = sentence.match(/chose (.+)\./);
139
- return { type: 'condition', stageName: (_c = match === null || match === void 0 ? void 0 : match[1]) === null || _c === void 0 ? void 0 : _c.trim() };
168
+ return { type: 'condition', stageName: (_e = match === null || match === void 0 ? void 0 : match[1]) === null || _e === void 0 ? void 0 : _e.trim() };
140
169
  }
141
170
  if (sentence.startsWith('It ') && sentence.includes('chose')) {
142
171
  const match = sentence.match(/chose (.+)\./);
143
- return { type: 'condition', stageName: (_d = match === null || match === void 0 ? void 0 : match[1]) === null || _d === void 0 ? void 0 : _d.trim() };
172
+ return { type: 'condition', stageName: (_f = match === null || match === void 0 ? void 0 : match[1]) === null || _f === void 0 ? void 0 : _f.trim() };
144
173
  }
145
174
  if (sentence.includes('paths were executed in parallel') || sentence.includes('paths were selected'))
146
175
  return { type: 'fork' };
@@ -155,4 +184,4 @@ export class CombinedNarrativeBuilder {
155
184
  return { type: 'stage' };
156
185
  }
157
186
  }
158
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tYmluZWROYXJyYXRpdmVCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvbmFycmF0aXZlL0NvbWJpbmVkTmFycmF0aXZlQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBc0JILDhFQUE4RTtBQUM5RSxVQUFVO0FBQ1YsOEVBQThFO0FBRTlFLE1BQU0sT0FBTyx3QkFBd0I7SUFHbkMsWUFBWSxPQUFrQzs7UUFDNUMsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLGtCQUFrQixFQUFFLE1BQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLGtCQUFrQixtQ0FBSSxJQUFJO1lBQ3ZELGFBQWEsRUFBRSxNQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxhQUFhLG1DQUFJLElBQUk7WUFDN0MsTUFBTSxFQUFFLE1BQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLE1BQU0sbUNBQUksSUFBSTtTQUNoQyxDQUFDO0lBQ0osQ0FBQztJQUVELFlBQVksQ0FBQyxhQUF1QixFQUFFLFFBQTJCO1FBQy9ELE1BQU0sT0FBTyxHQUE2QixFQUFFLENBQUM7UUFDN0MsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzFDLE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDckMsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBRXJCLEtBQUssTUFBTSxRQUFRLElBQUksYUFBYSxFQUFFLENBQUM7WUFDckMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUU1QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQzVCLFlBQVksRUFBRSxDQUFDO2dCQUNmLE9BQU8sQ0FBQyxJQUFJLENBQUM7b0JBQ1gsSUFBSSxFQUFFLE9BQU87b0JBQ2IsSUFBSSxFQUFFLFNBQVMsWUFBWSxLQUFLLFFBQVEsRUFBRTtvQkFDMUMsS0FBSyxFQUFFLENBQUM7b0JBQ1IsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO2lCQUM1QixDQUFDLENBQUM7Z0JBQ0gsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQ3JCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztvQkFDN0QsSUFBSSxJQUFJLEVBQUUsQ0FBQzt3QkFDVCxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzt3QkFDL0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ3JDLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7aUJBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUN2QyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNoRixJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDckIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO29CQUM3RCxJQUFJLElBQUksRUFBRSxDQUFDO3dCQUNULFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUMvQixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDckMsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztpQkFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQ2xDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxlQUFlLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVFLENBQUM7aUJBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNyQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzlELENBQUM7aUJBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUNsQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzNELENBQUM7aUJBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUNuQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVELENBQUM7aUJBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUNuQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMxRSxDQUFDO1FBQ0gsQ0FBQztRQUVELHVFQUF1RTtRQUN2RSxLQUFLLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2hFLElBQUksQ0FBQyxVQUFVLENB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QyxTQUFTLENBQUM7WUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQzVELElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQztZQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDdkUsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDO1lBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN2RSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29tYmluZWROYXJyYXRpdmVCdWlsZGVyIOKAlCBNZXJnZXMgZmxvdy1sZXZlbCBuYXJyYXRpdmUgd2l0aCBkYXRhLWxldmVsIG9wZXJhdGlvbnMuXG4gKlxuICogQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IgY2FwdHVyZXMgRkxPVyDigJQgd2hhdCBzdGFnZXMgcmFuLCB3aGljaCBicmFuY2hlcyB3ZXJlIHRha2VuLlxuICogTmFycmF0aXZlUmVjb3JkZXIgKHNjb3BlLykgY2FwdHVyZXMgREFUQSDigJQgd2hhdCB2YWx1ZXMgd2VyZSByZWFkLCB3cml0dGVuLCB1cGRhdGVkLlxuICpcbiAqIFRoaXMgYnVpbGRlciB3ZWF2ZXMgYm90aCBpbnRvIGEgc2luZ2xlIHVuaWZpZWQgbmFycmF0aXZlOlxuICogICBTdGFnZSAxOiBcIlJlY2VpdmUgQXBwbGljYXRpb25cIlxuICogICAgIFN0ZXAgMTogV3JpdGUgYXBwbGljYW50TmFtZSA9ICdCb2InXG4gKiAgIFtDb25kaXRpb25dOiByaXNrIHRpZXIgaXMgaGlnaCDihpIgY2hvc2UgXCJSZWplY3QgQXBwbGljYXRpb25cIlxuICovXG5cbmltcG9ydCB0eXBlIHsgTmFycmF0aXZlUmVjb3JkZXIsIFN0YWdlTmFycmF0aXZlRGF0YSB9IGZyb20gJy4uLy4uL3Njb3BlL3JlY29yZGVycy9OYXJyYXRpdmVSZWNvcmRlcic7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVHlwZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbWJpbmVkTmFycmF0aXZlRW50cnkge1xuICB0eXBlOiAnc3RhZ2UnIHwgJ3N0ZXAnIHwgJ2NvbmRpdGlvbicgfCAnZm9yaycgfCAnc3ViZmxvdycgfCAnbG9vcCcgfCAnYnJlYWsnIHwgJ2Vycm9yJztcbiAgdGV4dDogc3RyaW5nO1xuICBkZXB0aDogbnVtYmVyO1xuICBzdGFnZU5hbWU/OiBzdHJpbmc7XG4gIHN0ZXBOdW1iZXI/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tYmluZWROYXJyYXRpdmVPcHRpb25zIHtcbiAgaW5jbHVkZVN0ZXBOdW1iZXJzPzogYm9vbGVhbjtcbiAgaW5jbHVkZVZhbHVlcz86IGJvb2xlYW47XG4gIGluZGVudD86IHN0cmluZztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBCdWlsZGVyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGNsYXNzIENvbWJpbmVkTmFycmF0aXZlQnVpbGRlciB7XG4gIHByaXZhdGUgb3B0aW9uczogUmVxdWlyZWQ8Q29tYmluZWROYXJyYXRpdmVPcHRpb25zPjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogQ29tYmluZWROYXJyYXRpdmVPcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgaW5jbHVkZVN0ZXBOdW1iZXJzOiBvcHRpb25zPy5pbmNsdWRlU3RlcE51bWJlcnMgPz8gdHJ1ZSxcbiAgICAgIGluY2x1ZGVWYWx1ZXM6IG9wdGlvbnM/LmluY2x1ZGVWYWx1ZXMgPz8gdHJ1ZSxcbiAgICAgIGluZGVudDogb3B0aW9ucz8uaW5kZW50ID8/ICcgICcsXG4gICAgfTtcbiAgfVxuXG4gIGJ1aWxkRW50cmllcyhmbG93U2VudGVuY2VzOiBzdHJpbmdbXSwgcmVjb3JkZXI6IE5hcnJhdGl2ZVJlY29yZGVyKTogQ29tYmluZWROYXJyYXRpdmVFbnRyeVtdIHtcbiAgICBjb25zdCBlbnRyaWVzOiBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W10gPSBbXTtcbiAgICBjb25zdCBzdGFnZURhdGEgPSByZWNvcmRlci5nZXRTdGFnZURhdGEoKTtcbiAgICBjb25zdCB1c2VkU3RhZ2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgbGV0IHN0YWdlQ291bnRlciA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IHNlbnRlbmNlIG9mIGZsb3dTZW50ZW5jZXMpIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VTZW50ZW5jZShzZW50ZW5jZSk7XG5cbiAgICAgIGlmIChwYXJzZWQudHlwZSA9PT0gJ3N0YWdlJykge1xuICAgICAgICBzdGFnZUNvdW50ZXIrKztcbiAgICAgICAgZW50cmllcy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgICAgIHRleHQ6IGBTdGFnZSAke3N0YWdlQ291bnRlcn06ICR7c2VudGVuY2V9YCxcbiAgICAgICAgICBkZXB0aDogMCxcbiAgICAgICAgICBzdGFnZU5hbWU6IHBhcnNlZC5zdGFnZU5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocGFyc2VkLnN0YWdlTmFtZSkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmZpbmRTdGFnZURhdGEocGFyc2VkLnN0YWdlTmFtZSwgc3RhZ2VEYXRhKTtcbiAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgdXNlZFN0YWdlcy5hZGQoZGF0YS5zdGFnZU5hbWUpO1xuICAgICAgICAgICAgdGhpcy5hZGRTdGVwRW50cmllcyhlbnRyaWVzLCBkYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocGFyc2VkLnR5cGUgPT09ICdjb25kaXRpb24nKSB7XG4gICAgICAgIGVudHJpZXMucHVzaCh7IHR5cGU6ICdjb25kaXRpb24nLCB0ZXh0OiBgW0NvbmRpdGlvbl06ICR7c2VudGVuY2V9YCwgZGVwdGg6IDAgfSk7XG4gICAgICAgIGlmIChwYXJzZWQuc3RhZ2VOYW1lKSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZmluZFN0YWdlRGF0YShwYXJzZWQuc3RhZ2VOYW1lLCBzdGFnZURhdGEpO1xuICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICB1c2VkU3RhZ2VzLmFkZChkYXRhLnN0YWdlTmFtZSk7XG4gICAgICAgICAgICB0aGlzLmFkZFN0ZXBFbnRyaWVzKGVudHJpZXMsIGRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwYXJzZWQudHlwZSA9PT0gJ2ZvcmsnKSB7XG4gICAgICAgIGVudHJpZXMucHVzaCh7IHR5cGU6ICdmb3JrJywgdGV4dDogYFtQYXJhbGxlbF06ICR7c2VudGVuY2V9YCwgZGVwdGg6IDAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHBhcnNlZC50eXBlID09PSAnc3ViZmxvdycpIHtcbiAgICAgICAgZW50cmllcy5wdXNoKHsgdHlwZTogJ3N1YmZsb3cnLCB0ZXh0OiBzZW50ZW5jZSwgZGVwdGg6IDAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHBhcnNlZC50eXBlID09PSAnbG9vcCcpIHtcbiAgICAgICAgZW50cmllcy5wdXNoKHsgdHlwZTogJ2xvb3AnLCB0ZXh0OiBzZW50ZW5jZSwgZGVwdGg6IDAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHBhcnNlZC50eXBlID09PSAnYnJlYWsnKSB7XG4gICAgICAgIGVudHJpZXMucHVzaCh7IHR5cGU6ICdicmVhaycsIHRleHQ6IHNlbnRlbmNlLCBkZXB0aDogMCB9KTtcbiAgICAgIH0gZWxzZSBpZiAocGFyc2VkLnR5cGUgPT09ICdlcnJvcicpIHtcbiAgICAgICAgZW50cmllcy5wdXNoKHsgdHlwZTogJ2Vycm9yJywgdGV4dDogYFtFcnJvcl06ICR7c2VudGVuY2V9YCwgZGVwdGg6IDAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIHN0YWdlcyB3aXRoIG9wZXJhdGlvbnMgdGhhdCB3ZXJlbid0IHJlZmVyZW5jZWQgaW4gZmxvdyBzZW50ZW5jZXNcbiAgICBmb3IgKGNvbnN0IFtzdGFnZU5hbWUsIGRhdGFdIG9mIEFycmF5LmZyb20oc3RhZ2VEYXRhLmVudHJpZXMoKSkpIHtcbiAgICAgIGlmICghdXNlZFN0YWdlcy5oYXMoc3RhZ2VOYW1lKSAmJiBkYXRhLm9wZXJhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBzdGFnZUNvdW50ZXIrKztcbiAgICAgICAgZW50cmllcy5wdXNoKHsgdHlwZTogJ3N0YWdlJywgdGV4dDogYFN0YWdlICR7c3RhZ2VDb3VudGVyfTogJHtzdGFnZU5hbWV9YCwgZGVwdGg6IDAsIHN0YWdlTmFtZSB9KTtcbiAgICAgICAgdGhpcy5hZGRTdGVwRW50cmllcyhlbnRyaWVzLCBkYXRhKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZW50cmllcztcbiAgfVxuXG4gIGJ1aWxkKGZsb3dTZW50ZW5jZXM6IHN0cmluZ1tdLCByZWNvcmRlcjogTmFycmF0aXZlUmVjb3JkZXIpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRFbnRyaWVzKGZsb3dTZW50ZW5jZXMsIHJlY29yZGVyKS5tYXAoKGVudHJ5KSA9PiB7XG4gICAgICBjb25zdCBpbmRlbnQgPSB0aGlzLm9wdGlvbnMuaW5kZW50LnJlcGVhdChlbnRyeS5kZXB0aCk7XG4gICAgICByZXR1cm4gYCR7aW5kZW50fSR7ZW50cnkudGV4dH1gO1xuICAgIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIFByaXZhdGUgaGVscGVycyDilIDilIBcblxuICBwcml2YXRlIGFkZFN0ZXBFbnRyaWVzKGVudHJpZXM6IENvbWJpbmVkTmFycmF0aXZlRW50cnlbXSwgZGF0YTogU3RhZ2VOYXJyYXRpdmVEYXRhKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBvcCBvZiBkYXRhLm9wZXJhdGlvbnMpIHtcbiAgICAgIGNvbnN0IHN0ZXBQcmVmaXggPSB0aGlzLm9wdGlvbnMuaW5jbHVkZVN0ZXBOdW1iZXJzICYmIG9wLnN0ZXBOdW1iZXIgPyBgU3RlcCAke29wLnN0ZXBOdW1iZXJ9OiBgIDogJyc7XG5cbiAgICAgIGxldCB0ZXh0OiBzdHJpbmc7XG4gICAgICBpZiAob3AudHlwZSA9PT0gJ3JlYWQnKSB7XG4gICAgICAgIHRleHQgPVxuICAgICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlVmFsdWVzICYmIG9wLnZhbHVlU3VtbWFyeVxuICAgICAgICAgICAgPyBgJHtzdGVwUHJlZml4fVJlYWQgJHtvcC5rZXl9ID0gJHtvcC52YWx1ZVN1bW1hcnl9YFxuICAgICAgICAgICAgOiBgJHtzdGVwUHJlZml4fVJlYWQgJHtvcC5rZXl9YDtcbiAgICAgIH0gZWxzZSBpZiAob3Aub3BlcmF0aW9uID09PSAnZGVsZXRlJykge1xuICAgICAgICB0ZXh0ID0gYCR7c3RlcFByZWZpeH1EZWxldGUgJHtvcC5rZXl9YDtcbiAgICAgIH0gZWxzZSBpZiAob3Aub3BlcmF0aW9uID09PSAndXBkYXRlJykge1xuICAgICAgICB0ZXh0ID0gdGhpcy5vcHRpb25zLmluY2x1ZGVWYWx1ZXNcbiAgICAgICAgICA/IGAke3N0ZXBQcmVmaXh9VXBkYXRlICR7b3Aua2V5fSA9ICR7b3AudmFsdWVTdW1tYXJ5fWBcbiAgICAgICAgICA6IGAke3N0ZXBQcmVmaXh9VXBkYXRlICR7b3Aua2V5fWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZXh0ID0gdGhpcy5vcHRpb25zLmluY2x1ZGVWYWx1ZXNcbiAgICAgICAgICA/IGAke3N0ZXBQcmVmaXh9V3JpdGUgJHtvcC5rZXl9ID0gJHtvcC52YWx1ZVN1bW1hcnl9YFxuICAgICAgICAgIDogYCR7c3RlcFByZWZpeH1Xcml0ZSAke29wLmtleX1gO1xuICAgICAgfVxuXG4gICAgICBlbnRyaWVzLnB1c2goeyB0eXBlOiAnc3RlcCcsIHRleHQsIGRlcHRoOiAxLCBzdGFnZU5hbWU6IGRhdGEuc3RhZ2VOYW1lLCBzdGVwTnVtYmVyOiBvcC5zdGVwTnVtYmVyIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmluZFN0YWdlRGF0YShuYW1lOiBzdHJpbmcsIHN0YWdlRGF0YTogTWFwPHN0cmluZywgU3RhZ2VOYXJyYXRpdmVEYXRhPik6IFN0YWdlTmFycmF0aXZlRGF0YSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHN0YWdlRGF0YS5oYXMobmFtZSkpIHJldHVybiBzdGFnZURhdGEuZ2V0KG5hbWUpO1xuICAgIGZvciAoY29uc3QgW3N0YWdlTmFtZSwgZGF0YV0gb2YgQXJyYXkuZnJvbShzdGFnZURhdGEuZW50cmllcygpKSkge1xuICAgICAgaWYgKFxuICAgICAgICBzdGFnZU5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhuYW1lLnRvTG93ZXJDYXNlKCkpIHx8XG4gICAgICAgIG5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzdGFnZU5hbWUudG9Mb3dlckNhc2UoKSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VTZW50ZW5jZShzZW50ZW5jZTogc3RyaW5nKTogeyB0eXBlOiBzdHJpbmc7IHN0YWdlTmFtZT86IHN0cmluZyB9IHtcbiAgICBpZiAoc2VudGVuY2Uuc3RhcnRzV2l0aCgnVGhlIHByb2Nlc3MgYmVnYW4nKSkge1xuICAgICAgY29uc3QgbWF0Y2ggPSBzZW50ZW5jZS5tYXRjaCgvVGhlIHByb2Nlc3MgYmVnYW4oPzo6ICguKyl8IHdpdGggKC4rKSlcXC4vKTtcbiAgICAgIHJldHVybiB7IHR5cGU6ICdzdGFnZScsIHN0YWdlTmFtZTogbWF0Y2g/LlsyXT8udHJpbSgpIH07XG4gICAgfVxuICAgIGlmIChzZW50ZW5jZS5zdGFydHNXaXRoKCdOZXh0JykpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gc2VudGVuY2UubWF0Y2goL05leHQoPzosPyBpdCBtb3ZlZCBvbiB0byAoLispfCBzdGVwOiAoLispKVxcLi8pO1xuICAgICAgcmV0dXJuIHsgdHlwZTogJ3N0YWdlJywgc3RhZ2VOYW1lOiBtYXRjaD8uWzFdPy50cmltKCkgfTtcbiAgICB9XG4gICAgaWYgKHNlbnRlbmNlLmluY2x1ZGVzKCdkZWNpc2lvbiB3YXMgbWFkZScpIHx8IHNlbnRlbmNlLmluY2x1ZGVzKCdpdCBjaG9zZScpIHx8IHNlbnRlbmNlLmluY2x1ZGVzKCdzbyBpdCBjaG9zZScpKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHNlbnRlbmNlLm1hdGNoKC9jaG9zZSAoLispXFwuLyk7XG4gICAgICByZXR1cm4geyB0eXBlOiAnY29uZGl0aW9uJywgc3RhZ2VOYW1lOiBtYXRjaD8uWzFdPy50cmltKCkgfTtcbiAgICB9XG4gICAgaWYgKHNlbnRlbmNlLnN0YXJ0c1dpdGgoJ0l0ICcpICYmIHNlbnRlbmNlLmluY2x1ZGVzKCdjaG9zZScpKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHNlbnRlbmNlLm1hdGNoKC9jaG9zZSAoLispXFwuLyk7XG4gICAgICByZXR1cm4geyB0eXBlOiAnY29uZGl0aW9uJywgc3RhZ2VOYW1lOiBtYXRjaD8uWzFdPy50cmltKCkgfTtcbiAgICB9XG4gICAgaWYgKHNlbnRlbmNlLmluY2x1ZGVzKCdwYXRocyB3ZXJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsJykgfHwgc2VudGVuY2UuaW5jbHVkZXMoJ3BhdGhzIHdlcmUgc2VsZWN0ZWQnKSlcbiAgICAgIHJldHVybiB7IHR5cGU6ICdmb3JrJyB9O1xuICAgIGlmIChzZW50ZW5jZS5zdGFydHNXaXRoKCdFbnRlcmluZycpIHx8IHNlbnRlbmNlLnN0YXJ0c1dpdGgoJ0V4aXRpbmcnKSkgcmV0dXJuIHsgdHlwZTogJ3N1YmZsb3cnIH07XG4gICAgaWYgKHNlbnRlbmNlLnN0YXJ0c1dpdGgoJ09uIHBhc3MnKSkgcmV0dXJuIHsgdHlwZTogJ2xvb3AnIH07XG4gICAgaWYgKHNlbnRlbmNlLnN0YXJ0c1dpdGgoJ0V4ZWN1dGlvbiBzdG9wcGVkJykpIHJldHVybiB7IHR5cGU6ICdicmVhaycgfTtcbiAgICBpZiAoc2VudGVuY2Uuc3RhcnRzV2l0aCgnQW4gZXJyb3Igb2NjdXJyZWQnKSkgcmV0dXJuIHsgdHlwZTogJ2Vycm9yJyB9O1xuICAgIHJldHVybiB7IHR5cGU6ICdzdGFnZScgfTtcbiAgfVxufVxuIl19
187
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tYmluZWROYXJyYXRpdmVCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvbmFycmF0aXZlL0NvbWJpbmVkTmFycmF0aXZlQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFzQkgsOEVBQThFO0FBQzlFLFVBQVU7QUFDViw4RUFBOEU7QUFFOUUsTUFBTSxPQUFPLHdCQUF3QjtJQUduQyxZQUFZLE9BQWtDOztRQUM1QyxJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ2Isa0JBQWtCLEVBQUUsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsa0JBQWtCLG1DQUFJLElBQUk7WUFDdkQsYUFBYSxFQUFFLE1BQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLGFBQWEsbUNBQUksSUFBSTtZQUM3QyxNQUFNLEVBQUUsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsTUFBTSxtQ0FBSSxJQUFJO1NBQ2hDLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILFlBQVksQ0FDVixhQUF1QixFQUN2QixRQUEyQixFQUMzQixrQkFBMkM7O1FBRTNDLE1BQU0sT0FBTyxHQUE2QixFQUFFLENBQUM7UUFDN0MsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzFDLE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDckMsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBRXJCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDOUMsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FB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O1FBQ3ZFLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQztZQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDdkUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUMzQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbWJpbmVkTmFycmF0aXZlQnVpbGRlciDigJQgTWVyZ2VzIGZsb3ctbGV2ZWwgbmFycmF0aXZlIHdpdGggZGF0YS1sZXZlbCBvcGVyYXRpb25zLlxuICpcbiAqIENvbnRyb2xGbG93TmFycmF0aXZlR2VuZXJhdG9yIGNhcHR1cmVzIEZMT1cg4oCUIHdoYXQgc3RhZ2VzIHJhbiwgd2hpY2ggYnJhbmNoZXMgd2VyZSB0YWtlbi5cbiAqIE5hcnJhdGl2ZVJlY29yZGVyIChzY29wZS8pIGNhcHR1cmVzIERBVEEg4oCUIHdoYXQgdmFsdWVzIHdlcmUgcmVhZCwgd3JpdHRlbiwgdXBkYXRlZC5cbiAqXG4gKiBUaGlzIGJ1aWxkZXIgd2VhdmVzIGJvdGggaW50byBhIHNpbmdsZSB1bmlmaWVkIG5hcnJhdGl2ZTpcbiAqICAgU3RhZ2UgMTogXCJSZWNlaXZlIEFwcGxpY2F0aW9uXCJcbiAqICAgICBTdGVwIDE6IFdyaXRlIGFwcGxpY2FudE5hbWUgPSAnQm9iJ1xuICogICBbQ29uZGl0aW9uXTogcmlzayB0aWVyIGlzIGhpZ2gg4oaSIGNob3NlIFwiUmVqZWN0IEFwcGxpY2F0aW9uXCJcbiAqXG4gKiBAZGVwcmVjYXRlZCBTaW5jZSAwLjkueCDigJQgU3VwZXJzZWRlZCBieSB7QGxpbmsgQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlcn0gd2hpY2ggYnVpbGRzIHRoZVxuICogY29tYmluZWQgbmFycmF0aXZlIGlubGluZSBkdXJpbmcgdHJhdmVyc2FsIChubyBwb3N0LXByb2Nlc3NpbmcpLiBUaGlzIGNsYXNzIGlzIHJldGFpbmVkIGZvclxuICogYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGNvbnN1bWVycyB0aGF0IHVzZSBDb21iaW5lZE5hcnJhdGl2ZUJ1aWxkZXIgZGlyZWN0bHkuXG4gKiBXaWxsIGJlIHJlbW92ZWQgaW4gdjEuMC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE5hcnJhdGl2ZVJlY29yZGVyLCBTdGFnZU5hcnJhdGl2ZURhdGEgfSBmcm9tICcuLi8uLi9zY29wZS9yZWNvcmRlcnMvTmFycmF0aXZlUmVjb3JkZXInO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFR5cGVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGludGVyZmFjZSBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5IHtcbiAgdHlwZTogJ3N0YWdlJyB8ICdzdGVwJyB8ICdjb25kaXRpb24nIHwgJ2ZvcmsnIHwgJ3N1YmZsb3cnIHwgJ2xvb3AnIHwgJ2JyZWFrJyB8ICdlcnJvcic7XG4gIHRleHQ6IHN0cmluZztcbiAgZGVwdGg6IG51bWJlcjtcbiAgc3RhZ2VOYW1lPzogc3RyaW5nO1xuICBzdGVwTnVtYmVyPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbWJpbmVkTmFycmF0aXZlT3B0aW9ucyB7XG4gIGluY2x1ZGVTdGVwTnVtYmVycz86IGJvb2xlYW47XG4gIGluY2x1ZGVWYWx1ZXM/OiBib29sZWFuO1xuICBpbmRlbnQ/OiBzdHJpbmc7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQnVpbGRlclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBjbGFzcyBDb21iaW5lZE5hcnJhdGl2ZUJ1aWxkZXIge1xuICBwcml2YXRlIG9wdGlvbnM6IFJlcXVpcmVkPENvbWJpbmVkTmFycmF0aXZlT3B0aW9ucz47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IENvbWJpbmVkTmFycmF0aXZlT3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIGluY2x1ZGVTdGVwTnVtYmVyczogb3B0aW9ucz8uaW5jbHVkZVN0ZXBOdW1iZXJzID8/IHRydWUsXG4gICAgICBpbmNsdWRlVmFsdWVzOiBvcHRpb25zPy5pbmNsdWRlVmFsdWVzID8/IHRydWUsXG4gICAgICBpbmRlbnQ6IG9wdGlvbnM/LmluZGVudCA/PyAnICAnLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGZsb3dTZW50ZW5jZXMgIFNlbnRlbmNlcyBmcm9tIHRoZSBmbG93IHJlY29yZGVyIChOYXJyYXRpdmVGbG93UmVjb3JkZXIuZ2V0U2VudGVuY2VzKCkpLlxuICAgKiBAcGFyYW0gcmVjb3JkZXIgICAgICAgRGF0YS1sZXZlbCByZWNvcmRlciB3aXRoIHBlci1zdGFnZSByZWFkL3dyaXRlIG9wZXJhdGlvbnMuXG4gICAqIEBwYXJhbSBzZW50ZW5jZVN0YWdlTmFtZXMgIE9wdGlvbmFsIHBhcmFsbGVsIGFycmF5IG9mIGFjdHVhbCBzdGFnZSBuYW1lcyBmb3IgZWFjaCBzZW50ZW5jZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJvbSBOYXJyYXRpdmVGbG93UmVjb3JkZXIuZ2V0U2VudGVuY2VTdGFnZU5hbWVzKCkpLiBXaGVuIHByb3ZpZGVkLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVzIGRpcmVjdCBsb29rdXAgaW5zdGVhZCBvZiBmcmFnaWxlIHJlZ2V4LWJhc2VkIG1hdGNoaW5nLlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXJ9IGluc3RlYWQsIHdoaWNoIGJ1aWxkcyBlbnRyaWVzIGlubGluZSBkdXJpbmcgdHJhdmVyc2FsLlxuICAgKi9cbiAgYnVpbGRFbnRyaWVzKFxuICAgIGZsb3dTZW50ZW5jZXM6IHN0cmluZ1tdLFxuICAgIHJlY29yZGVyOiBOYXJyYXRpdmVSZWNvcmRlcixcbiAgICBzZW50ZW5jZVN0YWdlTmFtZXM/OiAoc3RyaW5nIHwgdW5kZWZpbmVkKVtdLFxuICApOiBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W10ge1xuICAgIGNvbnN0IGVudHJpZXM6IENvbWJpbmVkTmFycmF0aXZlRW50cnlbXSA9IFtdO1xuICAgIGNvbnN0IHN0YWdlRGF0YSA9IHJlY29yZGVyLmdldFN0YWdlRGF0YSgpO1xuICAgIGNvbnN0IHVzZWRTdGFnZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBsZXQgc3RhZ2VDb3VudGVyID0gMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmxvd1NlbnRlbmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgc2VudGVuY2UgPSBmbG93U2VudGVuY2VzW2ldO1xuICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZVNlbnRlbmNlKHNlbnRlbmNlKTtcbiAgICAgIC8vIFByZWZlciB0aGUgYWN0dWFsIHN0YWdlIG5hbWUgZnJvbSB0aGUgcmVjb3JkZXIgb3ZlciByZWdleC1wYXJzZWQgZGVzY3JpcHRpb24gdGV4dFxuICAgICAgY29uc3QgcmVzb2x2ZWRTdGFnZU5hbWUgPSBzZW50ZW5jZVN0YWdlTmFtZXM/LltpXSA/PyBwYXJzZWQuc3RhZ2VOYW1lO1xuXG4gICAgICBpZiAocGFyc2VkLnR5cGUgPT09ICdzdGFnZScpIHtcbiAgICAgICAgc3RhZ2VDb3VudGVyKys7XG4gICAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgICAgICB0ZXh0OiBgU3RhZ2UgJHtzdGFnZUNvdW50ZXJ9OiAke3NlbnRlbmNlfWAsXG4gICAgICAgICAgZGVwdGg6IDAsXG4gICAgICAgICAgc3RhZ2VOYW1lOiByZXNvbHZlZFN0YWdlTmFtZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXNvbHZlZFN0YWdlTmFtZSkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmZpbmRTdGFnZURhdGEocmVzb2x2ZWRTdGFnZU5hbWUsIHN0YWdlRGF0YSk7XG4gICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIHVzZWRTdGFnZXMuYWRkKGRhdGEuc3RhZ2VOYW1lKTtcbiAgICAgICAgICAgIHRoaXMuYWRkU3RlcEVudHJpZXMoZW50cmllcywgZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBhcnNlZC50eXBlID09PSAnY29uZGl0aW9uJykge1xuICAgICAgICBlbnRyaWVzLnB1c2goeyB0eXBlOiAnY29uZGl0aW9uJywgdGV4dDogYFtDb25kaXRpb25dOiAke3NlbnRlbmNlfWAsIGRlcHRoOiAwLCBzdGFnZU5hbWU6IHJlc29sdmVkU3RhZ2VOYW1lIH0pO1xuICAgICAgICAvLyBGb3IgY29uZGl0aW9ucywgYWxzbyBsb29rIHVwIHRoZSBjaG9zZW4gYnJhbmNoJ3MgZGF0YVxuICAgICAgICBpZiAocGFyc2VkLnN0YWdlTmFtZSkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmZpbmRTdGFnZURhdGEocGFyc2VkLnN0YWdlTmFtZSwgc3RhZ2VEYXRhKTtcbiAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgdXNlZFN0YWdlcy5hZGQoZGF0YS5zdGFnZU5hbWUpO1xuICAgICAgICAgICAgdGhpcy5hZGRTdGVwRW50cmllcyhlbnRyaWVzLCBkYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWxzbyBtYXJrIHRoZSBkZWNpZGVyIHN0YWdlIGl0c2VsZiBhcyB1c2VkICh0aGUgcmVzb2x2ZWRTdGFnZU5hbWUpXG4gICAgICAgIGlmIChyZXNvbHZlZFN0YWdlTmFtZSkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmZpbmRTdGFnZURhdGEocmVzb2x2ZWRTdGFnZU5hbWUsIHN0YWdlRGF0YSk7XG4gICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIHVzZWRTdGFnZXMuYWRkKGRhdGEuc3RhZ2VOYW1lKTtcbiAgICAgICAgICAgIC8vIE9ubHkgYWRkIHN0ZXAgZW50cmllcyBpZiB0aGUgY2hvc2VuIGJyYW5jaCBkaWRuJ3QgYWxyZWFkeSBjb3ZlciBpdFxuICAgICAgICAgICAgaWYgKCFwYXJzZWQuc3RhZ2VOYW1lIHx8IHBhcnNlZC5zdGFnZU5hbWUgIT09IHJlc29sdmVkU3RhZ2VOYW1lKSB7XG4gICAgICAgICAgICAgIHRoaXMuYWRkU3RlcEVudHJpZXMoZW50cmllcywgZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBhcnNlZC50eXBlID09PSAnZm9yaycpIHtcbiAgICAgICAgZW50cmllcy5wdXNoKHsgdHlwZTogJ2ZvcmsnLCB0ZXh0OiBgW1BhcmFsbGVsXTogJHtzZW50ZW5jZX1gLCBkZXB0aDogMCB9KTtcbiAgICAgIH0gZWxzZSBpZiAocGFyc2VkLnR5cGUgPT09ICdzdWJmbG93Jykge1xuICAgICAgICBlbnRyaWVzLnB1c2goeyB0eXBlOiAnc3ViZmxvdycsIHRleHQ6IHNlbnRlbmNlLCBkZXB0aDogMCB9KTtcbiAgICAgIH0gZWxzZSBpZiAocGFyc2VkLnR5cGUgPT09ICdsb29wJykge1xuICAgICAgICBlbnRyaWVzLnB1c2goeyB0eXBlOiAnbG9vcCcsIHRleHQ6IHNlbnRlbmNlLCBkZXB0aDogMCB9KTtcbiAgICAgIH0gZWxzZSBpZiAocGFyc2VkLnR5cGUgPT09ICdicmVhaycpIHtcbiAgICAgICAgZW50cmllcy5wdXNoKHsgdHlwZTogJ2JyZWFrJywgdGV4dDogc2VudGVuY2UsIGRlcHRoOiAwIH0pO1xuICAgICAgfSBlbHNlIGlmIChwYXJzZWQudHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgICBlbnRyaWVzLnB1c2goeyB0eXBlOiAnZXJyb3InLCB0ZXh0OiBgW0Vycm9yXTogJHtzZW50ZW5jZX1gLCBkZXB0aDogMCB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgc3RhZ2VzIHdpdGggb3BlcmF0aW9ucyB0aGF0IHdlcmVuJ3QgcmVmZXJlbmNlZCBpbiBmbG93IHNlbnRlbmNlc1xuICAgIGZvciAoY29uc3QgW3N0YWdlTmFtZSwgZGF0YV0gb2YgQXJyYXkuZnJvbShzdGFnZURhdGEuZW50cmllcygpKSkge1xuICAgICAgaWYgKCF1c2VkU3RhZ2VzLmhhcyhzdGFnZU5hbWUpICYmIGRhdGEub3BlcmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHN0YWdlQ291bnRlcisrO1xuICAgICAgICBlbnRyaWVzLnB1c2goeyB0eXBlOiAnc3RhZ2UnLCB0ZXh0OiBgU3RhZ2UgJHtzdGFnZUNvdW50ZXJ9OiAke3N0YWdlTmFtZX1gLCBkZXB0aDogMCwgc3RhZ2VOYW1lIH0pO1xuICAgICAgICB0aGlzLmFkZFN0ZXBFbnRyaWVzKGVudHJpZXMsIGRhdGEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlbnRyaWVzO1xuICB9XG5cbiAgYnVpbGQoZmxvd1NlbnRlbmNlczogc3RyaW5nW10sIHJlY29yZGVyOiBOYXJyYXRpdmVSZWNvcmRlciwgc2VudGVuY2VTdGFnZU5hbWVzPzogKHN0cmluZyB8IHVuZGVmaW5lZClbXSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZEVudHJpZXMoZmxvd1NlbnRlbmNlcywgcmVjb3JkZXIsIHNlbnRlbmNlU3RhZ2VOYW1lcykubWFwKChlbnRyeSkgPT4ge1xuICAgICAgY29uc3QgaW5kZW50ID0gdGhpcy5vcHRpb25zLmluZGVudC5yZXBlYXQoZW50cnkuZGVwdGgpO1xuICAgICAgcmV0dXJuIGAke2luZGVudH0ke2VudHJ5LnRleHR9YDtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQcml2YXRlIGhlbHBlcnMg4pSA4pSAXG5cbiAgcHJpdmF0ZSBhZGRTdGVwRW50cmllcyhlbnRyaWVzOiBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W10sIGRhdGE6IFN0YWdlTmFycmF0aXZlRGF0YSk6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgb3Agb2YgZGF0YS5vcGVyYXRpb25zKSB7XG4gICAgICBjb25zdCBzdGVwUHJlZml4ID0gdGhpcy5vcHRpb25zLmluY2x1ZGVTdGVwTnVtYmVycyAmJiBvcC5zdGVwTnVtYmVyID8gYFN0ZXAgJHtvcC5zdGVwTnVtYmVyfTogYCA6ICcnO1xuXG4gICAgICBsZXQgdGV4dDogc3RyaW5nO1xuICAgICAgaWYgKG9wLnR5cGUgPT09ICdyZWFkJykge1xuICAgICAgICB0ZXh0ID1cbiAgICAgICAgICB0aGlzLm9wdGlvbnMuaW5jbHVkZVZhbHVlcyAmJiBvcC52YWx1ZVN1bW1hcnlcbiAgICAgICAgICAgID8gYCR7c3RlcFByZWZpeH1SZWFkICR7b3Aua2V5fSA9ICR7b3AudmFsdWVTdW1tYXJ5fWBcbiAgICAgICAgICAgIDogYCR7c3RlcFByZWZpeH1SZWFkICR7b3Aua2V5fWA7XG4gICAgICB9IGVsc2UgaWYgKG9wLm9wZXJhdGlvbiA9PT0gJ2RlbGV0ZScpIHtcbiAgICAgICAgdGV4dCA9IGAke3N0ZXBQcmVmaXh9RGVsZXRlICR7b3Aua2V5fWA7XG4gICAgICB9IGVsc2UgaWYgKG9wLm9wZXJhdGlvbiA9PT0gJ3VwZGF0ZScpIHtcbiAgICAgICAgdGV4dCA9IHRoaXMub3B0aW9ucy5pbmNsdWRlVmFsdWVzXG4gICAgICAgICAgPyBgJHtzdGVwUHJlZml4fVVwZGF0ZSAke29wLmtleX0gPSAke29wLnZhbHVlU3VtbWFyeX1gXG4gICAgICAgICAgOiBgJHtzdGVwUHJlZml4fVVwZGF0ZSAke29wLmtleX1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGV4dCA9IHRoaXMub3B0aW9ucy5pbmNsdWRlVmFsdWVzXG4gICAgICAgICAgPyBgJHtzdGVwUHJlZml4fVdyaXRlICR7b3Aua2V5fSA9ICR7b3AudmFsdWVTdW1tYXJ5fWBcbiAgICAgICAgICA6IGAke3N0ZXBQcmVmaXh9V3JpdGUgJHtvcC5rZXl9YDtcbiAgICAgIH1cblxuICAgICAgZW50cmllcy5wdXNoKHsgdHlwZTogJ3N0ZXAnLCB0ZXh0LCBkZXB0aDogMSwgc3RhZ2VOYW1lOiBkYXRhLnN0YWdlTmFtZSwgc3RlcE51bWJlcjogb3Auc3RlcE51bWJlciB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZpbmRTdGFnZURhdGEobmFtZTogc3RyaW5nLCBzdGFnZURhdGE6IE1hcDxzdHJpbmcsIFN0YWdlTmFycmF0aXZlRGF0YT4pOiBTdGFnZU5hcnJhdGl2ZURhdGEgfCB1bmRlZmluZWQge1xuICAgIGlmIChzdGFnZURhdGEuaGFzKG5hbWUpKSByZXR1cm4gc3RhZ2VEYXRhLmdldChuYW1lKTtcbiAgICBmb3IgKGNvbnN0IFtzdGFnZU5hbWUsIGRhdGFdIG9mIEFycmF5LmZyb20oc3RhZ2VEYXRhLmVudHJpZXMoKSkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgc3RhZ2VOYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobmFtZS50b0xvd2VyQ2FzZSgpKSB8fFxuICAgICAgICBuYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc3RhZ2VOYW1lLnRvTG93ZXJDYXNlKCkpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlU2VudGVuY2Uoc2VudGVuY2U6IHN0cmluZyk6IHsgdHlwZTogc3RyaW5nOyBzdGFnZU5hbWU/OiBzdHJpbmcgfSB7XG4gICAgaWYgKHNlbnRlbmNlLnN0YXJ0c1dpdGgoJ1RoZSBwcm9jZXNzIGJlZ2FuJykpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gc2VudGVuY2UubWF0Y2goL1RoZSBwcm9jZXNzIGJlZ2FuKD86OiAoLispfCB3aXRoICguKykpXFwuLyk7XG4gICAgICByZXR1cm4geyB0eXBlOiAnc3RhZ2UnLCBzdGFnZU5hbWU6IChtYXRjaD8uWzFdID8/IG1hdGNoPy5bMl0pPy50cmltKCkgfTtcbiAgICB9XG4gICAgaWYgKHNlbnRlbmNlLnN0YXJ0c1dpdGgoJ05leHQnKSkge1xuICAgICAgY29uc3QgbWF0Y2ggPSBzZW50ZW5jZS5tYXRjaCgvTmV4dCg/Oiw/IGl0IG1vdmVkIG9uIHRvICguKyl8IHN0ZXA6ICguKykpXFwuLyk7XG4gICAgICByZXR1cm4geyB0eXBlOiAnc3RhZ2UnLCBzdGFnZU5hbWU6IChtYXRjaD8uWzFdID8/IG1hdGNoPy5bMl0pPy50cmltKCkgfTtcbiAgICB9XG4gICAgaWYgKHNlbnRlbmNlLmluY2x1ZGVzKCdkZWNpc2lvbiB3YXMgbWFkZScpIHx8IHNlbnRlbmNlLmluY2x1ZGVzKCdpdCBjaG9zZScpIHx8IHNlbnRlbmNlLmluY2x1ZGVzKCdzbyBpdCBjaG9zZScpKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHNlbnRlbmNlLm1hdGNoKC9jaG9zZSAoLispXFwuLyk7XG4gICAgICByZXR1cm4geyB0eXBlOiAnY29uZGl0aW9uJywgc3RhZ2VOYW1lOiBtYXRjaD8uWzFdPy50cmltKCkgfTtcbiAgICB9XG4gICAgaWYgKHNlbnRlbmNlLnN0YXJ0c1dpdGgoJ0l0ICcpICYmIHNlbnRlbmNlLmluY2x1ZGVzKCdjaG9zZScpKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHNlbnRlbmNlLm1hdGNoKC9jaG9zZSAoLispXFwuLyk7XG4gICAgICByZXR1cm4geyB0eXBlOiAnY29uZGl0aW9uJywgc3RhZ2VOYW1lOiBtYXRjaD8uWzFdPy50cmltKCkgfTtcbiAgICB9XG4gICAgaWYgKHNlbnRlbmNlLmluY2x1ZGVzKCdwYXRocyB3ZXJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsJykgfHwgc2VudGVuY2UuaW5jbHVkZXMoJ3BhdGhzIHdlcmUgc2VsZWN0ZWQnKSlcbiAgICAgIHJldHVybiB7IHR5cGU6ICdmb3JrJyB9O1xuICAgIGlmIChzZW50ZW5jZS5zdGFydHNXaXRoKCdFbnRlcmluZycpIHx8IHNlbnRlbmNlLnN0YXJ0c1dpdGgoJ0V4aXRpbmcnKSkgcmV0dXJuIHsgdHlwZTogJ3N1YmZsb3cnIH07XG4gICAgaWYgKHNlbnRlbmNlLnN0YXJ0c1dpdGgoJ09uIHBhc3MnKSkgcmV0dXJuIHsgdHlwZTogJ2xvb3AnIH07XG4gICAgaWYgKHNlbnRlbmNlLnN0YXJ0c1dpdGgoJ0V4ZWN1dGlvbiBzdG9wcGVkJykpIHJldHVybiB7IHR5cGU6ICdicmVhaycgfTtcbiAgICBpZiAoc2VudGVuY2Uuc3RhcnRzV2l0aCgnQW4gZXJyb3Igb2NjdXJyZWQnKSkgcmV0dXJuIHsgdHlwZTogJ2Vycm9yJyB9O1xuICAgIHJldHVybiB7IHR5cGU6ICdzdGFnZScgfTtcbiAgfVxufVxuIl19
@@ -0,0 +1,267 @@
1
+ /**
2
+ * CombinedNarrativeRecorder — Inline narrative builder that merges flow + data during traversal.
3
+ *
4
+ * Replaces the post-processing CombinedNarrativeBuilder by implementing BOTH
5
+ * FlowRecorder (control-flow events) and Recorder (scope data events).
6
+ *
7
+ * Event ordering guarantees this works:
8
+ * 1. Scope events (onRead, onWrite) fire DURING stage execution
9
+ * 2. Flow events (onStageExecuted, onDecision) fire AFTER stage execution
10
+ * 3. Both carry the same `stageName` — no matching ambiguity
11
+ *
12
+ * So we buffer scope ops per-stage, then when the flow event arrives,
13
+ * emit the stage entry + flush the buffered ops in one pass.
14
+ */
15
+ // ── Recorder ───────────────────────────────────────────────────────────────
16
+ export class CombinedNarrativeRecorder {
17
+ constructor(options) {
18
+ var _a, _b, _c, _d;
19
+ this.entries = [];
20
+ this.pendingOps = new Map();
21
+ this.stageCounter = 0;
22
+ this.isFirstStage = true;
23
+ this.id = (_a = options === null || options === void 0 ? void 0 : options.id) !== null && _a !== void 0 ? _a : 'combined-narrative';
24
+ this.includeStepNumbers = (_b = options === null || options === void 0 ? void 0 : options.includeStepNumbers) !== null && _b !== void 0 ? _b : true;
25
+ this.includeValues = (_c = options === null || options === void 0 ? void 0 : options.includeValues) !== null && _c !== void 0 ? _c : true;
26
+ this.maxValueLength = (_d = options === null || options === void 0 ? void 0 : options.maxValueLength) !== null && _d !== void 0 ? _d : 80;
27
+ }
28
+ // ── Scope channel (fires first, during stage execution) ───────────────
29
+ onRead(event) {
30
+ if (!event.key)
31
+ return;
32
+ this.bufferOp(event.stageName, {
33
+ type: 'read',
34
+ key: event.key,
35
+ valueSummary: summarizeValue(event.value, this.maxValueLength),
36
+ });
37
+ }
38
+ onWrite(event) {
39
+ this.bufferOp(event.stageName, {
40
+ type: 'write',
41
+ key: event.key,
42
+ valueSummary: summarizeValue(event.value, this.maxValueLength),
43
+ operation: event.operation,
44
+ });
45
+ }
46
+ // ── Flow channel (fires after stage execution) ────────────────────────
47
+ onStageExecuted(event) {
48
+ this.stageCounter++;
49
+ const text = this.isFirstStage
50
+ ? event.description
51
+ ? `The process began: ${event.description}.`
52
+ : `The process began with ${event.stageName}.`
53
+ : event.description
54
+ ? `Next step: ${event.description}.`
55
+ : `Next, it moved on to ${event.stageName}.`;
56
+ this.isFirstStage = false;
57
+ this.entries.push({
58
+ type: 'stage',
59
+ text: `Stage ${this.stageCounter}: ${text}`,
60
+ depth: 0,
61
+ stageName: event.stageName,
62
+ });
63
+ this.flushOps(event.stageName);
64
+ }
65
+ onDecision(event) {
66
+ // Emit the decider stage entry (deciders don't fire onStageExecuted)
67
+ this.stageCounter++;
68
+ const stageText = this.isFirstStage
69
+ ? event.description
70
+ ? `The process began: ${event.description}.`
71
+ : `The process began with ${event.decider}.`
72
+ : event.description
73
+ ? `Next step: ${event.description}.`
74
+ : `Next, it moved on to ${event.decider}.`;
75
+ this.isFirstStage = false;
76
+ this.entries.push({
77
+ type: 'stage',
78
+ text: `Stage ${this.stageCounter}: ${stageText}`,
79
+ depth: 0,
80
+ stageName: event.decider,
81
+ });
82
+ this.flushOps(event.decider);
83
+ // Emit the condition entry
84
+ const branchName = event.chosen;
85
+ let conditionText;
86
+ if (event.description && event.rationale) {
87
+ conditionText = `It ${event.description}: ${event.rationale}, so it chose ${branchName}.`;
88
+ }
89
+ else if (event.description) {
90
+ conditionText = `It ${event.description} and chose ${branchName}.`;
91
+ }
92
+ else if (event.rationale) {
93
+ conditionText = `A decision was made: ${event.rationale}, so the path taken was ${branchName}.`;
94
+ }
95
+ else {
96
+ conditionText = `A decision was made, and the path taken was ${branchName}.`;
97
+ }
98
+ this.entries.push({
99
+ type: 'condition',
100
+ text: `[Condition]: ${conditionText}`,
101
+ depth: 0,
102
+ stageName: event.decider,
103
+ });
104
+ }
105
+ onNext() {
106
+ // No-op. onStageExecuted already has the description for the next stage.
107
+ // For deciders (no onStageExecuted), onDecision handles the announcement.
108
+ }
109
+ onFork(event) {
110
+ const names = event.children.join(', ');
111
+ this.entries.push({
112
+ type: 'fork',
113
+ text: `[Parallel]: ${event.children.length} paths were executed in parallel: ${names}.`,
114
+ depth: 0,
115
+ });
116
+ }
117
+ onSelected(event) {
118
+ const names = event.selected.join(', ');
119
+ this.entries.push({
120
+ type: 'fork',
121
+ text: `[Selected]: ${event.selected.length} of ${event.total} paths were selected: ${names}.`,
122
+ depth: 0,
123
+ });
124
+ }
125
+ onSubflowEntry(event) {
126
+ const text = event.description
127
+ ? `Entering the ${event.name} subflow: ${event.description}.`
128
+ : `Entering the ${event.name} subflow.`;
129
+ this.entries.push({ type: 'subflow', text, depth: 0 });
130
+ }
131
+ onSubflowExit(event) {
132
+ this.entries.push({
133
+ type: 'subflow',
134
+ text: `Exiting the ${event.name} subflow.`,
135
+ depth: 0,
136
+ });
137
+ }
138
+ onLoop(event) {
139
+ const text = event.description
140
+ ? `On pass ${event.iteration}: ${event.description} again.`
141
+ : `On pass ${event.iteration} through ${event.target}.`;
142
+ this.entries.push({ type: 'loop', text, depth: 0 });
143
+ }
144
+ onBreak(event) {
145
+ this.entries.push({
146
+ type: 'break',
147
+ text: `Execution stopped at ${event.stageName}.`,
148
+ depth: 0,
149
+ stageName: event.stageName,
150
+ });
151
+ }
152
+ /**
153
+ * Handles errors from both channels:
154
+ * - FlowRecorder.onError (FlowErrorEvent with message + structuredError)
155
+ * - Recorder.onError (ErrorEvent from scope system — ignored for narrative)
156
+ */
157
+ onError(event) {
158
+ var _a, _b;
159
+ // Only handle flow errors (which have `message` and `structuredError`)
160
+ if (typeof event.message !== 'string')
161
+ return;
162
+ const flowEvent = event;
163
+ let text = `An error occurred at ${flowEvent.stageName}: ${flowEvent.message}.`;
164
+ if ((_b = (_a = flowEvent.structuredError) === null || _a === void 0 ? void 0 : _a.issues) === null || _b === void 0 ? void 0 : _b.length) {
165
+ const details = flowEvent.structuredError.issues
166
+ .map((issue) => {
167
+ const path = issue.path.length > 0 ? issue.path.join('.') : '(root)';
168
+ return `${path}: ${issue.message}`;
169
+ })
170
+ .join('; ');
171
+ text += ` Validation issues: ${details}.`;
172
+ }
173
+ this.entries.push({
174
+ type: 'error',
175
+ text: `[Error]: ${text}`,
176
+ depth: 0,
177
+ stageName: flowEvent.stageName,
178
+ });
179
+ }
180
+ // ── Output ────────────────────────────────────────────────────────────
181
+ /** Returns structured entries for programmatic consumption. */
182
+ getEntries() {
183
+ return [...this.entries];
184
+ }
185
+ /** Returns formatted narrative lines (same output as CombinedNarrativeBuilder.build). */
186
+ getNarrative(indent = ' ') {
187
+ return this.entries.map((entry) => `${indent.repeat(entry.depth)}${entry.text}`);
188
+ }
189
+ /** Clears all state. Called automatically before each run. */
190
+ clear() {
191
+ this.entries = [];
192
+ this.pendingOps.clear();
193
+ this.stageCounter = 0;
194
+ this.isFirstStage = true;
195
+ }
196
+ // ── Private helpers ───────────────────────────────────────────────────
197
+ bufferOp(stageName, op) {
198
+ let ops = this.pendingOps.get(stageName);
199
+ if (!ops) {
200
+ ops = [];
201
+ this.pendingOps.set(stageName, ops);
202
+ }
203
+ ops.push({ ...op, stepNumber: ops.length + 1 });
204
+ }
205
+ flushOps(stageName) {
206
+ const ops = this.pendingOps.get(stageName);
207
+ if (!ops || ops.length === 0)
208
+ return;
209
+ for (const op of ops) {
210
+ const stepPrefix = this.includeStepNumbers ? `Step ${op.stepNumber}: ` : '';
211
+ let text;
212
+ if (op.type === 'read') {
213
+ text =
214
+ this.includeValues && op.valueSummary
215
+ ? `${stepPrefix}Read ${op.key} = ${op.valueSummary}`
216
+ : `${stepPrefix}Read ${op.key}`;
217
+ }
218
+ else if (op.operation === 'delete') {
219
+ text = `${stepPrefix}Delete ${op.key}`;
220
+ }
221
+ else if (op.operation === 'update') {
222
+ text = this.includeValues
223
+ ? `${stepPrefix}Update ${op.key} = ${op.valueSummary}`
224
+ : `${stepPrefix}Update ${op.key}`;
225
+ }
226
+ else {
227
+ text = this.includeValues
228
+ ? `${stepPrefix}Write ${op.key} = ${op.valueSummary}`
229
+ : `${stepPrefix}Write ${op.key}`;
230
+ }
231
+ this.entries.push({
232
+ type: 'step',
233
+ text,
234
+ depth: 1,
235
+ stageName,
236
+ stepNumber: op.stepNumber,
237
+ });
238
+ }
239
+ this.pendingOps.delete(stageName);
240
+ }
241
+ }
242
+ // ── Value summarizer (same logic as NarrativeRecorder) ─────────────────────
243
+ function summarizeValue(value, maxLen) {
244
+ if (value === undefined)
245
+ return 'undefined';
246
+ if (value === null)
247
+ return 'null';
248
+ if (typeof value === 'string') {
249
+ return value.length <= maxLen ? `"${value}"` : `"${value.slice(0, maxLen - 3)}..."`;
250
+ }
251
+ if (typeof value === 'number' || typeof value === 'boolean')
252
+ return String(value);
253
+ if (Array.isArray(value)) {
254
+ return value.length === 0 ? '[]' : `(${value.length} item${value.length > 1 ? 's' : ''})`;
255
+ }
256
+ if (typeof value === 'object') {
257
+ const keys = Object.keys(value);
258
+ if (keys.length === 0)
259
+ return '{}';
260
+ const preview = keys.slice(0, 4).join(', ');
261
+ const suffix = keys.length > 4 ? `, ... (${keys.length} keys)` : '';
262
+ const result = `{${preview}${suffix}}`;
263
+ return result.length <= maxLen ? result : `{${keys.length} keys}`;
264
+ }
265
+ return String(value);
266
+ }
267
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL25hcnJhdGl2ZS9Db21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFnQ0gsOEVBQThFO0FBRTlFLE1BQU0sT0FBTyx5QkFBeUI7SUFZcEMsWUFBWSxPQUE0RDs7UUFUaEUsWUFBTyxHQUE2QixFQUFFLENBQUM7UUFDdkMsZUFBVSxHQUFHLElBQUksR0FBRyxFQUF3QixDQUFDO1FBQzdDLGlCQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBTzFCLElBQUksQ0FBQyxFQUFFLEdBQUcsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsRUFBRSxtQ0FBSSxvQkFBb0IsQ0FBQztRQUM5QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsa0JBQWtCLG1DQUFJLElBQUksQ0FBQztRQUM5RCxJQUFJLENBQUMsYUFBYSxHQUFHLE1BQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLGFBQWEsbUNBQUksSUFBSSxDQUFDO1FBQ3BELElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsY0FBYyxtQ0FBSSxFQUFFLENBQUM7SUFDdEQsQ0FBQztJQUVELHlFQUF5RTtJQUV6RSxNQUFNLENBQUMsS0FBZ0I7UUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHO1lBQUUsT0FBTztRQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUU7WUFDN0IsSUFBSSxFQUFFLE1BQU07WUFDWixHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUc7WUFDZCxZQUFZLEVB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QUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztJQUM1RixDQUFDO0lBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQWdDLENBQUMsQ0FBQztRQUMzRCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ25DLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxJQUFJLENBQUMsTUFBTSxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNwRSxNQUFNLE1BQU0sR0FBRyxJQUFJLE9BQU8sR0FBRyxNQUFNLEdBQUcsQ0FBQztRQUN2QyxPQUFPLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sUUFBUSxDQUFDO0lBQ3BFLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIOKAlCBJbmxpbmUgbmFycmF0aXZlIGJ1aWxkZXIgdGhhdCBtZXJnZXMgZmxvdyArIGRhdGEgZHVyaW5nIHRyYXZlcnNhbC5cbiAqXG4gKiBSZXBsYWNlcyB0aGUgcG9zdC1wcm9jZXNzaW5nIENvbWJpbmVkTmFycmF0aXZlQnVpbGRlciBieSBpbXBsZW1lbnRpbmcgQk9USFxuICogRmxvd1JlY29yZGVyIChjb250cm9sLWZsb3cgZXZlbnRzKSBhbmQgUmVjb3JkZXIgKHNjb3BlIGRhdGEgZXZlbnRzKS5cbiAqXG4gKiBFdmVudCBvcmRlcmluZyBndWFyYW50ZWVzIHRoaXMgd29ya3M6XG4gKiAgIDEuIFNjb3BlIGV2ZW50cyAob25SZWFkLCBvbldyaXRlKSBmaXJlIERVUklORyBzdGFnZSBleGVjdXRpb25cbiAqICAgMi4gRmxvdyBldmVudHMgKG9uU3RhZ2VFeGVjdXRlZCwgb25EZWNpc2lvbikgZmlyZSBBRlRFUiBzdGFnZSBleGVjdXRpb25cbiAqICAgMy4gQm90aCBjYXJyeSB0aGUgc2FtZSBgc3RhZ2VOYW1lYCDigJQgbm8gbWF0Y2hpbmcgYW1iaWd1aXR5XG4gKlxuICogU28gd2UgYnVmZmVyIHNjb3BlIG9wcyBwZXItc3RhZ2UsIHRoZW4gd2hlbiB0aGUgZmxvdyBldmVudCBhcnJpdmVzLFxuICogZW1pdCB0aGUgc3RhZ2UgZW50cnkgKyBmbHVzaCB0aGUgYnVmZmVyZWQgb3BzIGluIG9uZSBwYXNzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmVhZEV2ZW50LCBSZWNvcmRlciwgV3JpdGVFdmVudCB9IGZyb20gJy4uLy4uL3Njb3BlL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWROYXJyYXRpdmVFbnRyeSB9IGZyb20gJy4vQ29tYmluZWROYXJyYXRpdmVCdWlsZGVyJztcbmltcG9ydCB0eXBlIHtcbiAgRmxvd0JyZWFrRXZlbnQsXG4gIEZsb3dEZWNpc2lvbkV2ZW50LFxuICBGbG93RXJyb3JFdmVudCxcbiAgRmxvd0ZvcmtFdmVudCxcbiAgRmxvd0xvb3BFdmVudCxcbiAgRmxvd1JlY29yZGVyLFxuICBGbG93U2VsZWN0ZWRFdmVudCxcbiAgRmxvd1N0YWdlRXZlbnQsXG4gIEZsb3dTdWJmbG93RXZlbnQsXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vLyDilIDilIAgVHlwZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmludGVyZmFjZSBCdWZmZXJlZE9wIHtcbiAgdHlwZTogJ3JlYWQnIHwgJ3dyaXRlJztcbiAga2V5OiBzdHJpbmc7XG4gIHZhbHVlU3VtbWFyeTogc3RyaW5nO1xuICBvcGVyYXRpb24/OiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZSc7XG4gIHN0ZXBOdW1iZXI6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyT3B0aW9ucyB7XG4gIGluY2x1ZGVTdGVwTnVtYmVycz86IGJvb2xlYW47XG4gIGluY2x1ZGVWYWx1ZXM/OiBib29sZWFuO1xuICBtYXhWYWx1ZUxlbmd0aD86IG51bWJlcjtcbn1cblxuLy8g4pSA4pSAIFJlY29yZGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgY2xhc3MgQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlciBpbXBsZW1lbnRzIEZsb3dSZWNvcmRlciwgUmVjb3JkZXIge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIHByaXZhdGUgZW50cmllczogQ29tYmluZWROYXJyYXRpdmVFbnRyeVtdID0gW107XG4gIHByaXZhdGUgcGVuZGluZ09wcyA9IG5ldyBNYXA8c3RyaW5nLCBCdWZmZXJlZE9wW10+KCk7XG4gIHByaXZhdGUgc3RhZ2VDb3VudGVyID0gMDtcbiAgcHJpdmF0ZSBpc0ZpcnN0U3RhZ2UgPSB0cnVlO1xuXG4gIHByaXZhdGUgaW5jbHVkZVN0ZXBOdW1iZXJzOiBib29sZWFuO1xuICBwcml2YXRlIGluY2x1ZGVWYWx1ZXM6IGJvb2xlYW47XG4gIHByaXZhdGUgbWF4VmFsdWVMZW5ndGg6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlck9wdGlvbnMgJiB7IGlkPzogc3RyaW5nIH0pIHtcbiAgICB0aGlzLmlkID0gb3B0aW9ucz8uaWQgPz8gJ2NvbWJpbmVkLW5hcnJhdGl2ZSc7XG4gICAgdGhpcy5pbmNsdWRlU3RlcE51bWJlcnMgPSBvcHRpb25zPy5pbmNsdWRlU3RlcE51bWJlcnMgPz8gdHJ1ZTtcbiAgICB0aGlzLmluY2x1ZGVWYWx1ZXMgPSBvcHRpb25zPy5pbmNsdWRlVmFsdWVzID8/IHRydWU7XG4gICAgdGhpcy5tYXhWYWx1ZUxlbmd0aCA9IG9wdGlvbnM/Lm1heFZhbHVlTGVuZ3RoID8/IDgwO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNjb3BlIGNoYW5uZWwgKGZpcmVzIGZpcnN0LCBkdXJpbmcgc3RhZ2UgZXhlY3V0aW9uKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBvblJlYWQoZXZlbnQ6IFJlYWRFdmVudCk6IHZvaWQge1xuICAgIGlmICghZXZlbnQua2V5KSByZXR1cm47XG4gICAgdGhpcy5idWZmZXJPcChldmVudC5zdGFnZU5hbWUsIHtcbiAgICAgIHR5cGU6ICdyZWFkJyxcbiAgICAgIGtleTogZXZlbnQua2V5LFxuICAgICAgdmFsdWVTdW1tYXJ5OiBzdW1tYXJpemVWYWx1ZShldmVudC52YWx1ZSwgdGhpcy5tYXhWYWx1ZUxlbmd0aCksXG4gICAgfSk7XG4gIH1cblxuICBvbldyaXRlKGV2ZW50OiBXcml0ZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5idWZmZXJPcChldmVudC5zdGFnZU5hbWUsIHtcbiAgICAgIHR5cGU6ICd3cml0ZScsXG4gICAgICBrZXk6IGV2ZW50LmtleSxcbiAgICAgIHZhbHVlU3VtbWFyeTogc3VtbWFyaXplVmFsdWUoZXZlbnQudmFsdWUsIHRoaXMubWF4VmFsdWVMZW5ndGgpLFxuICAgICAgb3BlcmF0aW9uOiBldmVudC5vcGVyYXRpb24sXG4gICAgfSk7XG4gIH1cblxuICAvLyDilIDilIAgRmxvdyBjaGFubmVsIChmaXJlcyBhZnRlciBzdGFnZSBleGVjdXRpb24pIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIG9uU3RhZ2VFeGVjdXRlZChldmVudDogRmxvd1N0YWdlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLnN0YWdlQ291bnRlcisrO1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLmlzRmlyc3RTdGFnZVxuICAgICAgPyBldmVudC5kZXNjcmlwdGlvblxuICAgICAgICA/IGBUaGUgcHJvY2VzcyBiZWdhbjogJHtldmVudC5kZXNjcmlwdGlvbn0uYFxuICAgICAgICA6IGBUaGUgcHJvY2VzcyBiZWdhbiB3aXRoICR7ZXZlbnQuc3RhZ2VOYW1lfS5gXG4gICAgICA6IGV2ZW50LmRlc2NyaXB0aW9uXG4gICAgICA/IGBOZXh0IHN0ZXA6ICR7ZXZlbnQuZGVzY3JpcHRpb259LmBcbiAgICAgIDogYE5leHQsIGl0IG1vdmVkIG9uIHRvICR7ZXZlbnQuc3RhZ2VOYW1lfS5gO1xuICAgIHRoaXMuaXNGaXJzdFN0YWdlID0gZmFsc2U7XG5cbiAgICB0aGlzLmVudHJpZXMucHVzaCh7XG4gICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgdGV4dDogYFN0YWdlICR7dGhpcy5zdGFnZUNvdW50ZXJ9OiAke3RleHR9YCxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgc3RhZ2VOYW1lOiBldmVudC5zdGFnZU5hbWUsXG4gICAgfSk7XG4gICAgdGhpcy5mbHVzaE9wcyhldmVudC5zdGFnZU5hbWUpO1xuICB9XG5cbiAgb25EZWNpc2lvbihldmVudDogRmxvd0RlY2lzaW9uRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBFbWl0IHRoZSBkZWNpZGVyIHN0YWdlIGVudHJ5IChkZWNpZGVycyBkb24ndCBmaXJlIG9uU3RhZ2VFeGVjdXRlZClcbiAgICB0aGlzLnN0YWdlQ291bnRlcisrO1xuICAgIGNvbnN0IHN0YWdlVGV4dCA9IHRoaXMuaXNGaXJzdFN0YWdlXG4gICAgICA/IGV2ZW50LmRlc2NyaXB0aW9uXG4gICAgICAgID8gYFRoZSBwcm9jZXNzIGJlZ2FuOiAke2V2ZW50LmRlc2NyaXB0aW9ufS5gXG4gICAgICAgIDogYFRoZSBwcm9jZXNzIGJlZ2FuIHdpdGggJHtldmVudC5kZWNpZGVyfS5gXG4gICAgICA6IGV2ZW50LmRlc2NyaXB0aW9uXG4gICAgICA/IGBOZXh0IHN0ZXA6ICR7ZXZlbnQuZGVzY3JpcHRpb259LmBcbiAgICAgIDogYE5leHQsIGl0IG1vdmVkIG9uIHRvICR7ZXZlbnQuZGVjaWRlcn0uYDtcbiAgICB0aGlzLmlzRmlyc3RTdGFnZSA9IGZhbHNlO1xuXG4gICAgdGhpcy5lbnRyaWVzLnB1c2goe1xuICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIHRleHQ6IGBTdGFnZSAke3RoaXMuc3RhZ2VDb3VudGVyfTogJHtzdGFnZVRleHR9YCxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgc3RhZ2VOYW1lOiBldmVudC5kZWNpZGVyLFxuICAgIH0pO1xuICAgIHRoaXMuZmx1c2hPcHMoZXZlbnQuZGVjaWRlcik7XG5cbiAgICAvLyBFbWl0IHRoZSBjb25kaXRpb24gZW50cnlcbiAgICBjb25zdCBicmFuY2hOYW1lID0gZXZlbnQuY2hvc2VuO1xuICAgIGxldCBjb25kaXRpb25UZXh0OiBzdHJpbmc7XG4gICAgaWYgKGV2ZW50LmRlc2NyaXB0aW9uICYmIGV2ZW50LnJhdGlvbmFsZSkge1xuICAgICAgY29uZGl0aW9uVGV4dCA9IGBJdCAke2V2ZW50LmRlc2NyaXB0aW9ufTogJHtldmVudC5yYXRpb25hbGV9LCBzbyBpdCBjaG9zZSAke2JyYW5jaE5hbWV9LmA7XG4gICAgfSBlbHNlIGlmIChldmVudC5kZXNjcmlwdGlvbikge1xuICAgICAgY29uZGl0aW9uVGV4dCA9IGBJdCAke2V2ZW50LmRlc2NyaXB0aW9ufSBhbmQgY2hvc2UgJHticmFuY2hOYW1lfS5gO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQucmF0aW9uYWxlKSB7XG4gICAgICBjb25kaXRpb25UZXh0ID0gYEEgZGVjaXNpb24gd2FzIG1hZGU6ICR7ZXZlbnQucmF0aW9uYWxlfSwgc28gdGhlIHBhdGggdGFrZW4gd2FzICR7YnJhbmNoTmFtZX0uYDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZGl0aW9uVGV4dCA9IGBBIGRlY2lzaW9uIHdhcyBtYWRlLCBhbmQgdGhlIHBhdGggdGFrZW4gd2FzICR7YnJhbmNoTmFtZX0uYDtcbiAgICB9XG4gICAgdGhpcy5lbnRyaWVzLnB1c2goe1xuICAgICAgdHlwZTogJ2NvbmRpdGlvbicsXG4gICAgICB0ZXh0OiBgW0NvbmRpdGlvbl06ICR7Y29uZGl0aW9uVGV4dH1gLFxuICAgICAgZGVwdGg6IDAsXG4gICAgICBzdGFnZU5hbWU6IGV2ZW50LmRlY2lkZXIsXG4gICAgfSk7XG4gIH1cblxuICBvbk5leHQoKTogdm9pZCB7XG4gICAgLy8gTm8tb3AuIG9uU3RhZ2VFeGVjdXRlZCBhbHJlYWR5IGhhcyB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBuZXh0IHN0YWdlLlxuICAgIC8vIEZvciBkZWNpZGVycyAobm8gb25TdGFnZUV4ZWN1dGVkKSwgb25EZWNpc2lvbiBoYW5kbGVzIHRoZSBhbm5vdW5jZW1lbnQuXG4gIH1cblxuICBvbkZvcmsoZXZlbnQ6IEZsb3dGb3JrRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBuYW1lcyA9IGV2ZW50LmNoaWxkcmVuLmpvaW4oJywgJyk7XG4gICAgdGhpcy5lbnRyaWVzLnB1c2goe1xuICAgICAgdHlwZTogJ2ZvcmsnLFxuICAgICAgdGV4dDogYFtQYXJhbGxlbF06ICR7ZXZlbnQuY2hpbGRyZW4ubGVuZ3RofSBwYXRocyB3ZXJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsOiAke25hbWVzfS5gLFxuICAgICAgZGVwdGg6IDAsXG4gICAgfSk7XG4gIH1cblxuICBvblNlbGVjdGVkKGV2ZW50OiBGbG93U2VsZWN0ZWRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IG5hbWVzID0gZXZlbnQuc2VsZWN0ZWQuam9pbignLCAnKTtcbiAgICB0aGlzLmVudHJpZXMucHVzaCh7XG4gICAgICB0eXBlOiAnZm9yaycsXG4gICAgICB0ZXh0OiBgW1NlbGVjdGVkXTogJHtldmVudC5zZWxlY3RlZC5sZW5ndGh9IG9mICR7ZXZlbnQudG90YWx9IHBhdGhzIHdlcmUgc2VsZWN0ZWQ6ICR7bmFtZXN9LmAsXG4gICAgICBkZXB0aDogMCxcbiAgICB9KTtcbiAgfVxuXG4gIG9uU3ViZmxvd0VudHJ5KGV2ZW50OiBGbG93U3ViZmxvd0V2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGV4dCA9IGV2ZW50LmRlc2NyaXB0aW9uXG4gICAgICA/IGBFbnRlcmluZyB0aGUgJHtldmVudC5uYW1lfSBzdWJmbG93OiAke2V2ZW50LmRlc2NyaXB0aW9ufS5gXG4gICAgICA6IGBFbnRlcmluZyB0aGUgJHtldmVudC5uYW1lfSBzdWJmbG93LmA7XG4gICAgdGhpcy5lbnRyaWVzLnB1c2goeyB0eXBlOiAnc3ViZmxvdycsIHRleHQsIGRlcHRoOiAwIH0pO1xuICB9XG5cbiAgb25TdWJmbG93RXhpdChldmVudDogRmxvd1N1YmZsb3dFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuZW50cmllcy5wdXNoKHtcbiAgICAgIHR5cGU6ICdzdWJmbG93JyxcbiAgICAgIHRleHQ6IGBFeGl0aW5nIHRoZSAke2V2ZW50Lm5hbWV9IHN1YmZsb3cuYCxcbiAgICAgIGRlcHRoOiAwLFxuICAgIH0pO1xuICB9XG5cbiAgb25Mb29wKGV2ZW50OiBGbG93TG9vcEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGV4dCA9IGV2ZW50LmRlc2NyaXB0aW9uXG4gICAgICA/IGBPbiBwYXNzICR7ZXZlbnQuaXRlcmF0aW9ufTogJHtldmVudC5kZXNjcmlwdGlvbn0gYWdhaW4uYFxuICAgICAgOiBgT24gcGFzcyAke2V2ZW50Lml0ZXJhdGlvbn0gdGhyb3VnaCAke2V2ZW50LnRhcmdldH0uYDtcbiAgICB0aGlzLmVudHJpZXMucHVzaCh7IHR5cGU6ICdsb29wJywgdGV4dCwgZGVwdGg6IDAgfSk7XG4gIH1cblxuICBvbkJyZWFrKGV2ZW50OiBGbG93QnJlYWtFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuZW50cmllcy5wdXNoKHtcbiAgICAgIHR5cGU6ICdicmVhaycsXG4gICAgICB0ZXh0OiBgRXhlY3V0aW9uIHN0b3BwZWQgYXQgJHtldmVudC5zdGFnZU5hbWV9LmAsXG4gICAgICBkZXB0aDogMCxcbiAgICAgIHN0YWdlTmFtZTogZXZlbnQuc3RhZ2VOYW1lLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgZXJyb3JzIGZyb20gYm90aCBjaGFubmVsczpcbiAgICogLSBGbG93UmVjb3JkZXIub25FcnJvciAoRmxvd0Vycm9yRXZlbnQgd2l0aCBtZXNzYWdlICsgc3RydWN0dXJlZEVycm9yKVxuICAgKiAtIFJlY29yZGVyLm9uRXJyb3IgKEVycm9yRXZlbnQgZnJvbSBzY29wZSBzeXN0ZW0g4oCUIGlnbm9yZWQgZm9yIG5hcnJhdGl2ZSlcbiAgICovXG4gIG9uRXJyb3IoZXZlbnQ6IEZsb3dFcnJvckV2ZW50IHwgeyBzdGFnZU5hbWU/OiBzdHJpbmc7IG1lc3NhZ2U/OiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIC8vIE9ubHkgaGFuZGxlIGZsb3cgZXJyb3JzICh3aGljaCBoYXZlIGBtZXNzYWdlYCBhbmQgYHN0cnVjdHVyZWRFcnJvcmApXG4gICAgaWYgKHR5cGVvZiAoZXZlbnQgYXMgRmxvd0Vycm9yRXZlbnQpLm1lc3NhZ2UgIT09ICdzdHJpbmcnKSByZXR1cm47XG4gICAgY29uc3QgZmxvd0V2ZW50ID0gZXZlbnQgYXMgRmxvd0Vycm9yRXZlbnQ7XG5cbiAgICBsZXQgdGV4dCA9IGBBbiBlcnJvciBvY2N1cnJlZCBhdCAke2Zsb3dFdmVudC5zdGFnZU5hbWV9OiAke2Zsb3dFdmVudC5tZXNzYWdlfS5gO1xuICAgIGlmIChmbG93RXZlbnQuc3RydWN0dXJlZEVycm9yPy5pc3N1ZXM/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgZGV0YWlscyA9IGZsb3dFdmVudC5zdHJ1Y3R1cmVkRXJyb3IuaXNzdWVzXG4gICAgICAgIC5tYXAoKGlzc3VlKSA9PiB7XG4gICAgICAgICAgY29uc3QgcGF0aCA9IGlzc3VlLnBhdGgubGVuZ3RoID4gMCA/IGlzc3VlLnBhdGguam9pbignLicpIDogJyhyb290KSc7XG4gICAgICAgICAgcmV0dXJuIGAke3BhdGh9OiAke2lzc3VlLm1lc3NhZ2V9YDtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oJzsgJyk7XG4gICAgICB0ZXh0ICs9IGAgVmFsaWRhdGlvbiBpc3N1ZXM6ICR7ZGV0YWlsc30uYDtcbiAgICB9XG4gICAgdGhpcy5lbnRyaWVzLnB1c2goe1xuICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgIHRleHQ6IGBbRXJyb3JdOiAke3RleHR9YCxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgc3RhZ2VOYW1lOiBmbG93RXZlbnQuc3RhZ2VOYW1lLFxuICAgIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIE91dHB1dCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogUmV0dXJucyBzdHJ1Y3R1cmVkIGVudHJpZXMgZm9yIHByb2dyYW1tYXRpYyBjb25zdW1wdGlvbi4gKi9cbiAgZ2V0RW50cmllcygpOiBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W10ge1xuICAgIHJldHVybiBbLi4udGhpcy5lbnRyaWVzXTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGZvcm1hdHRlZCBuYXJyYXRpdmUgbGluZXMgKHNhbWUgb3V0cHV0IGFzIENvbWJpbmVkTmFycmF0aXZlQnVpbGRlci5idWlsZCkuICovXG4gIGdldE5hcnJhdGl2ZShpbmRlbnQgPSAnICAnKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXMubWFwKChlbnRyeSkgPT4gYCR7aW5kZW50LnJlcGVhdChlbnRyeS5kZXB0aCl9JHtlbnRyeS50ZXh0fWApO1xuICB9XG5cbiAgLyoqIENsZWFycyBhbGwgc3RhdGUuIENhbGxlZCBhdXRvbWF0aWNhbGx5IGJlZm9yZSBlYWNoIHJ1bi4gKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5lbnRyaWVzID0gW107XG4gICAgdGhpcy5wZW5kaW5nT3BzLmNsZWFyKCk7XG4gICAgdGhpcy5zdGFnZUNvdW50ZXIgPSAwO1xuICAgIHRoaXMuaXNGaXJzdFN0YWdlID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQcml2YXRlIGhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBidWZmZXJPcChzdGFnZU5hbWU6IHN0cmluZywgb3A6IE9taXQ8QnVmZmVyZWRPcCwgJ3N0ZXBOdW1iZXInPik6IHZvaWQge1xuICAgIGxldCBvcHMgPSB0aGlzLnBlbmRpbmdPcHMuZ2V0KHN0YWdlTmFtZSk7XG4gICAgaWYgKCFvcHMpIHtcbiAgICAgIG9wcyA9IFtdO1xuICAgICAgdGhpcy5wZW5kaW5nT3BzLnNldChzdGFnZU5hbWUsIG9wcyk7XG4gICAgfVxuICAgIG9wcy5wdXNoKHsgLi4ub3AsIHN0ZXBOdW1iZXI6IG9wcy5sZW5ndGggKyAxIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmbHVzaE9wcyhzdGFnZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG9wcyA9IHRoaXMucGVuZGluZ09wcy5nZXQoc3RhZ2VOYW1lKTtcbiAgICBpZiAoIW9wcyB8fCBvcHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IG9wIG9mIG9wcykge1xuICAgICAgY29uc3Qgc3RlcFByZWZpeCA9IHRoaXMuaW5jbHVkZVN0ZXBOdW1iZXJzID8gYFN0ZXAgJHtvcC5zdGVwTnVtYmVyfTogYCA6ICcnO1xuXG4gICAgICBsZXQgdGV4dDogc3RyaW5nO1xuICAgICAgaWYgKG9wLnR5cGUgPT09ICdyZWFkJykge1xuICAgICAgICB0ZXh0ID1cbiAgICAgICAgICB0aGlzLmluY2x1ZGVWYWx1ZXMgJiYgb3AudmFsdWVTdW1tYXJ5XG4gICAgICAgICAgICA/IGAke3N0ZXBQcmVmaXh9UmVhZCAke29wLmtleX0gPSAke29wLnZhbHVlU3VtbWFyeX1gXG4gICAgICAgICAgICA6IGAke3N0ZXBQcmVmaXh9UmVhZCAke29wLmtleX1gO1xuICAgICAgfSBlbHNlIGlmIChvcC5vcGVyYXRpb24gPT09ICdkZWxldGUnKSB7XG4gICAgICAgIHRleHQgPSBgJHtzdGVwUHJlZml4fURlbGV0ZSAke29wLmtleX1gO1xuICAgICAgfSBlbHNlIGlmIChvcC5vcGVyYXRpb24gPT09ICd1cGRhdGUnKSB7XG4gICAgICAgIHRleHQgPSB0aGlzLmluY2x1ZGVWYWx1ZXNcbiAgICAgICAgICA/IGAke3N0ZXBQcmVmaXh9VXBkYXRlICR7b3Aua2V5fSA9ICR7b3AudmFsdWVTdW1tYXJ5fWBcbiAgICAgICAgICA6IGAke3N0ZXBQcmVmaXh9VXBkYXRlICR7b3Aua2V5fWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZXh0ID0gdGhpcy5pbmNsdWRlVmFsdWVzXG4gICAgICAgICAgPyBgJHtzdGVwUHJlZml4fVdyaXRlICR7b3Aua2V5fSA9ICR7b3AudmFsdWVTdW1tYXJ5fWBcbiAgICAgICAgICA6IGAke3N0ZXBQcmVmaXh9V3JpdGUgJHtvcC5rZXl9YDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5lbnRyaWVzLnB1c2goe1xuICAgICAgICB0eXBlOiAnc3RlcCcsXG4gICAgICAgIHRleHQsXG4gICAgICAgIGRlcHRoOiAxLFxuICAgICAgICBzdGFnZU5hbWUsXG4gICAgICAgIHN0ZXBOdW1iZXI6IG9wLnN0ZXBOdW1iZXIsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnBlbmRpbmdPcHMuZGVsZXRlKHN0YWdlTmFtZSk7XG4gIH1cbn1cblxuLy8g4pSA4pSAIFZhbHVlIHN1bW1hcml6ZXIgKHNhbWUgbG9naWMgYXMgTmFycmF0aXZlUmVjb3JkZXIpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5mdW5jdGlvbiBzdW1tYXJpemVWYWx1ZSh2YWx1ZTogdW5rbm93biwgbWF4TGVuOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuICd1bmRlZmluZWQnO1xuICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiAnbnVsbCc7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA8PSBtYXhMZW4gPyBgXCIke3ZhbHVlfVwiYCA6IGBcIiR7dmFsdWUuc2xpY2UoMCwgbWF4TGVuIC0gMyl9Li4uXCJgO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA9PT0gMCA/ICdbXScgOiBgKCR7dmFsdWUubGVuZ3RofSBpdGVtJHt2YWx1ZS5sZW5ndGggPiAxID8gJ3MnIDogJyd9KWA7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICd7fSc7XG4gICAgY29uc3QgcHJldmlldyA9IGtleXMuc2xpY2UoMCwgNCkuam9pbignLCAnKTtcbiAgICBjb25zdCBzdWZmaXggPSBrZXlzLmxlbmd0aCA+IDQgPyBgLCAuLi4gKCR7a2V5cy5sZW5ndGh9IGtleXMpYCA6ICcnO1xuICAgIGNvbnN0IHJlc3VsdCA9IGB7JHtwcmV2aWV3fSR7c3VmZml4fX1gO1xuICAgIHJldHVybiByZXN1bHQubGVuZ3RoIDw9IG1heExlbiA/IHJlc3VsdCA6IGB7JHtrZXlzLmxlbmd0aH0ga2V5c31gO1xuICB9XG4gIHJldHVybiBTdHJpbmcodmFsdWUpO1xufVxuIl19