footprintjs 4.5.0 → 4.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/AGENTS.md +17 -1
  2. package/CLAUDE.md +72 -3
  3. package/dist/advanced.js +12 -2
  4. package/dist/esm/advanced.js +4 -1
  5. package/dist/esm/lib/engine/narrative/types.js +1 -1
  6. package/dist/esm/lib/engine/runtimeStageId.js +57 -0
  7. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +12 -3
  8. package/dist/esm/lib/memory/StageContext.js +9 -2
  9. package/dist/esm/lib/memory/commitLogUtils.js +25 -0
  10. package/dist/esm/lib/memory/types.js +1 -1
  11. package/dist/esm/lib/recorder/KeyedRecorder.js +47 -0
  12. package/dist/esm/lib/recorder/index.js +2 -1
  13. package/dist/esm/lib/runner/FlowChartExecutor.js +7 -1
  14. package/dist/esm/lib/scope/ScopeFacade.js +11 -1
  15. package/dist/esm/lib/scope/types.js +1 -1
  16. package/dist/esm/trace.js +25 -0
  17. package/dist/lib/engine/narrative/types.js +1 -1
  18. package/dist/lib/engine/runtimeStageId.js +63 -0
  19. package/dist/lib/engine/traversal/FlowchartTraverser.js +12 -3
  20. package/dist/lib/memory/StageContext.js +9 -2
  21. package/dist/lib/memory/commitLogUtils.js +31 -0
  22. package/dist/lib/memory/types.js +1 -1
  23. package/dist/lib/recorder/KeyedRecorder.js +51 -0
  24. package/dist/lib/recorder/index.js +4 -2
  25. package/dist/lib/runner/FlowChartExecutor.js +7 -1
  26. package/dist/lib/scope/ScopeFacade.js +11 -1
  27. package/dist/lib/scope/types.js +1 -1
  28. package/dist/trace.js +35 -0
  29. package/dist/types/advanced.d.ts +4 -0
  30. package/dist/types/lib/engine/narrative/types.d.ts +2 -0
  31. package/dist/types/lib/engine/runtimeStageId.d.ts +47 -0
  32. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +9 -0
  33. package/dist/types/lib/memory/StageContext.d.ts +2 -0
  34. package/dist/types/lib/memory/commitLogUtils.d.ts +13 -0
  35. package/dist/types/lib/memory/types.d.ts +2 -0
  36. package/dist/types/lib/recorder/KeyedRecorder.d.ts +33 -0
  37. package/dist/types/lib/recorder/index.d.ts +1 -0
  38. package/dist/types/lib/runner/FlowChartExecutor.d.ts +2 -0
  39. package/dist/types/lib/scope/types.d.ts +2 -0
  40. package/dist/types/trace.d.ts +23 -0
  41. package/package.json +6 -1
@@ -100,6 +100,7 @@ class ScopeFacade {
100
100
  this._invokeHook('onStageStart', {
101
101
  stageName: this._stageName,
102
102
  stageId: this._stageContext.stageId,
103
+ runtimeStageId: this._stageContext.runtimeStageId,
103
104
  pipelineId: this._stageContext.runId,
104
105
  timestamp: Date.now(),
105
106
  });
@@ -109,6 +110,7 @@ class ScopeFacade {
109
110
  this._invokeHook('onStageEnd', {
110
111
  stageName: this._stageName,
111
112
  stageId: this._stageContext.stageId,
113
+ runtimeStageId: this._stageContext.runtimeStageId,
112
114
  pipelineId: this._stageContext.runId,
113
115
  timestamp: Date.now(),
114
116
  duration,
@@ -119,6 +121,7 @@ class ScopeFacade {
119
121
  this._invokeHook('onPause', {
120
122
  stageName: this._stageName,
121
123
  stageId: this._stageContext.stageId,
124
+ runtimeStageId: this._stageContext.runtimeStageId,
122
125
  pipelineId: this._stageContext.runId,
123
126
  timestamp: Date.now(),
124
127
  pauseData,
@@ -129,6 +132,7 @@ class ScopeFacade {
129
132
  this._invokeHook('onResume', {
130
133
  stageName: this._stageName,
131
134
  stageId: this._stageContext.stageId,
135
+ runtimeStageId: this._stageContext.runtimeStageId,
132
136
  pipelineId: this._stageContext.runId,
133
137
  timestamp: Date.now(),
134
138
  hasInput,
@@ -139,6 +143,7 @@ class ScopeFacade {
139
143
  this._invokeHook('onCommit', {
140
144
  stageName: this._stageName,
141
145
  stageId: this._stageContext.stageId,
146
+ runtimeStageId: this._stageContext.runtimeStageId,
142
147
  pipelineId: this._stageContext.runId,
143
148
  timestamp: Date.now(),
144
149
  mutations,
@@ -239,6 +244,7 @@ class ScopeFacade {
239
244
  this._invokeHook('onRead', {
240
245
  stageName: this._stageName,
241
246
  stageId: this._stageContext.stageId,
247
+ runtimeStageId: this._stageContext.runtimeStageId,
242
248
  pipelineId: this._stageContext.runId,
243
249
  timestamp: Date.now(),
244
250
  key,
@@ -285,6 +291,7 @@ class ScopeFacade {
285
291
  this._invokeHook('onWrite', {
286
292
  stageName: this._stageName,
287
293
  stageId: this._stageContext.stageId,
294
+ runtimeStageId: this._stageContext.runtimeStageId,
288
295
  pipelineId: this._stageContext.runId,
289
296
  timestamp: Date.now(),
290
297
  key,
@@ -322,6 +329,7 @@ class ScopeFacade {
322
329
  this._invokeHook('onWrite', {
323
330
  stageName: this._stageName,
324
331
  stageId: this._stageContext.stageId,
332
+ runtimeStageId: this._stageContext.runtimeStageId,
325
333
  pipelineId: this._stageContext.runId,
326
334
  timestamp: Date.now(),
327
335
  key,
@@ -341,6 +349,7 @@ class ScopeFacade {
341
349
  this._invokeHook('onWrite', {
342
350
  stageName: this._stageName,
343
351
  stageId: this._stageContext.stageId,
352
+ runtimeStageId: this._stageContext.runtimeStageId,
344
353
  pipelineId: this._stageContext.runId,
345
354
  timestamp: Date.now(),
346
355
  key,
@@ -471,6 +480,7 @@ class ScopeFacade {
471
480
  this._invokeHook('onError', {
472
481
  stageName: this._stageName,
473
482
  stageId: this._stageContext.stageId,
483
+ runtimeStageId: this._stageContext.runtimeStageId,
474
484
  pipelineId: this._stageContext.runId,
475
485
  timestamp: Date.now(),
476
486
  error: error,
@@ -492,4 +502,4 @@ ScopeFacade.BRAND = Symbol.for('ScopeFacade@v1');
492
502
  * 256 characters comfortably exceeds any realistic scope-state key name.
493
503
  */
494
504
  ScopeFacade._MAX_PATTERN_KEY_LEN = 256;
495
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NvcGVGYWNhZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Njb3BlL1Njb3BlRmFjYWRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRzs7O0FBR0gscURBQXNGO0FBRXRGLDJEQUFzRTtBQUN0RSxvRUFBb0Y7QUFHcEYsTUFBYSxXQUFXO0lBa0J0QixZQUFZLE9BQXFCLEVBQUUsU0FBaUIsRUFBRSxjQUF3QixFQUFFLFlBQTJCO1FBTG5HLGVBQVUsR0FBZSxFQUFFLENBQUM7UUFHNUIseUJBQW9CLEdBQTZCLElBQUksR0FBRyxFQUFFLENBQUM7UUFHakUsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUM7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUM7UUFDdEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFBLG1DQUFnQixFQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFFdkMsOEZBQThGO1FBQzlGLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNqRCxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxxQkFBcUIsQ0FBQyxTQUFzQjtRQUMxQyxJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFD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LENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU87cUJBQ2pGLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDOztBQTFoQkgsa0NBMmhCQztBQTFoQndCLGlCQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxBQUEvQixDQUFnQztBQXNlNUQ7Ozs7Ozs7R0FPRztBQUNxQixnQ0FBb0IsR0FBRyxHQUFHLEFBQU4sQ0FBTyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2NvcGVGYWNhZGUg4oCUIEJhc2UgY2xhc3MgdGhhdCBsaWJyYXJ5IGNvbnN1bWVycyBleHRlbmQgdG8gY3JlYXRlIGN1c3RvbSBzY29wZSBjbGFzc2VzXG4gKlxuICogV3JhcHMgU3RhZ2VDb250ZXh0IChmcm9tIG1lbW9yeS8pIHRvIHByb3ZpZGUgYSBjb25zdW1lci1mcmllbmRseSBBUEkgZm9yXG4gKiBzdGF0ZSBhY2Nlc3MsIGRlYnVnIGxvZ2dpbmcsIG1ldHJpY3MsIGFuZCByZWNvcmRlciBob29rcy5cbiAqXG4gKiBDb25zdW1lcnMgZXh0ZW5kIHRoaXMgY2xhc3MgdG8gYWRkIGRvbWFpbi1zcGVjaWZpYyBwcm9wZXJ0aWVzOlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIE15U2NvcGUgZXh0ZW5kcyBTY29wZUZhY2FkZSB7XG4gKiAgIGdldCB1c2VyTmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRWYWx1ZSgnbmFtZScpIGFzIHN0cmluZzsgfVxuICogICBzZXQgdXNlck5hbWUodmFsdWU6IHN0cmluZykgeyB0aGlzLnNldFZhbHVlKCduYW1lJywgdmFsdWUpOyB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkVudiB9IGZyb20gJy4uL2VuZ2luZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBuYXRpdmVIYXMgYXMgbG9kYXNoSGFzLCBuYXRpdmVTZXQgYXMgbG9kYXNoU2V0IH0gZnJvbSAnLi4vbWVtb3J5L3BhdGhPcHMuanMnO1xuaW1wb3J0IHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBoYXNDaXJjdWxhclJlZmVyZW5jZSwgaXNEZXZNb2RlIH0gZnJvbSAnLi9kZXRlY3RDaXJjdWxhci5qcyc7XG5pbXBvcnQgeyBhc3NlcnROb3RSZWFkb25seSwgY3JlYXRlRnJvemVuQXJncyB9IGZyb20gJy4vcHJvdGVjdGlvbi9yZWFkb25seUlucHV0LmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0RXZlbnQsIFJlY29yZGVyLCBSZWRhY3Rpb25Qb2xpY3ksIFJlZGFjdGlvblJlcG9ydCB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgY2xhc3MgU2NvcGVGYWNhZGUge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJSQU5EID0gU3ltYm9sLmZvcignU2NvcGVGYWNhZGVAdjEnKTtcblxuICBwcm90ZWN0ZWQgX3N0YWdlQ29udGV4dDogU3RhZ2VDb250ZXh0O1xuICBwcm90ZWN0ZWQgX3N0YWdlTmFtZTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3JlYWRPbmx5VmFsdWVzPzogdW5rbm93bjtcblxuICAvKiogQ2FjaGVkIGRlZXBseS1mcm96ZW4gY29weSBvZiByZWFkT25seVZhbHVlcyBmb3IgZ2V0QXJncygpLiBDcmVhdGVkIG9uY2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Zyb3plbkFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8qKiBFeGVjdXRpb24gZW52aXJvbm1lbnQg4oCUIHJlYWQtb25seSwgaW5oZXJpdGVkIGZyb20gcGFyZW50IGV4ZWN1dG9yLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9leGVjdXRpb25FbnY6IFJlYWRvbmx5PEV4ZWN1dGlvbkVudj47XG5cbiAgcHJpdmF0ZSBfcmVjb3JkZXJzOiBSZWNvcmRlcltdID0gW107XG4gIHByaXZhdGUgX3JlZGFjdGVkS2V5czogU2V0PHN0cmluZz47XG4gIHByaXZhdGUgX3JlZGFjdGlvblBvbGljeTogUmVkYWN0aW9uUG9saWN5IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9yZWRhY3RlZEZpZWxkc0J5S2V5OiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4gPSBuZXcgTWFwKCk7XG5cbiAgY29uc3RydWN0b3IoY29udGV4dDogU3RhZ2VDb250ZXh0LCBzdGFnZU5hbWU6IHN0cmluZywgcmVhZE9ubHlWYWx1ZXM/OiB1bmtub3duLCBleGVjdXRpb25FbnY/OiBFeGVjdXRpb25FbnYpIHtcbiAgICB0aGlzLl9zdGFnZUNvbnRleHQgPSBjb250ZXh0O1xuICAgIHRoaXMuX3N0YWdlTmFtZSA9IHN0YWdlTmFtZTtcbiAgICB0aGlzLl9yZWFkT25seVZhbHVlcyA9IHJlYWRPbmx5VmFsdWVzO1xuICAgIHRoaXMuX2Zyb3plbkFyZ3MgPSBjcmVhdGVGcm96ZW5BcmdzKHJlYWRPbmx5VmFsdWVzKTtcbiAgICB0aGlzLl9leGVjdXRpb25FbnYgPSBPYmplY3QuZnJlZXplKHsgLi4uZXhlY3V0aW9uRW52IH0pO1xuICAgIHRoaXMuX3JlZGFjdGVkS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgLy8gUmVnaXN0ZXIgYXMgY29tbWl0IG9ic2VydmVyIHNvIFJlY29yZGVyLm9uQ29tbWl0IGZpcmVzIHdoZW4gU3RhZ2VDb250ZXh0LmNvbW1pdCgpIGlzIGNhbGxlZFxuICAgIHRoaXMuX3N0YWdlQ29udGV4dC5zZXRDb21taXRPYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XG4gICAgICB0aGlzLl9vbkNvbW1pdEZpcmVkKG11dGF0aW9ucyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2hhcmUgYSByZWRhY3RlZC1rZXlzIHNldCBhY3Jvc3MgbXVsdGlwbGUgU2NvcGVGYWNhZGUgaW5zdGFuY2VzLlxuICAgKiBDYWxsIHRoaXMgdG8gbWFrZSByZWRhY3Rpb24gcGVyc2lzdCBhY3Jvc3Mgc3RhZ2VzIGluIHRoZSBzYW1lIHBpcGVsaW5lLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHVzZVNoYXJlZFJlZGFjdGVkS2V5cyhzaGFyZWRTZXQ6IFNldDxzdHJpbmc+KTogdm9pZCB7XG4gICAgdGhpcy5fcmVkYWN0ZWRLZXlzID0gc2hhcmVkU2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgcmVkYWN0ZWQta2V5cyBzZXQgKGZvciBzaGFyaW5nIHdpdGggb3RoZXIgc2NvcGVzKS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBnZXRSZWRhY3RlZEtleXMoKTogU2V0PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9yZWRhY3RlZEtleXM7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgYSBkZWNsYXJhdGl2ZSByZWRhY3Rpb24gcG9saWN5LiBUaGUgcG9saWN5IGlzIGFkZGl0aXZlIOKAlFxuICAgKiBpdCB3b3JrcyBhbG9uZ3NpZGUgbWFudWFsIGBzZXRWYWx1ZSguLi4sIHRydWUpYCBjYWxscy5cbiAgICogQGludGVybmFsXG4gICAqL1xuICB1c2VSZWRhY3Rpb25Qb2xpY3kocG9saWN5OiBSZWRhY3Rpb25Qb2xpY3kpOiB2b2lkIHtcbiAgICB0aGlzLl9yZWRhY3Rpb25Qb2xpY3kgPSBwb2xpY3k7XG4gICAgLy8gUHJlLXBvcHVsYXRlIGZpZWxkLWxldmVsIHJlZGFjdGlvbiBtYXAgZnJvbSBwb2xpY3lcbiAgICBpZiAocG9saWN5LmZpZWxkcykge1xuICAgICAgZm9yIChjb25zdCBba2V5LCBmaWVsZHNdIG9mIE9iamVjdC5lbnRyaWVzKHBvbGljeS5maWVsZHMpKSB7XG4gICAgICAgIHRoaXMuX3JlZGFjdGVkRmllbGRzQnlLZXkuc2V0KGtleSwgbmV3IFNldChmaWVsZHMpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFJlZGFjdGlvblBvbGljeSgpOiBSZWRhY3Rpb25Qb2xpY3kgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9yZWRhY3Rpb25Qb2xpY3k7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNvbXBsaWFuY2UtZnJpZW5kbHkgcmVwb3J0IG9mIGFsbCByZWRhY3Rpb24gYWN0aXZpdHkuXG4gICAqIE5ldmVyIGluY2x1ZGVzIGFjdHVhbCB2YWx1ZXMg4oCUIG9ubHkga2V5IG5hbWVzLCBmaWVsZCBuYW1lcywgYW5kIHBhdHRlcm5zLlxuICAgKi9cbiAgZ2V0UmVkYWN0aW9uUmVwb3J0KCk6IFJlZGFjdGlvblJlcG9ydCB7XG4gICAgY29uc3QgZmllbGRSZWRhY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGZpZWxkc10gb2YgdGhpcy5fcmVkYWN0ZWRGaWVsZHNCeUtleSkge1xuICAgICAgZmllbGRSZWRhY3Rpb25zW2tleV0gPSBbLi4uZmllbGRzXTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZGFjdGVkS2V5czogWy4uLnRoaXMuX3JlZGFjdGVkS2V5c10sXG4gICAgICBmaWVsZFJlZGFjdGlvbnMsXG4gICAgICBwYXR0ZXJuczogKHRoaXMuX3JlZGFjdGlvblBvbGljeT8ucGF0dGVybnMgPz8gW10pLm1hcCgocCkgPT4gcC5zb3VyY2UpLFxuICAgIH07XG4gIH1cblxuICAvLyDilIDilIAgUmVjb3JkZXIgTWFuYWdlbWVudCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhdHRhY2hSZWNvcmRlcihyZWNvcmRlcjogUmVjb3JkZXIpOiB2b2lkIHtcbiAgICAvLyBSZXBsYWNlIGV4aXN0aW5nIHJlY29yZGVyIHdpdGggc2FtZSBJRCAoaWRlbXBvdGVudCDigJQgcHJldmVudHMgZG91YmxlLWNvdW50aW5nKVxuICAgIHRoaXMuX3JlY29yZGVycyA9IHRoaXMuX3JlY29yZGVycy5maWx0ZXIoKHIpID0+IHIuaWQgIT09IHJlY29yZGVyLmlkKTtcbiAgICB0aGlzLl9yZWNvcmRlcnMucHVzaChyZWNvcmRlcik7XG4gIH1cblxuICBkZXRhY2hSZWNvcmRlcihyZWNvcmRlcklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9yZWNvcmRlcnMgPSB0aGlzLl9yZWNvcmRlcnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSByZWNvcmRlcklkKTtcbiAgfVxuXG4gIGdldFJlY29yZGVycygpOiBSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuX3JlY29yZGVyc107XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG5vdGlmeVN0YWdlU3RhcnQoKTogdm9pZCB7XG4gICAgdGhpcy5faW52b2tlSG9vaygnb25TdGFnZVN0YXJ0Jywge1xuICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbm90aWZ5U3RhZ2VFbmQoZHVyYXRpb24/OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9pbnZva2VIb29rKCdvblN0YWdlRW5kJywge1xuICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIGR1cmF0aW9uLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlQYXVzZShwYXVzZURhdGE/OiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5faW52b2tlSG9vaygnb25QYXVzZScsIHtcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBwYXVzZURhdGEsXG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG5vdGlmeVJlc3VtZShoYXNJbnB1dDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2ludm9rZUhvb2soJ29uUmVzdW1lJywge1xuICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIGhhc0lucHV0LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlDb21taXQobXV0YXRpb25zOiBDb21taXRFdmVudFsnbXV0YXRpb25zJ10pOiB2b2lkIHtcbiAgICB0aGlzLl9pbnZva2VIb29rKCdvbkNvbW1pdCcsIHtcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBtdXRhdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICAvKiogQ2FsbGVkIGJ5IFN0YWdlQ29udGV4dC5jb21taXQoKSBvYnNlcnZlci4gQ29udmVydHMgdHJhY2tlZCB3cml0ZXMgdG8gQ29tbWl0RXZlbnQgZm9ybWF0LlxuICAgKiAgRXJyb3JzIGFyZSBjYXVnaHQgdG8gcHJldmVudCByZWNvcmRlciBpc3N1ZXMgZnJvbSBhYm9ydGluZyB0aGUgdHJhdmVyc2FsLiAqL1xuICBwcml2YXRlIF9vbkNvbW1pdEZpcmVkKG11dGF0aW9uczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcmVjb3JkZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbW1pdE11dGF0aW9uczogQ29tbWl0RXZlbnRbJ211dGF0aW9ucyddID0gT2JqZWN0LmVudHJpZXMobXV0YXRpb25zKS5tYXAoKFtrZXksIGVudHJ5XSkgPT4ge1xuICAgICAgICBjb25zdCBpc1JlZGFjdGVkID0gdGhpcy5faXNLZXlSZWRhY3RlZChrZXkpIHx8IHRoaXMuX2lzUG9saWN5UmVkYWN0ZWQoa2V5KTtcbiAgICAgICAgY29uc3QgZmllbGRTZXQgPSB0aGlzLl9yZWRhY3RlZEZpZWxkc0J5S2V5LmdldChrZXkpO1xuXG4gICAgICAgIGxldCByZWNvcmRlclZhbHVlOiB1bmtub3duO1xuICAgICAgICBpZiAoaXNSZWRhY3RlZCkge1xuICAgICAgICAgIHJlY29yZGVyVmFsdWUgPSAnW1JFREFDVEVEXSc7XG4gICAgICAgIH0gZWxzZSBpZiAoZmllbGRTZXQgJiYgZW50cnkudmFsdWUgJiYgdHlwZW9mIGVudHJ5LnZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHJlY29yZGVyVmFsdWUgPSB0aGlzLl9zY3J1YkZpZWxkcyhlbnRyeS52YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgZmllbGRTZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlY29yZGVyVmFsdWUgPSBlbnRyeS52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAga2V5LFxuICAgICAgICAgIHZhbHVlOiByZWNvcmRlclZhbHVlLFxuICAgICAgICAgIG9wZXJhdGlvbjogZW50cnkub3BlcmF0aW9uLFxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMubm90aWZ5Q29tbWl0KGNvbW1pdE11dGF0aW9ucyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBTd2FsbG93IOKAlCByZWNvcmRlciBlcnJvcnMgbXVzdCBub3QgYWJvcnQgdGhlIHRyYXZlcnNhbC5cbiAgICAgIC8vIEluZGl2aWR1YWwgcmVjb3JkZXIgZXJyb3JzIGFyZSBhbHJlYWR5IGlzb2xhdGVkIGJ5IF9pbnZva2VIb29rLlxuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBEZWJ1ZyAvIERpYWdub3N0aWNzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFkZERlYnVnSW5mbyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLl9zdGFnZUNvbnRleHQuYWRkTG9nKGtleSwgdmFsdWUpO1xuICB9XG5cbiAgYWRkRGVidWdNZXNzYWdlKHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5fc3RhZ2VDb250ZXh0LmFkZExvZygnbWVzc2FnZXMnLCBbdmFsdWVdKTtcbiAgfVxuXG4gIGFkZEVycm9ySW5mbyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLl9zdGFnZUNvbnRleHQuYWRkRXJyb3Ioa2V5LCB2YWx1ZSk7XG4gIH1cblxuICBhZGRNZXRyaWMobWV0cmljTmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuX3N0YWdlQ29udGV4dC5hZGRNZXRyaWMobWV0cmljTmFtZSwgdmFsdWUpO1xuICB9XG5cbiAgYWRkRXZhbChtZXRyaWNOYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5fc3RhZ2VDb250ZXh0LmFkZEV2YWwobWV0cmljTmFtZSwgdmFsdWUpO1xuICB9XG5cbiAgLy8g4pSA4pSAIE5vbi1UcmFja2luZyBTdGF0ZSBJbnNwZWN0aW9uIChmb3IgVHlwZWRTY29wZSBwcm94eSBpbnRlcm5hbHMpIOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBSZXR1cm5zIGFsbCBzdGF0ZSBrZXlzIHdpdGhvdXQgZmlyaW5nIG9uUmVhZC4gVXNlZCBieSBUeXBlZFNjb3BlIG93bktleXMvaGFzIHRyYXBzLiAqL1xuICBnZXRTdGF0ZUtleXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy5fc3RhZ2VDb250ZXh0LmdldFZhbHVlKFtdLCB1bmRlZmluZWQpO1xuICAgIGlmICghc25hcHNob3QgfHwgdHlwZW9mIHNuYXBzaG90ICE9PSAnb2JqZWN0JykgcmV0dXJuIFtdO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhzbmFwc2hvdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gIH1cblxuICAvKiogQ2hlY2sga2V5IGV4aXN0ZW5jZSB3aXRob3V0IGZpcmluZyBvblJlYWQuIFVzZWQgYnkgVHlwZWRTY29wZSBoYXMgdHJhcC5cbiAgICogIENvbnRyYWN0OiByZXR1cm5zIGZhbHNlIGZvciBrZXlzIG5ldmVyIHNldCBPUiBrZXlzIHNldCB0byB1bmRlZmluZWQuXG4gICAqICBUaGlzIG1hdGNoZXMgZGVsZXRlVmFsdWUoKSBzZW1hbnRpY3MgKHNldHMgdG8gdW5kZWZpbmVkID0gZGVsZXRlZCkuICovXG4gIGhhc0tleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0VmFsdWUoW10sIGtleSkgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBSZWFkIHN0YXRlIHdpdGhvdXQgZmlyaW5nIG9uUmVhZC4gVXNlZCBieSBhcnJheSBwcm94eSBnZXRDdXJyZW50KCkgdG8gYXZvaWRcbiAgICogIHBoYW50b20gcmVhZHMgb24gaW50ZXJuYWwgYXJyYXkgb3BlcmF0aW9ucyAoLmxlbmd0aCwgLmhhcywgaXRlcmF0aW9uLCBldGMuKS5cbiAgICogIFRoZSBpbml0aWFsIHByb3BlcnR5IGFjY2VzcyBmaXJlcyBvbmUgdHJhY2tlZCBvblJlYWQgdmlhIGdldFZhbHVlKCk7IHN1YnNlcXVlbnRcbiAgICogIGludGVybmFsIGFycmF5IG9wZXJhdGlvbnMgdXNlIHRoaXMgbWV0aG9kIHRvIHN0YXkgc2lsZW50LlxuICAgKiAgTk9URTogTGlrZSBnZXRWYWx1ZSgpLCByZXR1cm5zIHRoZSByYXcgdmFsdWUgdG8gdGhlIGNhbGxlci4gUmVkYWN0aW9uIGFwcGxpZXNcbiAgICogIG9ubHkgdG8gcmVjb3JkZXIgZGlzcGF0Y2gg4oCUIGl0IGRvZXMgbm90IGZpbHRlciB0aGUgcmV0dXJuZWQgdmFsdWUuIFRoaXMgbWF0Y2hlc1xuICAgKiAgdGhlIGV4aXN0aW5nIGdldFZhbHVlKCkgY29udHJhY3Qgd2hlcmUgdXNlciBjb2RlIGFsd2F5cyByZWNlaXZlcyByYXcgZGF0YS4gKi9cbiAgZ2V0VmFsdWVTaWxlbnQoa2V5Pzogc3RyaW5nKTogdW5rbm93biB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRWYWx1ZURpcmVjdChbXSwga2V5KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTdGF0ZSBBY2Nlc3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0SW5pdGlhbFZhbHVlRm9yKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRHbG9iYWw/LihrZXkpO1xuICB9XG5cbiAgZ2V0VmFsdWUoa2V5Pzogc3RyaW5nKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0VmFsdWUoW10sIGtleSk7XG5cbiAgICBpZiAodGhpcy5fcmVjb3JkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGlzUmVkYWN0ZWQgPSBrZXkgIT09IHVuZGVmaW5lZCAmJiB0aGlzLl9pc0tleVJlZGFjdGVkKGtleSk7XG4gICAgICBjb25zdCBmaWVsZFNldCA9IGtleSAhPT0gdW5kZWZpbmVkID8gdGhpcy5fcmVkYWN0ZWRGaWVsZHNCeUtleS5nZXQoa2V5KSA6IHVuZGVmaW5lZDtcblxuICAgICAgbGV0IHJlY29yZGVyVmFsdWU6IHVua25vd247XG4gICAgICBpZiAoaXNSZWRhY3RlZCkge1xuICAgICAgICByZWNvcmRlclZhbHVlID0gJ1tSRURBQ1RFRF0nO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZFNldCAmJiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJlY29yZGVyVmFsdWUgPSB0aGlzLl9zY3J1YkZpZWxkcyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgZmllbGRTZXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVjb3JkZXJWYWx1ZSA9IHZhbHVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9pbnZva2VIb29rKCdvblJlYWQnLCB7XG4gICAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWU6IHJlY29yZGVyVmFsdWUsXG4gICAgICAgIHJlZGFjdGVkOiBpc1JlZGFjdGVkIHx8IGZpZWxkU2V0ICE9PSB1bmRlZmluZWQgfHwgdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgc2V0VmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBzaG91bGRSZWRhY3Q/OiBib29sZWFuLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIGFzc2VydE5vdFJlYWRvbmx5KHRoaXMuX3JlYWRPbmx5VmFsdWVzLCBrZXksICd3cml0ZScpO1xuXG4gICAgLy8gRGV2LW1vZGU6IHdhcm4gaWYgdGhlIHZhbHVlIGNvbnRhaW5zIGNpcmN1bGFyIHJlZmVyZW5jZXMuXG4gICAgLy8gQ2hlY2sgQUZURVIgYXNzZXJ0Tm90UmVhZG9ubHkg4oCUIGRvbid0IHdhcm4gZm9yIHdyaXRlcyB0aGF0IHdpbGwgYmUgYmxvY2tlZC5cbiAgICAvLyBDaXJjdWxhciB2YWx1ZXMgd29yayAodGVybWluYWwgcHJveHkgaGFuZGxlcyB0aGVtKSBidXQgY2FuIHByb2R1Y2VcbiAgICAvLyBzdXJwcmlzaW5nIGJlaGF2aW9yIGluIG5hcnJhdGl2ZSwgSlNPTiBzZXJpYWxpemF0aW9uLCBhbmQgc25hcHNob3RzLlxuICAgIGlmIChpc0Rldk1vZGUoKSAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoaGFzQ2lyY3VsYXJSZWZlcmVuY2UodmFsdWUpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW2Zvb3RwcmludF0gQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGluIHNldFZhbHVlKCcke2tleX0nKS4gYCArXG4gICAgICAgICAgICAnV3JpdGVzIHBhc3QgdGhlIGN5Y2xlIGRlcHRoIHdpbGwgdXNlIHRlcm1pbmFsIHByb3h5IHRyYWNraW5nLiAnICtcbiAgICAgICAgICAgICdDb25zaWRlciBmbGF0dGVuaW5nIHRoZSBkYXRhIHN0cnVjdHVyZS4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEF1dG8tcmVkYWN0IGlmIGtleSBtYXRjaGVzIHBvbGljeSAoZXhhY3Qga2V5cyBvciBwYXR0ZXJucyksIG9yIGlmIHRoZSBrZXkgd2FzXG4gICAgLy8gcHJldmlvdXNseSBtYXJrZWQgcmVkYWN0ZWQgKGUuZy4gY2FycmllZCBvdmVyIGZyb20gYSBzdWJmbG93IHZpYSBvdXRwdXRNYXBwZXIpLlxuICAgIGNvbnN0IGVmZmVjdGl2ZVJlZGFjdCA9IHNob3VsZFJlZGFjdCB8fCB0aGlzLl9pc1BvbGljeVJlZGFjdGVkKGtleSkgfHwgdGhpcy5fcmVkYWN0ZWRLZXlzLmhhcyhrZXkpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fc3RhZ2VDb250ZXh0LnNldE9iamVjdChbXSwga2V5LCB2YWx1ZSwgZWZmZWN0aXZlUmVkYWN0LCBkZXNjcmlwdGlvbik7XG5cbiAgICBpZiAoZWZmZWN0aXZlUmVkYWN0KSB7XG4gICAgICB0aGlzLl9yZWRhY3RlZEtleXMuYWRkKGtleSk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGZpZWxkLWxldmVsIHJlZGFjdGlvbiBmcm9tIHBvbGljeVxuICAgIGNvbnN0IGZpZWxkU2V0ID0gdGhpcy5fcmVkYWN0ZWRGaWVsZHNCeUtleS5nZXQoa2V5KTtcblxuICAgIGlmICh0aGlzLl9yZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IHJlY29yZGVyVmFsdWU6IHVua25vd247XG4gICAgICBpZiAoZWZmZWN0aXZlUmVkYWN0KSB7XG4gICAgICAgIHJlY29yZGVyVmFsdWUgPSAnW1JFREFDVEVEXSc7XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkU2V0ICYmIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmVjb3JkZXJWYWx1ZSA9IHRoaXMuX3NjcnViRmllbGRzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBmaWVsZFNldCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWNvcmRlclZhbHVlID0gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2ludm9rZUhvb2soJ29uV3JpdGUnLCB7XG4gICAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWU6IHJlY29yZGVyVmFsdWUsXG4gICAgICAgIG9wZXJhdGlvbjogJ3NldCcsXG4gICAgICAgIHJlZGFjdGVkOiBlZmZlY3RpdmVSZWRhY3QgfHwgZmllbGRTZXQgIT09IHVuZGVmaW5lZCB8fCB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgdXBkYXRlVmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIGFzc2VydE5vdFJlYWRvbmx5KHRoaXMuX3JlYWRPbmx5VmFsdWVzLCBrZXksICd3cml0ZScpO1xuXG4gICAgLy8gRGV2LW1vZGU6IHNhbWUgY2lyY3VsYXIgY2hlY2sgYXMgc2V0VmFsdWUgKG1lcmdlIHRhcmdldHMgY2FuIGJlIGNpcmN1bGFyIHRvbylcbiAgICBpZiAoaXNEZXZNb2RlKCkgJiYgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKGhhc0NpcmN1bGFyUmVmZXJlbmNlKHZhbHVlKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtmb290cHJpbnRdIENpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBpbiB1cGRhdGVWYWx1ZSgnJHtrZXl9JykuIGAgK1xuICAgICAgICAgICAgJ0NvbnNpZGVyIGZsYXR0ZW5pbmcgdGhlIGRhdGEgc3RydWN0dXJlLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaXNSZWRhY3RlZCA9IHRoaXMuX2lzS2V5UmVkYWN0ZWQoa2V5KSB8fCB0aGlzLl9pc1BvbGljeVJlZGFjdGVkKGtleSk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fc3RhZ2VDb250ZXh0LnVwZGF0ZU9iamVjdChbXSwga2V5LCB2YWx1ZSwgZGVzY3JpcHRpb24sIGlzUmVkYWN0ZWQpO1xuXG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmaWVsZFNldCA9IHRoaXMuX3JlZGFjdGVkRmllbGRzQnlLZXkuZ2V0KGtleSk7XG5cbiAgICAgIGxldCByZWNvcmRlclZhbHVlOiB1bmtub3duO1xuICAgICAgaWYgKGlzUmVkYWN0ZWQpIHtcbiAgICAgICAgcmVjb3JkZXJWYWx1ZSA9ICdbUkVEQUNURURdJztcbiAgICAgIH0gZWxzZSBpZiAoZmllbGRTZXQgJiYgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZWNvcmRlclZhbHVlID0gdGhpcy5fc2NydWJGaWVsZHModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGZpZWxkU2V0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlY29yZGVyVmFsdWUgPSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5faW52b2tlSG9vaygnb25Xcml0ZScsIHtcbiAgICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZTogcmVjb3JkZXJWYWx1ZSxcbiAgICAgICAgb3BlcmF0aW9uOiAndXBkYXRlJyxcbiAgICAgICAgcmVkYWN0ZWQ6IGlzUmVkYWN0ZWQgfHwgZmllbGRTZXQgIT09IHVuZGVmaW5lZCB8fCB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZGVsZXRlVmFsdWUoa2V5OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgYXNzZXJ0Tm90UmVhZG9ubHkodGhpcy5fcmVhZE9ubHlWYWx1ZXMsIGtleSwgJ2RlbGV0ZScpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fc3RhZ2VDb250ZXh0LnNldE9iamVjdChbXSwga2V5LCB1bmRlZmluZWQsIGZhbHNlLCBkZXNjcmlwdGlvbiA/PyBgZGVsZXRlZCAke2tleX1gLCAnZGVsZXRlJyk7XG5cbiAgICAvLyBEZWxldGluZyBhIHJlZGFjdGVkIGtleSBjbGVhcnMgaXRzIHJlZGFjdGlvbiBzdGF0dXNcbiAgICB0aGlzLl9yZWRhY3RlZEtleXMuZGVsZXRlKGtleSk7XG5cbiAgICBpZiAodGhpcy5fcmVjb3JkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX2ludm9rZUhvb2soJ29uV3JpdGUnLCB7XG4gICAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgb3BlcmF0aW9uOiAnZGVsZXRlJyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHNldEdsb2JhbChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5zZXRHbG9iYWw/LihrZXksIHZhbHVlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldEdsb2JhbChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0R2xvYmFsPy4oa2V5KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc2V0T2JqZWN0SW5Sb290KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHJldHVybiB0aGlzLl9zdGFnZUNvbnRleHQuc2V0Um9vdD8uKGtleSwgdmFsdWUpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJlYWQtb25seSArIG1pc2Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJlYWRvbmx5IGlucHV0IHZhbHVlcyBwYXNzZWQgdG8gdGhpcyBwaXBlbGluZSwgY2FzdCB0byBgVGAuXG4gICAqIFRoZSByZXR1cm5lZCBvYmplY3QgaXMgZGVlcGx5IGZyb3plbiDigJQgYW55IGF0dGVtcHQgdG8gbXV0YXRlIGl0IHRocm93cy5cbiAgICogQ2FjaGVkIGF0IGNvbnN0cnVjdGlvbiB0aW1lIGZvciB6ZXJvLWFsbG9jYXRpb24gcmVwZWF0ZWQgYWNjZXNzLlxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHsgYXBwbGljYW50TmFtZSwgaW5jb21lIH0gPSBzY29wZS5nZXRBcmdzPHsgYXBwbGljYW50TmFtZTogc3RyaW5nOyBpbmNvbWU6IG51bWJlciB9PigpO1xuICAgKiBgYGBcbiAgICovXG4gIGdldEFyZ3M8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5fZnJvemVuQXJncyBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCDigJQgcmVhZC1vbmx5IGluZnJhc3RydWN0dXJlIHZhbHVlc1xuICAgKiB0aGF0IHByb3BhZ2F0ZSB0aHJvdWdoIG5lc3RlZCBleGVjdXRvcnMgKGxpa2UgYHByb2Nlc3MuZW52YCBmb3IgZmxvd2NoYXJ0cykuXG4gICAqXG4gICAqIENvbnRhaW5zOiBzaWduYWwgKGFib3J0KSwgdGltZW91dE1zLCB0cmFjZUlkLlxuICAgKiBGcm96ZW4gYXQgY29uc3RydWN0aW9uIHRpbWUuIEluaGVyaXRlZCBieSBzdWJmbG93cyBhdXRvbWF0aWNhbGx5LlxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHsgc2lnbmFsLCB0cmFjZUlkIH0gPSBzY29wZS5nZXRFbnYoKTtcbiAgICogYGBgXG4gICAqL1xuICBnZXRFbnYoKTogUmVhZG9ubHk8RXhlY3V0aW9uRW52PiB7XG4gICAgcmV0dXJuIHRoaXMuX2V4ZWN1dGlvbkVudjtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0UGlwZWxpbmVJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkO1xuICB9XG5cbiAgLy8g4pSA4pSAIEludGVybmFsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBDaGVja3MgaWYgYSBrZXkgaXMgcmVkYWN0ZWQgKGV4cGxpY2l0IF9yZWRhY3RlZEtleXMgc2V0KS4gKi9cbiAgcHJpdmF0ZSBfaXNLZXlSZWRhY3RlZChrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9yZWRhY3RlZEtleXMuaGFzKGtleSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEga2V5IHNob3VsZCBiZSBhdXRvLXJlZGFjdGVkIGJ5IHRoZSBwb2xpY3kgKGV4YWN0IGtleXMgKyBwYXR0ZXJucykuXG4gICAqXG4gICAqIFJlRG9TIGd1YXJkOiBwYXR0ZXJuIHRlc3RpbmcgaXMgY2FwcGVkIGF0IE1BWF9QQVRURVJOX0tFWV9MRU4gY2hhcmFjdGVycy5cbiAgICogU2NvcGUgc3RhdGUga2V5cyBhcmUgYWx3YXlzIHNob3J0IGlkZW50aWZpZXJzOyBhbnkga2V5IGV4Y2VlZGluZyB0aGUgY2FwXG4gICAqIGlzIGFsbW9zdCBjZXJ0YWlubHkgbm90IGEgbGVnaXRpbWF0ZSBzY29wZSBrZXksIHNvIHNraXBwaW5nIHBhdHRlcm4gbWF0Y2hpbmdcbiAgICogZm9yIGl0IGRvZXMgbm90IHJpc2sgbGVha2luZyBQSUkuIEV4YWN0LWtleSBtYXRjaGluZyAoQXJyYXkuaW5jbHVkZXMpIGlzXG4gICAqIHN0aWxsIGFwcGxpZWQgcmVnYXJkbGVzcyBvZiBsZW5ndGggYW5kIGlzIG5vdCB2dWxuZXJhYmxlIHRvIFJlRG9TLlxuICAgKi9cbiAgcHJpdmF0ZSBfaXNQb2xpY3lSZWRhY3RlZChrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5fcmVkYWN0aW9uUG9saWN5KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuX3JlZGFjdGlvblBvbGljeS5rZXlzPy5pbmNsdWRlcyhrZXkpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5fcmVkYWN0aW9uUG9saWN5LnBhdHRlcm5zKSB7XG4gICAgICBpZiAoa2V5Lmxlbmd0aCA+IFNjb3BlRmFjYWRlLl9NQVhfUEFUVEVSTl9LRVlfTEVOKSB7XG4gICAgICAgIC8vIERldi1tb2RlIHdhcm5pbmc6IHBhdHRlcm4gbWF0Y2hpbmcgd2FzIHNpbGVudGx5IHNraXBwZWQgZm9yIHRoaXMga2V5LlxuICAgICAgICAvLyBVc2UgcG9saWN5LmtleXMgZm9yIGV4YWN0IG1hdGNoaW5nIG9mIGxvbmcga2V5IG5hbWVzLlxuICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBbZm9vdHByaW50XSBSZWRhY3Rpb25Qb2xpY3k6IGtleSAnJHtrZXkuc2xpY2UoMCwgNDApfS4uLicgKCR7a2V5Lmxlbmd0aH0gY2hhcnMpIGV4Y2VlZHMgYCArXG4gICAgICAgICAgICAgICd0aGUgcGF0dGVybi1tYXRjaGluZyBsZW5ndGggY2FwIGFuZCB3YXMgc2tpcHBlZC4gJyArXG4gICAgICAgICAgICAgICdVc2UgcG9saWN5LmtleXMgZm9yIGV4YWN0IG1hdGNoaW5nIG9mIGxvbmcga2V5IG5hbWVzLicsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIHRoaXMuX3JlZGFjdGlvblBvbGljeS5wYXR0ZXJucykge1xuICAgICAgICAgIHAubGFzdEluZGV4ID0gMDsgLy8gUmVzZXQgc3RhdGVmdWwgZ2xvYmFsL3N0aWNreSByZWdleGVzXG4gICAgICAgICAgaWYgKHAudGVzdChrZXkpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogTWF4aW11bSBrZXkgbGVuZ3RoIChjaGFyYWN0ZXJzKSB0aGF0IHdpbGwgYmUgdGVzdGVkIGFnYWluc3QgcmVnZXggcmVkYWN0aW9uXG4gICAqIHBhdHRlcm5zLiBLZXlzIGxvbmdlciB0aGFuIHRoaXMgYXJlIHNraXBwZWQgZm9yIHBhdHRlcm4gbWF0Y2hpbmcgdG8gcHJldmVudFxuICAgKiBSZURvUzogYSBwYXRob2xvZ2ljYWwgcmVnZXggdGVzdGVkIGFnYWluc3QgYW4gdW5ib3VuZGVkbHkgbG9uZyBrZXkgc3RyaW5nXG4gICAqIGNhbiBjYXVzZSBjYXRhc3Ryb3BoaWMgYmFja3RyYWNraW5nLlxuICAgKlxuICAgKiAyNTYgY2hhcmFjdGVycyBjb21mb3J0YWJseSBleGNlZWRzIGFueSByZWFsaXN0aWMgc2NvcGUtc3RhdGUga2V5IG5hbWUuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBfTUFYX1BBVFRFUk5fS0VZX0xFTiA9IDI1NjtcblxuICAvKipcbiAgICogUmV0dXJucyBhIGRlZXAtY2xvbmVkIGNvcHkgd2l0aCBzcGVjaWZpZWQgZmllbGRzIHJlcGxhY2VkIGJ5ICdbUkVEQUNURURdJy5cbiAgICogU3VwcG9ydHMgZG90LW5vdGF0aW9uIHBhdGhzIChlLmcuICdhZGRyZXNzLnppcCcpIGZvciBuZXN0ZWQgb2JqZWN0cy5cbiAgICovXG4gIHByaXZhdGUgX3NjcnViRmllbGRzKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGZpZWxkczogU2V0PHN0cmluZz4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgY29weSA9IHN0cnVjdHVyZWRDbG9uZShvYmopO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICBpZiAoZmllbGQuaW5jbHVkZXMoJy4nKSAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvcHksIGZpZWxkKSkge1xuICAgICAgICAvLyBEb3Qtbm90YXRpb24gcGF0aCDihpIgZGVlcCBzY3J1YiAob25seSBpZiBub3QgYSBsaXRlcmFsIGZsYXQga2V5KVxuICAgICAgICBpZiAobG9kYXNoSGFzKGNvcHksIGZpZWxkKSkge1xuICAgICAgICAgIGxvZGFzaFNldChjb3B5LCBmaWVsZCwgJ1tSRURBQ1RFRF0nKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb3B5LCBmaWVsZCkpIHtcbiAgICAgICAgICBjb3B5W2ZpZWxkXSA9ICdbUkVEQUNURURdJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29weTtcbiAgfVxuXG4gIHByaXZhdGUgX2ludm9rZUhvb2soaG9vazoga2V5b2YgT21pdDxSZWNvcmRlciwgJ2lkJz4sIGV2ZW50OiB1bmtub3duKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCByZWNvcmRlciBvZiB0aGlzLl9yZWNvcmRlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhvb2tGbiA9IHJlY29yZGVyW2hvb2tdO1xuICAgICAgICBpZiAodHlwZW9mIGhvb2tGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIChob29rRm4gYXMgKGV2ZW50OiB1bmtub3duKSA9PiB2b2lkKS5jYWxsKHJlY29yZGVyLCBldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChob29rICE9PSAnb25FcnJvcicpIHtcbiAgICAgICAgICB0aGlzLl9pbnZva2VIb29rKCdvbkVycm9yJywge1xuICAgICAgICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICAgICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgICAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvciBhcyBFcnJvcixcbiAgICAgICAgICAgIG9wZXJhdGlvbjogaG9vayA9PT0gJ29uUmVhZCcgPyAncmVhZCcgOiBob29rID09PSAnb25Db21taXQnID8gJ2NvbW1pdCcgOiAnd3JpdGUnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
505
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NvcGVGYWNhZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Njb3BlL1Njb3BlRmFjYWRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRzs7O0FBR0gscURBQXNGO0FBRXRGLDJEQUFzRTtBQUN0RSxvRUFBb0Y7QUFHcEYsTUFBYSxXQUFXO0lBa0J0QixZQUFZLE9BQXFCLEVBQUUsU0FBaUIsRUFBRSxjQUF3QixFQUFFLFlBQTJCO1FBTG5HLGVBQVUsR0FBZSxFQUFFLENBQUM7UUFHNUIseUJBQW9CLEdBQTZCLElBQUksR0FBRyxFQUFFLENBQUM7UUFHakUsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUM7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUM7UUFDdEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFBLG1DQUFnQixFQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFFdkMsOEZBQThGO1FBQzlGLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNqRCxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxxQkFBcUIsQ0FBQyxTQUFzQjtRQUMxQyxJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFD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QUFDO1lBQ0gsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3ZCLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFO3dCQUMxQixTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVU7d0JBQzFCLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU87d0JBQ25DLGNBQWMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWM7d0JBQ2pELFVBQVUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUs7d0JBQ3BDLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO3dCQUNyQixLQUFLLEVBQUUsS0FBYzt3QkFDckIsU0FBUyxFQUFFLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPO3FCQUNqRixDQUFDLENBQUM7Z0JBQ0wsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQzs7QUFwaUJILGtDQXFpQkM7QUFwaUJ3QixpQkFBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQUFBL0IsQ0FBZ0M7QUErZTVEOzs7Ozs7O0dBT0c7QUFDcUIsZ0NBQW9CLEdBQUcsR0FBRyxBQUFOLENBQU8iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNjb3BlRmFjYWRlIOKAlCBCYXNlIGNsYXNzIHRoYXQgbGlicmFyeSBjb25zdW1lcnMgZXh0ZW5kIHRvIGNyZWF0ZSBjdXN0b20gc2NvcGUgY2xhc3Nlc1xuICpcbiAqIFdyYXBzIFN0YWdlQ29udGV4dCAoZnJvbSBtZW1vcnkvKSB0byBwcm92aWRlIGEgY29uc3VtZXItZnJpZW5kbHkgQVBJIGZvclxuICogc3RhdGUgYWNjZXNzLCBkZWJ1ZyBsb2dnaW5nLCBtZXRyaWNzLCBhbmQgcmVjb3JkZXIgaG9va3MuXG4gKlxuICogQ29uc3VtZXJzIGV4dGVuZCB0aGlzIGNsYXNzIHRvIGFkZCBkb21haW4tc3BlY2lmaWMgcHJvcGVydGllczpcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBNeVNjb3BlIGV4dGVuZHMgU2NvcGVGYWNhZGUge1xuICogICBnZXQgdXNlck5hbWUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZ2V0VmFsdWUoJ25hbWUnKSBhcyBzdHJpbmc7IH1cbiAqICAgc2V0IHVzZXJOYW1lKHZhbHVlOiBzdHJpbmcpIHsgdGhpcy5zZXRWYWx1ZSgnbmFtZScsIHZhbHVlKTsgfVxuICogfVxuICogYGBgXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25FbnYgfSBmcm9tICcuLi9lbmdpbmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgbmF0aXZlSGFzIGFzIGxvZGFzaEhhcywgbmF0aXZlU2V0IGFzIGxvZGFzaFNldCB9IGZyb20gJy4uL21lbW9yeS9wYXRoT3BzLmpzJztcbmltcG9ydCB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHsgaGFzQ2lyY3VsYXJSZWZlcmVuY2UsIGlzRGV2TW9kZSB9IGZyb20gJy4vZGV0ZWN0Q2lyY3VsYXIuanMnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90UmVhZG9ubHksIGNyZWF0ZUZyb3plbkFyZ3MgfSBmcm9tICcuL3Byb3RlY3Rpb24vcmVhZG9ubHlJbnB1dC5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEV2ZW50LCBSZWNvcmRlciwgUmVkYWN0aW9uUG9saWN5LCBSZWRhY3Rpb25SZXBvcnQgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IGNsYXNzIFNjb3BlRmFjYWRlIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBCUkFORCA9IFN5bWJvbC5mb3IoJ1Njb3BlRmFjYWRlQHYxJyk7XG5cbiAgcHJvdGVjdGVkIF9zdGFnZUNvbnRleHQ6IFN0YWdlQ29udGV4dDtcbiAgcHJvdGVjdGVkIF9zdGFnZU5hbWU6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9yZWFkT25seVZhbHVlcz86IHVua25vd247XG5cbiAgLyoqIENhY2hlZCBkZWVwbHktZnJvemVuIGNvcHkgb2YgcmVhZE9ubHlWYWx1ZXMgZm9yIGdldEFyZ3MoKS4gQ3JlYXRlZCBvbmNlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9mcm96ZW5BcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvKiogRXhlY3V0aW9uIGVudmlyb25tZW50IOKAlCByZWFkLW9ubHksIGluaGVyaXRlZCBmcm9tIHBhcmVudCBleGVjdXRvci4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfZXhlY3V0aW9uRW52OiBSZWFkb25seTxFeGVjdXRpb25FbnY+O1xuXG4gIHByaXZhdGUgX3JlY29yZGVyczogUmVjb3JkZXJbXSA9IFtdO1xuICBwcml2YXRlIF9yZWRhY3RlZEtleXM6IFNldDxzdHJpbmc+O1xuICBwcml2YXRlIF9yZWRhY3Rpb25Qb2xpY3k6IFJlZGFjdGlvblBvbGljeSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfcmVkYWN0ZWRGaWVsZHNCeUtleTogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+ID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnRleHQ6IFN0YWdlQ29udGV4dCwgc3RhZ2VOYW1lOiBzdHJpbmcsIHJlYWRPbmx5VmFsdWVzPzogdW5rbm93biwgZXhlY3V0aW9uRW52PzogRXhlY3V0aW9uRW52KSB7XG4gICAgdGhpcy5fc3RhZ2VDb250ZXh0ID0gY29udGV4dDtcbiAgICB0aGlzLl9zdGFnZU5hbWUgPSBzdGFnZU5hbWU7XG4gICAgdGhpcy5fcmVhZE9ubHlWYWx1ZXMgPSByZWFkT25seVZhbHVlcztcbiAgICB0aGlzLl9mcm96ZW5BcmdzID0gY3JlYXRlRnJvemVuQXJncyhyZWFkT25seVZhbHVlcyk7XG4gICAgdGhpcy5fZXhlY3V0aW9uRW52ID0gT2JqZWN0LmZyZWV6ZSh7IC4uLmV4ZWN1dGlvbkVudiB9KTtcbiAgICB0aGlzLl9yZWRhY3RlZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIC8vIFJlZ2lzdGVyIGFzIGNvbW1pdCBvYnNlcnZlciBzbyBSZWNvcmRlci5vbkNvbW1pdCBmaXJlcyB3aGVuIFN0YWdlQ29udGV4dC5jb21taXQoKSBpcyBjYWxsZWRcbiAgICB0aGlzLl9zdGFnZUNvbnRleHQuc2V0Q29tbWl0T2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xuICAgICAgdGhpcy5fb25Db21taXRGaXJlZChtdXRhdGlvbnMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNoYXJlIGEgcmVkYWN0ZWQta2V5cyBzZXQgYWNyb3NzIG11bHRpcGxlIFNjb3BlRmFjYWRlIGluc3RhbmNlcy5cbiAgICogQ2FsbCB0aGlzIHRvIG1ha2UgcmVkYWN0aW9uIHBlcnNpc3QgYWNyb3NzIHN0YWdlcyBpbiB0aGUgc2FtZSBwaXBlbGluZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICB1c2VTaGFyZWRSZWRhY3RlZEtleXMoc2hhcmVkU2V0OiBTZXQ8c3RyaW5nPik6IHZvaWQge1xuICAgIHRoaXMuX3JlZGFjdGVkS2V5cyA9IHNoYXJlZFNldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHJlZGFjdGVkLWtleXMgc2V0IChmb3Igc2hhcmluZyB3aXRoIG90aGVyIHNjb3BlcykuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZ2V0UmVkYWN0ZWRLZXlzKCk6IFNldDxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fcmVkYWN0ZWRLZXlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGEgZGVjbGFyYXRpdmUgcmVkYWN0aW9uIHBvbGljeS4gVGhlIHBvbGljeSBpcyBhZGRpdGl2ZSDigJRcbiAgICogaXQgd29ya3MgYWxvbmdzaWRlIG1hbnVhbCBgc2V0VmFsdWUoLi4uLCB0cnVlKWAgY2FsbHMuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdXNlUmVkYWN0aW9uUG9saWN5KHBvbGljeTogUmVkYWN0aW9uUG9saWN5KTogdm9pZCB7XG4gICAgdGhpcy5fcmVkYWN0aW9uUG9saWN5ID0gcG9saWN5O1xuICAgIC8vIFByZS1wb3B1bGF0ZSBmaWVsZC1sZXZlbCByZWRhY3Rpb24gbWFwIGZyb20gcG9saWN5XG4gICAgaWYgKHBvbGljeS5maWVsZHMpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZmllbGRzXSBvZiBPYmplY3QuZW50cmllcyhwb2xpY3kuZmllbGRzKSkge1xuICAgICAgICB0aGlzLl9yZWRhY3RlZEZpZWxkc0J5S2V5LnNldChrZXksIG5ldyBTZXQoZmllbGRzKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRSZWRhY3Rpb25Qb2xpY3koKTogUmVkYWN0aW9uUG9saWN5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcmVkYWN0aW9uUG9saWN5O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjb21wbGlhbmNlLWZyaWVuZGx5IHJlcG9ydCBvZiBhbGwgcmVkYWN0aW9uIGFjdGl2aXR5LlxuICAgKiBOZXZlciBpbmNsdWRlcyBhY3R1YWwgdmFsdWVzIOKAlCBvbmx5IGtleSBuYW1lcywgZmllbGQgbmFtZXMsIGFuZCBwYXR0ZXJucy5cbiAgICovXG4gIGdldFJlZGFjdGlvblJlcG9ydCgpOiBSZWRhY3Rpb25SZXBvcnQge1xuICAgIGNvbnN0IGZpZWxkUmVkYWN0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCBmaWVsZHNdIG9mIHRoaXMuX3JlZGFjdGVkRmllbGRzQnlLZXkpIHtcbiAgICAgIGZpZWxkUmVkYWN0aW9uc1trZXldID0gWy4uLmZpZWxkc107XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICByZWRhY3RlZEtleXM6IFsuLi50aGlzLl9yZWRhY3RlZEtleXNdLFxuICAgICAgZmllbGRSZWRhY3Rpb25zLFxuICAgICAgcGF0dGVybnM6ICh0aGlzLl9yZWRhY3Rpb25Qb2xpY3k/LnBhdHRlcm5zID8/IFtdKS5tYXAoKHApID0+IHAuc291cmNlKSxcbiAgICB9O1xuICB9XG5cbiAgLy8g4pSA4pSAIFJlY29yZGVyIE1hbmFnZW1lbnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXR0YWNoUmVjb3JkZXIocmVjb3JkZXI6IFJlY29yZGVyKTogdm9pZCB7XG4gICAgLy8gUmVwbGFjZSBleGlzdGluZyByZWNvcmRlciB3aXRoIHNhbWUgSUQgKGlkZW1wb3RlbnQg4oCUIHByZXZlbnRzIGRvdWJsZS1jb3VudGluZylcbiAgICB0aGlzLl9yZWNvcmRlcnMgPSB0aGlzLl9yZWNvcmRlcnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSByZWNvcmRlci5pZCk7XG4gICAgdGhpcy5fcmVjb3JkZXJzLnB1c2gocmVjb3JkZXIpO1xuICB9XG5cbiAgZGV0YWNoUmVjb3JkZXIocmVjb3JkZXJJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fcmVjb3JkZXJzID0gdGhpcy5fcmVjb3JkZXJzLmZpbHRlcigocikgPT4gci5pZCAhPT0gcmVjb3JkZXJJZCk7XG4gIH1cblxuICBnZXRSZWNvcmRlcnMoKTogUmVjb3JkZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLl9yZWNvcmRlcnNdO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlTdGFnZVN0YXJ0KCk6IHZvaWQge1xuICAgIHRoaXMuX2ludm9rZUhvb2soJ29uU3RhZ2VTdGFydCcsIHtcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlTdGFnZUVuZChkdXJhdGlvbj86IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2ludm9rZUhvb2soJ29uU3RhZ2VFbmQnLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIGR1cmF0aW9uLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlQYXVzZShwYXVzZURhdGE/OiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5faW52b2tlSG9vaygnb25QYXVzZScsIHtcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgcGF1c2VEYXRhLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlSZXN1bWUoaGFzSW5wdXQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9pbnZva2VIb29rKCdvblJlc3VtZScsIHtcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgaGFzSW5wdXQsXG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG5vdGlmeUNvbW1pdChtdXRhdGlvbnM6IENvbW1pdEV2ZW50WydtdXRhdGlvbnMnXSk6IHZvaWQge1xuICAgIHRoaXMuX2ludm9rZUhvb2soJ29uQ29tbWl0Jywge1xuICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBtdXRhdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICAvKiogQ2FsbGVkIGJ5IFN0YWdlQ29udGV4dC5jb21taXQoKSBvYnNlcnZlci4gQ29udmVydHMgdHJhY2tlZCB3cml0ZXMgdG8gQ29tbWl0RXZlbnQgZm9ybWF0LlxuICAgKiAgRXJyb3JzIGFyZSBjYXVnaHQgdG8gcHJldmVudCByZWNvcmRlciBpc3N1ZXMgZnJvbSBhYm9ydGluZyB0aGUgdHJhdmVyc2FsLiAqL1xuICBwcml2YXRlIF9vbkNvbW1pdEZpcmVkKG11dGF0aW9uczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcmVjb3JkZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbW1pdE11dGF0aW9uczogQ29tbWl0RXZlbnRbJ211dGF0aW9ucyddID0gT2JqZWN0LmVudHJpZXMobXV0YXRpb25zKS5tYXAoKFtrZXksIGVudHJ5XSkgPT4ge1xuICAgICAgICBjb25zdCBpc1JlZGFjdGVkID0gdGhpcy5faXNLZXlSZWRhY3RlZChrZXkpIHx8IHRoaXMuX2lzUG9saWN5UmVkYWN0ZWQoa2V5KTtcbiAgICAgICAgY29uc3QgZmllbGRTZXQgPSB0aGlzLl9yZWRhY3RlZEZpZWxkc0J5S2V5LmdldChrZXkpO1xuXG4gICAgICAgIGxldCByZWNvcmRlclZhbHVlOiB1bmtub3duO1xuICAgICAgICBpZiAoaXNSZWRhY3RlZCkge1xuICAgICAgICAgIHJlY29yZGVyVmFsdWUgPSAnW1JFREFDVEVEXSc7XG4gICAgICAgIH0gZWxzZSBpZiAoZmllbGRTZXQgJiYgZW50cnkudmFsdWUgJiYgdHlwZW9mIGVudHJ5LnZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHJlY29yZGVyVmFsdWUgPSB0aGlzLl9zY3J1YkZpZWxkcyhlbnRyeS52YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgZmllbGRTZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlY29yZGVyVmFsdWUgPSBlbnRyeS52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAga2V5LFxuICAgICAgICAgIHZhbHVlOiByZWNvcmRlclZhbHVlLFxuICAgICAgICAgIG9wZXJhdGlvbjogZW50cnkub3BlcmF0aW9uLFxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMubm90aWZ5Q29tbWl0KGNvbW1pdE11dGF0aW9ucyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBTd2FsbG93IOKAlCByZWNvcmRlciBlcnJvcnMgbXVzdCBub3QgYWJvcnQgdGhlIHRyYXZlcnNhbC5cbiAgICAgIC8vIEluZGl2aWR1YWwgcmVjb3JkZXIgZXJyb3JzIGFyZSBhbHJlYWR5IGlzb2xhdGVkIGJ5IF9pbnZva2VIb29rLlxuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBEZWJ1ZyAvIERpYWdub3N0aWNzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFkZERlYnVnSW5mbyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLl9zdGFnZUNvbnRleHQuYWRkTG9nKGtleSwgdmFsdWUpO1xuICB9XG5cbiAgYWRkRGVidWdNZXNzYWdlKHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5fc3RhZ2VDb250ZXh0LmFkZExvZygnbWVzc2FnZXMnLCBbdmFsdWVdKTtcbiAgfVxuXG4gIGFkZEVycm9ySW5mbyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLl9zdGFnZUNvbnRleHQuYWRkRXJyb3Ioa2V5LCB2YWx1ZSk7XG4gIH1cblxuICBhZGRNZXRyaWMobWV0cmljTmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuX3N0YWdlQ29udGV4dC5hZGRNZXRyaWMobWV0cmljTmFtZSwgdmFsdWUpO1xuICB9XG5cbiAgYWRkRXZhbChtZXRyaWNOYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5fc3RhZ2VDb250ZXh0LmFkZEV2YWwobWV0cmljTmFtZSwgdmFsdWUpO1xuICB9XG5cbiAgLy8g4pSA4pSAIE5vbi1UcmFja2luZyBTdGF0ZSBJbnNwZWN0aW9uIChmb3IgVHlwZWRTY29wZSBwcm94eSBpbnRlcm5hbHMpIOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBSZXR1cm5zIGFsbCBzdGF0ZSBrZXlzIHdpdGhvdXQgZmlyaW5nIG9uUmVhZC4gVXNlZCBieSBUeXBlZFNjb3BlIG93bktleXMvaGFzIHRyYXBzLiAqL1xuICBnZXRTdGF0ZUtleXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy5fc3RhZ2VDb250ZXh0LmdldFZhbHVlKFtdLCB1bmRlZmluZWQpO1xuICAgIGlmICghc25hcHNob3QgfHwgdHlwZW9mIHNuYXBzaG90ICE9PSAnb2JqZWN0JykgcmV0dXJuIFtdO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhzbmFwc2hvdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gIH1cblxuICAvKiogQ2hlY2sga2V5IGV4aXN0ZW5jZSB3aXRob3V0IGZpcmluZyBvblJlYWQuIFVzZWQgYnkgVHlwZWRTY29wZSBoYXMgdHJhcC5cbiAgICogIENvbnRyYWN0OiByZXR1cm5zIGZhbHNlIGZvciBrZXlzIG5ldmVyIHNldCBPUiBrZXlzIHNldCB0byB1bmRlZmluZWQuXG4gICAqICBUaGlzIG1hdGNoZXMgZGVsZXRlVmFsdWUoKSBzZW1hbnRpY3MgKHNldHMgdG8gdW5kZWZpbmVkID0gZGVsZXRlZCkuICovXG4gIGhhc0tleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0VmFsdWUoW10sIGtleSkgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBSZWFkIHN0YXRlIHdpdGhvdXQgZmlyaW5nIG9uUmVhZC4gVXNlZCBieSBhcnJheSBwcm94eSBnZXRDdXJyZW50KCkgdG8gYXZvaWRcbiAgICogIHBoYW50b20gcmVhZHMgb24gaW50ZXJuYWwgYXJyYXkgb3BlcmF0aW9ucyAoLmxlbmd0aCwgLmhhcywgaXRlcmF0aW9uLCBldGMuKS5cbiAgICogIFRoZSBpbml0aWFsIHByb3BlcnR5IGFjY2VzcyBmaXJlcyBvbmUgdHJhY2tlZCBvblJlYWQgdmlhIGdldFZhbHVlKCk7IHN1YnNlcXVlbnRcbiAgICogIGludGVybmFsIGFycmF5IG9wZXJhdGlvbnMgdXNlIHRoaXMgbWV0aG9kIHRvIHN0YXkgc2lsZW50LlxuICAgKiAgTk9URTogTGlrZSBnZXRWYWx1ZSgpLCByZXR1cm5zIHRoZSByYXcgdmFsdWUgdG8gdGhlIGNhbGxlci4gUmVkYWN0aW9uIGFwcGxpZXNcbiAgICogIG9ubHkgdG8gcmVjb3JkZXIgZGlzcGF0Y2gg4oCUIGl0IGRvZXMgbm90IGZpbHRlciB0aGUgcmV0dXJuZWQgdmFsdWUuIFRoaXMgbWF0Y2hlc1xuICAgKiAgdGhlIGV4aXN0aW5nIGdldFZhbHVlKCkgY29udHJhY3Qgd2hlcmUgdXNlciBjb2RlIGFsd2F5cyByZWNlaXZlcyByYXcgZGF0YS4gKi9cbiAgZ2V0VmFsdWVTaWxlbnQoa2V5Pzogc3RyaW5nKTogdW5rbm93biB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRWYWx1ZURpcmVjdChbXSwga2V5KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTdGF0ZSBBY2Nlc3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0SW5pdGlhbFZhbHVlRm9yKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRHbG9iYWw/LihrZXkpO1xuICB9XG5cbiAgZ2V0VmFsdWUoa2V5Pzogc3RyaW5nKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0VmFsdWUoW10sIGtleSk7XG5cbiAgICBpZiAodGhpcy5fcmVjb3JkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGlzUmVkYWN0ZWQgPSBrZXkgIT09IHVuZGVmaW5lZCAmJiB0aGlzLl9pc0tleVJlZGFjdGVkKGtleSk7XG4gICAgICBjb25zdCBmaWVsZFNldCA9IGtleSAhPT0gdW5kZWZpbmVkID8gdGhpcy5fcmVkYWN0ZWRGaWVsZHNCeUtleS5nZXQoa2V5KSA6IHVuZGVmaW5lZDtcblxuICAgICAgbGV0IHJlY29yZGVyVmFsdWU6IHVua25vd247XG4gICAgICBpZiAoaXNSZWRhY3RlZCkge1xuICAgICAgICByZWNvcmRlclZhbHVlID0gJ1tSRURBQ1RFRF0nO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZFNldCAmJiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJlY29yZGVyVmFsdWUgPSB0aGlzLl9zY3J1YkZpZWxkcyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgZmllbGRTZXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVjb3JkZXJWYWx1ZSA9IHZhbHVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9pbnZva2VIb29rKCdvblJlYWQnLCB7XG4gICAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWU6IHJlY29yZGVyVmFsdWUsXG4gICAgICAgIHJlZGFjdGVkOiBpc1JlZGFjdGVkIHx8IGZpZWxkU2V0ICE9PSB1bmRlZmluZWQgfHwgdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgc2V0VmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBzaG91bGRSZWRhY3Q/OiBib29sZWFuLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIGFzc2VydE5vdFJlYWRvbmx5KHRoaXMuX3JlYWRPbmx5VmFsdWVzLCBrZXksICd3cml0ZScpO1xuXG4gICAgLy8gRGV2LW1vZGU6IHdhcm4gaWYgdGhlIHZhbHVlIGNvbnRhaW5zIGNpcmN1bGFyIHJlZmVyZW5jZXMuXG4gICAgLy8gQ2hlY2sgQUZURVIgYXNzZXJ0Tm90UmVhZG9ubHkg4oCUIGRvbid0IHdhcm4gZm9yIHdyaXRlcyB0aGF0IHdpbGwgYmUgYmxvY2tlZC5cbiAgICAvLyBDaXJjdWxhciB2YWx1ZXMgd29yayAodGVybWluYWwgcHJveHkgaGFuZGxlcyB0aGVtKSBidXQgY2FuIHByb2R1Y2VcbiAgICAvLyBzdXJwcmlzaW5nIGJlaGF2aW9yIGluIG5hcnJhdGl2ZSwgSlNPTiBzZXJpYWxpemF0aW9uLCBhbmQgc25hcHNob3RzLlxuICAgIGlmIChpc0Rldk1vZGUoKSAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoaGFzQ2lyY3VsYXJSZWZlcmVuY2UodmFsdWUpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW2Zvb3RwcmludF0gQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGluIHNldFZhbHVlKCcke2tleX0nKS4gYCArXG4gICAgICAgICAgICAnV3JpdGVzIHBhc3QgdGhlIGN5Y2xlIGRlcHRoIHdpbGwgdXNlIHRlcm1pbmFsIHByb3h5IHRyYWNraW5nLiAnICtcbiAgICAgICAgICAgICdDb25zaWRlciBmbGF0dGVuaW5nIHRoZSBkYXRhIHN0cnVjdHVyZS4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEF1dG8tcmVkYWN0IGlmIGtleSBtYXRjaGVzIHBvbGljeSAoZXhhY3Qga2V5cyBvciBwYXR0ZXJucyksIG9yIGlmIHRoZSBrZXkgd2FzXG4gICAgLy8gcHJldmlvdXNseSBtYXJrZWQgcmVkYWN0ZWQgKGUuZy4gY2FycmllZCBvdmVyIGZyb20gYSBzdWJmbG93IHZpYSBvdXRwdXRNYXBwZXIpLlxuICAgIGNvbnN0IGVmZmVjdGl2ZVJlZGFjdCA9IHNob3VsZFJlZGFjdCB8fCB0aGlzLl9pc1BvbGljeVJlZGFjdGVkKGtleSkgfHwgdGhpcy5fcmVkYWN0ZWRLZXlzLmhhcyhrZXkpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fc3RhZ2VDb250ZXh0LnNldE9iamVjdChbXSwga2V5LCB2YWx1ZSwgZWZmZWN0aXZlUmVkYWN0LCBkZXNjcmlwdGlvbik7XG5cbiAgICBpZiAoZWZmZWN0aXZlUmVkYWN0KSB7XG4gICAgICB0aGlzLl9yZWRhY3RlZEtleXMuYWRkKGtleSk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGZpZWxkLWxldmVsIHJlZGFjdGlvbiBmcm9tIHBvbGljeVxuICAgIGNvbnN0IGZpZWxkU2V0ID0gdGhpcy5fcmVkYWN0ZWRGaWVsZHNCeUtleS5nZXQoa2V5KTtcblxuICAgIGlmICh0aGlzLl9yZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IHJlY29yZGVyVmFsdWU6IHVua25vd247XG4gICAgICBpZiAoZWZmZWN0aXZlUmVkYWN0KSB7XG4gICAgICAgIHJlY29yZGVyVmFsdWUgPSAnW1JFREFDVEVEXSc7XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkU2V0ICYmIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmVjb3JkZXJWYWx1ZSA9IHRoaXMuX3NjcnViRmllbGRzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBmaWVsZFNldCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWNvcmRlclZhbHVlID0gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2ludm9rZUhvb2soJ29uV3JpdGUnLCB7XG4gICAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWU6IHJlY29yZGVyVmFsdWUsXG4gICAgICAgIG9wZXJhdGlvbjogJ3NldCcsXG4gICAgICAgIHJlZGFjdGVkOiBlZmZlY3RpdmVSZWRhY3QgfHwgZmllbGRTZXQgIT09IHVuZGVmaW5lZCB8fCB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgdXBkYXRlVmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIGFzc2VydE5vdFJlYWRvbmx5KHRoaXMuX3JlYWRPbmx5VmFsdWVzLCBrZXksICd3cml0ZScpO1xuXG4gICAgLy8gRGV2LW1vZGU6IHNhbWUgY2lyY3VsYXIgY2hlY2sgYXMgc2V0VmFsdWUgKG1lcmdlIHRhcmdldHMgY2FuIGJlIGNpcmN1bGFyIHRvbylcbiAgICBpZiAoaXNEZXZNb2RlKCkgJiYgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKGhhc0NpcmN1bGFyUmVmZXJlbmNlKHZhbHVlKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtmb290cHJpbnRdIENpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBpbiB1cGRhdGVWYWx1ZSgnJHtrZXl9JykuIGAgK1xuICAgICAgICAgICAgJ0NvbnNpZGVyIGZsYXR0ZW5pbmcgdGhlIGRhdGEgc3RydWN0dXJlLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaXNSZWRhY3RlZCA9IHRoaXMuX2lzS2V5UmVkYWN0ZWQoa2V5KSB8fCB0aGlzLl9pc1BvbGljeVJlZGFjdGVkKGtleSk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fc3RhZ2VDb250ZXh0LnVwZGF0ZU9iamVjdChbXSwga2V5LCB2YWx1ZSwgZGVzY3JpcHRpb24sIGlzUmVkYWN0ZWQpO1xuXG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmaWVsZFNldCA9IHRoaXMuX3JlZGFjdGVkRmllbGRzQnlLZXkuZ2V0KGtleSk7XG5cbiAgICAgIGxldCByZWNvcmRlclZhbHVlOiB1bmtub3duO1xuICAgICAgaWYgKGlzUmVkYWN0ZWQpIHtcbiAgICAgICAgcmVjb3JkZXJWYWx1ZSA9ICdbUkVEQUNURURdJztcbiAgICAgIH0gZWxzZSBpZiAoZmllbGRTZXQgJiYgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZWNvcmRlclZhbHVlID0gdGhpcy5fc2NydWJGaWVsZHModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGZpZWxkU2V0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlY29yZGVyVmFsdWUgPSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5faW52b2tlSG9vaygnb25Xcml0ZScsIHtcbiAgICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZTogcmVjb3JkZXJWYWx1ZSxcbiAgICAgICAgb3BlcmF0aW9uOiAndXBkYXRlJyxcbiAgICAgICAgcmVkYWN0ZWQ6IGlzUmVkYWN0ZWQgfHwgZmllbGRTZXQgIT09IHVuZGVmaW5lZCB8fCB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZGVsZXRlVmFsdWUoa2V5OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgYXNzZXJ0Tm90UmVhZG9ubHkodGhpcy5fcmVhZE9ubHlWYWx1ZXMsIGtleSwgJ2RlbGV0ZScpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fc3RhZ2VDb250ZXh0LnNldE9iamVjdChbXSwga2V5LCB1bmRlZmluZWQsIGZhbHNlLCBkZXNjcmlwdGlvbiA/PyBgZGVsZXRlZCAke2tleX1gLCAnZGVsZXRlJyk7XG5cbiAgICAvLyBEZWxldGluZyBhIHJlZGFjdGVkIGtleSBjbGVhcnMgaXRzIHJlZGFjdGlvbiBzdGF0dXNcbiAgICB0aGlzLl9yZWRhY3RlZEtleXMuZGVsZXRlKGtleSk7XG5cbiAgICBpZiAodGhpcy5fcmVjb3JkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX2ludm9rZUhvb2soJ29uV3JpdGUnLCB7XG4gICAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgb3BlcmF0aW9uOiAnZGVsZXRlJyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHNldEdsb2JhbChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5zZXRHbG9iYWw/LihrZXksIHZhbHVlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldEdsb2JhbChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0R2xvYmFsPy4oa2V5KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc2V0T2JqZWN0SW5Sb290KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHJldHVybiB0aGlzLl9zdGFnZUNvbnRleHQuc2V0Um9vdD8uKGtleSwgdmFsdWUpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJlYWQtb25seSArIG1pc2Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJlYWRvbmx5IGlucHV0IHZhbHVlcyBwYXNzZWQgdG8gdGhpcyBwaXBlbGluZSwgY2FzdCB0byBgVGAuXG4gICAqIFRoZSByZXR1cm5lZCBvYmplY3QgaXMgZGVlcGx5IGZyb3plbiDigJQgYW55IGF0dGVtcHQgdG8gbXV0YXRlIGl0IHRocm93cy5cbiAgICogQ2FjaGVkIGF0IGNvbnN0cnVjdGlvbiB0aW1lIGZvciB6ZXJvLWFsbG9jYXRpb24gcmVwZWF0ZWQgYWNjZXNzLlxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHsgYXBwbGljYW50TmFtZSwgaW5jb21lIH0gPSBzY29wZS5nZXRBcmdzPHsgYXBwbGljYW50TmFtZTogc3RyaW5nOyBpbmNvbWU6IG51bWJlciB9PigpO1xuICAgKiBgYGBcbiAgICovXG4gIGdldEFyZ3M8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5fZnJvemVuQXJncyBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCDigJQgcmVhZC1vbmx5IGluZnJhc3RydWN0dXJlIHZhbHVlc1xuICAgKiB0aGF0IHByb3BhZ2F0ZSB0aHJvdWdoIG5lc3RlZCBleGVjdXRvcnMgKGxpa2UgYHByb2Nlc3MuZW52YCBmb3IgZmxvd2NoYXJ0cykuXG4gICAqXG4gICAqIENvbnRhaW5zOiBzaWduYWwgKGFib3J0KSwgdGltZW91dE1zLCB0cmFjZUlkLlxuICAgKiBGcm96ZW4gYXQgY29uc3RydWN0aW9uIHRpbWUuIEluaGVyaXRlZCBieSBzdWJmbG93cyBhdXRvbWF0aWNhbGx5LlxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHsgc2lnbmFsLCB0cmFjZUlkIH0gPSBzY29wZS5nZXRFbnYoKTtcbiAgICogYGBgXG4gICAqL1xuICBnZXRFbnYoKTogUmVhZG9ubHk8RXhlY3V0aW9uRW52PiB7XG4gICAgcmV0dXJuIHRoaXMuX2V4ZWN1dGlvbkVudjtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0UGlwZWxpbmVJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkO1xuICB9XG5cbiAgLy8g4pSA4pSAIEludGVybmFsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBDaGVja3MgaWYgYSBrZXkgaXMgcmVkYWN0ZWQgKGV4cGxpY2l0IF9yZWRhY3RlZEtleXMgc2V0KS4gKi9cbiAgcHJpdmF0ZSBfaXNLZXlSZWRhY3RlZChrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9yZWRhY3RlZEtleXMuaGFzKGtleSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEga2V5IHNob3VsZCBiZSBhdXRvLXJlZGFjdGVkIGJ5IHRoZSBwb2xpY3kgKGV4YWN0IGtleXMgKyBwYXR0ZXJucykuXG4gICAqXG4gICAqIFJlRG9TIGd1YXJkOiBwYXR0ZXJuIHRlc3RpbmcgaXMgY2FwcGVkIGF0IE1BWF9QQVRURVJOX0tFWV9MRU4gY2hhcmFjdGVycy5cbiAgICogU2NvcGUgc3RhdGUga2V5cyBhcmUgYWx3YXlzIHNob3J0IGlkZW50aWZpZXJzOyBhbnkga2V5IGV4Y2VlZGluZyB0aGUgY2FwXG4gICAqIGlzIGFsbW9zdCBjZXJ0YWlubHkgbm90IGEgbGVnaXRpbWF0ZSBzY29wZSBrZXksIHNvIHNraXBwaW5nIHBhdHRlcm4gbWF0Y2hpbmdcbiAgICogZm9yIGl0IGRvZXMgbm90IHJpc2sgbGVha2luZyBQSUkuIEV4YWN0LWtleSBtYXRjaGluZyAoQXJyYXkuaW5jbHVkZXMpIGlzXG4gICAqIHN0aWxsIGFwcGxpZWQgcmVnYXJkbGVzcyBvZiBsZW5ndGggYW5kIGlzIG5vdCB2dWxuZXJhYmxlIHRvIFJlRG9TLlxuICAgKi9cbiAgcHJpdmF0ZSBfaXNQb2xpY3lSZWRhY3RlZChrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5fcmVkYWN0aW9uUG9saWN5KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuX3JlZGFjdGlvblBvbGljeS5rZXlzPy5pbmNsdWRlcyhrZXkpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5fcmVkYWN0aW9uUG9saWN5LnBhdHRlcm5zKSB7XG4gICAgICBpZiAoa2V5Lmxlbmd0aCA+IFNjb3BlRmFjYWRlLl9NQVhfUEFUVEVSTl9LRVlfTEVOKSB7XG4gICAgICAgIC8vIERldi1tb2RlIHdhcm5pbmc6IHBhdHRlcm4gbWF0Y2hpbmcgd2FzIHNpbGVudGx5IHNraXBwZWQgZm9yIHRoaXMga2V5LlxuICAgICAgICAvLyBVc2UgcG9saWN5LmtleXMgZm9yIGV4YWN0IG1hdGNoaW5nIG9mIGxvbmcga2V5IG5hbWVzLlxuICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBbZm9vdHByaW50XSBSZWRhY3Rpb25Qb2xpY3k6IGtleSAnJHtrZXkuc2xpY2UoMCwgNDApfS4uLicgKCR7a2V5Lmxlbmd0aH0gY2hhcnMpIGV4Y2VlZHMgYCArXG4gICAgICAgICAgICAgICd0aGUgcGF0dGVybi1tYXRjaGluZyBsZW5ndGggY2FwIGFuZCB3YXMgc2tpcHBlZC4gJyArXG4gICAgICAgICAgICAgICdVc2UgcG9saWN5LmtleXMgZm9yIGV4YWN0IG1hdGNoaW5nIG9mIGxvbmcga2V5IG5hbWVzLicsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIHRoaXMuX3JlZGFjdGlvblBvbGljeS5wYXR0ZXJucykge1xuICAgICAgICAgIHAubGFzdEluZGV4ID0gMDsgLy8gUmVzZXQgc3RhdGVmdWwgZ2xvYmFsL3N0aWNreSByZWdleGVzXG4gICAgICAgICAgaWYgKHAudGVzdChrZXkpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogTWF4aW11bSBrZXkgbGVuZ3RoIChjaGFyYWN0ZXJzKSB0aGF0IHdpbGwgYmUgdGVzdGVkIGFnYWluc3QgcmVnZXggcmVkYWN0aW9uXG4gICAqIHBhdHRlcm5zLiBLZXlzIGxvbmdlciB0aGFuIHRoaXMgYXJlIHNraXBwZWQgZm9yIHBhdHRlcm4gbWF0Y2hpbmcgdG8gcHJldmVudFxuICAgKiBSZURvUzogYSBwYXRob2xvZ2ljYWwgcmVnZXggdGVzdGVkIGFnYWluc3QgYW4gdW5ib3VuZGVkbHkgbG9uZyBrZXkgc3RyaW5nXG4gICAqIGNhbiBjYXVzZSBjYXRhc3Ryb3BoaWMgYmFja3RyYWNraW5nLlxuICAgKlxuICAgKiAyNTYgY2hhcmFjdGVycyBjb21mb3J0YWJseSBleGNlZWRzIGFueSByZWFsaXN0aWMgc2NvcGUtc3RhdGUga2V5IG5hbWUuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBfTUFYX1BBVFRFUk5fS0VZX0xFTiA9IDI1NjtcblxuICAvKipcbiAgICogUmV0dXJucyBhIGRlZXAtY2xvbmVkIGNvcHkgd2l0aCBzcGVjaWZpZWQgZmllbGRzIHJlcGxhY2VkIGJ5ICdbUkVEQUNURURdJy5cbiAgICogU3VwcG9ydHMgZG90LW5vdGF0aW9uIHBhdGhzIChlLmcuICdhZGRyZXNzLnppcCcpIGZvciBuZXN0ZWQgb2JqZWN0cy5cbiAgICovXG4gIHByaXZhdGUgX3NjcnViRmllbGRzKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGZpZWxkczogU2V0PHN0cmluZz4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgY29weSA9IHN0cnVjdHVyZWRDbG9uZShvYmopO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICBpZiAoZmllbGQuaW5jbHVkZXMoJy4nKSAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvcHksIGZpZWxkKSkge1xuICAgICAgICAvLyBEb3Qtbm90YXRpb24gcGF0aCDihpIgZGVlcCBzY3J1YiAob25seSBpZiBub3QgYSBsaXRlcmFsIGZsYXQga2V5KVxuICAgICAgICBpZiAobG9kYXNoSGFzKGNvcHksIGZpZWxkKSkge1xuICAgICAgICAgIGxvZGFzaFNldChjb3B5LCBmaWVsZCwgJ1tSRURBQ1RFRF0nKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb3B5LCBmaWVsZCkpIHtcbiAgICAgICAgICBjb3B5W2ZpZWxkXSA9ICdbUkVEQUNURURdJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29weTtcbiAgfVxuXG4gIHByaXZhdGUgX2ludm9rZUhvb2soaG9vazoga2V5b2YgT21pdDxSZWNvcmRlciwgJ2lkJz4sIGV2ZW50OiB1bmtub3duKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCByZWNvcmRlciBvZiB0aGlzLl9yZWNvcmRlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhvb2tGbiA9IHJlY29yZGVyW2hvb2tdO1xuICAgICAgICBpZiAodHlwZW9mIGhvb2tGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIChob29rRm4gYXMgKGV2ZW50OiB1bmtub3duKSA9PiB2b2lkKS5jYWxsKHJlY29yZGVyLCBldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChob29rICE9PSAnb25FcnJvcicpIHtcbiAgICAgICAgICB0aGlzLl9pbnZva2VIb29rKCdvbkVycm9yJywge1xuICAgICAgICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICAgICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IgYXMgRXJyb3IsXG4gICAgICAgICAgICBvcGVyYXRpb246IGhvb2sgPT09ICdvblJlYWQnID8gJ3JlYWQnIDogaG9vayA9PT0gJ29uQ29tbWl0JyA/ICdjb21taXQnIDogJ3dyaXRlJyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
@@ -7,4 +7,4 @@
7
7
  * attached to Scope instances to observe read/write/commit operations.
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Njb3BlL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7O0dBTUciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNjb3BlIFR5cGUgRGVmaW5pdGlvbnNcbiAqXG4gKiBDb3JlIHR5cGVzIGZvciB0aGUgY29tcG9zYWJsZSBTY29wZSBzeXN0ZW0gd2l0aCBwbHVnZ2FibGUgUmVjb3JkZXJzLlxuICogQXJjaGl0ZWN0dXJlIGZvbGxvd3MgY29tcG9zaXRpb24tb3Zlci1pbmhlcml0YW5jZTogUmVjb3JkZXJzIGFyZVxuICogYXR0YWNoZWQgdG8gU2NvcGUgaW5zdGFuY2VzIHRvIG9ic2VydmUgcmVhZC93cml0ZS9jb21taXQgb3BlcmF0aW9ucy5cbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFdmVudCBUeXBlc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlY29yZGVyQ29udGV4dCB7XG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICAvKiogU3RhYmxlIHN0YWdlIGlkZW50aWZpZXIgKG1hdGNoZXMgc3BlYyBub2RlIGlkKS4gKi9cbiAgc3RhZ2VJZDogc3RyaW5nO1xuICBwaXBlbGluZUlkOiBzdHJpbmc7XG4gIHRpbWVzdGFtcDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRFdmVudCBleHRlbmRzIFJlY29yZGVyQ29udGV4dCB7XG4gIGtleT86IHN0cmluZztcbiAgdmFsdWU6IHVua25vd247XG4gIC8qKiBUcnVlIHdoZW4gdGhlIHZhbHVlIGhhcyBiZWVuIHJlZGFjdGVkIGZvciBQSUkgcHJvdGVjdGlvbi4gKi9cbiAgcmVkYWN0ZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdyaXRlRXZlbnQgZXh0ZW5kcyBSZWNvcmRlckNvbnRleHQge1xuICBrZXk6IHN0cmluZztcbiAgdmFsdWU6IHVua25vd247XG4gIG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnO1xuICAvKiogVHJ1ZSB3aGVuIHRoZSB2YWx1ZSBoYXMgYmVlbiByZWRhY3RlZCBmb3IgUElJIHByb3RlY3Rpb24uICovXG4gIHJlZGFjdGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21taXRFdmVudCBleHRlbmRzIFJlY29yZGVyQ29udGV4dCB7XG4gIG11dGF0aW9uczogQXJyYXk8e1xuICAgIGtleTogc3RyaW5nO1xuICAgIHZhbHVlOiB1bmtub3duO1xuICAgIG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnO1xuICB9Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFcnJvckV2ZW50IGV4dGVuZHMgUmVjb3JkZXJDb250ZXh0IHtcbiAgZXJyb3I6IEVycm9yO1xuICBvcGVyYXRpb246ICdyZWFkJyB8ICd3cml0ZScgfCAnY29tbWl0JztcbiAga2V5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YWdlRXZlbnQgZXh0ZW5kcyBSZWNvcmRlckNvbnRleHQge1xuICBkdXJhdGlvbj86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXVzZUV2ZW50IGV4dGVuZHMgUmVjb3JkZXJDb250ZXh0IHtcbiAgcGF1c2VEYXRhPzogdW5rbm93bjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXN1bWVFdmVudCBleHRlbmRzIFJlY29yZGVyQ29udGV4dCB7XG4gIGhhc0lucHV0OiBib29sZWFuO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSZWRhY3Rpb24gUG9saWN5XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRGVjbGFyYXRpdmUgcmVkYWN0aW9uIGNvbmZpZ3VyYXRpb24g4oCUIGRlZmluZSBvbmNlLCBhcHBsaWVkIGV2ZXJ5d2hlcmUuXG4gKlxuICogQ29uZmlndXJlIGF0IHRoZSBzY29wZSBjbGFzcyBsZXZlbCAoc3RhdGljIHByb3BlcnR5KSBvciBwYXNzIHRvXG4gKiBGbG93Q2hhcnRFeGVjdXRvciB0byBhcHBseSBhY3Jvc3MgYWxsIHN0YWdlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWRhY3Rpb25Qb2xpY3kge1xuICAvKiogRXhhY3Qga2V5IG5hbWVzIHRvIGFsd2F5cyByZWRhY3QgKGUuZy4gWydzc24nLCAnY3JlZGl0Q2FyZCddKS4gKi9cbiAga2V5cz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogUmVnZXggcGF0dGVybnMg4oCUIGFueSBrZXkgbWF0Y2hpbmcgYSBwYXR0ZXJuIGlzIGF1dG8tcmVkYWN0ZWQuXG4gICAqXG4gICAqIFBhdHRlcm4gbWF0Y2hpbmcgaXMgc2tpcHBlZCBmb3Iga2V5cyB0aGF0IGV4Y2VlZCBhbiBpbnRlcm5hbCBsZW5ndGggY2FwXG4gICAqIChkZXNpZ25lZCB0byBwcmV2ZW50IFJlRG9TIG9uIHBhdGhvbG9naWNhbCBwYXR0ZXJucykuIEZvciB2ZXJ5IGxvbmcga2V5XG4gICAqIG5hbWVzLCB1c2UgYGtleXNgIChleGFjdCBtYXRjaCkgaW5zdGVhZCBvZiBwYXR0ZXJucy5cbiAgICovXG4gIHBhdHRlcm5zPzogUmVnRXhwW107XG4gIC8qKiBGaWVsZC1sZXZlbCByZWRhY3Rpb24gd2l0aGluIG9iamVjdHMg4oCUIGtleSDihpIgYXJyYXkgb2YgZmllbGRzIHRvIHNjcnViLlxuICAgKiAgU3VwcG9ydHMgZG90LW5vdGF0aW9uIGZvciBuZXN0ZWQgcGF0aHMgKGUuZy4gJ2FkZHJlc3MuemlwJykuICovXG4gIGZpZWxkcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcbn1cblxuLyoqXG4gKiBDb21wbGlhbmNlLWZyaWVuZGx5IHJlcG9ydCBvZiB3aGF0IHdhcyByZWRhY3RlZC4gTmV2ZXIgaW5jbHVkZXMgdmFsdWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZGFjdGlvblJlcG9ydCB7XG4gIC8qKiBLZXlzIGZ1bGx5IHJlZGFjdGVkIChleGFjdCBtYXRjaCBvciBwYXR0ZXJuIG1hdGNoKS4gKi9cbiAgcmVkYWN0ZWRLZXlzOiBzdHJpbmdbXTtcbiAgLyoqIEtleXMgd2l0aCBmaWVsZC1sZXZlbCByZWRhY3Rpb24g4oaSIHdoaWNoIGZpZWxkcyB3ZXJlIHNjcnViYmVkLiAqL1xuICBmaWVsZFJlZGFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcbiAgLyoqIFNvdXJjZSBzdHJpbmdzIG9mIHJlZ2lzdGVyZWQgcGF0dGVybnMuICovXG4gIHBhdHRlcm5zOiBzdHJpbmdbXTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUmVjb3JkZXIgSW50ZXJmYWNlXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUGx1Z2dhYmxlIG9ic2VydmVyIGZvciBzY29wZSBvcGVyYXRpb25zLlxuICpcbiAqIEFsbCBtZXRob2RzIGFyZSBvcHRpb25hbCDigJQgaW1wbGVtZW50IG9ubHkgdGhlIGhvb2tzIHlvdSBuZWVkLlxuICogUmVjb3JkZXJzIGFyZSBpbnZva2VkIHN5bmNocm9ub3VzbHkgaW4gYXR0YWNobWVudCBvcmRlci5cbiAqIElmIGEgcmVjb3JkZXIgdGhyb3dzLCB0aGUgZXJyb3IgaXMgY2F1Z2h0IGFuZCBwYXNzZWQgdG8gb25FcnJvclxuICogaG9va3Mgb2Ygb3RoZXIgcmVjb3JkZXJzOyB0aGUgc2NvcGUgb3BlcmF0aW9uIGNvbnRpbnVlcyBub3JtYWxseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNvcmRlciB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIG9uUmVhZD8oZXZlbnQ6IFJlYWRFdmVudCk6IHZvaWQ7XG4gIG9uV3JpdGU/KGV2ZW50OiBXcml0ZUV2ZW50KTogdm9pZDtcbiAgb25Db21taXQ/KGV2ZW50OiBDb21taXRFdmVudCk6IHZvaWQ7XG4gIG9uRXJyb3I/KGV2ZW50OiBFcnJvckV2ZW50KTogdm9pZDtcbiAgb25TdGFnZVN0YXJ0PyhldmVudDogU3RhZ2VFdmVudCk6IHZvaWQ7XG4gIG9uU3RhZ2VFbmQ/KGV2ZW50OiBTdGFnZUV2ZW50KTogdm9pZDtcbiAgb25QYXVzZT8oZXZlbnQ6IFBhdXNlRXZlbnQpOiB2b2lkO1xuICBvblJlc3VtZT8oZXZlbnQ6IFJlc3VtZUV2ZW50KTogdm9pZDtcbiAgLyoqIFJlc2V0IHN0YXRlIGJlZm9yZSBlYWNoIGV4ZWN1dG9yLnJ1bigpIOKAlCBwcmV2ZW50cyBjcm9zcy1ydW4gYWNjdW11bGF0aW9uLiAqL1xuICBjbGVhcj8oKTogdm9pZDtcbiAgLyoqIEV4cG9zZSBjb2xsZWN0ZWQgZGF0YSBmb3IgaW5jbHVzaW9uIGluIGV4ZWN1dG9yLmdldFNuYXBzaG90KCkucmVjb3JkZXJzLiAqL1xuICB0b1NuYXBzaG90PygpOiB7IG5hbWU6IHN0cmluZzsgZGF0YTogdW5rbm93biB9O1xufVxuIl19
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Njb3BlL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7O0dBTUciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNjb3BlIFR5cGUgRGVmaW5pdGlvbnNcbiAqXG4gKiBDb3JlIHR5cGVzIGZvciB0aGUgY29tcG9zYWJsZSBTY29wZSBzeXN0ZW0gd2l0aCBwbHVnZ2FibGUgUmVjb3JkZXJzLlxuICogQXJjaGl0ZWN0dXJlIGZvbGxvd3MgY29tcG9zaXRpb24tb3Zlci1pbmhlcml0YW5jZTogUmVjb3JkZXJzIGFyZVxuICogYXR0YWNoZWQgdG8gU2NvcGUgaW5zdGFuY2VzIHRvIG9ic2VydmUgcmVhZC93cml0ZS9jb21taXQgb3BlcmF0aW9ucy5cbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFdmVudCBUeXBlc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlY29yZGVyQ29udGV4dCB7XG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICAvKiogU3RhYmxlIHN0YWdlIGlkZW50aWZpZXIgKG1hdGNoZXMgc3BlYyBub2RlIGlkKS4gKi9cbiAgc3RhZ2VJZDogc3RyaW5nO1xuICAvKiogVW5pcXVlIHBlci1leGVjdXRpb24tc3RlcCBpZGVudGlmaWVyLiBGb3JtYXQ6IFtzdWJmbG93UGF0aC9dc3RhZ2VJZCNleGVjdXRpb25JbmRleCAqL1xuICBydW50aW1lU3RhZ2VJZDogc3RyaW5nO1xuICBwaXBlbGluZUlkOiBzdHJpbmc7XG4gIHRpbWVzdGFtcDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRFdmVudCBleHRlbmRzIFJlY29yZGVyQ29udGV4dCB7XG4gIGtleT86IHN0cmluZztcbiAgdmFsdWU6IHVua25vd247XG4gIC8qKiBUcnVlIHdoZW4gdGhlIHZhbHVlIGhhcyBiZWVuIHJlZGFjdGVkIGZvciBQSUkgcHJvdGVjdGlvbi4gKi9cbiAgcmVkYWN0ZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdyaXRlRXZlbnQgZXh0ZW5kcyBSZWNvcmRlckNvbnRleHQge1xuICBrZXk6IHN0cmluZztcbiAgdmFsdWU6IHVua25vd247XG4gIG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnO1xuICAvKiogVHJ1ZSB3aGVuIHRoZSB2YWx1ZSBoYXMgYmVlbiByZWRhY3RlZCBmb3IgUElJIHByb3RlY3Rpb24uICovXG4gIHJlZGFjdGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21taXRFdmVudCBleHRlbmRzIFJlY29yZGVyQ29udGV4dCB7XG4gIG11dGF0aW9uczogQXJyYXk8e1xuICAgIGtleTogc3RyaW5nO1xuICAgIHZhbHVlOiB1bmtub3duO1xuICAgIG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnO1xuICB9Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFcnJvckV2ZW50IGV4dGVuZHMgUmVjb3JkZXJDb250ZXh0IHtcbiAgZXJyb3I6IEVycm9yO1xuICBvcGVyYXRpb246ICdyZWFkJyB8ICd3cml0ZScgfCAnY29tbWl0JztcbiAga2V5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YWdlRXZlbnQgZXh0ZW5kcyBSZWNvcmRlckNvbnRleHQge1xuICBkdXJhdGlvbj86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXVzZUV2ZW50IGV4dGVuZHMgUmVjb3JkZXJDb250ZXh0IHtcbiAgcGF1c2VEYXRhPzogdW5rbm93bjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXN1bWVFdmVudCBleHRlbmRzIFJlY29yZGVyQ29udGV4dCB7XG4gIGhhc0lucHV0OiBib29sZWFuO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSZWRhY3Rpb24gUG9saWN5XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRGVjbGFyYXRpdmUgcmVkYWN0aW9uIGNvbmZpZ3VyYXRpb24g4oCUIGRlZmluZSBvbmNlLCBhcHBsaWVkIGV2ZXJ5d2hlcmUuXG4gKlxuICogQ29uZmlndXJlIGF0IHRoZSBzY29wZSBjbGFzcyBsZXZlbCAoc3RhdGljIHByb3BlcnR5KSBvciBwYXNzIHRvXG4gKiBGbG93Q2hhcnRFeGVjdXRvciB0byBhcHBseSBhY3Jvc3MgYWxsIHN0YWdlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWRhY3Rpb25Qb2xpY3kge1xuICAvKiogRXhhY3Qga2V5IG5hbWVzIHRvIGFsd2F5cyByZWRhY3QgKGUuZy4gWydzc24nLCAnY3JlZGl0Q2FyZCddKS4gKi9cbiAga2V5cz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogUmVnZXggcGF0dGVybnMg4oCUIGFueSBrZXkgbWF0Y2hpbmcgYSBwYXR0ZXJuIGlzIGF1dG8tcmVkYWN0ZWQuXG4gICAqXG4gICAqIFBhdHRlcm4gbWF0Y2hpbmcgaXMgc2tpcHBlZCBmb3Iga2V5cyB0aGF0IGV4Y2VlZCBhbiBpbnRlcm5hbCBsZW5ndGggY2FwXG4gICAqIChkZXNpZ25lZCB0byBwcmV2ZW50IFJlRG9TIG9uIHBhdGhvbG9naWNhbCBwYXR0ZXJucykuIEZvciB2ZXJ5IGxvbmcga2V5XG4gICAqIG5hbWVzLCB1c2UgYGtleXNgIChleGFjdCBtYXRjaCkgaW5zdGVhZCBvZiBwYXR0ZXJucy5cbiAgICovXG4gIHBhdHRlcm5zPzogUmVnRXhwW107XG4gIC8qKiBGaWVsZC1sZXZlbCByZWRhY3Rpb24gd2l0aGluIG9iamVjdHMg4oCUIGtleSDihpIgYXJyYXkgb2YgZmllbGRzIHRvIHNjcnViLlxuICAgKiAgU3VwcG9ydHMgZG90LW5vdGF0aW9uIGZvciBuZXN0ZWQgcGF0aHMgKGUuZy4gJ2FkZHJlc3MuemlwJykuICovXG4gIGZpZWxkcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcbn1cblxuLyoqXG4gKiBDb21wbGlhbmNlLWZyaWVuZGx5IHJlcG9ydCBvZiB3aGF0IHdhcyByZWRhY3RlZC4gTmV2ZXIgaW5jbHVkZXMgdmFsdWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZGFjdGlvblJlcG9ydCB7XG4gIC8qKiBLZXlzIGZ1bGx5IHJlZGFjdGVkIChleGFjdCBtYXRjaCBvciBwYXR0ZXJuIG1hdGNoKS4gKi9cbiAgcmVkYWN0ZWRLZXlzOiBzdHJpbmdbXTtcbiAgLyoqIEtleXMgd2l0aCBmaWVsZC1sZXZlbCByZWRhY3Rpb24g4oaSIHdoaWNoIGZpZWxkcyB3ZXJlIHNjcnViYmVkLiAqL1xuICBmaWVsZFJlZGFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcbiAgLyoqIFNvdXJjZSBzdHJpbmdzIG9mIHJlZ2lzdGVyZWQgcGF0dGVybnMuICovXG4gIHBhdHRlcm5zOiBzdHJpbmdbXTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUmVjb3JkZXIgSW50ZXJmYWNlXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUGx1Z2dhYmxlIG9ic2VydmVyIGZvciBzY29wZSBvcGVyYXRpb25zLlxuICpcbiAqIEFsbCBtZXRob2RzIGFyZSBvcHRpb25hbCDigJQgaW1wbGVtZW50IG9ubHkgdGhlIGhvb2tzIHlvdSBuZWVkLlxuICogUmVjb3JkZXJzIGFyZSBpbnZva2VkIHN5bmNocm9ub3VzbHkgaW4gYXR0YWNobWVudCBvcmRlci5cbiAqIElmIGEgcmVjb3JkZXIgdGhyb3dzLCB0aGUgZXJyb3IgaXMgY2F1Z2h0IGFuZCBwYXNzZWQgdG8gb25FcnJvclxuICogaG9va3Mgb2Ygb3RoZXIgcmVjb3JkZXJzOyB0aGUgc2NvcGUgb3BlcmF0aW9uIGNvbnRpbnVlcyBub3JtYWxseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNvcmRlciB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIG9uUmVhZD8oZXZlbnQ6IFJlYWRFdmVudCk6IHZvaWQ7XG4gIG9uV3JpdGU/KGV2ZW50OiBXcml0ZUV2ZW50KTogdm9pZDtcbiAgb25Db21taXQ/KGV2ZW50OiBDb21taXRFdmVudCk6IHZvaWQ7XG4gIG9uRXJyb3I/KGV2ZW50OiBFcnJvckV2ZW50KTogdm9pZDtcbiAgb25TdGFnZVN0YXJ0PyhldmVudDogU3RhZ2VFdmVudCk6IHZvaWQ7XG4gIG9uU3RhZ2VFbmQ/KGV2ZW50OiBTdGFnZUV2ZW50KTogdm9pZDtcbiAgb25QYXVzZT8oZXZlbnQ6IFBhdXNlRXZlbnQpOiB2b2lkO1xuICBvblJlc3VtZT8oZXZlbnQ6IFJlc3VtZUV2ZW50KTogdm9pZDtcbiAgLyoqIFJlc2V0IHN0YXRlIGJlZm9yZSBlYWNoIGV4ZWN1dG9yLnJ1bigpIOKAlCBwcmV2ZW50cyBjcm9zcy1ydW4gYWNjdW11bGF0aW9uLiAqL1xuICBjbGVhcj8oKTogdm9pZDtcbiAgLyoqIEV4cG9zZSBjb2xsZWN0ZWQgZGF0YSBmb3IgaW5jbHVzaW9uIGluIGV4ZWN1dG9yLmdldFNuYXBzaG90KCkucmVjb3JkZXJzLiAqL1xuICB0b1NuYXBzaG90PygpOiB7IG5hbWU6IHN0cmluZzsgZGF0YTogdW5rbm93biB9O1xufVxuIl19
package/dist/trace.js ADDED
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ /**
3
+ * footprintjs/trace — Execution tracing, debugging, and backtracking utilities.
4
+ *
5
+ * Runtime stage IDs, commit log queries, and keyed recorder base class.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { parseRuntimeStageId, findLastWriter, KeyedRecorder } from 'footprintjs/trace';
10
+ *
11
+ * // Parse a runtimeStageId
12
+ * const { stageId, executionIndex } = parseRuntimeStageId('call-llm#5');
13
+ *
14
+ * // Backtrack: who wrote 'systemPrompt' before stage at idx 8?
15
+ * const writer = findLastWriter(commitLog, 'systemPrompt', 8);
16
+ *
17
+ * // Build a keyed recorder
18
+ * class MyRecorder extends KeyedRecorder<MyEntry> { ... }
19
+ * ```
20
+ */
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.KeyedRecorder = exports.findLastWriter = exports.findCommits = exports.findCommit = exports.parseRuntimeStageId = exports.createExecutionCounter = exports.buildRuntimeStageId = void 0;
23
+ var runtimeStageId_js_1 = require("./lib/engine/runtimeStageId.js");
24
+ Object.defineProperty(exports, "buildRuntimeStageId", { enumerable: true, get: function () { return runtimeStageId_js_1.buildRuntimeStageId; } });
25
+ Object.defineProperty(exports, "createExecutionCounter", { enumerable: true, get: function () { return runtimeStageId_js_1.createExecutionCounter; } });
26
+ Object.defineProperty(exports, "parseRuntimeStageId", { enumerable: true, get: function () { return runtimeStageId_js_1.parseRuntimeStageId; } });
27
+ // Commit log queries — typed utilities for backtracking
28
+ var commitLogUtils_js_1 = require("./lib/memory/commitLogUtils.js");
29
+ Object.defineProperty(exports, "findCommit", { enumerable: true, get: function () { return commitLogUtils_js_1.findCommit; } });
30
+ Object.defineProperty(exports, "findCommits", { enumerable: true, get: function () { return commitLogUtils_js_1.findCommits; } });
31
+ Object.defineProperty(exports, "findLastWriter", { enumerable: true, get: function () { return commitLogUtils_js_1.findLastWriter; } });
32
+ // KeyedRecorder — base class for Map-based recorders
33
+ var KeyedRecorder_js_1 = require("./lib/recorder/KeyedRecorder.js");
34
+ Object.defineProperty(exports, "KeyedRecorder", { enumerable: true, get: function () { return KeyedRecorder_js_1.KeyedRecorder; } });
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHJhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7OztBQUlILG9FQUFrSDtBQUF6Ryx3SEFBQSxtQkFBbUIsT0FBQTtBQUFFLDJIQUFBLHNCQUFzQixPQUFBO0FBQUUsd0hBQUEsbUJBQW1CLE9BQUE7QUFFekUsd0RBQXdEO0FBQ3hELG9FQUF5RjtBQUFoRiwrR0FBQSxVQUFVLE9BQUE7QUFBRSxnSEFBQSxXQUFXLE9BQUE7QUFBRSxtSEFBQSxjQUFjLE9BQUE7QUFFaEQscURBQXFEO0FBQ3JELG9FQUFnRTtBQUF2RCxpSEFBQSxhQUFhLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGZvb3RwcmludGpzL3RyYWNlIOKAlCBFeGVjdXRpb24gdHJhY2luZywgZGVidWdnaW5nLCBhbmQgYmFja3RyYWNraW5nIHV0aWxpdGllcy5cbiAqXG4gKiBSdW50aW1lIHN0YWdlIElEcywgY29tbWl0IGxvZyBxdWVyaWVzLCBhbmQga2V5ZWQgcmVjb3JkZXIgYmFzZSBjbGFzcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgcGFyc2VSdW50aW1lU3RhZ2VJZCwgZmluZExhc3RXcml0ZXIsIEtleWVkUmVjb3JkZXIgfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG4gKlxuICogLy8gUGFyc2UgYSBydW50aW1lU3RhZ2VJZFxuICogY29uc3QgeyBzdGFnZUlkLCBleGVjdXRpb25JbmRleCB9ID0gcGFyc2VSdW50aW1lU3RhZ2VJZCgnY2FsbC1sbG0jNScpO1xuICpcbiAqIC8vIEJhY2t0cmFjazogd2hvIHdyb3RlICdzeXN0ZW1Qcm9tcHQnIGJlZm9yZSBzdGFnZSBhdCBpZHggOD9cbiAqIGNvbnN0IHdyaXRlciA9IGZpbmRMYXN0V3JpdGVyKGNvbW1pdExvZywgJ3N5c3RlbVByb21wdCcsIDgpO1xuICpcbiAqIC8vIEJ1aWxkIGEga2V5ZWQgcmVjb3JkZXJcbiAqIGNsYXNzIE15UmVjb3JkZXIgZXh0ZW5kcyBLZXllZFJlY29yZGVyPE15RW50cnk+IHsgLi4uIH1cbiAqIGBgYFxuICovXG5cbi8vIFJ1bnRpbWUgc3RhZ2UgSUQg4oCUIHVuaXF1ZSBleGVjdXRpb24gc3RlcCBpZGVudGlmaWVyc1xuZXhwb3J0IHR5cGUgeyBFeGVjdXRpb25Db3VudGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL3J1bnRpbWVTdGFnZUlkLmpzJztcbmV4cG9ydCB7IGJ1aWxkUnVudGltZVN0YWdlSWQsIGNyZWF0ZUV4ZWN1dGlvbkNvdW50ZXIsIHBhcnNlUnVudGltZVN0YWdlSWQgfSBmcm9tICcuL2xpYi9lbmdpbmUvcnVudGltZVN0YWdlSWQuanMnO1xuXG4vLyBDb21taXQgbG9nIHF1ZXJpZXMg4oCUIHR5cGVkIHV0aWxpdGllcyBmb3IgYmFja3RyYWNraW5nXG5leHBvcnQgeyBmaW5kQ29tbWl0LCBmaW5kQ29tbWl0cywgZmluZExhc3RXcml0ZXIgfSBmcm9tICcuL2xpYi9tZW1vcnkvY29tbWl0TG9nVXRpbHMuanMnO1xuXG4vLyBLZXllZFJlY29yZGVyIOKAlCBiYXNlIGNsYXNzIGZvciBNYXAtYmFzZWQgcmVjb3JkZXJzXG5leHBvcnQgeyBLZXllZFJlY29yZGVyIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvS2V5ZWRSZWNvcmRlci5qcyc7XG4iXX0=
@@ -48,3 +48,7 @@ export type { BranchResult, BranchResults, SerializedPipelineStructure as Engine
48
48
  export { NullControlFlowNarrativeGenerator } from './lib/engine/index.js';
49
49
  export type { CallExtractorFn, ExecuteNodeFn, GetStagePathFn, RunStageFn } from './lib/engine/index.js';
50
50
  export { applyOutputMapping, ChildrenExecutor, computeNodeType, ContinuationResolver, createSubflowHandlerDeps, DeciderHandler, DEFAULT_MAX_ITERATIONS, ExtractorRunner, extractParentScopeValues, getInitialScopeValues, NodeResolver, RuntimeStructureManager, seedSubflowGlobalStore, SelectorHandler, StageRunner, SubflowExecutor, } from './lib/engine/index.js';
51
+ export type { ExecutionCounter } from './lib/engine/runtimeStageId.js';
52
+ export { buildRuntimeStageId, createExecutionCounter, parseRuntimeStageId } from './lib/engine/runtimeStageId.js';
53
+ export { findCommit, findCommits, findLastWriter } from './lib/memory/commitLogUtils.js';
54
+ export { KeyedRecorder } from './lib/recorder/KeyedRecorder.js';
@@ -54,6 +54,8 @@ export interface IControlFlowNarrative {
54
54
  export interface TraversalContext {
55
55
  /** Stable stage identifier from the builder (matches spec node id). */
56
56
  readonly stageId: string;
57
+ /** Unique per-execution-step identifier. Format: [subflowPath/]stageId#executionIndex */
58
+ readonly runtimeStageId: string;
57
59
  /** Human-readable stage name. */
58
60
  readonly stageName: string;
59
61
  /** Parent stage ID — walk up to reconstruct the tree. Undefined at root. */
@@ -0,0 +1,47 @@
1
+ /**
2
+ * runtimeStageId — unique identifier for each execution step during traversal.
3
+ *
4
+ * Format: [subflowPath/]stageId#executionIndex
5
+ *
6
+ * Components:
7
+ * stageId — stable node ID from the builder ('call-llm', 'seed')
8
+ * executionIndex — monotonic counter incremented per stage execution (0, 1, 2...)
9
+ * subflowPath — optional path for subflow stages ('sf-tools', 'sf-outer/sf-inner')
10
+ *
11
+ * Properties:
12
+ * - Unique within a run (executionIndex never repeats)
13
+ * - Execution-ordered (sort by executionIndex = execution order)
14
+ * - Human-readable ('sf-tools/execute-tool-calls#8')
15
+ * - Parseable (split on '#' for stageId and index, split stageId on '/' for subflow path)
16
+ *
17
+ * @example
18
+ * ```
19
+ * buildRuntimeStageId('call-llm', 5) // 'call-llm#5'
20
+ * buildRuntimeStageId('execute-tool-calls', 8, 'sf-tools') // 'sf-tools/execute-tool-calls#8'
21
+ * buildRuntimeStageId('validate', 3, 'sf-outer/sf-inner') // 'sf-outer/sf-inner/validate#3'
22
+ * ```
23
+ */
24
+ /**
25
+ * Build a runtimeStageId from its components.
26
+ *
27
+ * Note: The traverser does NOT use the subflowPath parameter — node.id already
28
+ * includes the subflow prefix from the builder. This parameter exists for external
29
+ * consumers constructing IDs from parsed components (round-trip via parseRuntimeStageId).
30
+ */
31
+ export declare function buildRuntimeStageId(stageId: string, executionIndex: number, subflowPath?: string): string;
32
+ /** Parse a runtimeStageId into its components. */
33
+ export declare function parseRuntimeStageId(runtimeStageId: string): {
34
+ stageId: string;
35
+ executionIndex: number;
36
+ subflowPath: string | undefined;
37
+ };
38
+ /**
39
+ * Shared mutable counter for execution index.
40
+ * Passed by reference to child traversers (subflows) so they
41
+ * continue the global numbering instead of restarting at 0.
42
+ */
43
+ export interface ExecutionCounter {
44
+ value: number;
45
+ }
46
+ /** Create a new execution counter starting at 0. */
47
+ export declare function createExecutionCounter(): ExecutionCounter;
@@ -61,6 +61,10 @@ export interface TraverserOptions<TOut = any, TScope = any> {
61
61
  * Propagated to TraversalContext so narrative entries carry the correct subflowId.
62
62
  */
63
63
  parentSubflowId?: string;
64
+ /** Shared execution counter from parent traverser. Subflows continue the parent's numbering. */
65
+ executionCounter?: {
66
+ value: number;
67
+ };
64
68
  }
65
69
  export declare class FlowchartTraverser<TOut = any, TScope = any> {
66
70
  private readonly root;
@@ -95,6 +99,11 @@ export declare class FlowchartTraverser<TOut = any, TScope = any> {
95
99
  * Prevents call-stack overflow on infinite loops or excessively deep stage chains.
96
100
  */
97
101
  private _executeDepth;
102
+ /**
103
+ * Shared mutable execution counter — monotonic, incremented per stage execution.
104
+ * Shared with child traversers (subflows) so indices are globally unique within a run.
105
+ */
106
+ private readonly _executionCounter;
98
107
  /**
99
108
  * Per-instance maximum depth (set from TraverserOptions.maxDepth or the class default).
100
109
  */
@@ -19,6 +19,8 @@ export declare class StageContext {
19
19
  stageName: string;
20
20
  /** Unique stage identifier from the builder (matches spec node id). */
21
21
  stageId: string;
22
+ /** Unique per-execution-step identifier. Set by traverser before stage execution. */
23
+ runtimeStageId: string;
22
24
  runId: string;
23
25
  branchId?: string;
24
26
  isDecider: boolean;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Typed utilities for querying the commit log.
3
+ *
4
+ * The commitLog is an ordered array of CommitBundle — one per stage commit.
5
+ * These helpers provide type-safe queries without (b: any) casts.
6
+ */
7
+ import type { CommitBundle } from './types.js';
8
+ /** Find the first commit by stageId, optionally filtering by a written key. */
9
+ export declare function findCommit(commitLog: CommitBundle[], stageId: string, key?: string): CommitBundle | undefined;
10
+ /** Find all commits by stageId. */
11
+ export declare function findCommits(commitLog: CommitBundle[], stageId: string): CommitBundle[];
12
+ /** Find the last commit that wrote a specific key (for backtracking). */
13
+ export declare function findLastWriter(commitLog: CommitBundle[], key: string, beforeIdx?: number): CommitBundle | undefined;
@@ -22,6 +22,8 @@ export interface CommitBundle {
22
22
  stage: string;
23
23
  /** Stable stage identifier (matches spec node id). */
24
24
  stageId: string;
25
+ /** Unique per-execution-step identifier. Format: [subflowPath/]stageId#executionIndex */
26
+ runtimeStageId: string;
25
27
  /** Chronological write log for deterministic replay. */
26
28
  trace: TraceEntry[];
27
29
  /** Paths that should be redacted in UI (sensitive data). */
@@ -0,0 +1,33 @@
1
+ /**
2
+ * KeyedRecorder<T> — base class for Map-based recorders keyed by runtimeStageId.
3
+ *
4
+ * Provides typed key-value storage with O(1) lookup, insertion-ordered iteration,
5
+ * and common accessors. Recorder implementations extend this and call store()
6
+ * from their event hooks.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * class TokenRecorder extends KeyedRecorder<LLMCallEntry> {
11
+ * onLLMCall(event: LLMCallEvent) {
12
+ * this.store(event.runtimeStageId, { model: event.model, ... });
13
+ * }
14
+ * getStats() { return aggregate(this.values()); }
15
+ * }
16
+ * ```
17
+ */
18
+ export declare abstract class KeyedRecorder<T> {
19
+ abstract readonly id: string;
20
+ private readonly data;
21
+ /** Store an entry keyed by runtimeStageId. */
22
+ protected store(runtimeStageId: string, entry: T): void;
23
+ /** O(1) lookup by runtimeStageId. */
24
+ getByKey(runtimeStageId: string): T | undefined;
25
+ /** All entries as a read-only Map (insertion-ordered). */
26
+ getMap(): ReadonlyMap<string, T>;
27
+ /** All entries as an array (insertion-ordered). */
28
+ values(): T[];
29
+ /** Number of entries stored. */
30
+ get size(): number;
31
+ /** Clear all stored data. Called by executor before each run(). */
32
+ clear(): void;
33
+ }
@@ -1,2 +1,3 @@
1
1
  export type { CompositeSnapshot } from './CompositeRecorder.js';
2
2
  export { CompositeRecorder } from './CompositeRecorder.js';
3
+ export { KeyedRecorder } from './KeyedRecorder.js';
@@ -81,6 +81,8 @@ export interface FlowChartExecutorOptions<TScope = any> {
81
81
  }
82
82
  export declare class FlowChartExecutor<TOut = any, TScope = any> {
83
83
  private traverser;
84
+ /** Shared execution counter — survives pause/resume. Reset on fresh run(). */
85
+ private _executionCounter;
84
86
  private narrativeEnabled;
85
87
  private narrativeOptions?;
86
88
  private combinedRecorder;
@@ -9,6 +9,8 @@ export interface RecorderContext {
9
9
  stageName: string;
10
10
  /** Stable stage identifier (matches spec node id). */
11
11
  stageId: string;
12
+ /** Unique per-execution-step identifier. Format: [subflowPath/]stageId#executionIndex */
13
+ runtimeStageId: string;
12
14
  pipelineId: string;
13
15
  timestamp: number;
14
16
  }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * footprintjs/trace — Execution tracing, debugging, and backtracking utilities.
3
+ *
4
+ * Runtime stage IDs, commit log queries, and keyed recorder base class.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import { parseRuntimeStageId, findLastWriter, KeyedRecorder } from 'footprintjs/trace';
9
+ *
10
+ * // Parse a runtimeStageId
11
+ * const { stageId, executionIndex } = parseRuntimeStageId('call-llm#5');
12
+ *
13
+ * // Backtrack: who wrote 'systemPrompt' before stage at idx 8?
14
+ * const writer = findLastWriter(commitLog, 'systemPrompt', 8);
15
+ *
16
+ * // Build a keyed recorder
17
+ * class MyRecorder extends KeyedRecorder<MyEntry> { ... }
18
+ * ```
19
+ */
20
+ export type { ExecutionCounter } from './lib/engine/runtimeStageId.js';
21
+ export { buildRuntimeStageId, createExecutionCounter, parseRuntimeStageId } from './lib/engine/runtimeStageId.js';
22
+ export { findCommit, findCommits, findLastWriter } from './lib/memory/commitLogUtils.js';
23
+ export { KeyedRecorder } from './lib/recorder/KeyedRecorder.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "footprintjs",
3
- "version": "4.5.0",
3
+ "version": "4.7.0",
4
4
  "description": "Explainable backend flows — automatic causal traces, decision evidence, and MCP tool generation for AI agents",
5
5
  "license": "MIT",
6
6
  "author": "Sanjay Krishna Anbalagan",
@@ -82,6 +82,11 @@
82
82
  "types": "./dist/types/recorders.d.ts",
83
83
  "import": "./dist/esm/recorders.js",
84
84
  "require": "./dist/recorders.js"
85
+ },
86
+ "./trace": {
87
+ "types": "./dist/types/trace.d.ts",
88
+ "import": "./dist/esm/trace.js",
89
+ "require": "./dist/trace.js"
85
90
  }
86
91
  },
87
92
  "lint-staged": {