footprintjs 9.48.2 → 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. package/AGENTS.md +12 -10
  2. package/CLAUDE.md +21 -23
  3. package/README.md +1 -1
  4. package/dist/advanced.js +71 -128
  5. package/dist/esm/advanced.d.ts +24 -58
  6. package/dist/esm/advanced.js +13 -51
  7. package/dist/esm/index.d.ts +5 -8
  8. package/dist/esm/index.js +3 -3
  9. package/dist/esm/lib/builder/FlowChartBuilder.d.ts +1 -1
  10. package/dist/esm/lib/builder/FlowChartBuilder.js +3 -3
  11. package/dist/esm/lib/builder/structure/StructureRecorder.d.ts +1 -1
  12. package/dist/esm/lib/builder/structure/StructureRecorder.js +1 -1
  13. package/dist/esm/lib/capture/index.d.ts +0 -1
  14. package/dist/esm/lib/capture/index.js +1 -2
  15. package/dist/esm/lib/engine/graph/prefixNodeTree.js +2 -2
  16. package/dist/esm/lib/engine/handlers/ResumeEntry.d.ts +3 -3
  17. package/dist/esm/lib/engine/handlers/ResumeEntry.js +4 -4
  18. package/dist/esm/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
  19. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +4 -8
  20. package/dist/esm/lib/engine/index.d.ts +1 -1
  21. package/dist/esm/lib/engine/index.js +1 -1
  22. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
  23. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
  24. package/dist/esm/lib/engine/narrative/index.d.ts +1 -1
  25. package/dist/esm/lib/engine/narrative/index.js +1 -1
  26. package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +1 -11
  27. package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
  28. package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
  29. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +4 -6
  30. package/dist/esm/lib/engine/traversalContext.d.ts +1 -1
  31. package/dist/esm/lib/engine/traversalContext.js +2 -2
  32. package/dist/esm/lib/engine/types.d.ts +2 -10
  33. package/dist/esm/lib/engine/types.js +1 -1
  34. package/dist/esm/lib/engine/walkSubflowSpec.js +2 -2
  35. package/dist/esm/lib/ids/reservedIds.js +2 -2
  36. package/dist/esm/lib/memory/DiagnosticCollector.js +2 -2
  37. package/dist/esm/lib/memory/StageContext.d.ts +2 -4
  38. package/dist/esm/lib/memory/StageContext.js +2 -2
  39. package/dist/esm/lib/memory/borrowedMutation.js +2 -2
  40. package/dist/esm/lib/memory/index.d.ts +6 -21
  41. package/dist/esm/lib/memory/index.js +4 -22
  42. package/dist/esm/lib/memory/redaction.d.ts +1 -1
  43. package/dist/esm/lib/memory/redaction.js +2 -2
  44. package/dist/esm/lib/memory/runPolicy.d.ts +3 -2
  45. package/dist/esm/lib/memory/runPolicy.js +1 -1
  46. package/dist/esm/lib/reactive/createTypedScope.js +2 -2
  47. package/dist/esm/lib/reactive/writeTraps.js +2 -2
  48. package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +3 -2
  49. package/dist/esm/lib/recorder/ControlDepRecorder.js +3 -2
  50. package/dist/esm/lib/recorder/EmitRecorder.d.ts +1 -1
  51. package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
  52. package/dist/esm/lib/recorder/InOutRecorder.js +2 -2
  53. package/dist/esm/lib/recorder/qualityTrace.d.ts +1 -1
  54. package/dist/esm/lib/recorder/qualityTrace.js +2 -2
  55. package/dist/esm/lib/runner/DeferredObserverTier.js +2 -2
  56. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +4 -5
  57. package/dist/esm/lib/runner/ExecutionRuntime.js +2 -5
  58. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +1 -1
  59. package/dist/esm/lib/runner/FlowChartExecutor.js +1 -1
  60. package/dist/esm/lib/runner/getSubtreeSnapshot.d.ts +1 -1
  61. package/dist/esm/lib/runner/getSubtreeSnapshot.js +4 -4
  62. package/dist/esm/lib/runner/resume.js +2 -2
  63. package/dist/esm/lib/runner/snapshot.js +3 -2
  64. package/dist/esm/lib/scope/ScopeFacade.js +2 -2
  65. package/dist/esm/lib/scope/state/zod/scopeFactory.js +2 -2
  66. package/dist/esm/recorders.d.ts +2 -3
  67. package/dist/esm/recorders.js +1 -1
  68. package/dist/esm/trace.d.ts +11 -57
  69. package/dist/esm/trace.js +10 -68
  70. package/dist/index.js +3 -3
  71. package/dist/lib/builder/FlowChartBuilder.js +5 -5
  72. package/dist/lib/builder/structure/StructureRecorder.js +1 -1
  73. package/dist/lib/capture/index.js +2 -4
  74. package/dist/lib/engine/graph/prefixNodeTree.js +5 -5
  75. package/dist/lib/engine/handlers/ResumeEntry.js +4 -4
  76. package/dist/lib/engine/handlers/SubflowExecutor.js +5 -9
  77. package/dist/lib/engine/index.js +1 -1
  78. package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
  79. package/dist/lib/engine/narrative/index.js +1 -1
  80. package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
  81. package/dist/lib/engine/traversal/FlowchartTraverser.js +8 -10
  82. package/dist/lib/engine/traversalContext.js +4 -4
  83. package/dist/lib/engine/types.js +1 -1
  84. package/dist/lib/engine/walkSubflowSpec.js +3 -3
  85. package/dist/lib/ids/reservedIds.js +5 -5
  86. package/dist/lib/memory/DiagnosticCollector.js +3 -3
  87. package/dist/lib/memory/StageContext.js +3 -3
  88. package/dist/lib/memory/borrowedMutation.js +3 -3
  89. package/dist/lib/memory/index.js +7 -42
  90. package/dist/lib/memory/redaction.js +3 -3
  91. package/dist/lib/memory/runPolicy.js +1 -1
  92. package/dist/lib/reactive/createTypedScope.js +3 -3
  93. package/dist/lib/reactive/writeTraps.js +4 -4
  94. package/dist/lib/recorder/ControlDepRecorder.js +3 -2
  95. package/dist/lib/recorder/EmitRecorder.js +1 -1
  96. package/dist/lib/recorder/InOutRecorder.js +3 -3
  97. package/dist/lib/recorder/qualityTrace.js +4 -4
  98. package/dist/lib/runner/DeferredObserverTier.js +3 -3
  99. package/dist/lib/runner/ExecutionRuntime.js +6 -9
  100. package/dist/lib/runner/FlowChartExecutor.js +1 -1
  101. package/dist/lib/runner/getSubtreeSnapshot.js +6 -6
  102. package/dist/lib/runner/resume.js +3 -3
  103. package/dist/lib/runner/snapshot.js +6 -5
  104. package/dist/lib/scope/ScopeFacade.js +3 -3
  105. package/dist/lib/scope/state/zod/scopeFactory.js +4 -4
  106. package/dist/recorders.js +1 -1
  107. package/dist/trace.js +18 -120
  108. package/dist/types/advanced.d.ts +24 -58
  109. package/dist/types/index.d.ts +5 -8
  110. package/dist/types/lib/builder/FlowChartBuilder.d.ts +1 -1
  111. package/dist/types/lib/builder/structure/StructureRecorder.d.ts +1 -1
  112. package/dist/types/lib/capture/index.d.ts +0 -1
  113. package/dist/types/lib/engine/handlers/ResumeEntry.d.ts +3 -3
  114. package/dist/types/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
  115. package/dist/types/lib/engine/index.d.ts +1 -1
  116. package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
  117. package/dist/types/lib/engine/narrative/index.d.ts +1 -1
  118. package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +1 -11
  119. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
  120. package/dist/types/lib/engine/traversalContext.d.ts +1 -1
  121. package/dist/types/lib/engine/types.d.ts +2 -10
  122. package/dist/types/lib/memory/StageContext.d.ts +2 -4
  123. package/dist/types/lib/memory/index.d.ts +6 -21
  124. package/dist/types/lib/memory/redaction.d.ts +1 -1
  125. package/dist/types/lib/memory/runPolicy.d.ts +3 -2
  126. package/dist/types/lib/recorder/ControlDepRecorder.d.ts +3 -2
  127. package/dist/types/lib/recorder/EmitRecorder.d.ts +1 -1
  128. package/dist/types/lib/recorder/qualityTrace.d.ts +1 -1
  129. package/dist/types/lib/runner/ExecutionRuntime.d.ts +4 -5
  130. package/dist/types/lib/runner/FlowChartExecutor.d.ts +1 -1
  131. package/dist/types/lib/runner/getSubtreeSnapshot.d.ts +1 -1
  132. package/dist/types/recorders.d.ts +2 -3
  133. package/dist/types/trace.d.ts +11 -57
  134. package/package.json +6 -15
  135. package/dist/esm/lib/capture/freeze.d.ts +0 -91
  136. package/dist/esm/lib/capture/freeze.js +0 -314
  137. package/dist/esm/lib/capture/ownData.d.ts +0 -7
  138. package/dist/esm/lib/capture/ownData.js +0 -15
  139. package/dist/esm/lib/capture/valueKinds.d.ts +0 -57
  140. package/dist/esm/lib/capture/valueKinds.js +0 -142
  141. package/dist/esm/lib/ids/runtimeStageId.d.ts +0 -173
  142. package/dist/esm/lib/ids/runtimeStageId.js +0 -194
  143. package/dist/esm/lib/memory/EventLog.d.ts +0 -105
  144. package/dist/esm/lib/memory/EventLog.js +0 -148
  145. package/dist/esm/lib/memory/RecordFrame.d.ts +0 -232
  146. package/dist/esm/lib/memory/RecordFrame.js +0 -296
  147. package/dist/esm/lib/memory/SharedMemory.d.ts +0 -46
  148. package/dist/esm/lib/memory/SharedMemory.js +0 -88
  149. package/dist/esm/lib/memory/TransactionBuffer.d.ts +0 -521
  150. package/dist/esm/lib/memory/TransactionBuffer.js +0 -946
  151. package/dist/esm/lib/memory/admission.d.ts +0 -81
  152. package/dist/esm/lib/memory/admission.js +0 -153
  153. package/dist/esm/lib/memory/backtrack.d.ts +0 -286
  154. package/dist/esm/lib/memory/backtrack.js +0 -457
  155. package/dist/esm/lib/memory/commitLogUtils.d.ts +0 -217
  156. package/dist/esm/lib/memory/commitLogUtils.js +0 -384
  157. package/dist/esm/lib/memory/deltaEncoding.d.ts +0 -66
  158. package/dist/esm/lib/memory/deltaEncoding.js +0 -122
  159. package/dist/esm/lib/memory/equality.d.ts +0 -93
  160. package/dist/esm/lib/memory/equality.js +0 -262
  161. package/dist/esm/lib/memory/eventPosition.d.ts +0 -18
  162. package/dist/esm/lib/memory/eventPosition.js +0 -2
  163. package/dist/esm/lib/memory/honesty.d.ts +0 -93
  164. package/dist/esm/lib/memory/honesty.js +0 -92
  165. package/dist/esm/lib/memory/keyPaths.d.ts +0 -125
  166. package/dist/esm/lib/memory/keyPaths.js +0 -227
  167. package/dist/esm/lib/memory/logModel.d.ts +0 -76
  168. package/dist/esm/lib/memory/logModel.js +0 -364
  169. package/dist/esm/lib/memory/merge.d.ts +0 -26
  170. package/dist/esm/lib/memory/merge.js +0 -60
  171. package/dist/esm/lib/memory/pathOps.d.ts +0 -115
  172. package/dist/esm/lib/memory/pathOps.js +0 -290
  173. package/dist/esm/lib/memory/paths.d.ts +0 -52
  174. package/dist/esm/lib/memory/paths.js +0 -57
  175. package/dist/esm/lib/memory/placeholders.d.ts +0 -39
  176. package/dist/esm/lib/memory/placeholders.js +0 -40
  177. package/dist/esm/lib/memory/recordCommit.d.ts +0 -45
  178. package/dist/esm/lib/memory/recordCommit.js +0 -61
  179. package/dist/esm/lib/memory/scrub.d.ts +0 -53
  180. package/dist/esm/lib/memory/scrub.js +0 -74
  181. package/dist/esm/lib/memory/types.d.ts +0 -209
  182. package/dist/esm/lib/memory/types.js +0 -10
  183. package/dist/esm/lib/memory/utils.d.ts +0 -73
  184. package/dist/esm/lib/memory/utils.js +0 -159
  185. package/dist/esm/lib/memory/verbs.d.ts +0 -333
  186. package/dist/esm/lib/memory/verbs.js +0 -427
  187. package/dist/esm/lib/recorder/CommitRangeIndex.d.ts +0 -147
  188. package/dist/esm/lib/recorder/CommitRangeIndex.js +0 -207
  189. package/dist/esm/lib/scope/detectCircular.d.ts +0 -13
  190. package/dist/esm/lib/scope/detectCircular.js +0 -14
  191. package/dist/esm/lib/scope/recorders/summarizeValue.d.ts +0 -5
  192. package/dist/esm/lib/scope/recorders/summarizeValue.js +0 -6
  193. package/dist/esm/lib/slice/elementProvenance.d.ts +0 -81
  194. package/dist/esm/lib/slice/elementProvenance.js +0 -190
  195. package/dist/esm/lib/slice/forwardSliceForKey.d.ts +0 -88
  196. package/dist/esm/lib/slice/forwardSliceForKey.js +0 -243
  197. package/dist/esm/lib/slice/index.d.ts +0 -25
  198. package/dist/esm/lib/slice/index.js +0 -25
  199. package/dist/esm/lib/slice/keyIndex.d.ts +0 -137
  200. package/dist/esm/lib/slice/keyIndex.js +0 -293
  201. package/dist/esm/lib/slice/keyTimeline.d.ts +0 -49
  202. package/dist/esm/lib/slice/keyTimeline.js +0 -113
  203. package/dist/esm/lib/slice/keysReadSources.d.ts +0 -51
  204. package/dist/esm/lib/slice/keysReadSources.js +0 -95
  205. package/dist/esm/lib/slice/serialize.d.ts +0 -78
  206. package/dist/esm/lib/slice/serialize.js +0 -278
  207. package/dist/esm/lib/slice/sliceForKey.d.ts +0 -47
  208. package/dist/esm/lib/slice/sliceForKey.js +0 -88
  209. package/dist/esm/lib/slice/types.d.ts +0 -567
  210. package/dist/esm/lib/slice/types.js +0 -25
  211. package/dist/esm/lib/time-travel/axis.d.ts +0 -119
  212. package/dist/esm/lib/time-travel/axis.js +0 -179
  213. package/dist/esm/lib/time-travel/bundles.d.ts +0 -77
  214. package/dist/esm/lib/time-travel/bundles.js +0 -136
  215. package/dist/esm/lib/time-travel/chain.d.ts +0 -93
  216. package/dist/esm/lib/time-travel/chain.js +0 -188
  217. package/dist/esm/lib/time-travel/commitStops.d.ts +0 -55
  218. package/dist/esm/lib/time-travel/commitStops.js +0 -202
  219. package/dist/esm/lib/time-travel/index.d.ts +0 -22
  220. package/dist/esm/lib/time-travel/index.js +0 -21
  221. package/dist/esm/lib/time-travel/stateAt.d.ts +0 -102
  222. package/dist/esm/lib/time-travel/stateAt.js +0 -153
  223. package/dist/esm/lib/time-travel/tagStops.d.ts +0 -72
  224. package/dist/esm/lib/time-travel/tagStops.js +0 -102
  225. package/dist/esm/lib/time-travel/timeTravel.d.ts +0 -70
  226. package/dist/esm/lib/time-travel/timeTravel.js +0 -360
  227. package/dist/esm/lib/time-travel/types.d.ts +0 -470
  228. package/dist/esm/lib/time-travel/types.js +0 -23
  229. package/dist/esm/write.d.ts +0 -47
  230. package/dist/esm/write.js +0 -46
  231. package/dist/lib/capture/freeze.js +0 -320
  232. package/dist/lib/capture/ownData.js +0 -19
  233. package/dist/lib/capture/valueKinds.js +0 -146
  234. package/dist/lib/ids/runtimeStageId.js +0 -210
  235. package/dist/lib/memory/EventLog.js +0 -152
  236. package/dist/lib/memory/RecordFrame.js +0 -300
  237. package/dist/lib/memory/SharedMemory.js +0 -92
  238. package/dist/lib/memory/TransactionBuffer.js +0 -950
  239. package/dist/lib/memory/admission.js +0 -159
  240. package/dist/lib/memory/backtrack.js +0 -463
  241. package/dist/lib/memory/commitLogUtils.js +0 -399
  242. package/dist/lib/memory/deltaEncoding.js +0 -128
  243. package/dist/lib/memory/equality.js +0 -266
  244. package/dist/lib/memory/eventPosition.js +0 -3
  245. package/dist/lib/memory/honesty.js +0 -95
  246. package/dist/lib/memory/keyPaths.js +0 -243
  247. package/dist/lib/memory/logModel.js +0 -372
  248. package/dist/lib/memory/merge.js +0 -64
  249. package/dist/lib/memory/pathOps.js +0 -306
  250. package/dist/lib/memory/paths.js +0 -62
  251. package/dist/lib/memory/placeholders.js +0 -43
  252. package/dist/lib/memory/recordCommit.js +0 -65
  253. package/dist/lib/memory/scrub.js +0 -79
  254. package/dist/lib/memory/types.js +0 -11
  255. package/dist/lib/memory/utils.js +0 -178
  256. package/dist/lib/memory/verbs.js +0 -444
  257. package/dist/lib/recorder/CommitRangeIndex.js +0 -211
  258. package/dist/lib/scope/detectCircular.js +0 -21
  259. package/dist/lib/scope/recorders/summarizeValue.js +0 -10
  260. package/dist/lib/slice/elementProvenance.js +0 -195
  261. package/dist/lib/slice/forwardSliceForKey.js +0 -247
  262. package/dist/lib/slice/index.js +0 -42
  263. package/dist/lib/slice/keyIndex.js +0 -313
  264. package/dist/lib/slice/keyTimeline.js +0 -117
  265. package/dist/lib/slice/keysReadSources.js +0 -101
  266. package/dist/lib/slice/serialize.js +0 -286
  267. package/dist/lib/slice/sliceForKey.js +0 -93
  268. package/dist/lib/slice/types.js +0 -26
  269. package/dist/lib/time-travel/axis.js +0 -184
  270. package/dist/lib/time-travel/bundles.js +0 -144
  271. package/dist/lib/time-travel/chain.js +0 -193
  272. package/dist/lib/time-travel/commitStops.js +0 -206
  273. package/dist/lib/time-travel/index.js +0 -32
  274. package/dist/lib/time-travel/stateAt.js +0 -160
  275. package/dist/lib/time-travel/tagStops.js +0 -106
  276. package/dist/lib/time-travel/timeTravel.js +0 -364
  277. package/dist/lib/time-travel/types.js +0 -24
  278. package/dist/types/lib/capture/freeze.d.ts +0 -91
  279. package/dist/types/lib/capture/ownData.d.ts +0 -7
  280. package/dist/types/lib/capture/valueKinds.d.ts +0 -57
  281. package/dist/types/lib/ids/runtimeStageId.d.ts +0 -173
  282. package/dist/types/lib/memory/EventLog.d.ts +0 -105
  283. package/dist/types/lib/memory/RecordFrame.d.ts +0 -232
  284. package/dist/types/lib/memory/SharedMemory.d.ts +0 -46
  285. package/dist/types/lib/memory/TransactionBuffer.d.ts +0 -521
  286. package/dist/types/lib/memory/admission.d.ts +0 -81
  287. package/dist/types/lib/memory/backtrack.d.ts +0 -286
  288. package/dist/types/lib/memory/commitLogUtils.d.ts +0 -217
  289. package/dist/types/lib/memory/deltaEncoding.d.ts +0 -66
  290. package/dist/types/lib/memory/equality.d.ts +0 -93
  291. package/dist/types/lib/memory/eventPosition.d.ts +0 -18
  292. package/dist/types/lib/memory/honesty.d.ts +0 -93
  293. package/dist/types/lib/memory/keyPaths.d.ts +0 -125
  294. package/dist/types/lib/memory/logModel.d.ts +0 -76
  295. package/dist/types/lib/memory/merge.d.ts +0 -26
  296. package/dist/types/lib/memory/pathOps.d.ts +0 -115
  297. package/dist/types/lib/memory/paths.d.ts +0 -52
  298. package/dist/types/lib/memory/placeholders.d.ts +0 -39
  299. package/dist/types/lib/memory/recordCommit.d.ts +0 -45
  300. package/dist/types/lib/memory/scrub.d.ts +0 -53
  301. package/dist/types/lib/memory/types.d.ts +0 -209
  302. package/dist/types/lib/memory/utils.d.ts +0 -73
  303. package/dist/types/lib/memory/verbs.d.ts +0 -333
  304. package/dist/types/lib/recorder/CommitRangeIndex.d.ts +0 -147
  305. package/dist/types/lib/scope/detectCircular.d.ts +0 -13
  306. package/dist/types/lib/scope/recorders/summarizeValue.d.ts +0 -5
  307. package/dist/types/lib/slice/elementProvenance.d.ts +0 -81
  308. package/dist/types/lib/slice/forwardSliceForKey.d.ts +0 -88
  309. package/dist/types/lib/slice/index.d.ts +0 -25
  310. package/dist/types/lib/slice/keyIndex.d.ts +0 -137
  311. package/dist/types/lib/slice/keyTimeline.d.ts +0 -49
  312. package/dist/types/lib/slice/keysReadSources.d.ts +0 -51
  313. package/dist/types/lib/slice/serialize.d.ts +0 -78
  314. package/dist/types/lib/slice/sliceForKey.d.ts +0 -47
  315. package/dist/types/lib/slice/types.d.ts +0 -567
  316. package/dist/types/lib/time-travel/axis.d.ts +0 -119
  317. package/dist/types/lib/time-travel/bundles.d.ts +0 -77
  318. package/dist/types/lib/time-travel/chain.d.ts +0 -93
  319. package/dist/types/lib/time-travel/commitStops.d.ts +0 -55
  320. package/dist/types/lib/time-travel/index.d.ts +0 -22
  321. package/dist/types/lib/time-travel/stateAt.d.ts +0 -102
  322. package/dist/types/lib/time-travel/tagStops.d.ts +0 -72
  323. package/dist/types/lib/time-travel/timeTravel.d.ts +0 -70
  324. package/dist/types/lib/time-travel/types.d.ts +0 -470
  325. package/dist/types/write.d.ts +0 -47
  326. package/dist/write.js +0 -52
@@ -1,470 +0,0 @@
1
- /**
2
- * time-travel/types.ts — the shapes of the reader's cursor.
3
- *
4
- * WHY THIS MODULE EXISTS (context for future readers, human or LLM):
5
- * Time travel in footprintjs is a READER'S cursor over a FINISHED trace, with
6
- * a fold at each stop. It is not the Walker — the engine's traversal — and it
7
- * must never become a second live cursor: nothing here can move, re-run or
8
- * mutate an execution. Every consumer (a why-panel, a flow view, a chart
9
- * dashboard) was writing the same commit-index arithmetic by hand, from the
10
- * same commit log, and disagreeing about the answers. This is that arithmetic,
11
- * once, in the library that owns the substrate.
12
- *
13
- * DAG position: memory ← time-travel. Every file here is a record file
14
- * (`RECORD_FILES`, scripts/layering.config.cjs, C6): it may import only record
15
- * files — memory/, the id grammar (`ids/runtimeStageId`), and the record's two
16
- * capture/ leaves (`freeze`, `valueKinds`). Recorders, traversal and runner
17
- * must never be imported here; the snapshot arrives as a plain structural
18
- * shape ({@link FoldSource}, {@link TimeTravelSource}, the record's own
19
- * `ExecutionTree` for the tree) so a stored JSON trace works exactly like a
20
- * live `getSnapshot()`.
21
- */
22
- import type { RegisteredCode } from '../memory/honesty.js';
23
- import type { CommitBundle, ExecutionTree } from '../memory/types.js';
24
- /**
25
- * Anything that carries a commit log and (ideally) its fold base.
26
- *
27
- * Two field spellings, because the library already has two: the run's log is
28
- * `commitLog` (`getSnapshot()`), a subflow's is `history`
29
- * (`getSubtreeSnapshot()` / `subflowResults[...].treeContext`). Both are
30
- * accepted so a caller never has to reshape a snapshot to ask a question.
31
- *
32
- * BOTH SPELLINGS TAKE `readonly unknown[]` (9.18.0). A live snapshot hands
33
- * over real {@link CommitBundle}s and is assignable exactly as before; a
34
- * STORED recording is parsed JSON, and a careful consumer will not claim that
35
- * what came back off disk is a `CommitBundle`. The narrowing therefore happens
36
- * HERE, per bundle, where the fold actually reads one — the only place that
37
- * can honestly do it. An entry that is not a bundle becomes a GAP: it keeps
38
- * its index (so every `commitIdx` still addresses the same position), it
39
- * contributes no state, it gets no stop, and any fold that crosses it reports
40
- * it in {@link FoldedState.skipped} with the index and the reason.
41
- *
42
- * EVERY FIELD IS OPTIONAL, deliberately the same shape {@link TimeTravelSource}
43
- * has: a consumer's stored-recording type (`commitLog?: readonly unknown[]`)
44
- * drives `stateAt` and `timeTravel` alike, with no cast at either. A source
45
- * with neither spelling present folds to its base and reports
46
- * `throughCommitIdx: -1` — the truthful answer for a log that was not there.
47
- *
48
- * THIS IS AN INPUT SHAPE. Nothing typed as a `FoldSource` promises that its
49
- * rows are bundles; code that wants to read `CommitBundle` fields back OUT of
50
- * one must narrow each row with `isCommitBundle` first.
51
- */
52
- export type FoldSource = {
53
- /** The run's commit log. May be ABSENT (a stored recording's optional field): an absent log folds to the base. */
54
- readonly commitLog?: readonly unknown[];
55
- /** A subflow subtree's own log — the same thing under its other name. */
56
- readonly history?: readonly unknown[];
57
- readonly initialState?: Record<string, unknown>;
58
- };
59
- /**
60
- * A snapshot-shaped source for {@link timeTravel}.
61
- *
62
- * Every field is optional and the structural ones are `unknown` (9.18.0), so
63
- * a live `getSnapshot()` is assignable exactly as it was AND so is a stored
64
- * recording a consumer typed honestly — `commitLog: readonly unknown[]`,
65
- * `executionTree: unknown` — because parsed JSON is not an execution tree
66
- * until something says so. The narrowing happens inside: rows per bundle
67
- * (see {@link FoldSource}), the tree and the subflow results as plain
68
- * objects, anything else read as absent.
69
- */
70
- export interface TimeTravelSource {
71
- /** The run's commit log. See {@link FoldSource} on why this is `unknown[]`. */
72
- readonly commitLog?: readonly unknown[];
73
- /** A subflow subtree's own log — the same thing under its other name. */
74
- readonly history?: readonly unknown[];
75
- readonly initialState?: Record<string, unknown>;
76
- /**
77
- * The run's execution tree (`getSnapshot().executionTree`) — what makes a
78
- * mount stop say `kind: 'mount'` authoritatively instead of by shape. A live
79
- * snapshot hands its `StageSnapshot` tree, which is an {@link ExecutionTree};
80
- * a stored one hands parsed JSON, which is read as a tree when it is a plain
81
- * object and ignored otherwise.
82
- */
83
- readonly executionTree?: ExecutionTree | unknown;
84
- /**
85
- * Dual-keyed subflow results (`getSnapshot().subflowResults`) — what
86
- * {@link TimeTravel.drill} navigates. Absent, or not a plain object ⇒
87
- * `drill` always returns `undefined`, which is the honest answer for a run
88
- * with no subflows.
89
- */
90
- readonly subflowResults?: Record<string, unknown> | unknown;
91
- }
92
- /**
93
- * One entry of a source's log that could not be read as a {@link CommitBundle}.
94
- *
95
- * Reported rather than thrown: a stored recording with one corrupt row is
96
- * still worth reading, and a reader that is told WHICH index it lost can say
97
- * so on screen. `index` is the position in that source's own log.
98
- *
99
- * Registry code: `'log-gap'` (`memory/honesty.ts · HONESTY_CODES`, served on
100
- * `footprintjs/trace`) says what a gap means. A gap carries no `code` field —
101
- * it is registered so a reader explains it from the same place as the other
102
- * honesty signals.
103
- */
104
- export interface LogGap {
105
- /** ARRAY INDEX in the source's log — the address the gap occupies. */
106
- readonly index: number;
107
- /** Why it is not a bundle, in words a UI can print. */
108
- readonly reason: string;
109
- }
110
- /**
111
- * What kind of position a stop is.
112
- *
113
- * - `'commit'` — one executed stage.
114
- * - `'mount'` — a subflow mount: the boundary whose inner stages live in the
115
- * subflow's OWN log (drill into it with {@link TimeTravel.drill}).
116
- * - `'start'` — the bookend BEFORE the first stop of THIS axis. What it folds
117
- * depends on the strategy, and the difference is load-bearing:
118
- * - on a strategy that keeps every stage (`commitStops`, the one shipped)
119
- * it is the run's fold BASE — the state no commit index can reach — plus
120
- * the subflow's `inputMapper` seed when the log opens with one (the
121
- * mount's commit, stamped with the mount's runtimeStageId since R13 and
122
- * with `''` through 9.33.0). So on a drilled cursor it is exactly "the
123
- * input this subflow began with".
124
- * - on a strategy that FILTERS stages out, the commits of the dropped
125
- * stages that ran BEFORE the first surviving stop have to fold somewhere,
126
- * and `'start'` is the only place they can go without orphaning them. Its
127
- * fold is then the base PLUS that prologue — the state the first stop
128
- * READ, not the run's raw base. Such a start MUST say so by setting
129
- * {@link Stop.prologue}; a renderer that means "the run's raw base" reads
130
- * `kind === 'start' && !stop.prologue`, and gets a true answer on every
131
- * axis instead of one that is true only on the library's own.
132
- * - `'end'` — the bookend after the last commit: "the run is over". Its
133
- * fold equals the final stage's by construction; the two are different
134
- * questions, not a duplicated answer.
135
- *
136
- * NOT WIDENED, DELIBERATELY. A filtering strategy's start could have been a
137
- * fifth kind (`'prologue'`), but adding a member to this union breaks every
138
- * consumer with an exhaustive `switch` over it — a compile error handed to
139
- * readers who did nothing wrong. A flag on the stop says the same thing and
140
- * costs an existing reader nothing.
141
- */
142
- export type StopKind = 'commit' | 'mount' | 'start' | 'end';
143
- /**
144
- * One position a reader's cursor can rest at.
145
- *
146
- * @typeParam TMeta the STRATEGY'S own vocabulary, carried opaquely in
147
- * {@link Stop.meta}. Defaults to `unknown`, so every pre-9.18 `Stop` still
148
- * means what it meant.
149
- */
150
- export interface Stop<TMeta = unknown> {
151
- /** Position in `TimeTravel.stops` — 0-based, the cursor's step number. */
152
- readonly step: number;
153
- /**
154
- * The stage this stop is: `[subflowPath/]stageId#executionIndex`.
155
- * `''` for the `'start'` / `'end'` bookends, which are not stages.
156
- */
157
- readonly runtimeStageId: string;
158
- /**
159
- * ARRAY INDEX of this stop's FIRST commit bundle; `-1` at `'start'`.
160
- * This is the stop's address on the commit axis.
161
- *
162
- * Indices are SOURCE-LOCAL. On a chained cursor (see
163
- * {@link timeTravel}) they index the log of {@link Stop.sourceIdx}, never a
164
- * concatenation — commit indices are run-local and the library will not
165
- * invent a global one.
166
- */
167
- readonly commitIdx: number;
168
- /**
169
- * ARRAY INDEX of the LAST commit bundle folded at this stop — the end of
170
- * this stop's slice of the log. Stops PARTITION the log, so this is the
171
- * index just before the next stop begins; it is greater than
172
- * {@link commitIdx} whenever a stage committed more than one bundle (a
173
- * subflow mount's output-mapping + exit pair, a fork child's empty repeat),
174
- * and greater again on a filtering strategy, which absorbs the commits of
175
- * the stages it dropped. Folding through this index — not through
176
- * `commitIdx` — is what makes `stateAt(stop)` equal the state the next
177
- * stage started from.
178
- */
179
- readonly lastCommitIdx: number;
180
- /** Stable stage id from the builder (the post-mount, prefixed form). */
181
- readonly stageId: string;
182
- /** Subflow path this stage ran under, when it ran inside one. */
183
- readonly subflowPath?: string;
184
- /** Human-readable stage name — what a UI puts on the axis tick. */
185
- readonly label: string;
186
- readonly kind: StopKind;
187
- /**
188
- * THE STRATEGY'S OWN VOCABULARY, carried verbatim. The port assigns it NO
189
- * meaning: it never reads it, never validates it, never branches on it, and
190
- * passes it through `timeTravel`, `jumpTo`, `drill` and marks BY REFERENCE
191
- * — never cloned, never frozen. The stop holds the very object the strategy
192
- * put there, so a mutation through one holder is visible to every other.
193
- *
194
- * WHY IT EXISTS. {@link kind} is the PORT's vocabulary — the four positions
195
- * the substrate itself knows. A domain strategy classifies stages in its own
196
- * terms (a milestone, a turn, a tool call, a beat) and had nowhere to put
197
- * that, so the answer travelled by re-deriving it from `runtimeStageId` at
198
- * every read: a second run of the classifier that just ran, and a second
199
- * chance to disagree with it. A stop now carries what its strategy knew.
200
- *
201
- * Absent on every stop `commitStops` produces — the shipped strategy has no
202
- * vocabulary beyond `kind`, and says so by omission rather than by `null`.
203
- */
204
- readonly meta?: TMeta;
205
- /**
206
- * Only meaningful on `kind: 'start'`. `true` when this start folds the
207
- * commits of STAGES THIS AXIS DOES NOT SHOW — the prologue a filtering
208
- * strategy must put somewhere. Absent (never `false`) on an axis whose start
209
- * is the run's raw fold base.
210
- *
211
- * A reader that wants "the state before anything ran" checks
212
- * `kind === 'start' && !prologue`; one that wants "the state the first stop
213
- * read" just folds the start. See {@link StopKind}.
214
- */
215
- readonly prologue?: true;
216
- /**
217
- * Which SOURCE this stop's commit indices belong to, on a chained cursor —
218
- * the position in the array handed to {@link timeTravel}. Absent on a cursor
219
- * over a single source, which is every cursor built before 9.18.0.
220
- */
221
- readonly sourceIdx?: number;
222
- }
223
- /**
224
- * The `[start, …stages, end]` shape `commitStops` returns for a NON-EMPTY log
225
- * — split out, so a strategy that composes it stops writing its own guard.
226
- *
227
- * See {@link splitAxis}.
228
- */
229
- export interface BookendedAxis<TMeta = unknown> {
230
- /** The `'start'` bookend — the only stop that may open at `commitIdx: -1`. */
231
- readonly start: Stop<TMeta>;
232
- /** Everything between the bookends, in execution order. May be empty. */
233
- readonly stages: readonly Stop<TMeta>[];
234
- /** The `'end'` bookend — the only stop that folds the whole log. */
235
- readonly end: Stop<TMeta>;
236
- }
237
- /**
238
- * What {@link splitAxis} answers when there is no bookended axis to split.
239
- *
240
- * - `'empty'` — no stops at all. The log itself was empty; a truthful axis
241
- * with nowhere to stand, NOT a broken one.
242
- * - `'not-bookended'` — stops exist but the first is not a `'start'` or the
243
- * last is not an `'end'`. Only a strategy can cause this; a run cannot.
244
- */
245
- export type AxisRefusal = 'empty' | 'not-bookended';
246
- /** The result of {@link splitAxis}: the axis, or why there is none. */
247
- export type AxisSplit<TMeta = unknown> = ({
248
- readonly ok: true;
249
- } & BookendedAxis<TMeta>) | {
250
- readonly ok: false;
251
- readonly reason: AxisRefusal;
252
- /** The kinds that were actually there — what to print in the refusal. */
253
- readonly kinds: readonly StopKind[];
254
- };
255
- /**
256
- * How a folded state was derived — the honesty field (`'initial+log'` or
257
- * `'log-only'`). A partial answer says it is partial, never a silent one.
258
- *
259
- * What each value means is registered ONCE, with the other honesty signals, in
260
- * `memory/honesty.ts · HONESTY_CODES` (served as `HONESTY_CODES` on
261
- * `footprintjs/trace`); this union declares its members through
262
- * `RegisteredCode`, so a code the registry does not hold does not compile.
263
- */
264
- export type FoldBasis = RegisteredCode<'initial+log' | 'log-only'>;
265
- /** A detached fold of the log up to one stop. */
266
- export interface FoldedState {
267
- /** The state, deeply frozen and fully detached from the engine. */
268
- readonly state: Record<string, unknown>;
269
- /** How it was derived — see {@link FoldBasis}. */
270
- readonly basis: FoldBasis;
271
- /**
272
- * `true` when any commit folded in declared redacted paths, so this state
273
- * carries `'REDACTED'` placeholders where the engine scrubbed values at
274
- * write time. The log is redacted where it was written; a fold must SAY so
275
- * rather than present a scrubbed value as the real one.
276
- *
277
- * Registry code: `'redacted'` (`memory/honesty.ts · HONESTY_CODES`, served on
278
- * `footprintjs/trace`) says what this field and {@link FoldedState.redactedPaths} mean;
279
- * neither carries a `code`. The placeholder is the log's string,
280
- * `memory/placeholders.ts · LOG_PLACEHOLDER`.
281
- */
282
- readonly redacted: boolean;
283
- /** The redacted paths seen across the folded prefix — sorted, deduped. */
284
- readonly redactedPaths: readonly string[];
285
- /** The last commit index folded in; `-1` when nothing was folded. */
286
- readonly throughCommitIdx: number;
287
- /**
288
- * Entries of the folded prefix that were not commit bundles, with the index
289
- * and the reason. ABSENT when nothing was skipped, which is every fold over
290
- * a live snapshot — a clean fold's shape is byte-identical to 9.17.0's.
291
- *
292
- * A gap contributes no state, so a fold that reports one is INCOMPLETE at
293
- * exactly the places it names.
294
- */
295
- readonly skipped?: readonly LogGap[];
296
- /**
297
- * Which source of a CHAIN this fold ended in — `throughCommitIdx` indexes
298
- * that source's log. Absent on a single-source cursor.
299
- */
300
- readonly sourceIdx?: number;
301
- }
302
- /**
303
- * Why a move did not happen.
304
- *
305
- * - `'clamped'` — the move would land OUTSIDE the axis (`prev()` at the first
306
- * stop, `next()` at the last, a step number below 0 or past the end), or on
307
- * the very stop the cursor already stands on. Either way nothing moved. When
308
- * the target was out of range, `nearest` names the end that was hit — the
309
- * cursor itself may be nowhere near it.
310
- * - `'miss'` — the target does not exist on this axis.
311
- * - `'empty'` — this cursor has no stops at all (an empty log).
312
- */
313
- export type MoveRefusal = 'clamped' | 'miss' | 'empty';
314
- /**
315
- * The result of asking the cursor to move.
316
- *
317
- * A refused move NEVER moves the cursor. That is the law a reader's UI rests
318
- * on: a mistyped id or a step past the end leaves the panel showing exactly
319
- * what it showed before, with a reason to display — never a silent jump to
320
- * somewhere the user did not ask for.
321
- */
322
- export type Move<TMeta = unknown> = {
323
- readonly moved: true;
324
- readonly from: Stop<TMeta> | undefined;
325
- readonly to: Stop<TMeta>;
326
- } | {
327
- readonly moved: false;
328
- readonly reason: MoveRefusal;
329
- /** Where the cursor still is (absent only when there are no stops). */
330
- readonly at?: Stop<TMeta>;
331
- /** The closest stop to what was asked for, when one can be named. */
332
- readonly nearest?: Stop<TMeta>;
333
- };
334
- /**
335
- * A reader's bookmark. Lives BESIDE the log, in the {@link TimeTravel}
336
- * instance — never written into the commit log or the snapshot, which are the
337
- * run's record and not the reader's notes.
338
- *
339
- * A mark names its stop by `runtimeStageId`, not by step number: step numbers
340
- * belong to one strategy's axis, `runtimeStageId` is the same stage on every
341
- * axis, so a mark survives a change of strategy and a re-derivation of stops.
342
- */
343
- export interface Mark {
344
- readonly name: string;
345
- readonly runtimeStageId: string;
346
- /** The step the mark was placed at, on the axis in force at the time. */
347
- readonly step: number;
348
- }
349
- /**
350
- * How stops are DERIVED from a recorded log. The seam.
351
- *
352
- * footprintjs ships one strategy — `commitStops`, one stop per executed stage
353
- * — because that is the only stop grammar the substrate itself knows. A
354
- * consumer with a richer vocabulary (milestones, tool calls, turns) supplies
355
- * its own and gets the same cursor over it, and puts that vocabulary on
356
- * {@link Stop.meta} rather than re-deriving it at every read.
357
- *
358
- * The law a strategy must keep: stops are DERIVED FROM THE RECORDED LOG.
359
- * A strategy may group, filter, label and order what was recorded. It may not
360
- * re-walk the execution tree to synthesize a stop for something that was never
361
- * committed — a cursor that stops where no evidence exists is telling a story,
362
- * not reading one.
363
- *
364
- * ON A CHAIN, `stopsFor` is called ONCE PER SOURCE with that source's own log
365
- * and tree, and the cursor re-steps the results into one axis. So a strategy
366
- * never has to know it is part of a chain, and its `commitIdx`/`lastCommitIdx`
367
- * stay source-local — which is what they always were.
368
- *
369
- * `subflowResults` (9.39.0) is the source's own `subflowResults`, as stored
370
- * (untyped) — a mount's per-execution key names it a mount when no tree came
371
- * with the log. A strategy may ignore it.
372
- *
373
- * `executionTree` is an {@link ExecutionTree} (9.48.0; a `StageSnapshot`
374
- * before): the fields the record's readers read. A strategy written before
375
- * 9.48.0 that annotates the parameter `StageSnapshot` still compiles — a
376
- * method's parameters are compared both ways — but the annotation is a claim
377
- * nothing checks: `timeTravel` hands a stored recording's tree over as parsed,
378
- * so a field beyond these is read defensively. One left unannotated is typed
379
- * by this signature.
380
- */
381
- export interface TimeTravelStrategy<TMeta = unknown> {
382
- stopsFor(commitLog: readonly CommitBundle[], executionTree?: ExecutionTree, subflowResults?: unknown): Stop<TMeta>[];
383
- }
384
- /**
385
- * A reader's cursor over one finished log, with a fold at each stop.
386
- *
387
- * ONE cursor: this object holds the only position. Every question a reader
388
- * asks — what changed here, what did state look like, what is inside this
389
- * mount — is answered relative to it. `drill()` returns a SEPARATE cursor over
390
- * a separate log (a subflow's own), never a second position on this one.
391
- */
392
- export interface TimeTravel<TMeta = unknown> {
393
- /** The axis, in execution order. Empty when the log is empty. */
394
- readonly stops: readonly Stop<TMeta>[];
395
- /** The subflow path this cursor covers; `undefined` for the run itself. */
396
- readonly path: string | undefined;
397
- /**
398
- * The mount this cursor was drilled out of — `[subflowPath/]stageId#idx`.
399
- * `undefined` on a run's own cursor.
400
- *
401
- * WHY BOTH: a subflow mounted inside a loop runs several times, and every
402
- * iteration shares one {@link path}. This is the iteration that was actually
403
- * opened, so three drill panels over `sfx#2`, `sfx#8` and `sfx#14` can be
404
- * labelled and keyed apart instead of all reading `sfx`.
405
- */
406
- readonly mountRuntimeStageId: string | undefined;
407
- /** The cursor this one was drilled out of, if any. */
408
- readonly parent: TimeTravel<TMeta> | undefined;
409
- /**
410
- * How many SOURCES this cursor reads — `1` for a normal cursor, more for a
411
- * chained one (a pause/resume read as one axis). Every stop of a chained
412
- * cursor carries the {@link Stop.sourceIdx} its indices belong to.
413
- */
414
- readonly sourceCount: number;
415
- /** Where the cursor is; `undefined` only when there are no stops. */
416
- at(): Stop<TMeta> | undefined;
417
- first(): Move<TMeta>;
418
- last(): Move<TMeta>;
419
- prev(): Move<TMeta>;
420
- next(): Move<TMeta>;
421
- /**
422
- * Move to a step number or to a `runtimeStageId`.
423
- * A miss refuses and names the `nearest` stop it could find.
424
- */
425
- jumpTo(target: number | string): Move<TMeta>;
426
- /**
427
- * Fold of the log through `stop` (default: the current stop). Detached.
428
- *
429
- * `stop` must come from THIS cursor's axis: its `lastCommitIdx` and
430
- * `sourceIdx` are read as addresses into this cursor's own legs, so a stop
431
- * from another cursor is folded at whatever those numbers mean here — on a
432
- * chain, a foreign stop with no `sourceIdx` folds leg 0.
433
- */
434
- stateAt(stop?: Stop<TMeta>): FoldedState;
435
- /**
436
- * The state keys written between two stops — read straight off the bundles'
437
- * traces, so it costs no fold at all.
438
- *
439
- * With no argument: what the CURRENT stop changed (i.e. since the stop
440
- * before it). With a `from` stop: everything written after `from` up to and
441
- * including the current stop. Backwards or equal ranges give `[]`. On a
442
- * chained cursor a range that crosses the seam is walked source by source.
443
- */
444
- changedSince(from?: Stop<TMeta>): readonly string[];
445
- /** Bookmark a stop (default: the current one). Returns the mark, or
446
- * `undefined` when there is no stop to name. */
447
- mark(name: string, stop?: Stop<TMeta>): Mark | undefined;
448
- /** A detached copy of this cursor's marks, in the order they were placed. */
449
- marks(): readonly Mark[];
450
- /** Move to a mark's stop. A mark whose stage is not on this axis misses. */
451
- jumpToMark(name: string): Move<TMeta>;
452
- /**
453
- * A cursor over the subflow mounted at `mountRuntimeStageId` — the same
454
- * interface, its own log, its own fold base. `undefined` when that mount is
455
- * not in this run's subflow results.
456
- *
457
- * A stop inside a subflow is NOT a stop of this cursor: subflows run in
458
- * isolated runtimes and commit to their own log, so the outer axis holds
459
- * only the mount boundary. Drilling is how you get inside; there is no way
460
- * to be in two places at once.
461
- */
462
- drill(mountRuntimeStageId: string): TimeTravel<TMeta> | undefined;
463
- }
464
- /** Options for {@link timeTravel}. */
465
- export interface TimeTravelOptions<TMeta = unknown> {
466
- /** How stops are derived. Default: `commitStops`. */
467
- readonly strategy?: TimeTravelStrategy<TMeta>;
468
- /** Marks to seed the cursor with — e.g. restored from a saved session. */
469
- readonly marks?: readonly Mark[];
470
- }
@@ -1,23 +0,0 @@
1
- /**
2
- * time-travel/types.ts — the shapes of the reader's cursor.
3
- *
4
- * WHY THIS MODULE EXISTS (context for future readers, human or LLM):
5
- * Time travel in footprintjs is a READER'S cursor over a FINISHED trace, with
6
- * a fold at each stop. It is not the Walker — the engine's traversal — and it
7
- * must never become a second live cursor: nothing here can move, re-run or
8
- * mutate an execution. Every consumer (a why-panel, a flow view, a chart
9
- * dashboard) was writing the same commit-index arithmetic by hand, from the
10
- * same commit log, and disagreeing about the answers. This is that arithmetic,
11
- * once, in the library that owns the substrate.
12
- *
13
- * DAG position: memory ← time-travel. Every file here is a record file
14
- * (`RECORD_FILES`, scripts/layering.config.cjs, C6): it may import only record
15
- * files — memory/, the id grammar (`ids/runtimeStageId`), and the record's two
16
- * capture/ leaves (`freeze`, `valueKinds`). Recorders, traversal and runner
17
- * must never be imported here; the snapshot arrives as a plain structural
18
- * shape ({@link FoldSource}, {@link TimeTravelSource}, the record's own
19
- * `ExecutionTree` for the tree) so a stored JSON trace works exactly like a
20
- * live `getSnapshot()`.
21
- */
22
- export {};
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3RpbWUtdHJhdmVsL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogdGltZS10cmF2ZWwvdHlwZXMudHMg4oCUIHRoZSBzaGFwZXMgb2YgdGhlIHJlYWRlcidzIGN1cnNvci5cbiAqXG4gKiBXSFkgVEhJUyBNT0RVTEUgRVhJU1RTIChjb250ZXh0IGZvciBmdXR1cmUgcmVhZGVycywgaHVtYW4gb3IgTExNKTpcbiAqIFRpbWUgdHJhdmVsIGluIGZvb3RwcmludGpzIGlzIGEgUkVBREVSJ1MgY3Vyc29yIG92ZXIgYSBGSU5JU0hFRCB0cmFjZSwgd2l0aFxuICogYSBmb2xkIGF0IGVhY2ggc3RvcC4gSXQgaXMgbm90IHRoZSBXYWxrZXIg4oCUIHRoZSBlbmdpbmUncyB0cmF2ZXJzYWwg4oCUIGFuZCBpdFxuICogbXVzdCBuZXZlciBiZWNvbWUgYSBzZWNvbmQgbGl2ZSBjdXJzb3I6IG5vdGhpbmcgaGVyZSBjYW4gbW92ZSwgcmUtcnVuIG9yXG4gKiBtdXRhdGUgYW4gZXhlY3V0aW9uLiBFdmVyeSBjb25zdW1lciAoYSB3aHktcGFuZWwsIGEgZmxvdyB2aWV3LCBhIGNoYXJ0XG4gKiBkYXNoYm9hcmQpIHdhcyB3cml0aW5nIHRoZSBzYW1lIGNvbW1pdC1pbmRleCBhcml0aG1ldGljIGJ5IGhhbmQsIGZyb20gdGhlXG4gKiBzYW1lIGNvbW1pdCBsb2csIGFuZCBkaXNhZ3JlZWluZyBhYm91dCB0aGUgYW5zd2Vycy4gVGhpcyBpcyB0aGF0IGFyaXRobWV0aWMsXG4gKiBvbmNlLCBpbiB0aGUgbGlicmFyeSB0aGF0IG93bnMgdGhlIHN1YnN0cmF0ZS5cbiAqXG4gKiBEQUcgcG9zaXRpb246IG1lbW9yeSDihpAgdGltZS10cmF2ZWwuIEV2ZXJ5IGZpbGUgaGVyZSBpcyBhIHJlY29yZCBmaWxlXG4gKiAoYFJFQ09SRF9GSUxFU2AsIHNjcmlwdHMvbGF5ZXJpbmcuY29uZmlnLmNqcywgQzYpOiBpdCBtYXkgaW1wb3J0IG9ubHkgcmVjb3JkXG4gKiBmaWxlcyDigJQgbWVtb3J5LywgdGhlIGlkIGdyYW1tYXIgKGBpZHMvcnVudGltZVN0YWdlSWRgKSwgYW5kIHRoZSByZWNvcmQncyB0d29cbiAqIGNhcHR1cmUvIGxlYXZlcyAoYGZyZWV6ZWAsIGB2YWx1ZUtpbmRzYCkuIFJlY29yZGVycywgdHJhdmVyc2FsIGFuZCBydW5uZXJcbiAqIG11c3QgbmV2ZXIgYmUgaW1wb3J0ZWQgaGVyZTsgdGhlIHNuYXBzaG90IGFycml2ZXMgYXMgYSBwbGFpbiBzdHJ1Y3R1cmFsXG4gKiBzaGFwZSAoe0BsaW5rIEZvbGRTb3VyY2V9LCB7QGxpbmsgVGltZVRyYXZlbFNvdXJjZX0sIHRoZSByZWNvcmQncyBvd25cbiAqIGBFeGVjdXRpb25UcmVlYCBmb3IgdGhlIHRyZWUpIHNvIGEgc3RvcmVkIEpTT04gdHJhY2Ugd29ya3MgZXhhY3RseSBsaWtlIGFcbiAqIGxpdmUgYGdldFNuYXBzaG90KClgLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmVnaXN0ZXJlZENvZGUgfSBmcm9tICcuLi9tZW1vcnkvaG9uZXN0eS5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSwgRXhlY3V0aW9uVHJlZSB9IGZyb20gJy4uL21lbW9yeS90eXBlcy5qcyc7XG5cbi8vIOKUgOKUgCBTb3VyY2VzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEFueXRoaW5nIHRoYXQgY2FycmllcyBhIGNvbW1pdCBsb2cgYW5kIChpZGVhbGx5KSBpdHMgZm9sZCBiYXNlLlxuICpcbiAqIFR3byBmaWVsZCBzcGVsbGluZ3MsIGJlY2F1c2UgdGhlIGxpYnJhcnkgYWxyZWFkeSBoYXMgdHdvOiB0aGUgcnVuJ3MgbG9nIGlzXG4gKiBgY29tbWl0TG9nYCAoYGdldFNuYXBzaG90KClgKSwgYSBzdWJmbG93J3MgaXMgYGhpc3RvcnlgXG4gKiAoYGdldFN1YnRyZWVTbmFwc2hvdCgpYCAvIGBzdWJmbG93UmVzdWx0c1suLi5dLnRyZWVDb250ZXh0YCkuIEJvdGggYXJlXG4gKiBhY2NlcHRlZCBzbyBhIGNhbGxlciBuZXZlciBoYXMgdG8gcmVzaGFwZSBhIHNuYXBzaG90IHRvIGFzayBhIHF1ZXN0aW9uLlxuICpcbiAqIEJPVEggU1BFTExJTkdTIFRBS0UgYHJlYWRvbmx5IHVua25vd25bXWAgKDkuMTguMCkuIEEgbGl2ZSBzbmFwc2hvdCBoYW5kc1xuICogb3ZlciByZWFsIHtAbGluayBDb21taXRCdW5kbGV9cyBhbmQgaXMgYXNzaWduYWJsZSBleGFjdGx5IGFzIGJlZm9yZTsgYVxuICogU1RPUkVEIHJlY29yZGluZyBpcyBwYXJzZWQgSlNPTiwgYW5kIGEgY2FyZWZ1bCBjb25zdW1lciB3aWxsIG5vdCBjbGFpbSB0aGF0XG4gKiB3aGF0IGNhbWUgYmFjayBvZmYgZGlzayBpcyBhIGBDb21taXRCdW5kbGVgLiBUaGUgbmFycm93aW5nIHRoZXJlZm9yZSBoYXBwZW5zXG4gKiBIRVJFLCBwZXIgYnVuZGxlLCB3aGVyZSB0aGUgZm9sZCBhY3R1YWxseSByZWFkcyBvbmUg4oCUIHRoZSBvbmx5IHBsYWNlIHRoYXRcbiAqIGNhbiBob25lc3RseSBkbyBpdC4gQW4gZW50cnkgdGhhdCBpcyBub3QgYSBidW5kbGUgYmVjb21lcyBhIEdBUDogaXQga2VlcHNcbiAqIGl0cyBpbmRleCAoc28gZXZlcnkgYGNvbW1pdElkeGAgc3RpbGwgYWRkcmVzc2VzIHRoZSBzYW1lIHBvc2l0aW9uKSwgaXRcbiAqIGNvbnRyaWJ1dGVzIG5vIHN0YXRlLCBpdCBnZXRzIG5vIHN0b3AsIGFuZCBhbnkgZm9sZCB0aGF0IGNyb3NzZXMgaXQgcmVwb3J0c1xuICogaXQgaW4ge0BsaW5rIEZvbGRlZFN0YXRlLnNraXBwZWR9IHdpdGggdGhlIGluZGV4IGFuZCB0aGUgcmVhc29uLlxuICpcbiAqIEVWRVJZIEZJRUxEIElTIE9QVElPTkFMLCBkZWxpYmVyYXRlbHkgdGhlIHNhbWUgc2hhcGUge0BsaW5rIFRpbWVUcmF2ZWxTb3VyY2V9XG4gKiBoYXM6IGEgY29uc3VtZXIncyBzdG9yZWQtcmVjb3JkaW5nIHR5cGUgKGBjb21taXRMb2c/OiByZWFkb25seSB1bmtub3duW11gKVxuICogZHJpdmVzIGBzdGF0ZUF0YCBhbmQgYHRpbWVUcmF2ZWxgIGFsaWtlLCB3aXRoIG5vIGNhc3QgYXQgZWl0aGVyLiBBIHNvdXJjZVxuICogd2l0aCBuZWl0aGVyIHNwZWxsaW5nIHByZXNlbnQgZm9sZHMgdG8gaXRzIGJhc2UgYW5kIHJlcG9ydHNcbiAqIGB0aHJvdWdoQ29tbWl0SWR4OiAtMWAg4oCUIHRoZSB0cnV0aGZ1bCBhbnN3ZXIgZm9yIGEgbG9nIHRoYXQgd2FzIG5vdCB0aGVyZS5cbiAqXG4gKiBUSElTIElTIEFOIElOUFVUIFNIQVBFLiBOb3RoaW5nIHR5cGVkIGFzIGEgYEZvbGRTb3VyY2VgIHByb21pc2VzIHRoYXQgaXRzXG4gKiByb3dzIGFyZSBidW5kbGVzOyBjb2RlIHRoYXQgd2FudHMgdG8gcmVhZCBgQ29tbWl0QnVuZGxlYCBmaWVsZHMgYmFjayBPVVQgb2ZcbiAqIG9uZSBtdXN0IG5hcnJvdyBlYWNoIHJvdyB3aXRoIGBpc0NvbW1pdEJ1bmRsZWAgZmlyc3QuXG4gKi9cbmV4cG9ydCB0eXBlIEZvbGRTb3VyY2UgPSB7XG4gIC8qKiBUaGUgcnVuJ3MgY29tbWl0IGxvZy4gTWF5IGJlIEFCU0VOVCAoYSBzdG9yZWQgcmVjb3JkaW5nJ3Mgb3B0aW9uYWwgZmllbGQpOiBhbiBhYnNlbnQgbG9nIGZvbGRzIHRvIHRoZSBiYXNlLiAqL1xuICByZWFkb25seSBjb21taXRMb2c/OiByZWFkb25seSB1bmtub3duW107XG4gIC8qKiBBIHN1YmZsb3cgc3VidHJlZSdzIG93biBsb2cg4oCUIHRoZSBzYW1lIHRoaW5nIHVuZGVyIGl0cyBvdGhlciBuYW1lLiAqL1xuICByZWFkb25seSBoaXN0b3J5PzogcmVhZG9ubHkgdW5rbm93bltdO1xuICByZWFkb25seSBpbml0aWFsU3RhdGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn07XG5cbi8qKlxuICogQSBzbmFwc2hvdC1zaGFwZWQgc291cmNlIGZvciB7QGxpbmsgdGltZVRyYXZlbH0uXG4gKlxuICogRXZlcnkgZmllbGQgaXMgb3B0aW9uYWwgYW5kIHRoZSBzdHJ1Y3R1cmFsIG9uZXMgYXJlIGB1bmtub3duYCAoOS4xOC4wKSwgc29cbiAqIGEgbGl2ZSBgZ2V0U25hcHNob3QoKWAgaXMgYXNzaWduYWJsZSBleGFjdGx5IGFzIGl0IHdhcyBBTkQgc28gaXMgYSBzdG9yZWRcbiAqIHJlY29yZGluZyBhIGNvbnN1bWVyIHR5cGVkIGhvbmVzdGx5IOKAlCBgY29tbWl0TG9nOiByZWFkb25seSB1bmtub3duW11gLFxuICogYGV4ZWN1dGlvblRyZWU6IHVua25vd25gIOKAlCBiZWNhdXNlIHBhcnNlZCBKU09OIGlzIG5vdCBhbiBleGVjdXRpb24gdHJlZVxuICogdW50aWwgc29tZXRoaW5nIHNheXMgc28uIFRoZSBuYXJyb3dpbmcgaGFwcGVucyBpbnNpZGU6IHJvd3MgcGVyIGJ1bmRsZVxuICogKHNlZSB7QGxpbmsgRm9sZFNvdXJjZX0pLCB0aGUgdHJlZSBhbmQgdGhlIHN1YmZsb3cgcmVzdWx0cyBhcyBwbGFpblxuICogb2JqZWN0cywgYW55dGhpbmcgZWxzZSByZWFkIGFzIGFic2VudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaW1lVHJhdmVsU291cmNlIHtcbiAgLyoqIFRoZSBydW4ncyBjb21taXQgbG9nLiBTZWUge0BsaW5rIEZvbGRTb3VyY2V9IG9uIHdoeSB0aGlzIGlzIGB1bmtub3duW11gLiAqL1xuICByZWFkb25seSBjb21taXRMb2c/OiByZWFkb25seSB1bmtub3duW107XG4gIC8qKiBBIHN1YmZsb3cgc3VidHJlZSdzIG93biBsb2cg4oCUIHRoZSBzYW1lIHRoaW5nIHVuZGVyIGl0cyBvdGhlciBuYW1lLiAqL1xuICByZWFkb25seSBoaXN0b3J5PzogcmVhZG9ubHkgdW5rbm93bltdO1xuICByZWFkb25seSBpbml0aWFsU3RhdGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqXG4gICAqIFRoZSBydW4ncyBleGVjdXRpb24gdHJlZSAoYGdldFNuYXBzaG90KCkuZXhlY3V0aW9uVHJlZWApIOKAlCB3aGF0IG1ha2VzIGFcbiAgICogbW91bnQgc3RvcCBzYXkgYGtpbmQ6ICdtb3VudCdgIGF1dGhvcml0YXRpdmVseSBpbnN0ZWFkIG9mIGJ5IHNoYXBlLiBBIGxpdmVcbiAgICogc25hcHNob3QgaGFuZHMgaXRzIGBTdGFnZVNuYXBzaG90YCB0cmVlLCB3aGljaCBpcyBhbiB7QGxpbmsgRXhlY3V0aW9uVHJlZX07XG4gICAqIGEgc3RvcmVkIG9uZSBoYW5kcyBwYXJzZWQgSlNPTiwgd2hpY2ggaXMgcmVhZCBhcyBhIHRyZWUgd2hlbiBpdCBpcyBhIHBsYWluXG4gICAqIG9iamVjdCBhbmQgaWdub3JlZCBvdGhlcndpc2UuXG4gICAqL1xuICByZWFkb25seSBleGVjdXRpb25UcmVlPzogRXhlY3V0aW9uVHJlZSB8IHVua25vd247XG4gIC8qKlxuICAgKiBEdWFsLWtleWVkIHN1YmZsb3cgcmVzdWx0cyAoYGdldFNuYXBzaG90KCkuc3ViZmxvd1Jlc3VsdHNgKSDigJQgd2hhdFxuICAgKiB7QGxpbmsgVGltZVRyYXZlbC5kcmlsbH0gbmF2aWdhdGVzLiBBYnNlbnQsIG9yIG5vdCBhIHBsYWluIG9iamVjdCDih5JcbiAgICogYGRyaWxsYCBhbHdheXMgcmV0dXJucyBgdW5kZWZpbmVkYCwgd2hpY2ggaXMgdGhlIGhvbmVzdCBhbnN3ZXIgZm9yIGEgcnVuXG4gICAqIHdpdGggbm8gc3ViZmxvd3MuXG4gICAqL1xuICByZWFkb25seSBzdWJmbG93UmVzdWx0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5rbm93bjtcbn1cblxuLyoqXG4gKiBPbmUgZW50cnkgb2YgYSBzb3VyY2UncyBsb2cgdGhhdCBjb3VsZCBub3QgYmUgcmVhZCBhcyBhIHtAbGluayBDb21taXRCdW5kbGV9LlxuICpcbiAqIFJlcG9ydGVkIHJhdGhlciB0aGFuIHRocm93bjogYSBzdG9yZWQgcmVjb3JkaW5nIHdpdGggb25lIGNvcnJ1cHQgcm93IGlzXG4gKiBzdGlsbCB3b3J0aCByZWFkaW5nLCBhbmQgYSByZWFkZXIgdGhhdCBpcyB0b2xkIFdISUNIIGluZGV4IGl0IGxvc3QgY2FuIHNheVxuICogc28gb24gc2NyZWVuLiBgaW5kZXhgIGlzIHRoZSBwb3NpdGlvbiBpbiB0aGF0IHNvdXJjZSdzIG93biBsb2cuXG4gKlxuICogUmVnaXN0cnkgY29kZTogYCdsb2ctZ2FwJ2AgKGBtZW1vcnkvaG9uZXN0eS50cyDCtyBIT05FU1RZX0NPREVTYCwgc2VydmVkIG9uXG4gKiBgZm9vdHByaW50anMvdHJhY2VgKSBzYXlzIHdoYXQgYSBnYXAgbWVhbnMuIEEgZ2FwIGNhcnJpZXMgbm8gYGNvZGVgIGZpZWxkIOKAlFxuICogaXQgaXMgcmVnaXN0ZXJlZCBzbyBhIHJlYWRlciBleHBsYWlucyBpdCBmcm9tIHRoZSBzYW1lIHBsYWNlIGFzIHRoZSBvdGhlclxuICogaG9uZXN0eSBzaWduYWxzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvZ0dhcCB7XG4gIC8qKiBBUlJBWSBJTkRFWCBpbiB0aGUgc291cmNlJ3MgbG9nIOKAlCB0aGUgYWRkcmVzcyB0aGUgZ2FwIG9jY3VwaWVzLiAqL1xuICByZWFkb25seSBpbmRleDogbnVtYmVyO1xuICAvKiogV2h5IGl0IGlzIG5vdCBhIGJ1bmRsZSwgaW4gd29yZHMgYSBVSSBjYW4gcHJpbnQuICovXG4gIHJlYWRvbmx5IHJlYXNvbjogc3RyaW5nO1xufVxuXG4vLyDilIDilIAgU3RvcHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogV2hhdCBraW5kIG9mIHBvc2l0aW9uIGEgc3RvcCBpcy5cbiAqXG4gKiAtIGAnY29tbWl0J2Ag4oCUIG9uZSBleGVjdXRlZCBzdGFnZS5cbiAqIC0gYCdtb3VudCdgICDigJQgYSBzdWJmbG93IG1vdW50OiB0aGUgYm91bmRhcnkgd2hvc2UgaW5uZXIgc3RhZ2VzIGxpdmUgaW4gdGhlXG4gKiAgIHN1YmZsb3cncyBPV04gbG9nIChkcmlsbCBpbnRvIGl0IHdpdGgge0BsaW5rIFRpbWVUcmF2ZWwuZHJpbGx9KS5cbiAqIC0gYCdzdGFydCdgICDigJQgdGhlIGJvb2tlbmQgQkVGT1JFIHRoZSBmaXJzdCBzdG9wIG9mIFRISVMgYXhpcy4gV2hhdCBpdCBmb2xkc1xuICogICBkZXBlbmRzIG9uIHRoZSBzdHJhdGVneSwgYW5kIHRoZSBkaWZmZXJlbmNlIGlzIGxvYWQtYmVhcmluZzpcbiAqICAgLSBvbiBhIHN0cmF0ZWd5IHRoYXQga2VlcHMgZXZlcnkgc3RhZ2UgKGBjb21taXRTdG9wc2AsIHRoZSBvbmUgc2hpcHBlZClcbiAqICAgICBpdCBpcyB0aGUgcnVuJ3MgZm9sZCBCQVNFIOKAlCB0aGUgc3RhdGUgbm8gY29tbWl0IGluZGV4IGNhbiByZWFjaCDigJQgcGx1c1xuICogICAgIHRoZSBzdWJmbG93J3MgYGlucHV0TWFwcGVyYCBzZWVkIHdoZW4gdGhlIGxvZyBvcGVucyB3aXRoIG9uZSAodGhlXG4gKiAgICAgbW91bnQncyBjb21taXQsIHN0YW1wZWQgd2l0aCB0aGUgbW91bnQncyBydW50aW1lU3RhZ2VJZCBzaW5jZSBSMTMgYW5kXG4gKiAgICAgd2l0aCBgJydgIHRocm91Z2ggOS4zMy4wKS4gU28gb24gYSBkcmlsbGVkIGN1cnNvciBpdCBpcyBleGFjdGx5IFwidGhlXG4gKiAgICAgaW5wdXQgdGhpcyBzdWJmbG93IGJlZ2FuIHdpdGhcIi5cbiAqICAgLSBvbiBhIHN0cmF0ZWd5IHRoYXQgRklMVEVSUyBzdGFnZXMgb3V0LCB0aGUgY29tbWl0cyBvZiB0aGUgZHJvcHBlZFxuICogICAgIHN0YWdlcyB0aGF0IHJhbiBCRUZPUkUgdGhlIGZpcnN0IHN1cnZpdmluZyBzdG9wIGhhdmUgdG8gZm9sZCBzb21ld2hlcmUsXG4gKiAgICAgYW5kIGAnc3RhcnQnYCBpcyB0aGUgb25seSBwbGFjZSB0aGV5IGNhbiBnbyB3aXRob3V0IG9ycGhhbmluZyB0aGVtLiBJdHNcbiAqICAgICBmb2xkIGlzIHRoZW4gdGhlIGJhc2UgUExVUyB0aGF0IHByb2xvZ3VlIOKAlCB0aGUgc3RhdGUgdGhlIGZpcnN0IHN0b3BcbiAqICAgICBSRUFELCBub3QgdGhlIHJ1bidzIHJhdyBiYXNlLiBTdWNoIGEgc3RhcnQgTVVTVCBzYXkgc28gYnkgc2V0dGluZ1xuICogICAgIHtAbGluayBTdG9wLnByb2xvZ3VlfTsgYSByZW5kZXJlciB0aGF0IG1lYW5zIFwidGhlIHJ1bidzIHJhdyBiYXNlXCIgcmVhZHNcbiAqICAgICBga2luZCA9PT0gJ3N0YXJ0JyAmJiAhc3RvcC5wcm9sb2d1ZWAsIGFuZCBnZXRzIGEgdHJ1ZSBhbnN3ZXIgb24gZXZlcnlcbiAqICAgICBheGlzIGluc3RlYWQgb2Ygb25lIHRoYXQgaXMgdHJ1ZSBvbmx5IG9uIHRoZSBsaWJyYXJ5J3Mgb3duLlxuICogLSBgJ2VuZCdgICAgIOKAlCB0aGUgYm9va2VuZCBhZnRlciB0aGUgbGFzdCBjb21taXQ6IFwidGhlIHJ1biBpcyBvdmVyXCIuIEl0c1xuICogICBmb2xkIGVxdWFscyB0aGUgZmluYWwgc3RhZ2UncyBieSBjb25zdHJ1Y3Rpb247IHRoZSB0d28gYXJlIGRpZmZlcmVudFxuICogICBxdWVzdGlvbnMsIG5vdCBhIGR1cGxpY2F0ZWQgYW5zd2VyLlxuICpcbiAqIE5PVCBXSURFTkVELCBERUxJQkVSQVRFTFkuIEEgZmlsdGVyaW5nIHN0cmF0ZWd5J3Mgc3RhcnQgY291bGQgaGF2ZSBiZWVuIGFcbiAqIGZpZnRoIGtpbmQgKGAncHJvbG9ndWUnYCksIGJ1dCBhZGRpbmcgYSBtZW1iZXIgdG8gdGhpcyB1bmlvbiBicmVha3MgZXZlcnlcbiAqIGNvbnN1bWVyIHdpdGggYW4gZXhoYXVzdGl2ZSBgc3dpdGNoYCBvdmVyIGl0IOKAlCBhIGNvbXBpbGUgZXJyb3IgaGFuZGVkIHRvXG4gKiByZWFkZXJzIHdobyBkaWQgbm90aGluZyB3cm9uZy4gQSBmbGFnIG9uIHRoZSBzdG9wIHNheXMgdGhlIHNhbWUgdGhpbmcgYW5kXG4gKiBjb3N0cyBhbiBleGlzdGluZyByZWFkZXIgbm90aGluZy5cbiAqL1xuZXhwb3J0IHR5cGUgU3RvcEtpbmQgPSAnY29tbWl0JyB8ICdtb3VudCcgfCAnc3RhcnQnIHwgJ2VuZCc7XG5cbi8qKlxuICogT25lIHBvc2l0aW9uIGEgcmVhZGVyJ3MgY3Vyc29yIGNhbiByZXN0IGF0LlxuICpcbiAqIEB0eXBlUGFyYW0gVE1ldGEgdGhlIFNUUkFURUdZJ1Mgb3duIHZvY2FidWxhcnksIGNhcnJpZWQgb3BhcXVlbHkgaW5cbiAqICAge0BsaW5rIFN0b3AubWV0YX0uIERlZmF1bHRzIHRvIGB1bmtub3duYCwgc28gZXZlcnkgcHJlLTkuMTggYFN0b3BgIHN0aWxsXG4gKiAgIG1lYW5zIHdoYXQgaXQgbWVhbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcDxUTWV0YSA9IHVua25vd24+IHtcbiAgLyoqIFBvc2l0aW9uIGluIGBUaW1lVHJhdmVsLnN0b3BzYCDigJQgMC1iYXNlZCwgdGhlIGN1cnNvcidzIHN0ZXAgbnVtYmVyLiAqL1xuICByZWFkb25seSBzdGVwOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgc3RhZ2UgdGhpcyBzdG9wIGlzOiBgW3N1YmZsb3dQYXRoL11zdGFnZUlkI2V4ZWN1dGlvbkluZGV4YC5cbiAgICogYCcnYCBmb3IgdGhlIGAnc3RhcnQnYCAvIGAnZW5kJ2AgYm9va2VuZHMsIHdoaWNoIGFyZSBub3Qgc3RhZ2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgcnVudGltZVN0YWdlSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIEFSUkFZIElOREVYIG9mIHRoaXMgc3RvcCdzIEZJUlNUIGNvbW1pdCBidW5kbGU7IGAtMWAgYXQgYCdzdGFydCdgLlxuICAgKiBUaGlzIGlzIHRoZSBzdG9wJ3MgYWRkcmVzcyBvbiB0aGUgY29tbWl0IGF4aXMuXG4gICAqXG4gICAqIEluZGljZXMgYXJlIFNPVVJDRS1MT0NBTC4gT24gYSBjaGFpbmVkIGN1cnNvciAoc2VlXG4gICAqIHtAbGluayB0aW1lVHJhdmVsfSkgdGhleSBpbmRleCB0aGUgbG9nIG9mIHtAbGluayBTdG9wLnNvdXJjZUlkeH0sIG5ldmVyIGFcbiAgICogY29uY2F0ZW5hdGlvbiDigJQgY29tbWl0IGluZGljZXMgYXJlIHJ1bi1sb2NhbCBhbmQgdGhlIGxpYnJhcnkgd2lsbCBub3RcbiAgICogaW52ZW50IGEgZ2xvYmFsIG9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbW1pdElkeDogbnVtYmVyO1xuICAvKipcbiAgICogQVJSQVkgSU5ERVggb2YgdGhlIExBU1QgY29tbWl0IGJ1bmRsZSBmb2xkZWQgYXQgdGhpcyBzdG9wIOKAlCB0aGUgZW5kIG9mXG4gICAqIHRoaXMgc3RvcCdzIHNsaWNlIG9mIHRoZSBsb2cuIFN0b3BzIFBBUlRJVElPTiB0aGUgbG9nLCBzbyB0aGlzIGlzIHRoZVxuICAgKiBpbmRleCBqdXN0IGJlZm9yZSB0aGUgbmV4dCBzdG9wIGJlZ2luczsgaXQgaXMgZ3JlYXRlciB0aGFuXG4gICAqIHtAbGluayBjb21taXRJZHh9IHdoZW5ldmVyIGEgc3RhZ2UgY29tbWl0dGVkIG1vcmUgdGhhbiBvbmUgYnVuZGxlIChhXG4gICAqIHN1YmZsb3cgbW91bnQncyBvdXRwdXQtbWFwcGluZyArIGV4aXQgcGFpciwgYSBmb3JrIGNoaWxkJ3MgZW1wdHkgcmVwZWF0KSxcbiAgICogYW5kIGdyZWF0ZXIgYWdhaW4gb24gYSBmaWx0ZXJpbmcgc3RyYXRlZ3ksIHdoaWNoIGFic29yYnMgdGhlIGNvbW1pdHMgb2ZcbiAgICogdGhlIHN0YWdlcyBpdCBkcm9wcGVkLiBGb2xkaW5nIHRocm91Z2ggdGhpcyBpbmRleCDigJQgbm90IHRocm91Z2hcbiAgICogYGNvbW1pdElkeGAg4oCUIGlzIHdoYXQgbWFrZXMgYHN0YXRlQXQoc3RvcClgIGVxdWFsIHRoZSBzdGF0ZSB0aGUgbmV4dFxuICAgKiBzdGFnZSBzdGFydGVkIGZyb20uXG4gICAqL1xuICByZWFkb25seSBsYXN0Q29tbWl0SWR4OiBudW1iZXI7XG4gIC8qKiBTdGFibGUgc3RhZ2UgaWQgZnJvbSB0aGUgYnVpbGRlciAodGhlIHBvc3QtbW91bnQsIHByZWZpeGVkIGZvcm0pLiAqL1xuICByZWFkb25seSBzdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBTdWJmbG93IHBhdGggdGhpcyBzdGFnZSByYW4gdW5kZXIsIHdoZW4gaXQgcmFuIGluc2lkZSBvbmUuICovXG4gIHJlYWRvbmx5IHN1YmZsb3dQYXRoPzogc3RyaW5nO1xuICAvKiogSHVtYW4tcmVhZGFibGUgc3RhZ2UgbmFtZSDigJQgd2hhdCBhIFVJIHB1dHMgb24gdGhlIGF4aXMgdGljay4gKi9cbiAgcmVhZG9ubHkgbGFiZWw6IHN0cmluZztcbiAgcmVhZG9ubHkga2luZDogU3RvcEtpbmQ7XG4gIC8qKlxuICAgKiBUSEUgU1RSQVRFR1knUyBPV04gVk9DQUJVTEFSWSwgY2FycmllZCB2ZXJiYXRpbS4gVGhlIHBvcnQgYXNzaWducyBpdCBOT1xuICAgKiBtZWFuaW5nOiBpdCBuZXZlciByZWFkcyBpdCwgbmV2ZXIgdmFsaWRhdGVzIGl0LCBuZXZlciBicmFuY2hlcyBvbiBpdCwgYW5kXG4gICAqIHBhc3NlcyBpdCB0aHJvdWdoIGB0aW1lVHJhdmVsYCwgYGp1bXBUb2AsIGBkcmlsbGAgYW5kIG1hcmtzIEJZIFJFRkVSRU5DRVxuICAgKiDigJQgbmV2ZXIgY2xvbmVkLCBuZXZlciBmcm96ZW4uIFRoZSBzdG9wIGhvbGRzIHRoZSB2ZXJ5IG9iamVjdCB0aGUgc3RyYXRlZ3lcbiAgICogcHV0IHRoZXJlLCBzbyBhIG11dGF0aW9uIHRocm91Z2ggb25lIGhvbGRlciBpcyB2aXNpYmxlIHRvIGV2ZXJ5IG90aGVyLlxuICAgKlxuICAgKiBXSFkgSVQgRVhJU1RTLiB7QGxpbmsga2luZH0gaXMgdGhlIFBPUlQncyB2b2NhYnVsYXJ5IOKAlCB0aGUgZm91ciBwb3NpdGlvbnNcbiAgICogdGhlIHN1YnN0cmF0ZSBpdHNlbGYga25vd3MuIEEgZG9tYWluIHN0cmF0ZWd5IGNsYXNzaWZpZXMgc3RhZ2VzIGluIGl0cyBvd25cbiAgICogdGVybXMgKGEgbWlsZXN0b25lLCBhIHR1cm4sIGEgdG9vbCBjYWxsLCBhIGJlYXQpIGFuZCBoYWQgbm93aGVyZSB0byBwdXRcbiAgICogdGhhdCwgc28gdGhlIGFuc3dlciB0cmF2ZWxsZWQgYnkgcmUtZGVyaXZpbmcgaXQgZnJvbSBgcnVudGltZVN0YWdlSWRgIGF0XG4gICAqIGV2ZXJ5IHJlYWQ6IGEgc2Vjb25kIHJ1biBvZiB0aGUgY2xhc3NpZmllciB0aGF0IGp1c3QgcmFuLCBhbmQgYSBzZWNvbmRcbiAgICogY2hhbmNlIHRvIGRpc2FncmVlIHdpdGggaXQuIEEgc3RvcCBub3cgY2FycmllcyB3aGF0IGl0cyBzdHJhdGVneSBrbmV3LlxuICAgKlxuICAgKiBBYnNlbnQgb24gZXZlcnkgc3RvcCBgY29tbWl0U3RvcHNgIHByb2R1Y2VzIOKAlCB0aGUgc2hpcHBlZCBzdHJhdGVneSBoYXMgbm9cbiAgICogdm9jYWJ1bGFyeSBiZXlvbmQgYGtpbmRgLCBhbmQgc2F5cyBzbyBieSBvbWlzc2lvbiByYXRoZXIgdGhhbiBieSBgbnVsbGAuXG4gICAqL1xuICByZWFkb25seSBtZXRhPzogVE1ldGE7XG4gIC8qKlxuICAgKiBPbmx5IG1lYW5pbmdmdWwgb24gYGtpbmQ6ICdzdGFydCdgLiBgdHJ1ZWAgd2hlbiB0aGlzIHN0YXJ0IGZvbGRzIHRoZVxuICAgKiBjb21taXRzIG9mIFNUQUdFUyBUSElTIEFYSVMgRE9FUyBOT1QgU0hPVyDigJQgdGhlIHByb2xvZ3VlIGEgZmlsdGVyaW5nXG4gICAqIHN0cmF0ZWd5IG11c3QgcHV0IHNvbWV3aGVyZS4gQWJzZW50IChuZXZlciBgZmFsc2VgKSBvbiBhbiBheGlzIHdob3NlIHN0YXJ0XG4gICAqIGlzIHRoZSBydW4ncyByYXcgZm9sZCBiYXNlLlxuICAgKlxuICAgKiBBIHJlYWRlciB0aGF0IHdhbnRzIFwidGhlIHN0YXRlIGJlZm9yZSBhbnl0aGluZyByYW5cIiBjaGVja3NcbiAgICogYGtpbmQgPT09ICdzdGFydCcgJiYgIXByb2xvZ3VlYDsgb25lIHRoYXQgd2FudHMgXCJ0aGUgc3RhdGUgdGhlIGZpcnN0IHN0b3BcbiAgICogcmVhZFwiIGp1c3QgZm9sZHMgdGhlIHN0YXJ0LiBTZWUge0BsaW5rIFN0b3BLaW5kfS5cbiAgICovXG4gIHJlYWRvbmx5IHByb2xvZ3VlPzogdHJ1ZTtcbiAgLyoqXG4gICAqIFdoaWNoIFNPVVJDRSB0aGlzIHN0b3AncyBjb21taXQgaW5kaWNlcyBiZWxvbmcgdG8sIG9uIGEgY2hhaW5lZCBjdXJzb3Ig4oCUXG4gICAqIHRoZSBwb3NpdGlvbiBpbiB0aGUgYXJyYXkgaGFuZGVkIHRvIHtAbGluayB0aW1lVHJhdmVsfS4gQWJzZW50IG9uIGEgY3Vyc29yXG4gICAqIG92ZXIgYSBzaW5nbGUgc291cmNlLCB3aGljaCBpcyBldmVyeSBjdXJzb3IgYnVpbHQgYmVmb3JlIDkuMTguMC5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZUlkeD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgYFtzdGFydCwg4oCmc3RhZ2VzLCBlbmRdYCBzaGFwZSBgY29tbWl0U3RvcHNgIHJldHVybnMgZm9yIGEgTk9OLUVNUFRZIGxvZ1xuICog4oCUIHNwbGl0IG91dCwgc28gYSBzdHJhdGVneSB0aGF0IGNvbXBvc2VzIGl0IHN0b3BzIHdyaXRpbmcgaXRzIG93biBndWFyZC5cbiAqXG4gKiBTZWUge0BsaW5rIHNwbGl0QXhpc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQm9va2VuZGVkQXhpczxUTWV0YSA9IHVua25vd24+IHtcbiAgLyoqIFRoZSBgJ3N0YXJ0J2AgYm9va2VuZCDigJQgdGhlIG9ubHkgc3RvcCB0aGF0IG1heSBvcGVuIGF0IGBjb21taXRJZHg6IC0xYC4gKi9cbiAgcmVhZG9ubHkgc3RhcnQ6IFN0b3A8VE1ldGE+O1xuICAvKiogRXZlcnl0aGluZyBiZXR3ZWVuIHRoZSBib29rZW5kcywgaW4gZXhlY3V0aW9uIG9yZGVyLiBNYXkgYmUgZW1wdHkuICovXG4gIHJlYWRvbmx5IHN0YWdlczogcmVhZG9ubHkgU3RvcDxUTWV0YT5bXTtcbiAgLyoqIFRoZSBgJ2VuZCdgIGJvb2tlbmQg4oCUIHRoZSBvbmx5IHN0b3AgdGhhdCBmb2xkcyB0aGUgd2hvbGUgbG9nLiAqL1xuICByZWFkb25seSBlbmQ6IFN0b3A8VE1ldGE+O1xufVxuXG4vKipcbiAqIFdoYXQge0BsaW5rIHNwbGl0QXhpc30gYW5zd2VycyB3aGVuIHRoZXJlIGlzIG5vIGJvb2tlbmRlZCBheGlzIHRvIHNwbGl0LlxuICpcbiAqIC0gYCdlbXB0eSdgIOKAlCBubyBzdG9wcyBhdCBhbGwuIFRoZSBsb2cgaXRzZWxmIHdhcyBlbXB0eTsgYSB0cnV0aGZ1bCBheGlzXG4gKiAgIHdpdGggbm93aGVyZSB0byBzdGFuZCwgTk9UIGEgYnJva2VuIG9uZS5cbiAqIC0gYCdub3QtYm9va2VuZGVkJ2Ag4oCUIHN0b3BzIGV4aXN0IGJ1dCB0aGUgZmlyc3QgaXMgbm90IGEgYCdzdGFydCdgIG9yIHRoZVxuICogICBsYXN0IGlzIG5vdCBhbiBgJ2VuZCdgLiBPbmx5IGEgc3RyYXRlZ3kgY2FuIGNhdXNlIHRoaXM7IGEgcnVuIGNhbm5vdC5cbiAqL1xuZXhwb3J0IHR5cGUgQXhpc1JlZnVzYWwgPSAnZW1wdHknIHwgJ25vdC1ib29rZW5kZWQnO1xuXG4vKiogVGhlIHJlc3VsdCBvZiB7QGxpbmsgc3BsaXRBeGlzfTogdGhlIGF4aXMsIG9yIHdoeSB0aGVyZSBpcyBub25lLiAqL1xuZXhwb3J0IHR5cGUgQXhpc1NwbGl0PFRNZXRhID0gdW5rbm93bj4gPVxuICB8ICh7IHJlYWRvbmx5IG9rOiB0cnVlIH0gJiBCb29rZW5kZWRBeGlzPFRNZXRhPilcbiAgfCB7XG4gICAgICByZWFkb25seSBvazogZmFsc2U7XG4gICAgICByZWFkb25seSByZWFzb246IEF4aXNSZWZ1c2FsO1xuICAgICAgLyoqIFRoZSBraW5kcyB0aGF0IHdlcmUgYWN0dWFsbHkgdGhlcmUg4oCUIHdoYXQgdG8gcHJpbnQgaW4gdGhlIHJlZnVzYWwuICovXG4gICAgICByZWFkb25seSBraW5kczogcmVhZG9ubHkgU3RvcEtpbmRbXTtcbiAgICB9O1xuXG4vLyDilIDilIAgVGhlIGZvbGQgcmVzdWx0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEhvdyBhIGZvbGRlZCBzdGF0ZSB3YXMgZGVyaXZlZCDigJQgdGhlIGhvbmVzdHkgZmllbGQgKGAnaW5pdGlhbCtsb2cnYCBvclxuICogYCdsb2ctb25seSdgKS4gQSBwYXJ0aWFsIGFuc3dlciBzYXlzIGl0IGlzIHBhcnRpYWwsIG5ldmVyIGEgc2lsZW50IG9uZS5cbiAqXG4gKiBXaGF0IGVhY2ggdmFsdWUgbWVhbnMgaXMgcmVnaXN0ZXJlZCBPTkNFLCB3aXRoIHRoZSBvdGhlciBob25lc3R5IHNpZ25hbHMsIGluXG4gKiBgbWVtb3J5L2hvbmVzdHkudHMgwrcgSE9ORVNUWV9DT0RFU2AgKHNlcnZlZCBhcyBgSE9ORVNUWV9DT0RFU2Agb25cbiAqIGBmb290cHJpbnRqcy90cmFjZWApOyB0aGlzIHVuaW9uIGRlY2xhcmVzIGl0cyBtZW1iZXJzIHRocm91Z2hcbiAqIGBSZWdpc3RlcmVkQ29kZWAsIHNvIGEgY29kZSB0aGUgcmVnaXN0cnkgZG9lcyBub3QgaG9sZCBkb2VzIG5vdCBjb21waWxlLlxuICovXG5leHBvcnQgdHlwZSBGb2xkQmFzaXMgPSBSZWdpc3RlcmVkQ29kZTwnaW5pdGlhbCtsb2cnIHwgJ2xvZy1vbmx5Jz47XG5cbi8qKiBBIGRldGFjaGVkIGZvbGQgb2YgdGhlIGxvZyB1cCB0byBvbmUgc3RvcC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9sZGVkU3RhdGUge1xuICAvKiogVGhlIHN0YXRlLCBkZWVwbHkgZnJvemVuIGFuZCBmdWxseSBkZXRhY2hlZCBmcm9tIHRoZSBlbmdpbmUuICovXG4gIHJlYWRvbmx5IHN0YXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqIEhvdyBpdCB3YXMgZGVyaXZlZCDigJQgc2VlIHtAbGluayBGb2xkQmFzaXN9LiAqL1xuICByZWFkb25seSBiYXNpczogRm9sZEJhc2lzO1xuICAvKipcbiAgICogYHRydWVgIHdoZW4gYW55IGNvbW1pdCBmb2xkZWQgaW4gZGVjbGFyZWQgcmVkYWN0ZWQgcGF0aHMsIHNvIHRoaXMgc3RhdGVcbiAgICogY2FycmllcyBgJ1JFREFDVEVEJ2AgcGxhY2Vob2xkZXJzIHdoZXJlIHRoZSBlbmdpbmUgc2NydWJiZWQgdmFsdWVzIGF0XG4gICAqIHdyaXRlIHRpbWUuIFRoZSBsb2cgaXMgcmVkYWN0ZWQgd2hlcmUgaXQgd2FzIHdyaXR0ZW47IGEgZm9sZCBtdXN0IFNBWSBzb1xuICAgKiByYXRoZXIgdGhhbiBwcmVzZW50IGEgc2NydWJiZWQgdmFsdWUgYXMgdGhlIHJlYWwgb25lLlxuICAgKlxuICAgKiBSZWdpc3RyeSBjb2RlOiBgJ3JlZGFjdGVkJ2AgKGBtZW1vcnkvaG9uZXN0eS50cyDCtyBIT05FU1RZX0NPREVTYCwgc2VydmVkIG9uXG4gICAqIGBmb290cHJpbnRqcy90cmFjZWApIHNheXMgd2hhdCB0aGlzIGZpZWxkIGFuZCB7QGxpbmsgRm9sZGVkU3RhdGUucmVkYWN0ZWRQYXRoc30gbWVhbjtcbiAgICogbmVpdGhlciBjYXJyaWVzIGEgYGNvZGVgLiBUaGUgcGxhY2Vob2xkZXIgaXMgdGhlIGxvZydzIHN0cmluZyxcbiAgICogYG1lbW9yeS9wbGFjZWhvbGRlcnMudHMgwrcgTE9HX1BMQUNFSE9MREVSYC5cbiAgICovXG4gIHJlYWRvbmx5IHJlZGFjdGVkOiBib29sZWFuO1xuICAvKiogVGhlIHJlZGFjdGVkIHBhdGhzIHNlZW4gYWNyb3NzIHRoZSBmb2xkZWQgcHJlZml4IOKAlCBzb3J0ZWQsIGRlZHVwZWQuICovXG4gIHJlYWRvbmx5IHJlZGFjdGVkUGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogVGhlIGxhc3QgY29tbWl0IGluZGV4IGZvbGRlZCBpbjsgYC0xYCB3aGVuIG5vdGhpbmcgd2FzIGZvbGRlZC4gKi9cbiAgcmVhZG9ubHkgdGhyb3VnaENvbW1pdElkeDogbnVtYmVyO1xuICAvKipcbiAgICogRW50cmllcyBvZiB0aGUgZm9sZGVkIHByZWZpeCB0aGF0IHdlcmUgbm90IGNvbW1pdCBidW5kbGVzLCB3aXRoIHRoZSBpbmRleFxuICAgKiBhbmQgdGhlIHJlYXNvbi4gQUJTRU5UIHdoZW4gbm90aGluZyB3YXMgc2tpcHBlZCwgd2hpY2ggaXMgZXZlcnkgZm9sZCBvdmVyXG4gICAqIGEgbGl2ZSBzbmFwc2hvdCDigJQgYSBjbGVhbiBmb2xkJ3Mgc2hhcGUgaXMgYnl0ZS1pZGVudGljYWwgdG8gOS4xNy4wJ3MuXG4gICAqXG4gICAqIEEgZ2FwIGNvbnRyaWJ1dGVzIG5vIHN0YXRlLCBzbyBhIGZvbGQgdGhhdCByZXBvcnRzIG9uZSBpcyBJTkNPTVBMRVRFIGF0XG4gICAqIGV4YWN0bHkgdGhlIHBsYWNlcyBpdCBuYW1lcy5cbiAgICovXG4gIHJlYWRvbmx5IHNraXBwZWQ/OiByZWFkb25seSBMb2dHYXBbXTtcbiAgLyoqXG4gICAqIFdoaWNoIHNvdXJjZSBvZiBhIENIQUlOIHRoaXMgZm9sZCBlbmRlZCBpbiDigJQgYHRocm91Z2hDb21taXRJZHhgIGluZGV4ZXNcbiAgICogdGhhdCBzb3VyY2UncyBsb2cuIEFic2VudCBvbiBhIHNpbmdsZS1zb3VyY2UgY3Vyc29yLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlSWR4PzogbnVtYmVyO1xufVxuXG4vLyDilIDilIAgTW92ZW1lbnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogV2h5IGEgbW92ZSBkaWQgbm90IGhhcHBlbi5cbiAqXG4gKiAtIGAnY2xhbXBlZCdgIOKAlCB0aGUgbW92ZSB3b3VsZCBsYW5kIE9VVFNJREUgdGhlIGF4aXMgKGBwcmV2KClgIGF0IHRoZSBmaXJzdFxuICogICBzdG9wLCBgbmV4dCgpYCBhdCB0aGUgbGFzdCwgYSBzdGVwIG51bWJlciBiZWxvdyAwIG9yIHBhc3QgdGhlIGVuZCksIG9yIG9uXG4gKiAgIHRoZSB2ZXJ5IHN0b3AgdGhlIGN1cnNvciBhbHJlYWR5IHN0YW5kcyBvbi4gRWl0aGVyIHdheSBub3RoaW5nIG1vdmVkLiBXaGVuXG4gKiAgIHRoZSB0YXJnZXQgd2FzIG91dCBvZiByYW5nZSwgYG5lYXJlc3RgIG5hbWVzIHRoZSBlbmQgdGhhdCB3YXMgaGl0IOKAlCB0aGVcbiAqICAgY3Vyc29yIGl0c2VsZiBtYXkgYmUgbm93aGVyZSBuZWFyIGl0LlxuICogLSBgJ21pc3MnYCDigJQgdGhlIHRhcmdldCBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIGF4aXMuXG4gKiAtIGAnZW1wdHknYCDigJQgdGhpcyBjdXJzb3IgaGFzIG5vIHN0b3BzIGF0IGFsbCAoYW4gZW1wdHkgbG9nKS5cbiAqL1xuZXhwb3J0IHR5cGUgTW92ZVJlZnVzYWwgPSAnY2xhbXBlZCcgfCAnbWlzcycgfCAnZW1wdHknO1xuXG4vKipcbiAqIFRoZSByZXN1bHQgb2YgYXNraW5nIHRoZSBjdXJzb3IgdG8gbW92ZS5cbiAqXG4gKiBBIHJlZnVzZWQgbW92ZSBORVZFUiBtb3ZlcyB0aGUgY3Vyc29yLiBUaGF0IGlzIHRoZSBsYXcgYSByZWFkZXIncyBVSSByZXN0c1xuICogb246IGEgbWlzdHlwZWQgaWQgb3IgYSBzdGVwIHBhc3QgdGhlIGVuZCBsZWF2ZXMgdGhlIHBhbmVsIHNob3dpbmcgZXhhY3RseVxuICogd2hhdCBpdCBzaG93ZWQgYmVmb3JlLCB3aXRoIGEgcmVhc29uIHRvIGRpc3BsYXkg4oCUIG5ldmVyIGEgc2lsZW50IGp1bXAgdG9cbiAqIHNvbWV3aGVyZSB0aGUgdXNlciBkaWQgbm90IGFzayBmb3IuXG4gKi9cbmV4cG9ydCB0eXBlIE1vdmU8VE1ldGEgPSB1bmtub3duPiA9XG4gIHwgeyByZWFkb25seSBtb3ZlZDogdHJ1ZTsgcmVhZG9ubHkgZnJvbTogU3RvcDxUTWV0YT4gfCB1bmRlZmluZWQ7IHJlYWRvbmx5IHRvOiBTdG9wPFRNZXRhPiB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgbW92ZWQ6IGZhbHNlO1xuICAgICAgcmVhZG9ubHkgcmVhc29uOiBNb3ZlUmVmdXNhbDtcbiAgICAgIC8qKiBXaGVyZSB0aGUgY3Vyc29yIHN0aWxsIGlzIChhYnNlbnQgb25seSB3aGVuIHRoZXJlIGFyZSBubyBzdG9wcykuICovXG4gICAgICByZWFkb25seSBhdD86IFN0b3A8VE1ldGE+O1xuICAgICAgLyoqIFRoZSBjbG9zZXN0IHN0b3AgdG8gd2hhdCB3YXMgYXNrZWQgZm9yLCB3aGVuIG9uZSBjYW4gYmUgbmFtZWQuICovXG4gICAgICByZWFkb25seSBuZWFyZXN0PzogU3RvcDxUTWV0YT47XG4gICAgfTtcblxuLy8g4pSA4pSAIE1hcmtzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEEgcmVhZGVyJ3MgYm9va21hcmsuIExpdmVzIEJFU0lERSB0aGUgbG9nLCBpbiB0aGUge0BsaW5rIFRpbWVUcmF2ZWx9XG4gKiBpbnN0YW5jZSDigJQgbmV2ZXIgd3JpdHRlbiBpbnRvIHRoZSBjb21taXQgbG9nIG9yIHRoZSBzbmFwc2hvdCwgd2hpY2ggYXJlIHRoZVxuICogcnVuJ3MgcmVjb3JkIGFuZCBub3QgdGhlIHJlYWRlcidzIG5vdGVzLlxuICpcbiAqIEEgbWFyayBuYW1lcyBpdHMgc3RvcCBieSBgcnVudGltZVN0YWdlSWRgLCBub3QgYnkgc3RlcCBudW1iZXI6IHN0ZXAgbnVtYmVyc1xuICogYmVsb25nIHRvIG9uZSBzdHJhdGVneSdzIGF4aXMsIGBydW50aW1lU3RhZ2VJZGAgaXMgdGhlIHNhbWUgc3RhZ2Ugb24gZXZlcnlcbiAqIGF4aXMsIHNvIGEgbWFyayBzdXJ2aXZlcyBhIGNoYW5nZSBvZiBzdHJhdGVneSBhbmQgYSByZS1kZXJpdmF0aW9uIG9mIHN0b3BzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hcmsge1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgc3RlcCB0aGUgbWFyayB3YXMgcGxhY2VkIGF0LCBvbiB0aGUgYXhpcyBpbiBmb3JjZSBhdCB0aGUgdGltZS4gKi9cbiAgcmVhZG9ubHkgc3RlcDogbnVtYmVyO1xufVxuXG4vLyDilIDilIAgVGhlIHN0cmF0ZWd5IHNlYW0g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogSG93IHN0b3BzIGFyZSBERVJJVkVEIGZyb20gYSByZWNvcmRlZCBsb2cuIFRoZSBzZWFtLlxuICpcbiAqIGZvb3RwcmludGpzIHNoaXBzIG9uZSBzdHJhdGVneSDigJQgYGNvbW1pdFN0b3BzYCwgb25lIHN0b3AgcGVyIGV4ZWN1dGVkIHN0YWdlXG4gKiDigJQgYmVjYXVzZSB0aGF0IGlzIHRoZSBvbmx5IHN0b3AgZ3JhbW1hciB0aGUgc3Vic3RyYXRlIGl0c2VsZiBrbm93cy4gQVxuICogY29uc3VtZXIgd2l0aCBhIHJpY2hlciB2b2NhYnVsYXJ5IChtaWxlc3RvbmVzLCB0b29sIGNhbGxzLCB0dXJucykgc3VwcGxpZXNcbiAqIGl0cyBvd24gYW5kIGdldHMgdGhlIHNhbWUgY3Vyc29yIG92ZXIgaXQsIGFuZCBwdXRzIHRoYXQgdm9jYWJ1bGFyeSBvblxuICoge0BsaW5rIFN0b3AubWV0YX0gcmF0aGVyIHRoYW4gcmUtZGVyaXZpbmcgaXQgYXQgZXZlcnkgcmVhZC5cbiAqXG4gKiBUaGUgbGF3IGEgc3RyYXRlZ3kgbXVzdCBrZWVwOiBzdG9wcyBhcmUgREVSSVZFRCBGUk9NIFRIRSBSRUNPUkRFRCBMT0cuXG4gKiBBIHN0cmF0ZWd5IG1heSBncm91cCwgZmlsdGVyLCBsYWJlbCBhbmQgb3JkZXIgd2hhdCB3YXMgcmVjb3JkZWQuIEl0IG1heSBub3RcbiAqIHJlLXdhbGsgdGhlIGV4ZWN1dGlvbiB0cmVlIHRvIHN5bnRoZXNpemUgYSBzdG9wIGZvciBzb21ldGhpbmcgdGhhdCB3YXMgbmV2ZXJcbiAqIGNvbW1pdHRlZCDigJQgYSBjdXJzb3IgdGhhdCBzdG9wcyB3aGVyZSBubyBldmlkZW5jZSBleGlzdHMgaXMgdGVsbGluZyBhIHN0b3J5LFxuICogbm90IHJlYWRpbmcgb25lLlxuICpcbiAqIE9OIEEgQ0hBSU4sIGBzdG9wc0ZvcmAgaXMgY2FsbGVkIE9OQ0UgUEVSIFNPVVJDRSB3aXRoIHRoYXQgc291cmNlJ3Mgb3duIGxvZ1xuICogYW5kIHRyZWUsIGFuZCB0aGUgY3Vyc29yIHJlLXN0ZXBzIHRoZSByZXN1bHRzIGludG8gb25lIGF4aXMuIFNvIGEgc3RyYXRlZ3lcbiAqIG5ldmVyIGhhcyB0byBrbm93IGl0IGlzIHBhcnQgb2YgYSBjaGFpbiwgYW5kIGl0cyBgY29tbWl0SWR4YC9gbGFzdENvbW1pdElkeGBcbiAqIHN0YXkgc291cmNlLWxvY2FsIOKAlCB3aGljaCBpcyB3aGF0IHRoZXkgYWx3YXlzIHdlcmUuXG4gKlxuICogYHN1YmZsb3dSZXN1bHRzYCAoOS4zOS4wKSBpcyB0aGUgc291cmNlJ3Mgb3duIGBzdWJmbG93UmVzdWx0c2AsIGFzIHN0b3JlZFxuICogKHVudHlwZWQpIOKAlCBhIG1vdW50J3MgcGVyLWV4ZWN1dGlvbiBrZXkgbmFtZXMgaXQgYSBtb3VudCB3aGVuIG5vIHRyZWUgY2FtZVxuICogd2l0aCB0aGUgbG9nLiBBIHN0cmF0ZWd5IG1heSBpZ25vcmUgaXQuXG4gKlxuICogYGV4ZWN1dGlvblRyZWVgIGlzIGFuIHtAbGluayBFeGVjdXRpb25UcmVlfSAoOS40OC4wOyBhIGBTdGFnZVNuYXBzaG90YFxuICogYmVmb3JlKTogdGhlIGZpZWxkcyB0aGUgcmVjb3JkJ3MgcmVhZGVycyByZWFkLiBBIHN0cmF0ZWd5IHdyaXR0ZW4gYmVmb3JlXG4gKiA5LjQ4LjAgdGhhdCBhbm5vdGF0ZXMgdGhlIHBhcmFtZXRlciBgU3RhZ2VTbmFwc2hvdGAgc3RpbGwgY29tcGlsZXMg4oCUIGFcbiAqIG1ldGhvZCdzIHBhcmFtZXRlcnMgYXJlIGNvbXBhcmVkIGJvdGggd2F5cyDigJQgYnV0IHRoZSBhbm5vdGF0aW9uIGlzIGEgY2xhaW1cbiAqIG5vdGhpbmcgY2hlY2tzOiBgdGltZVRyYXZlbGAgaGFuZHMgYSBzdG9yZWQgcmVjb3JkaW5nJ3MgdHJlZSBvdmVyIGFzIHBhcnNlZCxcbiAqIHNvIGEgZmllbGQgYmV5b25kIHRoZXNlIGlzIHJlYWQgZGVmZW5zaXZlbHkuIE9uZSBsZWZ0IHVuYW5ub3RhdGVkIGlzIHR5cGVkXG4gKiBieSB0aGlzIHNpZ25hdHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaW1lVHJhdmVsU3RyYXRlZ3k8VE1ldGEgPSB1bmtub3duPiB7XG4gIHN0b3BzRm9yKGNvbW1pdExvZzogcmVhZG9ubHkgQ29tbWl0QnVuZGxlW10sIGV4ZWN1dGlvblRyZWU/OiBFeGVjdXRpb25UcmVlLCBzdWJmbG93UmVzdWx0cz86IHVua25vd24pOiBTdG9wPFRNZXRhPltdO1xufVxuXG4vLyDilIDilIAgVGhlIGN1cnNvciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBBIHJlYWRlcidzIGN1cnNvciBvdmVyIG9uZSBmaW5pc2hlZCBsb2csIHdpdGggYSBmb2xkIGF0IGVhY2ggc3RvcC5cbiAqXG4gKiBPTkUgY3Vyc29yOiB0aGlzIG9iamVjdCBob2xkcyB0aGUgb25seSBwb3NpdGlvbi4gRXZlcnkgcXVlc3Rpb24gYSByZWFkZXJcbiAqIGFza3Mg4oCUIHdoYXQgY2hhbmdlZCBoZXJlLCB3aGF0IGRpZCBzdGF0ZSBsb29rIGxpa2UsIHdoYXQgaXMgaW5zaWRlIHRoaXNcbiAqIG1vdW50IOKAlCBpcyBhbnN3ZXJlZCByZWxhdGl2ZSB0byBpdC4gYGRyaWxsKClgIHJldHVybnMgYSBTRVBBUkFURSBjdXJzb3Igb3ZlclxuICogYSBzZXBhcmF0ZSBsb2cgKGEgc3ViZmxvdydzIG93biksIG5ldmVyIGEgc2Vjb25kIHBvc2l0aW9uIG9uIHRoaXMgb25lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVUcmF2ZWw8VE1ldGEgPSB1bmtub3duPiB7XG4gIC8qKiBUaGUgYXhpcywgaW4gZXhlY3V0aW9uIG9yZGVyLiBFbXB0eSB3aGVuIHRoZSBsb2cgaXMgZW1wdHkuICovXG4gIHJlYWRvbmx5IHN0b3BzOiByZWFkb25seSBTdG9wPFRNZXRhPltdO1xuICAvKiogVGhlIHN1YmZsb3cgcGF0aCB0aGlzIGN1cnNvciBjb3ZlcnM7IGB1bmRlZmluZWRgIGZvciB0aGUgcnVuIGl0c2VsZi4gKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogVGhlIG1vdW50IHRoaXMgY3Vyc29yIHdhcyBkcmlsbGVkIG91dCBvZiDigJQgYFtzdWJmbG93UGF0aC9dc3RhZ2VJZCNpZHhgLlxuICAgKiBgdW5kZWZpbmVkYCBvbiBhIHJ1bidzIG93biBjdXJzb3IuXG4gICAqXG4gICAqIFdIWSBCT1RIOiBhIHN1YmZsb3cgbW91bnRlZCBpbnNpZGUgYSBsb29wIHJ1bnMgc2V2ZXJhbCB0aW1lcywgYW5kIGV2ZXJ5XG4gICAqIGl0ZXJhdGlvbiBzaGFyZXMgb25lIHtAbGluayBwYXRofS4gVGhpcyBpcyB0aGUgaXRlcmF0aW9uIHRoYXQgd2FzIGFjdHVhbGx5XG4gICAqIG9wZW5lZCwgc28gdGhyZWUgZHJpbGwgcGFuZWxzIG92ZXIgYHNmeCMyYCwgYHNmeCM4YCBhbmQgYHNmeCMxNGAgY2FuIGJlXG4gICAqIGxhYmVsbGVkIGFuZCBrZXllZCBhcGFydCBpbnN0ZWFkIG9mIGFsbCByZWFkaW5nIGBzZnhgLlxuICAgKi9cbiAgcmVhZG9ubHkgbW91bnRSdW50aW1lU3RhZ2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKiogVGhlIGN1cnNvciB0aGlzIG9uZSB3YXMgZHJpbGxlZCBvdXQgb2YsIGlmIGFueS4gKi9cbiAgcmVhZG9ubHkgcGFyZW50OiBUaW1lVHJhdmVsPFRNZXRhPiB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIEhvdyBtYW55IFNPVVJDRVMgdGhpcyBjdXJzb3IgcmVhZHMg4oCUIGAxYCBmb3IgYSBub3JtYWwgY3Vyc29yLCBtb3JlIGZvciBhXG4gICAqIGNoYWluZWQgb25lIChhIHBhdXNlL3Jlc3VtZSByZWFkIGFzIG9uZSBheGlzKS4gRXZlcnkgc3RvcCBvZiBhIGNoYWluZWRcbiAgICogY3Vyc29yIGNhcnJpZXMgdGhlIHtAbGluayBTdG9wLnNvdXJjZUlkeH0gaXRzIGluZGljZXMgYmVsb25nIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlQ291bnQ6IG51bWJlcjtcblxuICAvKiogV2hlcmUgdGhlIGN1cnNvciBpczsgYHVuZGVmaW5lZGAgb25seSB3aGVuIHRoZXJlIGFyZSBubyBzdG9wcy4gKi9cbiAgYXQoKTogU3RvcDxUTWV0YT4gfCB1bmRlZmluZWQ7XG5cbiAgZmlyc3QoKTogTW92ZTxUTWV0YT47XG4gIGxhc3QoKTogTW92ZTxUTWV0YT47XG4gIHByZXYoKTogTW92ZTxUTWV0YT47XG4gIG5leHQoKTogTW92ZTxUTWV0YT47XG5cbiAgLyoqXG4gICAqIE1vdmUgdG8gYSBzdGVwIG51bWJlciBvciB0byBhIGBydW50aW1lU3RhZ2VJZGAuXG4gICAqIEEgbWlzcyByZWZ1c2VzIGFuZCBuYW1lcyB0aGUgYG5lYXJlc3RgIHN0b3AgaXQgY291bGQgZmluZC5cbiAgICovXG4gIGp1bXBUbyh0YXJnZXQ6IG51bWJlciB8IHN0cmluZyk6IE1vdmU8VE1ldGE+O1xuXG4gIC8qKlxuICAgKiBGb2xkIG9mIHRoZSBsb2cgdGhyb3VnaCBgc3RvcGAgKGRlZmF1bHQ6IHRoZSBjdXJyZW50IHN0b3ApLiBEZXRhY2hlZC5cbiAgICpcbiAgICogYHN0b3BgIG11c3QgY29tZSBmcm9tIFRISVMgY3Vyc29yJ3MgYXhpczogaXRzIGBsYXN0Q29tbWl0SWR4YCBhbmRcbiAgICogYHNvdXJjZUlkeGAgYXJlIHJlYWQgYXMgYWRkcmVzc2VzIGludG8gdGhpcyBjdXJzb3IncyBvd24gbGVncywgc28gYSBzdG9wXG4gICAqIGZyb20gYW5vdGhlciBjdXJzb3IgaXMgZm9sZGVkIGF0IHdoYXRldmVyIHRob3NlIG51bWJlcnMgbWVhbiBoZXJlIOKAlCBvbiBhXG4gICAqIGNoYWluLCBhIGZvcmVpZ24gc3RvcCB3aXRoIG5vIGBzb3VyY2VJZHhgIGZvbGRzIGxlZyAwLlxuICAgKi9cbiAgc3RhdGVBdChzdG9wPzogU3RvcDxUTWV0YT4pOiBGb2xkZWRTdGF0ZTtcblxuICAvKipcbiAgICogVGhlIHN0YXRlIGtleXMgd3JpdHRlbiBiZXR3ZWVuIHR3byBzdG9wcyDigJQgcmVhZCBzdHJhaWdodCBvZmYgdGhlIGJ1bmRsZXMnXG4gICAqIHRyYWNlcywgc28gaXQgY29zdHMgbm8gZm9sZCBhdCBhbGwuXG4gICAqXG4gICAqIFdpdGggbm8gYXJndW1lbnQ6IHdoYXQgdGhlIENVUlJFTlQgc3RvcCBjaGFuZ2VkIChpLmUuIHNpbmNlIHRoZSBzdG9wXG4gICAqIGJlZm9yZSBpdCkuIFdpdGggYSBgZnJvbWAgc3RvcDogZXZlcnl0aGluZyB3cml0dGVuIGFmdGVyIGBmcm9tYCB1cCB0byBhbmRcbiAgICogaW5jbHVkaW5nIHRoZSBjdXJyZW50IHN0b3AuIEJhY2t3YXJkcyBvciBlcXVhbCByYW5nZXMgZ2l2ZSBgW11gLiBPbiBhXG4gICAqIGNoYWluZWQgY3Vyc29yIGEgcmFuZ2UgdGhhdCBjcm9zc2VzIHRoZSBzZWFtIGlzIHdhbGtlZCBzb3VyY2UgYnkgc291cmNlLlxuICAgKi9cbiAgY2hhbmdlZFNpbmNlKGZyb20/OiBTdG9wPFRNZXRhPik6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKiBCb29rbWFyayBhIHN0b3AgKGRlZmF1bHQ6IHRoZSBjdXJyZW50IG9uZSkuIFJldHVybnMgdGhlIG1hcmssIG9yXG4gICAqICBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGlzIG5vIHN0b3AgdG8gbmFtZS4gKi9cbiAgbWFyayhuYW1lOiBzdHJpbmcsIHN0b3A/OiBTdG9wPFRNZXRhPik6IE1hcmsgfCB1bmRlZmluZWQ7XG4gIC8qKiBBIGRldGFjaGVkIGNvcHkgb2YgdGhpcyBjdXJzb3IncyBtYXJrcywgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBwbGFjZWQuICovXG4gIG1hcmtzKCk6IHJlYWRvbmx5IE1hcmtbXTtcbiAgLyoqIE1vdmUgdG8gYSBtYXJrJ3Mgc3RvcC4gQSBtYXJrIHdob3NlIHN0YWdlIGlzIG5vdCBvbiB0aGlzIGF4aXMgbWlzc2VzLiAqL1xuICBqdW1wVG9NYXJrKG5hbWU6IHN0cmluZyk6IE1vdmU8VE1ldGE+O1xuXG4gIC8qKlxuICAgKiBBIGN1cnNvciBvdmVyIHRoZSBzdWJmbG93IG1vdW50ZWQgYXQgYG1vdW50UnVudGltZVN0YWdlSWRgIOKAlCB0aGUgc2FtZVxuICAgKiBpbnRlcmZhY2UsIGl0cyBvd24gbG9nLCBpdHMgb3duIGZvbGQgYmFzZS4gYHVuZGVmaW5lZGAgd2hlbiB0aGF0IG1vdW50IGlzXG4gICAqIG5vdCBpbiB0aGlzIHJ1bidzIHN1YmZsb3cgcmVzdWx0cy5cbiAgICpcbiAgICogQSBzdG9wIGluc2lkZSBhIHN1YmZsb3cgaXMgTk9UIGEgc3RvcCBvZiB0aGlzIGN1cnNvcjogc3ViZmxvd3MgcnVuIGluXG4gICAqIGlzb2xhdGVkIHJ1bnRpbWVzIGFuZCBjb21taXQgdG8gdGhlaXIgb3duIGxvZywgc28gdGhlIG91dGVyIGF4aXMgaG9sZHNcbiAgICogb25seSB0aGUgbW91bnQgYm91bmRhcnkuIERyaWxsaW5nIGlzIGhvdyB5b3UgZ2V0IGluc2lkZTsgdGhlcmUgaXMgbm8gd2F5XG4gICAqIHRvIGJlIGluIHR3byBwbGFjZXMgYXQgb25jZS5cbiAgICovXG4gIGRyaWxsKG1vdW50UnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IFRpbWVUcmF2ZWw8VE1ldGE+IHwgdW5kZWZpbmVkO1xufVxuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIHRpbWVUcmF2ZWx9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaW1lVHJhdmVsT3B0aW9uczxUTWV0YSA9IHVua25vd24+IHtcbiAgLyoqIEhvdyBzdG9wcyBhcmUgZGVyaXZlZC4gRGVmYXVsdDogYGNvbW1pdFN0b3BzYC4gKi9cbiAgcmVhZG9ubHkgc3RyYXRlZ3k/OiBUaW1lVHJhdmVsU3RyYXRlZ3k8VE1ldGE+O1xuICAvKiogTWFya3MgdG8gc2VlZCB0aGUgY3Vyc29yIHdpdGgg4oCUIGUuZy4gcmVzdG9yZWQgZnJvbSBhIHNhdmVkIHNlc3Npb24uICovXG4gIHJlYWRvbmx5IG1hcmtzPzogcmVhZG9ubHkgTWFya1tdO1xufVxuIl19
@@ -1,47 +0,0 @@
1
- /**
2
- * footprintjs/write — the public way to write a record.
3
- *
4
- * A record is what a run wrote: a frozen base and an append-only log of bundles, one per step
5
- * (docs/guides/record-contract.md). This door hands out the classes the engine itself writes one
6
- * with — there is no wrapper, so a record written here and one a flowchart wrote come from the same
7
- * code and the same bytes:
8
- *
9
- * - `SharedMemory` — the heap: live state, one generation per commit (copy-on-write);
10
- * - `EventLog` — the log: the fold base and the bundles, frozen as they are recorded;
11
- * - `RecordFrame` — one step's frame: what it read (`read`, `noteRead`), what it staged
12
- * (`write`, with a redaction verdict's bytes as `WriteScrub`), and its
13
- * commit onto the heap and the log (`commit`, named by a `CommitStamp`).
14
- *
15
- * The step's encoding is two dials (`RecordEncoding`): `commitValues` (`'full'` | `'delta'`) and
16
- * `writeProvenance` (`'off'` | `'reads-prefix'`, `WriteProvenanceMode`).
17
- *
18
- * Every type this door names is the record's own: nothing here loads or names the engine
19
- * (test/architecture/write-door.test.ts). Its names and the bytes they write are promised under the
20
- * record fixtures' re-pin policy (test/fixtures/README.md): a refactor never moves a byte.
21
- *
22
- * @example
23
- * ```typescript
24
- * import { EventLog, RecordFrame, SharedMemory } from 'footprintjs/write';
25
- * import { stateAt } from 'footprintjs/trace';
26
- *
27
- * const state = new SharedMemory(undefined, { count: 0 }); // the heap, seeded
28
- * const log = new EventLog(state.getState()); // its fold base is the seed
29
- *
30
- * const frame = new RecordFrame(state, log); // one step, at the root
31
- * frame.useEncoding({ commitValues: 'full', writeProvenance: 'reads-prefix' });
32
- * const count = frame.read([], 'count') as number;
33
- * frame.noteRead([], 'count'); // the bundle names the read
34
- * frame.write(frame.at([], 'count'), count + 1, 'set');
35
- * frame.commit(() => ({ stage: 'Increment', stageId: 'increment', runtimeStageId: 'increment#0' }));
36
- *
37
- * stateAt({ initialState: log.getInitialState(), commitLog: log.list() }, 0).state; // { count: 1 }
38
- * ```
39
- *
40
- * @module write
41
- */
42
- export { EventLog } from './lib/memory/EventLog.js';
43
- export { SharedMemory } from './lib/memory/SharedMemory.js';
44
- export type { CommitStamp } from './lib/memory/recordCommit.js';
45
- export type { RecordEncoding, WriteScrub, WriteVerb } from './lib/memory/RecordFrame.js';
46
- export { RecordFrame } from './lib/memory/RecordFrame.js';
47
- export type { WriteProvenanceMode } from './lib/memory/types.js';