footprintjs 4.17.2 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +39 -1
- package/dist/advanced.js +1 -1
- package/dist/esm/advanced.js +1 -1
- package/dist/esm/index.js +3 -3
- package/dist/esm/lib/builder/FlowChartBuilder.js +32 -7
- package/dist/esm/lib/decide/decide.js +9 -9
- package/dist/esm/lib/decide/evidence.js +2 -2
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +3 -3
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +3 -3
- package/dist/esm/lib/engine/narrative/types.js +1 -1
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +20 -3
- package/dist/esm/lib/memory/StageContext.js +3 -3
- package/dist/esm/lib/memory/backtrack.js +1 -1
- package/dist/esm/lib/reactive/createTypedScope.js +5 -5
- package/dist/esm/lib/reactive/types.js +7 -7
- package/dist/esm/lib/recorder/BoundaryStateStore.js +167 -0
- package/dist/esm/lib/recorder/BoundaryStateTracker.js +4 -4
- package/dist/esm/lib/recorder/CombinedRecorder.js +9 -9
- package/dist/esm/lib/recorder/CommitRangeIndex.js +207 -0
- package/dist/esm/lib/recorder/CompositeRecorder.js +6 -6
- package/dist/esm/lib/recorder/EmitRecorder.js +3 -3
- package/dist/esm/lib/recorder/InOutRecorder.js +1 -1
- package/dist/esm/lib/recorder/KeyedStore.js +113 -0
- package/dist/esm/lib/recorder/QualityRecorder.js +2 -2
- package/dist/esm/lib/recorder/SequenceRecorder.js +2 -2
- package/dist/esm/lib/recorder/SequenceStore.js +195 -0
- package/dist/esm/lib/recorder/TopologyRecorder.js +1 -1
- package/dist/esm/lib/recorder/index.js +13 -3
- package/dist/esm/lib/runner/ExecutionRuntime.js +1 -1
- package/dist/esm/lib/runner/FlowChartExecutor.js +72 -28
- package/dist/esm/lib/runner/RunContext.js +2 -2
- package/dist/esm/lib/runner/RunnableChart.js +1 -1
- package/dist/esm/lib/runner/runId.js +65 -0
- package/dist/esm/lib/scope/ScopeFacade.js +6 -6
- package/dist/esm/lib/scope/index.js +1 -1
- package/dist/esm/lib/scope/recorders/DebugRecorder.js +4 -4
- package/dist/esm/lib/scope/recorders/MetricRecorder.js +2 -2
- package/dist/esm/lib/scope/recorders/index.js +1 -1
- package/dist/esm/lib/scope/types.js +1 -1
- package/dist/esm/recorders.js +1 -1
- package/dist/esm/trace.js +13 -1
- package/dist/index.js +3 -3
- package/dist/lib/builder/FlowChartBuilder.js +32 -7
- package/dist/lib/decide/decide.js +9 -9
- package/dist/lib/decide/evidence.js +2 -2
- package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +3 -3
- package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +3 -3
- package/dist/lib/engine/narrative/types.js +1 -1
- package/dist/lib/engine/traversal/FlowchartTraverser.js +20 -3
- package/dist/lib/memory/StageContext.js +3 -3
- package/dist/lib/memory/backtrack.js +1 -1
- package/dist/lib/reactive/createTypedScope.js +5 -5
- package/dist/lib/reactive/types.js +7 -7
- package/dist/lib/recorder/BoundaryStateStore.js +171 -0
- package/dist/lib/recorder/BoundaryStateTracker.js +4 -4
- package/dist/lib/recorder/CombinedRecorder.js +9 -9
- package/dist/lib/recorder/CommitRangeIndex.js +211 -0
- package/dist/lib/recorder/CompositeRecorder.js +6 -6
- package/dist/lib/recorder/EmitRecorder.js +3 -3
- package/dist/lib/recorder/InOutRecorder.js +1 -1
- package/dist/lib/recorder/KeyedStore.js +117 -0
- package/dist/lib/recorder/QualityRecorder.js +2 -2
- package/dist/lib/recorder/SequenceRecorder.js +2 -2
- package/dist/lib/recorder/SequenceStore.js +199 -0
- package/dist/lib/recorder/TopologyRecorder.js +1 -1
- package/dist/lib/recorder/index.js +19 -6
- package/dist/lib/runner/ExecutionRuntime.js +1 -1
- package/dist/lib/runner/FlowChartExecutor.js +72 -28
- package/dist/lib/runner/RunContext.js +2 -2
- package/dist/lib/runner/RunnableChart.js +1 -1
- package/dist/lib/runner/runId.js +70 -0
- package/dist/lib/scope/ScopeFacade.js +6 -6
- package/dist/lib/scope/index.js +1 -1
- package/dist/lib/scope/recorders/DebugRecorder.js +4 -4
- package/dist/lib/scope/recorders/MetricRecorder.js +2 -2
- package/dist/lib/scope/recorders/index.js +1 -1
- package/dist/lib/scope/types.js +1 -1
- package/dist/recorders.js +1 -1
- package/dist/trace.js +18 -2
- package/dist/types/index.d.ts +4 -4
- package/dist/types/lib/decide/evidence.d.ts +3 -3
- package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +1 -1
- package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +2 -2
- package/dist/types/lib/engine/narrative/types.d.ts +19 -2
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +11 -0
- package/dist/types/lib/memory/StageContext.d.ts +2 -2
- package/dist/types/lib/memory/backtrack.d.ts +1 -1
- package/dist/types/lib/reactive/types.d.ts +7 -7
- package/dist/types/lib/recorder/BoundaryStateStore.d.ts +115 -0
- package/dist/types/lib/recorder/BoundaryStateTracker.d.ts +3 -3
- package/dist/types/lib/recorder/CombinedRecorder.d.ts +11 -11
- package/dist/types/lib/recorder/CommitRangeIndex.d.ts +147 -0
- package/dist/types/lib/recorder/CompositeRecorder.d.ts +8 -8
- package/dist/types/lib/recorder/EmitRecorder.d.ts +2 -2
- package/dist/types/lib/recorder/InOutRecorder.d.ts +1 -1
- package/dist/types/lib/recorder/KeyedStore.d.ts +70 -0
- package/dist/types/lib/recorder/QualityRecorder.d.ts +4 -4
- package/dist/types/lib/recorder/SequenceRecorder.d.ts +1 -1
- package/dist/types/lib/recorder/SequenceStore.d.ts +120 -0
- package/dist/types/lib/recorder/TopologyRecorder.d.ts +1 -1
- package/dist/types/lib/recorder/index.d.ts +5 -2
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +1 -1
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +36 -14
- package/dist/types/lib/runner/RunContext.d.ts +2 -2
- package/dist/types/lib/runner/RunnableChart.d.ts +2 -2
- package/dist/types/lib/runner/runId.d.ts +45 -0
- package/dist/types/lib/scope/ScopeFacade.d.ts +4 -4
- package/dist/types/lib/scope/index.d.ts +1 -1
- package/dist/types/lib/scope/recorders/DebugRecorder.d.ts +4 -4
- package/dist/types/lib/scope/recorders/MetricRecorder.d.ts +4 -4
- package/dist/types/lib/scope/recorders/index.d.ts +1 -1
- package/dist/types/lib/scope/types.d.ts +1 -1
- package/dist/types/recorders.d.ts +1 -1
- package/dist/types/trace.d.ts +5 -0
- package/package.json +1 -1
|
@@ -22,9 +22,9 @@ export const SCOPE_METHOD_NAMES = new Set([
|
|
|
22
22
|
'$error',
|
|
23
23
|
'$metric',
|
|
24
24
|
'$eval',
|
|
25
|
-
'$
|
|
26
|
-
'$
|
|
27
|
-
'$
|
|
25
|
+
'$attachScopeRecorder',
|
|
26
|
+
'$detachScopeRecorder',
|
|
27
|
+
'$getScopeRecorders',
|
|
28
28
|
'$batchArray',
|
|
29
29
|
'$break',
|
|
30
30
|
'$emit',
|
|
@@ -48,10 +48,10 @@ export const EXECUTOR_INTERNAL_METHODS = new Set([
|
|
|
48
48
|
'notifyStageStart', // StageRunner.run() line 59
|
|
49
49
|
'notifyStageEnd', // StageRunner.run() line 79
|
|
50
50
|
'notifyPause', // StageRunner.run() — pause detection
|
|
51
|
-
'
|
|
52
|
-
'
|
|
53
|
-
'
|
|
51
|
+
'attachScopeRecorder', // FlowChartExecutor.createTraverser() — narrative + user recorders
|
|
52
|
+
'detachScopeRecorder', // FlowChartExecutor.detachScopeRecorder()
|
|
53
|
+
'getScopeRecorders', // FlowChartExecutor.getScopeRecorders()
|
|
54
54
|
'useSharedRedactedKeys', // FlowChartExecutor.createTraverser() — redaction wrapping
|
|
55
55
|
'useRedactionPolicy', // FlowChartExecutor.createTraverser() — redaction wrapping
|
|
56
56
|
]);
|
|
57
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlYWN0aXZlL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBMFBILCtFQUErRTtBQUMvRSx1RUFBdUU7QUFFdkUsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQVM7SUFDaEQsV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsU0FBUztJQUNULE9BQU87SUFDUCxVQUFVO0lBQ1YsU0FBUztJQUNULFFBQVE7SUFDUixNQUFNO0lBQ04sUUFBUTtJQUNSLFNBQVM7SUFDVCxPQUFPO0lBQ1AsaUJBQWlCO0lBQ2pCLGlCQUFpQjtJQUNqQixlQUFlO0lBQ2YsYUFBYTtJQUNiLFFBQVE7SUFDUixPQUFPO0lBQ1AscUJBQXFCO0lBQ3JCLGtCQUFrQjtJQUNsQixRQUFRO0NBQ1QsQ0FBQyxDQUFDO0FBRUgsK0VBQStFO0FBQy9FLGdFQUFnRTtBQUNoRSxxRUFBcUU7QUFFckUsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0FBRWxFLCtFQUErRTtBQUMvRSw2RUFBNkU7QUFDN0UsK0NBQStDO0FBRS9DLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsaUNBQWlDLENBQUMsQ0FBQztBQUV4RSwrRUFBK0U7QUFDL0UsZ0ZBQWdGO0FBQ2hGLDBFQUEwRTtBQUMxRSwwRUFBMEU7QUFFMUUsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDL0Msa0JBQWtCLEVBQUUsNEJBQTRCO0lBQ2hELGdCQUFnQixFQUFFLDRCQUE0QjtJQUM5QyxhQUFhLEVBQUUsc0NBQXNDO0lBQ3JELGdCQUFnQixFQUFFLG1FQUFtRTtJQUNyRixnQkFBZ0IsRUFBRSxxQ0FBcUM7SUFDdkQsY0FBYyxFQUFFLG1DQUFtQztJQUNuRCx1QkFBdUIsRUFBRSwyREFBMkQ7SUFDcEYsb0JBQW9CLEVBQUUsMkRBQTJEO0NBQ2xGLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcmVhY3RpdmUvdHlwZXMgLS0gVHlwZSBkZWZpbml0aW9ucyBmb3IgdGhlIFR5cGVkU2NvcGU8VD4gcmVhY3RpdmUgcHJveHkgc3lzdGVtLlxuICpcbiAqIFR5cGVkU2NvcGU8VD4gd3JhcHMgYSBSZWFjdGl2ZVRhcmdldCAoU2NvcGVGYWNhZGUpIGluIGEgUHJveHkgdGhhdCBwcm92aWRlc1xuICogdHlwZWQgcHJvcGVydHkgYWNjZXNzLiBBbGwgc2NvcGUgaW5mcmFzdHJ1Y3R1cmUgbWV0aG9kcyBhcmUgJC1wcmVmaXhlZCB0b1xuICogYXZvaWQgY29sbGlzaW9ucyB3aXRoIHVzZXIgc3RhdGUga2V5cy5cbiAqXG4gKiBEZXBlbmRlbmN5OiB0eXBlLW9ubHkgaW1wb3J0cyBmcm9tIGVuZ2luZS8gYW5kIHNjb3BlLyAoemVybyBydW50aW1lIGNvc3QpLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uRW52IH0gZnJvbSAnLi4vZW5naW5lL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgUmVjb3JkZXIgfSBmcm9tICcuLi9zY29wZS90eXBlcy5qcyc7XG5cbi8vIC0tIFJlYWN0aXZlVGFyZ2V0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE1pbmltdW0gcHJvdG9jb2wgcmVxdWlyZWQgYnkgVHlwZWRTY29wZSAtLSBhIGN1cmF0ZWQgc3Vic2V0IG9mIFNjb3BlRmFjYWRlJ3Ncbi8vIHB1YmxpYyBBUEkuIE5vdCBhIGZ1bGwgbWlycm9yOiBleGNsdWRlcyBpbnRlcm5hbC9yZWRhY3Rpb24gbWV0aG9kcyB0aGF0IGFyZVxuLy8gaGFuZGxlZCBhdCB0aGUgZXhlY3V0b3IgbGV2ZWwgKHVzZVJlZGFjdGlvblBvbGljeSwgdXNlU2hhcmVkUmVkYWN0ZWRLZXlzLCBldGMuKVxuLy8gYW5kIGluZnJhc3RydWN0dXJlIG1ldGhvZHMgKGdldFBpcGVsaW5lSWQsIHNldEdsb2JhbCwgZ2V0R2xvYmFsLCBldGMuKS5cblxuZXhwb3J0IGludGVyZmFjZSBSZWFjdGl2ZVRhcmdldCB7XG4gIC8vIFN0YXRlIGFjY2VzcyAodHJhY2tlZCBieSByZWNvcmRlcnMpXG4gIGdldFZhbHVlKGtleT86IHN0cmluZyk6IHVua25vd247XG4gIHNldFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgc2hvdWxkUmVkYWN0PzogYm9vbGVhbiwgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiB2b2lkO1xuICB1cGRhdGVWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdm9pZDtcbiAgZGVsZXRlVmFsdWUoa2V5OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdm9pZDtcblxuICAvLyBOb24tdHJhY2tpbmcgc3RhdGUgaW5zcGVjdGlvbiAoZm9yIHByb3h5IGludGVybmFscyDigJQgbm8gcmVjb3JkZXIgZGlzcGF0Y2gpXG4gIC8qKiBSZXR1cm5zIGFsbCBzdGF0ZSBrZXlzIHdpdGhvdXQgZmlyaW5nIG9uUmVhZC4gVXNlZCBieSBvd25LZXlzL2hhcyB0cmFwcy4gKi9cbiAgZ2V0U3RhdGVLZXlzPygpOiBzdHJpbmdbXTtcbiAgLyoqIENoZWNrIGtleSBleGlzdGVuY2Ugd2l0aG91dCBmaXJpbmcgb25SZWFkLiBVc2VkIGJ5IGhhcyB0cmFwLiAqL1xuICBoYXNLZXk/KGtleTogc3RyaW5nKTogYm9vbGVhbjtcbiAgLyoqIFJlYWQgc3RhdGUgd2l0aG91dCBmaXJpbmcgb25SZWFkLiBVc2VkIGJ5IGFycmF5IHByb3h5IGdldEN1cnJlbnQoKS4gKi9cbiAgZ2V0VmFsdWVTaWxlbnQ/KGtleT86IHN0cmluZyk6IHVua25vd247XG5cbiAgLy8gSW5wdXQgJiBlbnZpcm9ubWVudCAocmVhZG9ubHksIE5PVCB0cmFja2VkKVxuICBnZXRBcmdzPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTogVDtcbiAgZ2V0RW52KCk6IFJlYWRvbmx5PEV4ZWN1dGlvbkVudj47XG5cbiAgLy8gUmVjb3JkZXIgbWFuYWdlbWVudFxuICBhdHRhY2hSZWNvcmRlcihyZWNvcmRlcjogUmVjb3JkZXIpOiB2b2lkO1xuICBkZXRhY2hSZWNvcmRlcihyZWNvcmRlcklkOiBzdHJpbmcpOiB2b2lkO1xuICBnZXRSZWNvcmRlcnMoKTogUmVjb3JkZXJbXTtcblxuICAvLyBEaWFnbm9zdGljc1xuICBhZGREZWJ1Z0luZm8oa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgYWRkRGVidWdNZXNzYWdlKHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgYWRkRXJyb3JJbmZvKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG4gIGFkZE1ldHJpYyhuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgYWRkRXZhbChuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcblxuICAvLyBFbWl0IGNoYW5uZWwgKFBoYXNlIDMpIOKAlCBzdHJ1Y3R1cmVkIHVzZXItYXV0aG9yZWQgZXZlbnRzIHRvIEVtaXRSZWNvcmRlcnMuXG4gIGVtaXRFdmVudChuYW1lOiBzdHJpbmcsIHBheWxvYWQ/OiB1bmtub3duKTogdm9pZDtcblxuICAvLyBEZXRhY2ggKFQ0KSDigJQgZmlyZS1hbmQtZm9yZ2V0IGNoaWxkIGZsb3djaGFydHMuIFNjb3BlRmFjYWRlXG4gIC8vIGRlbGVnYXRlcyB0byBgZGV0YWNoL3NwYXduYCwgbWludGluZyByZWZJZHMgZnJvbSB0aGlzIHN0YWdlJ3NcbiAgLy8gcnVudGltZVN0YWdlSWQgZm9yIGRpYWdub3N0aWMgY29ycmVsYXRpb24uXG4gIGRldGFjaEFuZEpvaW5MYXRlcihcbiAgICBkcml2ZXI6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoRHJpdmVyLFxuICAgIGNoaWxkOiBpbXBvcnQoJy4uL2J1aWxkZXIvdHlwZXMuanMnKS5GbG93Q2hhcnQsXG4gICAgaW5wdXQ/OiB1bmtub3duLFxuICApOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaEhhbmRsZTtcblxuICBkZXRhY2hBbmRGb3JnZXQoXG4gICAgZHJpdmVyOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaERyaXZlcixcbiAgICBjaGlsZDogaW1wb3J0KCcuLi9idWlsZGVyL3R5cGVzLmpzJykuRmxvd0NoYXJ0LFxuICAgIGlucHV0PzogdW5rbm93bixcbiAgKTogdm9pZDtcbn1cblxuLy8gLS0gU2NvcGVNZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gJC1wcmVmaXhlZCBlc2NhcGUgaGF0Y2hlcy4gTm9uLWVudW1lcmFibGUgb24gdGhlIHByb3h5IC0tIGRvbid0IGFwcGVhciBpblxuLy8gT2JqZWN0LmtleXMoKSwgZGVzdHJ1Y3R1cmluZywgb3IgZm9yLi4uaW4uIE9ubHkgc3RhdGUga2V5cyBhcmUgdmlzaWJsZS5cblxuZXhwb3J0IGludGVyZmFjZSBTY29wZU1ldGhvZHMge1xuICAvLyBTdGF0ZSAodW50eXBlZCBlc2NhcGUgaGF0Y2ggLS0gZm9yIGR5bmFtaWMga2V5cywgcmVkYWN0aW9uLCBkZXNjcmlwdGlvbilcbiAgJGdldFZhbHVlKGtleTogc3RyaW5nKTogdW5rbm93bjtcbiAgJHNldFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgc2hvdWxkUmVkYWN0PzogYm9vbGVhbiwgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiB2b2lkO1xuICAkdXBkYXRlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiB2b2lkO1xuICAkZGVsZXRlKGtleTogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IHZvaWQ7XG4gIC8qKiBQcm94eS1zeW50aGVzaXplZDogY2FsbHMgZ2V0VmFsdWUocm9vdEtleSkgdGhlbiBsb2Rhc2guZ2V0IGZvciBuZXN0ZWQgcGF0aC4gTm90IGEgZGlyZWN0IGRlbGVnYXRpb24uICovXG4gICRyZWFkKGRvdFBhdGg6IHN0cmluZyk6IHVua25vd247XG5cbiAgLy8gSW5wdXQgJiBlbnZpcm9ubWVudCAocmVhZG9ubHkpXG4gICRnZXRBcmdzPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTogVDtcbiAgJGdldEVudigpOiBSZWFkb25seTxFeGVjdXRpb25FbnY+O1xuXG4gIC8vIE9ic2VydmFiaWxpdHkg4oCUIGxlZ2FjeSBkaWFnbm9zdGljIHByaW1pdGl2ZXMuXG4gIC8vXG4gIC8vIEFzIG9mIFBoYXNlIDMgdGhlc2UgQUxTTyBkaXNwYXRjaCBvbiB0aGUgZW1pdCBjaGFubmVsIChpbiBhZGRpdGlvbiB0b1xuICAvLyB0aGVpciBleGlzdGluZyBgRGlhZ25vc3RpY0NvbGxlY3RvcmAgc2lkZS1iYWcgd3JpdGVzIGZvciBzbmFwc2hvdFxuICAvLyBpbmNsdXNpb24pLiBBbnkgYXR0YWNoZWQgYEVtaXRSZWNvcmRlcmAgd2lsbCBzZWUgdGhlc2UgZXZlbnRzIHdpdGhcbiAgLy8gdGhlIGNvcnJlc3BvbmRpbmcgbmFtZXNwYWNlZCBuYW1lczpcbiAgLy9cbiAgLy8gICAkZGVidWcoa2V5LCB2YWx1ZSkgICAgLT4gZW1pdHMgYGxvZy5kZWJ1Zy4ke2tleX1gXG4gIC8vICAgJGVycm9yKGtleSwgdmFsdWUpICAgIC0+IGVtaXRzIGBsb2cuZXJyb3IuJHtrZXl9YFxuICAvLyAgICRtZXRyaWMobmFtZSwgdmFsdWUpICAtPiBlbWl0cyBgbWV0cmljLiR7bmFtZX1gXG4gIC8vICAgJGV2YWwgKG5hbWUsIHZhbHVlKSAgIC0+IGVtaXRzIGBldmFsLiR7bmFtZX1gXG4gIC8vICAgJGxvZyh2YWx1ZSkgICAgICAgICAgIC0+IGVtaXRzIGBsb2cuZGVidWcubWVzc2FnZXNgXG4gIC8vXG4gIC8vIFRoaXMgbWFrZXMgdGhlIGNhbGxzIG9ic2VydmFibGUgaW4gcmVhbCB0aW1lIOKAlCBubyBsb3NzIG9mIGJhY2t3YXJkXG4gIC8vIGNvbXBhdDsgdGhlIHNpZGUgYmFnIGNvbnRpbnVlcyB0byBwb3B1bGF0ZSBmb3IgY29uc3VtZXJzIHRoYXQgaW5zcGVjdFxuICAvLyB0aGUgc25hcHNob3QgZGlyZWN0bHkuXG4gICRkZWJ1ZyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkO1xuICAkbG9nKHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgJGVycm9yKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG4gICRtZXRyaWMobmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG4gICRldmFsKG5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkO1xuXG4gIC8vIFJlY29yZGVyIG1hbmFnZW1lbnRcbiAgJGF0dGFjaFJlY29yZGVyKHJlY29yZGVyOiBSZWNvcmRlcik6IHZvaWQ7XG4gICRkZXRhY2hSZWNvcmRlcihyZWNvcmRlcklkOiBzdHJpbmcpOiB2b2lkO1xuICAkZ2V0UmVjb3JkZXJzKCk6IFJlY29yZGVyW107XG5cbiAgLyoqXG4gICAqIEJhdGNoLW11dGF0ZSBhbiBhcnJheSBrZXkgaW4gYSBzaW5nbGUgY2xvbmUrd3JpdGUgY3ljbGUuXG4gICAqXG4gICAqIEV2ZXJ5IGBzY29wZS5pdGVtcy5wdXNoKHgpYCBjbG9uZXMgdGhlIGVudGlyZSBhcnJheSBhbmQgY29tbWl0cyBpdCDigJQgTyhOKSBwZXIgY2FsbC5cbiAgICogRm9yIE4gbXV0YXRpb25zIG9uIGFuIE0tbGVuZ3RoIGFycmF5IHRoYXQgaXMgTyhOw5dNKS4gVXNlIGAkYmF0Y2hBcnJheWAgdG8gY2xvbmUgb25jZSxcbiAgICogYXBwbHkgYWxsIG11dGF0aW9ucyBpbnNpZGUgYGZuYCwgdGhlbiBjb21taXQgb25jZSDigJQgTyhNKSB0b3RhbC5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBCZWZvcmU6IDEwMDAgY2xvbmVzIMOXIGdyb3dpbmcgYXJyYXkgPSBPKE7CsilcbiAgICogZm9yIChsZXQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHNjb3BlLml0ZW1zLnB1c2goaSk7XG4gICAqXG4gICAqIC8vIEFmdGVyOiAxIGNsb25lICsgMSBjb21taXQgPSBPKE4pXG4gICAqIHNjb3BlLiRiYXRjaEFycmF5KCdpdGVtcycsIChhcnIpID0+IHtcbiAgICogICBmb3IgKGxldCBpID0gMDsgaSA8IDEwMDA7IGkrKykgYXJyLnB1c2goaSk7XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogYGZuYCByZWNlaXZlcyBhIHBsYWluIChub24tcHJveHkpIG11dGFibGUgKipzaGFsbG93IGNvcHkqKiBvZiB0aGUgY3VycmVudCBhcnJheS5cbiAgICogVGhlIGFycmF5IGl0c2VsZiBpcyBhIG5ldyBpbnN0YW5jZSwgYnV0IG9iamVjdCByZWZlcmVuY2VzIGluc2lkZSBpdCBhcmUgc2hhcmVkIHdpdGhcbiAgICogdGhlIG9yaWdpbmFsIHN0YXRlIOKAlCBtdXRhdGlvbnMgdG8gbmVzdGVkIG9iamVjdHMgaW5zaWRlIGBmbmAgYWZmZWN0IHRob3NlIG9yaWdpbmFscy5cbiAgICogT25seSBwdXNoL3BvcC9zb3J0L3NwbGljZSBhbmQgb3RoZXIgb3BlcmF0aW9ucyB0aGF0IGNoYW5nZSB0aGUgYXJyYXkncyBvd24gc2xvdHMgYXJlXG4gICAqIHNhZmVseSBpc29sYXRlZC5cbiAgICpcbiAgICogTXV0YXRpb25zIGluc2lkZSBgZm5gIGFyZSBOT1QgdHJhY2tlZCBpbmRpdmlkdWFsbHkg4oCUIG9ubHkgdGhlIGZpbmFsIGNvbW1pdHRlZCBhcnJheVxuICAgKiBhcHBlYXJzIGluIHRoZSBuYXJyYXRpdmUgYXMgYSBzaW5nbGUgd3JpdGUuIElmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGFuXG4gICAqIGFycmF5LCBgZm5gIHJlY2VpdmVzIGFuIGVtcHR5IGFycmF5IGFuZCB0aGUgcmVzdWx0IGlzIGNvbW1pdHRlZCBhcyB0aGUgbmV3IHZhbHVlLlxuICAgKlxuICAgKiBJZiBgZm5gIHRocm93cywgYHNldFZhbHVlYCBpcyBuZXZlciBjYWxsZWQgYW5kIHN0YXRlIHJlbWFpbnMgdW5jaGFuZ2VkIChhdG9taWMgb25cbiAgICogZXJyb3IpLiBUaGUgZXhjZXB0aW9uIHByb3BhZ2F0ZXMgdG8gdGhlIGNhbGxlci5cbiAgICpcbiAgICogYGtleWAgaXMgdW50eXBlZCAoYHN0cmluZ2ApIOKAlCBUeXBlU2NyaXB0IHdpbGwgbm90IGNhdGNoIHR5cG9zLiBgYXJyYCBpcyB0eXBlZCBhc1xuICAgKiBgdW5rbm93bltdYCBiZWNhdXNlIGBTY29wZU1ldGhvZHNgIGlzIG5vdCBwYXJhbWV0ZXJpemVkIGJ5IGBUYDsgY2FzdCBpbnNpZGUgYGZuYFxuICAgKiB3aGVuIGVsZW1lbnQgdHlwZXMgYXJlIGtub3duOiBgKGFyciBhcyBzdHJpbmdbXSkucHVzaCh4KWAuXG4gICAqL1xuICAkYmF0Y2hBcnJheShrZXk6IHN0cmluZywgZm46IChhcnI6IHVua25vd25bXSkgPT4gdm9pZCk6IHZvaWQ7XG5cbiAgLy8gT2JzZXJ2YWJpbGl0eSDigJQgRW1pdCBjaGFubmVsIChQaGFzZSAzKVxuICAvKipcbiAgICogRmlyZSBhIHN0cnVjdHVyZWQgZXZlbnQgdG8gZXZlcnkgYXR0YWNoZWQgcmVjb3JkZXIgaW1wbGVtZW50aW5nXG4gICAqIGBvbkVtaXRgLiBUaGUgcHJpbWFyeSBwcmltaXRpdmUgZm9yIGNvbnN1bWVyLWF1dGhvcmVkIG9ic2VydmFiaWxpdHlcbiAgICogZXZlbnRzIChMTE0gdG9rZW5zLCBiaWxsaW5nIG1ldHJpY3MsIGRvbWFpbiBtaWxlc3RvbmVzLCBldGMuKSB0aGF0XG4gICAqIHNob3VsZG4ndCBsaXZlIGluIHNjb3BlIHN0YXRlLlxuICAgKlxuICAgKiBTeW5jaHJvbm91cywgcGFzcy10aHJvdWdoIOKAlCBkZWxpdmVyZWQgdG8gcmVjb3JkZXJzIGltbWVkaWF0ZWx5LCBpblxuICAgKiBjYWxsIG9yZGVyLiBaZXJvLWFsbG9jYXRpb24gd2hlbiBubyByZWNvcmRlcnMgYXJlIGF0dGFjaGVkLlxuICAgKlxuICAgKiAjIyBOYW1pbmcgY29udmVudGlvblxuICAgKlxuICAgKiBVc2UgaGllcmFyY2hpY2FsIGRvdHRlZCBuYW1lczogYCc8bmFtZXNwYWNlPi48Y2F0ZWdvcnk+LjxldmVudD4nYC5cbiAgICogRXhhbXBsZXM6XG4gICAqICAgLSBgJ2FnZW50Zm9vdHByaW50LmxsbS50b2tlbnMnYFxuICAgKiAgIC0gYCdteWFwcC5iaWxsaW5nLnNwZW5kJ2BcbiAgICogICAtIGAnYXV0aC5jaGVjay5kZW5pZWQnYFxuICAgKlxuICAgKiBUaGUgbGlicmFyeSBzdGF5cyB2b2NhYnVsYXJ5LWFnbm9zdGljIOKAlCBubyBjZW50cmFsIHJlZ2lzdHJ5LCBub1xuICAgKiByZXNlcnZlZCBwcmVmaXhlcy4gTmFtZXNwYWNlIHByZWZpeGVzIHByZXZlbnQgY29sbGlzaW9ucyBhY3Jvc3NcbiAgICogbGlicmFyaWVzIGFuZCBhcHBzIG5hdHVyYWxseS5cbiAgICpcbiAgICogIyMgUmVkYWN0aW9uXG4gICAqXG4gICAqIElmIGBSZWRhY3Rpb25Qb2xpY3kuZW1pdFBhdHRlcm5zYCBtYXRjaGVzIHRoZSBuYW1lLCB0aGUgcGF5bG9hZCBpc1xuICAgKiByZXBsYWNlZCB3aXRoIGAnW1JFREFDVEVEXSdgIGJlZm9yZSBkaXNwYXRjaC4gTm8gcmVjb3JkZXIgZXZlciBzZWVzXG4gICAqIHRoZSByYXcgdmFsdWUgZm9yIHJlZGFjdGVkIGV2ZW50IG5hbWVzLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIENvbnN1bWVyLWNob3NlbiBldmVudCBpZGVudGlmaWVyIChzZWUgbmFtaW5nIGNvbnZlbnRpb24pLlxuICAgKiBAcGFyYW0gcGF5bG9hZCAtIFN0cnVjdHVyZWQgZGF0YSB0byBhdHRhY2guIFNoYXBlIGlzIHVwIHRvIHRoZVxuICAgKiAgIGNvbnN1bWVyOyBsaWJyYXJ5IHRyZWF0cyBpdCBhcyBvcGFxdWUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogc2NvcGUuJGVtaXQoJ2FnZW50Zm9vdHByaW50LmxsbS50b2tlbnMnLCB7IGlucHV0OiAxMDAsIG91dHB1dDogNTAgfSk7XG4gICAqIHNjb3BlLiRlbWl0KCdteWFwcC5kZWNpc2lvbicsIHsgYnJhbmNoOiAnYXBwcm92ZWQnLCBjb25maWRlbmNlOiAwLjkyIH0pO1xuICAgKiBgYGBcbiAgICovXG4gICRlbWl0KG5hbWU6IHN0cmluZywgcGF5bG9hZD86IHVua25vd24pOiB2b2lkO1xuXG4gIC8vIERldGFjaCDigJQgZmlyZS1hbmQtZm9yZ2V0IGNoaWxkIGZsb3djaGFydCBleGVjdXRpb24uXG4gIC8vXG4gIC8vIGAkZGV0YWNoQW5kSm9pbkxhdGVyKGRyaXZlciwgY2hpbGQsIGlucHV0PylgIHNjaGVkdWxlcyB0aGUgY2hpbGQgdmlhXG4gIC8vIHRoZSBnaXZlbiBkcml2ZXIgYW5kIHJldHVybnMgYSBgRGV0YWNoSGFuZGxlYCB0aGUgY29uc3VtZXIgY2FuIHJlYWRcbiAgLy8gc3luY2hyb25vdXNseSAoYC5zdGF0dXNgKSBvciBhd2FpdCAoYC53YWl0KClgKS4gVGhlIHBhcmVudCBzdGFnZVxuICAvLyBkb2VzIE5PVCBibG9jayBvbiB0aGUgY2hpbGQg4oCUIGl0IHJldHVybnMgdG8gdGhlIGFnZW50IGxvb3AgdGhlXG4gIC8vIG1vbWVudCB0aGUgZHJpdmVyJ3MgYHNjaGVkdWxlKClgIHJldHVybnMgKHBhc3NpdmUgcmVjb3JkZXIgcnVsZSkuXG4gIC8vXG4gIC8vIGAkZGV0YWNoQW5kRm9yZ2V0KGRyaXZlciwgY2hpbGQsIGlucHV0PylgIGRpc2NhcmRzIHRoZSBoYW5kbGUg4oCUXG4gIC8vIHVzZWZ1bCBmb3IgZmlyZS1hbmQtZm9yZ2V0IHRlbGVtZXRyeSB3aGVyZSB0aGUgY2FsbGVyIG5ldmVyIG5lZWRzXG4gIC8vIHRvIGtub3cgaG93IHRoZSBjaGlsZCBmaW5pc2hlZC4gRXJyb3JzIHN0aWxsIGxhbmQgb24gdGhlIChub3ctXG4gIC8vIGRyb3BwZWQpIGhhbmRsZSBhbmQgZ28gc2lsZW50IHVubGVzcyBhbiBvYnNlcnZlciBzdXJmYWNlcyB0aGVtLlxuICAvL1xuICAvLyBEcml2ZXIgaXMgUkVRVUlSRUQg4oCUIHRoZXJlJ3Mgbm8gbGlicmFyeS1kZWZhdWx0LiBQYXNzIGUuZy5cbiAgLy8gYG1pY3JvdGFza0JhdGNoRHJpdmVyYCAoZnJvbSAnZm9vdHByaW50anMvZGV0YWNoJykgb3IgeW91ciBvd25cbiAgLy8gY3VzdG9tIGRyaXZlci4gRXhwbGljaXQgcGFzc2luZyBhdm9pZHMgZ2xvYmFsIHN0YXRlIGFuZCBrZWVwcyB0aGVcbiAgLy8gZW5naW5lIGZyZWUgb2YgZHJpdmVyIGltcG9ydHMuXG4gICRkZXRhY2hBbmRKb2luTGF0ZXIoXG4gICAgZHJpdmVyOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaERyaXZlcixcbiAgICBjaGlsZDogaW1wb3J0KCcuLi9idWlsZGVyL3R5cGVzLmpzJykuRmxvd0NoYXJ0LFxuICAgIGlucHV0PzogdW5rbm93bixcbiAgKTogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hIYW5kbGU7XG5cbiAgJGRldGFjaEFuZEZvcmdldChcbiAgICBkcml2ZXI6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoRHJpdmVyLFxuICAgIGNoaWxkOiBpbXBvcnQoJy4uL2J1aWxkZXIvdHlwZXMuanMnKS5GbG93Q2hhcnQsXG4gICAgaW5wdXQ/OiB1bmtub3duLFxuICApOiB2b2lkO1xuXG4gIC8vIFBpcGVsaW5lIGNvbnRyb2xcbiAgLyoqXG4gICAqIFN0b3AgdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGNvbnRleHQuXG4gICAqXG4gICAqIC0gKipJbiBhIHRvcC1sZXZlbCBjaGFydDoqKiB0aGUgdHJhdmVyc2VyIGV4aXRzIGNsZWFubHkgYWZ0ZXIgdGhpcyBzdGFnZVxuICAgKiAgIGNvbXBsZXRlcy5cbiAgICogLSAqKkluc2lkZSBhIHN1YmZsb3c6KiogYnkgZGVmYXVsdCwgb25seSB0aGUgc3ViZmxvdydzIG93biBleGVjdXRpb25cbiAgICogICBzdG9wczsgY29udHJvbCByZXR1cm5zIHRvIHRoZSBwYXJlbnQgYXMgbm9ybWFsLiBJZiB0aGUgc3ViZmxvdyBpc1xuICAgKiAgIG1vdW50ZWQgd2l0aCBgcHJvcGFnYXRlQnJlYWs6IHRydWVgLCB0aGUgYnJlYWsgc2lnbmFsIChhbmQgaXRzXG4gICAqICAgb3B0aW9uYWwgcmVhc29uKSBwcm9wYWdhdGVzIHVwIHRvIHRoZSBwYXJlbnQgc2NvcGUsIHRlcm1pbmF0aW5nIHRoZVxuICAgKiAgIG91dGVyIGxvb3AgdG9vLiBTZWUgYFN1YmZsb3dNb3VudE9wdGlvbnMucHJvcGFnYXRlQnJlYWtgLlxuICAgKlxuICAgKiBAcGFyYW0gcmVhc29uIC0gT3B0aW9uYWwgZnJlZS1mb3JtIHN0cmluZyBkZXNjcmliaW5nIHdoeSB0aGUgYnJlYWtcbiAgICogICBoYXBwZW5lZC4gUHJvcGFnYXRlcyB0byBgRmxvd0JyZWFrRXZlbnQucmVhc29uYCBzbyByZWNvcmRlcnMgYW5kXG4gICAqICAgY3VzdG9tIG5hcnJhdGl2ZXMgY2FuIHN1cmZhY2UgaXQuIERlZmF1bHRzIHRvIHVuZGVmaW5lZC5cbiAgICovXG4gICRicmVhayhyZWFzb24/OiBzdHJpbmcpOiB2b2lkO1xuXG4gIC8vIEVzY2FwZSBoYXRjaCAtLSB1bndyYXAgdG8gdW5kZXJseWluZyBSZWFjdGl2ZVRhcmdldFxuICAkdG9SYXcoKTogUmVhY3RpdmVUYXJnZXQ7XG59XG5cbi8vIC0tIFR5cGVkU2NvcGU8VD4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRoZSBjb25zdW1lci1mYWNpbmcgdHlwZS4gVCBpcyB0aGUgdXNlcidzIHN0YXRlIGludGVyZmFjZS5cbi8vIFByb3BlcnR5IGFjY2VzcyBpcyB0eXBlZDsgJC1tZXRob2RzIHByb3ZpZGUgZXNjYXBlIGhhdGNoZXMuXG5cbmV4cG9ydCB0eXBlIFR5cGVkU2NvcGU8VCBleHRlbmRzIG9iamVjdCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9IFQgJiBTY29wZU1ldGhvZHM7XG5cbi8vIC0tIFJlYWN0aXZlT3B0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvbmZpZ3VyYXRpb24gcGFzc2VkIHRvIGNyZWF0ZVR5cGVkU2NvcGUuXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVhY3RpdmVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFBpcGVsaW5lIGJyZWFrIGZ1bmN0aW9uIOKAlCBpbmplY3RlZCBieSBTdGFnZVJ1bm5lciBhZnRlciBzY29wZSBjcmVhdGlvbi5cbiAgICogQWNjZXB0cyBhbiBvcHRpb25hbCByZWFzb24gc3RyaW5nIHRoYXQgcHJvcGFnYXRlcyB0byBgRmxvd0JyZWFrRXZlbnRgXG4gICAqIGFuZCAod2hlbiBgcHJvcGFnYXRlQnJlYWtgIGlzIHNldCBvbiBhIG1vdW50KSB1cCB0byB0aGUgcGFyZW50IHNjb3BlLlxuICAgKi9cbiAgYnJlYWtQaXBlbGluZT86IChyZWFzb24/OiBzdHJpbmcpID0+IHZvaWQ7XG59XG5cbi8vIC0tIEludGVybmFsOiAkLW1ldGhvZCBuYW1lIHNldCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFVzZWQgYnkgdGhlIFByb3h5IGdldCB0cmFwIHRvIGRpc3Rpbmd1aXNoICQtbWV0aG9kcyBmcm9tIHN0YXRlIGtleXMuXG5cbmV4cG9ydCBjb25zdCBTQ09QRV9NRVRIT0RfTkFNRVMgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAnJGdldFZhbHVlJyxcbiAgJyRzZXRWYWx1ZScsXG4gICckdXBkYXRlJyxcbiAgJyRkZWxldGUnLFxuICAnJHJlYWQnLFxuICAnJGdldEFyZ3MnLFxuICAnJGdldEVudicsXG4gICckZGVidWcnLFxuICAnJGxvZycsXG4gICckZXJyb3InLFxuICAnJG1ldHJpYycsXG4gICckZXZhbCcsXG4gICckYXR0YWNoUmVjb3JkZXInLFxuICAnJGRldGFjaFJlY29yZGVyJyxcbiAgJyRnZXRSZWNvcmRlcnMnLFxuICAnJGJhdGNoQXJyYXknLFxuICAnJGJyZWFrJyxcbiAgJyRlbWl0JyxcbiAgJyRkZXRhY2hBbmRKb2luTGF0ZXInLFxuICAnJGRldGFjaEFuZEZvcmdldCcsXG4gICckdG9SYXcnLFxuXSk7XG5cbi8vIC0tIEludGVybmFsOiBTeW1ib2wgZm9yIGRlZmVycmVkIGJyZWFrIGluamVjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFN0YWdlUnVubmVyIHNldHMgdGhpcyBhZnRlciBzY29wZSBjcmVhdGlvbiBzbyAkYnJlYWsoKSB3b3Jrcy5cbi8vIFByaXZhdGUgU3ltYm9sIChub3QgU3ltYm9sLmZvcikgdG8gcHJldmVudCBjcm9zcy1tb2R1bGUgdGFtcGVyaW5nLlxuXG5leHBvcnQgY29uc3QgQlJFQUtfU0VUVEVSID0gU3ltYm9sKCdmb290cHJpbnQ6cmVhY3RpdmU6c2V0QnJlYWsnKTtcblxuLy8gLS0gSW50ZXJuYWw6IFN5bWJvbCBmb3IgVHlwZWRTY29wZSBkZXRlY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVXNlZCBieSBTdGFnZVJ1bm5lciB0byBza2lwIGNyZWF0ZVByb3RlY3RlZFNjb3BlIGZvciBUeXBlZFNjb3BlIGluc3RhbmNlcy5cbi8vIFByaXZhdGUgU3ltYm9sIHByZXZlbnRzIHN0cmluZy10YWcgc3Bvb2ZpbmcuXG5cbmV4cG9ydCBjb25zdCBJU19UWVBFRF9TQ09QRSA9IFN5bWJvbCgnZm9vdHByaW50OnJlYWN0aXZlOmlzVHlwZWRTY29wZScpO1xuXG4vLyAtLSBJbnRlcm5hbDogZXhlY3V0b3IgbWV0aG9kIGFsbG93bGlzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTY29wZUZhY2FkZSBtZXRob2RzIGNhbGxlZCBieSBGbG93Q2hhcnRFeGVjdXRvciB3cmFwcGluZyBjb2RlIGFuZCBTdGFnZVJ1bm5lclxuLy8gVEhST1VHSCBhIFR5cGVkU2NvcGUgcHJveHkuIE9ubHkgYWRkIG1ldGhvZHMgd2l0aCBjb25maXJtZWQgY2FsbCBzaXRlcy5cbi8vIFNoYXJlZCBiZXR3ZWVuIGNyZWF0ZVR5cGVkU2NvcGUudHMgYW5kIFN0YWdlUnVubmVyLnRzIHRvIHByZXZlbnQgZHJpZnQuXG5cbmV4cG9ydCBjb25zdCBFWEVDVVRPUl9JTlRFUk5BTF9NRVRIT0RTID0gbmV3IFNldChbXG4gICdub3RpZnlTdGFnZVN0YXJ0JywgLy8gU3RhZ2VSdW5uZXIucnVuKCkgbGluZSA1OVxuICAnbm90aWZ5U3RhZ2VFbmQnLCAvLyBTdGFnZVJ1bm5lci5ydW4oKSBsaW5lIDc5XG4gICdub3RpZnlQYXVzZScsIC8vIFN0YWdlUnVubmVyLnJ1bigpIOKAlCBwYXVzZSBkZXRlY3Rpb25cbiAgJ2F0dGFjaFJlY29yZGVyJywgLy8gRmxvd0NoYXJ0RXhlY3V0b3IuY3JlYXRlVHJhdmVyc2VyKCkg4oCUIG5hcnJhdGl2ZSArIHVzZXIgcmVjb3JkZXJzXG4gICdkZXRhY2hSZWNvcmRlcicsIC8vIEZsb3dDaGFydEV4ZWN1dG9yLmRldGFjaFJlY29yZGVyKClcbiAgJ2dldFJlY29yZGVycycsIC8vIEZsb3dDaGFydEV4ZWN1dG9yLmdldFJlY29yZGVycygpXG4gICd1c2VTaGFyZWRSZWRhY3RlZEtleXMnLCAvLyBGbG93Q2hhcnRFeGVjdXRvci5jcmVhdGVUcmF2ZXJzZXIoKSDigJQgcmVkYWN0aW9uIHdyYXBwaW5nXG4gICd1c2VSZWRhY3Rpb25Qb2xpY3knLCAvLyBGbG93Q2hhcnRFeGVjdXRvci5jcmVhdGVUcmF2ZXJzZXIoKSDigJQgcmVkYWN0aW9uIHdyYXBwaW5nXG5dKTtcbiJdfQ==
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlYWN0aXZlL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBMFBILCtFQUErRTtBQUMvRSx1RUFBdUU7QUFFdkUsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQVM7SUFDaEQsV0FBVztJQUNYLFdBQVc7SUFDWCxTQUFTO0lBQ1QsU0FBUztJQUNULE9BQU87SUFDUCxVQUFVO0lBQ1YsU0FBUztJQUNULFFBQVE7SUFDUixNQUFNO0lBQ04sUUFBUTtJQUNSLFNBQVM7SUFDVCxPQUFPO0lBQ1Asc0JBQXNCO0lBQ3RCLHNCQUFzQjtJQUN0QixvQkFBb0I7SUFDcEIsYUFBYTtJQUNiLFFBQVE7SUFDUixPQUFPO0lBQ1AscUJBQXFCO0lBQ3JCLGtCQUFrQjtJQUNsQixRQUFRO0NBQ1QsQ0FBQyxDQUFDO0FBRUgsK0VBQStFO0FBQy9FLGdFQUFnRTtBQUNoRSxxRUFBcUU7QUFFckUsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0FBRWxFLCtFQUErRTtBQUMvRSw2RUFBNkU7QUFDN0UsK0NBQStDO0FBRS9DLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsaUNBQWlDLENBQUMsQ0FBQztBQUV4RSwrRUFBK0U7QUFDL0UsZ0ZBQWdGO0FBQ2hGLDBFQUEwRTtBQUMxRSwwRUFBMEU7QUFFMUUsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDL0Msa0JBQWtCLEVBQUUsNEJBQTRCO0lBQ2hELGdCQUFnQixFQUFFLDRCQUE0QjtJQUM5QyxhQUFhLEVBQUUsc0NBQXNDO0lBQ3JELHFCQUFxQixFQUFFLG1FQUFtRTtJQUMxRixxQkFBcUIsRUFBRSwwQ0FBMEM7SUFDakUsbUJBQW1CLEVBQUUsd0NBQXdDO0lBQzdELHVCQUF1QixFQUFFLDJEQUEyRDtJQUNwRixvQkFBb0IsRUFBRSwyREFBMkQ7Q0FDbEYsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiByZWFjdGl2ZS90eXBlcyAtLSBUeXBlIGRlZmluaXRpb25zIGZvciB0aGUgVHlwZWRTY29wZTxUPiByZWFjdGl2ZSBwcm94eSBzeXN0ZW0uXG4gKlxuICogVHlwZWRTY29wZTxUPiB3cmFwcyBhIFJlYWN0aXZlVGFyZ2V0IChTY29wZUZhY2FkZSkgaW4gYSBQcm94eSB0aGF0IHByb3ZpZGVzXG4gKiB0eXBlZCBwcm9wZXJ0eSBhY2Nlc3MuIEFsbCBzY29wZSBpbmZyYXN0cnVjdHVyZSBtZXRob2RzIGFyZSAkLXByZWZpeGVkIHRvXG4gKiBhdm9pZCBjb2xsaXNpb25zIHdpdGggdXNlciBzdGF0ZSBrZXlzLlxuICpcbiAqIERlcGVuZGVuY3k6IHR5cGUtb25seSBpbXBvcnRzIGZyb20gZW5naW5lLyBhbmQgc2NvcGUvICh6ZXJvIHJ1bnRpbWUgY29zdCkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25FbnYgfSBmcm9tICcuLi9lbmdpbmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTY29wZVJlY29yZGVyIH0gZnJvbSAnLi4vc2NvcGUvdHlwZXMuanMnO1xuXG4vLyAtLSBSZWFjdGl2ZVRhcmdldCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNaW5pbXVtIHByb3RvY29sIHJlcXVpcmVkIGJ5IFR5cGVkU2NvcGUgLS0gYSBjdXJhdGVkIHN1YnNldCBvZiBTY29wZUZhY2FkZSdzXG4vLyBwdWJsaWMgQVBJLiBOb3QgYSBmdWxsIG1pcnJvcjogZXhjbHVkZXMgaW50ZXJuYWwvcmVkYWN0aW9uIG1ldGhvZHMgdGhhdCBhcmVcbi8vIGhhbmRsZWQgYXQgdGhlIGV4ZWN1dG9yIGxldmVsICh1c2VSZWRhY3Rpb25Qb2xpY3ksIHVzZVNoYXJlZFJlZGFjdGVkS2V5cywgZXRjLilcbi8vIGFuZCBpbmZyYXN0cnVjdHVyZSBtZXRob2RzIChnZXRQaXBlbGluZUlkLCBzZXRHbG9iYWwsIGdldEdsb2JhbCwgZXRjLikuXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVhY3RpdmVUYXJnZXQge1xuICAvLyBTdGF0ZSBhY2Nlc3MgKHRyYWNrZWQgYnkgcmVjb3JkZXJzKVxuICBnZXRWYWx1ZShrZXk/OiBzdHJpbmcpOiB1bmtub3duO1xuICBzZXRWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdm9pZDtcbiAgdXBkYXRlVmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IHZvaWQ7XG4gIGRlbGV0ZVZhbHVlKGtleTogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IHZvaWQ7XG5cbiAgLy8gTm9uLXRyYWNraW5nIHN0YXRlIGluc3BlY3Rpb24gKGZvciBwcm94eSBpbnRlcm5hbHMg4oCUIG5vIHJlY29yZGVyIGRpc3BhdGNoKVxuICAvKiogUmV0dXJucyBhbGwgc3RhdGUga2V5cyB3aXRob3V0IGZpcmluZyBvblJlYWQuIFVzZWQgYnkgb3duS2V5cy9oYXMgdHJhcHMuICovXG4gIGdldFN0YXRlS2V5cz8oKTogc3RyaW5nW107XG4gIC8qKiBDaGVjayBrZXkgZXhpc3RlbmNlIHdpdGhvdXQgZmlyaW5nIG9uUmVhZC4gVXNlZCBieSBoYXMgdHJhcC4gKi9cbiAgaGFzS2V5PyhrZXk6IHN0cmluZyk6IGJvb2xlYW47XG4gIC8qKiBSZWFkIHN0YXRlIHdpdGhvdXQgZmlyaW5nIG9uUmVhZC4gVXNlZCBieSBhcnJheSBwcm94eSBnZXRDdXJyZW50KCkuICovXG4gIGdldFZhbHVlU2lsZW50PyhrZXk/OiBzdHJpbmcpOiB1bmtub3duO1xuXG4gIC8vIElucHV0ICYgZW52aXJvbm1lbnQgKHJlYWRvbmx5LCBOT1QgdHJhY2tlZClcbiAgZ2V0QXJnczxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KCk6IFQ7XG4gIGdldEVudigpOiBSZWFkb25seTxFeGVjdXRpb25FbnY+O1xuXG4gIC8vIFNjb3BlUmVjb3JkZXIgbWFuYWdlbWVudFxuICBhdHRhY2hTY29wZVJlY29yZGVyKHJlY29yZGVyOiBTY29wZVJlY29yZGVyKTogdm9pZDtcbiAgZGV0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlcklkOiBzdHJpbmcpOiB2b2lkO1xuICBnZXRTY29wZVJlY29yZGVycygpOiBTY29wZVJlY29yZGVyW107XG5cbiAgLy8gRGlhZ25vc3RpY3NcbiAgYWRkRGVidWdJbmZvKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG4gIGFkZERlYnVnTWVzc2FnZSh2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG4gIGFkZEVycm9ySW5mbyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkO1xuICBhZGRNZXRyaWMobmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG4gIGFkZEV2YWwobmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG5cbiAgLy8gRW1pdCBjaGFubmVsIChQaGFzZSAzKSDigJQgc3RydWN0dXJlZCB1c2VyLWF1dGhvcmVkIGV2ZW50cyB0byBFbWl0UmVjb3JkZXJzLlxuICBlbWl0RXZlbnQobmFtZTogc3RyaW5nLCBwYXlsb2FkPzogdW5rbm93bik6IHZvaWQ7XG5cbiAgLy8gRGV0YWNoIChUNCkg4oCUIGZpcmUtYW5kLWZvcmdldCBjaGlsZCBmbG93Y2hhcnRzLiBTY29wZUZhY2FkZVxuICAvLyBkZWxlZ2F0ZXMgdG8gYGRldGFjaC9zcGF3bmAsIG1pbnRpbmcgcmVmSWRzIGZyb20gdGhpcyBzdGFnZSdzXG4gIC8vIHJ1bnRpbWVTdGFnZUlkIGZvciBkaWFnbm9zdGljIGNvcnJlbGF0aW9uLlxuICBkZXRhY2hBbmRKb2luTGF0ZXIoXG4gICAgZHJpdmVyOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaERyaXZlcixcbiAgICBjaGlsZDogaW1wb3J0KCcuLi9idWlsZGVyL3R5cGVzLmpzJykuRmxvd0NoYXJ0LFxuICAgIGlucHV0PzogdW5rbm93bixcbiAgKTogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hIYW5kbGU7XG5cbiAgZGV0YWNoQW5kRm9yZ2V0KFxuICAgIGRyaXZlcjogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hEcml2ZXIsXG4gICAgY2hpbGQ6IGltcG9ydCgnLi4vYnVpbGRlci90eXBlcy5qcycpLkZsb3dDaGFydCxcbiAgICBpbnB1dD86IHVua25vd24sXG4gICk6IHZvaWQ7XG59XG5cbi8vIC0tIFNjb3BlTWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vICQtcHJlZml4ZWQgZXNjYXBlIGhhdGNoZXMuIE5vbi1lbnVtZXJhYmxlIG9uIHRoZSBwcm94eSAtLSBkb24ndCBhcHBlYXIgaW5cbi8vIE9iamVjdC5rZXlzKCksIGRlc3RydWN0dXJpbmcsIG9yIGZvci4uLmluLiBPbmx5IHN0YXRlIGtleXMgYXJlIHZpc2libGUuXG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NvcGVNZXRob2RzIHtcbiAgLy8gU3RhdGUgKHVudHlwZWQgZXNjYXBlIGhhdGNoIC0tIGZvciBkeW5hbWljIGtleXMsIHJlZGFjdGlvbiwgZGVzY3JpcHRpb24pXG4gICRnZXRWYWx1ZShrZXk6IHN0cmluZyk6IHVua25vd247XG4gICRzZXRWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdm9pZDtcbiAgJHVwZGF0ZShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdm9pZDtcbiAgJGRlbGV0ZShrZXk6IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiB2b2lkO1xuICAvKiogUHJveHktc3ludGhlc2l6ZWQ6IGNhbGxzIGdldFZhbHVlKHJvb3RLZXkpIHRoZW4gbG9kYXNoLmdldCBmb3IgbmVzdGVkIHBhdGguIE5vdCBhIGRpcmVjdCBkZWxlZ2F0aW9uLiAqL1xuICAkcmVhZChkb3RQYXRoOiBzdHJpbmcpOiB1bmtub3duO1xuXG4gIC8vIElucHV0ICYgZW52aXJvbm1lbnQgKHJlYWRvbmx5KVxuICAkZ2V0QXJnczxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KCk6IFQ7XG4gICRnZXRFbnYoKTogUmVhZG9ubHk8RXhlY3V0aW9uRW52PjtcblxuICAvLyBPYnNlcnZhYmlsaXR5IOKAlCBsZWdhY3kgZGlhZ25vc3RpYyBwcmltaXRpdmVzLlxuICAvL1xuICAvLyBBcyBvZiBQaGFzZSAzIHRoZXNlIEFMU08gZGlzcGF0Y2ggb24gdGhlIGVtaXQgY2hhbm5lbCAoaW4gYWRkaXRpb24gdG9cbiAgLy8gdGhlaXIgZXhpc3RpbmcgYERpYWdub3N0aWNDb2xsZWN0b3JgIHNpZGUtYmFnIHdyaXRlcyBmb3Igc25hcHNob3RcbiAgLy8gaW5jbHVzaW9uKS4gQW55IGF0dGFjaGVkIGBFbWl0UmVjb3JkZXJgIHdpbGwgc2VlIHRoZXNlIGV2ZW50cyB3aXRoXG4gIC8vIHRoZSBjb3JyZXNwb25kaW5nIG5hbWVzcGFjZWQgbmFtZXM6XG4gIC8vXG4gIC8vICAgJGRlYnVnKGtleSwgdmFsdWUpICAgIC0+IGVtaXRzIGBsb2cuZGVidWcuJHtrZXl9YFxuICAvLyAgICRlcnJvcihrZXksIHZhbHVlKSAgICAtPiBlbWl0cyBgbG9nLmVycm9yLiR7a2V5fWBcbiAgLy8gICAkbWV0cmljKG5hbWUsIHZhbHVlKSAgLT4gZW1pdHMgYG1ldHJpYy4ke25hbWV9YFxuICAvLyAgICRldmFsIChuYW1lLCB2YWx1ZSkgICAtPiBlbWl0cyBgZXZhbC4ke25hbWV9YFxuICAvLyAgICRsb2codmFsdWUpICAgICAgICAgICAtPiBlbWl0cyBgbG9nLmRlYnVnLm1lc3NhZ2VzYFxuICAvL1xuICAvLyBUaGlzIG1ha2VzIHRoZSBjYWxscyBvYnNlcnZhYmxlIGluIHJlYWwgdGltZSDigJQgbm8gbG9zcyBvZiBiYWNrd2FyZFxuICAvLyBjb21wYXQ7IHRoZSBzaWRlIGJhZyBjb250aW51ZXMgdG8gcG9wdWxhdGUgZm9yIGNvbnN1bWVycyB0aGF0IGluc3BlY3RcbiAgLy8gdGhlIHNuYXBzaG90IGRpcmVjdGx5LlxuICAkZGVidWcoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgJGxvZyh2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG4gICRlcnJvcihrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkO1xuICAkbWV0cmljKG5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkO1xuICAkZXZhbChuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcblxuICAvLyBTY29wZVJlY29yZGVyIG1hbmFnZW1lbnRcbiAgJGF0dGFjaFNjb3BlUmVjb3JkZXIocmVjb3JkZXI6IFNjb3BlUmVjb3JkZXIpOiB2b2lkO1xuICAkZGV0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlcklkOiBzdHJpbmcpOiB2b2lkO1xuICAkZ2V0U2NvcGVSZWNvcmRlcnMoKTogU2NvcGVSZWNvcmRlcltdO1xuXG4gIC8qKlxuICAgKiBCYXRjaC1tdXRhdGUgYW4gYXJyYXkga2V5IGluIGEgc2luZ2xlIGNsb25lK3dyaXRlIGN5Y2xlLlxuICAgKlxuICAgKiBFdmVyeSBgc2NvcGUuaXRlbXMucHVzaCh4KWAgY2xvbmVzIHRoZSBlbnRpcmUgYXJyYXkgYW5kIGNvbW1pdHMgaXQg4oCUIE8oTikgcGVyIGNhbGwuXG4gICAqIEZvciBOIG11dGF0aW9ucyBvbiBhbiBNLWxlbmd0aCBhcnJheSB0aGF0IGlzIE8oTsOXTSkuIFVzZSBgJGJhdGNoQXJyYXlgIHRvIGNsb25lIG9uY2UsXG4gICAqIGFwcGx5IGFsbCBtdXRhdGlvbnMgaW5zaWRlIGBmbmAsIHRoZW4gY29tbWl0IG9uY2Ug4oCUIE8oTSkgdG90YWwuXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gQmVmb3JlOiAxMDAwIGNsb25lcyDDlyBncm93aW5nIGFycmF5ID0gTyhOwrIpXG4gICAqIGZvciAobGV0IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSBzY29wZS5pdGVtcy5wdXNoKGkpO1xuICAgKlxuICAgKiAvLyBBZnRlcjogMSBjbG9uZSArIDEgY29tbWl0ID0gTyhOKVxuICAgKiBzY29wZS4kYmF0Y2hBcnJheSgnaXRlbXMnLCAoYXJyKSA9PiB7XG4gICAqICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIGFyci5wdXNoKGkpO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIGBmbmAgcmVjZWl2ZXMgYSBwbGFpbiAobm9uLXByb3h5KSBtdXRhYmxlICoqc2hhbGxvdyBjb3B5Kiogb2YgdGhlIGN1cnJlbnQgYXJyYXkuXG4gICAqIFRoZSBhcnJheSBpdHNlbGYgaXMgYSBuZXcgaW5zdGFuY2UsIGJ1dCBvYmplY3QgcmVmZXJlbmNlcyBpbnNpZGUgaXQgYXJlIHNoYXJlZCB3aXRoXG4gICAqIHRoZSBvcmlnaW5hbCBzdGF0ZSDigJQgbXV0YXRpb25zIHRvIG5lc3RlZCBvYmplY3RzIGluc2lkZSBgZm5gIGFmZmVjdCB0aG9zZSBvcmlnaW5hbHMuXG4gICAqIE9ubHkgcHVzaC9wb3Avc29ydC9zcGxpY2UgYW5kIG90aGVyIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIGFycmF5J3Mgb3duIHNsb3RzIGFyZVxuICAgKiBzYWZlbHkgaXNvbGF0ZWQuXG4gICAqXG4gICAqIE11dGF0aW9ucyBpbnNpZGUgYGZuYCBhcmUgTk9UIHRyYWNrZWQgaW5kaXZpZHVhbGx5IOKAlCBvbmx5IHRoZSBmaW5hbCBjb21taXR0ZWQgYXJyYXlcbiAgICogYXBwZWFycyBpbiB0aGUgbmFycmF0aXZlIGFzIGEgc2luZ2xlIHdyaXRlLiBJZiB0aGUga2V5IGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhblxuICAgKiBhcnJheSwgYGZuYCByZWNlaXZlcyBhbiBlbXB0eSBhcnJheSBhbmQgdGhlIHJlc3VsdCBpcyBjb21taXR0ZWQgYXMgdGhlIG5ldyB2YWx1ZS5cbiAgICpcbiAgICogSWYgYGZuYCB0aHJvd3MsIGBzZXRWYWx1ZWAgaXMgbmV2ZXIgY2FsbGVkIGFuZCBzdGF0ZSByZW1haW5zIHVuY2hhbmdlZCAoYXRvbWljIG9uXG4gICAqIGVycm9yKS4gVGhlIGV4Y2VwdGlvbiBwcm9wYWdhdGVzIHRvIHRoZSBjYWxsZXIuXG4gICAqXG4gICAqIGBrZXlgIGlzIHVudHlwZWQgKGBzdHJpbmdgKSDigJQgVHlwZVNjcmlwdCB3aWxsIG5vdCBjYXRjaCB0eXBvcy4gYGFycmAgaXMgdHlwZWQgYXNcbiAgICogYHVua25vd25bXWAgYmVjYXVzZSBgU2NvcGVNZXRob2RzYCBpcyBub3QgcGFyYW1ldGVyaXplZCBieSBgVGA7IGNhc3QgaW5zaWRlIGBmbmBcbiAgICogd2hlbiBlbGVtZW50IHR5cGVzIGFyZSBrbm93bjogYChhcnIgYXMgc3RyaW5nW10pLnB1c2goeClgLlxuICAgKi9cbiAgJGJhdGNoQXJyYXkoa2V5OiBzdHJpbmcsIGZuOiAoYXJyOiB1bmtub3duW10pID0+IHZvaWQpOiB2b2lkO1xuXG4gIC8vIE9ic2VydmFiaWxpdHkg4oCUIEVtaXQgY2hhbm5lbCAoUGhhc2UgMylcbiAgLyoqXG4gICAqIEZpcmUgYSBzdHJ1Y3R1cmVkIGV2ZW50IHRvIGV2ZXJ5IGF0dGFjaGVkIHJlY29yZGVyIGltcGxlbWVudGluZ1xuICAgKiBgb25FbWl0YC4gVGhlIHByaW1hcnkgcHJpbWl0aXZlIGZvciBjb25zdW1lci1hdXRob3JlZCBvYnNlcnZhYmlsaXR5XG4gICAqIGV2ZW50cyAoTExNIHRva2VucywgYmlsbGluZyBtZXRyaWNzLCBkb21haW4gbWlsZXN0b25lcywgZXRjLikgdGhhdFxuICAgKiBzaG91bGRuJ3QgbGl2ZSBpbiBzY29wZSBzdGF0ZS5cbiAgICpcbiAgICogU3luY2hyb25vdXMsIHBhc3MtdGhyb3VnaCDigJQgZGVsaXZlcmVkIHRvIHJlY29yZGVycyBpbW1lZGlhdGVseSwgaW5cbiAgICogY2FsbCBvcmRlci4gWmVyby1hbGxvY2F0aW9uIHdoZW4gbm8gcmVjb3JkZXJzIGFyZSBhdHRhY2hlZC5cbiAgICpcbiAgICogIyMgTmFtaW5nIGNvbnZlbnRpb25cbiAgICpcbiAgICogVXNlIGhpZXJhcmNoaWNhbCBkb3R0ZWQgbmFtZXM6IGAnPG5hbWVzcGFjZT4uPGNhdGVnb3J5Pi48ZXZlbnQ+J2AuXG4gICAqIEV4YW1wbGVzOlxuICAgKiAgIC0gYCdhZ2VudGZvb3RwcmludC5sbG0udG9rZW5zJ2BcbiAgICogICAtIGAnbXlhcHAuYmlsbGluZy5zcGVuZCdgXG4gICAqICAgLSBgJ2F1dGguY2hlY2suZGVuaWVkJ2BcbiAgICpcbiAgICogVGhlIGxpYnJhcnkgc3RheXMgdm9jYWJ1bGFyeS1hZ25vc3RpYyDigJQgbm8gY2VudHJhbCByZWdpc3RyeSwgbm9cbiAgICogcmVzZXJ2ZWQgcHJlZml4ZXMuIE5hbWVzcGFjZSBwcmVmaXhlcyBwcmV2ZW50IGNvbGxpc2lvbnMgYWNyb3NzXG4gICAqIGxpYnJhcmllcyBhbmQgYXBwcyBuYXR1cmFsbHkuXG4gICAqXG4gICAqICMjIFJlZGFjdGlvblxuICAgKlxuICAgKiBJZiBgUmVkYWN0aW9uUG9saWN5LmVtaXRQYXR0ZXJuc2AgbWF0Y2hlcyB0aGUgbmFtZSwgdGhlIHBheWxvYWQgaXNcbiAgICogcmVwbGFjZWQgd2l0aCBgJ1tSRURBQ1RFRF0nYCBiZWZvcmUgZGlzcGF0Y2guIE5vIHJlY29yZGVyIGV2ZXIgc2Vlc1xuICAgKiB0aGUgcmF3IHZhbHVlIGZvciByZWRhY3RlZCBldmVudCBuYW1lcy5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBDb25zdW1lci1jaG9zZW4gZXZlbnQgaWRlbnRpZmllciAoc2VlIG5hbWluZyBjb252ZW50aW9uKS5cbiAgICogQHBhcmFtIHBheWxvYWQgLSBTdHJ1Y3R1cmVkIGRhdGEgdG8gYXR0YWNoLiBTaGFwZSBpcyB1cCB0byB0aGVcbiAgICogICBjb25zdW1lcjsgbGlicmFyeSB0cmVhdHMgaXQgYXMgb3BhcXVlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHNjb3BlLiRlbWl0KCdhZ2VudGZvb3RwcmludC5sbG0udG9rZW5zJywgeyBpbnB1dDogMTAwLCBvdXRwdXQ6IDUwIH0pO1xuICAgKiBzY29wZS4kZW1pdCgnbXlhcHAuZGVjaXNpb24nLCB7IGJyYW5jaDogJ2FwcHJvdmVkJywgY29uZmlkZW5jZTogMC45MiB9KTtcbiAgICogYGBgXG4gICAqL1xuICAkZW1pdChuYW1lOiBzdHJpbmcsIHBheWxvYWQ/OiB1bmtub3duKTogdm9pZDtcblxuICAvLyBEZXRhY2gg4oCUIGZpcmUtYW5kLWZvcmdldCBjaGlsZCBmbG93Y2hhcnQgZXhlY3V0aW9uLlxuICAvL1xuICAvLyBgJGRldGFjaEFuZEpvaW5MYXRlcihkcml2ZXIsIGNoaWxkLCBpbnB1dD8pYCBzY2hlZHVsZXMgdGhlIGNoaWxkIHZpYVxuICAvLyB0aGUgZ2l2ZW4gZHJpdmVyIGFuZCByZXR1cm5zIGEgYERldGFjaEhhbmRsZWAgdGhlIGNvbnN1bWVyIGNhbiByZWFkXG4gIC8vIHN5bmNocm9ub3VzbHkgKGAuc3RhdHVzYCkgb3IgYXdhaXQgKGAud2FpdCgpYCkuIFRoZSBwYXJlbnQgc3RhZ2VcbiAgLy8gZG9lcyBOT1QgYmxvY2sgb24gdGhlIGNoaWxkIOKAlCBpdCByZXR1cm5zIHRvIHRoZSBhZ2VudCBsb29wIHRoZVxuICAvLyBtb21lbnQgdGhlIGRyaXZlcidzIGBzY2hlZHVsZSgpYCByZXR1cm5zIChwYXNzaXZlIHJlY29yZGVyIHJ1bGUpLlxuICAvL1xuICAvLyBgJGRldGFjaEFuZEZvcmdldChkcml2ZXIsIGNoaWxkLCBpbnB1dD8pYCBkaXNjYXJkcyB0aGUgaGFuZGxlIOKAlFxuICAvLyB1c2VmdWwgZm9yIGZpcmUtYW5kLWZvcmdldCB0ZWxlbWV0cnkgd2hlcmUgdGhlIGNhbGxlciBuZXZlciBuZWVkc1xuICAvLyB0byBrbm93IGhvdyB0aGUgY2hpbGQgZmluaXNoZWQuIEVycm9ycyBzdGlsbCBsYW5kIG9uIHRoZSAobm93LVxuICAvLyBkcm9wcGVkKSBoYW5kbGUgYW5kIGdvIHNpbGVudCB1bmxlc3MgYW4gb2JzZXJ2ZXIgc3VyZmFjZXMgdGhlbS5cbiAgLy9cbiAgLy8gRHJpdmVyIGlzIFJFUVVJUkVEIOKAlCB0aGVyZSdzIG5vIGxpYnJhcnktZGVmYXVsdC4gUGFzcyBlLmcuXG4gIC8vIGBtaWNyb3Rhc2tCYXRjaERyaXZlcmAgKGZyb20gJ2Zvb3RwcmludGpzL2RldGFjaCcpIG9yIHlvdXIgb3duXG4gIC8vIGN1c3RvbSBkcml2ZXIuIEV4cGxpY2l0IHBhc3NpbmcgYXZvaWRzIGdsb2JhbCBzdGF0ZSBhbmQga2VlcHMgdGhlXG4gIC8vIGVuZ2luZSBmcmVlIG9mIGRyaXZlciBpbXBvcnRzLlxuICAkZGV0YWNoQW5kSm9pbkxhdGVyKFxuICAgIGRyaXZlcjogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hEcml2ZXIsXG4gICAgY2hpbGQ6IGltcG9ydCgnLi4vYnVpbGRlci90eXBlcy5qcycpLkZsb3dDaGFydCxcbiAgICBpbnB1dD86IHVua25vd24sXG4gICk6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoSGFuZGxlO1xuXG4gICRkZXRhY2hBbmRGb3JnZXQoXG4gICAgZHJpdmVyOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaERyaXZlcixcbiAgICBjaGlsZDogaW1wb3J0KCcuLi9idWlsZGVyL3R5cGVzLmpzJykuRmxvd0NoYXJ0LFxuICAgIGlucHV0PzogdW5rbm93bixcbiAgKTogdm9pZDtcblxuICAvLyBQaXBlbGluZSBjb250cm9sXG4gIC8qKlxuICAgKiBTdG9wIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBjb250ZXh0LlxuICAgKlxuICAgKiAtICoqSW4gYSB0b3AtbGV2ZWwgY2hhcnQ6KiogdGhlIHRyYXZlcnNlciBleGl0cyBjbGVhbmx5IGFmdGVyIHRoaXMgc3RhZ2VcbiAgICogICBjb21wbGV0ZXMuXG4gICAqIC0gKipJbnNpZGUgYSBzdWJmbG93OioqIGJ5IGRlZmF1bHQsIG9ubHkgdGhlIHN1YmZsb3cncyBvd24gZXhlY3V0aW9uXG4gICAqICAgc3RvcHM7IGNvbnRyb2wgcmV0dXJucyB0byB0aGUgcGFyZW50IGFzIG5vcm1hbC4gSWYgdGhlIHN1YmZsb3cgaXNcbiAgICogICBtb3VudGVkIHdpdGggYHByb3BhZ2F0ZUJyZWFrOiB0cnVlYCwgdGhlIGJyZWFrIHNpZ25hbCAoYW5kIGl0c1xuICAgKiAgIG9wdGlvbmFsIHJlYXNvbikgcHJvcGFnYXRlcyB1cCB0byB0aGUgcGFyZW50IHNjb3BlLCB0ZXJtaW5hdGluZyB0aGVcbiAgICogICBvdXRlciBsb29wIHRvby4gU2VlIGBTdWJmbG93TW91bnRPcHRpb25zLnByb3BhZ2F0ZUJyZWFrYC5cbiAgICpcbiAgICogQHBhcmFtIHJlYXNvbiAtIE9wdGlvbmFsIGZyZWUtZm9ybSBzdHJpbmcgZGVzY3JpYmluZyB3aHkgdGhlIGJyZWFrXG4gICAqICAgaGFwcGVuZWQuIFByb3BhZ2F0ZXMgdG8gYEZsb3dCcmVha0V2ZW50LnJlYXNvbmAgc28gcmVjb3JkZXJzIGFuZFxuICAgKiAgIGN1c3RvbSBuYXJyYXRpdmVzIGNhbiBzdXJmYWNlIGl0LiBEZWZhdWx0cyB0byB1bmRlZmluZWQuXG4gICAqL1xuICAkYnJlYWsocmVhc29uPzogc3RyaW5nKTogdm9pZDtcblxuICAvLyBFc2NhcGUgaGF0Y2ggLS0gdW53cmFwIHRvIHVuZGVybHlpbmcgUmVhY3RpdmVUYXJnZXRcbiAgJHRvUmF3KCk6IFJlYWN0aXZlVGFyZ2V0O1xufVxuXG4vLyAtLSBUeXBlZFNjb3BlPFQ+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUaGUgY29uc3VtZXItZmFjaW5nIHR5cGUuIFQgaXMgdGhlIHVzZXIncyBzdGF0ZSBpbnRlcmZhY2UuXG4vLyBQcm9wZXJ0eSBhY2Nlc3MgaXMgdHlwZWQ7ICQtbWV0aG9kcyBwcm92aWRlIGVzY2FwZSBoYXRjaGVzLlxuXG5leHBvcnQgdHlwZSBUeXBlZFNjb3BlPFQgZXh0ZW5kcyBvYmplY3QgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPSBUICYgU2NvcGVNZXRob2RzO1xuXG4vLyAtLSBSZWFjdGl2ZU9wdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb25maWd1cmF0aW9uIHBhc3NlZCB0byBjcmVhdGVUeXBlZFNjb3BlLlxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWN0aXZlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBQaXBlbGluZSBicmVhayBmdW5jdGlvbiDigJQgaW5qZWN0ZWQgYnkgU3RhZ2VSdW5uZXIgYWZ0ZXIgc2NvcGUgY3JlYXRpb24uXG4gICAqIEFjY2VwdHMgYW4gb3B0aW9uYWwgcmVhc29uIHN0cmluZyB0aGF0IHByb3BhZ2F0ZXMgdG8gYEZsb3dCcmVha0V2ZW50YFxuICAgKiBhbmQgKHdoZW4gYHByb3BhZ2F0ZUJyZWFrYCBpcyBzZXQgb24gYSBtb3VudCkgdXAgdG8gdGhlIHBhcmVudCBzY29wZS5cbiAgICovXG4gIGJyZWFrUGlwZWxpbmU/OiAocmVhc29uPzogc3RyaW5nKSA9PiB2b2lkO1xufVxuXG4vLyAtLSBJbnRlcm5hbDogJC1tZXRob2QgbmFtZSBzZXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBVc2VkIGJ5IHRoZSBQcm94eSBnZXQgdHJhcCB0byBkaXN0aW5ndWlzaCAkLW1ldGhvZHMgZnJvbSBzdGF0ZSBrZXlzLlxuXG5leHBvcnQgY29uc3QgU0NPUEVfTUVUSE9EX05BTUVTID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgJyRnZXRWYWx1ZScsXG4gICckc2V0VmFsdWUnLFxuICAnJHVwZGF0ZScsXG4gICckZGVsZXRlJyxcbiAgJyRyZWFkJyxcbiAgJyRnZXRBcmdzJyxcbiAgJyRnZXRFbnYnLFxuICAnJGRlYnVnJyxcbiAgJyRsb2cnLFxuICAnJGVycm9yJyxcbiAgJyRtZXRyaWMnLFxuICAnJGV2YWwnLFxuICAnJGF0dGFjaFNjb3BlUmVjb3JkZXInLFxuICAnJGRldGFjaFNjb3BlUmVjb3JkZXInLFxuICAnJGdldFNjb3BlUmVjb3JkZXJzJyxcbiAgJyRiYXRjaEFycmF5JyxcbiAgJyRicmVhaycsXG4gICckZW1pdCcsXG4gICckZGV0YWNoQW5kSm9pbkxhdGVyJyxcbiAgJyRkZXRhY2hBbmRGb3JnZXQnLFxuICAnJHRvUmF3Jyxcbl0pO1xuXG4vLyAtLSBJbnRlcm5hbDogU3ltYm9sIGZvciBkZWZlcnJlZCBicmVhayBpbmplY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdGFnZVJ1bm5lciBzZXRzIHRoaXMgYWZ0ZXIgc2NvcGUgY3JlYXRpb24gc28gJGJyZWFrKCkgd29ya3MuXG4vLyBQcml2YXRlIFN5bWJvbCAobm90IFN5bWJvbC5mb3IpIHRvIHByZXZlbnQgY3Jvc3MtbW9kdWxlIHRhbXBlcmluZy5cblxuZXhwb3J0IGNvbnN0IEJSRUFLX1NFVFRFUiA9IFN5bWJvbCgnZm9vdHByaW50OnJlYWN0aXZlOnNldEJyZWFrJyk7XG5cbi8vIC0tIEludGVybmFsOiBTeW1ib2wgZm9yIFR5cGVkU2NvcGUgZGV0ZWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFVzZWQgYnkgU3RhZ2VSdW5uZXIgdG8gc2tpcCBjcmVhdGVQcm90ZWN0ZWRTY29wZSBmb3IgVHlwZWRTY29wZSBpbnN0YW5jZXMuXG4vLyBQcml2YXRlIFN5bWJvbCBwcmV2ZW50cyBzdHJpbmctdGFnIHNwb29maW5nLlxuXG5leHBvcnQgY29uc3QgSVNfVFlQRURfU0NPUEUgPSBTeW1ib2woJ2Zvb3RwcmludDpyZWFjdGl2ZTppc1R5cGVkU2NvcGUnKTtcblxuLy8gLS0gSW50ZXJuYWw6IGV4ZWN1dG9yIG1ldGhvZCBhbGxvd2xpc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2NvcGVGYWNhZGUgbWV0aG9kcyBjYWxsZWQgYnkgRmxvd0NoYXJ0RXhlY3V0b3Igd3JhcHBpbmcgY29kZSBhbmQgU3RhZ2VSdW5uZXJcbi8vIFRIUk9VR0ggYSBUeXBlZFNjb3BlIHByb3h5LiBPbmx5IGFkZCBtZXRob2RzIHdpdGggY29uZmlybWVkIGNhbGwgc2l0ZXMuXG4vLyBTaGFyZWQgYmV0d2VlbiBjcmVhdGVUeXBlZFNjb3BlLnRzIGFuZCBTdGFnZVJ1bm5lci50cyB0byBwcmV2ZW50IGRyaWZ0LlxuXG5leHBvcnQgY29uc3QgRVhFQ1VUT1JfSU5URVJOQUxfTUVUSE9EUyA9IG5ldyBTZXQoW1xuICAnbm90aWZ5U3RhZ2VTdGFydCcsIC8vIFN0YWdlUnVubmVyLnJ1bigpIGxpbmUgNTlcbiAgJ25vdGlmeVN0YWdlRW5kJywgLy8gU3RhZ2VSdW5uZXIucnVuKCkgbGluZSA3OVxuICAnbm90aWZ5UGF1c2UnLCAvLyBTdGFnZVJ1bm5lci5ydW4oKSDigJQgcGF1c2UgZGV0ZWN0aW9uXG4gICdhdHRhY2hTY29wZVJlY29yZGVyJywgLy8gRmxvd0NoYXJ0RXhlY3V0b3IuY3JlYXRlVHJhdmVyc2VyKCkg4oCUIG5hcnJhdGl2ZSArIHVzZXIgcmVjb3JkZXJzXG4gICdkZXRhY2hTY29wZVJlY29yZGVyJywgLy8gRmxvd0NoYXJ0RXhlY3V0b3IuZGV0YWNoU2NvcGVSZWNvcmRlcigpXG4gICdnZXRTY29wZVJlY29yZGVycycsIC8vIEZsb3dDaGFydEV4ZWN1dG9yLmdldFNjb3BlUmVjb3JkZXJzKClcbiAgJ3VzZVNoYXJlZFJlZGFjdGVkS2V5cycsIC8vIEZsb3dDaGFydEV4ZWN1dG9yLmNyZWF0ZVRyYXZlcnNlcigpIOKAlCByZWRhY3Rpb24gd3JhcHBpbmdcbiAgJ3VzZVJlZGFjdGlvblBvbGljeScsIC8vIEZsb3dDaGFydEV4ZWN1dG9yLmNyZWF0ZVRyYXZlcnNlcigpIOKAlCByZWRhY3Rpb24gd3JhcHBpbmdcbl0pO1xuIl19
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BoundaryStateStore<TState> — concrete, composable per-boundary
|
|
3
|
+
* transient state storage.
|
|
4
|
+
*
|
|
5
|
+
* Pattern: COMPOSITION primitive. Concrete class — instantiate with
|
|
6
|
+
* `new BoundaryStateStore<TState>()` and own it as a field
|
|
7
|
+
* on your recorder. Replaces the abstract
|
|
8
|
+
* `BoundaryStateTracker<TState>` base class for the v5
|
|
9
|
+
* "one purpose per recorder" rule.
|
|
10
|
+
* Role: "What's the LIVE transient state of every currently-active
|
|
11
|
+
* boundary?" A boundary is a matched event pair `[start, stop]`
|
|
12
|
+
* bracketing an interval (e.g., `(llm_start, llm_end)`).
|
|
13
|
+
* Between the brackets, intermediate events evolve the
|
|
14
|
+
* boundary's state. On `stop`, the state clears.
|
|
15
|
+
*
|
|
16
|
+
* Algorithmically this is the **DFS bracket-sequence pattern** — the
|
|
17
|
+
* `active` map is the open-brackets stack at any moment.
|
|
18
|
+
*
|
|
19
|
+
* **Lifecycle contract — STRICT:** every `start(key, ...)` call MUST
|
|
20
|
+
* be paired with a `stop(key)` call. Failure to wire stop produces a
|
|
21
|
+
* memory leak: the active map grows without bound.
|
|
22
|
+
*
|
|
23
|
+
* **Concurrency / nesting:** concurrent boundaries (parallel branches
|
|
24
|
+
* with two LLM calls active at once) work correctly — each is keyed
|
|
25
|
+
* independently. Nested boundaries of DIFFERENT KINDS require
|
|
26
|
+
* SEPARATE store instances — one per kind.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* import { BoundaryStateStore } from 'footprintjs/trace';
|
|
31
|
+
* import type { CombinedRecorder, EmitEvent } from 'footprintjs';
|
|
32
|
+
*
|
|
33
|
+
* interface LLMLiveState { partial: string; tokens: number; }
|
|
34
|
+
*
|
|
35
|
+
* class LiveLLMTracker implements CombinedRecorder {
|
|
36
|
+
* readonly id = 'live-llm';
|
|
37
|
+
* private readonly store = new BoundaryStateStore<LLMLiveState>();
|
|
38
|
+
*
|
|
39
|
+
* onEmit(event: EmitEvent): void {
|
|
40
|
+
* if (event.name === 'agentfootprint.stream.llm_start') {
|
|
41
|
+
* this.store.start(event.runtimeStageId, { partial: '', tokens: 0 });
|
|
42
|
+
* } else if (event.name === 'agentfootprint.stream.llm_end') {
|
|
43
|
+
* this.store.stop(event.runtimeStageId);
|
|
44
|
+
* } else if (event.name === 'agentfootprint.stream.token') {
|
|
45
|
+
* this.store.update(event.runtimeStageId, (s) => ({
|
|
46
|
+
* partial: s.partial + (event.payload as { content: string }).content,
|
|
47
|
+
* tokens: s.tokens + 1,
|
|
48
|
+
* }));
|
|
49
|
+
* }
|
|
50
|
+
* }
|
|
51
|
+
*
|
|
52
|
+
* isInFlight(): boolean { return this.store.hasActive; }
|
|
53
|
+
* getPartial(rid: string): string {
|
|
54
|
+
* return this.store.get(rid)?.partial ?? '';
|
|
55
|
+
* }
|
|
56
|
+
*
|
|
57
|
+
* clear() { this.store.clear(); }
|
|
58
|
+
* }
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
import { isDevMode } from '../scope/detectCircular.js';
|
|
62
|
+
export class BoundaryStateStore {
|
|
63
|
+
/** Open-brackets stack: key → current transient state. */
|
|
64
|
+
active = new Map();
|
|
65
|
+
/** Per-key count of `update` calls that landed without a matching
|
|
66
|
+
* active boundary. Drives rate-limited dev-mode warnings so a
|
|
67
|
+
* stuck loop doesn't spam the console. */
|
|
68
|
+
missedUpdates = new Map();
|
|
69
|
+
/** Optional id for diagnostics — passed to dev-mode warnings so the
|
|
70
|
+
* source of the leak is easy to find when multiple stores coexist. */
|
|
71
|
+
diagnosticId;
|
|
72
|
+
constructor(diagnosticId = 'boundary-state-store') {
|
|
73
|
+
this.diagnosticId = diagnosticId;
|
|
74
|
+
}
|
|
75
|
+
// ── Mutators ─────────────────────────────────────────────────────────
|
|
76
|
+
/**
|
|
77
|
+
* Open a new boundary with initial transient state. If a boundary
|
|
78
|
+
* with the same `key` is already active, the prior state is
|
|
79
|
+
* overwritten (last-writer-wins). Dev mode warns — usually
|
|
80
|
+
* indicates a missed `stop` upstream.
|
|
81
|
+
*/
|
|
82
|
+
start(key, initial) {
|
|
83
|
+
if (this.active.has(key) && isDevMode()) {
|
|
84
|
+
console.warn(`[${this.diagnosticId}] start('${key}') called while an active boundary ` +
|
|
85
|
+
'already exists. Overwriting prior state — likely a missed stop upstream.');
|
|
86
|
+
}
|
|
87
|
+
this.active.set(key, initial);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Evolve the transient state of an active boundary using a pure
|
|
91
|
+
* updater function. Silent no-op if no boundary is active for `key`
|
|
92
|
+
* (defensive against out-of-order events). Dev mode logs a rate-
|
|
93
|
+
* limited warning.
|
|
94
|
+
*/
|
|
95
|
+
update(key, updater) {
|
|
96
|
+
const cur = this.active.get(key);
|
|
97
|
+
if (cur === undefined) {
|
|
98
|
+
if (isDevMode()) {
|
|
99
|
+
const n = (this.missedUpdates.get(key) ?? 0) + 1;
|
|
100
|
+
this.missedUpdates.set(key, n);
|
|
101
|
+
if (n === 1) {
|
|
102
|
+
console.warn(`[${this.diagnosticId}] update('${key}') — no active boundary. Update dropped.`);
|
|
103
|
+
}
|
|
104
|
+
else if (n === 10 || n === 100) {
|
|
105
|
+
console.warn(`[${this.diagnosticId}] update('${key}') — ${n} dropped updates. Wiring bug?`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
this.active.set(key, updater(cur));
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Close the boundary identified by `key` and return its FINAL
|
|
114
|
+
* transient state (so the consumer can do any cleanup — e.g., emit
|
|
115
|
+
* a snapshot to a SequenceStore for durable storage).
|
|
116
|
+
*/
|
|
117
|
+
stop(key) {
|
|
118
|
+
const final = this.active.get(key);
|
|
119
|
+
this.active.delete(key);
|
|
120
|
+
return final;
|
|
121
|
+
}
|
|
122
|
+
// ── Read (O(1)) ──────────────────────────────────────────────────────
|
|
123
|
+
/** Current transient state of ONE active boundary. `undefined` if no
|
|
124
|
+
* boundary is active for `key`. */
|
|
125
|
+
get(key) {
|
|
126
|
+
return this.active.get(key);
|
|
127
|
+
}
|
|
128
|
+
/** All currently-active boundaries.
|
|
129
|
+
*
|
|
130
|
+
* **Type-only readonly:** TypeScript prevents mutation through
|
|
131
|
+
* `ReadonlyMap`, but a runtime cast or non-TS consumer can mutate
|
|
132
|
+
* the underlying Map and corrupt state. Don't. */
|
|
133
|
+
getAll() {
|
|
134
|
+
return this.active;
|
|
135
|
+
}
|
|
136
|
+
/** True if any boundary is currently active. O(1). */
|
|
137
|
+
get hasActive() {
|
|
138
|
+
return this.active.size > 0;
|
|
139
|
+
}
|
|
140
|
+
/** Number of currently-active boundaries. O(1). */
|
|
141
|
+
get activeCount() {
|
|
142
|
+
return this.active.size;
|
|
143
|
+
}
|
|
144
|
+
// ── Lifecycle ────────────────────────────────────────────────────────
|
|
145
|
+
/**
|
|
146
|
+
* Reset all transient state. Called by recorder composers from
|
|
147
|
+
* their own `clear()` method, which the executor invokes before
|
|
148
|
+
* each run.
|
|
149
|
+
*
|
|
150
|
+
* Dev mode warns if any boundaries are still active when called —
|
|
151
|
+
* likely indicates a missed `stop` upstream. Leaked keys are listed
|
|
152
|
+
* (truncated to 10) so the wiring bug is findable.
|
|
153
|
+
*/
|
|
154
|
+
clear() {
|
|
155
|
+
if (this.active.size > 0 && isDevMode()) {
|
|
156
|
+
const keys = [...this.active.keys()];
|
|
157
|
+
const head = keys.slice(0, 10).join(', ');
|
|
158
|
+
const more = keys.length > 10 ? ` ...(+${keys.length - 10} more)` : '';
|
|
159
|
+
console.warn(`[${this.diagnosticId}] clear() called with ${this.active.size} ` +
|
|
160
|
+
'still-active boundaries. Missed stop? ' +
|
|
161
|
+
`Leaked keys: ${head}${more}`);
|
|
162
|
+
}
|
|
163
|
+
this.active.clear();
|
|
164
|
+
this.missedUpdates.clear();
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQm91bmRhcnlTdGF0ZVN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yZWNvcmRlci9Cb3VuZGFyeVN0YXRlU3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkRHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXZELE1BQU0sT0FBTyxrQkFBa0I7SUFDN0IsMERBQTBEO0lBQ3pDLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUVwRDs7K0NBRTJDO0lBQzFCLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUUzRDsyRUFDdUU7SUFDdEQsWUFBWSxDQUFTO0lBRXRDLFlBQVksWUFBWSxHQUFHLHNCQUFzQjtRQUMvQyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztJQUNuQyxDQUFDO0lBRUQsd0VBQXdFO0lBRXhFOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLEdBQVcsRUFBRSxPQUFlO1FBQ2hDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksU0FBUyxFQUFFLEVBQUUsQ0FBQztZQUN4QyxPQUFPLENBQUMsSUFBSSxDQUNWLElBQUksSUFBSSxDQUFDLFlBQVksWUFBWSxHQUFHLHFDQUFxQztnQkFDdkUsMEVBQTBFLENBQzdFLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxHQUFXLEVBQUUsT0FBaUM7UUFDbkQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7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dCI6WyIvKipcbiAqIEJvdW5kYXJ5U3RhdGVTdG9yZTxUU3RhdGU+IOKAlCBjb25jcmV0ZSwgY29tcG9zYWJsZSBwZXItYm91bmRhcnlcbiAqIHRyYW5zaWVudCBzdGF0ZSBzdG9yYWdlLlxuICpcbiAqIFBhdHRlcm46IENPTVBPU0lUSU9OIHByaW1pdGl2ZS4gQ29uY3JldGUgY2xhc3Mg4oCUIGluc3RhbnRpYXRlIHdpdGhcbiAqICAgICAgICAgIGBuZXcgQm91bmRhcnlTdGF0ZVN0b3JlPFRTdGF0ZT4oKWAgYW5kIG93biBpdCBhcyBhIGZpZWxkXG4gKiAgICAgICAgICBvbiB5b3VyIHJlY29yZGVyLiBSZXBsYWNlcyB0aGUgYWJzdHJhY3RcbiAqICAgICAgICAgIGBCb3VuZGFyeVN0YXRlVHJhY2tlcjxUU3RhdGU+YCBiYXNlIGNsYXNzIGZvciB0aGUgdjVcbiAqICAgICAgICAgIFwib25lIHB1cnBvc2UgcGVyIHJlY29yZGVyXCIgcnVsZS5cbiAqIFJvbGU6ICAgIFwiV2hhdCdzIHRoZSBMSVZFIHRyYW5zaWVudCBzdGF0ZSBvZiBldmVyeSBjdXJyZW50bHktYWN0aXZlXG4gKiAgICAgICAgICBib3VuZGFyeT9cIiBBIGJvdW5kYXJ5IGlzIGEgbWF0Y2hlZCBldmVudCBwYWlyIGBbc3RhcnQsIHN0b3BdYFxuICogICAgICAgICAgYnJhY2tldGluZyBhbiBpbnRlcnZhbCAoZS5nLiwgYChsbG1fc3RhcnQsIGxsbV9lbmQpYCkuXG4gKiAgICAgICAgICBCZXR3ZWVuIHRoZSBicmFja2V0cywgaW50ZXJtZWRpYXRlIGV2ZW50cyBldm9sdmUgdGhlXG4gKiAgICAgICAgICBib3VuZGFyeSdzIHN0YXRlLiBPbiBgc3RvcGAsIHRoZSBzdGF0ZSBjbGVhcnMuXG4gKlxuICogQWxnb3JpdGhtaWNhbGx5IHRoaXMgaXMgdGhlICoqREZTIGJyYWNrZXQtc2VxdWVuY2UgcGF0dGVybioqIOKAlCB0aGVcbiAqIGBhY3RpdmVgIG1hcCBpcyB0aGUgb3Blbi1icmFja2V0cyBzdGFjayBhdCBhbnkgbW9tZW50LlxuICpcbiAqICoqTGlmZWN5Y2xlIGNvbnRyYWN0IOKAlCBTVFJJQ1Q6KiogZXZlcnkgYHN0YXJ0KGtleSwgLi4uKWAgY2FsbCBNVVNUXG4gKiBiZSBwYWlyZWQgd2l0aCBhIGBzdG9wKGtleSlgIGNhbGwuIEZhaWx1cmUgdG8gd2lyZSBzdG9wIHByb2R1Y2VzIGFcbiAqIG1lbW9yeSBsZWFrOiB0aGUgYWN0aXZlIG1hcCBncm93cyB3aXRob3V0IGJvdW5kLlxuICpcbiAqICoqQ29uY3VycmVuY3kgLyBuZXN0aW5nOioqIGNvbmN1cnJlbnQgYm91bmRhcmllcyAocGFyYWxsZWwgYnJhbmNoZXNcbiAqIHdpdGggdHdvIExMTSBjYWxscyBhY3RpdmUgYXQgb25jZSkgd29yayBjb3JyZWN0bHkg4oCUIGVhY2ggaXMga2V5ZWRcbiAqIGluZGVwZW5kZW50bHkuIE5lc3RlZCBib3VuZGFyaWVzIG9mIERJRkZFUkVOVCBLSU5EUyByZXF1aXJlXG4gKiBTRVBBUkFURSBzdG9yZSBpbnN0YW5jZXMg4oCUIG9uZSBwZXIga2luZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQm91bmRhcnlTdGF0ZVN0b3JlIH0gZnJvbSAnZm9vdHByaW50anMvdHJhY2UnO1xuICogaW1wb3J0IHR5cGUgeyBDb21iaW5lZFJlY29yZGVyLCBFbWl0RXZlbnQgfSBmcm9tICdmb290cHJpbnRqcyc7XG4gKlxuICogaW50ZXJmYWNlIExMTUxpdmVTdGF0ZSB7IHBhcnRpYWw6IHN0cmluZzsgdG9rZW5zOiBudW1iZXI7IH1cbiAqXG4gKiBjbGFzcyBMaXZlTExNVHJhY2tlciBpbXBsZW1lbnRzIENvbWJpbmVkUmVjb3JkZXIge1xuICogICByZWFkb25seSBpZCA9ICdsaXZlLWxsbSc7XG4gKiAgIHByaXZhdGUgcmVhZG9ubHkgc3RvcmUgPSBuZXcgQm91bmRhcnlTdGF0ZVN0b3JlPExMTUxpdmVTdGF0ZT4oKTtcbiAqXG4gKiAgIG9uRW1pdChldmVudDogRW1pdEV2ZW50KTogdm9pZCB7XG4gKiAgICAgaWYgKGV2ZW50Lm5hbWUgPT09ICdhZ2VudGZvb3RwcmludC5zdHJlYW0ubGxtX3N0YXJ0Jykge1xuICogICAgICAgdGhpcy5zdG9yZS5zdGFydChldmVudC5ydW50aW1lU3RhZ2VJZCwgeyBwYXJ0aWFsOiAnJywgdG9rZW5zOiAwIH0pO1xuICogICAgIH0gZWxzZSBpZiAoZXZlbnQubmFtZSA9PT0gJ2FnZW50Zm9vdHByaW50LnN0cmVhbS5sbG1fZW5kJykge1xuICogICAgICAgdGhpcy5zdG9yZS5zdG9wKGV2ZW50LnJ1bnRpbWVTdGFnZUlkKTtcbiAqICAgICB9IGVsc2UgaWYgKGV2ZW50Lm5hbWUgPT09ICdhZ2VudGZvb3RwcmludC5zdHJlYW0udG9rZW4nKSB7XG4gKiAgICAgICB0aGlzLnN0b3JlLnVwZGF0ZShldmVudC5ydW50aW1lU3RhZ2VJZCwgKHMpID0+ICh7XG4gKiAgICAgICAgIHBhcnRpYWw6IHMucGFydGlhbCArIChldmVudC5wYXlsb2FkIGFzIHsgY29udGVudDogc3RyaW5nIH0pLmNvbnRlbnQsXG4gKiAgICAgICAgIHRva2Vuczogcy50b2tlbnMgKyAxLFxuICogICAgICAgfSkpO1xuICogICAgIH1cbiAqICAgfVxuICpcbiAqICAgaXNJbkZsaWdodCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuc3RvcmUuaGFzQWN0aXZlOyB9XG4gKiAgIGdldFBhcnRpYWwocmlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICogICAgIHJldHVybiB0aGlzLnN0b3JlLmdldChyaWQpPy5wYXJ0aWFsID8/ICcnO1xuICogICB9XG4gKlxuICogICBjbGVhcigpIHsgdGhpcy5zdG9yZS5jbGVhcigpOyB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICcuLi9zY29wZS9kZXRlY3RDaXJjdWxhci5qcyc7XG5cbmV4cG9ydCBjbGFzcyBCb3VuZGFyeVN0YXRlU3RvcmU8VFN0YXRlPiB7XG4gIC8qKiBPcGVuLWJyYWNrZXRzIHN0YWNrOiBrZXkg4oaSIGN1cnJlbnQgdHJhbnNpZW50IHN0YXRlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2ZSA9IG5ldyBNYXA8c3RyaW5nLCBUU3RhdGU+KCk7XG5cbiAgLyoqIFBlci1rZXkgY291bnQgb2YgYHVwZGF0ZWAgY2FsbHMgdGhhdCBsYW5kZWQgd2l0aG91dCBhIG1hdGNoaW5nXG4gICAqICBhY3RpdmUgYm91bmRhcnkuIERyaXZlcyByYXRlLWxpbWl0ZWQgZGV2LW1vZGUgd2FybmluZ3Mgc28gYVxuICAgKiAgc3R1Y2sgbG9vcCBkb2Vzbid0IHNwYW0gdGhlIGNvbnNvbGUuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbWlzc2VkVXBkYXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbiAgLyoqIE9wdGlvbmFsIGlkIGZvciBkaWFnbm9zdGljcyDigJQgcGFzc2VkIHRvIGRldi1tb2RlIHdhcm5pbmdzIHNvIHRoZVxuICAgKiAgc291cmNlIG9mIHRoZSBsZWFrIGlzIGVhc3kgdG8gZmluZCB3aGVuIG11bHRpcGxlIHN0b3JlcyBjb2V4aXN0LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGRpYWdub3N0aWNJZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRpYWdub3N0aWNJZCA9ICdib3VuZGFyeS1zdGF0ZS1zdG9yZScpIHtcbiAgICB0aGlzLmRpYWdub3N0aWNJZCA9IGRpYWdub3N0aWNJZDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBNdXRhdG9ycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogT3BlbiBhIG5ldyBib3VuZGFyeSB3aXRoIGluaXRpYWwgdHJhbnNpZW50IHN0YXRlLiBJZiBhIGJvdW5kYXJ5XG4gICAqIHdpdGggdGhlIHNhbWUgYGtleWAgaXMgYWxyZWFkeSBhY3RpdmUsIHRoZSBwcmlvciBzdGF0ZSBpc1xuICAgKiBvdmVyd3JpdHRlbiAobGFzdC13cml0ZXItd2lucykuIERldiBtb2RlIHdhcm5zIOKAlCB1c3VhbGx5XG4gICAqIGluZGljYXRlcyBhIG1pc3NlZCBgc3RvcGAgdXBzdHJlYW0uXG4gICAqL1xuICBzdGFydChrZXk6IHN0cmluZywgaW5pdGlhbDogVFN0YXRlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWN0aXZlLmhhcyhrZXkpICYmIGlzRGV2TW9kZSgpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbJHt0aGlzLmRpYWdub3N0aWNJZH1dIHN0YXJ0KCcke2tleX0nKSBjYWxsZWQgd2hpbGUgYW4gYWN0aXZlIGJvdW5kYXJ5IGAgK1xuICAgICAgICAgICdhbHJlYWR5IGV4aXN0cy4gT3ZlcndyaXRpbmcgcHJpb3Igc3RhdGUg4oCUIGxpa2VseSBhIG1pc3NlZCBzdG9wIHVwc3RyZWFtLicsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZS5zZXQoa2V5LCBpbml0aWFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdm9sdmUgdGhlIHRyYW5zaWVudCBzdGF0ZSBvZiBhbiBhY3RpdmUgYm91bmRhcnkgdXNpbmcgYSBwdXJlXG4gICAqIHVwZGF0ZXIgZnVuY3Rpb24uIFNpbGVudCBuby1vcCBpZiBubyBib3VuZGFyeSBpcyBhY3RpdmUgZm9yIGBrZXlgXG4gICAqIChkZWZlbnNpdmUgYWdhaW5zdCBvdXQtb2Ytb3JkZXIgZXZlbnRzKS4gRGV2IG1vZGUgbG9ncyBhIHJhdGUtXG4gICAqIGxpbWl0ZWQgd2FybmluZy5cbiAgICovXG4gIHVwZGF0ZShrZXk6IHN0cmluZywgdXBkYXRlcjogKHByZXY6IFRTdGF0ZSkgPT4gVFN0YXRlKTogdm9pZCB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5hY3RpdmUuZ2V0KGtleSk7XG4gICAgaWYgKGN1ciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgY29uc3QgbiA9ICh0aGlzLm1pc3NlZFVwZGF0ZXMuZ2V0KGtleSkgPz8gMCkgKyAxO1xuICAgICAgICB0aGlzLm1pc3NlZFVwZGF0ZXMuc2V0KGtleSwgbik7XG4gICAgICAgIGlmIChuID09PSAxKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbJHt0aGlzLmRpYWdub3N0aWNJZH1dIHVwZGF0ZSgnJHtrZXl9Jykg4oCUIG5vIGFjdGl2ZSBib3VuZGFyeS4gVXBkYXRlIGRyb3BwZWQuYCk7XG4gICAgICAgIH0gZWxzZSBpZiAobiA9PT0gMTAgfHwgbiA9PT0gMTAwKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbJHt0aGlzLmRpYWdub3N0aWNJZH1dIHVwZGF0ZSgnJHtrZXl9Jykg4oCUICR7bn0gZHJvcHBlZCB1cGRhdGVzLiBXaXJpbmcgYnVnP2ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlLnNldChrZXksIHVwZGF0ZXIoY3VyKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIGJvdW5kYXJ5IGlkZW50aWZpZWQgYnkgYGtleWAgYW5kIHJldHVybiBpdHMgRklOQUxcbiAgICogdHJhbnNpZW50IHN0YXRlIChzbyB0aGUgY29uc3VtZXIgY2FuIGRvIGFueSBjbGVhbnVwIOKAlCBlLmcuLCBlbWl0XG4gICAqIGEgc25hcHNob3QgdG8gYSBTZXF1ZW5jZVN0b3JlIGZvciBkdXJhYmxlIHN0b3JhZ2UpLlxuICAgKi9cbiAgc3RvcChrZXk6IHN0cmluZyk6IFRTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZmluYWwgPSB0aGlzLmFjdGl2ZS5nZXQoa2V5KTtcbiAgICB0aGlzLmFjdGl2ZS5kZWxldGUoa2V5KTtcbiAgICByZXR1cm4gZmluYWw7XG4gIH1cblxuICAvLyDilIDilIAgUmVhZCAoTygxKSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEN1cnJlbnQgdHJhbnNpZW50IHN0YXRlIG9mIE9ORSBhY3RpdmUgYm91bmRhcnkuIGB1bmRlZmluZWRgIGlmIG5vXG4gICAqICBib3VuZGFyeSBpcyBhY3RpdmUgZm9yIGBrZXlgLiAqL1xuICBnZXQoa2V5OiBzdHJpbmcpOiBUU3RhdGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZS5nZXQoa2V5KTtcbiAgfVxuXG4gIC8qKiBBbGwgY3VycmVudGx5LWFjdGl2ZSBib3VuZGFyaWVzLlxuICAgKlxuICAgKiAgKipUeXBlLW9ubHkgcmVhZG9ubHk6KiogVHlwZVNjcmlwdCBwcmV2ZW50cyBtdXRhdGlvbiB0aHJvdWdoXG4gICAqICBgUmVhZG9ubHlNYXBgLCBidXQgYSBydW50aW1lIGNhc3Qgb3Igbm9uLVRTIGNvbnN1bWVyIGNhbiBtdXRhdGVcbiAgICogIHRoZSB1bmRlcmx5aW5nIE1hcCBhbmQgY29ycnVwdCBzdGF0ZS4gRG9uJ3QuICovXG4gIGdldEFsbCgpOiBSZWFkb25seU1hcDxzdHJpbmcsIFRTdGF0ZT4ge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZTtcbiAgfVxuXG4gIC8qKiBUcnVlIGlmIGFueSBib3VuZGFyeSBpcyBjdXJyZW50bHkgYWN0aXZlLiBPKDEpLiAqL1xuICBnZXQgaGFzQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZS5zaXplID4gMDtcbiAgfVxuXG4gIC8qKiBOdW1iZXIgb2YgY3VycmVudGx5LWFjdGl2ZSBib3VuZGFyaWVzLiBPKDEpLiAqL1xuICBnZXQgYWN0aXZlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmUuc2l6ZTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJlc2V0IGFsbCB0cmFuc2llbnQgc3RhdGUuIENhbGxlZCBieSByZWNvcmRlciBjb21wb3NlcnMgZnJvbVxuICAgKiB0aGVpciBvd24gYGNsZWFyKClgIG1ldGhvZCwgd2hpY2ggdGhlIGV4ZWN1dG9yIGludm9rZXMgYmVmb3JlXG4gICAqIGVhY2ggcnVuLlxuICAgKlxuICAgKiBEZXYgbW9kZSB3YXJucyBpZiBhbnkgYm91bmRhcmllcyBhcmUgc3RpbGwgYWN0aXZlIHdoZW4gY2FsbGVkIOKAlFxuICAgKiBsaWtlbHkgaW5kaWNhdGVzIGEgbWlzc2VkIGBzdG9wYCB1cHN0cmVhbS4gTGVha2VkIGtleXMgYXJlIGxpc3RlZFxuICAgKiAodHJ1bmNhdGVkIHRvIDEwKSBzbyB0aGUgd2lyaW5nIGJ1ZyBpcyBmaW5kYWJsZS5cbiAgICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjdGl2ZS5zaXplID4gMCAmJiBpc0Rldk1vZGUoKSkge1xuICAgICAgY29uc3Qga2V5cyA9IFsuLi50aGlzLmFjdGl2ZS5rZXlzKCldO1xuICAgICAgY29uc3QgaGVhZCA9IGtleXMuc2xpY2UoMCwgMTApLmpvaW4oJywgJyk7XG4gICAgICBjb25zdCBtb3JlID0ga2V5cy5sZW5ndGggPiAxMCA/IGAgLi4uKCske2tleXMubGVuZ3RoIC0gMTB9IG1vcmUpYCA6ICcnO1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgWyR7dGhpcy5kaWFnbm9zdGljSWR9XSBjbGVhcigpIGNhbGxlZCB3aXRoICR7dGhpcy5hY3RpdmUuc2l6ZX0gYCArXG4gICAgICAgICAgJ3N0aWxsLWFjdGl2ZSBib3VuZGFyaWVzLiBNaXNzZWQgc3RvcD8gJyArXG4gICAgICAgICAgYExlYWtlZCBrZXlzOiAke2hlYWR9JHttb3JlfWAsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZS5jbGVhcigpO1xuICAgIHRoaXMubWlzc2VkVXBkYXRlcy5jbGVhcigpO1xuICB9XG59XG4iXX0=
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*
|
|
5
5
|
* **Mental model — observers vs. bookkeepers:**
|
|
6
6
|
*
|
|
7
|
-
* `
|
|
7
|
+
* `ScopeRecorder` / `FlowRecorder` / `EmitRecorder` / `CombinedRecorder`
|
|
8
8
|
* are OBSERVER interfaces — they describe how a recorder hears
|
|
9
9
|
* events from the executor.
|
|
10
10
|
*
|
|
@@ -57,8 +57,8 @@
|
|
|
57
57
|
* - Aggregations across the whole run (totals, counts) — those are
|
|
58
58
|
* `SequenceRecorder.aggregate()` / `KeyedRecorder.aggregate()`.
|
|
59
59
|
*
|
|
60
|
-
* - Stage-level concerns — those use `
|
|
61
|
-
* `
|
|
60
|
+
* - Stage-level concerns — those use `ScopeRecorder.onStageStart` /
|
|
61
|
+
* `ScopeRecorder.onStageEnd`. This primitive operates at finer
|
|
62
62
|
* granularity (events emitted DURING a stage execution).
|
|
63
63
|
*
|
|
64
64
|
* **Lifecycle contract — STRICT:**
|
|
@@ -260,4 +260,4 @@ export class BoundaryStateTracker {
|
|
|
260
260
|
this.missedUpdates.clear();
|
|
261
261
|
}
|
|
262
262
|
}
|
|
263
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQm91bmRhcnlTdGF0ZVRyYWNrZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL0JvdW5kYXJ5U3RhdGVUcmFja2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnSkc7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFdkQsTUFBTSxPQUFnQixvQkFBb0I7SUFJeEMsMERBQTBEO0lBQ3pDLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUVwRDs7b0RBRWdEO0lBQy9CLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUUzRCx1RUFBdUU7SUFFdkU7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNPLGFBQWEsQ0FBQyxHQUFXLEVBQUUsT0FBZTtRQUNsRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFNBQVMsRUFBRSxFQUFFLENBQUM7WUFDeEMsT0FBTyxDQUFDLElBQUksQ0FDVixJQUFJLElBQUksQ0FBQyxFQUFFLG9CQUFvQixHQUFHLHFEQUFxRDtnQkFDckYsa0VBQWtFLENBQ3JFLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNPLGNBQWMsQ0FBQyxHQUFXLEVBQUUsT0FBaUM7UUFDckUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakMsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdEIsSUFBSSxTQUFTLEVBQUUsRUFBRSxDQUFDO2dCQUNoQixNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDakQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDWixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUscUJBQXFCLEdBQUcsMENBQTBDLENBQUMsQ0FBQztnQkFDOUYsQ0FBQztxQkFBTSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO29CQUNqQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUscUJBQXFCLEdBQUcsUUFBUSxDQUFDLCtCQUErQixDQUFDLENBQUM7Z0JBQzVGLENBQUM7WUFDSCxDQUFDO1lBQ0QsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDTyxZQUFZLENBQUMsR0FBVztRQUNoQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxzRUFBc0U7SUFFdEU7d0NBQ29DO0lBQ3BDLFNBQVMsQ0FBQyxHQUFXO1FBQ25CLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxzREFBc0Q7SUFDdEQsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELG1EQUFtRDtJQUNuRCxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQzFCLENBQUM7SUFFRCx1RUFBdUU7SUFFdkU7Ozs7Ozs7O09BUUc7SUFDSCxLQUFLO1FBQ0gsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksU0FBUyxFQUFFLEVBQUUsQ0FBQztZQUN4QyxNQUFNLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdkUsT0FBTyxDQUFDLElBQUksQ0FDVixJQUFJLElBQUksQ0FBQyxFQUFFLHlCQUF5QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRztnQkFDckQsZ0RBQWdEO2dCQUNoRCxnQkFBZ0IsSUFBSSxHQUFHLElBQUksRUFBRSxDQUNoQyxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM3QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJvdW5kYXJ5U3RhdGVUcmFja2VyPFRTdGF0ZT4g4oCUIHRoaXJkIHN0b3JhZ2UgcHJpbWl0aXZlIG9uIHRoZSByZWNvcmRlclxuICogc2hlbGYsIGFsb25nc2lkZSBgU2VxdWVuY2VSZWNvcmRlcjxUPmAgYW5kIGBLZXllZFJlY29yZGVyPFQ+YC5cbiAqXG4gKiAqKk1lbnRhbCBtb2RlbCDigJQgb2JzZXJ2ZXJzIHZzLiBib29ra2VlcGVyczoqKlxuICpcbiAqICAgYFJlY29yZGVyYCAvIGBGbG93UmVjb3JkZXJgIC8gYEVtaXRSZWNvcmRlcmAgLyBgQ29tYmluZWRSZWNvcmRlcmBcbiAqICAgICBhcmUgT0JTRVJWRVIgaW50ZXJmYWNlcyDigJQgdGhleSBkZXNjcmliZSBob3cgYSByZWNvcmRlciBoZWFyc1xuICogICAgIGV2ZW50cyBmcm9tIHRoZSBleGVjdXRvci5cbiAqXG4gKiAgIGBTZXF1ZW5jZVJlY29yZGVyPFQ+YCAvIGBLZXllZFJlY29yZGVyPFQ+YCAvIGBCb3VuZGFyeVN0YXRlVHJhY2tlcjxUU3RhdGU+YFxuICogICAgIGFyZSBTVE9SQUdFIHByaW1pdGl2ZXMg4oCUIHRocmVlIGRpZmZlcmVudCBib29ra2VlcGluZyBzaGVsdmVzIHdpdGhcbiAqICAgICBkaWZmZXJlbnQgZHVyYWJpbGl0eSBhbmQgaW5kZXhpbmcgcHJvcGVydGllcy4gQSByZWFsIHJlY29yZGVyXG4gKiAgICAgY2xhc3MgdHlwaWNhbGx5IHBpY2tzIE9ORSBvYnNlcnZlciBpbnRlcmZhY2UgQU5EIE9ORSBzdG9yYWdlXG4gKiAgICAgc2hlbGYsIGNvbWJpbmluZyB0aGVtIHZpYSBgZXh0ZW5kcyArIGltcGxlbWVudHNgLlxuICpcbiAqICoqV2hhdCB0aGlzIHByaW1pdGl2ZSBhbnN3ZXJzOioqIFwiQXQgYW55IG1vbWVudCBkdXJpbmcgdGhlIHJ1biwgd2hhdFxuICogaXMgdGhlIExJVkUgdHJhbnNpZW50IHN0YXRlIG9mIGV2ZXJ5IGN1cnJlbnRseS1hY3RpdmUgYm91bmRhcnk/XCJcbiAqXG4gKiBBIFwiYm91bmRhcnlcIiBpcyBhIG1hdGNoZWQgZXZlbnQgcGFpciBgW3N0YXJ0LCBzdG9wXWAgYnJhY2tldGluZyBhblxuICogaW50ZXJ2YWwg4oCUIGZvciBleGFtcGxlLCBgKGxsbV9zdGFydCwgbGxtX2VuZClgIGZvciBhbiBMTE0gY2FsbCxcbiAqIGAodG9vbF9zdGFydCwgdG9vbF9lbmQpYCBmb3IgdG9vbCBleGVjdXRpb24sIGAodHVybl9zdGFydCwgdHVybl9lbmQpYFxuICogZm9yIGFuIGFnZW50IHR1cm4uIEJldHdlZW4gdGhlIGJyYWNrZXRzLCBpbnRlcm1lZGlhdGUgZXZlbnRzIGV2b2x2ZVxuICogdGhlIGJvdW5kYXJ5J3Mgc3RhdGUgKHRva2VuIGNodW5rcyBhY2N1bXVsYXRpbmcgaW50byBhIHBhcnRpYWxcbiAqIGFuc3dlciwgYXJncyBzdHJlYW1pbmcgaW4sIGV0Yy4pLiBPbiBgc3RvcGAsIHRoZSBzdGF0ZSBjbGVhcnMuXG4gKlxuICogQWxnb3JpdGhtaWNhbGx5IHRoaXMgaXMgdGhlICoqREZTIGJyYWNrZXQtc2VxdWVuY2UgcGF0dGVybioqIOKAlFxuICogc3RhY2stZnJhbWUgc3RhdGUgZHVyaW5nIGEgZ3JhcGgtdHJhdmVyc2FsIGludGVydmFsLiBTYW1lIHNoYXBlIHVzZWRcbiAqIGJ5IFRhcmphbidzIFNDQyBhbGdvcml0aG0sIHRyZWUgZGVjb21wb3NpdGlvbiwgYW5kIHB1c2gtZG93blxuICogYXV0b21hdGEuIFRoZSBgYWN0aXZlYCBtYXAgaXMgdGhlIG9wZW4tYnJhY2tldHMgc3RhY2sgYXQgYW55IG1vbWVudC5cbiAqXG4gKiAqKkNvbXBhcmlzb24gd2l0aCB0aGUgb3RoZXIgc3RvcmFnZSBwcmltaXRpdmVzOioqXG4gKlxuICogfCBQcmltaXRpdmUgICAgICAgICAgICAgICAgICAgICAgIHwgU3RvcmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGltZSBzY29wZSAgICAgICAgICB8IE1lbW9yeSAgICAgIHxcbiAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18XG4gKiB8IGBTZXF1ZW5jZVJlY29yZGVyPFQ+YCAgICAgICAgICAgfCBhcHBlbmQtb25seSBvcmRlcmVkICsga2V5ZWQgZW50cmllcyAgfCBkdXJhYmxlIGFjcm9zcyBydW4gIHwgTyhOIGV2ZW50cykgfFxuICogfCBgS2V5ZWRSZWNvcmRlcjxUPmAgICAgICAgICAgICAgIHwgMToxIGVudHJ5IHBlciBgcnVudGltZVN0YWdlSWRgICAgICAgIHwgZHVyYWJsZSBhY3Jvc3MgcnVuICB8IE8oTiBzdGVwcykgIHxcbiAqIHwgYEJvdW5kYXJ5U3RhdGVUcmFja2VyPFRTdGF0ZT5gICB8IHRyYW5zaWVudCBicmFja2V0LXNjb3BlZCBzdGF0ZSAgICAgICB8IGxpdmU7IGNsZWFycyBvbiBzdG9wIHwgTyhLIGFjdGl2ZSkgfFxuICpcbiAqICoqV2hlbiB0byBwaWNrIHdoaWNoOioqXG4gKlxuICogICAtIFwiSSBuZWVkIHRvIGtlZXAgYSBwZXJtYW5lbnQgbG9nIG9mIGV2ZXJ5IGV2ZW50IGZvciB0aW1lLXRyYXZlbFwiXG4gKiAgICAgIOKGkiBgU2VxdWVuY2VSZWNvcmRlcjxUPmBcbiAqICAgLSBcIkkgd2FudCBvbmUgZHVyYWJsZSByZWNvcmQgcGVyIHN0YWdlIGV4ZWN1dGlvbiAoZS5nLiwgbWV0cmljcylcIlxuICogICAgICDihpIgYEtleWVkUmVjb3JkZXI8VD5gXG4gKiAgIC0gXCJJIG5lZWQgdG8ga25vdyB3aGF0J3MgaGFwcGVuaW5nIFJJR0hUIE5PVyBpbnNpZGUgYW4gaW4tZmxpZ2h0XG4gKiAgICAgYm91bmRhcnkgKGUuZy4sIHBhcnRpYWwgTExNIHN0cmVhbSwgcGFydGlhbCB0b29sIGFyZ3MpXCJcbiAqICAgICAg4oaSIGBCb3VuZGFyeVN0YXRlVHJhY2tlcjxUU3RhdGU+YCAodGhpcyBjbGFzcylcbiAqXG4gKiAqKldoYXQgdGhpcyBpcyBOT1QgZm9yOioqXG4gKlxuICogICAtIFRpbWUtdHJhdmVsIHF1ZXJpZXMgKFwid2hhdCB3YXMgdGhlIHN0YXRlIGF0IHBhc3Qgc2xpZGVyIHN0ZXAgTj9cIilcbiAqICAgICDigJQgdHJhbnNpZW50IHN0YXRlIGNsZWFycyBvbiBzdG9wLiBGb3IgdGltZS10cmF2ZWwsIHNuYXBzaG90IHRoZVxuICogICAgIHN0YXRlIGF0IGVhY2ggZW1pdCBpbnRvIGEgc2VwYXJhdGUgYFNlcXVlbmNlUmVjb3JkZXI8VFN0YXRlPmAsXG4gKiAgICAgb3Igd2FpdCBmb3IgYSBmdXR1cmUgYEJvdW5kYXJ5U25hcHNob3RSZWNvcmRlcjxUU3RhdGU+YCBwcmltaXRpdmUuXG4gKlxuICogICAtIEFnZ3JlZ2F0aW9ucyBhY3Jvc3MgdGhlIHdob2xlIHJ1biAodG90YWxzLCBjb3VudHMpIOKAlCB0aG9zZSBhcmVcbiAqICAgICBgU2VxdWVuY2VSZWNvcmRlci5hZ2dyZWdhdGUoKWAgLyBgS2V5ZWRSZWNvcmRlci5hZ2dyZWdhdGUoKWAuXG4gKlxuICogICAtIFN0YWdlLWxldmVsIGNvbmNlcm5zIOKAlCB0aG9zZSB1c2UgYFJlY29yZGVyLm9uU3RhZ2VTdGFydGAgL1xuICogICAgIGBSZWNvcmRlci5vblN0YWdlRW5kYC4gVGhpcyBwcmltaXRpdmUgb3BlcmF0ZXMgYXQgZmluZXJcbiAqICAgICBncmFudWxhcml0eSAoZXZlbnRzIGVtaXR0ZWQgRFVSSU5HIGEgc3RhZ2UgZXhlY3V0aW9uKS5cbiAqXG4gKiAqKkxpZmVjeWNsZSBjb250cmFjdCDigJQgU1RSSUNUOioqXG4gKlxuICogICBFdmVyeSBgc3RhcnRCb3VuZGFyeShrZXksIC4uLilgIGNhbGwgTVVTVCBiZSBwYWlyZWQgd2l0aCBhXG4gKiAgIGBzdG9wQm91bmRhcnkoa2V5KWAgY2FsbC4gRmFpbHVyZSB0byB3aXJlIHRoZSBzdG9wIHNpZGUgcHJvZHVjZXMgYVxuICogICBtZW1vcnkgbGVhazogdGhlIGFjdGl2ZSBtYXAgZ3Jvd3Mgd2l0aG91dCBib3VuZCwgYW5kIGBnZXRBbGxBY3RpdmUoKWBcbiAqICAgcmV0dXJucyBzdGFsZSBlbnRyaWVzIHRoYXQgbG9vayBpbi1mbGlnaHQgYnV0IGFyZW4ndC4gQ29tbW9uIGNhdXNlOlxuICogICBzdWJjbGFzcyB3aXJlcyBgc3RhcnRgIHRvIG9uZSBldmVudCBoYW5kbGVyIGFuZCBmb3JnZXRzIHRvIHdpcmVcbiAqICAgYHN0b3BgLiAqKkFsd2F5cyB3aXJlIGJvdGggYXQgdGhlIHNhbWUgdGltZS4qKlxuICpcbiAqICAgRGV2IG1vZGUgKGBlbmFibGVEZXZNb2RlKClgKSBkZXRlY3RzIGxlYWtzIGF0IGBjbGVhcigpYCB0aW1lIOKAlFxuICogICB3YXJuaW5nIGluY2x1ZGVzIHRoZSBsZWFrZWQga2V5cyBzbyB5b3UgY2FuIGZpbmQgdGhlIG1pc3Npbmcgd2lyaW5nLlxuICpcbiAqICoqQ29uY3VycmVuY3kgLyBuZXN0aW5nOioqXG4gKlxuICogICAtIENvbmN1cnJlbnQgYm91bmRhcmllcyAocGFyYWxsZWwgYnJhbmNoZXMgd2l0aCB0d28gTExNIGNhbGxzXG4gKiAgICAgYWN0aXZlIGF0IG9uY2UpIHdvcmsgY29ycmVjdGx5OiBlYWNoIGlzIGtleWVkIGluZGVwZW5kZW50bHkgaW5cbiAqICAgICB0aGUgYWN0aXZlIG1hcC5cbiAqICAgLSBOZXN0ZWQgYm91bmRhcmllcyBvZiBESUZGRVJFTlQgS0lORFMgKEFnZW50IGJvdW5kYXJ5IGNvbnRhaW5zXG4gKiAgICAgTExNIGJvdW5kYXJ5KSByZXF1aXJlIFNFUEFSQVRFIHRyYWNrZXIgaW5zdGFuY2VzIOKAlCBvbmUgcGVyIGtpbmQuXG4gKiAgICAgVGhlIGJhc2UgY2xhc3MgdHJhY2tzIG9uZSBib3VuZGFyeSBraW5kIHBlciBpbnN0YW5jZS5cbiAqXG4gKiAqKktleSBjb252ZW50aW9uOioqXG4gKlxuICogICBUaGUgYGtleTogc3RyaW5nYCBpcyB3aGF0ZXZlciB5b3VyIHN1YmNsYXNzIHBpY2tzLiBDb252ZW50aW9uOlxuICogICB1c2UgYHJ1bnRpbWVTdGFnZUlkYCB3aGVuIHRoZSBib3VuZGFyeSBtYXBzIDE6MSB0byBhIHN0YWdlXG4gKiAgIGV4ZWN1dGlvbiDigJQgdGhpcyBnaXZlcyBmcmVlIGludGVyb3Agd2l0aCBgU2VxdWVuY2VSZWNvcmRlclxuICogICAuZ2V0RW50cmllc0ZvclN0ZXBgLCBgS2V5ZWRSZWNvcmRlci5nZXRCeUtleWAsIGBmaW5kQ29tbWl0YCAvXG4gKiAgIGBmaW5kTGFzdFdyaXRlcmAsIGFuZCB0aGUgcmVzdCBvZiB0aGUgdHJhY2UgZWNvc3lzdGVtLiBVc2UgYSBtb3JlXG4gKiAgIGdyYW51bGFyIGtleSAoZS5nLiwgYHRvb2xDYWxsSWRgKSBvbmx5IHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlXG4gKiAgIGNvbmN1cnJlbnQgYm91bmRhcmllcyBXSVRISU4gb25lIHN0YWdlIGV4ZWN1dGlvbi5cbiAqXG4gKiBAZXhhbXBsZSBCdWlsZCBhIGxpdmUgTExNIHRyYWNrZXIgKGNvbWJpbmluZyBzdG9yYWdlICsgb2JzZXJ2ZXIpOlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7XG4gKiAgIEJvdW5kYXJ5U3RhdGVUcmFja2VyLFxuICogICB0eXBlIENvbWJpbmVkUmVjb3JkZXIsXG4gKiAgIHR5cGUgRW1pdEV2ZW50LFxuICogfSBmcm9tICdmb290cHJpbnRqcyc7XG4gKlxuICogaW50ZXJmYWNlIExMTUxpdmVTdGF0ZSB7XG4gKiAgIHJlYWRvbmx5IHBhcnRpYWw6IHN0cmluZztcbiAqICAgcmVhZG9ubHkgdG9rZW5zOiBudW1iZXI7XG4gKiB9XG4gKlxuICogY2xhc3MgTGl2ZUxMTVRyYWNrZXJcbiAqICAgZXh0ZW5kcyBCb3VuZGFyeVN0YXRlVHJhY2tlcjxMTE1MaXZlU3RhdGU+ICAgLy8gU1RPUkFHRSBzaGVsZlxuICogICBpbXBsZW1lbnRzIENvbWJpbmVkUmVjb3JkZXIgICAgICAgICAgICAgICAgICAgLy8gT0JTRVJWRVIgaW50ZXJmYWNlXG4gKiB7XG4gKiAgIHJlYWRvbmx5IGlkID0gJ2xpdmUtbGxtJztcbiAqXG4gKiAgIC8vIE9ic2VydmVyIGhhbGYg4oCUIHRyYW5zbGF0ZSBldmVudHMgaW50byBicmFja2V0IG11dGF0aW9ucy5cbiAqICAgb25FbWl0KGV2ZW50OiBFbWl0RXZlbnQpOiB2b2lkIHtcbiAqICAgICBpZiAoZXZlbnQubmFtZSA9PT0gJ2FnZW50Zm9vdHByaW50LnN0cmVhbS5sbG1fc3RhcnQnKSB7XG4gKiAgICAgICB0aGlzLnN0YXJ0Qm91bmRhcnkoZXZlbnQucnVudGltZVN0YWdlSWQsIHsgcGFydGlhbDogJycsIHRva2VuczogMCB9KTtcbiAqICAgICB9IGVsc2UgaWYgKGV2ZW50Lm5hbWUgPT09ICdhZ2VudGZvb3RwcmludC5zdHJlYW0ubGxtX2VuZCcpIHtcbiAqICAgICAgIHRoaXMuc3RvcEJvdW5kYXJ5KGV2ZW50LnJ1bnRpbWVTdGFnZUlkKTtcbiAqICAgICB9IGVsc2UgaWYgKGV2ZW50Lm5hbWUgPT09ICdhZ2VudGZvb3RwcmludC5zdHJlYW0udG9rZW4nKSB7XG4gKiAgICAgICB0aGlzLnVwZGF0ZUJvdW5kYXJ5KGV2ZW50LnJ1bnRpbWVTdGFnZUlkLCAocykgPT4gKHtcbiAqICAgICAgICAgcGFydGlhbDogcy5wYXJ0aWFsICsgKGV2ZW50LnBheWxvYWQgYXMgeyBjb250ZW50OiBzdHJpbmcgfSkuY29udGVudCxcbiAqICAgICAgICAgdG9rZW5zOiBzLnRva2VucyArIDEsXG4gKiAgICAgICB9KSk7XG4gKiAgICAgfVxuICogICB9XG4gKlxuICogICAvLyBQdWJsaWMgcmVhZCBBUEkg4oCUIE8oMSkgYXQgYW55IG1vbWVudC5cbiAqICAgaXNJbkZsaWdodCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuaGFzQWN0aXZlOyB9XG4gKiAgIGdldFBhcnRpYWwoc3RhZ2VJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAqICAgICByZXR1cm4gdGhpcy5nZXRBY3RpdmUoc3RhZ2VJZCk/LnBhcnRpYWwgPz8gJyc7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiAvLyBBdHRhY2hlZCB0aGUgc2FtZSB3YXkgYXMgYW55IG90aGVyIENvbWJpbmVkUmVjb3JkZXIuXG4gKiBjb25zdCB0cmFja2VyID0gbmV3IExpdmVMTE1UcmFja2VyKCk7XG4gKiBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyKHRyYWNrZXIpO1xuICogYXdhaXQgZXhlY3V0b3IucnVuKHsgaW5wdXQgfSk7XG4gKlxuICogLy8gUmVhZCBsaXZlIHN0YXRlIGF0IGFueSB0aW1lIGR1cmluZyBvciBhZnRlciB0aGUgcnVuLlxuICogdHJhY2tlci5pc0luRmxpZ2h0KCk7XG4gKiB0cmFja2VyLmdldFBhcnRpYWwocmlkKTtcbiAqIGBgYFxuICovXG5cbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL3Njb3BlL2RldGVjdENpcmN1bGFyLmpzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJvdW5kYXJ5U3RhdGVUcmFja2VyPFRTdGF0ZT4ge1xuICAvKiogU3RhYmxlIGlkIOKAlCBzYW1lIGlkZW1wb3RlbmN5IGNvbnRyYWN0IGFzIG90aGVyIHJlY29yZGVycy4gKi9cbiAgYWJzdHJhY3QgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKiogT3Blbi1icmFja2V0cyBzdGFjazoga2V5IOKGkiBjdXJyZW50IHRyYW5zaWVudCBzdGF0ZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBhY3RpdmUgPSBuZXcgTWFwPHN0cmluZywgVFN0YXRlPigpO1xuXG4gIC8qKiBQZXIta2V5IGNvdW50IG9mIGB1cGRhdGVCb3VuZGFyeWAgY2FsbHMgdGhhdCBsYW5kZWQgd2l0aG91dCBhXG4gICAqICBtYXRjaGluZyBhY3RpdmUgYm91bmRhcnkuIERyaXZlcyByYXRlLWxpbWl0ZWQgZGV2LW1vZGUgd2FybmluZ3NcbiAgICogIHNvIGEgc3R1Y2sgbG9vcCBkb2Vzbid0IHNwYW0gdGhlIGNvbnNvbGUuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbWlzc2VkVXBkYXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbiAgLy8g4pSA4pSAIE11dGF0b3IgQVBJIChzdWJjbGFzcyBjYWxscyB0aGVzZSBmcm9tIG9ic2VydmVyIGhvb2tzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogT3BlbiBhIG5ldyBib3VuZGFyeSB3aXRoIGluaXRpYWwgdHJhbnNpZW50IHN0YXRlLlxuICAgKlxuICAgKiBJZiBhIGJvdW5kYXJ5IHdpdGggdGhlIHNhbWUgYGtleWAgaXMgYWxyZWFkeSBhY3RpdmUsIHRoZSBwcmlvclxuICAgKiBzdGF0ZSBpcyBvdmVyd3JpdHRlbiAobGFzdC13cml0ZXItd2lucykuIEluIGRldiBtb2RlLCBhIHdhcm5pbmdcbiAgICogaXMgbG9nZ2VkIGJlY2F1c2UgcmUtc3RhcnRpbmcgYW4gYWN0aXZlIGtleSB1c3VhbGx5IGluZGljYXRlcyBhXG4gICAqIG1pc3NlZCBgc3RvcEJvdW5kYXJ5YCBjYWxsIHVwc3RyZWFtLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IEJvdW5kYXJ5IGlkZW50aWZpZXIg4oCUIGJ5IGNvbnZlbnRpb24sIGBydW50aW1lU3RhZ2VJZGBcbiAgICogICAgICAgICAgICBmb3IgMToxLXdpdGgtc3RhZ2UgYm91bmRhcmllcywgb3IgYSBtb3JlIGdyYW51bGFyIGlkXG4gICAqICAgICAgICAgICAgKGUuZy4sIGB0b29sQ2FsbElkYCkgd2hlbiBtdWx0aXBsZSBjb25jdXJyZW50IGJvdW5kYXJpZXNcbiAgICogICAgICAgICAgICBydW4gd2l0aGluIG9uZSBzdGFnZSBleGVjdXRpb24uXG4gICAqIEBwYXJhbSBpbml0aWFsIEluaXRpYWwgc3RhdGUg4oCUIHR5cGVkIGJ5IGBUU3RhdGVgLlxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXJ0Qm91bmRhcnkoa2V5OiBzdHJpbmcsIGluaXRpYWw6IFRTdGF0ZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjdGl2ZS5oYXMoa2V5KSAmJiBpc0Rldk1vZGUoKSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgWyR7dGhpcy5pZH1dIHN0YXJ0Qm91bmRhcnkoJyR7a2V5fScpIGNhbGxlZCB3aGlsZSBhbiBhY3RpdmUgYm91bmRhcnkgYWxyZWFkeSBleGlzdHMuIGAgK1xuICAgICAgICAgICdPdmVyd3JpdGluZyBwcmlvciBzdGF0ZSDigJQgbGlrZWx5IGEgbWlzc2VkIHN0b3BCb3VuZGFyeSB1cHN0cmVhbS4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmUuc2V0KGtleSwgaW5pdGlhbCk7XG4gIH1cblxuICAvKipcbiAgICogRXZvbHZlIHRoZSB0cmFuc2llbnQgc3RhdGUgb2YgYW4gYWN0aXZlIGJvdW5kYXJ5IHVzaW5nIGFuIHVwZGF0ZXJcbiAgICogZnVuY3Rpb24uIFNpbGVudCBuby1vcCBpZiBubyBib3VuZGFyeSBpcyBhY3RpdmUgZm9yIGBrZXlgXG4gICAqIChkZWZlbnNpdmUgYWdhaW5zdCBvdXQtb2Ytb3JkZXIgZXZlbnRzKS4gSW4gZGV2IG1vZGUsIGEgcmF0ZS1saW1pdGVkXG4gICAqIHdhcm5pbmcgaXMgbG9nZ2VkIG9uIHRoZSAxc3QsIDEwdGgsIGFuZCAxMDB0aCBtaXNzZWQgdXBkYXRlIHBlciBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgICAgICBCb3VuZGFyeSBpZGVudGlmaWVyIChtdXN0IG1hdGNoIGEgcHJpb3IgYHN0YXJ0Qm91bmRhcnlgKS5cbiAgICogQHBhcmFtIHVwZGF0ZXIgIFB1cmUgZnVuY3Rpb246IHByZXZpb3VzIHN0YXRlIOKGkiBuZXh0IHN0YXRlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHVwZGF0ZUJvdW5kYXJ5KGtleTogc3RyaW5nLCB1cGRhdGVyOiAocHJldjogVFN0YXRlKSA9PiBUU3RhdGUpOiB2b2lkIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLmFjdGl2ZS5nZXQoa2V5KTtcbiAgICBpZiAoY3VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICBjb25zdCBuID0gKHRoaXMubWlzc2VkVXBkYXRlcy5nZXQoa2V5KSA/PyAwKSArIDE7XG4gICAgICAgIHRoaXMubWlzc2VkVXBkYXRlcy5zZXQoa2V5LCBuKTtcbiAgICAgICAgaWYgKG4gPT09IDEpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFske3RoaXMuaWR9XSB1cGRhdGVCb3VuZGFyeSgnJHtrZXl9Jykg4oCUIG5vIGFjdGl2ZSBib3VuZGFyeS4gVXBkYXRlIGRyb3BwZWQuYCk7XG4gICAgICAgIH0gZWxzZSBpZiAobiA9PT0gMTAgfHwgbiA9PT0gMTAwKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbJHt0aGlzLmlkfV0gdXBkYXRlQm91bmRhcnkoJyR7a2V5fScpIOKAlCAke259IGRyb3BwZWQgdXBkYXRlcy4gV2lyaW5nIGJ1Zz9gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZS5zZXQoa2V5LCB1cGRhdGVyKGN1cikpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSBib3VuZGFyeSBpZGVudGlmaWVkIGJ5IGBrZXlgIGFuZCByZXR1cm4gaXRzIEZJTkFMXG4gICAqIHRyYW5zaWVudCBzdGF0ZSAoZm9yIGFueSBjbGVhbnVwIHRoZSBzdWJjbGFzcyB3YW50cyDigJQgZS5nLiwgZW1pdCBhXG4gICAqIHNuYXBzaG90IHRvIGEgU2VxdWVuY2VSZWNvcmRlciBmb3IgZHVyYWJsZSBzdG9yYWdlKS5cbiAgICpcbiAgICogQHBhcmFtIGtleSBCb3VuZGFyeSBpZGVudGlmaWVyLlxuICAgKiBAcmV0dXJucyBUaGUgZmluYWwgc3RhdGUsIG9yIGB1bmRlZmluZWRgIGlmIG5vIGJvdW5kYXJ5IHdhcyBhY3RpdmUuXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RvcEJvdW5kYXJ5KGtleTogc3RyaW5nKTogVFN0YXRlIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBmaW5hbCA9IHRoaXMuYWN0aXZlLmdldChrZXkpO1xuICAgIHRoaXMuYWN0aXZlLmRlbGV0ZShrZXkpO1xuICAgIHJldHVybiBmaW5hbDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZWFkIEFQSSAoY29uc3VtZXJzIGNhbGwgdGhlc2Ug4oCUIE8oMSkpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBDdXJyZW50IHRyYW5zaWVudCBzdGF0ZSBvZiBPTkUgYWN0aXZlIGJvdW5kYXJ5LiBgdW5kZWZpbmVkYCBpZiBub1xuICAgKiAgYm91bmRhcnkgaXMgYWN0aXZlIGZvciBga2V5YC4gKi9cbiAgZ2V0QWN0aXZlKGtleTogc3RyaW5nKTogVFN0YXRlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmUuZ2V0KGtleSk7XG4gIH1cblxuICAvKipcbiAgICogQWxsIGN1cnJlbnRseS1hY3RpdmUgYm91bmRhcmllcy5cbiAgICpcbiAgICogKipUeXBlLW9ubHkgcmVhZG9ubHk6KiogdGhlIHJldHVybmVkIHJlZmVyZW5jZSBJUyB0aGUgaW50ZXJuYWwgTWFwLlxuICAgKiBUeXBlU2NyaXB0IHByZXZlbnRzIG11dGF0aW9uIHRocm91Z2ggdGhlIGBSZWFkb25seU1hcGAgdHlwZSwgYnV0IGFcbiAgICogcnVudGltZSBjYXN0IG9yIG5vbi1UUyBjb25zdW1lciBjYW4gbXV0YXRlIGl0IGFuZCBjb3JydXB0IGludGVybmFsXG4gICAqIHN0YXRlLiAqKkRvIG5vdCBtdXRhdGUuKipcbiAgICovXG4gIGdldEFsbEFjdGl2ZSgpOiBSZWFkb25seU1hcDxzdHJpbmcsIFRTdGF0ZT4ge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZTtcbiAgfVxuXG4gIC8qKiBUcnVlIGlmIGFueSBib3VuZGFyeSBpcyBjdXJyZW50bHkgYWN0aXZlLiBPKDEpLiAqL1xuICBnZXQgaGFzQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZS5zaXplID4gMDtcbiAgfVxuXG4gIC8qKiBOdW1iZXIgb2YgY3VycmVudGx5LWFjdGl2ZSBib3VuZGFyaWVzLiBPKDEpLiAqL1xuICBnZXQgYWN0aXZlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmUuc2l6ZTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJlc2V0IGFsbCB0cmFuc2llbnQgc3RhdGUuIENhbGxlZCBieSBleGVjdXRvcnMgYmVmb3JlIGVhY2ggYHJ1bigpYFxuICAgKiBzbyBjb25zdW1lcnMgZ2V0IGEgY2xlYW4gc2xhdGUgcGVyIHJ1biDigJQgc2FtZSBsaWZlY3ljbGUgY29udHJhY3RcbiAgICogYXMgYFNlcXVlbmNlUmVjb3JkZXIuY2xlYXIoKWAuXG4gICAqXG4gICAqIEluIGRldiBtb2RlLCB3YXJucyBpZiBhbnkgYm91bmRhcmllcyBhcmUgc3RpbGwgYWN0aXZlIHdoZW4gY2FsbGVkXG4gICAqIOKAlCBsaWtlbHkgaW5kaWNhdGVzIGEgbWlzc2VkIGBzdG9wQm91bmRhcnlgIHVwc3RyZWFtLiBUaGUgbGVha2VkXG4gICAqIGtleXMgYXJlIGxpc3RlZCAodHJ1bmNhdGVkIHRvIDEwKSBzbyB0aGUgd2lyaW5nIGJ1ZyBpcyBmaW5kYWJsZS5cbiAgICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjdGl2ZS5zaXplID4gMCAmJiBpc0Rldk1vZGUoKSkge1xuICAgICAgY29uc3Qga2V5cyA9IFsuLi50aGlzLmFjdGl2ZS5rZXlzKCldO1xuICAgICAgY29uc3QgaGVhZCA9IGtleXMuc2xpY2UoMCwgMTApLmpvaW4oJywgJyk7XG4gICAgICBjb25zdCBtb3JlID0ga2V5cy5sZW5ndGggPiAxMCA/IGAgLi4uKCske2tleXMubGVuZ3RoIC0gMTB9IG1vcmUpYCA6ICcnO1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgWyR7dGhpcy5pZH1dIGNsZWFyKCkgY2FsbGVkIHdpdGggJHt0aGlzLmFjdGl2ZS5zaXplfSBgICtcbiAgICAgICAgICAnc3RpbGwtYWN0aXZlIGJvdW5kYXJpZXMuIE1pc3NlZCBzdG9wQm91bmRhcnk/ICcgK1xuICAgICAgICAgIGBMZWFrZWQga2V5czogJHtoZWFkfSR7bW9yZX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmUuY2xlYXIoKTtcbiAgICB0aGlzLm1pc3NlZFVwZGF0ZXMuY2xlYXIoKTtcbiAgfVxufVxuIl19
|
|
263
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQm91bmRhcnlTdGF0ZVRyYWNrZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL0JvdW5kYXJ5U3RhdGVUcmFja2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnSkc7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFdkQsTUFBTSxPQUFnQixvQkFBb0I7SUFJeEMsMERBQTBEO0lBQ3pDLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUVwRDs7b0RBRWdEO0lBQy9CLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUUzRCx1RUFBdUU7SUFFdkU7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNPLGFBQWEsQ0FBQyxHQUFXLEVBQUUsT0FBZTtRQUNsRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFNBQVMsRUFBRSxFQUFFLENBQUM7WUFDeEMsT0FBTyxDQUFDLElBQUksQ0FDVixJQUFJLElBQUksQ0FBQyxFQUFFLG9CQUFvQixHQUFHLHFEQUFxRDtnQkFDckYsa0VBQWtFLENBQ3JFLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNPLGNBQWMsQ0FBQyxHQUFXLEVBQUUsT0FBaUM7UUFDckUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7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Y2VzQ29udGVudCI6WyIvKipcbiAqIEJvdW5kYXJ5U3RhdGVUcmFja2VyPFRTdGF0ZT4g4oCUIHRoaXJkIHN0b3JhZ2UgcHJpbWl0aXZlIG9uIHRoZSByZWNvcmRlclxuICogc2hlbGYsIGFsb25nc2lkZSBgU2VxdWVuY2VSZWNvcmRlcjxUPmAgYW5kIGBLZXllZFJlY29yZGVyPFQ+YC5cbiAqXG4gKiAqKk1lbnRhbCBtb2RlbCDigJQgb2JzZXJ2ZXJzIHZzLiBib29ra2VlcGVyczoqKlxuICpcbiAqICAgYFNjb3BlUmVjb3JkZXJgIC8gYEZsb3dSZWNvcmRlcmAgLyBgRW1pdFJlY29yZGVyYCAvIGBDb21iaW5lZFJlY29yZGVyYFxuICogICAgIGFyZSBPQlNFUlZFUiBpbnRlcmZhY2VzIOKAlCB0aGV5IGRlc2NyaWJlIGhvdyBhIHJlY29yZGVyIGhlYXJzXG4gKiAgICAgZXZlbnRzIGZyb20gdGhlIGV4ZWN1dG9yLlxuICpcbiAqICAgYFNlcXVlbmNlUmVjb3JkZXI8VD5gIC8gYEtleWVkUmVjb3JkZXI8VD5gIC8gYEJvdW5kYXJ5U3RhdGVUcmFja2VyPFRTdGF0ZT5gXG4gKiAgICAgYXJlIFNUT1JBR0UgcHJpbWl0aXZlcyDigJQgdGhyZWUgZGlmZmVyZW50IGJvb2trZWVwaW5nIHNoZWx2ZXMgd2l0aFxuICogICAgIGRpZmZlcmVudCBkdXJhYmlsaXR5IGFuZCBpbmRleGluZyBwcm9wZXJ0aWVzLiBBIHJlYWwgcmVjb3JkZXJcbiAqICAgICBjbGFzcyB0eXBpY2FsbHkgcGlja3MgT05FIG9ic2VydmVyIGludGVyZmFjZSBBTkQgT05FIHN0b3JhZ2VcbiAqICAgICBzaGVsZiwgY29tYmluaW5nIHRoZW0gdmlhIGBleHRlbmRzICsgaW1wbGVtZW50c2AuXG4gKlxuICogKipXaGF0IHRoaXMgcHJpbWl0aXZlIGFuc3dlcnM6KiogXCJBdCBhbnkgbW9tZW50IGR1cmluZyB0aGUgcnVuLCB3aGF0XG4gKiBpcyB0aGUgTElWRSB0cmFuc2llbnQgc3RhdGUgb2YgZXZlcnkgY3VycmVudGx5LWFjdGl2ZSBib3VuZGFyeT9cIlxuICpcbiAqIEEgXCJib3VuZGFyeVwiIGlzIGEgbWF0Y2hlZCBldmVudCBwYWlyIGBbc3RhcnQsIHN0b3BdYCBicmFja2V0aW5nIGFuXG4gKiBpbnRlcnZhbCDigJQgZm9yIGV4YW1wbGUsIGAobGxtX3N0YXJ0LCBsbG1fZW5kKWAgZm9yIGFuIExMTSBjYWxsLFxuICogYCh0b29sX3N0YXJ0LCB0b29sX2VuZClgIGZvciB0b29sIGV4ZWN1dGlvbiwgYCh0dXJuX3N0YXJ0LCB0dXJuX2VuZClgXG4gKiBmb3IgYW4gYWdlbnQgdHVybi4gQmV0d2VlbiB0aGUgYnJhY2tldHMsIGludGVybWVkaWF0ZSBldmVudHMgZXZvbHZlXG4gKiB0aGUgYm91bmRhcnkncyBzdGF0ZSAodG9rZW4gY2h1bmtzIGFjY3VtdWxhdGluZyBpbnRvIGEgcGFydGlhbFxuICogYW5zd2VyLCBhcmdzIHN0cmVhbWluZyBpbiwgZXRjLikuIE9uIGBzdG9wYCwgdGhlIHN0YXRlIGNsZWFycy5cbiAqXG4gKiBBbGdvcml0aG1pY2FsbHkgdGhpcyBpcyB0aGUgKipERlMgYnJhY2tldC1zZXF1ZW5jZSBwYXR0ZXJuKiog4oCUXG4gKiBzdGFjay1mcmFtZSBzdGF0ZSBkdXJpbmcgYSBncmFwaC10cmF2ZXJzYWwgaW50ZXJ2YWwuIFNhbWUgc2hhcGUgdXNlZFxuICogYnkgVGFyamFuJ3MgU0NDIGFsZ29yaXRobSwgdHJlZSBkZWNvbXBvc2l0aW9uLCBhbmQgcHVzaC1kb3duXG4gKiBhdXRvbWF0YS4gVGhlIGBhY3RpdmVgIG1hcCBpcyB0aGUgb3Blbi1icmFja2V0cyBzdGFjayBhdCBhbnkgbW9tZW50LlxuICpcbiAqICoqQ29tcGFyaXNvbiB3aXRoIHRoZSBvdGhlciBzdG9yYWdlIHByaW1pdGl2ZXM6KipcbiAqXG4gKiB8IFByaW1pdGl2ZSAgICAgICAgICAgICAgICAgICAgICAgfCBTdG9yZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUaW1lIHNjb3BlICAgICAgICAgIHwgTWVtb3J5ICAgICAgfFxuICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXxcbiAqIHwgYFNlcXVlbmNlUmVjb3JkZXI8VD5gICAgICAgICAgICB8IGFwcGVuZC1vbmx5IG9yZGVyZWQgKyBrZXllZCBlbnRyaWVzICB8IGR1cmFibGUgYWNyb3NzIHJ1biAgfCBPKE4gZXZlbnRzKSB8XG4gKiB8IGBLZXllZFJlY29yZGVyPFQ+YCAgICAgICAgICAgICAgfCAxOjEgZW50cnkgcGVyIGBydW50aW1lU3RhZ2VJZGAgICAgICAgfCBkdXJhYmxlIGFjcm9zcyBydW4gIHwgTyhOIHN0ZXBzKSAgfFxuICogfCBgQm91bmRhcnlTdGF0ZVRyYWNrZXI8VFN0YXRlPmAgIHwgdHJhbnNpZW50IGJyYWNrZXQtc2NvcGVkIHN0YXRlICAgICAgIHwgbGl2ZTsgY2xlYXJzIG9uIHN0b3AgfCBPKEsgYWN0aXZlKSB8XG4gKlxuICogKipXaGVuIHRvIHBpY2sgd2hpY2g6KipcbiAqXG4gKiAgIC0gXCJJIG5lZWQgdG8ga2VlcCBhIHBlcm1hbmVudCBsb2cgb2YgZXZlcnkgZXZlbnQgZm9yIHRpbWUtdHJhdmVsXCJcbiAqICAgICAg4oaSIGBTZXF1ZW5jZVJlY29yZGVyPFQ+YFxuICogICAtIFwiSSB3YW50IG9uZSBkdXJhYmxlIHJlY29yZCBwZXIgc3RhZ2UgZXhlY3V0aW9uIChlLmcuLCBtZXRyaWNzKVwiXG4gKiAgICAgIOKGkiBgS2V5ZWRSZWNvcmRlcjxUPmBcbiAqICAgLSBcIkkgbmVlZCB0byBrbm93IHdoYXQncyBoYXBwZW5pbmcgUklHSFQgTk9XIGluc2lkZSBhbiBpbi1mbGlnaHRcbiAqICAgICBib3VuZGFyeSAoZS5nLiwgcGFydGlhbCBMTE0gc3RyZWFtLCBwYXJ0aWFsIHRvb2wgYXJncylcIlxuICogICAgICDihpIgYEJvdW5kYXJ5U3RhdGVUcmFja2VyPFRTdGF0ZT5gICh0aGlzIGNsYXNzKVxuICpcbiAqICoqV2hhdCB0aGlzIGlzIE5PVCBmb3I6KipcbiAqXG4gKiAgIC0gVGltZS10cmF2ZWwgcXVlcmllcyAoXCJ3aGF0IHdhcyB0aGUgc3RhdGUgYXQgcGFzdCBzbGlkZXIgc3RlcCBOP1wiKVxuICogICAgIOKAlCB0cmFuc2llbnQgc3RhdGUgY2xlYXJzIG9uIHN0b3AuIEZvciB0aW1lLXRyYXZlbCwgc25hcHNob3QgdGhlXG4gKiAgICAgc3RhdGUgYXQgZWFjaCBlbWl0IGludG8gYSBzZXBhcmF0ZSBgU2VxdWVuY2VSZWNvcmRlcjxUU3RhdGU+YCxcbiAqICAgICBvciB3YWl0IGZvciBhIGZ1dHVyZSBgQm91bmRhcnlTbmFwc2hvdFJlY29yZGVyPFRTdGF0ZT5gIHByaW1pdGl2ZS5cbiAqXG4gKiAgIC0gQWdncmVnYXRpb25zIGFjcm9zcyB0aGUgd2hvbGUgcnVuICh0b3RhbHMsIGNvdW50cykg4oCUIHRob3NlIGFyZVxuICogICAgIGBTZXF1ZW5jZVJlY29yZGVyLmFnZ3JlZ2F0ZSgpYCAvIGBLZXllZFJlY29yZGVyLmFnZ3JlZ2F0ZSgpYC5cbiAqXG4gKiAgIC0gU3RhZ2UtbGV2ZWwgY29uY2VybnMg4oCUIHRob3NlIHVzZSBgU2NvcGVSZWNvcmRlci5vblN0YWdlU3RhcnRgIC9cbiAqICAgICBgU2NvcGVSZWNvcmRlci5vblN0YWdlRW5kYC4gVGhpcyBwcmltaXRpdmUgb3BlcmF0ZXMgYXQgZmluZXJcbiAqICAgICBncmFudWxhcml0eSAoZXZlbnRzIGVtaXR0ZWQgRFVSSU5HIGEgc3RhZ2UgZXhlY3V0aW9uKS5cbiAqXG4gKiAqKkxpZmVjeWNsZSBjb250cmFjdCDigJQgU1RSSUNUOioqXG4gKlxuICogICBFdmVyeSBgc3RhcnRCb3VuZGFyeShrZXksIC4uLilgIGNhbGwgTVVTVCBiZSBwYWlyZWQgd2l0aCBhXG4gKiAgIGBzdG9wQm91bmRhcnkoa2V5KWAgY2FsbC4gRmFpbHVyZSB0byB3aXJlIHRoZSBzdG9wIHNpZGUgcHJvZHVjZXMgYVxuICogICBtZW1vcnkgbGVhazogdGhlIGFjdGl2ZSBtYXAgZ3Jvd3Mgd2l0aG91dCBib3VuZCwgYW5kIGBnZXRBbGxBY3RpdmUoKWBcbiAqICAgcmV0dXJucyBzdGFsZSBlbnRyaWVzIHRoYXQgbG9vayBpbi1mbGlnaHQgYnV0IGFyZW4ndC4gQ29tbW9uIGNhdXNlOlxuICogICBzdWJjbGFzcyB3aXJlcyBgc3RhcnRgIHRvIG9uZSBldmVudCBoYW5kbGVyIGFuZCBmb3JnZXRzIHRvIHdpcmVcbiAqICAgYHN0b3BgLiAqKkFsd2F5cyB3aXJlIGJvdGggYXQgdGhlIHNhbWUgdGltZS4qKlxuICpcbiAqICAgRGV2IG1vZGUgKGBlbmFibGVEZXZNb2RlKClgKSBkZXRlY3RzIGxlYWtzIGF0IGBjbGVhcigpYCB0aW1lIOKAlFxuICogICB3YXJuaW5nIGluY2x1ZGVzIHRoZSBsZWFrZWQga2V5cyBzbyB5b3UgY2FuIGZpbmQgdGhlIG1pc3Npbmcgd2lyaW5nLlxuICpcbiAqICoqQ29uY3VycmVuY3kgLyBuZXN0aW5nOioqXG4gKlxuICogICAtIENvbmN1cnJlbnQgYm91bmRhcmllcyAocGFyYWxsZWwgYnJhbmNoZXMgd2l0aCB0d28gTExNIGNhbGxzXG4gKiAgICAgYWN0aXZlIGF0IG9uY2UpIHdvcmsgY29ycmVjdGx5OiBlYWNoIGlzIGtleWVkIGluZGVwZW5kZW50bHkgaW5cbiAqICAgICB0aGUgYWN0aXZlIG1hcC5cbiAqICAgLSBOZXN0ZWQgYm91bmRhcmllcyBvZiBESUZGRVJFTlQgS0lORFMgKEFnZW50IGJvdW5kYXJ5IGNvbnRhaW5zXG4gKiAgICAgTExNIGJvdW5kYXJ5KSByZXF1aXJlIFNFUEFSQVRFIHRyYWNrZXIgaW5zdGFuY2VzIOKAlCBvbmUgcGVyIGtpbmQuXG4gKiAgICAgVGhlIGJhc2UgY2xhc3MgdHJhY2tzIG9uZSBib3VuZGFyeSBraW5kIHBlciBpbnN0YW5jZS5cbiAqXG4gKiAqKktleSBjb252ZW50aW9uOioqXG4gKlxuICogICBUaGUgYGtleTogc3RyaW5nYCBpcyB3aGF0ZXZlciB5b3VyIHN1YmNsYXNzIHBpY2tzLiBDb252ZW50aW9uOlxuICogICB1c2UgYHJ1bnRpbWVTdGFnZUlkYCB3aGVuIHRoZSBib3VuZGFyeSBtYXBzIDE6MSB0byBhIHN0YWdlXG4gKiAgIGV4ZWN1dGlvbiDigJQgdGhpcyBnaXZlcyBmcmVlIGludGVyb3Agd2l0aCBgU2VxdWVuY2VSZWNvcmRlclxuICogICAuZ2V0RW50cmllc0ZvclN0ZXBgLCBgS2V5ZWRSZWNvcmRlci5nZXRCeUtleWAsIGBmaW5kQ29tbWl0YCAvXG4gKiAgIGBmaW5kTGFzdFdyaXRlcmAsIGFuZCB0aGUgcmVzdCBvZiB0aGUgdHJhY2UgZWNvc3lzdGVtLiBVc2UgYSBtb3JlXG4gKiAgIGdyYW51bGFyIGtleSAoZS5nLiwgYHRvb2xDYWxsSWRgKSBvbmx5IHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlXG4gKiAgIGNvbmN1cnJlbnQgYm91bmRhcmllcyBXSVRISU4gb25lIHN0YWdlIGV4ZWN1dGlvbi5cbiAqXG4gKiBAZXhhbXBsZSBCdWlsZCBhIGxpdmUgTExNIHRyYWNrZXIgKGNvbWJpbmluZyBzdG9yYWdlICsgb2JzZXJ2ZXIpOlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7XG4gKiAgIEJvdW5kYXJ5U3RhdGVUcmFja2VyLFxuICogICB0eXBlIENvbWJpbmVkUmVjb3JkZXIsXG4gKiAgIHR5cGUgRW1pdEV2ZW50LFxuICogfSBmcm9tICdmb290cHJpbnRqcyc7XG4gKlxuICogaW50ZXJmYWNlIExMTUxpdmVTdGF0ZSB7XG4gKiAgIHJlYWRvbmx5IHBhcnRpYWw6IHN0cmluZztcbiAqICAgcmVhZG9ubHkgdG9rZW5zOiBudW1iZXI7XG4gKiB9XG4gKlxuICogY2xhc3MgTGl2ZUxMTVRyYWNrZXJcbiAqICAgZXh0ZW5kcyBCb3VuZGFyeVN0YXRlVHJhY2tlcjxMTE1MaXZlU3RhdGU+ICAgLy8gU1RPUkFHRSBzaGVsZlxuICogICBpbXBsZW1lbnRzIENvbWJpbmVkUmVjb3JkZXIgICAgICAgICAgICAgICAgICAgLy8gT0JTRVJWRVIgaW50ZXJmYWNlXG4gKiB7XG4gKiAgIHJlYWRvbmx5IGlkID0gJ2xpdmUtbGxtJztcbiAqXG4gKiAgIC8vIE9ic2VydmVyIGhhbGYg4oCUIHRyYW5zbGF0ZSBldmVudHMgaW50byBicmFja2V0IG11dGF0aW9ucy5cbiAqICAgb25FbWl0KGV2ZW50OiBFbWl0RXZlbnQpOiB2b2lkIHtcbiAqICAgICBpZiAoZXZlbnQubmFtZSA9PT0gJ2FnZW50Zm9vdHByaW50LnN0cmVhbS5sbG1fc3RhcnQnKSB7XG4gKiAgICAgICB0aGlzLnN0YXJ0Qm91bmRhcnkoZXZlbnQucnVudGltZVN0YWdlSWQsIHsgcGFydGlhbDogJycsIHRva2VuczogMCB9KTtcbiAqICAgICB9IGVsc2UgaWYgKGV2ZW50Lm5hbWUgPT09ICdhZ2VudGZvb3RwcmludC5zdHJlYW0ubGxtX2VuZCcpIHtcbiAqICAgICAgIHRoaXMuc3RvcEJvdW5kYXJ5KGV2ZW50LnJ1bnRpbWVTdGFnZUlkKTtcbiAqICAgICB9IGVsc2UgaWYgKGV2ZW50Lm5hbWUgPT09ICdhZ2VudGZvb3RwcmludC5zdHJlYW0udG9rZW4nKSB7XG4gKiAgICAgICB0aGlzLnVwZGF0ZUJvdW5kYXJ5KGV2ZW50LnJ1bnRpbWVTdGFnZUlkLCAocykgPT4gKHtcbiAqICAgICAgICAgcGFydGlhbDogcy5wYXJ0aWFsICsgKGV2ZW50LnBheWxvYWQgYXMgeyBjb250ZW50OiBzdHJpbmcgfSkuY29udGVudCxcbiAqICAgICAgICAgdG9rZW5zOiBzLnRva2VucyArIDEsXG4gKiAgICAgICB9KSk7XG4gKiAgICAgfVxuICogICB9XG4gKlxuICogICAvLyBQdWJsaWMgcmVhZCBBUEkg4oCUIE8oMSkgYXQgYW55IG1vbWVudC5cbiAqICAgaXNJbkZsaWdodCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuaGFzQWN0aXZlOyB9XG4gKiAgIGdldFBhcnRpYWwoc3RhZ2VJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAqICAgICByZXR1cm4gdGhpcy5nZXRBY3RpdmUoc3RhZ2VJZCk/LnBhcnRpYWwgPz8gJyc7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiAvLyBBdHRhY2hlZCB0aGUgc2FtZSB3YXkgYXMgYW55IG90aGVyIENvbWJpbmVkUmVjb3JkZXIuXG4gKiBjb25zdCB0cmFja2VyID0gbmV3IExpdmVMTE1UcmFja2VyKCk7XG4gKiBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyKHRyYWNrZXIpO1xuICogYXdhaXQgZXhlY3V0b3IucnVuKHsgaW5wdXQgfSk7XG4gKlxuICogLy8gUmVhZCBsaXZlIHN0YXRlIGF0IGFueSB0aW1lIGR1cmluZyBvciBhZnRlciB0aGUgcnVuLlxuICogdHJhY2tlci5pc0luRmxpZ2h0KCk7XG4gKiB0cmFja2VyLmdldFBhcnRpYWwocmlkKTtcbiAqIGBgYFxuICovXG5cbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL3Njb3BlL2RldGVjdENpcmN1bGFyLmpzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJvdW5kYXJ5U3RhdGVUcmFja2VyPFRTdGF0ZT4ge1xuICAvKiogU3RhYmxlIGlkIOKAlCBzYW1lIGlkZW1wb3RlbmN5IGNvbnRyYWN0IGFzIG90aGVyIHJlY29yZGVycy4gKi9cbiAgYWJzdHJhY3QgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKiogT3Blbi1icmFja2V0cyBzdGFjazoga2V5IOKGkiBjdXJyZW50IHRyYW5zaWVudCBzdGF0ZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBhY3RpdmUgPSBuZXcgTWFwPHN0cmluZywgVFN0YXRlPigpO1xuXG4gIC8qKiBQZXIta2V5IGNvdW50IG9mIGB1cGRhdGVCb3VuZGFyeWAgY2FsbHMgdGhhdCBsYW5kZWQgd2l0aG91dCBhXG4gICAqICBtYXRjaGluZyBhY3RpdmUgYm91bmRhcnkuIERyaXZlcyByYXRlLWxpbWl0ZWQgZGV2LW1vZGUgd2FybmluZ3NcbiAgICogIHNvIGEgc3R1Y2sgbG9vcCBkb2Vzbid0IHNwYW0gdGhlIGNvbnNvbGUuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbWlzc2VkVXBkYXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbiAgLy8g4pSA4pSAIE11dGF0b3IgQVBJIChzdWJjbGFzcyBjYWxscyB0aGVzZSBmcm9tIG9ic2VydmVyIGhvb2tzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogT3BlbiBhIG5ldyBib3VuZGFyeSB3aXRoIGluaXRpYWwgdHJhbnNpZW50IHN0YXRlLlxuICAgKlxuICAgKiBJZiBhIGJvdW5kYXJ5IHdpdGggdGhlIHNhbWUgYGtleWAgaXMgYWxyZWFkeSBhY3RpdmUsIHRoZSBwcmlvclxuICAgKiBzdGF0ZSBpcyBvdmVyd3JpdHRlbiAobGFzdC13cml0ZXItd2lucykuIEluIGRldiBtb2RlLCBhIHdhcm5pbmdcbiAgICogaXMgbG9nZ2VkIGJlY2F1c2UgcmUtc3RhcnRpbmcgYW4gYWN0aXZlIGtleSB1c3VhbGx5IGluZGljYXRlcyBhXG4gICAqIG1pc3NlZCBgc3RvcEJvdW5kYXJ5YCBjYWxsIHVwc3RyZWFtLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IEJvdW5kYXJ5IGlkZW50aWZpZXIg4oCUIGJ5IGNvbnZlbnRpb24sIGBydW50aW1lU3RhZ2VJZGBcbiAgICogICAgICAgICAgICBmb3IgMToxLXdpdGgtc3RhZ2UgYm91bmRhcmllcywgb3IgYSBtb3JlIGdyYW51bGFyIGlkXG4gICAqICAgICAgICAgICAgKGUuZy4sIGB0b29sQ2FsbElkYCkgd2hlbiBtdWx0aXBsZSBjb25jdXJyZW50IGJvdW5kYXJpZXNcbiAgICogICAgICAgICAgICBydW4gd2l0aGluIG9uZSBzdGFnZSBleGVjdXRpb24uXG4gICAqIEBwYXJhbSBpbml0aWFsIEluaXRpYWwgc3RhdGUg4oCUIHR5cGVkIGJ5IGBUU3RhdGVgLlxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXJ0Qm91bmRhcnkoa2V5OiBzdHJpbmcsIGluaXRpYWw6IFRTdGF0ZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjdGl2ZS5oYXMoa2V5KSAmJiBpc0Rldk1vZGUoKSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgWyR7dGhpcy5pZH1dIHN0YXJ0Qm91bmRhcnkoJyR7a2V5fScpIGNhbGxlZCB3aGlsZSBhbiBhY3RpdmUgYm91bmRhcnkgYWxyZWFkeSBleGlzdHMuIGAgK1xuICAgICAgICAgICdPdmVyd3JpdGluZyBwcmlvciBzdGF0ZSDigJQgbGlrZWx5IGEgbWlzc2VkIHN0b3BCb3VuZGFyeSB1cHN0cmVhbS4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmUuc2V0KGtleSwgaW5pdGlhbCk7XG4gIH1cblxuICAvKipcbiAgICogRXZvbHZlIHRoZSB0cmFuc2llbnQgc3RhdGUgb2YgYW4gYWN0aXZlIGJvdW5kYXJ5IHVzaW5nIGFuIHVwZGF0ZXJcbiAgICogZnVuY3Rpb24uIFNpbGVudCBuby1vcCBpZiBubyBib3VuZGFyeSBpcyBhY3RpdmUgZm9yIGBrZXlgXG4gICAqIChkZWZlbnNpdmUgYWdhaW5zdCBvdXQtb2Ytb3JkZXIgZXZlbnRzKS4gSW4gZGV2IG1vZGUsIGEgcmF0ZS1saW1pdGVkXG4gICAqIHdhcm5pbmcgaXMgbG9nZ2VkIG9uIHRoZSAxc3QsIDEwdGgsIGFuZCAxMDB0aCBtaXNzZWQgdXBkYXRlIHBlciBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgICAgICBCb3VuZGFyeSBpZGVudGlmaWVyIChtdXN0IG1hdGNoIGEgcHJpb3IgYHN0YXJ0Qm91bmRhcnlgKS5cbiAgICogQHBhcmFtIHVwZGF0ZXIgIFB1cmUgZnVuY3Rpb246IHByZXZpb3VzIHN0YXRlIOKGkiBuZXh0IHN0YXRlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHVwZGF0ZUJvdW5kYXJ5KGtleTogc3RyaW5nLCB1cGRhdGVyOiAocHJldjogVFN0YXRlKSA9PiBUU3RhdGUpOiB2b2lkIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLmFjdGl2ZS5nZXQoa2V5KTtcbiAgICBpZiAoY3VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICBjb25zdCBuID0gKHRoaXMubWlzc2VkVXBkYXRlcy5nZXQoa2V5KSA/PyAwKSArIDE7XG4gICAgICAgIHRoaXMubWlzc2VkVXBkYXRlcy5zZXQoa2V5LCBuKTtcbiAgICAgICAgaWYgKG4gPT09IDEpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFske3RoaXMuaWR9XSB1cGRhdGVCb3VuZGFyeSgnJHtrZXl9Jykg4oCUIG5vIGFjdGl2ZSBib3VuZGFyeS4gVXBkYXRlIGRyb3BwZWQuYCk7XG4gICAgICAgIH0gZWxzZSBpZiAobiA9PT0gMTAgfHwgbiA9PT0gMTAwKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbJHt0aGlzLmlkfV0gdXBkYXRlQm91bmRhcnkoJyR7a2V5fScpIOKAlCAke259IGRyb3BwZWQgdXBkYXRlcy4gV2lyaW5nIGJ1Zz9gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZS5zZXQoa2V5LCB1cGRhdGVyKGN1cikpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSBib3VuZGFyeSBpZGVudGlmaWVkIGJ5IGBrZXlgIGFuZCByZXR1cm4gaXRzIEZJTkFMXG4gICAqIHRyYW5zaWVudCBzdGF0ZSAoZm9yIGFueSBjbGVhbnVwIHRoZSBzdWJjbGFzcyB3YW50cyDigJQgZS5nLiwgZW1pdCBhXG4gICAqIHNuYXBzaG90IHRvIGEgU2VxdWVuY2VSZWNvcmRlciBmb3IgZHVyYWJsZSBzdG9yYWdlKS5cbiAgICpcbiAgICogQHBhcmFtIGtleSBCb3VuZGFyeSBpZGVudGlmaWVyLlxuICAgKiBAcmV0dXJucyBUaGUgZmluYWwgc3RhdGUsIG9yIGB1bmRlZmluZWRgIGlmIG5vIGJvdW5kYXJ5IHdhcyBhY3RpdmUuXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RvcEJvdW5kYXJ5KGtleTogc3RyaW5nKTogVFN0YXRlIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBmaW5hbCA9IHRoaXMuYWN0aXZlLmdldChrZXkpO1xuICAgIHRoaXMuYWN0aXZlLmRlbGV0ZShrZXkpO1xuICAgIHJldHVybiBmaW5hbDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZWFkIEFQSSAoY29uc3VtZXJzIGNhbGwgdGhlc2Ug4oCUIE8oMSkpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBDdXJyZW50IHRyYW5zaWVudCBzdGF0ZSBvZiBPTkUgYWN0aXZlIGJvdW5kYXJ5LiBgdW5kZWZpbmVkYCBpZiBub1xuICAgKiAgYm91bmRhcnkgaXMgYWN0aXZlIGZvciBga2V5YC4gKi9cbiAgZ2V0QWN0aXZlKGtleTogc3RyaW5nKTogVFN0YXRlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmUuZ2V0KGtleSk7XG4gIH1cblxuICAvKipcbiAgICogQWxsIGN1cnJlbnRseS1hY3RpdmUgYm91bmRhcmllcy5cbiAgICpcbiAgICogKipUeXBlLW9ubHkgcmVhZG9ubHk6KiogdGhlIHJldHVybmVkIHJlZmVyZW5jZSBJUyB0aGUgaW50ZXJuYWwgTWFwLlxuICAgKiBUeXBlU2NyaXB0IHByZXZlbnRzIG11dGF0aW9uIHRocm91Z2ggdGhlIGBSZWFkb25seU1hcGAgdHlwZSwgYnV0IGFcbiAgICogcnVudGltZSBjYXN0IG9yIG5vbi1UUyBjb25zdW1lciBjYW4gbXV0YXRlIGl0IGFuZCBjb3JydXB0IGludGVybmFsXG4gICAqIHN0YXRlLiAqKkRvIG5vdCBtdXRhdGUuKipcbiAgICovXG4gIGdldEFsbEFjdGl2ZSgpOiBSZWFkb25seU1hcDxzdHJpbmcsIFRTdGF0ZT4ge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZTtcbiAgfVxuXG4gIC8qKiBUcnVlIGlmIGFueSBib3VuZGFyeSBpcyBjdXJyZW50bHkgYWN0aXZlLiBPKDEpLiAqL1xuICBnZXQgaGFzQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZS5zaXplID4gMDtcbiAgfVxuXG4gIC8qKiBOdW1iZXIgb2YgY3VycmVudGx5LWFjdGl2ZSBib3VuZGFyaWVzLiBPKDEpLiAqL1xuICBnZXQgYWN0aXZlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmUuc2l6ZTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJlc2V0IGFsbCB0cmFuc2llbnQgc3RhdGUuIENhbGxlZCBieSBleGVjdXRvcnMgYmVmb3JlIGVhY2ggYHJ1bigpYFxuICAgKiBzbyBjb25zdW1lcnMgZ2V0IGEgY2xlYW4gc2xhdGUgcGVyIHJ1biDigJQgc2FtZSBsaWZlY3ljbGUgY29udHJhY3RcbiAgICogYXMgYFNlcXVlbmNlUmVjb3JkZXIuY2xlYXIoKWAuXG4gICAqXG4gICAqIEluIGRldiBtb2RlLCB3YXJucyBpZiBhbnkgYm91bmRhcmllcyBhcmUgc3RpbGwgYWN0aXZlIHdoZW4gY2FsbGVkXG4gICAqIOKAlCBsaWtlbHkgaW5kaWNhdGVzIGEgbWlzc2VkIGBzdG9wQm91bmRhcnlgIHVwc3RyZWFtLiBUaGUgbGVha2VkXG4gICAqIGtleXMgYXJlIGxpc3RlZCAodHJ1bmNhdGVkIHRvIDEwKSBzbyB0aGUgd2lyaW5nIGJ1ZyBpcyBmaW5kYWJsZS5cbiAgICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjdGl2ZS5zaXplID4gMCAmJiBpc0Rldk1vZGUoKSkge1xuICAgICAgY29uc3Qga2V5cyA9IFsuLi50aGlzLmFjdGl2ZS5rZXlzKCldO1xuICAgICAgY29uc3QgaGVhZCA9IGtleXMuc2xpY2UoMCwgMTApLmpvaW4oJywgJyk7XG4gICAgICBjb25zdCBtb3JlID0ga2V5cy5sZW5ndGggPiAxMCA/IGAgLi4uKCske2tleXMubGVuZ3RoIC0gMTB9IG1vcmUpYCA6ICcnO1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgWyR7dGhpcy5pZH1dIGNsZWFyKCkgY2FsbGVkIHdpdGggJHt0aGlzLmFjdGl2ZS5zaXplfSBgICtcbiAgICAgICAgICAnc3RpbGwtYWN0aXZlIGJvdW5kYXJpZXMuIE1pc3NlZCBzdG9wQm91bmRhcnk/ICcgK1xuICAgICAgICAgIGBMZWFrZWQga2V5czogJHtoZWFkfSR7bW9yZX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmUuY2xlYXIoKTtcbiAgICB0aGlzLm1pc3NlZFVwZGF0ZXMuY2xlYXIoKTtcbiAgfVxufVxuIl19
|
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
*
|
|
8
8
|
* Before `CombinedRecorder`, a consumer who wanted to observe both streams
|
|
9
9
|
* had to:
|
|
10
|
-
* 1. Implement both `
|
|
10
|
+
* 1. Implement both `ScopeRecorder` (8 methods) and `FlowRecorder` (12 methods)
|
|
11
11
|
* fully — stubbing every event they didn't care about.
|
|
12
|
-
* 2. Remember to call BOTH `
|
|
12
|
+
* 2. Remember to call BOTH `attachScopeRecorder(r)` AND `attachFlowRecorder(r)`.
|
|
13
13
|
* Forgetting the second call silently dropped half their events — no
|
|
14
14
|
* warning, no runtime error.
|
|
15
15
|
* 3. Re-implement coordination logic (buffering, ordering) themselves.
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
*
|
|
37
37
|
* const audit: CombinedRecorder = {
|
|
38
38
|
* id: 'audit',
|
|
39
|
-
* onWrite: (e) => logWrite(e.key, e.value), //
|
|
39
|
+
* onWrite: (e) => logWrite(e.key, e.value), // ScopeRecorder method
|
|
40
40
|
* onDecision: (e) => logDecision(e.chosen), // FlowRecorder method
|
|
41
41
|
* };
|
|
42
42
|
*
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
*
|
|
47
47
|
* ## Contract with existing APIs
|
|
48
48
|
*
|
|
49
|
-
* - `
|
|
49
|
+
* - `attachScopeRecorder(r)` and `attachFlowRecorder(r)` remain unchanged.
|
|
50
50
|
* Consumers who want only ONE channel keep using them — explicit is good.
|
|
51
51
|
* - `attachCombinedRecorder(r)` is the ONLY way to guarantee an object is
|
|
52
52
|
* hooked into every stream it has methods for, without maintaining two
|
|
@@ -85,9 +85,9 @@ export function isFlowEvent(event) {
|
|
|
85
85
|
return event.pipelineId === undefined;
|
|
86
86
|
}
|
|
87
87
|
/**
|
|
88
|
-
* Method names belonging to the `
|
|
88
|
+
* Method names belonging to the `ScopeRecorder` (data-flow) interface.
|
|
89
89
|
* Kept as a single source of truth so the runtime duck-type detector stays
|
|
90
|
-
* in sync with the interface. If a method is added to `
|
|
90
|
+
* in sync with the interface. If a method is added to `ScopeRecorder`, adding it
|
|
91
91
|
* here is the ONLY change required to route combined-recorders correctly.
|
|
92
92
|
*/
|
|
93
93
|
const RECORDER_EVENT_METHODS = [
|
|
@@ -183,10 +183,10 @@ function hasOwnOrClassMethod(r, m) {
|
|
|
183
183
|
*
|
|
184
184
|
* ## Return type
|
|
185
185
|
*
|
|
186
|
-
* Returns plain `boolean` (not a type predicate). The full `
|
|
186
|
+
* Returns plain `boolean` (not a type predicate). The full `ScopeRecorder`
|
|
187
187
|
* interface has payload types that diverge from `CombinedRecorder`'s union
|
|
188
188
|
* variants for shared methods, so a narrowing predicate would be unsound.
|
|
189
|
-
* Callers that need to treat the recorder as a `
|
|
189
|
+
* Callers that need to treat the recorder as a `ScopeRecorder` do so explicitly
|
|
190
190
|
* at the attach site — the cast is the contract that each channel passes
|
|
191
191
|
* its own payload variant.
|
|
192
192
|
*/
|
|
@@ -208,4 +208,4 @@ export function hasFlowRecorderMethods(r) {
|
|
|
208
208
|
export function hasEmitRecorderMethods(r) {
|
|
209
209
|
return EMIT_RECORDER_EVENT_METHODS.some((m) => hasOwnOrClassMethod(r, m));
|
|
210
210
|
}
|
|
211
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tYmluZWRSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvQ29tYmluZWRSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVERztBQW1GSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBSSxLQUFRO0lBQ3JDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDOUQsT0FBUSxLQUFpQyxDQUFDLFVBQVUsS0FBSyxTQUFTLENBQUM7QUFDckUsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxzQkFBc0IsR0FBRztJQUM3QixRQUFRO0lBQ1IsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsY0FBYztJQUNkLFlBQVk7SUFDWixTQUFTO0lBQ1QsVUFBVTtDQUNGLENBQUM7QUFFWDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLDJCQUEyQixHQUFHO0lBQ2xDLGlCQUFpQjtJQUNqQixRQUFRO0lBQ1IsWUFBWTtJQUNaLFFBQVE7SUFDUixZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLGVBQWU7SUFDZixxQkFBcUI7SUFDckIsUUFBUTtJQUNSLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7Q0FDRixDQUFDO0FBRVg7Ozs7R0FJRztBQUNILE1BQU0sMkJBQTJCLEdBQUcsQ0FBQyxRQUFRLENBQVUsQ0FBQztBQUV4RDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILFNBQVMsbUJBQW1CLENBQUMsQ0FBVSxFQUFFLENBQVM7SUFDaEQsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN0RCxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMvQyxPQUFPLE9BQVEsQ0FBNkIsQ0FBQyxDQUFDLENBQUMsS0FBSyxVQUFVLENBQUM7SUFDakUsQ0FBQztJQUNELElBQUksS0FBSyxHQUFZLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUMsT0FBTyxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDcEQsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbkQsT0FBTyxPQUFRLEtBQWlDLENBQUMsQ0FBQyxDQUFDLEtBQUssVUFBVSxDQUFDO1FBQ3JFLENBQUM7UUFDRCxLQUFLLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLENBQW1CO0lBQ3BELE9BQU8sc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUFDLENBQW1CO0lBQ3hELE9BQU8sMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxDQUFtQjtJQUN4RCxPQUFPLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29tYmluZWRSZWNvcmRlciDigJQgYSBzaW5nbGUgb2JzZXJ2ZXIgdGhhdCBjYW4gaG9vayBpbnRvIE1VTFRJUExFIGV2ZW50XG4gKiBzdHJlYW1zIChjdXJyZW50bHk6IHNjb3BlIGRhdGEtZmxvdyArIGNvbnRyb2wtZmxvdykuIE9uZSBvYmplY3QsIG9uZSBgaWRgLFxuICogb25lIGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgZXhlY3V0aW9uLlxuICpcbiAqICMjIFdoeSB0aGlzIGV4aXN0c1xuICpcbiAqIEJlZm9yZSBgQ29tYmluZWRSZWNvcmRlcmAsIGEgY29uc3VtZXIgd2hvIHdhbnRlZCB0byBvYnNlcnZlIGJvdGggc3RyZWFtc1xuICogaGFkIHRvOlxuICogICAxLiBJbXBsZW1lbnQgYm90aCBgUmVjb3JkZXJgICg4IG1ldGhvZHMpIGFuZCBgRmxvd1JlY29yZGVyYCAoMTIgbWV0aG9kcylcbiAqICAgICAgZnVsbHkg4oCUIHN0dWJiaW5nIGV2ZXJ5IGV2ZW50IHRoZXkgZGlkbid0IGNhcmUgYWJvdXQuXG4gKiAgIDIuIFJlbWVtYmVyIHRvIGNhbGwgQk9USCBgYXR0YWNoUmVjb3JkZXIocilgIEFORCBgYXR0YWNoRmxvd1JlY29yZGVyKHIpYC5cbiAqICAgICAgRm9yZ2V0dGluZyB0aGUgc2Vjb25kIGNhbGwgc2lsZW50bHkgZHJvcHBlZCBoYWxmIHRoZWlyIGV2ZW50cyDigJQgbm9cbiAqICAgICAgd2FybmluZywgbm8gcnVudGltZSBlcnJvci5cbiAqICAgMy4gUmUtaW1wbGVtZW50IGNvb3JkaW5hdGlvbiBsb2dpYyAoYnVmZmVyaW5nLCBvcmRlcmluZykgdGhlbXNlbHZlcy5cbiAqXG4gKiBgQ29tYmluZWRSZWNvcmRlcmAgY29sbGFwc2VzIHRoYXQgaW50byBhIHNpbmdsZSB0eXBlIGFuZCBhIHNpbmdsZSBhdHRhY2hcbiAqIGNhbGwgKGBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyKHIpYCksIHdpdGggdGhlIGxpYnJhcnkgaGFuZGxpbmcgdGhlXG4gKiByb3V0aW5nIGludGVybmFsbHkuIENvbnN1bWVycyBpbXBsZW1lbnQgb25seSB0aGUgZXZlbnRzIHRoZXkgY2FyZSBhYm91dFxuICogKGBQYXJ0aWFsPC4uLj5gKSBhbmQgdGhlIGF0dGFjaCBtZXRob2QgZHVjay10eXBlcyBhdCBydW50aW1lIHRvIGRpc3BhdGNoXG4gKiB0byB0aGUgcmVsZXZhbnQgY2hhbm5lbHMuXG4gKlxuICogIyMgRm9yd2FyZCBjb21wYXRpYmlsaXR5XG4gKlxuICogV2hlbiBhIHRoaXJkIG9ic2VydmVyIHR5cGUgaXMgYWRkZWQgKGUuZy4gYW4gYE9wZXJhdGlvblJlY29yZGVyYCksIHRoZVxuICogYENvbWJpbmVkUmVjb3JkZXJgIHR5cGUgZ2FpbnMgYW4gYCYgUGFydGlhbDxPcGVyYXRpb25SZWNvcmRlcj5gIGNsYXVzZSBhbmRcbiAqIGBhdHRhY2hDb21iaW5lZFJlY29yZGVyYCBnYWlucyBvbmUgbW9yZSBydW50aW1lIGJyYW5jaCBpbiBpdHMgZGlzcGF0Y2guXG4gKiBDb25zdW1lcnMgd3JpdGluZyBhIGBDb21iaW5lZFJlY29yZGVyYCB0b2RheSBhcmUgTk9UIGFmZmVjdGVkIOKAlCB0aGVpclxuICogY29kZSBrZWVwcyBjb21waWxpbmcgYW5kIGF0dGFjaGluZyBjb3JyZWN0bHksIGJlY2F1c2UgZXZlcnkgbmV3IGxheWVyIGlzXG4gKiBvcHRpb25hbC5cbiAqXG4gKiAjIyBFeGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHR5cGUgeyBDb21iaW5lZFJlY29yZGVyIH0gZnJvbSAnZm9vdHByaW50anMnO1xuICpcbiAqIGNvbnN0IGF1ZGl0OiBDb21iaW5lZFJlY29yZGVyID0ge1xuICogICBpZDogJ2F1ZGl0JyxcbiAqICAgb25Xcml0ZTogKGUpID0+IGxvZ1dyaXRlKGUua2V5LCBlLnZhbHVlKSwgICAgICAgIC8vIFJlY29yZGVyIG1ldGhvZFxuICogICBvbkRlY2lzaW9uOiAoZSkgPT4gbG9nRGVjaXNpb24oZS5jaG9zZW4pLCAgICAgICAgLy8gRmxvd1JlY29yZGVyIG1ldGhvZFxuICogfTtcbiAqXG4gKiBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyKGF1ZGl0KTtcbiAqIC8vIF4gaW50ZXJuYWxseTogZGV0ZWN0cyBib3RoIHNldHMgb2YgbWV0aG9kcywgcm91dGVzIHRvIGJvdGggY2hhbm5lbHMuXG4gKiBgYGBcbiAqXG4gKiAjIyBDb250cmFjdCB3aXRoIGV4aXN0aW5nIEFQSXNcbiAqXG4gKiAtIGBhdHRhY2hSZWNvcmRlcihyKWAgYW5kIGBhdHRhY2hGbG93UmVjb3JkZXIocilgIHJlbWFpbiB1bmNoYW5nZWQuXG4gKiAgIENvbnN1bWVycyB3aG8gd2FudCBvbmx5IE9ORSBjaGFubmVsIGtlZXAgdXNpbmcgdGhlbSDigJQgZXhwbGljaXQgaXMgZ29vZC5cbiAqIC0gYGF0dGFjaENvbWJpbmVkUmVjb3JkZXIocilgIGlzIHRoZSBPTkxZIHdheSB0byBndWFyYW50ZWUgYW4gb2JqZWN0IGlzXG4gKiAgIGhvb2tlZCBpbnRvIGV2ZXJ5IHN0cmVhbSBpdCBoYXMgbWV0aG9kcyBmb3IsIHdpdGhvdXQgbWFpbnRhaW5pbmcgdHdvXG4gKiAgIGF0dGFjaCBjYWxscyBhdCB0aGUgY2FsbCBzaXRlLlxuICogLSBJZGVtcG90ZW5jeSBieSBgaWRgIGlzIHByZXNlcnZlZCBhY3Jvc3MgY2hhbm5lbHM6IHJlLWF0dGFjaGluZyB3aXRoIHRoZVxuICogICBzYW1lIGBpZGAgcmVwbGFjZXMgdGhlIHByZXZpb3VzIGluc3RhbmNlIG9uIEJPVEggY2hhbm5lbHMsIG5vdCBqdXN0IG9uZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEZsb3dFcnJvckV2ZW50LCBGbG93UGF1c2VFdmVudCwgRmxvd1JlY29yZGVyLCBGbG93UmVzdW1lRXZlbnQgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgRXJyb3JFdmVudCwgUGF1c2VFdmVudCwgUmVjb3JkZXIsIFJlc3VtZUV2ZW50IH0gZnJvbSAnLi4vc2NvcGUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBFbWl0UmVjb3JkZXIgfSBmcm9tICcuL0VtaXRSZWNvcmRlci5qcyc7XG5cbi8qKlxuICogTWV0aG9kIG5hbWVzIHRoYXQgYXBwZWFyIG9uIEJPVEggYFJlY29yZGVyYCBhbmQgYEZsb3dSZWNvcmRlcmAgYnV0IHdpdGhcbiAqIGRpZmZlcmVudCBldmVudCBwYXlsb2FkIHR5cGVzLiBGb3IgdGhlc2UsIGEgYENvbWJpbmVkUmVjb3JkZXJgIGRlY2xhcmVzXG4gKiBPTkUgaGFuZGxlciB0aGF0IHJlY2VpdmVzIHRoZSB1bmlvbiBvZiBib3RoIHBheWxvYWRzIOKAlCBjb25zdW1lcnNcbiAqIGRpc2NyaW1pbmF0ZSBvbiBgdHJhdmVyc2FsQ29udGV4dGAsIHdoaWNoIG9ubHkgY29udHJvbC1mbG93IGV2ZW50cyBjYXJyeS5cbiAqL1xudHlwZSBTaGFyZWRMaWZlY3ljbGVPdmVybGFwID0gJ29uRXJyb3InIHwgJ29uUGF1c2UnIHwgJ29uUmVzdW1lJztcblxuLyoqIExpZmVjeWNsZSBob29rcyAobm90IGV2ZW50LXNwZWNpZmljKSB0aGF0IGJvdGggaW50ZXJmYWNlcyBzaGFyZSBpZGVudGljYWxseS4gKi9cbnR5cGUgU2hhcmVkTGlmZWN5Y2xlID0gJ2lkJyB8ICdjbGVhcicgfCAndG9TbmFwc2hvdCc7XG5cbi8qKlxuICogQSByZWNvcmRlciB0aGF0IE1BWSBvYnNlcnZlIGFueSBjb21iaW5hdGlvbiBvZiBzdXBwb3J0ZWQgZXZlbnQgc3RyZWFtcy5cbiAqXG4gKiBUb2RheSdzIHN0cmVhbXM6XG4gKiAgIC0gU2NvcGUgZGF0YS1mbG93IChgUmVjb3JkZXJgOiBvblJlYWQvb25Xcml0ZS9vbkNvbW1pdC9vblN0YWdlU3RhcnQv4oCmKVxuICogICAtIENvbnRyb2wtZmxvdyAoYEZsb3dSZWNvcmRlcmA6IG9uRGVjaXNpb24vb25TdWJmbG93RW50cnkvb25Mb29wL+KApilcbiAqXG4gKiBBbGwgZXZlbnQgaGFuZGxlcnMgYXJlIG9wdGlvbmFsIOKAlCBpbXBsZW1lbnQgb25seSB3aGF0IHlvdSBjYXJlIGFib3V0LlxuICogYGlkYCBpcyByZXF1aXJlZCBzbyB0aGUgbGlicmFyeSBjYW4gZGVkdXBsaWNhdGUgcmUtYXR0YWNoZXMuXG4gKlxuICogIyMgU2hhcmVkIG1ldGhvZCBuYW1lcyAob25FcnJvciAvIG9uUGF1c2UgLyBvblJlc3VtZSlcbiAqXG4gKiBCb3RoIGBSZWNvcmRlcmAgYW5kIGBGbG93UmVjb3JkZXJgIGRlY2xhcmUgdGhlc2Ugd2l0aCBESUZGRVJFTlQgcGF5bG9hZFxuICogc2hhcGVzLiBJbiBhIGNvbWJpbmVkIHJlY29yZGVyLCBlYWNoIHN1Y2ggaGFuZGxlciBpcyBjYWxsZWQgYnkgQk9USFxuICogY2hhbm5lbHMgd2l0aCBpdHMgb3duIHZhcmlhbnQuIFRoZSBwYXJhbWV0ZXIgdHlwZSBpcyBhIHVuaW9uIOKAlCBjb25zdW1lcnNcbiAqIGNhbiBlaXRoZXIgaGFuZGxlIGJvdGggdmFyaWFudHMgdW5pZm9ybWx5LCBvciBkaXNjcmltaW5hdGUgKGNvbnRyb2wtZmxvd1xuICogdmFyaWFudHMgY2FycnkgYSBgdHJhdmVyc2FsQ29udGV4dGAgZmllbGQgdGhhdCBkYXRhLWZsb3cgdmFyaWFudHMgbGFjaykuXG4gKlxuICogIyMgRm9yd2FyZCBjb21wYXRpYmlsaXR5XG4gKlxuICogV2hlbiBhIHRoaXJkIG9ic2VydmVyIHR5cGUgc2hpcHMgKGUuZy4gYE9wZXJhdGlvblJlY29yZGVyYCksIHRoZSB0eXBlXG4gKiBnYWlucyBhbm90aGVyIGAmIFBhcnRpYWw84oCmPmAgY2xhdXNlLiBCZWNhdXNlIGV2ZXJ5IGNsYXVzZSBpcyBgUGFydGlhbGAsXG4gKiBleGlzdGluZyBgQ29tYmluZWRSZWNvcmRlcmAgaW1wbGVtZW50YXRpb25zIHJlbWFpbiB0eXBlLXZhbGlkLlxuICovXG5leHBvcnQgdHlwZSBDb21iaW5lZFJlY29yZGVyID0gUGFydGlhbDxPbWl0PFJlY29yZGVyLCBTaGFyZWRMaWZlY3ljbGVPdmVybGFwIHwgU2hhcmVkTGlmZWN5Y2xlPj4gJlxuICBQYXJ0aWFsPE9taXQ8Rmxvd1JlY29yZGVyLCBTaGFyZWRMaWZlY3ljbGVPdmVybGFwIHwgU2hhcmVkTGlmZWN5Y2xlPj4gJlxuICAvLyBFbWl0IGNoYW5uZWwg4oCUIG5ldyB0aGlyZCBzdHJlYW0gKFBoYXNlIDMpLiBObyBtZXRob2QtbmFtZSBvdmVybGFwIHdpdGhcbiAgLy8gdGhlIG90aGVyIHR3byBpbnRlcmZhY2VzLCBzbyBhIHBsYWluIGludGVyc2VjdGlvbiBpcyBzb3VuZCDigJQgbm9cbiAgLy8gdW5pb24tcGF5bG9hZCBkaXNjcmltaW5hdG9yIG5lZWRlZC5cbiAgUGFydGlhbDxPbWl0PEVtaXRSZWNvcmRlciwgU2hhcmVkTGlmZWN5Y2xlPj4gJiB7XG4gICAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAgIC8vIFNoYXJlZCBsaWZlY3ljbGUgaG9va3Mg4oCUIHNhbWUgb24gYm90aCBpbnRlcmZhY2VzLCBzaGFwZSBjb21wYXRpYmxlLlxuICAgIGNsZWFyPygpOiB2b2lkO1xuICAgIHRvU25hcHNob3Q/KCk6IHtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgICAgcHJlZmVycmVkT3BlcmF0aW9uPzogJ3RyYW5zbGF0ZScgfCAnYWNjdW11bGF0ZScgfCAnYWdncmVnYXRlJztcbiAgICAgIGRhdGE6IHVua25vd247XG4gICAgfTtcblxuICAgIC8vIFNoYXJlZCBldmVudCBtZXRob2QgbmFtZXMgd2l0aCBESVZFUkdFTlQgcGF5bG9hZHMg4oCUIGRlY2xhcmVkIGFzIHVuaW9ucy5cbiAgICAvLyBDb25zdW1lcnMgZWl0aGVyIGhhbmRsZSBib3RoIHZhcmlhbnRzLCBvciBkaXNjcmltaW5hdGUgdXNpbmcgdGhlXG4gICAgLy8gZXhwb3J0ZWQgaGVscGVyIGBpc0Zsb3dFdmVudCgpYCAod2hpY2ggY2hlY2tzIGZvciB0aGVcbiAgICAvLyBgdHJhdmVyc2FsQ29udGV4dGAgZmllbGQg4oCUIHByZXNlbnQgb25seSBvbiBjb250cm9sLWZsb3cgdmFyaWFudHMpLlxuICAgIC8vXG4gICAgLy8gQGV4YW1wbGVcbiAgICAvLyBgYGB0c1xuICAgIC8vIGNvbnN0IGF1ZGl0OiBDb21iaW5lZFJlY29yZGVyID0ge1xuICAgIC8vICAgaWQ6ICdhdWRpdCcsXG4gICAgLy8gICBvbkVycm9yOiAoZSkgPT4ge1xuICAgIC8vICAgICBpZiAoaXNGbG93RXZlbnQoZSkpIHtcbiAgICAvLyAgICAgICAvLyBlIGlzIEZsb3dFcnJvckV2ZW50IOKAlCBoYXMgc3RhZ2VOYW1lLCBtZXNzYWdlLCBzdHJ1Y3R1cmVkRXJyb3JcbiAgICAvLyAgICAgICBsb2coJ2Zsb3cgZXJyb3IgaW4gc3RhZ2UnLCBlLnN0YWdlTmFtZSk7XG4gICAgLy8gICAgIH0gZWxzZSB7XG4gICAgLy8gICAgICAgLy8gZSBpcyBFcnJvckV2ZW50IOKAlCBoYXMgZXJyb3IsIG9wZXJhdGlvbiwga2V5P1xuICAgIC8vICAgICAgIGxvZygnc2NvcGUgZXJyb3IgZHVyaW5nJywgZS5vcGVyYXRpb24sIGUuZXJyb3IubWVzc2FnZSk7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgIH0sXG4gICAgLy8gfTtcbiAgICAvLyBgYGBcbiAgICBvbkVycm9yPyhldmVudDogRXJyb3JFdmVudCB8IEZsb3dFcnJvckV2ZW50KTogdm9pZDtcbiAgICBvblBhdXNlPyhldmVudDogUGF1c2VFdmVudCB8IEZsb3dQYXVzZUV2ZW50KTogdm9pZDtcbiAgICBvblJlc3VtZT8oZXZlbnQ6IFJlc3VtZUV2ZW50IHwgRmxvd1Jlc3VtZUV2ZW50KTogdm9pZDtcbiAgfTtcblxuLyoqXG4gKiBEaXNjcmltaW5hdG9yIGZvciB0aGUgdW5pb24gcGF5bG9hZCB0eXBlcyBvbiBgQ29tYmluZWRSZWNvcmRlcmAncyBzaGFyZWRcbiAqIG1ldGhvZHMgKGBvbkVycm9yYCwgYG9uUGF1c2VgLCBgb25SZXN1bWVgKS4gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGV2ZW50XG4gKiB3YXMgZW1pdHRlZCBmcm9tIHRoZSBjb250cm9sLWZsb3cgY2hhbm5lbCAoRmxvd1JlY29yZGVyKS5cbiAqXG4gKiAjIyBIb3cgaXQgZGlzY3JpbWluYXRlc1xuICpcbiAqIFNjb3BlLWNoYW5uZWwgZXZlbnRzIGV4dGVuZCBgUmVjb3JkZXJDb250ZXh0YCwgd2hpY2ggY2FycmllcyBgcGlwZWxpbmVJZGAuXG4gKiBGbG93LWNoYW5uZWwgZXZlbnRzIGRvIG5vdCBjYXJyeSBgcGlwZWxpbmVJZGAgKHRoZXkgY2FycnkgYW4gb3B0aW9uYWxcbiAqIGB0cmF2ZXJzYWxDb250ZXh0YCBpbnN0ZWFkLCBidXQgdGhhdCBmaWVsZCBpcyBvcHRpb25hbCBhbmQgY2Fubm90IGJlXG4gKiByZWxpZWQgb24gYXMgYSBwb3NpdGl2ZSBzaWduYWwpLiBXZSBkZXRlY3QgdGhlIGZsb3cgdmFyaWFudCBieSB0aGVcbiAqIEFCU0VOQ0Ugb2YgYHBpcGVsaW5lSWRgIOKAlCB0aGlzIGlzIHNjaGVtYS1zdGFibGUgYXMgbG9uZyBhcyBzY29wZSBldmVudHNcbiAqIGNvbnRpbnVlIHRvIGV4dGVuZCBgUmVjb3JkZXJDb250ZXh0YC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIG9uRXJyb3I6IChlKSA9PiB7XG4gKiAgIGlmIChpc0Zsb3dFdmVudChlKSkge1xuICogICAgIC8vIE5hcnJvd2VkIHRvIEZsb3dFcnJvckV2ZW50OiBoYXMgc3RhZ2VOYW1lLCBtZXNzYWdlLCBzdHJ1Y3R1cmVkRXJyb3JcbiAqICAgfSBlbHNlIHtcbiAqICAgICAvLyBOYXJyb3dlZCB0byBFcnJvckV2ZW50OiBoYXMgZXJyb3IsIG9wZXJhdGlvbiwga2V5P1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRmxvd0V2ZW50PFQ+KGV2ZW50OiBUKTogZXZlbnQgaXMgRXhjbHVkZTxULCB7IHBpcGVsaW5lSWQ6IHN0cmluZyB9PiB7XG4gIGlmICh0eXBlb2YgZXZlbnQgIT09ICdvYmplY3QnIHx8IGV2ZW50ID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAoZXZlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnBpcGVsaW5lSWQgPT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBNZXRob2QgbmFtZXMgYmVsb25naW5nIHRvIHRoZSBgUmVjb3JkZXJgIChkYXRhLWZsb3cpIGludGVyZmFjZS5cbiAqIEtlcHQgYXMgYSBzaW5nbGUgc291cmNlIG9mIHRydXRoIHNvIHRoZSBydW50aW1lIGR1Y2stdHlwZSBkZXRlY3RvciBzdGF5c1xuICogaW4gc3luYyB3aXRoIHRoZSBpbnRlcmZhY2UuIElmIGEgbWV0aG9kIGlzIGFkZGVkIHRvIGBSZWNvcmRlcmAsIGFkZGluZyBpdFxuICogaGVyZSBpcyB0aGUgT05MWSBjaGFuZ2UgcmVxdWlyZWQgdG8gcm91dGUgY29tYmluZWQtcmVjb3JkZXJzIGNvcnJlY3RseS5cbiAqL1xuY29uc3QgUkVDT1JERVJfRVZFTlRfTUVUSE9EUyA9IFtcbiAgJ29uUmVhZCcsXG4gICdvbldyaXRlJyxcbiAgJ29uQ29tbWl0JyxcbiAgJ29uRXJyb3InLFxuICAnb25TdGFnZVN0YXJ0JyxcbiAgJ29uU3RhZ2VFbmQnLFxuICAnb25QYXVzZScsXG4gICdvblJlc3VtZScsXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIE1ldGhvZCBuYW1lcyBiZWxvbmdpbmcgdG8gdGhlIGBGbG93UmVjb3JkZXJgIChjb250cm9sLWZsb3cpIGludGVyZmFjZS5cbiAqIFNlZSB0aGUgbm90ZSBvbiBgUkVDT1JERVJfRVZFTlRfTUVUSE9EU2AuXG4gKlxuICogTk9URTogdGhlIGBvbkVycm9yYCwgYG9uUGF1c2VgLCBgb25SZXN1bWVgIG1ldGhvZHMgZXhpc3Qgb24gQk9USCBpbnRlcmZhY2VzXG4gKiB3aXRoIERJRkZFUkVOVCBldmVudCBwYXlsb2FkIHNoYXBlcy4gQSBgQ29tYmluZWRSZWNvcmRlcmAgdGhhdCBpbXBsZW1lbnRzXG4gKiBhbnkgb2YgdGhlc2UgcmVjZWl2ZXMgYm90aCB2YXJpYW50cyAob25lIGZyb20gZWFjaCBjaGFubmVsKS4gQ29uc3VtZXJzIHdob1xuICogY2FyZSBhYm91dCB0aGUgZGlzdGluY3Rpb24gY2FuIGRpc2NyaW1pbmF0ZSBvbiB0aGUgcHJlc2VuY2Ugb2ZcbiAqIGB0cmF2ZXJzYWxDb250ZXh0YCAod2hpY2ggb25seSBjb250cm9sLWZsb3cgZXZlbnRzIGNhcnJ5KS5cbiAqL1xuY29uc3QgRkxPV19SRUNPUkRFUl9FVkVOVF9NRVRIT0RTID0gW1xuICAnb25TdGFnZUV4ZWN1dGVkJyxcbiAgJ29uTmV4dCcsXG4gICdvbkRlY2lzaW9uJyxcbiAgJ29uRm9yaycsXG4gICdvblNlbGVjdGVkJyxcbiAgJ29uU3ViZmxvd0VudHJ5JyxcbiAgJ29uU3ViZmxvd0V4aXQnLFxuICAnb25TdWJmbG93UmVnaXN0ZXJlZCcsXG4gICdvbkxvb3AnLFxuICAnb25CcmVhaycsXG4gICdvbkVycm9yJyxcbiAgJ29uUGF1c2UnLFxuICAnb25SZXN1bWUnLFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBNZXRob2QgbmFtZXMgYmVsb25naW5nIHRvIHRoZSBgRW1pdFJlY29yZGVyYCAodXNlci1lbWl0dGVkIGV2ZW50cylcbiAqIGludGVyZmFjZS4gU2FtZSBjb252ZW50aW9uIGFzIHRoZSBvdGhlciB0d28gYXJyYXlzIGFib3ZlIOKAlCBrZXB0IGFzXG4gKiB0aGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgZHVjay10eXBlIGRldGVjdGlvbi5cbiAqL1xuY29uc3QgRU1JVF9SRUNPUkRFUl9FVkVOVF9NRVRIT0RTID0gWydvbkVtaXQnXSBhcyBjb25zdDtcblxuLyoqXG4gKiBUcnVlIGlmZiB0aGUgcmVjb3JkZXIgZGVjbGFyZXMgYSBtZXRob2QgbmFtZWQgYG1gIGVpdGhlciBhcyBhbiBvd25cbiAqIHByb3BlcnR5IE9SIG9uIGl0cyBjbGFzcy1wcm90b3R5cGUgY2hhaW4g4oCUIGJ1dCBOT1QgaW5oZXJpdGVkIGZyb21cbiAqIGBPYmplY3QucHJvdG90eXBlYC5cbiAqXG4gKiAjIyBXaHkgdGhpcyBsYXllcmVkIGNoZWNrXG4gKlxuICogQSBgQ29tYmluZWRSZWNvcmRlcmAgY2FuIGJlIGVpdGhlciBhIHBsYWluIG9iamVjdCBsaXRlcmFsIChoYW5kbGVycyBhc1xuICogb3duIHByb3BlcnRpZXMpIE9SIGEgY2xhc3MgaW5zdGFuY2UgKGhhbmRsZXJzIGFzIGNsYXNzLXByb3RvdHlwZVxuICogbWV0aG9kcykuIEJvdGggYXJlIGxlZ2l0aW1hdGUgY29uc3VtZXIgcGF0dGVybnMgYW5kIGJvdGggTVVTVCBhdHRhY2guXG4gKlxuICogQnV0IGhhbmRsZXJzIGluaGVyaXRlZCBmcm9tIGBPYmplY3QucHJvdG90eXBlYCBhcmUgQUxXQVlTIGFjY2lkZW50YWwgb3JcbiAqIG1hbGljaW91cyAobm9ib2R5IGxlZ2l0aW1hdGVseSBhdHRhY2hlcyByZWNvcmRlciBtZXRob2RzIHRoZXJlKS4gU28gd2VcbiAqIHdhbGsgdGhlIHByb3RvdHlwZSBjaGFpbiwgU1RPUFBJTkcgYmVmb3JlIGBPYmplY3QucHJvdG90eXBlYC4gVGhpc1xuICogYWNjZXB0cyBjbGFzcyBtZXRob2RzIHdoaWxlIHN0aWxsIGJsb2NraW5nIGBPYmplY3QucHJvdG90eXBlYFxuICogcG9sbHV0aW9uIGF0dGFja3MuXG4gKi9cbmZ1bmN0aW9uIGhhc093bk9yQ2xhc3NNZXRob2QocjogdW5rbm93biwgbTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChyID09PSBudWxsIHx8IHR5cGVvZiByICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsIG0pKSB7XG4gICAgcmV0dXJuIHR5cGVvZiAociBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbbV0gPT09ICdmdW5jdGlvbic7XG4gIH1cbiAgbGV0IHByb3RvOiB1bmtub3duID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHIpO1xuICB3aGlsZSAocHJvdG8gIT09IG51bGwgJiYgcHJvdG8gIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCBtKSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiAocHJvdG8gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW21dID09PSAnZnVuY3Rpb24nO1xuICAgIH1cbiAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFRydWUgaWZmIHRoZSByZWNvcmRlciBpbXBsZW1lbnRzIGF0IGxlYXN0IG9uZSBkYXRhLWZsb3cgZXZlbnQgbWV0aG9kLlxuICogVXNlZCBieSBgZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcmAgdG8gZGVjaWRlIHdoZXRoZXIgdG8gaG9vayBpbnRvXG4gKiB0aGUgc2NvcGUgZGF0YS1mbG93IGNoYW5uZWwuXG4gKlxuICogIyMgRGV0ZWN0aW9uIHJ1bGVcbiAqXG4gKiBBY2NlcHRzIGJvdGggb2JqZWN0LWxpdGVyYWwgcmVjb3JkZXJzIChvd24tcHJvcGVydHkgaGFuZGxlcnMpIEFORCBjbGFzc1xuICogaW5zdGFuY2VzIChoYW5kbGVycyBkZWNsYXJlZCBvbiB0aGUgY2xhc3MgcHJvdG90eXBlKS4gUmVqZWN0cyBoYW5kbGVyc1xuICogaW5oZXJpdGVkIGZyb20gYE9iamVjdC5wcm90b3R5cGVgIOKAlCB0aGF0J3MgYWx3YXlzIGFjY2lkZW50YWwgb3JcbiAqIG1hbGljaW91cyBwb2xsdXRpb24sIG5ldmVyIGEgbGVnaXRpbWF0ZSByZWNvcmRlci5cbiAqXG4gKiAjIyBMaWZlY3ljbGUgZXhjbHVzaW9uc1xuICpcbiAqIGBjbGVhcmAgYW5kIGB0b1NuYXBzaG90YCBhcmUgTk9UIGNvdW50ZWQgYXMgZXZlbnQgbWV0aG9kcyDigJQgYSByZWNvcmRlclxuICogdGhhdCBvbmx5IGltcGxlbWVudHMgdGhvc2UgaGFzIG5vdGhpbmcgdG8gb2JzZXJ2ZSBhbmQgd291bGQgYmUgYSBuby1vcFxuICogb24gZWl0aGVyIGNoYW5uZWwuXG4gKlxuICogIyMgUmV0dXJuIHR5cGVcbiAqXG4gKiBSZXR1cm5zIHBsYWluIGBib29sZWFuYCAobm90IGEgdHlwZSBwcmVkaWNhdGUpLiBUaGUgZnVsbCBgUmVjb3JkZXJgXG4gKiBpbnRlcmZhY2UgaGFzIHBheWxvYWQgdHlwZXMgdGhhdCBkaXZlcmdlIGZyb20gYENvbWJpbmVkUmVjb3JkZXJgJ3MgdW5pb25cbiAqIHZhcmlhbnRzIGZvciBzaGFyZWQgbWV0aG9kcywgc28gYSBuYXJyb3dpbmcgcHJlZGljYXRlIHdvdWxkIGJlIHVuc291bmQuXG4gKiBDYWxsZXJzIHRoYXQgbmVlZCB0byB0cmVhdCB0aGUgcmVjb3JkZXIgYXMgYSBgUmVjb3JkZXJgIGRvIHNvIGV4cGxpY2l0bHlcbiAqIGF0IHRoZSBhdHRhY2ggc2l0ZSDigJQgdGhlIGNhc3QgaXMgdGhlIGNvbnRyYWN0IHRoYXQgZWFjaCBjaGFubmVsIHBhc3Nlc1xuICogaXRzIG93biBwYXlsb2FkIHZhcmlhbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNSZWNvcmRlck1ldGhvZHMocjogQ29tYmluZWRSZWNvcmRlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gUkVDT1JERVJfRVZFTlRfTUVUSE9EUy5zb21lKChtKSA9PiBoYXNPd25PckNsYXNzTWV0aG9kKHIsIG0pKTtcbn1cblxuLyoqXG4gKiBUcnVlIGlmZiB0aGUgcmVjb3JkZXIgaW1wbGVtZW50cyBhdCBsZWFzdCBvbmUgY29udHJvbC1mbG93IGV2ZW50IG1ldGhvZC5cbiAqIFNlZSBgaGFzUmVjb3JkZXJNZXRob2RzYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0Zsb3dSZWNvcmRlck1ldGhvZHMocjogQ29tYmluZWRSZWNvcmRlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gRkxPV19SRUNPUkRFUl9FVkVOVF9NRVRIT0RTLnNvbWUoKG0pID0+IGhhc093bk9yQ2xhc3NNZXRob2QociwgbSkpO1xufVxuXG4vKipcbiAqIFRydWUgaWZmIHRoZSByZWNvcmRlciBpbXBsZW1lbnRzIGF0IGxlYXN0IG9uZSBlbWl0LWNoYW5uZWwgZXZlbnQgbWV0aG9kLlxuICogU2VlIGBoYXNSZWNvcmRlck1ldGhvZHNgIGZvciB0aGUgb3duZXJzaGlwLWRldGVjdGlvbiBydWxlcyAob3duIG9yXG4gKiBjbGFzcy1wcm90b3R5cGUgbWV0aG9kcyBjb3VudDsgYE9iamVjdC5wcm90b3R5cGVgIHBvbGx1dGlvbiBkb2VzIG5vdCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNFbWl0UmVjb3JkZXJNZXRob2RzKHI6IENvbWJpbmVkUmVjb3JkZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIEVNSVRfUkVDT1JERVJfRVZFTlRfTUVUSE9EUy5zb21lKChtKSA9PiBoYXNPd25PckNsYXNzTWV0aG9kKHIsIG0pKTtcbn1cbiJdfQ==
|
|
211
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tYmluZWRSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvQ29tYmluZWRSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVERztBQW1GSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBSSxLQUFRO0lBQ3JDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDOUQsT0FBUSxLQUFpQyxDQUFDLFVBQVUsS0FBSyxTQUFTLENBQUM7QUFDckUsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxzQkFBc0IsR0FBRztJQUM3QixRQUFRO0lBQ1IsU0FBUztJQUNULFVBQVU7SUFDVixTQUFTO0lBQ1QsY0FBYztJQUNkLFlBQVk7SUFDWixTQUFTO0lBQ1QsVUFBVTtDQUNGLENBQUM7QUFFWDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLDJCQUEyQixHQUFHO0lBQ2xDLGlCQUFpQjtJQUNqQixRQUFRO0lBQ1IsWUFBWTtJQUNaLFFBQVE7SUFDUixZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLGVBQWU7SUFDZixxQkFBcUI7SUFDckIsUUFBUTtJQUNSLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7Q0FDRixDQUFDO0FBRVg7Ozs7R0FJRztBQUNILE1BQU0sMkJBQTJCLEdBQUcsQ0FBQyxRQUFRLENBQVUsQ0FBQztBQUV4RDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILFNBQVMsbUJBQW1CLENBQUMsQ0FBVSxFQUFFLENBQVM7SUFDaEQsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN0RCxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMvQyxPQUFPLE9BQVEsQ0FBNkIsQ0FBQyxDQUFDLENBQUMsS0FBSyxVQUFVLENBQUM7SUFDakUsQ0FBQztJQUNELElBQUksS0FBSyxHQUFZLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUMsT0FBTyxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDcEQsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbkQsT0FBTyxPQUFRLEtBQWlDLENBQUMsQ0FBQyxDQUFDLEtBQUssVUFBVSxDQUFDO1FBQ3JFLENBQUM7UUFDRCxLQUFLLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLENBQW1CO0lBQ3BELE9BQU8sc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUFDLENBQW1CO0lBQ3hELE9BQU8sMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxDQUFtQjtJQUN4RCxPQUFPLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29tYmluZWRSZWNvcmRlciDigJQgYSBzaW5nbGUgb2JzZXJ2ZXIgdGhhdCBjYW4gaG9vayBpbnRvIE1VTFRJUExFIGV2ZW50XG4gKiBzdHJlYW1zIChjdXJyZW50bHk6IHNjb3BlIGRhdGEtZmxvdyArIGNvbnRyb2wtZmxvdykuIE9uZSBvYmplY3QsIG9uZSBgaWRgLFxuICogb25lIGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgZXhlY3V0aW9uLlxuICpcbiAqICMjIFdoeSB0aGlzIGV4aXN0c1xuICpcbiAqIEJlZm9yZSBgQ29tYmluZWRSZWNvcmRlcmAsIGEgY29uc3VtZXIgd2hvIHdhbnRlZCB0byBvYnNlcnZlIGJvdGggc3RyZWFtc1xuICogaGFkIHRvOlxuICogICAxLiBJbXBsZW1lbnQgYm90aCBgU2NvcGVSZWNvcmRlcmAgKDggbWV0aG9kcykgYW5kIGBGbG93UmVjb3JkZXJgICgxMiBtZXRob2RzKVxuICogICAgICBmdWxseSDigJQgc3R1YmJpbmcgZXZlcnkgZXZlbnQgdGhleSBkaWRuJ3QgY2FyZSBhYm91dC5cbiAqICAgMi4gUmVtZW1iZXIgdG8gY2FsbCBCT1RIIGBhdHRhY2hTY29wZVJlY29yZGVyKHIpYCBBTkQgYGF0dGFjaEZsb3dSZWNvcmRlcihyKWAuXG4gKiAgICAgIEZvcmdldHRpbmcgdGhlIHNlY29uZCBjYWxsIHNpbGVudGx5IGRyb3BwZWQgaGFsZiB0aGVpciBldmVudHMg4oCUIG5vXG4gKiAgICAgIHdhcm5pbmcsIG5vIHJ1bnRpbWUgZXJyb3IuXG4gKiAgIDMuIFJlLWltcGxlbWVudCBjb29yZGluYXRpb24gbG9naWMgKGJ1ZmZlcmluZywgb3JkZXJpbmcpIHRoZW1zZWx2ZXMuXG4gKlxuICogYENvbWJpbmVkUmVjb3JkZXJgIGNvbGxhcHNlcyB0aGF0IGludG8gYSBzaW5nbGUgdHlwZSBhbmQgYSBzaW5nbGUgYXR0YWNoXG4gKiBjYWxsIChgZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihyKWApLCB3aXRoIHRoZSBsaWJyYXJ5IGhhbmRsaW5nIHRoZVxuICogcm91dGluZyBpbnRlcm5hbGx5LiBDb25zdW1lcnMgaW1wbGVtZW50IG9ubHkgdGhlIGV2ZW50cyB0aGV5IGNhcmUgYWJvdXRcbiAqIChgUGFydGlhbDwuLi4+YCkgYW5kIHRoZSBhdHRhY2ggbWV0aG9kIGR1Y2stdHlwZXMgYXQgcnVudGltZSB0byBkaXNwYXRjaFxuICogdG8gdGhlIHJlbGV2YW50IGNoYW5uZWxzLlxuICpcbiAqICMjIEZvcndhcmQgY29tcGF0aWJpbGl0eVxuICpcbiAqIFdoZW4gYSB0aGlyZCBvYnNlcnZlciB0eXBlIGlzIGFkZGVkIChlLmcuIGFuIGBPcGVyYXRpb25SZWNvcmRlcmApLCB0aGVcbiAqIGBDb21iaW5lZFJlY29yZGVyYCB0eXBlIGdhaW5zIGFuIGAmIFBhcnRpYWw8T3BlcmF0aW9uUmVjb3JkZXI+YCBjbGF1c2UgYW5kXG4gKiBgYXR0YWNoQ29tYmluZWRSZWNvcmRlcmAgZ2FpbnMgb25lIG1vcmUgcnVudGltZSBicmFuY2ggaW4gaXRzIGRpc3BhdGNoLlxuICogQ29uc3VtZXJzIHdyaXRpbmcgYSBgQ29tYmluZWRSZWNvcmRlcmAgdG9kYXkgYXJlIE5PVCBhZmZlY3RlZCDigJQgdGhlaXJcbiAqIGNvZGUga2VlcHMgY29tcGlsaW5nIGFuZCBhdHRhY2hpbmcgY29ycmVjdGx5LCBiZWNhdXNlIGV2ZXJ5IG5ldyBsYXllciBpc1xuICogb3B0aW9uYWwuXG4gKlxuICogIyMgRXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB0eXBlIHsgQ29tYmluZWRSZWNvcmRlciB9IGZyb20gJ2Zvb3RwcmludGpzJztcbiAqXG4gKiBjb25zdCBhdWRpdDogQ29tYmluZWRSZWNvcmRlciA9IHtcbiAqICAgaWQ6ICdhdWRpdCcsXG4gKiAgIG9uV3JpdGU6IChlKSA9PiBsb2dXcml0ZShlLmtleSwgZS52YWx1ZSksICAgICAgICAvLyBTY29wZVJlY29yZGVyIG1ldGhvZFxuICogICBvbkRlY2lzaW9uOiAoZSkgPT4gbG9nRGVjaXNpb24oZS5jaG9zZW4pLCAgICAgICAgLy8gRmxvd1JlY29yZGVyIG1ldGhvZFxuICogfTtcbiAqXG4gKiBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyKGF1ZGl0KTtcbiAqIC8vIF4gaW50ZXJuYWxseTogZGV0ZWN0cyBib3RoIHNldHMgb2YgbWV0aG9kcywgcm91dGVzIHRvIGJvdGggY2hhbm5lbHMuXG4gKiBgYGBcbiAqXG4gKiAjIyBDb250cmFjdCB3aXRoIGV4aXN0aW5nIEFQSXNcbiAqXG4gKiAtIGBhdHRhY2hTY29wZVJlY29yZGVyKHIpYCBhbmQgYGF0dGFjaEZsb3dSZWNvcmRlcihyKWAgcmVtYWluIHVuY2hhbmdlZC5cbiAqICAgQ29uc3VtZXJzIHdobyB3YW50IG9ubHkgT05FIGNoYW5uZWwga2VlcCB1c2luZyB0aGVtIOKAlCBleHBsaWNpdCBpcyBnb29kLlxuICogLSBgYXR0YWNoQ29tYmluZWRSZWNvcmRlcihyKWAgaXMgdGhlIE9OTFkgd2F5IHRvIGd1YXJhbnRlZSBhbiBvYmplY3QgaXNcbiAqICAgaG9va2VkIGludG8gZXZlcnkgc3RyZWFtIGl0IGhhcyBtZXRob2RzIGZvciwgd2l0aG91dCBtYWludGFpbmluZyB0d29cbiAqICAgYXR0YWNoIGNhbGxzIGF0IHRoZSBjYWxsIHNpdGUuXG4gKiAtIElkZW1wb3RlbmN5IGJ5IGBpZGAgaXMgcHJlc2VydmVkIGFjcm9zcyBjaGFubmVsczogcmUtYXR0YWNoaW5nIHdpdGggdGhlXG4gKiAgIHNhbWUgYGlkYCByZXBsYWNlcyB0aGUgcHJldmlvdXMgaW5zdGFuY2Ugb24gQk9USCBjaGFubmVscywgbm90IGp1c3Qgb25lLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRmxvd0Vycm9yRXZlbnQsIEZsb3dQYXVzZUV2ZW50LCBGbG93UmVjb3JkZXIsIEZsb3dSZXN1bWVFdmVudCB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBFcnJvckV2ZW50LCBQYXVzZUV2ZW50LCBSZXN1bWVFdmVudCwgU2NvcGVSZWNvcmRlciB9IGZyb20gJy4uL3Njb3BlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgRW1pdFJlY29yZGVyIH0gZnJvbSAnLi9FbWl0UmVjb3JkZXIuanMnO1xuXG4vKipcbiAqIE1ldGhvZCBuYW1lcyB0aGF0IGFwcGVhciBvbiBCT1RIIGBTY29wZVJlY29yZGVyYCBhbmQgYEZsb3dSZWNvcmRlcmAgYnV0IHdpdGhcbiAqIGRpZmZlcmVudCBldmVudCBwYXlsb2FkIHR5cGVzLiBGb3IgdGhlc2UsIGEgYENvbWJpbmVkUmVjb3JkZXJgIGRlY2xhcmVzXG4gKiBPTkUgaGFuZGxlciB0aGF0IHJlY2VpdmVzIHRoZSB1bmlvbiBvZiBib3RoIHBheWxvYWRzIOKAlCBjb25zdW1lcnNcbiAqIGRpc2NyaW1pbmF0ZSBvbiBgdHJhdmVyc2FsQ29udGV4dGAsIHdoaWNoIG9ubHkgY29udHJvbC1mbG93IGV2ZW50cyBjYXJyeS5cbiAqL1xudHlwZSBTaGFyZWRMaWZlY3ljbGVPdmVybGFwID0gJ29uRXJyb3InIHwgJ29uUGF1c2UnIHwgJ29uUmVzdW1lJztcblxuLyoqIExpZmVjeWNsZSBob29rcyAobm90IGV2ZW50LXNwZWNpZmljKSB0aGF0IGJvdGggaW50ZXJmYWNlcyBzaGFyZSBpZGVudGljYWxseS4gKi9cbnR5cGUgU2hhcmVkTGlmZWN5Y2xlID0gJ2lkJyB8ICdjbGVhcicgfCAndG9TbmFwc2hvdCc7XG5cbi8qKlxuICogQSByZWNvcmRlciB0aGF0IE1BWSBvYnNlcnZlIGFueSBjb21iaW5hdGlvbiBvZiBzdXBwb3J0ZWQgZXZlbnQgc3RyZWFtcy5cbiAqXG4gKiBUb2RheSdzIHN0cmVhbXM6XG4gKiAgIC0gU2NvcGUgZGF0YS1mbG93IChgU2NvcGVSZWNvcmRlcmA6IG9uUmVhZC9vbldyaXRlL29uQ29tbWl0L29uU3RhZ2VTdGFydC/igKYpXG4gKiAgIC0gQ29udHJvbC1mbG93IChgRmxvd1JlY29yZGVyYDogb25EZWNpc2lvbi9vblN1YmZsb3dFbnRyeS9vbkxvb3Av4oCmKVxuICpcbiAqIEFsbCBldmVudCBoYW5kbGVycyBhcmUgb3B0aW9uYWwg4oCUIGltcGxlbWVudCBvbmx5IHdoYXQgeW91IGNhcmUgYWJvdXQuXG4gKiBgaWRgIGlzIHJlcXVpcmVkIHNvIHRoZSBsaWJyYXJ5IGNhbiBkZWR1cGxpY2F0ZSByZS1hdHRhY2hlcy5cbiAqXG4gKiAjIyBTaGFyZWQgbWV0aG9kIG5hbWVzIChvbkVycm9yIC8gb25QYXVzZSAvIG9uUmVzdW1lKVxuICpcbiAqIEJvdGggYFNjb3BlUmVjb3JkZXJgIGFuZCBgRmxvd1JlY29yZGVyYCBkZWNsYXJlIHRoZXNlIHdpdGggRElGRkVSRU5UIHBheWxvYWRcbiAqIHNoYXBlcy4gSW4gYSBjb21iaW5lZCByZWNvcmRlciwgZWFjaCBzdWNoIGhhbmRsZXIgaXMgY2FsbGVkIGJ5IEJPVEhcbiAqIGNoYW5uZWxzIHdpdGggaXRzIG93biB2YXJpYW50LiBUaGUgcGFyYW1ldGVyIHR5cGUgaXMgYSB1bmlvbiDigJQgY29uc3VtZXJzXG4gKiBjYW4gZWl0aGVyIGhhbmRsZSBib3RoIHZhcmlhbnRzIHVuaWZvcm1seSwgb3IgZGlzY3JpbWluYXRlIChjb250cm9sLWZsb3dcbiAqIHZhcmlhbnRzIGNhcnJ5IGEgYHRyYXZlcnNhbENvbnRleHRgIGZpZWxkIHRoYXQgZGF0YS1mbG93IHZhcmlhbnRzIGxhY2spLlxuICpcbiAqICMjIEZvcndhcmQgY29tcGF0aWJpbGl0eVxuICpcbiAqIFdoZW4gYSB0aGlyZCBvYnNlcnZlciB0eXBlIHNoaXBzIChlLmcuIGBPcGVyYXRpb25SZWNvcmRlcmApLCB0aGUgdHlwZVxuICogZ2FpbnMgYW5vdGhlciBgJiBQYXJ0aWFsPOKApj5gIGNsYXVzZS4gQmVjYXVzZSBldmVyeSBjbGF1c2UgaXMgYFBhcnRpYWxgLFxuICogZXhpc3RpbmcgYENvbWJpbmVkUmVjb3JkZXJgIGltcGxlbWVudGF0aW9ucyByZW1haW4gdHlwZS12YWxpZC5cbiAqL1xuZXhwb3J0IHR5cGUgQ29tYmluZWRSZWNvcmRlciA9IFBhcnRpYWw8T21pdDxTY29wZVJlY29yZGVyLCBTaGFyZWRMaWZlY3ljbGVPdmVybGFwIHwgU2hhcmVkTGlmZWN5Y2xlPj4gJlxuICBQYXJ0aWFsPE9taXQ8Rmxvd1JlY29yZGVyLCBTaGFyZWRMaWZlY3ljbGVPdmVybGFwIHwgU2hhcmVkTGlmZWN5Y2xlPj4gJlxuICAvLyBFbWl0IGNoYW5uZWwg4oCUIG5ldyB0aGlyZCBzdHJlYW0gKFBoYXNlIDMpLiBObyBtZXRob2QtbmFtZSBvdmVybGFwIHdpdGhcbiAgLy8gdGhlIG90aGVyIHR3byBpbnRlcmZhY2VzLCBzbyBhIHBsYWluIGludGVyc2VjdGlvbiBpcyBzb3VuZCDigJQgbm9cbiAgLy8gdW5pb24tcGF5bG9hZCBkaXNjcmltaW5hdG9yIG5lZWRlZC5cbiAgUGFydGlhbDxPbWl0PEVtaXRSZWNvcmRlciwgU2hhcmVkTGlmZWN5Y2xlPj4gJiB7XG4gICAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAgIC8vIFNoYXJlZCBsaWZlY3ljbGUgaG9va3Mg4oCUIHNhbWUgb24gYm90aCBpbnRlcmZhY2VzLCBzaGFwZSBjb21wYXRpYmxlLlxuICAgIGNsZWFyPygpOiB2b2lkO1xuICAgIHRvU25hcHNob3Q/KCk6IHtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgICAgcHJlZmVycmVkT3BlcmF0aW9uPzogJ3RyYW5zbGF0ZScgfCAnYWNjdW11bGF0ZScgfCAnYWdncmVnYXRlJztcbiAgICAgIGRhdGE6IHVua25vd247XG4gICAgfTtcblxuICAgIC8vIFNoYXJlZCBldmVudCBtZXRob2QgbmFtZXMgd2l0aCBESVZFUkdFTlQgcGF5bG9hZHMg4oCUIGRlY2xhcmVkIGFzIHVuaW9ucy5cbiAgICAvLyBDb25zdW1lcnMgZWl0aGVyIGhhbmRsZSBib3RoIHZhcmlhbnRzLCBvciBkaXNjcmltaW5hdGUgdXNpbmcgdGhlXG4gICAgLy8gZXhwb3J0ZWQgaGVscGVyIGBpc0Zsb3dFdmVudCgpYCAod2hpY2ggY2hlY2tzIGZvciB0aGVcbiAgICAvLyBgdHJhdmVyc2FsQ29udGV4dGAgZmllbGQg4oCUIHByZXNlbnQgb25seSBvbiBjb250cm9sLWZsb3cgdmFyaWFudHMpLlxuICAgIC8vXG4gICAgLy8gQGV4YW1wbGVcbiAgICAvLyBgYGB0c1xuICAgIC8vIGNvbnN0IGF1ZGl0OiBDb21iaW5lZFJlY29yZGVyID0ge1xuICAgIC8vICAgaWQ6ICdhdWRpdCcsXG4gICAgLy8gICBvbkVycm9yOiAoZSkgPT4ge1xuICAgIC8vICAgICBpZiAoaXNGbG93RXZlbnQoZSkpIHtcbiAgICAvLyAgICAgICAvLyBlIGlzIEZsb3dFcnJvckV2ZW50IOKAlCBoYXMgc3RhZ2VOYW1lLCBtZXNzYWdlLCBzdHJ1Y3R1cmVkRXJyb3JcbiAgICAvLyAgICAgICBsb2coJ2Zsb3cgZXJyb3IgaW4gc3RhZ2UnLCBlLnN0YWdlTmFtZSk7XG4gICAgLy8gICAgIH0gZWxzZSB7XG4gICAgLy8gICAgICAgLy8gZSBpcyBFcnJvckV2ZW50IOKAlCBoYXMgZXJyb3IsIG9wZXJhdGlvbiwga2V5P1xuICAgIC8vICAgICAgIGxvZygnc2NvcGUgZXJyb3IgZHVyaW5nJywgZS5vcGVyYXRpb24sIGUuZXJyb3IubWVzc2FnZSk7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgIH0sXG4gICAgLy8gfTtcbiAgICAvLyBgYGBcbiAgICBvbkVycm9yPyhldmVudDogRXJyb3JFdmVudCB8IEZsb3dFcnJvckV2ZW50KTogdm9pZDtcbiAgICBvblBhdXNlPyhldmVudDogUGF1c2VFdmVudCB8IEZsb3dQYXVzZUV2ZW50KTogdm9pZDtcbiAgICBvblJlc3VtZT8oZXZlbnQ6IFJlc3VtZUV2ZW50IHwgRmxvd1Jlc3VtZUV2ZW50KTogdm9pZDtcbiAgfTtcblxuLyoqXG4gKiBEaXNjcmltaW5hdG9yIGZvciB0aGUgdW5pb24gcGF5bG9hZCB0eXBlcyBvbiBgQ29tYmluZWRSZWNvcmRlcmAncyBzaGFyZWRcbiAqIG1ldGhvZHMgKGBvbkVycm9yYCwgYG9uUGF1c2VgLCBgb25SZXN1bWVgKS4gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGV2ZW50XG4gKiB3YXMgZW1pdHRlZCBmcm9tIHRoZSBjb250cm9sLWZsb3cgY2hhbm5lbCAoRmxvd1JlY29yZGVyKS5cbiAqXG4gKiAjIyBIb3cgaXQgZGlzY3JpbWluYXRlc1xuICpcbiAqIFNjb3BlLWNoYW5uZWwgZXZlbnRzIGV4dGVuZCBgUmVjb3JkZXJDb250ZXh0YCwgd2hpY2ggY2FycmllcyBgcGlwZWxpbmVJZGAuXG4gKiBGbG93LWNoYW5uZWwgZXZlbnRzIGRvIG5vdCBjYXJyeSBgcGlwZWxpbmVJZGAgKHRoZXkgY2FycnkgYW4gb3B0aW9uYWxcbiAqIGB0cmF2ZXJzYWxDb250ZXh0YCBpbnN0ZWFkLCBidXQgdGhhdCBmaWVsZCBpcyBvcHRpb25hbCBhbmQgY2Fubm90IGJlXG4gKiByZWxpZWQgb24gYXMgYSBwb3NpdGl2ZSBzaWduYWwpLiBXZSBkZXRlY3QgdGhlIGZsb3cgdmFyaWFudCBieSB0aGVcbiAqIEFCU0VOQ0Ugb2YgYHBpcGVsaW5lSWRgIOKAlCB0aGlzIGlzIHNjaGVtYS1zdGFibGUgYXMgbG9uZyBhcyBzY29wZSBldmVudHNcbiAqIGNvbnRpbnVlIHRvIGV4dGVuZCBgUmVjb3JkZXJDb250ZXh0YC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIG9uRXJyb3I6IChlKSA9PiB7XG4gKiAgIGlmIChpc0Zsb3dFdmVudChlKSkge1xuICogICAgIC8vIE5hcnJvd2VkIHRvIEZsb3dFcnJvckV2ZW50OiBoYXMgc3RhZ2VOYW1lLCBtZXNzYWdlLCBzdHJ1Y3R1cmVkRXJyb3JcbiAqICAgfSBlbHNlIHtcbiAqICAgICAvLyBOYXJyb3dlZCB0byBFcnJvckV2ZW50OiBoYXMgZXJyb3IsIG9wZXJhdGlvbiwga2V5P1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRmxvd0V2ZW50PFQ+KGV2ZW50OiBUKTogZXZlbnQgaXMgRXhjbHVkZTxULCB7IHBpcGVsaW5lSWQ6IHN0cmluZyB9PiB7XG4gIGlmICh0eXBlb2YgZXZlbnQgIT09ICdvYmplY3QnIHx8IGV2ZW50ID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAoZXZlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnBpcGVsaW5lSWQgPT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBNZXRob2QgbmFtZXMgYmVsb25naW5nIHRvIHRoZSBgU2NvcGVSZWNvcmRlcmAgKGRhdGEtZmxvdykgaW50ZXJmYWNlLlxuICogS2VwdCBhcyBhIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggc28gdGhlIHJ1bnRpbWUgZHVjay10eXBlIGRldGVjdG9yIHN0YXlzXG4gKiBpbiBzeW5jIHdpdGggdGhlIGludGVyZmFjZS4gSWYgYSBtZXRob2QgaXMgYWRkZWQgdG8gYFNjb3BlUmVjb3JkZXJgLCBhZGRpbmcgaXRcbiAqIGhlcmUgaXMgdGhlIE9OTFkgY2hhbmdlIHJlcXVpcmVkIHRvIHJvdXRlIGNvbWJpbmVkLXJlY29yZGVycyBjb3JyZWN0bHkuXG4gKi9cbmNvbnN0IFJFQ09SREVSX0VWRU5UX01FVEhPRFMgPSBbXG4gICdvblJlYWQnLFxuICAnb25Xcml0ZScsXG4gICdvbkNvbW1pdCcsXG4gICdvbkVycm9yJyxcbiAgJ29uU3RhZ2VTdGFydCcsXG4gICdvblN0YWdlRW5kJyxcbiAgJ29uUGF1c2UnLFxuICAnb25SZXN1bWUnLFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBNZXRob2QgbmFtZXMgYmVsb25naW5nIHRvIHRoZSBgRmxvd1JlY29yZGVyYCAoY29udHJvbC1mbG93KSBpbnRlcmZhY2UuXG4gKiBTZWUgdGhlIG5vdGUgb24gYFJFQ09SREVSX0VWRU5UX01FVEhPRFNgLlxuICpcbiAqIE5PVEU6IHRoZSBgb25FcnJvcmAsIGBvblBhdXNlYCwgYG9uUmVzdW1lYCBtZXRob2RzIGV4aXN0IG9uIEJPVEggaW50ZXJmYWNlc1xuICogd2l0aCBESUZGRVJFTlQgZXZlbnQgcGF5bG9hZCBzaGFwZXMuIEEgYENvbWJpbmVkUmVjb3JkZXJgIHRoYXQgaW1wbGVtZW50c1xuICogYW55IG9mIHRoZXNlIHJlY2VpdmVzIGJvdGggdmFyaWFudHMgKG9uZSBmcm9tIGVhY2ggY2hhbm5lbCkuIENvbnN1bWVycyB3aG9cbiAqIGNhcmUgYWJvdXQgdGhlIGRpc3RpbmN0aW9uIGNhbiBkaXNjcmltaW5hdGUgb24gdGhlIHByZXNlbmNlIG9mXG4gKiBgdHJhdmVyc2FsQ29udGV4dGAgKHdoaWNoIG9ubHkgY29udHJvbC1mbG93IGV2ZW50cyBjYXJyeSkuXG4gKi9cbmNvbnN0IEZMT1dfUkVDT1JERVJfRVZFTlRfTUVUSE9EUyA9IFtcbiAgJ29uU3RhZ2VFeGVjdXRlZCcsXG4gICdvbk5leHQnLFxuICAnb25EZWNpc2lvbicsXG4gICdvbkZvcmsnLFxuICAnb25TZWxlY3RlZCcsXG4gICdvblN1YmZsb3dFbnRyeScsXG4gICdvblN1YmZsb3dFeGl0JyxcbiAgJ29uU3ViZmxvd1JlZ2lzdGVyZWQnLFxuICAnb25Mb29wJyxcbiAgJ29uQnJlYWsnLFxuICAnb25FcnJvcicsXG4gICdvblBhdXNlJyxcbiAgJ29uUmVzdW1lJyxcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogTWV0aG9kIG5hbWVzIGJlbG9uZ2luZyB0byB0aGUgYEVtaXRSZWNvcmRlcmAgKHVzZXItZW1pdHRlZCBldmVudHMpXG4gKiBpbnRlcmZhY2UuIFNhbWUgY29udmVudGlvbiBhcyB0aGUgb3RoZXIgdHdvIGFycmF5cyBhYm92ZSDigJQga2VwdCBhc1xuICogdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIGR1Y2stdHlwZSBkZXRlY3Rpb24uXG4gKi9cbmNvbnN0IEVNSVRfUkVDT1JERVJfRVZFTlRfTUVUSE9EUyA9IFsnb25FbWl0J10gYXMgY29uc3Q7XG5cbi8qKlxuICogVHJ1ZSBpZmYgdGhlIHJlY29yZGVyIGRlY2xhcmVzIGEgbWV0aG9kIG5hbWVkIGBtYCBlaXRoZXIgYXMgYW4gb3duXG4gKiBwcm9wZXJ0eSBPUiBvbiBpdHMgY2xhc3MtcHJvdG90eXBlIGNoYWluIOKAlCBidXQgTk9UIGluaGVyaXRlZCBmcm9tXG4gKiBgT2JqZWN0LnByb3RvdHlwZWAuXG4gKlxuICogIyMgV2h5IHRoaXMgbGF5ZXJlZCBjaGVja1xuICpcbiAqIEEgYENvbWJpbmVkUmVjb3JkZXJgIGNhbiBiZSBlaXRoZXIgYSBwbGFpbiBvYmplY3QgbGl0ZXJhbCAoaGFuZGxlcnMgYXNcbiAqIG93biBwcm9wZXJ0aWVzKSBPUiBhIGNsYXNzIGluc3RhbmNlIChoYW5kbGVycyBhcyBjbGFzcy1wcm90b3R5cGVcbiAqIG1ldGhvZHMpLiBCb3RoIGFyZSBsZWdpdGltYXRlIGNvbnN1bWVyIHBhdHRlcm5zIGFuZCBib3RoIE1VU1QgYXR0YWNoLlxuICpcbiAqIEJ1dCBoYW5kbGVycyBpbmhlcml0ZWQgZnJvbSBgT2JqZWN0LnByb3RvdHlwZWAgYXJlIEFMV0FZUyBhY2NpZGVudGFsIG9yXG4gKiBtYWxpY2lvdXMgKG5vYm9keSBsZWdpdGltYXRlbHkgYXR0YWNoZXMgcmVjb3JkZXIgbWV0aG9kcyB0aGVyZSkuIFNvIHdlXG4gKiB3YWxrIHRoZSBwcm90b3R5cGUgY2hhaW4sIFNUT1BQSU5HIGJlZm9yZSBgT2JqZWN0LnByb3RvdHlwZWAuIFRoaXNcbiAqIGFjY2VwdHMgY2xhc3MgbWV0aG9kcyB3aGlsZSBzdGlsbCBibG9ja2luZyBgT2JqZWN0LnByb3RvdHlwZWBcbiAqIHBvbGx1dGlvbiBhdHRhY2tzLlxuICovXG5mdW5jdGlvbiBoYXNPd25PckNsYXNzTWV0aG9kKHI6IHVua25vd24sIG06IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAociA9PT0gbnVsbCB8fCB0eXBlb2YgciAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyLCBtKSkge1xuICAgIHJldHVybiB0eXBlb2YgKHIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW21dID09PSAnZnVuY3Rpb24nO1xuICB9XG4gIGxldCBwcm90bzogdW5rbm93biA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihyKTtcbiAgd2hpbGUgKHByb3RvICE9PSBudWxsICYmIHByb3RvICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgbSkpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgKHByb3RvIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVttXSA9PT0gJ2Z1bmN0aW9uJztcbiAgICB9XG4gICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBUcnVlIGlmZiB0aGUgcmVjb3JkZXIgaW1wbGVtZW50cyBhdCBsZWFzdCBvbmUgZGF0YS1mbG93IGV2ZW50IG1ldGhvZC5cbiAqIFVzZWQgYnkgYGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXJgIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGhvb2sgaW50b1xuICogdGhlIHNjb3BlIGRhdGEtZmxvdyBjaGFubmVsLlxuICpcbiAqICMjIERldGVjdGlvbiBydWxlXG4gKlxuICogQWNjZXB0cyBib3RoIG9iamVjdC1saXRlcmFsIHJlY29yZGVycyAob3duLXByb3BlcnR5IGhhbmRsZXJzKSBBTkQgY2xhc3NcbiAqIGluc3RhbmNlcyAoaGFuZGxlcnMgZGVjbGFyZWQgb24gdGhlIGNsYXNzIHByb3RvdHlwZSkuIFJlamVjdHMgaGFuZGxlcnNcbiAqIGluaGVyaXRlZCBmcm9tIGBPYmplY3QucHJvdG90eXBlYCDigJQgdGhhdCdzIGFsd2F5cyBhY2NpZGVudGFsIG9yXG4gKiBtYWxpY2lvdXMgcG9sbHV0aW9uLCBuZXZlciBhIGxlZ2l0aW1hdGUgcmVjb3JkZXIuXG4gKlxuICogIyMgTGlmZWN5Y2xlIGV4Y2x1c2lvbnNcbiAqXG4gKiBgY2xlYXJgIGFuZCBgdG9TbmFwc2hvdGAgYXJlIE5PVCBjb3VudGVkIGFzIGV2ZW50IG1ldGhvZHMg4oCUIGEgcmVjb3JkZXJcbiAqIHRoYXQgb25seSBpbXBsZW1lbnRzIHRob3NlIGhhcyBub3RoaW5nIHRvIG9ic2VydmUgYW5kIHdvdWxkIGJlIGEgbm8tb3BcbiAqIG9uIGVpdGhlciBjaGFubmVsLlxuICpcbiAqICMjIFJldHVybiB0eXBlXG4gKlxuICogUmV0dXJucyBwbGFpbiBgYm9vbGVhbmAgKG5vdCBhIHR5cGUgcHJlZGljYXRlKS4gVGhlIGZ1bGwgYFNjb3BlUmVjb3JkZXJgXG4gKiBpbnRlcmZhY2UgaGFzIHBheWxvYWQgdHlwZXMgdGhhdCBkaXZlcmdlIGZyb20gYENvbWJpbmVkUmVjb3JkZXJgJ3MgdW5pb25cbiAqIHZhcmlhbnRzIGZvciBzaGFyZWQgbWV0aG9kcywgc28gYSBuYXJyb3dpbmcgcHJlZGljYXRlIHdvdWxkIGJlIHVuc291bmQuXG4gKiBDYWxsZXJzIHRoYXQgbmVlZCB0byB0cmVhdCB0aGUgcmVjb3JkZXIgYXMgYSBgU2NvcGVSZWNvcmRlcmAgZG8gc28gZXhwbGljaXRseVxuICogYXQgdGhlIGF0dGFjaCBzaXRlIOKAlCB0aGUgY2FzdCBpcyB0aGUgY29udHJhY3QgdGhhdCBlYWNoIGNoYW5uZWwgcGFzc2VzXG4gKiBpdHMgb3duIHBheWxvYWQgdmFyaWFudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1JlY29yZGVyTWV0aG9kcyhyOiBDb21iaW5lZFJlY29yZGVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBSRUNPUkRFUl9FVkVOVF9NRVRIT0RTLnNvbWUoKG0pID0+IGhhc093bk9yQ2xhc3NNZXRob2QociwgbSkpO1xufVxuXG4vKipcbiAqIFRydWUgaWZmIHRoZSByZWNvcmRlciBpbXBsZW1lbnRzIGF0IGxlYXN0IG9uZSBjb250cm9sLWZsb3cgZXZlbnQgbWV0aG9kLlxuICogU2VlIGBoYXNSZWNvcmRlck1ldGhvZHNgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzRmxvd1JlY29yZGVyTWV0aG9kcyhyOiBDb21iaW5lZFJlY29yZGVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBGTE9XX1JFQ09SREVSX0VWRU5UX01FVEhPRFMuc29tZSgobSkgPT4gaGFzT3duT3JDbGFzc01ldGhvZChyLCBtKSk7XG59XG5cbi8qKlxuICogVHJ1ZSBpZmYgdGhlIHJlY29yZGVyIGltcGxlbWVudHMgYXQgbGVhc3Qgb25lIGVtaXQtY2hhbm5lbCBldmVudCBtZXRob2QuXG4gKiBTZWUgYGhhc1JlY29yZGVyTWV0aG9kc2AgZm9yIHRoZSBvd25lcnNoaXAtZGV0ZWN0aW9uIHJ1bGVzIChvd24gb3JcbiAqIGNsYXNzLXByb3RvdHlwZSBtZXRob2RzIGNvdW50OyBgT2JqZWN0LnByb3RvdHlwZWAgcG9sbHV0aW9uIGRvZXMgbm90KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0VtaXRSZWNvcmRlck1ldGhvZHMocjogQ29tYmluZWRSZWNvcmRlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gRU1JVF9SRUNPUkRFUl9FVkVOVF9NRVRIT0RTLnNvbWUoKG0pID0+IGhhc093bk9yQ2xhc3NNZXRob2QociwgbSkpO1xufVxuIl19
|