pi-background-tasks 2.5.0 → 2.6.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 (203) hide show
  1. package/BACKGROUND-TASKS-INSTRUCTIONS.md +1 -1
  2. package/README.md +70 -25
  3. package/TESTING.md +42 -2
  4. package/TEST_PLAN.md +7 -4
  5. package/dist/extensions/anthropic-attribution-child.js +4 -0
  6. package/dist/extensions/anthropic-attribution-child.js.map +1 -0
  7. package/dist/extensions/anthropic-attribution.js +107 -0
  8. package/dist/extensions/anthropic-attribution.js.map +1 -0
  9. package/dist/extensions/background-tasks.js +2 -0
  10. package/dist/extensions/background-tasks.js.map +1 -0
  11. package/dist/extensions/delegate-child.js +2 -0
  12. package/dist/extensions/delegate-child.js.map +1 -0
  13. package/dist/extensions/fusion-child.js +2 -0
  14. package/dist/extensions/fusion-child.js.map +1 -0
  15. package/dist/package.json +5 -0
  16. package/dist/src/core/anthropic-attribution-path.js +24 -0
  17. package/dist/src/core/anthropic-attribution-path.js.map +1 -0
  18. package/dist/src/core/anthropic-attribution.js +2247 -0
  19. package/dist/src/core/anthropic-attribution.js.map +1 -0
  20. package/dist/src/core/attested-pi-contract.js +5 -0
  21. package/dist/src/core/attested-pi-contract.js.map +1 -0
  22. package/dist/src/core/attested-pi-run.js +749 -0
  23. package/dist/src/core/attested-pi-run.js.map +1 -0
  24. package/dist/src/core/canonical-json.js +19 -0
  25. package/dist/src/core/canonical-json.js.map +1 -0
  26. package/dist/src/core/common.js +787 -0
  27. package/dist/src/core/common.js.map +1 -0
  28. package/dist/src/core/config.js +78 -0
  29. package/dist/src/core/config.js.map +1 -0
  30. package/dist/src/core/context/parent-snapshot.js +75 -0
  31. package/dist/src/core/context/parent-snapshot.js.map +1 -0
  32. package/dist/src/core/context/token-budget.js +631 -0
  33. package/dist/src/core/context/token-budget.js.map +1 -0
  34. package/dist/src/core/context/visible-conversation-v2.js +390 -0
  35. package/dist/src/core/context/visible-conversation-v2.js.map +1 -0
  36. package/dist/src/core/delegate/artifacts.js +357 -0
  37. package/dist/src/core/delegate/artifacts.js.map +1 -0
  38. package/dist/src/core/delegate/budget.js +266 -0
  39. package/dist/src/core/delegate/budget.js.map +1 -0
  40. package/dist/src/core/delegate/facade-contract.js +7 -0
  41. package/dist/src/core/delegate/facade-contract.js.map +1 -0
  42. package/dist/src/core/delegate/hook-contract-evidence.json +18 -0
  43. package/dist/src/core/delegate/hook-contract.js +124 -0
  44. package/dist/src/core/delegate/hook-contract.js.map +1 -0
  45. package/dist/src/core/delegate/launch.js +366 -0
  46. package/dist/src/core/delegate/launch.js.map +1 -0
  47. package/dist/src/core/delegate/result-package.js +293 -0
  48. package/dist/src/core/delegate/result-package.js.map +1 -0
  49. package/dist/src/core/delegate/runner.js +398 -0
  50. package/dist/src/core/delegate/runner.js.map +1 -0
  51. package/dist/src/core/delegate/seed.js +334 -0
  52. package/dist/src/core/delegate/seed.js.map +1 -0
  53. package/dist/src/core/delegate/types.js +103 -0
  54. package/dist/src/core/delegate/types.js.map +1 -0
  55. package/dist/src/core/durable-fs.js +372 -0
  56. package/dist/src/core/durable-fs.js.map +1 -0
  57. package/dist/src/core/extension-api.js +382 -0
  58. package/dist/src/core/extension-api.js.map +1 -0
  59. package/dist/src/core/fusion/artifacts.js +654 -0
  60. package/dist/src/core/fusion/artifacts.js.map +1 -0
  61. package/dist/src/core/fusion/budget.js +949 -0
  62. package/dist/src/core/fusion/budget.js.map +1 -0
  63. package/dist/src/core/fusion/child-protocol.js +176 -0
  64. package/dist/src/core/fusion/child-protocol.js.map +1 -0
  65. package/dist/src/core/fusion/claude-cache.js +156 -0
  66. package/dist/src/core/fusion/claude-cache.js.map +1 -0
  67. package/dist/src/core/fusion/clean-context.js +64 -0
  68. package/dist/src/core/fusion/clean-context.js.map +1 -0
  69. package/dist/src/core/fusion/config.js +349 -0
  70. package/dist/src/core/fusion/config.js.map +1 -0
  71. package/dist/src/core/fusion/context.js +184 -0
  72. package/dist/src/core/fusion/context.js.map +1 -0
  73. package/dist/src/core/fusion/evaluation.js +696 -0
  74. package/dist/src/core/fusion/evaluation.js.map +1 -0
  75. package/dist/src/core/fusion/facade-contract.js +3 -0
  76. package/dist/src/core/fusion/facade-contract.js.map +1 -0
  77. package/dist/src/core/fusion/orchestrator.js +867 -0
  78. package/dist/src/core/fusion/orchestrator.js.map +1 -0
  79. package/dist/src/core/fusion/output-contract.js +27 -0
  80. package/dist/src/core/fusion/output-contract.js.map +1 -0
  81. package/dist/src/core/fusion/pi-child.js +1741 -0
  82. package/dist/src/core/fusion/pi-child.js.map +1 -0
  83. package/dist/src/core/fusion/prompts.js +260 -0
  84. package/dist/src/core/fusion/prompts.js.map +1 -0
  85. package/dist/src/core/fusion/result-package.js +857 -0
  86. package/dist/src/core/fusion/result-package.js.map +1 -0
  87. package/dist/src/core/fusion/source-policy.js +259 -0
  88. package/dist/src/core/fusion/source-policy.js.map +1 -0
  89. package/dist/src/core/fusion/types.js +207 -0
  90. package/dist/src/core/fusion/types.js.map +1 -0
  91. package/dist/src/core/fusion/web-fetch.js +777 -0
  92. package/dist/src/core/fusion/web-fetch.js.map +1 -0
  93. package/dist/src/core/fusion/workflows.js +126 -0
  94. package/dist/src/core/fusion/workflows.js.map +1 -0
  95. package/dist/src/core/lazy-module.js +181 -0
  96. package/dist/src/core/lazy-module.js.map +1 -0
  97. package/dist/src/core/pi-launch.js +431 -0
  98. package/dist/src/core/pi-launch.js.map +1 -0
  99. package/dist/src/core/registry.js +3331 -0
  100. package/dist/src/core/registry.js.map +1 -0
  101. package/dist/src/core/reload-shell-owner.js +1396 -0
  102. package/dist/src/core/reload-shell-owner.js.map +1 -0
  103. package/dist/src/core/shell-policy.js +80 -0
  104. package/dist/src/core/shell-policy.js.map +1 -0
  105. package/dist/src/core/task-durable.js +51 -0
  106. package/dist/src/core/task-durable.js.map +1 -0
  107. package/dist/src/core/update-check.js +92 -0
  108. package/dist/src/core/update-check.js.map +1 -0
  109. package/dist/src/core/windows-taskkill.js +185 -0
  110. package/dist/src/core/windows-taskkill.js.map +1 -0
  111. package/dist/src/delegate-child-extension.js +776 -0
  112. package/dist/src/delegate-child-extension.js.map +1 -0
  113. package/dist/src/delegate-extension.js +746 -0
  114. package/dist/src/delegate-extension.js.map +1 -0
  115. package/dist/src/extension.js +953 -0
  116. package/dist/src/extension.js.map +1 -0
  117. package/dist/src/fusion-child-extension.js +760 -0
  118. package/dist/src/fusion-child-extension.js.map +1 -0
  119. package/dist/src/fusion-extension.js +1030 -0
  120. package/dist/src/fusion-extension.js.map +1 -0
  121. package/dist/src/ui/background-tasks-manager.js +689 -0
  122. package/dist/src/ui/background-tasks-manager.js.map +1 -0
  123. package/dist/src/ui/fusion-model-selector.js +277 -0
  124. package/dist/src/ui/fusion-model-selector.js.map +1 -0
  125. package/docs/INDEX.md +35 -33
  126. package/docs/api/eventbus-v1.md +21 -5
  127. package/docs/choose-a-workflow.md +2 -0
  128. package/docs/commands/bg-clear.md +3 -3
  129. package/docs/commands/bg-update.md +3 -3
  130. package/docs/commands/bg.md +18 -6
  131. package/docs/commands/claude-cache.md +4 -4
  132. package/docs/commands/fusion-models.md +49 -4
  133. package/docs/commands/fusion.md +3 -3
  134. package/docs/commands/jobs.md +3 -3
  135. package/docs/commands/kill.md +3 -3
  136. package/docs/commands/logs.md +3 -3
  137. package/docs/commands/task-manager.md +5 -5
  138. package/docs/concepts/completion-delivery.md +6 -2
  139. package/docs/getting-started.md +7 -1
  140. package/docs/manifest.json +228 -42
  141. package/docs/operations/configuration.md +58 -5
  142. package/docs/operations/releasing.md +4 -2
  143. package/docs/operations/testing.md +22 -0
  144. package/docs/operations/troubleshooting.md +6 -2
  145. package/docs/read-before-edit.md +44 -31
  146. package/docs/reference/runtime-contracts.md +87 -51
  147. package/docs/reference/shortcuts-and-dock.md +28 -14
  148. package/docs/subsystems/anthropic-attribution.md +23 -11
  149. package/docs/subsystems/attested-pi-runs.md +12 -7
  150. package/docs/subsystems/background-task-runtime.md +53 -11
  151. package/docs/subsystems/child-launch-durability-and-safety.md +28 -9
  152. package/docs/subsystems/delegation.md +16 -3
  153. package/docs/subsystems/docs-freshness-gate.md +14 -7
  154. package/docs/subsystems/fusion.md +36 -11
  155. package/docs/subsystems/host-ui-and-telemetry.md +22 -9
  156. package/docs/tools/bg_delegate.md +3 -1
  157. package/docs/tools/bg_kill.md +3 -1
  158. package/docs/tools/bg_logs.md +3 -1
  159. package/docs/tools/bg_result.md +5 -3
  160. package/docs/tools/bg_run.md +31 -5
  161. package/docs/tools/bg_run_pi_attested.md +3 -1
  162. package/docs/tools/bg_status.md +3 -1
  163. package/docs/tools/fusion_investigate.md +3 -1
  164. package/docs/tools/fusion_reason.md +3 -1
  165. package/docs/tools/fusion_research.md +3 -1
  166. package/docs/tools/fusion_validate.md +3 -1
  167. package/extensions/anthropic-attribution-child.ts +3 -0
  168. package/extensions/anthropic-attribution.ts +166 -1
  169. package/package.json +12 -10
  170. package/src/core/anthropic-attribution-path.ts +5 -4
  171. package/src/core/anthropic-attribution.ts +293 -113
  172. package/src/core/attested-pi-contract.ts +4 -0
  173. package/src/core/attested-pi-run.ts +468 -81
  174. package/src/core/canonical-json.ts +21 -0
  175. package/src/core/common.ts +450 -40
  176. package/src/core/config.ts +121 -0
  177. package/src/core/context/visible-conversation-v2.ts +3 -6
  178. package/src/core/delegate/artifacts.ts +13 -9
  179. package/src/core/delegate/budget.ts +13 -6
  180. package/src/core/delegate/facade-contract.ts +6 -0
  181. package/src/core/delegate/result-package.ts +32 -14
  182. package/src/core/delegate/runner.ts +129 -58
  183. package/src/core/delegate/seed.ts +5 -7
  184. package/src/core/durable-fs.ts +178 -30
  185. package/src/core/extension-api.ts +36 -8
  186. package/src/core/fusion/artifacts.ts +17 -16
  187. package/src/core/fusion/clean-context.ts +8 -5
  188. package/src/core/fusion/config.ts +2 -1
  189. package/src/core/fusion/context.ts +2 -6
  190. package/src/core/fusion/facade-contract.ts +2 -0
  191. package/src/core/fusion/orchestrator.ts +3 -3
  192. package/src/core/fusion/prompts.ts +1 -1
  193. package/src/core/fusion/result-package.ts +259 -72
  194. package/src/core/fusion/source-policy.ts +43 -17
  195. package/src/core/lazy-module.ts +215 -0
  196. package/src/core/pi-launch.ts +390 -65
  197. package/src/core/registry.ts +2010 -381
  198. package/src/core/reload-shell-owner.ts +1662 -0
  199. package/src/core/shell-policy.ts +134 -0
  200. package/src/core/task-durable.ts +67 -0
  201. package/src/delegate-extension.ts +404 -144
  202. package/src/extension.ts +387 -114
  203. package/src/fusion-extension.ts +202 -96
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reload-shell-owner.js","sourceRoot":"","sources":["../../../src/core/reload-shell-owner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,SAAS,EAAqB,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,EAaR,mBAAmB,GAKpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EACL,kBAAkB,GAInB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,CAAC,MAAM,2BAA2B,GAAG,2CAAoD,CAAC;AAChG,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;AACjF,MAAM,CAAC,MAAM,+BAA+B,GAAG,MAAM,CAAC;AAEtD,MAAM,sBAAsB,GAAG,GAAG,GAAG,IAAI,CAAC;AAE1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AA+BlD,MAAM,SAAS,GAAG,IAAI,OAAO,EAA2C,CAAC;AACzE,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,2BAA2B,aAAa,CAAC,CAAC;AAEnF,SAAS,UAAU,CAAC,IAA6B,EAAE,OAAe;IAChE,OAAO,IAAI,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,WAAW;IAClB,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,YAAY,CAAC,KAAa,EAAE,KAAa;IAChD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,UAAU,CAAC,gCAAgC,EAAE,GAAG,KAAK,uCAAuC,CAAC,CAAC;IACtG,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,KAAyB,EAAE,QAAgB;IAClE,MAAM,SAAS,GAAG,KAAK,IAAI,QAAQ,CAAC;IACpC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QAClD,MAAM,UAAU,CAAC,0CAA0C,EAAE,kCAAkC,CAAC,CAAC;IACnG,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,SAAiB,EACjB,WAAmB,EACnB,UAAkB,OAAO,CAAC,GAAG;IAE7B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,OAAO,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC;QAC9E,MAAM,UAAU,CACd,gCAAgC,EAChC,4DAA4D,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAClF,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5D,MAAM,UAAU,CAAC,gCAAgC,EAAE,2CAA2C,CAAC,CAAC;IAClG,CAAC;IACD,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5F,MAAM,UAAU,CACd,gCAAgC,EAChC,uEAAuE,CACxE,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAA+B;IACpE,IAAI,QAAQ,CAAC,OAAO,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC;QACrC,MAAM,UAAU,CAAC,gCAAgC,EAAE,kDAAkD,CAAC,CAAC;IACzG,CAAC;IACD,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;AACvH,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,2BAA2B;QAAE,OAAO,KAAK,CAAC;IACjF,IAAI,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACrE,KAAK,MAAM,MAAM,IAAI;QACnB,iBAAiB;QACjB,kBAAkB;QAClB,iBAAiB;QACjB,oBAAoB;QACpB,mBAAmB;QACnB,mBAAmB;QACnB,wBAAwB;QACxB,kBAAkB;QAClB,gBAAgB;KACjB,EAAE,CAAC;QACF,IAAI,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,UAAU;YAAE,OAAO,KAAK,CAAC;IACrE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,IAA2B,EAAE,KAA4B;IAC7E,OAAO,CACL,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO;QAC9B,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS;QAClC,IAAI,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW,CACvC,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAe;IACxC,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACpC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAChC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;IAChC,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,MAAM,IAAI,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACnG,OAAO,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,eAA6C,EAAE;IAE/C,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACzC,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,IAAI,WAAW,CAAC;IAC1D,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,IAAI,OAAO,CAAC;IAC9C,MAAM,gBAAgB,GAAG,eAAe,CACtC,YAAY,CAAC,gBAAgB,EAC7B,+BAA+B,CAChC,CAAC;IACF,MAAM,KAAK,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC3C,MAAM,4BAA4B,GAAG,IAAI,OAAO,EAG7C,CAAC;IACJ,MAAM,QAAQ,GAAG,SAAS,EAAE,CAAC;IAC7B,YAAY,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAEpC,MAAM,SAAS,GAAG,CAAC,OAAe,EAAS,EAAE;QAC3C,MAAM,UAAU,CAAC,gCAAgC,EAAE,OAAO,CAAC,CAAC;IAC9D,CAAC,CAAC;IAEF,MAAM,mBAAmB,GAAG,CAAC,KAAmC,EAAa,EAAE;QAC7E,IAAI,KAAK,CAAC,QAAQ,KAAK,2BAA2B,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAClF,OAAO,SAAS,CAAC,6DAA6D,CAAC,CAAC;QAClF,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC1C,IACE,IAAI,KAAK,SAAS;YAClB,IAAI,CAAC,KAAK,KAAK,OAAO;YACtB,IAAI,CAAC,KAAK,EAAE,UAAU,KAAK,KAAK,CAAC,UAAU;YAC3C,IAAI,CAAC,KAAK,CAAC,eAAe,KAAK,KAAK,CAAC,eAAe,EACpD,CAAC;YACD,OAAO,SAAS,CAAC,8CAA8C,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,KAAmC,EAAa,EAAE;QACtE,IAAI,KAAK,CAAC,QAAQ,KAAK,2BAA2B,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAClF,OAAO,SAAS,CAAC,6DAA6D,CAAC,CAAC;QAClF,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC1C,IACE,IAAI,KAAK,SAAS;YAClB,IAAI,CAAC,KAAK,KAAK,UAAU;YACzB,IAAI,CAAC,KAAK,KAAK,KAAK;YACpB,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU;YACpC,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU;YACpC,IAAI,CAAC,eAAe,KAAK,KAAK,CAAC,eAAe;YAC9C,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,EAC5C,CAAC;YACD,OAAO,SAAS,CAAC,gDAAgD,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,GAAG,EAAE,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YAC9D,OAAO,SAAS,CAAC,0CAA0C,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,CACf,IAAe,EACf,IAA4B,EAC5B,SAAqC,EAC/B,EAAE;QACR,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,SAAS;YAAE,OAAO;QACrE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACtD,eAAe,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACjC,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACpD,IAAI,IAAI,KAAK,SAAS;gBAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;;gBACjE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;;gBAChD,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CACV,mCAAmC,IAAI,uBAAuB,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,YAAY,CAAC,KAAK,CAAC,EAAE,CAC1G,CAAC;YACF,IAAI,IAAI,KAAK,SAAS;gBAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;;gBACjE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACtD,CAAC;IACH,CAAC,CAAC;IAEF,SAAS,eAAe,CAAC,IAAe,EAAE,SAAqC;QAC7E,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,SAAS;YAAE,OAAO;QACrE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC9C,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACjD,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAClD,SAAS,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACvC,SAAS,CAAC,gBAAgB,EAAE,CAAC;QAC7B,IACE,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC;YAC1B,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,IAAI,IAAI,CAAC,KAAK,KAAK,UAAU,CAAC,EACrF,CAAC;YACD,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACxB,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,MAAM,oBAAoB,GAAG,CAC3B,IAAe,EACf,SAAqC,EACtB,EAAE;QACjB,MAAM,QAAQ,GAAG,4BAA4B,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7D,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,QAAQ,CAAC;QAC5C,MAAM,YAAY,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAC1C,GAAG,EAAE;YACH,IACE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI;gBACpC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,SAAS,EACxD,CAAC;gBACD,OAAO;YACT,CAAC;YACD,IAAI,SAAS,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;gBACnC,MAAM,CAAC,KAAK,CACV,sDAAsD,SAAS,CAAC,IAAI,CAAC,EAAE,mEAAmE,CAC3I,CAAC;gBACF,OAAO;YACT,CAAC;YACD,IAAI,CAAC;gBACH,eAAe,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACnC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CACV,yEAAyE,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,YAAY,CAAC,KAAK,CAAC,EAAE,CACrH,CAAC;YACJ,CAAC;QACH,CAAC,EACD,CAAC,KAAc,EAAE,EAAE;YACjB,MAAM,CAAC,KAAK,CACV,oFAAoF,SAAS,CAAC,IAAI,CAAC,EAAE,6BAA6B,YAAY,CAAC,KAAK,CAAC,EAAE,CACxJ,CAAC;QACJ,CAAC,CACF,CAAC;QACF,4BAA4B,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAC1D,OAAO,YAAY,CAAC;IACtB,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,IAAe,EAAE,QAAgB,EAAQ,EAAE;QAChE,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI;YAAE,OAAO;QACjD,IACE,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,UAAU,CAAC;YACvD,IAAI,CAAC,SAAS,KAAK,QAAQ;YAC3B,GAAG,EAAE,GAAG,QAAQ,EAChB,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,OAAO,IAAI,CAAC,UAAU,CAAC;QACvB,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACxB,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QACjD,KAAK,OAAO,CAAC,UAAU,CACrB,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;YACjC,SAAS,CAAC,oBAAoB,EAAE,CAAC;YACjC,MAAM,eAAe,GAAG,oBAAoB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAC9D,IAAI,CAAC;gBACH,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS,IAAI,SAAS,CAAC,KAAK,KAAK,gBAAgB,EAAE,CAAC;oBAC1E,MAAM,SAAS,CAAC,WAAW,CACzB,iBAAiB,EACjB,6GAA6G,MAAM,CAAC,gBAAgB,CAAC,qBAAqB,CAC3J,CAAC;gBACJ,CAAC;qBAAM,IAAI,SAAS,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;oBAC1C,SAAS,CAAC,aAAa,CACrB,UAAU,CACR,8BAA8B,EAC9B,2DAA2D,CAC5D,CACF,CAAC;oBACF,MAAM,SAAS,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;gBACjD,CAAC;qBAAM,IAAI,SAAS,CAAC,KAAK,KAAK,YAAY,EAAE,CAAC;oBAC5C,MAAM,SAAS,CAAC,QAAQ,CAAC;gBAC3B,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CACV,6DAA6D,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,YAAY,CAAC,KAAK,CAAC,EAAE,CACzG,CAAC;YACJ,CAAC;YACD,MAAM,eAAe,CAAC;QACxB,CAAC,CAAC,CACH,CAAC,IAAI,CAAC,GAAG,EAAE;YACV,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACvE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACjC,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CACV,oDAAoD,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,oFAAoF,CAClK,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,CAAC,IAAe,EAAQ,EAAE;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;YAAE,OAAO;QACtE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,GAAG,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;YAClC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;YAC9B,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAChC,CAAC,EAAE,SAAS,CAAC,CAAC;QACd,2EAA2E;QAC3E,4DAA4D;IAC9D,CAAC,CAAC;IAEF,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QAC7C,QAAQ,EAAE,2BAA2B;QACrC,QAAQ;QACR,eAAe,CACb,QAA+B,EAC/B,WAAmB,EACnB,eAAuB;YAEvB,YAAY,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;YAClD,MAAM,WAAW,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;YACrD,IAAI,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAClC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,MAAM,UAAU,GAAG,SAAS,EAAE,CAAC;gBAC/B,YAAY,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;gBACxC,IAAI,GAAG;oBACL,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,EAAE,CAAC;oBACxC,WAAW;oBACX,UAAU,EAAE,CAAC;oBACb,YAAY,EAAE,CAAC;oBACf,KAAK,EAAE,UAAU;oBACjB,eAAe;oBACf,UAAU;oBACV,UAAU,EAAE,IAAI,GAAG,EAAE;oBACrB,aAAa,EAAE,IAAI,GAAG,EAAE;oBACxB,cAAc,EAAE,IAAI,GAAG,EAAE;iBAC1B,CAAC;gBACF,MAAM,KAAK,GAAiC,MAAM,CAAC,MAAM,CAAC;oBACxD,QAAQ,EAAE,2BAA2B;oBACrC,QAAQ;oBACR,UAAU;oBACV,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,WAAW;oBACX,UAAU,EAAE,CAAC;oBACb,eAAe;oBACf,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;iBAC9B,CAAC,CAAC;gBACH,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;gBACnB,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;gBAC7B,OAAO,KAAK,CAAC;YACf,CAAC;YAED,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;gBAC3C,MAAM,UAAU,CACd,wCAAwC,EACxC,8EAA8E,CAC/E,CAAC;YACJ,CAAC;YACD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;gBACzD,MAAM,UAAU,CACd,wCAAwC,EACxC,mDAAmD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,aAAa,IAAI,CAAC,KAAK,EAAE,CAC/G,CAAC;YACJ,CAAC;YACD,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC5D,OAAO,SAAS,CAAC,gDAAgD,CAAC,CAAC;YACrE,CAAC;YACD,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC;YACxB,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC;YACrB,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;YACvC,MAAM,UAAU,GAAG,SAAS,EAAE,CAAC;YAC/B,YAAY,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;YACxC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;YAC7B,MAAM,KAAK,GAAiC,MAAM,CAAC,MAAM,CAAC;gBACxD,QAAQ,EAAE,2BAA2B;gBACrC,QAAQ;gBACR,UAAU;gBACV,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,WAAW;gBACX,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,eAAe;gBACf,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,UAAU,EAAE,MAAM,CAAC,MAAM,CACvB,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAClF;aACF,CAAC,CAAC;YACH,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,gBAAgB,CACd,KAAmC,EACnC,OAAiC;YAEjC,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YACjC,IAAI,OAAO,CAAC,eAAe,KAAK,KAAK,CAAC,eAAe,EAAE,CAAC;gBACtD,OAAO,SAAS,CAAC,wDAAwD,CAAC,CAAC;YAC7E,CAAC;YACD,MAAM,KAAK,GAAiC,MAAM,CAAC,MAAM,CAAC;gBACxD,QAAQ,EAAE,2BAA2B;gBACrC,QAAQ;gBACR,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,eAAe,EAAE,IAAI,CAAC,eAAe;aACtC,CAAC,CAAC;YACH,IAAI,CAAC;gBACH,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;gBACpE,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;gBACvB,OAAO,IAAI,CAAC,UAAU,CAAC;gBACvB,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;oBAC/D,iBAAiB,CAAC,IAAI,CAAC,CAAC;oBACxB,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACjC,CAAC;qBAAM,CAAC;oBACN,kBAAkB,CAAC,IAAI,CAAC,CAAC;gBAC3B,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;YACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;YACvB,OAAO,IAAI,CAAC,UAAU,CAAC;YACvB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;YACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;YACvB,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACxB,OAAO,IAAI,CAAC,SAAS,CAAC;YAEtB,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;gBACzC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC/D,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;gBAC9C,IAAI,SAAS,CAAC,KAAK,KAAK,UAAU;oBAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YACrF,CAAC;YACD,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAC7C,IAAI,SAAS,KAAK,SAAS;oBAAE,SAAS;gBACtC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACjC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;YACvC,CAAC;YACD,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAC7C,IAAI,SAAS,KAAK,SAAS;oBAAE,SAAS;gBACtC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAClC,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;YACxC,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,eAAe,CAAC,KAAmC,EAAE,KAAc;YACjE,KAAK,KAAK,CAAC;YACX,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YACjC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;YACvB,OAAO,IAAI,CAAC,UAAU,CAAC;YACvB,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBACjC,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC;gBACzB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC;oBAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC/D,OAAO;YACT,CAAC;YACD,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;YACvB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBAC/B,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBACxB,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC/B,OAAO;YACT,CAAC;YACD,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QACD,kBAAkB,CAChB,KAAmC;YAEnC,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YACxC,yEAAyE;YACzE,0BAA0B;YAC1B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;YACvB,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC;YACvB,IAAI,CAAC,SAAS,GAAG,GAAG,EAAE,GAAG,gBAAgB,CAAC;YAC1C,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;YACvB,MAAM,WAAW,GAAiC,EAAE,CAAC;YACrD,KAAK,MAAM,SAAS,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;gBACtD,IAAI,SAAS,CAAC,kBAAkB,EAAE,CAAC;oBACjC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;oBAC9C,IAAI,SAAS,CAAC,KAAK,KAAK,UAAU;wBAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;oBACnF,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBAC5B,SAAS;gBACX,CAAC;gBACD,uEAAuE;gBACvE,wEAAwE;gBACxE,sEAAsE;gBACtE,KAAK,oBAAoB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAC7C,CAAC;YACD,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBAC/B,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBACxB,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC/B,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC3B,CAAC;YACD,kBAAkB,CAAC,IAAI,CAAC,CAAC;YACzB,OAAO,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACpC,CAAC;QACD,iBAAiB,CAAC,KAAmC;YACnD,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YACxC,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;YACvB,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC;YACzB,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACxB,KAAK,MAAM,SAAS,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;gBACtD,IAAI,SAAS,CAAC,KAAK,KAAK,UAAU;oBAAE,eAAe,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACvE,CAAC;YACD,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC;gBAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjE,CAAC;QACD,iBAAiB,CACf,KAAmC,EACnC,SAAqC;YAErC,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YACxC,IAAI,SAAS,CAAC,QAAQ,KAAK,2BAA2B,EAAE,CAAC;gBACvD,MAAM,UAAU,CACd,0CAA0C,EAC1C,iDAAiD,CAClD,CAAC;YACJ,CAAC;YACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC/C,MAAM,UAAU,CACd,wCAAwC,EACxC,6BAA6B,SAAS,CAAC,WAAW,wBAAwB,CAC3E,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YACtD,SAAS,CAAC,iBAAiB,CAAC;gBAC1B,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC;gBAC1D,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC;aAC/D,CAAC,CAAC;QACL,CAAC;QACD,sBAAsB,CACpB,KAAmC,EACnC,SAAqC;YAErC,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YACxC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC7D,OAAO,SAAS,CAAC,8DAA8D,CAAC,CAAC;YACnF,CAAC;YACD,SAAS,CAAC,sBAAsB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QACvE,CAAC;QACD,gBAAgB,CACd,YAAyE,EACzE,SAAqC;YAErC,IAAI,IAAe,CAAC;YACpB,IAAI,YAAY,IAAI,YAAY;gBAAE,IAAI,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;;gBAC/D,IAAI,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;YAC9C,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC7D,OAAO,SAAS,CAAC,0DAA0D,CAAC,CAAC;YAC/E,CAAC;YACD,IAAI,SAAS,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;gBACnC,eAAe,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBACjC,OAAO;YACT,CAAC;YACD,wEAAwE;YACxE,0EAA0E;YAC1E,qDAAqD;YACrD,KAAK,oBAAoB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC7C,CAAC;QACD,cAAc,CAAC,KAAmC;YAChD,IAAI,CAAC;gBACH,mBAAmB,CAAC,KAAK,CAAC,CAAC;gBAC3B,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;KACF,CAA0B,CAAC;IAE5B,MAAM,aAAa,GAAG,EAAE,KAAK,EAAE,CAAC;IAChC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IAClC,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,kBAAkB,EAAE;QAC7C,KAAK,EAAE,aAAa;QACpB,UAAU,EAAE,KAAK;QACjB,YAAY,EAAE,KAAK;QACnB,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,4BAA4B;IAC1C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,yBAAyB,CAAC,CAAC;IACnE,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,MAAM,UAAU,CACd,0CAA0C,EAC1C,iBAAiB,2BAA2B,iCAAiC,CAC9E,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,OAAO,GAAG,iCAAiC,EAAE,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,yBAAyB,EAAE,OAAO,CAAC,CAAC;IAC5D,OAAO,OAAO,CAAC;AACjB,CAAC;AAUD,0FAA0F;AAC1F,MAAM,UAAU,+BAA+B,CAC7C,GAA0B,EAC1B,QAA+B;IAE/B,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;IAC5D,MAAM,KAAK,GACT,UAAU;QACV,CAAC,OAAO,cAAc,KAAK,QAAQ,IAAI,cAAc,KAAK,IAAI;YAC5D,CAAC,CAAE,cAAmC;YACtC,CAAC,CAAC,SAAS,CAAC,CAAC;IACjB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO;YACL,KAAK,EAAE,SAAS;YAChB,UAAU,EAAE,SAAS;YACrB,SAAS,EAAE,SAAS;YACpB,UAAU,EAAE,KAAK;YACjB,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;SAC9B,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/D,OAAO;QACL,KAAK,EAAE,IAAI,EAAE,KAAK;QAClB,UAAU,EAAE,IAAI,EAAE,UAAU;QAC5B,SAAS,EAAE,IAAI,EAAE,SAAS;QAC1B,UAAU,EAAE,IAAI,EAAE,OAAO,KAAK,SAAS;QACvC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;KACnF,CAAC;AACJ,CAAC;AAuBD,SAAS,kBAAkB,CAAC,KAAc;IACxC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;QACtE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QACnB,CAAC,CAAC,CAAC,CAAC;AACR,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc;IAC3C,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,MAAM,KAAK,GAAwB,KAAK,CAAC;IACzC,MAAM,aAAa,GACjB,OAAO,KAAK,CAAC,aAAa,KAAK,QAAQ;QACvC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC;QACpC,KAAK,CAAC,aAAa,GAAG,CAAC;QACrB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC;QACjC,CAAC,CAAC,SAAS,CAAC;IAChB,IAAI,aAAa,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAClD,MAAM,MAAM,GACV,KAAK,CAAC,MAAM,KAAK,IAAI;QACnB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;YACtF,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;YAC1B,CAAC,CAAC,IAAI,CAAC;IACb,MAAM,OAAO,GACX,KAAK,CAAC,OAAO,KAAK,IAAI;QACpB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC;YACzF,CAAC,CAAC,KAAK,CAAC,OAAO;YACf,CAAC,CAAC,MAAM,KAAK,IAAI;gBACf,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,CAAC,MAAM,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC;IACzC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC;AAC5C,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,MAAM,KAAK,GAAsB,KAAK,CAAC;IACvC,MAAM,KAAK,GAAmB;QAC5B,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC;QACtC,MAAM,EAAE,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC;QACxC,SAAS,EAAE,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC;QAC9C,UAAU,EAAE,kBAAkB,CAAC,KAAK,CAAC,UAAU,CAAC;QAChD,WAAW,EAAE,kBAAkB,CAAC,KAAK,CAAC,WAAW,CAAC;KACnD,CAAC;IACF,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC;IACtF,CAAC;IACD,IACE,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QACnC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC;QAChC,KAAK,CAAC,SAAS,IAAI,CAAC,EACpB,CAAC;QACD,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IACpC,CAAC;IACD,OAAO,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACnD,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,MAAM,KAAK,GAAqB,KAAK,CAAC;IACtC,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YACzD,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC7C,IAAI,UAAU,GAAG,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;QAChD,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,EAC/B,MAAM,EACN,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAC7D,CAAC;IACF,OAAO,KAAK,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACzE,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,OAAO,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAW;IACvC,MAAM,MAAM,GAAG,CAAC,GAAW,EAA6B,EAAE;QACxD,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,WAAW,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnE,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,SAAS,CAAC;QACrC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QAC7B,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IACtD,CAAC,CAAC;IACF,OAAO,qBAAqB,CAAC;QAC3B,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC;QACxB,aAAa,EAAE,MAAM,CAAC,gBAAgB,CAAC,IAAI,MAAM,CAAC,eAAe,CAAC;QAClE,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC;KAC3B,CAAC,CAAC;AACL,CAAC;AAwDD,KAAK,UAAU,kBAAkB,CAC/B,IAAY,EACZ,KAAc,EACd,MAAoB;IAEpB,MAAM,kBAAkB,CACtB,IAAI,EACJ,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EACrC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CACvC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,MAAwD;IAExD,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO;IACtE,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC1B,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5B,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC7B,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QACF,MAAM,IAAI,GAAG,CAAC,KAAY,EAAE,EAAE;YAC5B,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5B,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC7B,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3B,MAAM,CAAC,GAAG,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,QAA4B,EAAE,IAAY;IAC7D,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACjE,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,KAAK,IAAI,EAAE,CAAC;AACrE,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAwB;IACnD,OAAO;QACL,QAAQ,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;QAClC,UAAU,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QAClC,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;QAC3E,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;QAC3E,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE;QACtD,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE;KACvD;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gCAAgC,CAC9C,OAAwC;IAExC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IACtD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACpC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC;IACzC,MAAM,KAAK,GACT,OAAO,CAAC,KAAK;QACb,CAAC,CAAC,OAAe,EAAE,IAAc,EAAE,YAA0B,EAAE,EAAE,CAC/D,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtE,MAAM,QAAQ,GACZ,OAAO,CAAC,QAAQ;QAChB,CAAC,CAAC,GAAW,EAAE,KAAuB,EAAE,MAAoB,EAAE,EAAE;YAC9D,MAAM,eAAe,GACnB,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;YACnD,OAAO,kBAAkB,CAAC,GAAG,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IAEL,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7F,IAAI,KAA2B,CAAC;IAChC,IAAI,CAAC;QACH,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;YACpE,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,QAAQ,EAAE,QAAQ,KAAK,OAAO;YAC9B,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,GAAG;YACH,WAAW,EAAE,IAAI;YACjB,wBAAwB,EAAE,OAAO,CAAC,UAAU,CAAC,wBAAwB;SACtE,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,YAAY,CAAC,OAAO,EAAE,CAAC;QACvB,MAAM,KAAK,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC;IAC3B,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QAC/E,YAAY,CAAC,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,8EAA8E;QAChF,CAAC;QACD,MAAM,UAAU,CACd,gCAAgC,EAChC,+DAA+D,CAChE,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACnB,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC;IACpB,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC;IAC3B,IAAI,QAAQ,KAAK,OAAO;QAAE,IAAI,CAAC,wBAAwB,GAAG,QAAQ,CAAC;IAEnE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IACjC,MAAM,iBAAiB,GACrB,IAAI,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IACzF,MAAM,KAAK,GAA6B;QACtC,aAAa,EAAE,qCAAqC;QACpD,SAAS,EAAE,yBAAyB;QACpC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO;QACjC,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,SAAS;QACrC,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,WAAW;QACzC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,YAAY,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI;QAC5B,SAAS;QACT,QAAQ;QACR,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,eAAe,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU;QACzC,YAAY,EAAE,CAAC;KAChB,CAAC;IACF,IAAI,iBAAiB,KAAK,SAAS;QAAE,KAAK,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IACjF,IAAI,QAAQ,KAAK,OAAO;QAAE,KAAK,CAAC,kBAAkB,GAAG,QAAQ,CAAC;;QACzD,KAAK,CAAC,mBAAmB,GAAG,QAAQ,CAAC;IAC1C,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;IAE5B,IAAI,IAA6C,CAAC;IAClD,IAAI,eAAe,GAA2B,GAAG,EAAE,GAAE,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;QAC/C,eAAe,GAAG,OAAO,CAAC;IAC5B,CAAC,CAAC,CAAC;IACH,IAAI,sBAAsB,GAAe,GAAG,EAAE,GAAE,CAAC,CAAC;IAClD,IAAI,qBAAqB,GAA6B,GAAG,EAAE,GAAE,CAAC,CAAC;IAC/D,IAAI,sBAAsB,GAAG,KAAK,CAAC;IACnC,MAAM,eAAe,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC5D,sBAAsB,GAAG,OAAO,CAAC;QACjC,qBAAqB,GAAG,MAAM,CAAC;IACjC,CAAC,CAAC,CAAC;IACH,KAAK,eAAe,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC5C,IAAI,YAAuC,CAAC;IAC5C,IAAI,SAAqC,CAAC;IAC1C,IAAI,WAAyC,CAAC;IAC9C,IAAI,QAAyC,CAAC;IAC9C,IAAI,iBAAqC,CAAC;IAE1C,MAAM,aAAa,GAAG,KAAK,EAAE,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAoB,EAAiB,EAAE;QAC1F,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE;YACvB,MAAM,kBAAkB,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAChE,CAAC,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAC9D,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACtD,MAAM,IAAI,CAAC;IACb,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,GAAS,EAAE;QACzB,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,MAAc,EAAQ,EAAE;QAC3C,MAAM,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC;QACtC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC5E,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;QACpD,IAAI,SAAS,IAAI,SAAS,CAAC,cAAc,EAAE,CAAC;YAC1C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACrB,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5E,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAClB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;YAC5C,IAAI,CAAC,YAAY,IAAI,SAAS,CAAC;QACjC,CAAC;QACD,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAC7B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,0BAA0B,UAAU,CAAC,SAAS,CAAC,cAAc,CAAC,oBAAoB,CAAC;QAChG,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,+BAA+B,IAAI,CAAC,KAAK,KAAK,EAAE,MAAM,CAAC,CAAC;QACnF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrB,IAAI,CAAC,YAAY,IAAI,MAAM,CAAC,MAAM,CAAC;QACnC,OAAO,EAAE,CAAC;QACV,KAAK,SAAS,CAAC,WAAW,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YAC5E,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,gBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,CAAC,IAAY,EAAQ,EAAE;QAC7C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC9B,MAAM,aAAa,GAAG,GAAG,IAAI,CAAC,kBAAkB,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;QAChE,IAAI,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC;QAChC,IAAI,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;QAC7B,IAAI,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC;QAC3B,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC;gBAAE,SAAS;YACjD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrD,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;oBACtC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;wBAAE,SAAS;oBACpC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,+BAA+B,EAAE,CAAC;wBACvD,OAAO,GAAG,qBAAqB,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC;oBACrD,CAAC;yBAAM,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,2BAA2B,EAAE,CAAC;wBAC1D,OAAO,GAAG,qBAAqB,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,OAAO,CAAC;wBACnE,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,MAAM,CAAC;wBAC7D,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,KAAK,CAAC;wBACzD,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC;oBACnD,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,sDAAsD;gBACxD,CAAC;YACH,CAAC;QACH,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,QAAQ,CACxC,6EAA6E,CAC9E,EAAE,CAAC;YACF,OAAO,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC;QACtD,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/F,IAAI,QAAQ,GAAG,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;QACvF,MAAM,KAAK,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,gCAAgC,CAAC,CAAC;QACjE,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,kCAAkC,CAAC,CAAC;QACpE,IAAI,IAAI,GAAG,KAAK;YAAE,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,sBAAsB,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC;YAC5B,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACrG,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,OAAO,EAAE,CAAC;YACV,KAAK,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;gBAC5C,MAAM,CAAC,KAAK,CAAC,6DAA6D,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YAC/F,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,KAAqB,EAAE,OAAe,EAAQ,EAAE;QACnE,IAAI,KAAK,CAAC,OAAO;YAAE,OAAO;QAC1B,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QACrB,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;QACxB,IAAI,KAAK,CAAC,iBAAiB,KAAK,SAAS;YAAE,YAAY,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACjF,IAAI,IAAI,CAAC,mBAAmB,KAAK,SAAS;YAAE,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACnF,OAAO,IAAI,CAAC,mBAAmB,CAAC;QAChC,IAAI,CAAC,wCAAwC,GAAG,IAAI,CAAC;QACrD,IAAI,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,wBAAwB,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;YAC7E,OAAO,IAAI,CAAC,wBAAwB,CAAC;QACvC,CAAC;QACD,KAAK,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,CAAC,KAAqB,EAAW,EAAE;QACxD,IAAI,KAAK,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC;QACtD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC/C,KAAK,CAAC,cAAc,GAAG,OAAO;gBAC5B,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,IAAI,KAAK,CAAC,2BAA2B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;YACjF,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,OAAO,EAAE,CAAC;gBAC1F,WAAW,CAAC,KAAK,CAAC,CAAC;gBACnB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,KAAK,CAAC,cAAc,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACjF,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,CAAC,KAAqB,EAAE,KAAY,EAAQ,EAAE;QACvE,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACpD,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,yCAAyC,KAAK,CAAC,OAAO,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QAC9F,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,KAAqB,EAAQ,EAAE;QAClD,IAAI,KAAK,CAAC,OAAO;YAAE,OAAO;QAC1B,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC;QAC3C,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YACnB,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,8BAA8B,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxG,kBAAkB,CAChB,KAAK,EACL,IAAI,KAAK,CACP,uBAAuB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,kCAAkC,MAAM,yCAAyC,CAC9H,CACF,CAAC;YACF,OAAO;QACT,CAAC;QACD,KAAK,CAAC,iBAAiB,GAAG,UAAU,CAAC,GAAG,EAAE;YACxC,KAAK,CAAC,iBAAiB,GAAG,SAAS,CAAC;YACpC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;gBAAE,WAAW,CAAC,KAAK,CAAC,CAAC;QACjD,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;IAC9B,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,KAAqB,EAAQ,EAAE;QACjD,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,cAAc;YAAE,OAAO;QAClD,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;QAC5B,IAAI,IAAI,CAAC,mBAAmB,KAAK,SAAS;YAAE,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACnF,OAAO,IAAI,CAAC,mBAAmB,CAAC;QAChC,IAAI,cAAc,CAAC,KAAK,CAAC;YAAE,OAAO;QAClC,IAAI,CAAC;YACH,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;gBAC5C,kBAAkB,CAChB,KAAK,EACL,IAAI,KAAK,CACP,uDAAuD,IAAI,CAAC,EAAE,UAAU,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,yCAAyC,CACvI,CACF,CAAC;gBACF,OAAO;YACT,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,OAAO,EAAE,CAAC;gBAC1F,WAAW,CAAC,KAAK,CAAC,CAAC;gBACnB,OAAO;YACT,CAAC;YACD,kBAAkB,CAChB,KAAK,EACL,IAAI,KAAK,CACP,+CAA+C,IAAI,CAAC,EAAE,UAAU,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,YAAY,CAAC,KAAK,CAAC,yCAAyC,CACvJ,CACF,CAAC;YACF,OAAO;QACT,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;YAAE,WAAW,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,GAAmB,EAAE;QAC1C,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC9C,IAAI,IAAI,CAAC,wCAAwC,KAAK,IAAI,EAAE,CAAC;YAC3D,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,EAAE,wDAAwD,CAAC,CAAC;QAC3F,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,wBAAwB,CAAC;QAC9C,IAAI,OAAO,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,EAAE,mCAAmC,CAAC,CAAC;QAC/F,IAAI,OAAO,GAAe,GAAG,EAAE,GAAE,CAAC,CAAC;QACnC,MAAM,UAAU,GAAG,IAAI,OAAO,CAAO,CAAC,cAAc,EAAE,EAAE;YACtD,OAAO,GAAG,cAAc,CAAC;QAC3B,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9E,MAAM,KAAK,GAAmB;YAC5B,OAAO;YACP,UAAU,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC;YAC7D,UAAU;YACV,OAAO;YACP,cAAc,EAAE,KAAK;YACrB,OAAO,EAAE,KAAK;SACf,CAAC;QACF,SAAS,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,mBAAmB,GAAG,UAAU,CAAC,GAAG,EAAE;YACzC,OAAO,IAAI,CAAC,mBAAmB,CAAC;YAChC,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7E,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,GAAS,EAAE;QAClC,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,cAAc;YAAE,OAAO;QAChC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,IAAI,IAAI,GAAG,KAAK,CAAC;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAC9C,IAAI,CAAC,IAAI;gBAAE,QAAQ,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,OAAO,EAAE,CAAC;gBAC1F,WAAW,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,IAAI,CAAC,iCAAiC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QACD,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACH,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;gBACjD,IAAI,CAAC,IAAI;oBAAE,QAAQ,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YAC3D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,QAAQ,CAAC,IAAI,CAAC,yBAAyB,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QACD,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YAC5B,UAAU,CAAC,KAAK,CAAC,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,KAAuB,EAAE,OAAe,EAAQ,EAAE;QACvE,IAAI,KAAK,CAAC,OAAO;YAAE,OAAO;QAC1B,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QACrB,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;QACxB,IAAI,IAAI,CAAC,mBAAmB,KAAK,SAAS;YAAE,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACnF,OAAO,IAAI,CAAC,mBAAmB,CAAC;QAChC,KAAK,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,CACvB,KAAuB,EACvB,KAAuB,EACvB,OAAwB,EACL,EAAE;QACrB,IAAI,OAAO,CAAC,QAAQ,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,KAAK,GAAG;YAAE,OAAO,SAAS,CAAC;QACzE,IAAI,KAAK,KAAK,WAAW;YAAE,OAAO,SAAS,CAAC;QAC5C,OAAO,IAAI,KAAK,CACd,4DAA4D,IAAI,CAAC,EAAE,QAAQ,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,mBAAmB,CAAC,OAAO,CAAC,yCAAyC,CACvK,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,KAAuB,EAAiB,EAAE;QAC9D,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC,YAAY,CAAC;QAChE,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;QAC5B,KAAK,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,mBAAmB,KAAK,SAAS;YAAE,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACnF,OAAO,IAAI,CAAC,mBAAmB,CAAC;QAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;QAC5E,KAAK,CAAC,YAAY,GAAG,QAAQ,CAAC,IAAI,CAChC,CAAC,OAAO,EAAE,EAAE;YACV,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAC1D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;gBACtD,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBAC9B,MAAM,OAAO,CAAC;YAChB,CAAC;YACD,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC,EACD,CAAC,KAAc,EAAE,EAAE;YACjB,MAAM,OAAO,GAAG,IAAI,KAAK,CACvB,4DAA4D,IAAI,CAAC,EAAE,QAAQ,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,YAAY,CAAC,KAAK,CAAC,yCAAyC,CAC9J,CAAC;YACF,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YACtD,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC9B,MAAM,OAAO,CAAC;QAChB,CAAC,CACF,CAAC;QACF,KAAK,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YAC/C,MAAM,CAAC,KAAK,CAAC,6DAA6D,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/F,CAAC,CAAC,CAAC;QACH,OAAO,KAAK,CAAC,YAAY,CAAC;IAC5B,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,GAAqB,EAAE;QAC9C,IAAI,WAAW,KAAK,SAAS;YAAE,OAAO,WAAW,CAAC;QAClD,IAAI,OAAO,GAAe,GAAG,EAAE,GAAE,CAAC,CAAC;QACnC,MAAM,UAAU,GAAG,IAAI,OAAO,CAAO,CAAC,cAAc,EAAE,EAAE;YACtD,OAAO,GAAG,cAAc,CAAC;QAC3B,CAAC,CAAC,CAAC;QACH,MAAM,KAAK,GAAqB;YAC9B,GAAG,EAAE,QAAQ;YACb,UAAU;YACV,OAAO;YACP,cAAc,EAAE,KAAK;YACrB,OAAO,EAAE,KAAK;SACf,CAAC;QACF,WAAW,GAAG,KAAK,CAAC;QACpB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,KAAK,CAAC,cAAc,GAAG,UAAU,CAAC;QAClC,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE;aAClC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;aAC9D,IAAI,CACH,CAAC,OAAO,EAAE,EAAE;YACV,IAAI,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,OAAO;gBAAE,OAAO;YAClD,IAAI,OAAO,CAAC,QAAQ,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,KAAK,GAAG;gBAAE,aAAa,CAAC,KAAK,CAAC,CAAC;YAC7E,4DAA4D;QAC9D,CAAC,EACD,GAAG,EAAE;YACH,sDAAsD;QACxD,CAAC,CACF,CAAC;QACJ,IAAI,CAAC,mBAAmB,GAAG,UAAU,CAAC,GAAG,EAAE;YACzC,OAAO,IAAI,CAAC,mBAAmB,CAAC;YAChC,KAAK,YAAY,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,GAAS,EAAE;QACpC,gBAAgB,EAAE,CAAC;QACnB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC7B,CAAC,CAAC;IAEF,MAAM,uBAAuB,GAAG,KAAK,IAAgC,EAAE;QACrE,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,IAAI,WAAW,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YAChD,MAAM,WAAW,CAAC,UAAU,CAAC;YAC7B,OAAO,WAAW,CAAC,OAAO,CAAC;QAC7B,CAAC;QACD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,wCAAwC,GAAG,IAAI,CAAC;YACrD,OAAO,IAAI,CAAC,wBAAwB,CAAC;YACrC,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,cAAc,CAAC,SAAS,CAAC,CAAC;QAC1B,MAAM,SAAS,CAAC,UAAU,CAAC;QAC3B,OAAO,SAAS,CAAC,OAAO,CAAC;IAC3B,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,CACrB,IAAmB,EACnB,MAA6B,EACuB,EAAE;QACtD,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,UAAU;YAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAChF,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,mBAAmB,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC;QACtG,CAAC;QACD,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;YAC9B,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,0BAA0B,UAAU,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;QACrH,CAAC;QACD,IAAI,QAAQ,KAAK,iBAAiB,EAAE,CAAC;YACnC,OAAO;gBACL,MAAM,EAAE,QAAQ;gBAChB,KAAK,EACH,IAAI,CAAC,KAAK;oBACV,kGAAkG;aACrG,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;QACtD,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,oBAAoB,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;SAClG,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,CAAC,IAAmB,EAAE,MAA6B,EAAQ,EAAE;QAC5E,IAAI,YAAY,KAAK,SAAS;YAAE,OAAO;QACvC,SAAS,CAAC,gBAAgB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,CAAC;QACjE,SAAS,CAAC,KAAK,GAAG,YAAY,CAAC;QAC/B,YAAY,GAAG,CAAC,KAAK,IAAI,EAAE;YACzB,IAAI,MAAM,GAAG,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC1C,IAAI,CAAC;gBACH,MAAM,eAAe,CAAC;YACxB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,GAAG;oBACP,MAAM,EAAE,QAAQ;oBAChB,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,kCAAkC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;iBAC1F,CAAC;YACJ,CAAC;YACD,MAAM,WAAW,GAAG,MAAM,uBAAuB,EAAE,CAAC;YACpD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC9B,MAAM,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YACvF,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,sBAAsB,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YACvD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,GAAG;oBACP,MAAM,EAAE,QAAQ;oBAChB,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,mCAAmC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;iBAC3F,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACrB,IAAI,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC;YACrB,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;gBAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YAC1D,IAAI,CAAC;gBACH,MAAM,aAAa,CAAC,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;gBAClE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAC9B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;gBACvB,IAAI,CAAC,KAAK,GAAG,mCAAmC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtE,MAAM,CAAC,KAAK,CAAC,4DAA4D,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC5F,MAAM,aAAa,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC/C,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS;gBAAE,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACvE,OAAO,IAAI,CAAC,aAAa,CAAC;YAC1B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;gBAAE,MAAM,EAAE,CAAC;YACtD,SAAS,CAAC,KAAK,GAAG,UAAU,CAAC;YAC7B,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,OAAO,EAAE,CAAC;YACV,IAAI,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;QAC9B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YAC5B,MAAM,CAAC,KAAK,CAAC,2DAA2D,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7F,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,IAAI,cAAc,GAAoC,GAAG,EAAE,GAAE,CAAC,CAAC;IAC/D,IAAI,cAAc,GAAoC,GAAG,EAAE,GAAE,CAAC,CAAC;IAC/D,IAAI,kBAAkB,GAA2B,GAAG,EAAE,GAAE,CAAC,CAAC;IAC1D,IAAI,kBAAkB,GAGV,GAAG,EAAE,GAAE,CAAC,CAAC;IACrB,IAAI,mBAAmB,GAA2B,GAAG,EAAE,GAAE,CAAC,CAAC;IAE3D,MAAM,SAAS,GAA+B;QAC5C,QAAQ,EAAE,2BAA2B;QACrC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,YAAY,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI;QAC5B,IAAI;QACJ,KAAK;QACL,YAAY;QACZ,SAAS;QACT,iBAAiB;QACjB,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,QAAQ;QACR,KAAK,EAAE,UAAU;QACjB,kBAAkB,EAAE,KAAK;QACzB,iBAAiB,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;QACnE,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM;YAC5B,IAAI,SAAS,CAAC,KAAK,KAAK,UAAU;gBAAE,OAAO,IAAI,CAAC;YAChD,IAAI,SAAS,CAAC,KAAK,KAAK,UAAU;gBAAE,OAAO,IAAI,CAAC;YAChD,MAAM,SAAS,GAAG,QAAQ,KAAK,SAAS,CAAC;YACzC,IAAI,SAAS,EAAE,CAAC;gBACd,QAAQ,GAAG,IAAI,CAAC;gBAChB,IAAI,CAAC,QAAQ,GAAG,IAAI,KAAK,iBAAiB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC/D,IAAI,MAAM,KAAK,SAAS;oBAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;YAChD,CAAC;YACD,IAAI,SAAS,IAAI,IAAI,KAAK,iBAAiB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,8BAA8B,CAAC,EAAE,CAAC;gBACvG,IAAI,CAAC,KAAK,GAAG,iCAAiC,IAAI,CAAC,KAAK,IAAI,wBAAwB,EAAE,CAAC;YACzF,CAAC;YACD,IAAI,SAAS,CAAC,KAAK,KAAK,YAAY;gBAAE,OAAO,QAAQ,CAAC;YACtD,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS,IAAI,SAAS,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;gBACpE,SAAS,CAAC,KAAK,GAAG,gBAAgB,CAAC;YACrC,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC9B,IAAI,QAAQ,KAAK,OAAO;oBAAE,kBAAkB,EAAE,CAAC;;oBAC1C,gBAAgB,EAAE,CAAC;YAC1B,CAAC;YACD,IAAI,OAAmC,CAAC;YACxC,IAAI,CAAC;gBACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;oBACxB,QAAQ;oBACR,IAAI,OAAO,CAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;wBACtC,OAAO,GAAG,UAAU,CAClB,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,EAAE,wBAAwB,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC,EACjH,OAAO,CAAC,UAAU,CACnB,CAAC;oBACJ,CAAC,CAAC;iBACH,CAAC,CAAC;YACL,CAAC;oBAAS,CAAC;gBACT,IAAI,OAAO,KAAK,SAAS;oBAAE,YAAY,CAAC,OAAO,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QACD,KAAK,CAAC,qBAAqB,CAAC,MAAM;YAChC,IAAI,CAAC;gBACH,MAAM,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;gBAC5C,IAAI,CAAC,sBAAsB,EAAE,CAAC;oBAC5B,sBAAsB,GAAG,IAAI,CAAC;oBAC9B,sBAAsB,EAAE,CAAC;gBAC3B,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,sBAAsB,EAAE,CAAC;oBAC5B,sBAAsB,GAAG,IAAI,CAAC;oBAC9B,qBAAqB,CAAC,KAAK,CAAC,CAAC;gBAC/B,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QACD,aAAa,CAAC,KAAK;YACjB,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBAC5B,sBAAsB,GAAG,IAAI,CAAC;gBAC9B,qBAAqB,CAAC,KAAK,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QACD,iBAAiB,CAAC,IAAI;YACpB,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;QACD,sBAAsB,CAAC,UAAU,EAAE,YAAY;YAC7C,SAAS,CAAC,kBAAkB,GAAG,IAAI,CAAC;YACpC,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC;YAC/E,KAAK,CAAC,eAAe,GAAG,UAAU,CAAC;YACnC,KAAK,CAAC,YAAY,GAAG,YAAY,CAAC;QACpC,CAAC;QACD,gBAAgB,CAAC,UAAU,EAAE,YAAY;YACvC,KAAK,CAAC,eAAe,GAAG,UAAU,CAAC;YACnC,KAAK,CAAC,YAAY,GAAG,YAAY,CAAC;QACpC,CAAC;QACD,oBAAoB;YAClB,IAAI,IAAI,CAAC,wBAAwB,KAAK,SAAS,EAAE,CAAC;gBAChD,IAAI,CAAC,wBAAwB,GAAG,WAAW,CAAC;gBAC5C,IAAI,CAAC,gCAAgC,GAAG,wBAAwB,CAAC;gBACjE,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;YACjC,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC9B,IAAI,CAAC,KAAK,GAAG,WAAW,CACtB,IAAI,CAAC,KAAK,EACV,sFAAsF,CACvF,CAAC;YACJ,CAAC;YACD,KAAK,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;gBAC5C,MAAM,CAAC,KAAK,CAAC,2DAA2D,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YAC7F,CAAC,CAAC,CAAC;QACL,CAAC;QACD,iBAAiB,CAAC,KAAK;YACrB,IAAI,SAAS,CAAC,iBAAiB,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YAChE,MAAM,KAAK,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,eAAe,IAAI,WAAW,EAAE,EAAE,CAAC;YACtF,iBAAiB,GAAG,KAAK,CAAC;YAC1B,SAAS,CAAC,iBAAiB,GAAG,SAAS,CAAC;YACxC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,kBAAkB,CAAC,KAAK,EAAE,SAAS;YACjC,IAAI,iBAAiB,KAAK,KAAK,IAAI,SAAS,CAAC,iBAAiB,KAAK,SAAS;gBAAE,OAAO;YACrF,iBAAiB,GAAG,SAAS,CAAC;YAC9B,IAAI,SAAS,EAAE,CAAC;gBACd,SAAS,CAAC,iBAAiB,GAAG,WAAW,CAAC;gBAC1C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,iBAAiB,GAAG,SAAS,CAAC;gBACxC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACxB,CAAC;QACH,CAAC;QACD,gBAAgB;YACd,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS;gBAAE,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACvE,IAAI,IAAI,CAAC,mBAAmB,KAAK,SAAS;gBAAE,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACnF,IAAI,SAAS,EAAE,iBAAiB,KAAK,SAAS;gBAAE,YAAY,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;YAC1F,WAAW,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;YACrC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;YACvD,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;YACvD,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;YACpD,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;YACpD,SAAS,CAAC,YAAY,EAAE,GAAG,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;YAC1D,IAAI,GAAG,SAAS,CAAC;YACjB,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC;YAC5B,SAAS,CAAC,YAAY,GAAG,SAAS,CAAC;YACnC,OAAO,IAAI,CAAC,KAAK,CAAC;YAClB,OAAO,IAAI,CAAC,MAAM,CAAC;YACnB,OAAO,IAAI,CAAC,aAAa,CAAC;YAC1B,OAAO,IAAI,CAAC,mBAAmB,CAAC;YAChC,OAAO,IAAI,CAAC,eAAe,CAAC;YAC5B,SAAS,CAAC,KAAK,GAAG,UAAU,CAAC;QAC/B,CAAC;KACF,CAAC;IAEF,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;IAEjC,mBAAmB,GAAG,CAAC,KAAK,EAAE,EAAE;QAC9B,IAAI,CAAC,KAAK,GAAG,6BAA6B,KAAK,CAAC,OAAO,EAAE,CAAC;QAC1D,OAAO,EAAE,CAAC;QACV,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,KAAK,SAAS,CAAC,WAAW,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,SAAkB,EAAE,EAAE;gBAChF,MAAM,CAAC,KAAK,CAAC,iEAAiE,IAAI,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;YACvG,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;IACF,cAAc,GAAG,CAAC,IAAI,EAAE,EAAE;QACxB,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACxE,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACzC,WAAW,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC,CAAC;IACF,cAAc,GAAG,CAAC,IAAI,EAAE,EAAE;QACxB,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACxE,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACzC,WAAW,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC,CAAC;IACF,kBAAkB,GAAG,CAAC,KAAK,EAAE,EAAE;QAC7B,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,gCAAgC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACtF,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,KAAK,CAAC,OAAO,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QACxF,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IACF,kBAAkB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;QACpC,IAAI,SAAS,CAAC,gBAAgB,KAAK,SAAS;YAAE,OAAO;QACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzB,CAAC,CAAC;IACF,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;IAC9C,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACzC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACzC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;IACtC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;IAEtC,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;QACpC,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;YACnC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,SAAS,CAAC,KAAK,KAAK,UAAU,IAAI,SAAS,CAAC,KAAK,KAAK,UAAU;gBAAE,OAAO;YAC1G,MAAM,OAAO,GAAG,mBAAmB,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;YAClE,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,OAAO,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;YAC9E,KAAK,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;gBACtE,MAAM,CAAC,KAAK,CAAC,uDAAuD,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YACzF,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC","sourcesContent":["import { spawn as nodeSpawn, type SpawnOptions } from 'node:child_process';\nimport { randomBytes } from 'node:crypto';\nimport { createWriteStream } from 'node:fs';\nimport { isAbsolute } from 'node:path';\nimport { formatSize } from '@earendil-works/pi-coding-agent';\nimport {\n isJsonObject,\n parseJsonText,\n snapshot,\n type BgTask,\n type ReloadShellActivationClaimV1,\n type ReloadShellActivationLeaseV1,\n type ReloadShellHostAdapterV1,\n type ReloadShellIdentityV1,\n type ReloadShellOwnerEventSinkV1,\n type ReloadShellOwnerHubV1,\n type ReloadShellProcessV1,\n type ReloadShellStopKind,\n type ReloadSurvivalSnapshotV1,\n type ReloadableShellExecutionV1,\n type ReloadSurvivalErrorCode,\n ReloadSurvivalError,\n type TaskContextUsage,\n type TaskStatus,\n type TaskTokenUsage,\n type TaskToolUsage,\n} from './common.js';\nimport { replaceFileDurable } from './durable-fs.js';\nimport {\n runWindowsTaskkill,\n type TaskkillOutcome,\n type WindowsKillPhase,\n type WindowsTaskkillOptions,\n} from './windows-taskkill.js';\n\nexport const RELOAD_SHELL_OWNER_PROTOCOL = 'pi-background-tasks.reload-shell-owner.v1' as const;\nexport const RELOAD_SHELL_OWNER_SYMBOL = Symbol.for(RELOAD_SHELL_OWNER_PROTOCOL);\nexport const RELOAD_SHELL_HANDOFF_TIMEOUT_MS = 30_000;\n\nconst TELEMETRY_BUFFER_CHARS = 512 * 1024;\n\nexport { ReloadSurvivalError } from './common.js';\n\ninterface OwnerSlot {\n readonly identity: ReloadShellIdentityV1;\n readonly identityKey: string;\n generation: number;\n handoffCount: number;\n phase: 'claiming' | 'bound' | 'handoff' | 'releasing' | 'orphaned';\n activationNonce: string;\n claimNonce?: string | undefined;\n claim?: ReloadShellActivationClaimV1 | undefined;\n lease?: ReloadShellActivationLeaseV1 | undefined;\n adapter?: ReloadShellHostAdapterV1 | undefined;\n expiresAt?: number | undefined;\n handoffTimer?: NodeJS.Timeout | undefined;\n executions: Map<string, ReloadableShellExecutionV1>;\n queuedChanged: Set<string>;\n queuedTerminal: Set<string>;\n}\n\nexport interface ReloadShellOwnerDependencies {\n readonly handoffTimeoutMs?: number | undefined;\n readonly now?: (() => number) | undefined;\n readonly randomNonce?: (() => string) | undefined;\n readonly logger?: Pick<Console, 'error'> | undefined;\n}\n\ninterface InternalHubState {\n readonly slots: Map<string, OwnerSlot>;\n}\n\nconst hubStates = new WeakMap<ReloadShellOwnerHubV1, InternalHubState>();\nconst OWNER_STATE_SYMBOL = Symbol.for(`${RELOAD_SHELL_OWNER_PROTOCOL}.test-state`);\n\nfunction ownerError(code: ReloadSurvivalErrorCode, message: string): ReloadSurvivalError {\n return new ReloadSurvivalError(code, message);\n}\n\nfunction randomNonce(): string {\n return randomBytes(16).toString('hex');\n}\n\nfunction requireNonce(value: string, label: string): void {\n if (!/^[0-9a-f]{32}$/u.test(value)) {\n throw ownerError('pi_bg_reload_owner_stale_claim', `${label} is not a 128-bit lowercase hex nonce`);\n }\n}\n\nfunction positiveTimeout(value: number | undefined, fallback: number): number {\n const candidate = value ?? fallback;\n if (!Number.isFinite(candidate) || candidate <= 0) {\n throw ownerError('pi_bg_reload_owner_protocol_incompatible', 'handoff timeout must be positive');\n }\n return Math.max(1, Math.floor(candidate));\n}\n\nfunction lengthPart(value: string): string {\n return `${String(Buffer.byteLength(value, 'utf8'))}:${value}`;\n}\n\nexport function makeReloadShellIdentity(\n sessionId: string,\n cwdRealpath: string,\n hostPid: number = process.pid,\n): ReloadShellIdentityV1 {\n if (!Number.isSafeInteger(hostPid) || hostPid <= 0 || hostPid !== process.pid) {\n throw ownerError(\n 'pi_bg_reload_owner_stale_claim',\n `reload owner host pid must equal the current process pid ${String(process.pid)}`,\n );\n }\n if (typeof sessionId !== 'string' || sessionId.length === 0) {\n throw ownerError('pi_bg_reload_owner_stale_claim', 'reload owner session id must be non-empty');\n }\n if (typeof cwdRealpath !== 'string' || cwdRealpath.length === 0 || !isAbsolute(cwdRealpath)) {\n throw ownerError(\n 'pi_bg_reload_owner_stale_claim',\n 'reload owner cwd identity must be a non-empty absolute canonical path',\n );\n }\n return Object.freeze({ hostPid, sessionId, cwdRealpath });\n}\n\nexport function reloadShellIdentityKey(identity: ReloadShellIdentityV1): string {\n if (identity.hostPid !== process.pid) {\n throw ownerError('pi_bg_reload_owner_stale_claim', 'reload owner identity belongs to another process');\n }\n return `${lengthPart(String(identity.hostPid))}${lengthPart(identity.sessionId)}${lengthPart(identity.cwdRealpath)}`;\n}\n\nfunction structuralHub(value: unknown): value is ReloadShellOwnerHubV1 {\n if (typeof value !== 'object' || value === null) return false;\n if (Reflect.get(value, 'protocol') !== RELOAD_SHELL_OWNER_PROTOCOL) return false;\n if (typeof Reflect.get(value, 'hubNonce') !== 'string') return false;\n for (const method of [\n 'beginActivation',\n 'commitActivation',\n 'abortActivation',\n 'beginReloadHandoff',\n 'releaseActivation',\n 'registerExecution',\n 'markAdmissionCommitted',\n 'releaseExecution',\n 'isCurrentLease',\n ]) {\n if (typeof Reflect.get(value, method) !== 'function') return false;\n }\n return true;\n}\n\nfunction sameIdentity(left: ReloadShellIdentityV1, right: ReloadShellIdentityV1): boolean {\n return (\n left.hostPid === right.hostPid &&\n left.sessionId === right.sessionId &&\n left.cwdRealpath === right.cwdRealpath\n );\n}\n\nfunction clearHandoffTimer(slot: OwnerSlot): void {\n if (slot.handoffTimer !== undefined) {\n clearTimeout(slot.handoffTimer);\n slot.handoffTimer = undefined;\n }\n}\n\nfunction boundedError(error: unknown): string {\n const text = (error instanceof Error ? error.message : String(error)).replace(/\\s+/gu, ' ').trim();\n return text.length <= 500 ? text : `${text.slice(0, 499)}…`;\n}\n\nexport function createReloadShellOwnerHubForTests(\n dependencies: ReloadShellOwnerDependencies = {},\n): ReloadShellOwnerHubV1 {\n const now = dependencies.now ?? Date.now;\n const nextNonce = dependencies.randomNonce ?? randomNonce;\n const logger = dependencies.logger ?? console;\n const handoffTimeoutMs = positiveTimeout(\n dependencies.handoffTimeoutMs,\n RELOAD_SHELL_HANDOFF_TIMEOUT_MS,\n );\n const slots = new Map<string, OwnerSlot>();\n const terminalReleaseContinuations = new WeakMap<\n ReloadableShellExecutionV1,\n Promise<void>\n >();\n const hubNonce = nextNonce();\n requireNonce(hubNonce, 'hub nonce');\n\n const failStale = (message: string): never => {\n throw ownerError('pi_bg_reload_owner_stale_claim', message);\n };\n\n const currentSlotForLease = (lease: ReloadShellActivationLeaseV1): OwnerSlot => {\n if (lease.protocol !== RELOAD_SHELL_OWNER_PROTOCOL || lease.hubNonce !== hubNonce) {\n return failStale('activation lease belongs to another owner protocol instance');\n }\n const slot = slots.get(lease.identityKey);\n if (\n slot === undefined ||\n slot.phase !== 'bound' ||\n slot.lease?.generation !== lease.generation ||\n slot.lease.activationNonce !== lease.activationNonce\n ) {\n return failStale('activation lease is stale or no longer bound');\n }\n return slot;\n };\n\n const slotForClaim = (claim: ReloadShellActivationClaimV1): OwnerSlot => {\n if (claim.protocol !== RELOAD_SHELL_OWNER_PROTOCOL || claim.hubNonce !== hubNonce) {\n return failStale('activation claim belongs to another owner protocol instance');\n }\n const slot = slots.get(claim.identityKey);\n if (\n slot === undefined ||\n slot.phase !== 'claiming' ||\n slot.claim !== claim ||\n slot.claimNonce !== claim.claimNonce ||\n slot.generation !== claim.generation ||\n slot.activationNonce !== claim.activationNonce ||\n !sameIdentity(slot.identity, claim.identity)\n ) {\n return failStale('activation claim is stale or no longer current');\n }\n if (claim.expiresAt !== undefined && now() >= claim.expiresAt) {\n return failStale('activation claim expired before mutation');\n }\n return slot;\n };\n\n const dispatch = (\n slot: OwnerSlot,\n kind: 'changed' | 'terminal',\n execution: ReloadableShellExecutionV1,\n ): void => {\n if (slot.executions.get(execution.launchNonce) !== execution) return;\n const adapter = slot.adapter;\n if (slot.phase === 'releasing' && kind === 'terminal') {\n removeExecution(slot, execution);\n return;\n }\n if (slot.phase !== 'bound' || adapter === undefined) {\n if (kind === 'changed') slot.queuedChanged.add(execution.launchNonce);\n else slot.queuedTerminal.add(execution.launchNonce);\n return;\n }\n try {\n if (kind === 'changed') adapter.onChanged(execution);\n else adapter.onTerminal(execution);\n } catch (error) {\n logger.error(\n `[background-tasks] reload owner ${kind} adapter failed for ${execution.task.id}: ${boundedError(error)}`,\n );\n if (kind === 'changed') slot.queuedChanged.add(execution.launchNonce);\n else slot.queuedTerminal.add(execution.launchNonce);\n }\n };\n\n function removeExecution(slot: OwnerSlot, execution: ReloadableShellExecutionV1): void {\n if (slot.executions.get(execution.launchNonce) !== execution) return;\n slot.executions.delete(execution.launchNonce);\n slot.queuedChanged.delete(execution.launchNonce);\n slot.queuedTerminal.delete(execution.launchNonce);\n execution.setOwnerEventSink(undefined);\n execution.releaseResources();\n if (\n slot.executions.size === 0 &&\n (slot.phase === 'handoff' || slot.phase === 'releasing' || slot.phase === 'orphaned')\n ) {\n clearHandoffTimer(slot);\n slots.delete(slot.identityKey);\n }\n }\n\n const releaseAfterTerminal = (\n slot: OwnerSlot,\n execution: ReloadableShellExecutionV1,\n ): Promise<void> => {\n const existing = terminalReleaseContinuations.get(execution);\n if (existing !== undefined) return existing;\n const continuation = execution.terminal.then(\n () => {\n if (\n slots.get(slot.identityKey) !== slot ||\n slot.executions.get(execution.launchNonce) !== execution\n ) {\n return;\n }\n if (execution.phase !== 'terminal') {\n logger.error(\n `[background-tasks] retained reload shell execution ${execution.task.id} settled without terminal ownership proof; keeping its owner slot`,\n );\n return;\n }\n try {\n removeExecution(slot, execution);\n } catch (error) {\n logger.error(\n `[background-tasks] retained reload shell execution cleanup failed for ${execution.task.id}: ${boundedError(error)}`,\n );\n }\n },\n (error: unknown) => {\n logger.error(\n `[background-tasks] retained reload shell execution terminal promise rejected for ${execution.task.id}; keeping its owner slot: ${boundedError(error)}`,\n );\n },\n );\n terminalReleaseContinuations.set(execution, continuation);\n return continuation;\n };\n\n const expireHandoff = (slot: OwnerSlot, deadline: number): void => {\n if (slots.get(slot.identityKey) !== slot) return;\n if (\n (slot.phase !== 'handoff' && slot.phase !== 'claiming') ||\n slot.expiresAt !== deadline ||\n now() < deadline\n ) {\n return;\n }\n slot.phase = 'orphaned';\n slot.adapter = undefined;\n slot.claim = undefined;\n delete slot.claimNonce;\n clearHandoffTimer(slot);\n const executions = [...slot.executions.values()];\n void Promise.allSettled(\n executions.map(async (execution) => {\n execution.abandonReloadHandoff();\n const terminalRelease = releaseAfterTerminal(slot, execution);\n try {\n if (execution.phase === 'running' || execution.phase === 'stop_requested') {\n await execution.requestStop(\n 'handoff_expired',\n `pi_bg_reload_handoff_expired: no compatible reload activation claimed the live shell execution before the ${String(handoffTimeoutMs)}ms handoff deadline`,\n );\n } else if (execution.phase === 'starting') {\n execution.failAdmission(\n ownerError(\n 'pi_bg_reload_handoff_expired',\n 'uncommitted reload shell execution reached handoff expiry',\n ),\n );\n await execution.requestStop('handoff_expired');\n } else if (execution.phase === 'finalizing') {\n await execution.terminal;\n }\n } catch (error) {\n logger.error(\n `[background-tasks] reload handoff expiry could not settle ${execution.task.id}: ${boundedError(error)}`,\n );\n }\n await terminalRelease;\n }),\n ).then(() => {\n if (slots.get(slot.identityKey) === slot && slot.executions.size === 0) {\n slots.delete(slot.identityKey);\n }\n });\n logger.error(\n `[background-tasks] pi_bg_reload_handoff_expired: ${String(executions.length)} live reload shell execution(s) were not claimed before the fixed handoff deadline`,\n );\n };\n\n const armHandoffDeadline = (slot: OwnerSlot): void => {\n const deadline = slot.expiresAt;\n if (deadline === undefined || slot.handoffTimer !== undefined) return;\n const remaining = Math.max(0, deadline - now());\n slot.handoffTimer = setTimeout(() => {\n slot.handoffTimer = undefined;\n expireHandoff(slot, deadline);\n }, remaining);\n // Deliberately referenced. The retained child/tree authority must keep the\n // process alive until a claimant or orphan cleanup owns it.\n };\n\n const hub = Object.assign(Object.create(null), {\n protocol: RELOAD_SHELL_OWNER_PROTOCOL,\n hubNonce,\n beginActivation(\n identity: ReloadShellIdentityV1,\n startReason: string,\n activationNonce: string,\n ): ReloadShellActivationClaimV1 {\n requireNonce(activationNonce, 'activation nonce');\n const identityKey = reloadShellIdentityKey(identity);\n let slot = slots.get(identityKey);\n if (slot === undefined) {\n const claimNonce = nextNonce();\n requireNonce(claimNonce, 'claim nonce');\n slot = {\n identity: Object.freeze({ ...identity }),\n identityKey,\n generation: 1,\n handoffCount: 0,\n phase: 'claiming',\n activationNonce,\n claimNonce,\n executions: new Map(),\n queuedChanged: new Set(),\n queuedTerminal: new Set(),\n };\n const claim: ReloadShellActivationClaimV1 = Object.freeze({\n protocol: RELOAD_SHELL_OWNER_PROTOCOL,\n hubNonce,\n claimNonce,\n identity: slot.identity,\n identityKey,\n generation: 1,\n activationNonce,\n executions: Object.freeze([]),\n });\n slot.claim = claim;\n slots.set(identityKey, slot);\n return claim;\n }\n\n if (!sameIdentity(slot.identity, identity)) {\n throw ownerError(\n 'pi_bg_reload_owner_activation_conflict',\n 'another activation owns a non-identical reload shell identity under this key',\n );\n }\n if (slot.phase !== 'handoff' || startReason !== 'reload') {\n throw ownerError(\n 'pi_bg_reload_owner_activation_conflict',\n `another package activation already owns session ${JSON.stringify(identity.sessionId)} in state ${slot.phase}`,\n );\n }\n if (slot.expiresAt === undefined || now() >= slot.expiresAt) {\n return failStale('reload handoff expired before activation claim');\n }\n slot.phase = 'claiming';\n slot.generation += 1;\n slot.activationNonce = activationNonce;\n const claimNonce = nextNonce();\n requireNonce(claimNonce, 'claim nonce');\n slot.claimNonce = claimNonce;\n const claim: ReloadShellActivationClaimV1 = Object.freeze({\n protocol: RELOAD_SHELL_OWNER_PROTOCOL,\n hubNonce,\n claimNonce,\n identity: slot.identity,\n identityKey,\n generation: slot.generation,\n activationNonce,\n expiresAt: slot.expiresAt,\n executions: Object.freeze(\n [...slot.executions.values()].filter((execution) => execution.admissionCommitted),\n ),\n });\n slot.claim = claim;\n return claim;\n },\n commitActivation(\n claim: ReloadShellActivationClaimV1,\n adapter: ReloadShellHostAdapterV1,\n ): ReloadShellActivationLeaseV1 {\n const slot = slotForClaim(claim);\n if (adapter.activationNonce !== claim.activationNonce) {\n return failStale('host adapter activation nonce does not match its claim');\n }\n const lease: ReloadShellActivationLeaseV1 = Object.freeze({\n protocol: RELOAD_SHELL_OWNER_PROTOCOL,\n hubNonce,\n identityKey: slot.identityKey,\n generation: slot.generation,\n activationNonce: slot.activationNonce,\n });\n try {\n adapter.onBound(lease);\n } catch (error) {\n slot.phase = slot.expiresAt === undefined ? 'releasing' : 'handoff';\n slot.claim = undefined;\n delete slot.claimNonce;\n if (slot.expiresAt === undefined || slot.executions.size === 0) {\n clearHandoffTimer(slot);\n slots.delete(slot.identityKey);\n } else {\n armHandoffDeadline(slot);\n }\n throw error;\n }\n slot.lease = lease;\n slot.claim = undefined;\n delete slot.claimNonce;\n slot.phase = 'bound';\n slot.adapter = adapter;\n clearHandoffTimer(slot);\n delete slot.expiresAt;\n\n for (const execution of claim.executions) {\n execution.updateLeaseAudit(slot.generation, slot.handoffCount);\n slot.queuedChanged.add(execution.launchNonce);\n if (execution.phase === 'terminal') slot.queuedTerminal.add(execution.launchNonce);\n }\n for (const nonce of [...slot.queuedChanged]) {\n const execution = slot.executions.get(nonce);\n if (execution === undefined) continue;\n slot.queuedChanged.delete(nonce);\n dispatch(slot, 'changed', execution);\n }\n for (const nonce of [...slot.queuedTerminal]) {\n const execution = slot.executions.get(nonce);\n if (execution === undefined) continue;\n slot.queuedTerminal.delete(nonce);\n dispatch(slot, 'terminal', execution);\n }\n return lease;\n },\n abortActivation(claim: ReloadShellActivationClaimV1, error: unknown): void {\n void error;\n const slot = slotForClaim(claim);\n slot.claim = undefined;\n delete slot.claimNonce;\n if (slot.expiresAt === undefined) {\n slot.phase = 'releasing';\n if (slot.executions.size === 0) slots.delete(slot.identityKey);\n return;\n }\n slot.phase = 'handoff';\n if (slot.executions.size === 0) {\n clearHandoffTimer(slot);\n slots.delete(slot.identityKey);\n return;\n }\n armHandoffDeadline(slot);\n },\n beginReloadHandoff(\n lease: ReloadShellActivationLeaseV1,\n ): readonly ReloadableShellExecutionV1[] {\n const slot = currentSlotForLease(lease);\n // Detach first: no child/timer callback after this line can reach an old\n // registry or Pi closure.\n slot.adapter = undefined;\n slot.phase = 'handoff';\n slot.handoffCount += 1;\n slot.expiresAt = now() + handoffTimeoutMs;\n slot.lease = undefined;\n const transferred: ReloadableShellExecutionV1[] = [];\n for (const execution of [...slot.executions.values()]) {\n if (execution.admissionCommitted) {\n slot.queuedChanged.add(execution.launchNonce);\n if (execution.phase === 'terminal') slot.queuedTerminal.add(execution.launchNonce);\n transferred.push(execution);\n continue;\n }\n // Admission closure remains old-registry owned and uncommitted work is\n // never claimable. Keep its process authority in the hub until terminal\n // settlement, without requiring either the old or fresh host adapter.\n void releaseAfterTerminal(slot, execution);\n }\n if (slot.executions.size === 0) {\n clearHandoffTimer(slot);\n slots.delete(slot.identityKey);\n return Object.freeze([]);\n }\n armHandoffDeadline(slot);\n return Object.freeze(transferred);\n },\n releaseActivation(lease: ReloadShellActivationLeaseV1): void {\n const slot = currentSlotForLease(lease);\n slot.adapter = undefined;\n slot.lease = undefined;\n slot.phase = 'releasing';\n clearHandoffTimer(slot);\n for (const execution of [...slot.executions.values()]) {\n if (execution.phase === 'terminal') removeExecution(slot, execution);\n }\n if (slot.executions.size === 0) slots.delete(slot.identityKey);\n },\n registerExecution(\n lease: ReloadShellActivationLeaseV1,\n execution: ReloadableShellExecutionV1,\n ): void {\n const slot = currentSlotForLease(lease);\n if (execution.protocol !== RELOAD_SHELL_OWNER_PROTOCOL) {\n throw ownerError(\n 'pi_bg_reload_owner_protocol_incompatible',\n 'reload shell execution protocol is incompatible',\n );\n }\n if (slot.executions.has(execution.launchNonce)) {\n throw ownerError(\n 'pi_bg_reload_owner_activation_conflict',\n `reload shell launch nonce ${execution.launchNonce} is already registered`,\n );\n }\n slot.executions.set(execution.launchNonce, execution);\n execution.setOwnerEventSink({\n onChanged: (changed) => dispatch(slot, 'changed', changed),\n onTerminal: (terminal) => dispatch(slot, 'terminal', terminal),\n });\n },\n markAdmissionCommitted(\n lease: ReloadShellActivationLeaseV1,\n execution: ReloadableShellExecutionV1,\n ): void {\n const slot = currentSlotForLease(lease);\n if (slot.executions.get(execution.launchNonce) !== execution) {\n return failStale('cannot commit an execution not registered to this activation');\n }\n execution.markAdmissionCommitted(slot.generation, slot.handoffCount);\n },\n releaseExecution(\n leaseOrClaim: ReloadShellActivationLeaseV1 | ReloadShellActivationClaimV1,\n execution: ReloadableShellExecutionV1,\n ): void {\n let slot: OwnerSlot;\n if ('claimNonce' in leaseOrClaim) slot = slotForClaim(leaseOrClaim);\n else slot = currentSlotForLease(leaseOrClaim);\n if (slot.executions.get(execution.launchNonce) !== execution) {\n return failStale('cannot release an execution not owned by this activation');\n }\n if (execution.phase === 'terminal') {\n removeExecution(slot, execution);\n return;\n }\n // A bounded stop wait is not terminal proof. Retain the child, streams,\n // listeners, tree state, and timers under this slot until the execution's\n // one terminal continuation can release them safely.\n void releaseAfterTerminal(slot, execution);\n },\n isCurrentLease(lease: ReloadShellActivationLeaseV1): boolean {\n try {\n currentSlotForLease(lease);\n return true;\n } catch {\n return false;\n }\n },\n }) as ReloadShellOwnerHubV1;\n\n const internalState = { slots };\n hubStates.set(hub, internalState);\n Object.defineProperty(hub, OWNER_STATE_SYMBOL, {\n value: internalState,\n enumerable: false,\n configurable: false,\n writable: false,\n });\n return hub;\n}\n\nexport function getProcessReloadShellOwnerV1(): ReloadShellOwnerHubV1 {\n const current = Reflect.get(globalThis, RELOAD_SHELL_OWNER_SYMBOL);\n if (current !== undefined) {\n if (!structuralHub(current)) {\n throw ownerError(\n 'pi_bg_reload_owner_protocol_incompatible',\n `global symbol ${RELOAD_SHELL_OWNER_PROTOCOL} contains an incompatible value`,\n );\n }\n return current;\n }\n const created = createReloadShellOwnerHubForTests();\n Reflect.set(globalThis, RELOAD_SHELL_OWNER_SYMBOL, created);\n return created;\n}\n\nexport interface ReloadShellOwnerInspection {\n readonly phase: string | undefined;\n readonly generation: number | undefined;\n readonly expiresAt: number | undefined;\n readonly hasAdapter: boolean;\n readonly executions: readonly ReloadableShellExecutionV1[];\n}\n\n/** Direct-source-only deterministic inspection seam; not exported by a package facade. */\nexport function inspectReloadShellOwnerForTests(\n hub: ReloadShellOwnerHubV1,\n identity: ReloadShellIdentityV1,\n): ReloadShellOwnerInspection {\n const localState = hubStates.get(hub);\n const reflectedState = Reflect.get(hub, OWNER_STATE_SYMBOL);\n const state =\n localState ??\n (typeof reflectedState === 'object' && reflectedState !== null\n ? (reflectedState as InternalHubState)\n : undefined);\n if (state === undefined) {\n return {\n phase: undefined,\n generation: undefined,\n expiresAt: undefined,\n hasAdapter: false,\n executions: Object.freeze([]),\n };\n }\n const slot = state.slots.get(reloadShellIdentityKey(identity));\n return {\n phase: slot?.phase,\n generation: slot?.generation,\n expiresAt: slot?.expiresAt,\n hasAdapter: slot?.adapter !== undefined,\n executions: Object.freeze(slot === undefined ? [] : [...slot.executions.values()]),\n };\n}\n\ninterface ContextUsagePayload {\n readonly contextWindow?: unknown;\n readonly tokens?: unknown;\n readonly percent?: unknown;\n}\n\ninterface TokenUsagePayload {\n readonly input?: unknown;\n readonly output?: unknown;\n readonly cacheRead?: unknown;\n readonly cacheWrite?: unknown;\n readonly totalTokens?: unknown;\n readonly costTotal?: unknown;\n}\n\ninterface ToolUsagePayload {\n readonly byName?: unknown;\n readonly failed?: unknown;\n readonly total?: unknown;\n}\n\nfunction nonNegativeInteger(value: unknown): number {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0\n ? Math.floor(value)\n : 0;\n}\n\nfunction normalizeContextUsage(value: unknown): TaskContextUsage | undefined {\n if (!isJsonObject(value)) return undefined;\n const input: ContextUsagePayload = value;\n const contextWindow =\n typeof input.contextWindow === 'number' &&\n Number.isFinite(input.contextWindow) &&\n input.contextWindow > 0\n ? Math.floor(input.contextWindow)\n : undefined;\n if (contextWindow === undefined) return undefined;\n const tokens =\n input.tokens === null\n ? null\n : typeof input.tokens === 'number' && Number.isFinite(input.tokens) && input.tokens >= 0\n ? Math.floor(input.tokens)\n : null;\n const percent =\n input.percent === null\n ? null\n : typeof input.percent === 'number' && Number.isFinite(input.percent) && input.percent >= 0\n ? input.percent\n : tokens === null\n ? null\n : (tokens / contextWindow) * 100;\n return { tokens, contextWindow, percent };\n}\n\nfunction normalizeTokenUsage(value: unknown): TaskTokenUsage | undefined {\n if (!isJsonObject(value)) return undefined;\n const input: TokenUsagePayload = value;\n const usage: TaskTokenUsage = {\n input: nonNegativeInteger(input.input),\n output: nonNegativeInteger(input.output),\n cacheRead: nonNegativeInteger(input.cacheRead),\n cacheWrite: nonNegativeInteger(input.cacheWrite),\n totalTokens: nonNegativeInteger(input.totalTokens),\n };\n if (usage.totalTokens <= 0) {\n usage.totalTokens = usage.input + usage.output + usage.cacheRead + usage.cacheWrite;\n }\n if (\n typeof input.costTotal === 'number' &&\n Number.isFinite(input.costTotal) &&\n input.costTotal >= 0\n ) {\n usage.costTotal = input.costTotal;\n }\n return usage.totalTokens > 0 ? usage : undefined;\n}\n\nfunction normalizeToolUsage(value: unknown): TaskToolUsage | undefined {\n if (!isJsonObject(value)) return undefined;\n const input: ToolUsagePayload = value;\n const byName: Record<string, number> = {};\n if (isJsonObject(input.byName)) {\n for (const [name, count] of Object.entries(input.byName)) {\n const normalized = nonNegativeInteger(count);\n if (normalized > 0) byName[name] = normalized;\n }\n }\n const failed = nonNegativeInteger(input.failed);\n const total = Math.max(\n nonNegativeInteger(input.total),\n failed,\n Object.values(byName).reduce((sum, count) => sum + count, 0),\n );\n return total > 0 || failed > 0 ? { total, failed, byName } : undefined;\n}\n\nfunction normalizeModel(value: unknown): string | undefined {\n if (typeof value !== 'string') return undefined;\n const trimmed = value.trim();\n if (trimmed.length === 0) return undefined;\n return trimmed.length <= 120 ? trimmed : trimmed.slice(0, 120);\n}\n\nfunction parseContextUsageXml(xml: string): TaskContextUsage | undefined {\n const number = (tag: string): number | null | undefined => {\n const match = new RegExp(`<${tag}>(.*?)</${tag}>`, 'iu').exec(xml);\n if (match === null) return undefined;\n const raw = match[1]?.trim();\n if (raw === 'null' || raw === '?') return null;\n const parsed = Number(raw);\n return Number.isFinite(parsed) ? parsed : undefined;\n };\n return normalizeContextUsage({\n tokens: number('tokens'),\n contextWindow: number('context-window') ?? number('contextWindow'),\n percent: number('percent'),\n });\n}\n\ninterface PosixTreeState {\n readonly groupId: number;\n readonly deadlineAt: number;\n readonly completion: Promise<void>;\n readonly resolve: () => void;\n forceAttempted: boolean;\n settled: boolean;\n failure?: Error | undefined;\n lastProbeError?: Error | undefined;\n verificationTimer?: NodeJS.Timeout | undefined;\n}\n\ninterface WindowsTreeState {\n readonly pid: number;\n readonly completion: Promise<void>;\n readonly resolve: () => void;\n softController?: AbortController | undefined;\n softPromise?: Promise<void> | undefined;\n forcePromise?: Promise<void> | undefined;\n forceAttempted: boolean;\n settled: boolean;\n failure?: Error | undefined;\n}\n\nexport interface ReloadableShellExecutionOptions {\n readonly task: BgTask;\n readonly identity: ReloadShellIdentityV1;\n readonly lease: ReloadShellActivationLeaseV1;\n readonly launchNonce: string;\n readonly invocation: {\n readonly shell: string;\n readonly args: readonly string[];\n readonly windowsVerbatimArguments: boolean;\n };\n readonly spawn?: (\n command: string,\n args: string[],\n options: SpawnOptions,\n ) => ReloadShellProcessV1;\n readonly killProcess?: (pid: number, signal?: NodeJS.Signals | number) => boolean;\n readonly killTree?: (\n pid: number,\n phase: WindowsKillPhase,\n signal?: AbortSignal,\n ) => Promise<TaskkillOutcome>;\n readonly platform?: NodeJS.Platform;\n readonly env?: NodeJS.ProcessEnv;\n readonly maxOutputBytes: number;\n readonly killGraceMs: number;\n readonly stopWaitMs: number;\n readonly now?: (() => number) | undefined;\n readonly logger?: Pick<Console, 'error'> | undefined;\n}\n\nasync function writeOwnerMetadata(\n path: string,\n value: unknown,\n signal?: AbortSignal,\n): Promise<void> {\n await replaceFileDurable(\n path,\n `${JSON.stringify(value, null, 2)}\\n`,\n signal === undefined ? {} : { signal },\n );\n}\n\nasync function closeOwnerOutputStream(\n stream: ReturnType<typeof createWriteStream> | undefined,\n): Promise<void> {\n if (stream === undefined || stream.destroyed || stream.closed) return;\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const finish = () => {\n if (settled) return;\n settled = true;\n stream.off('error', fail);\n stream.off('close', finish);\n stream.off('finish', finish);\n resolve();\n };\n const fail = (error: Error) => {\n if (settled) return;\n settled = true;\n stream.off('close', finish);\n stream.off('finish', finish);\n reject(error);\n };\n stream.once('close', finish);\n stream.once('finish', finish);\n stream.once('error', fail);\n stream.end();\n });\n}\n\nfunction appendError(existing: string | undefined, next: string): string {\n if (existing === undefined || existing.length === 0) return next;\n return existing.includes(next) ? existing : `${existing}; ${next}`;\n}\n\nfunction taskkillDescription(outcome: TaskkillOutcome): string {\n return [\n `exit=${String(outcome.exitCode)}`,\n `signal=${String(outcome.signal)}`,\n outcome.stdout.length > 0 ? `stdout=${JSON.stringify(outcome.stdout)}` : '',\n outcome.stderr.length > 0 ? `stderr=${JSON.stringify(outcome.stderr)}` : '',\n outcome.stdoutTruncated ? 'stdout_truncated=true' : '',\n outcome.stderrTruncated ? 'stderr_truncated=true' : '',\n ]\n .filter(Boolean)\n .join(' ');\n}\n\n/**\n * Create and spawn the complete live execution retained by the process-global\n * owner. The returned object is structural and survives hot-loaded module copies.\n */\nexport function createReloadableShellExecutionV1(\n options: ReloadableShellExecutionOptions,\n): ReloadableShellExecutionV1 {\n const task = options.task;\n const platform = options.platform ?? process.platform;\n const env = options.env ?? process.env;\n const now = options.now ?? Date.now;\n const logger = options.logger ?? console;\n const spawn =\n options.spawn ??\n ((command: string, args: string[], spawnOptions: SpawnOptions) =>\n nodeSpawn(command, args, spawnOptions));\n const killProcess = options.killProcess ?? process.kill.bind(process);\n const killTree =\n options.killTree ??\n ((pid: number, phase: WindowsKillPhase, signal?: AbortSignal) => {\n const taskkillOptions: WindowsTaskkillOptions =\n signal === undefined ? { env } : { env, signal };\n return runWindowsTaskkill(pid, phase, taskkillOptions);\n });\n\n const outputStream = createWriteStream(task.outputAbsPath, { flags: 'a', encoding: 'utf8' });\n let child: ReloadShellProcessV1;\n try {\n child = spawn(options.invocation.shell, [...options.invocation.args], {\n cwd: task.cwd,\n detached: platform !== 'win32',\n stdio: ['ignore', 'pipe', 'pipe'],\n env,\n windowsHide: true,\n windowsVerbatimArguments: options.invocation.windowsVerbatimArguments,\n });\n } catch (error) {\n outputStream.destroy();\n throw error;\n }\n const childPid = child.pid;\n if (childPid === undefined || !Number.isSafeInteger(childPid) || childPid <= 0) {\n outputStream.destroy();\n try {\n child.kill('SIGKILL');\n } catch {\n // The loud launch error remains authoritative; no PID authority was acquired.\n }\n throw ownerError(\n 'pi_bg_reload_owner_unavailable',\n 'opted reload shell spawn did not provide a positive child pid',\n );\n }\n\n task.child = child;\n task.pid = childPid;\n task.stream = outputStream;\n if (platform !== 'win32') task.ownedPosixProcessGroupId = childPid;\n\n const spawnedAt = task.startTime;\n const timeoutDeadlineAt =\n task.timeoutSeconds === undefined ? undefined : spawnedAt + task.timeoutSeconds * 1000;\n const audit: ReloadSurvivalSnapshotV1 = {\n schemaVersion: 'pi-background-tasks.reload-shell.v1',\n authority: 'same-process-live-owner',\n hostPid: options.identity.hostPid,\n sessionId: options.identity.sessionId,\n cwdRealpath: options.identity.cwdRealpath,\n launchNonce: options.launchNonce,\n completionId: `${task.id}:1`,\n spawnedAt,\n childPid,\n outputCapBytes: options.maxOutputBytes,\n leaseGeneration: options.lease.generation,\n handoffCount: 0,\n };\n if (timeoutDeadlineAt !== undefined) audit.timeoutDeadlineAt = timeoutDeadlineAt;\n if (platform === 'win32') audit.windowsTreeRootPid = childPid;\n else audit.posixProcessGroupId = childPid;\n task.reloadSurvival = audit;\n\n let sink: ReloadShellOwnerEventSinkV1 | undefined;\n let resolveTerminal: (task: BgTask) => void = () => {};\n const terminal = new Promise<BgTask>((resolve) => {\n resolveTerminal = resolve;\n });\n let resolveInitialMetadata: () => void = () => {};\n let rejectInitialMetadata: (error: unknown) => void = () => {};\n let initialMetadataSettled = false;\n const initialMetadata = new Promise<void>((resolve, reject) => {\n resolveInitialMetadata = resolve;\n rejectInitialMetadata = reject;\n });\n void initialMetadata.catch(() => undefined);\n let finalization: Promise<void> | undefined;\n let posixTree: PosixTreeState | undefined;\n let windowsTree: WindowsTreeState | undefined;\n let stopKind: ReloadShellStopKind | undefined;\n let notificationToken: string | undefined;\n\n const writeMetadata = async (value = snapshot(task), signal?: AbortSignal): Promise<void> => {\n const write = async () => {\n await writeOwnerMetadata(task.metadataAbsPath, value, signal);\n };\n const previous = task.metadataWriteChain ?? Promise.resolve();\n const next = previous.then(write, write);\n task.metadataWriteChain = next.catch(() => undefined);\n await next;\n };\n\n const changed = (): void => {\n sink?.onChanged(execution);\n };\n\n const writeBuffer = (buffer: Buffer): void => {\n const stream = execution.outputStream;\n if (stream === undefined || stream.destroyed || buffer.length === 0) return;\n const nextBytes = task.bytesWritten + buffer.length;\n if (nextBytes <= execution.outputCapBytes) {\n stream.write(buffer);\n task.bytesWritten = nextBytes;\n return;\n }\n const remaining = Math.max(0, execution.outputCapBytes - task.bytesWritten);\n if (remaining > 0) {\n stream.write(buffer.subarray(0, remaining));\n task.bytesWritten += remaining;\n }\n if (task.capExceeded) return;\n task.capExceeded = true;\n task.error = `Output exceeded cap of ${formatSize(execution.outputCapBytes)}; terminating task`;\n const notice = Buffer.from(`\\n\\n[background task error: ${task.error}]\\n`, 'utf8');\n stream.write(notice);\n task.bytesWritten += notice.length;\n changed();\n void execution.requestStop('output_cap', task.error).catch((error: unknown) => {\n task.error = appendError(task.error, `kill failed: ${boundedError(error)}`);\n });\n };\n\n const ingestTelemetry = (text: string): void => {\n if (text.length === 0) return;\n const telemetryText = `${task.contextUsageBuffer ?? ''}${text}`;\n let context = task.contextUsage;\n let tokens = task.tokenUsage;\n let tools = task.toolUsage;\n let model = task.model;\n for (const line of telemetryText.split(/\\r?\\n/u)) {\n if (!line.includes('background-task-')) continue;\n const trimmed = line.trim();\n if (trimmed.startsWith('{') && trimmed.endsWith('}')) {\n try {\n const parsed = parseJsonText(trimmed);\n if (!isJsonObject(parsed)) continue;\n if (parsed['type'] === 'background-task-context-usage') {\n context = normalizeContextUsage(parsed) ?? context;\n } else if (parsed['type'] === 'background-task-telemetry') {\n context = normalizeContextUsage(parsed['contextUsage']) ?? context;\n tokens = normalizeTokenUsage(parsed['tokenUsage']) ?? tokens;\n tools = normalizeToolUsage(parsed['toolUsage']) ?? tools;\n model = normalizeModel(parsed['model']) ?? model;\n }\n } catch {\n // Optional telemetry never replaces raw output truth.\n }\n }\n }\n for (const match of telemetryText.matchAll(\n /<background-task-context-usage>[\\s\\S]*?<\\/background-task-context-usage>/giu,\n )) {\n context = parseContextUsageXml(match[0]) ?? context;\n }\n const lastNewline = Math.max(telemetryText.lastIndexOf('\\n'), telemetryText.lastIndexOf('\\r'));\n let retained = lastNewline >= 0 ? telemetryText.slice(lastNewline + 1) : telemetryText;\n const lower = telemetryText.toLowerCase();\n const open = lower.lastIndexOf('<background-task-context-usage');\n const close = lower.lastIndexOf('</background-task-context-usage>');\n if (open > close) retained = telemetryText.slice(open);\n task.contextUsageBuffer = retained.slice(-TELEMETRY_BUFFER_CHARS);\n const before = JSON.stringify({\n contextUsage: task.contextUsage,\n tokenUsage: task.tokenUsage,\n toolUsage: task.toolUsage,\n model: task.model,\n });\n task.contextUsage = context;\n task.tokenUsage = tokens;\n task.toolUsage = tools;\n task.model = model;\n const after = JSON.stringify({ contextUsage: context, tokenUsage: tokens, toolUsage: tools, model });\n if (before !== after) {\n changed();\n void writeMetadata().catch((error: unknown) => {\n logger.error(`[background-tasks] failed to write survivor telemetry for ${task.id}:`, error);\n });\n }\n };\n\n const finishPosix = (state: PosixTreeState, failure?: Error): void => {\n if (state.settled) return;\n state.settled = true;\n state.failure = failure;\n if (state.verificationTimer !== undefined) clearTimeout(state.verificationTimer);\n if (task.killEscalationTimer !== undefined) clearTimeout(task.killEscalationTimer);\n delete task.killEscalationTimer;\n task.posixProcessGroupSignalAuthorityReleased = true;\n if (failure === undefined && task.ownedPosixProcessGroupId === state.groupId) {\n delete task.ownedPosixProcessGroupId;\n }\n state.resolve();\n };\n\n const probePosixGone = (state: PosixTreeState): boolean => {\n if (state.settled) return state.failure === undefined;\n try {\n const present = killProcess(-state.groupId, 0);\n state.lastProbeError = present\n ? undefined\n : new Error(`process-group probe for ${String(state.groupId)} returned false`);\n return false;\n } catch (error) {\n if (typeof error === 'object' && error !== null && Reflect.get(error, 'code') === 'ESRCH') {\n finishPosix(state);\n return true;\n }\n state.lastProbeError = error instanceof Error ? error : new Error(String(error));\n return false;\n }\n };\n\n const recordPosixFailure = (state: PosixTreeState, error: Error): void => {\n task.error = appendError(task.error, error.message);\n writeBuffer(Buffer.from(`\\n[background task POSIX termination: ${error.message}]\\n`, 'utf8'));\n finishPosix(state, error);\n changed();\n };\n\n const verifyPosix = (state: PosixTreeState): void => {\n if (state.settled) return;\n const remaining = state.deadlineAt - now();\n if (remaining <= 0) {\n const detail = state.lastProbeError ? `; last group probe failed: ${state.lastProbeError.message}` : '';\n recordPosixFailure(\n state,\n new Error(\n `POSIX process group ${String(state.groupId)} remained present after SIGKILL${detail}. Descendant processes may have leaked.`,\n ),\n );\n return;\n }\n state.verificationTimer = setTimeout(() => {\n state.verificationTimer = undefined;\n if (!probePosixGone(state)) verifyPosix(state);\n }, Math.min(10, remaining));\n };\n\n const forcePosix = (state: PosixTreeState): void => {\n if (state.settled || state.forceAttempted) return;\n state.forceAttempted = true;\n if (task.killEscalationTimer !== undefined) clearTimeout(task.killEscalationTimer);\n delete task.killEscalationTimer;\n if (probePosixGone(state)) return;\n try {\n if (!killProcess(-state.groupId, 'SIGKILL')) {\n recordPosixFailure(\n state,\n new Error(\n `POSIX process-group SIGKILL returned false for task ${task.id} group ${String(state.groupId)}. Descendant processes may have leaked.`,\n ),\n );\n return;\n }\n } catch (error) {\n if (typeof error === 'object' && error !== null && Reflect.get(error, 'code') === 'ESRCH') {\n finishPosix(state);\n return;\n }\n recordPosixFailure(\n state,\n new Error(\n `POSIX process-group SIGKILL failed for task ${task.id} group ${String(state.groupId)}: ${boundedError(error)}. Descendant processes may have leaked.`,\n ),\n );\n return;\n }\n if (!probePosixGone(state)) verifyPosix(state);\n };\n\n const beginPosixStop = (): PosixTreeState => {\n if (posixTree !== undefined) return posixTree;\n if (task.posixProcessGroupSignalAuthorityReleased === true) {\n throw new Error(`Task ${task.id} has released its POSIX process-group signal authority`);\n }\n const groupId = task.ownedPosixProcessGroupId;\n if (groupId === undefined) throw new Error(`Task ${task.id} has no owned POSIX process group`);\n let resolve: () => void = () => {};\n const completion = new Promise<void>((resolvePromise) => {\n resolve = resolvePromise;\n });\n const reserve = Math.min(25, Math.max(1, Math.floor(options.stopWaitMs / 4)));\n const state: PosixTreeState = {\n groupId,\n deadlineAt: now() + Math.max(1, options.stopWaitMs - reserve),\n completion,\n resolve,\n forceAttempted: false,\n settled: false,\n };\n posixTree = state;\n task.killEscalationTimer = setTimeout(() => {\n delete task.killEscalationTimer;\n forcePosix(state);\n }, Math.min(options.killGraceMs, Math.max(1, options.stopWaitMs - reserve)));\n return state;\n };\n\n const requestPosixStop = (): void => {\n const state = beginPosixStop();\n if (task.killSignalSent) return;\n task.killSignalSent = true;\n const failures: string[] = [];\n let sent = false;\n try {\n sent = killProcess(-state.groupId, 'SIGTERM');\n if (!sent) failures.push('process-group SIGTERM returned false');\n } catch (error) {\n if (typeof error === 'object' && error !== null && Reflect.get(error, 'code') === 'ESRCH') {\n finishPosix(state);\n } else {\n failures.push(`process-group SIGTERM failed: ${boundedError(error)}`);\n }\n }\n if (!sent && !state.settled) {\n try {\n sent = execution.child?.kill('SIGTERM') === true;\n if (!sent) failures.push('child SIGTERM returned false');\n } catch (error) {\n failures.push(`child SIGTERM failed: ${boundedError(error)}`);\n }\n }\n if (!sent && !state.settled) {\n forcePosix(state);\n throw new Error(`Could not kill task ${task.id}: ${failures.join('; ')}`);\n }\n };\n\n const finishWindows = (state: WindowsTreeState, failure?: Error): void => {\n if (state.settled) return;\n state.settled = true;\n state.failure = failure;\n if (task.killEscalationTimer !== undefined) clearTimeout(task.killEscalationTimer);\n delete task.killEscalationTimer;\n state.resolve();\n };\n\n const evaluateTaskkill = (\n state: WindowsTreeState,\n phase: WindowsKillPhase,\n outcome: TaskkillOutcome,\n ): Error | undefined => {\n if (outcome.exitCode === 0 || outcome.exitCode === 128) return undefined;\n if (phase === 'terminate') return undefined;\n return new Error(\n `Windows taskkill /T /F force termination failed for task ${task.id} pid ${String(state.pid)}: ${taskkillDescription(outcome)}. Descendant processes may have leaked.`,\n );\n };\n\n const forceWindows = (state: WindowsTreeState): Promise<void> => {\n if (state.forcePromise !== undefined) return state.forcePromise;\n state.forceAttempted = true;\n state.softController?.abort();\n if (task.killEscalationTimer !== undefined) clearTimeout(task.killEscalationTimer);\n delete task.killEscalationTimer;\n const launched = Promise.resolve().then(() => killTree(state.pid, 'force'));\n state.forcePromise = launched.then(\n (outcome) => {\n const failure = evaluateTaskkill(state, 'force', outcome);\n if (failure !== undefined) {\n task.error = appendError(task.error, failure.message);\n finishWindows(state, failure);\n throw failure;\n }\n finishWindows(state);\n },\n (error: unknown) => {\n const failure = new Error(\n `Windows taskkill /T /F force termination failed for task ${task.id} pid ${String(state.pid)}: ${boundedError(error)}. Descendant processes may have leaked.`,\n );\n task.error = appendError(task.error, failure.message);\n finishWindows(state, failure);\n throw failure;\n },\n );\n void state.forcePromise.catch((error: unknown) => {\n logger.error(`[background-tasks] Windows survivor force kill failed for ${task.id}:`, error);\n });\n return state.forcePromise;\n };\n\n const beginWindowsStop = (): WindowsTreeState => {\n if (windowsTree !== undefined) return windowsTree;\n let resolve: () => void = () => {};\n const completion = new Promise<void>((resolvePromise) => {\n resolve = resolvePromise;\n });\n const state: WindowsTreeState = {\n pid: childPid,\n completion,\n resolve,\n forceAttempted: false,\n settled: false,\n };\n windowsTree = state;\n const controller = new AbortController();\n state.softController = controller;\n state.softPromise = Promise.resolve()\n .then(() => killTree(childPid, 'terminate', controller.signal))\n .then(\n (outcome) => {\n if (state.forceAttempted || state.settled) return;\n if (outcome.exitCode === 0 || outcome.exitCode === 128) finishWindows(state);\n // Other soft failures deliberately retain force escalation.\n },\n () => {\n // Soft failure deliberately retains force escalation.\n },\n );\n task.killEscalationTimer = setTimeout(() => {\n delete task.killEscalationTimer;\n void forceWindows(state);\n }, options.killGraceMs);\n return state;\n };\n\n const requestWindowsStop = (): void => {\n beginWindowsStop();\n task.killSignalSent = true;\n };\n\n const awaitTreeBeforeTerminal = async (): Promise<Error | undefined> => {\n if (platform === 'win32') {\n if (windowsTree === undefined) return undefined;\n await windowsTree.completion;\n return windowsTree.failure;\n }\n if (posixTree === undefined) {\n task.posixProcessGroupSignalAuthorityReleased = true;\n delete task.ownedPosixProcessGroupId;\n return undefined;\n }\n probePosixGone(posixTree);\n await posixTree.completion;\n return posixTree.failure;\n };\n\n const terminalStatus = (\n code: number | null,\n signal: NodeJS.Signals | null,\n ): { status: TaskStatus; error?: string | undefined } => {\n if (stopKind === 'user' || stopKind === 'shutdown') return { status: 'killed' };\n if (stopKind === 'timeout') {\n return { status: 'failed', error: task.error ?? `Timed out after ${String(task.timeoutSeconds)}s` };\n }\n if (stopKind === 'output_cap') {\n return { status: 'failed', error: task.error ?? `Output exceeded cap of ${formatSize(execution.outputCapBytes)}` };\n }\n if (stopKind === 'handoff_expired') {\n return {\n status: 'failed',\n error:\n task.error ??\n 'pi_bg_reload_handoff_expired: reload shell execution was not claimed before its handoff deadline',\n };\n }\n if ((code ?? 0) === 0) return { status: 'completed' };\n return {\n status: 'failed',\n error: `Exited with code ${code === null ? 'null' : String(code)}${signal ? ` (${signal})` : ''}`,\n };\n };\n\n const finalize = (code: number | null, signal: NodeJS.Signals | null): void => {\n if (finalization !== undefined) return;\n execution.closeObservation = { code, signal, observedAt: now() };\n execution.phase = 'finalizing';\n finalization = (async () => {\n let result = terminalStatus(code, signal);\n try {\n await initialMetadata;\n } catch (error) {\n result = {\n status: 'failed',\n error: appendError(result.error, `Initial metadata write failed: ${boundedError(error)}`),\n };\n }\n const treeFailure = await awaitTreeBeforeTerminal();\n if (treeFailure !== undefined) {\n result = { status: 'failed', error: appendError(result.error, treeFailure.message) };\n }\n try {\n await closeOwnerOutputStream(execution.outputStream);\n } catch (error) {\n result = {\n status: 'failed',\n error: appendError(result.error, `Final output durability failed: ${boundedError(error)}`),\n };\n }\n task.exitCode = code;\n task.signal = signal;\n task.endTime = now();\n if (result.error !== undefined) task.error = result.error;\n try {\n await writeMetadata({ ...snapshot(task), status: result.status });\n task.status = result.status;\n } catch (error) {\n task.status = 'failed';\n task.error = `Terminal metadata write failed: ${boundedError(error)}`;\n logger.error(`[background-tasks] failed to write survivor metadata for ${task.id}:`, error);\n await writeMetadata().catch(() => undefined);\n }\n task.finalized = true;\n if (task.timeoutHandle !== undefined) clearTimeout(task.timeoutHandle);\n delete task.timeoutHandle;\n for (const waiter of task.waiters.splice(0)) waiter();\n execution.phase = 'terminal';\n resolveTerminal(task);\n changed();\n sink?.onTerminal(execution);\n })().catch((error: unknown) => {\n logger.error(`[background-tasks] reload shell finalization failed for ${task.id}:`, error);\n });\n };\n\n let stdoutListener: (data: Buffer | string) => void = () => {};\n let stderrListener: (data: Buffer | string) => void = () => {};\n let childErrorListener: (error: Error) => void = () => {};\n let childCloseListener: (\n code: number | null,\n signal: NodeJS.Signals | null,\n ) => void = () => {};\n let streamErrorListener: (error: Error) => void = () => {};\n\n const execution: ReloadableShellExecutionV1 = {\n protocol: RELOAD_SHELL_OWNER_PROTOCOL,\n launchNonce: options.launchNonce,\n completionId: `${task.id}:1`,\n task,\n child,\n outputStream,\n spawnedAt,\n timeoutDeadlineAt,\n outputCapBytes: options.maxOutputBytes,\n terminal,\n phase: 'starting',\n admissionCommitted: false,\n notificationState: task.notifyOnCompletion ? 'pending' : 'disabled',\n async requestStop(kind, reason) {\n if (execution.phase === 'released') return task;\n if (execution.phase === 'terminal') return task;\n const firstStop = stopKind === undefined;\n if (firstStop) {\n stopKind = kind;\n task.killKind = kind === 'handoff_expired' ? 'shutdown' : kind;\n if (reason !== undefined) task.error = reason;\n }\n if (firstStop && kind === 'handoff_expired' && !task.error?.startsWith('pi_bg_reload_handoff_expired')) {\n task.error = `pi_bg_reload_handoff_expired: ${task.error ?? 'reload handoff expired'}`;\n }\n if (execution.phase === 'finalizing') return terminal;\n if (execution.phase === 'running' || execution.phase === 'starting') {\n execution.phase = 'stop_requested';\n }\n if (task.status === 'running') {\n if (platform === 'win32') requestWindowsStop();\n else requestPosixStop();\n }\n let timeout: NodeJS.Timeout | undefined;\n try {\n return await Promise.race([\n terminal,\n new Promise<never>((_resolve, reject) => {\n timeout = setTimeout(\n () => reject(new Error(`Task ${task.id} did not exit within ${String(options.stopWaitMs)}ms after cancellation`)),\n options.stopWaitMs,\n );\n }),\n ]);\n } finally {\n if (timeout !== undefined) clearTimeout(timeout);\n }\n },\n async commitInitialMetadata(signal) {\n try {\n await writeMetadata(snapshot(task), signal);\n if (!initialMetadataSettled) {\n initialMetadataSettled = true;\n resolveInitialMetadata();\n }\n } catch (error) {\n if (!initialMetadataSettled) {\n initialMetadataSettled = true;\n rejectInitialMetadata(error);\n }\n throw error;\n }\n },\n failAdmission(error) {\n if (!initialMetadataSettled) {\n initialMetadataSettled = true;\n rejectInitialMetadata(error);\n }\n },\n setOwnerEventSink(next) {\n sink = next;\n },\n markAdmissionCommitted(generation, handoffCount) {\n execution.admissionCommitted = true;\n execution.phase = execution.phase === 'starting' ? 'running' : execution.phase;\n audit.leaseGeneration = generation;\n audit.handoffCount = handoffCount;\n },\n updateLeaseAudit(generation, handoffCount) {\n audit.leaseGeneration = generation;\n audit.handoffCount = handoffCount;\n },\n abandonReloadHandoff() {\n if (task.terminalPublicationState === 'pending') {\n task.terminalPublicationState = 'abandoned';\n task.terminalPublicationAbandonReason = 'reload_handoff_expired';\n task.terminalPublished = false;\n }\n if (task.status === 'running') {\n task.error = appendError(\n task.error,\n 'pi_bg_reload_handoff_expired: no compatible reload activation claimed this execution',\n );\n }\n void writeMetadata().catch((error: unknown) => {\n logger.error(`[background-tasks] failed to persist handoff expiry for ${task.id}:`, error);\n });\n },\n beginNotification(lease) {\n if (execution.notificationState !== 'pending') return undefined;\n const token = `${String(lease.generation)}:${lease.activationNonce}:${randomNonce()}`;\n notificationToken = token;\n execution.notificationState = 'sending';\n return token;\n },\n finishNotification(token, delivered) {\n if (notificationToken !== token || execution.notificationState !== 'sending') return;\n notificationToken = undefined;\n if (delivered) {\n execution.notificationState = 'delivered';\n task.notified = true;\n } else {\n execution.notificationState = 'pending';\n task.notified = false;\n }\n },\n releaseResources() {\n if (task.timeoutHandle !== undefined) clearTimeout(task.timeoutHandle);\n if (task.killEscalationTimer !== undefined) clearTimeout(task.killEscalationTimer);\n if (posixTree?.verificationTimer !== undefined) clearTimeout(posixTree.verificationTimer);\n windowsTree?.softController?.abort();\n execution.child?.stdout?.off?.('data', stdoutListener);\n execution.child?.stderr?.off?.('data', stderrListener);\n execution.child?.off?.('error', childErrorListener);\n execution.child?.off?.('close', childCloseListener);\n execution.outputStream?.off('error', streamErrorListener);\n sink = undefined;\n execution.child = undefined;\n execution.outputStream = undefined;\n delete task.child;\n delete task.stream;\n delete task.timeoutHandle;\n delete task.killEscalationTimer;\n delete task.reloadExecution;\n execution.phase = 'released';\n },\n };\n\n task.reloadExecution = execution;\n\n streamErrorListener = (error) => {\n task.error = `Output file write failed: ${error.message}`;\n changed();\n if (task.status === 'running') {\n void execution.requestStop('output_cap', task.error).catch((stopError: unknown) => {\n logger.error(`[background-tasks] failed to stop survivor after stream error ${task.id}:`, stopError);\n });\n }\n };\n stdoutListener = (data) => {\n const buffer = Buffer.isBuffer(data) ? data : Buffer.from(data, 'utf8');\n ingestTelemetry(buffer.toString('utf8'));\n writeBuffer(buffer);\n };\n stderrListener = (data) => {\n const buffer = Buffer.isBuffer(data) ? data : Buffer.from(data, 'utf8');\n ingestTelemetry(buffer.toString('utf8'));\n writeBuffer(buffer);\n };\n childErrorListener = (error) => {\n task.error = appendError(task.error, `Background task spawn error: ${error.message}`);\n writeBuffer(Buffer.from(`\\n[background task spawn error: ${error.message}]\\n`, 'utf8'));\n changed();\n };\n childCloseListener = (code, signal) => {\n if (execution.closeObservation !== undefined) return;\n finalize(code, signal);\n };\n outputStream.on('error', streamErrorListener);\n child.stdout?.on('data', stdoutListener);\n child.stderr?.on('data', stderrListener);\n child.on('error', childErrorListener);\n child.on('close', childCloseListener);\n\n if (timeoutDeadlineAt !== undefined) {\n task.timeoutHandle = setTimeout(() => {\n if (task.status !== 'running' || execution.phase === 'terminal' || execution.phase === 'released') return;\n const message = `Timed out after ${String(task.timeoutSeconds)}s`;\n writeBuffer(Buffer.from(`\\n[background task timeout: ${message}]\\n`, 'utf8'));\n void execution.requestStop('timeout', message).catch((error: unknown) => {\n logger.error(`[background-tasks] survivor timeout stop failed for ${task.id}:`, error);\n });\n }, Math.max(0, timeoutDeadlineAt - now()));\n }\n\n return execution;\n}\n"]}
@@ -0,0 +1,80 @@
1
+ import { resolveShellPolicy, } from './common.js';
2
+ export const SHELL_POLICY_SECTION = 'pi_background_shell_policy';
3
+ const SHELL_POLICY_OPEN = `<${SHELL_POLICY_SECTION}>`;
4
+ const SHELL_POLICY_CLOSE = `</${SHELL_POLICY_SECTION}>`;
5
+ function displayedArgs(policy) {
6
+ return [
7
+ ...policy.argvPrefix,
8
+ policy.dialect === 'cmd' ? '"<command>"' : '<command>',
9
+ ];
10
+ }
11
+ /** Stable, non-secret guidance generated from the same selection used for spawning. */
12
+ export function shellPolicyGuidance(policy) {
13
+ const launch = JSON.stringify({
14
+ policy: policy.policy,
15
+ executable: policy.executable,
16
+ dialect: policy.dialect,
17
+ args: displayedArgs(policy),
18
+ });
19
+ const lines = [
20
+ `bg_run and /bg execute commands with the activation shell policy ${launch}.`,
21
+ 'The executable and arguments are passed directly to process spawn; the executable path is never interpolated into another shell command.',
22
+ ];
23
+ if (policy.dialect === 'user-non-posix') {
24
+ lines.push('This inherited user shell is not classified as POSIX or Bash. Do not generate Bash/POSIX syntax or assume Bash startup files for bg_run or /bg.', 'Bash remediation: set PI_BG_POSIX_SHELL=bash before starting or reloading Pi; optionally set PI_BG_POSIX_SHELL_PATH to an absolute executable Bash path.');
25
+ }
26
+ else if (policy.dialect === 'bash') {
27
+ lines.push('Generate Bash syntax for bg_run and /bg. Commands use Bash -c, never -lc, so login-shell startup files are not loaded implicitly.');
28
+ }
29
+ else if (policy.dialect === 'posix') {
30
+ lines.push('Generate portable POSIX shell syntax for bg_run and /bg; do not assume Bash-only syntax. Commands use -c and do not request login-shell startup.');
31
+ }
32
+ else {
33
+ lines.push('Generate Windows cmd.exe syntax for bg_run and /bg. The POSIX shell-selection variables do not change Windows execution.');
34
+ }
35
+ return lines.join('\n');
36
+ }
37
+ export function renderShellPolicyGuidanceBlock(policy) {
38
+ return `${SHELL_POLICY_OPEN}\n${shellPolicyGuidance(policy)}\n${SHELL_POLICY_CLOSE}`;
39
+ }
40
+ /** Replace this package's section without disturbing guidance owned by another hook. */
41
+ export function upsertShellPolicyGuidance(systemPrompt, policy) {
42
+ const block = renderShellPolicyGuidanceBlock(policy);
43
+ const start = systemPrompt.indexOf(SHELL_POLICY_OPEN);
44
+ if (start >= 0) {
45
+ const close = systemPrompt.indexOf(SHELL_POLICY_CLOSE, start + SHELL_POLICY_OPEN.length);
46
+ if (close >= 0) {
47
+ return `${systemPrompt.slice(0, start)}${block}${systemPrompt.slice(close + SHELL_POLICY_CLOSE.length)}`;
48
+ }
49
+ }
50
+ return systemPrompt.length > 0 ? `${systemPrompt}\n\n${block}` : block;
51
+ }
52
+ /**
53
+ * Compose across Pi 0.84's chained string hook and Pi 0.86's structured prompt sections.
54
+ * A pre-existing forced prompt is updated as well because structured sections are opaque
55
+ * while `forceSystemPrompt` is active.
56
+ */
57
+ export function applyShellPolicyGuidance(event, policy) {
58
+ const options = event.systemPromptOptions;
59
+ if (typeof options.sections === 'object' &&
60
+ options.sections !== null &&
61
+ !Array.isArray(options.sections)) {
62
+ options.sections[SHELL_POLICY_SECTION] = shellPolicyGuidance(policy);
63
+ if (typeof options.forceSystemPrompt === 'string') {
64
+ options.forceSystemPrompt = upsertShellPolicyGuidance(options.forceSystemPrompt, policy);
65
+ }
66
+ return undefined;
67
+ }
68
+ return { systemPrompt: upsertShellPolicyGuidance(event.systemPrompt, policy) };
69
+ }
70
+ export function createShellPolicyGuidanceHandler(policy) {
71
+ return (event) => applyShellPolicyGuidance(event, policy);
72
+ }
73
+ export function registerShellPolicyGuidance(pi, policy) {
74
+ pi.on('before_agent_start', createShellPolicyGuidanceHandler(policy));
75
+ }
76
+ /** Resolve once at extension activation; the returned object is deeply frozen. */
77
+ export function initializeShellPolicy(options = {}) {
78
+ return resolveShellPolicy(options.platform ?? process.platform, options.env ?? process.env, options.activationCwd ?? process.cwd());
79
+ }
80
+ //# sourceMappingURL=shell-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-policy.js","sourceRoot":"","sources":["../../../src/core/shell-policy.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n BeforeAgentStartEvent,\n BeforeAgentStartEventResult,\n ExtensionAPI,\n} from '@earendil-works/pi-coding-agent';\nimport {\n resolveShellPolicy,\n type ResolvedShellPolicy,\n type ShellPolicySnapshot,\n} from './common.js';\n\nexport const SHELL_POLICY_SECTION = 'pi_background_shell_policy';\nconst SHELL_POLICY_OPEN = `<${SHELL_POLICY_SECTION}>`;\nconst SHELL_POLICY_CLOSE = `</${SHELL_POLICY_SECTION}>`;\n\ninterface MutableStructuredPromptOptions {\n sections?: Record<string, string> | undefined;\n forceSystemPrompt?: string | undefined;\n}\n\nexport interface ShellPolicyInitializationOptions {\n readonly platform?: NodeJS.Platform | undefined;\n readonly env?: NodeJS.ProcessEnv | undefined;\n readonly activationCwd?: string | undefined;\n}\n\nfunction displayedArgs(policy: ShellPolicySnapshot): string[] {\n return [\n ...policy.argvPrefix,\n policy.dialect === 'cmd' ? '\"<command>\"' : '<command>',\n ];\n}\n\n/** Stable, non-secret guidance generated from the same selection used for spawning. */\nexport function shellPolicyGuidance(policy: ShellPolicySnapshot): string {\n const launch = JSON.stringify({\n policy: policy.policy,\n executable: policy.executable,\n dialect: policy.dialect,\n args: displayedArgs(policy),\n });\n const lines = [\n `bg_run and /bg execute commands with the activation shell policy ${launch}.`,\n 'The executable and arguments are passed directly to process spawn; the executable path is never interpolated into another shell command.',\n ];\n\n if (policy.dialect === 'user-non-posix') {\n lines.push(\n 'This inherited user shell is not classified as POSIX or Bash. Do not generate Bash/POSIX syntax or assume Bash startup files for bg_run or /bg.',\n 'Bash remediation: set PI_BG_POSIX_SHELL=bash before starting or reloading Pi; optionally set PI_BG_POSIX_SHELL_PATH to an absolute executable Bash path.',\n );\n } else if (policy.dialect === 'bash') {\n lines.push(\n 'Generate Bash syntax for bg_run and /bg. Commands use Bash -c, never -lc, so login-shell startup files are not loaded implicitly.',\n );\n } else if (policy.dialect === 'posix') {\n lines.push(\n 'Generate portable POSIX shell syntax for bg_run and /bg; do not assume Bash-only syntax. Commands use -c and do not request login-shell startup.',\n );\n } else {\n lines.push(\n 'Generate Windows cmd.exe syntax for bg_run and /bg. The POSIX shell-selection variables do not change Windows execution.',\n );\n }\n\n return lines.join('\\n');\n}\n\nexport function renderShellPolicyGuidanceBlock(policy: ShellPolicySnapshot): string {\n return `${SHELL_POLICY_OPEN}\\n${shellPolicyGuidance(policy)}\\n${SHELL_POLICY_CLOSE}`;\n}\n\n/** Replace this package's section without disturbing guidance owned by another hook. */\nexport function upsertShellPolicyGuidance(\n systemPrompt: string,\n policy: ShellPolicySnapshot,\n): string {\n const block = renderShellPolicyGuidanceBlock(policy);\n const start = systemPrompt.indexOf(SHELL_POLICY_OPEN);\n if (start >= 0) {\n const close = systemPrompt.indexOf(SHELL_POLICY_CLOSE, start + SHELL_POLICY_OPEN.length);\n if (close >= 0) {\n return `${systemPrompt.slice(0, start)}${block}${systemPrompt.slice(close + SHELL_POLICY_CLOSE.length)}`;\n }\n }\n return systemPrompt.length > 0 ? `${systemPrompt}\\n\\n${block}` : block;\n}\n\n/**\n * Compose across Pi 0.84's chained string hook and Pi 0.86's structured prompt sections.\n * A pre-existing forced prompt is updated as well because structured sections are opaque\n * while `forceSystemPrompt` is active.\n */\nexport function applyShellPolicyGuidance(\n event: Pick<BeforeAgentStartEvent, 'systemPrompt' | 'systemPromptOptions'>,\n policy: ShellPolicySnapshot,\n): BeforeAgentStartEventResult | undefined {\n const options = event.systemPromptOptions as MutableStructuredPromptOptions;\n if (\n typeof options.sections === 'object' &&\n options.sections !== null &&\n !Array.isArray(options.sections)\n ) {\n options.sections[SHELL_POLICY_SECTION] = shellPolicyGuidance(policy);\n if (typeof options.forceSystemPrompt === 'string') {\n options.forceSystemPrompt = upsertShellPolicyGuidance(options.forceSystemPrompt, policy);\n }\n return undefined;\n }\n return { systemPrompt: upsertShellPolicyGuidance(event.systemPrompt, policy) };\n}\n\nexport function createShellPolicyGuidanceHandler(policy: ResolvedShellPolicy) {\n return (event: BeforeAgentStartEvent): BeforeAgentStartEventResult | undefined =>\n applyShellPolicyGuidance(event, policy);\n}\n\nexport function registerShellPolicyGuidance(\n pi: Pick<ExtensionAPI, 'on'>,\n policy: ResolvedShellPolicy,\n): void {\n pi.on('before_agent_start', createShellPolicyGuidanceHandler(policy));\n}\n\n/** Resolve once at extension activation; the returned object is deeply frozen. */\nexport function initializeShellPolicy(\n options: ShellPolicyInitializationOptions = {},\n): ResolvedShellPolicy {\n return resolveShellPolicy(\n options.platform ?? process.platform,\n options.env ?? process.env,\n options.activationCwd ?? process.cwd(),\n );\n}\n"]}
@@ -0,0 +1,51 @@
1
+ import { mkdir } from 'node:fs/promises';
2
+ import { dirname } from 'node:path';
3
+ import { replaceFileDurable, writeFileDurable } from './durable-fs.js';
4
+ function signalError(signal) {
5
+ const reason = signal.reason;
6
+ return reason instanceof Error
7
+ ? reason
8
+ : new Error(`Attested Git preflight cancelled${reason === undefined ? '' : `: ${String(reason)}`}`);
9
+ }
10
+ function throwIfAborted(signal) {
11
+ if (signal?.aborted === true)
12
+ throw signalError(signal);
13
+ }
14
+ export async function writeFileFsynced(path, data, signal) {
15
+ throwIfAborted(signal);
16
+ await mkdir(dirname(path), { recursive: true });
17
+ throwIfAborted(signal);
18
+ await writeFileDurable(path, data, signal === undefined ? {} : { signal });
19
+ }
20
+ export async function writeJsonAtomic(path, value, signal) {
21
+ throwIfAborted(signal);
22
+ await replaceFileDurable(path, `${JSON.stringify(value, null, 2)}\n`, signal === undefined ? {} : { signal });
23
+ }
24
+ export async function closeAndFsyncOutputStream(stream) {
25
+ if (!stream)
26
+ return;
27
+ await new Promise((resolvePromise, reject) => {
28
+ let settled = false;
29
+ const finish = () => {
30
+ if (settled)
31
+ return;
32
+ settled = true;
33
+ stream.off('error', fail);
34
+ stream.off('close', finish);
35
+ stream.off('finish', finish);
36
+ resolvePromise();
37
+ };
38
+ const fail = (error) => {
39
+ if (settled)
40
+ return;
41
+ settled = true;
42
+ stream.off('close', finish);
43
+ reject(error);
44
+ };
45
+ stream.once('close', finish);
46
+ stream.once('finish', finish);
47
+ stream.once('error', fail);
48
+ stream.end();
49
+ });
50
+ }
51
+ //# sourceMappingURL=task-durable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-durable.js","sourceRoot":"","sources":["../../../src/core/task-durable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEvE,SAAS,WAAW,CAAC,MAAmB;IACtC,MAAM,MAAM,GAAY,MAAM,CAAC,MAAM,CAAC;IACtC,OAAO,MAAM,YAAY,KAAK;QAC5B,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,IAAI,KAAK,CACP,mCAAmC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CACvF,CAAC;AACR,CAAC;AAED,SAAS,cAAc,CAAC,MAAoB;IAC1C,IAAI,MAAM,EAAE,OAAO,KAAK,IAAI;QAAE,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAY,EACZ,IAAqB,EACrB,MAAoB;IAEpB,cAAc,CAAC,MAAM,CAAC,CAAC;IACvB,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,cAAc,CAAC,MAAM,CAAC,CAAC;IACvB,MAAM,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAY,EACZ,KAAc,EACd,MAAoB;IAEpB,cAAc,CAAC,MAAM,CAAC,CAAC;IACvB,MAAM,kBAAkB,CACtB,IAAI,EACJ,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EACrC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CACvC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,MAAyC;IAEzC,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,MAAM,IAAI,OAAO,CAAO,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE;QACjD,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC1B,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5B,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC7B,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC;QACF,MAAM,IAAI,GAAG,CAAC,KAAY,EAAE,EAAE;YAC5B,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5B,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3B,MAAM,CAAC,GAAG,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { mkdir } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport { replaceFileDurable, writeFileDurable } from './durable-fs.js';\n\nfunction signalError(signal: AbortSignal): Error {\n const reason: unknown = signal.reason;\n return reason instanceof Error\n ? reason\n : new Error(\n `Attested Git preflight cancelled${reason === undefined ? '' : `: ${String(reason)}`}`,\n );\n}\n\nfunction throwIfAborted(signal?: AbortSignal): void {\n if (signal?.aborted === true) throw signalError(signal);\n}\n\nexport async function writeFileFsynced(\n path: string,\n data: Buffer | string,\n signal?: AbortSignal,\n): Promise<void> {\n throwIfAborted(signal);\n await mkdir(dirname(path), { recursive: true });\n throwIfAborted(signal);\n await writeFileDurable(path, data, signal === undefined ? {} : { signal });\n}\n\nexport async function writeJsonAtomic(\n path: string,\n value: unknown,\n signal?: AbortSignal,\n): Promise<void> {\n throwIfAborted(signal);\n await replaceFileDurable(\n path,\n `${JSON.stringify(value, null, 2)}\\n`,\n signal === undefined ? {} : { signal },\n );\n}\n\nexport async function closeAndFsyncOutputStream(\n stream: NodeJS.WritableStream | undefined,\n): Promise<void> {\n if (!stream) return;\n await new Promise<void>((resolvePromise, reject) => {\n let settled = false;\n const finish = () => {\n if (settled) return;\n settled = true;\n stream.off('error', fail);\n stream.off('close', finish);\n stream.off('finish', finish);\n resolvePromise();\n };\n const fail = (error: Error) => {\n if (settled) return;\n settled = true;\n stream.off('close', finish);\n reject(error);\n };\n stream.once('close', finish);\n stream.once('finish', finish);\n stream.once('error', fail);\n stream.end();\n });\n}\n"]}
@@ -0,0 +1,92 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { isJsonObject, parseJsonText } from './common.js';
3
+ /**
4
+ * Typed, offline-safe boundary for the "update available" footer notice.
5
+ *
6
+ * All network access flows through an injectable {@link FetchLike} so unit tests
7
+ * never touch the real npm registry. Every failure path (offline, timeout, bad
8
+ * status, malformed payload) resolves to `undefined` and never throws, so the
9
+ * footer/session can never hang or error because of an update check.
10
+ */
11
+ export const DEFAULT_NPM_REGISTRY_URL = 'https://registry.npmjs.org';
12
+ export const DEFAULT_UPDATE_TIMEOUT_MS = 2000;
13
+ function asPayload(value) {
14
+ return isJsonObject(value) ? value : undefined;
15
+ }
16
+ function readNonEmptyString(record, key) {
17
+ const value = record[key];
18
+ if (typeof value !== 'string')
19
+ return undefined;
20
+ const trimmed = value.trim();
21
+ return trimmed.length > 0 ? trimmed : undefined;
22
+ }
23
+ /** Narrow an npm registry `<pkg>/latest` JSON payload to its `version` string. */
24
+ export function parseLatestVersionPayload(payload) {
25
+ const record = asPayload(payload);
26
+ if (!record)
27
+ return undefined;
28
+ return readNonEmptyString(record, 'version');
29
+ }
30
+ /** Narrow a parsed `package.json` payload to the fields this extension needs. */
31
+ export function parsePackageInfo(payload) {
32
+ const record = asPayload(payload);
33
+ if (!record)
34
+ return {};
35
+ const info = {};
36
+ const name = readNonEmptyString(record, 'name');
37
+ const version = readNonEmptyString(record, 'version');
38
+ if (name !== undefined)
39
+ info.name = name;
40
+ if (version !== undefined)
41
+ info.version = version;
42
+ return info;
43
+ }
44
+ const realFetch = (url, init) => fetch(url, init);
45
+ /** Duck-type AbortError because Node versions differ on DOMException inheritance. */
46
+ function isAbortError(error) {
47
+ return typeof error === 'object' && error !== null && Reflect.get(error, 'name') === 'AbortError';
48
+ }
49
+ /** Time-boxed, never-throwing lookup of the latest published version of a package. */
50
+ export async function fetchLatestVersion(options) {
51
+ const registryUrl = (options.registryUrl ?? DEFAULT_NPM_REGISTRY_URL).replace(/\/+$/, '');
52
+ const timeoutMs = options.timeoutMs ?? DEFAULT_UPDATE_TIMEOUT_MS;
53
+ const doFetch = options.fetchImpl ?? realFetch;
54
+ const controller = new AbortController();
55
+ let timedOut = false;
56
+ const timer = setTimeout(() => {
57
+ // Ownership matters: a fetch implementation may reject with AbortError for
58
+ // another reason. Only the abort initiated by this timer is an expected skip.
59
+ timedOut = true;
60
+ controller.abort();
61
+ }, timeoutMs);
62
+ try {
63
+ const url = `${registryUrl}/${encodeURIComponent(options.packageName)}/latest`;
64
+ const response = await doFetch(url, { signal: controller.signal });
65
+ if (!response.ok)
66
+ return undefined;
67
+ const payload = await response.json();
68
+ return parseLatestVersionPayload(payload);
69
+ }
70
+ catch (error) {
71
+ const expectedTimeoutAbort = timedOut && controller.signal.aborted && isAbortError(error);
72
+ if (options.onError && !expectedTimeoutAbort) {
73
+ options.onError(error instanceof Error ? error : new Error(String(error)));
74
+ }
75
+ return undefined;
76
+ }
77
+ finally {
78
+ clearTimeout(timer);
79
+ }
80
+ }
81
+ /** Read `name`/`version` from a local `package.json`, returning `{}` on every failure. */
82
+ export function readPackageInfo(packageJsonUrl, onError) {
83
+ try {
84
+ return parsePackageInfo(parseJsonText(readFileSync(packageJsonUrl, 'utf8')));
85
+ }
86
+ catch (error) {
87
+ if (onError)
88
+ onError(error instanceof Error ? error : new Error(String(error)));
89
+ return {};
90
+ }
91
+ }
92
+ //# sourceMappingURL=update-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../../src/core/update-check.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync } from 'node:fs';\nimport { isJsonObject, parseJsonText, type JsonObject } from './common.js';\n\n/**\n * Typed, offline-safe boundary for the \"update available\" footer notice.\n *\n * All network access flows through an injectable {@link FetchLike} so unit tests\n * never touch the real npm registry. Every failure path (offline, timeout, bad\n * status, malformed payload) resolves to `undefined` and never throws, so the\n * footer/session can never hang or error because of an update check.\n */\n\nexport const DEFAULT_NPM_REGISTRY_URL = 'https://registry.npmjs.org';\nexport const DEFAULT_UPDATE_TIMEOUT_MS = 2000;\n\nexport interface FetchResponseLike {\n readonly ok: boolean;\n readonly status: number;\n json(): Promise<unknown>;\n}\n\nexport type FetchLike = (url: string, init: { signal: AbortSignal }) => Promise<FetchResponseLike>;\n\nexport interface FetchLatestVersionOptions {\n packageName: string;\n registryUrl?: string;\n timeoutMs?: number;\n fetchImpl?: FetchLike;\n onError?: (error: Error) => void;\n}\n\nexport interface PackageInfo {\n name?: string;\n version?: string;\n}\n\nfunction asPayload(value: unknown): JsonObject | undefined {\n return isJsonObject(value) ? value : undefined;\n}\n\nfunction readNonEmptyString(record: JsonObject, key: string): string | undefined {\n const value = record[key];\n if (typeof value !== 'string') return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\n/** Narrow an npm registry `<pkg>/latest` JSON payload to its `version` string. */\nexport function parseLatestVersionPayload(payload: unknown): string | undefined {\n const record = asPayload(payload);\n if (!record) return undefined;\n return readNonEmptyString(record, 'version');\n}\n\n/** Narrow a parsed `package.json` payload to the fields this extension needs. */\nexport function parsePackageInfo(payload: unknown): PackageInfo {\n const record = asPayload(payload);\n if (!record) return {};\n const info: PackageInfo = {};\n const name = readNonEmptyString(record, 'name');\n const version = readNonEmptyString(record, 'version');\n if (name !== undefined) info.name = name;\n if (version !== undefined) info.version = version;\n return info;\n}\n\nconst realFetch: FetchLike = (url, init) => fetch(url, init);\n\n/** Duck-type AbortError because Node versions differ on DOMException inheritance. */\nfunction isAbortError(error: unknown): boolean {\n return typeof error === 'object' && error !== null && Reflect.get(error, 'name') === 'AbortError';\n}\n\n/** Time-boxed, never-throwing lookup of the latest published version of a package. */\nexport async function fetchLatestVersion(\n options: FetchLatestVersionOptions,\n): Promise<string | undefined> {\n const registryUrl = (options.registryUrl ?? DEFAULT_NPM_REGISTRY_URL).replace(/\\/+$/, '');\n const timeoutMs = options.timeoutMs ?? DEFAULT_UPDATE_TIMEOUT_MS;\n const doFetch = options.fetchImpl ?? realFetch;\n const controller = new AbortController();\n let timedOut = false;\n const timer = setTimeout(() => {\n // Ownership matters: a fetch implementation may reject with AbortError for\n // another reason. Only the abort initiated by this timer is an expected skip.\n timedOut = true;\n controller.abort();\n }, timeoutMs);\n try {\n const url = `${registryUrl}/${encodeURIComponent(options.packageName)}/latest`;\n const response = await doFetch(url, { signal: controller.signal });\n if (!response.ok) return undefined;\n const payload = await response.json();\n return parseLatestVersionPayload(payload);\n } catch (error) {\n const expectedTimeoutAbort = timedOut && controller.signal.aborted && isAbortError(error);\n if (options.onError && !expectedTimeoutAbort) {\n options.onError(error instanceof Error ? error : new Error(String(error)));\n }\n return undefined;\n } finally {\n clearTimeout(timer);\n }\n}\n\n/** Read `name`/`version` from a local `package.json`, returning `{}` on every failure. */\nexport function readPackageInfo(\n packageJsonUrl: URL | string,\n onError?: (error: Error) => void,\n): PackageInfo {\n try {\n return parsePackageInfo(parseJsonText(readFileSync(packageJsonUrl, 'utf8')));\n } catch (error) {\n if (onError) onError(error instanceof Error ? error : new Error(String(error)));\n return {};\n }\n}\n"]}