shield360 1.1.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (400) hide show
  1. package/README.md +330 -3
  2. package/dist/__tests__/build-info.test.js +8 -1
  3. package/dist/__tests__/build-info.test.js.map +1 -1
  4. package/dist/__tests__/code-location.test.js +1 -1
  5. package/dist/__tests__/destination.test.js +15 -0
  6. package/dist/__tests__/destination.test.js.map +1 -1
  7. package/dist/__tests__/masking.test.d.ts +1 -0
  8. package/dist/__tests__/masking.test.js +66 -0
  9. package/dist/__tests__/masking.test.js.map +1 -0
  10. package/dist/__tests__/register.e2e.test.d.ts +1 -0
  11. package/dist/__tests__/register.e2e.test.js +279 -0
  12. package/dist/__tests__/register.e2e.test.js.map +1 -0
  13. package/dist/__tests__/register.test.js +60 -0
  14. package/dist/__tests__/register.test.js.map +1 -1
  15. package/dist/agents/__tests__/agents.test.d.ts +1 -0
  16. package/dist/agents/__tests__/agents.test.js +529 -0
  17. package/dist/agents/__tests__/agents.test.js.map +1 -0
  18. package/dist/agents/index.d.ts +15 -0
  19. package/dist/agents/index.js +25 -0
  20. package/dist/agents/index.js.map +1 -0
  21. package/dist/agents/passport.d.ts +92 -0
  22. package/dist/agents/passport.js +301 -0
  23. package/dist/agents/passport.js.map +1 -0
  24. package/dist/agents/policy.d.ts +24 -0
  25. package/dist/agents/policy.js +93 -0
  26. package/dist/agents/policy.js.map +1 -0
  27. package/dist/agents/replay.d.ts +20 -0
  28. package/dist/agents/replay.js +47 -0
  29. package/dist/agents/replay.js.map +1 -0
  30. package/dist/agents/report.d.ts +30 -0
  31. package/dist/agents/report.js +93 -0
  32. package/dist/agents/report.js.map +1 -0
  33. package/dist/agents/types.d.ts +148 -0
  34. package/dist/agents/types.js +37 -0
  35. package/dist/agents/types.js.map +1 -0
  36. package/dist/agents/verifier.d.ts +33 -0
  37. package/dist/agents/verifier.js +276 -0
  38. package/dist/agents/verifier.js.map +1 -0
  39. package/dist/ai-security/__tests__/bench.test.d.ts +1 -0
  40. package/dist/ai-security/__tests__/bench.test.js +50 -0
  41. package/dist/ai-security/__tests__/bench.test.js.map +1 -0
  42. package/dist/ai-security/__tests__/checks.test.d.ts +1 -0
  43. package/dist/ai-security/__tests__/checks.test.js +248 -0
  44. package/dist/ai-security/__tests__/checks.test.js.map +1 -0
  45. package/dist/ai-security/__tests__/config.test.d.ts +1 -0
  46. package/dist/ai-security/__tests__/config.test.js +164 -0
  47. package/dist/ai-security/__tests__/config.test.js.map +1 -0
  48. package/dist/ai-security/__tests__/detection.test.d.ts +1 -0
  49. package/dist/ai-security/__tests__/detection.test.js +114 -0
  50. package/dist/ai-security/__tests__/detection.test.js.map +1 -0
  51. package/dist/ai-security/__tests__/fixtures.d.ts +8 -0
  52. package/dist/ai-security/__tests__/fixtures.js +30 -0
  53. package/dist/ai-security/__tests__/fixtures.js.map +1 -0
  54. package/dist/ai-security/__tests__/hooks.test.d.ts +1 -0
  55. package/dist/ai-security/__tests__/hooks.test.js +174 -0
  56. package/dist/ai-security/__tests__/hooks.test.js.map +1 -0
  57. package/dist/ai-security/__tests__/stream.test.d.ts +1 -0
  58. package/dist/ai-security/__tests__/stream.test.js +85 -0
  59. package/dist/ai-security/__tests__/stream.test.js.map +1 -0
  60. package/dist/ai-security/config.d.ts +94 -0
  61. package/dist/ai-security/config.js +241 -0
  62. package/dist/ai-security/config.js.map +1 -0
  63. package/dist/ai-security/context.d.ts +45 -0
  64. package/dist/ai-security/context.js +108 -0
  65. package/dist/ai-security/context.js.map +1 -0
  66. package/dist/ai-security/custom-kinds.d.ts +23 -0
  67. package/dist/ai-security/custom-kinds.js +97 -0
  68. package/dist/ai-security/custom-kinds.js.map +1 -0
  69. package/dist/ai-security/events.d.ts +77 -0
  70. package/dist/ai-security/events.js +153 -0
  71. package/dist/ai-security/events.js.map +1 -0
  72. package/dist/ai-security/hooks.d.ts +48 -0
  73. package/dist/ai-security/hooks.js +461 -0
  74. package/dist/ai-security/hooks.js.map +1 -0
  75. package/dist/ai-security/index.d.ts +209 -0
  76. package/dist/ai-security/index.js +587 -0
  77. package/dist/ai-security/index.js.map +1 -0
  78. package/dist/ai-security/injection-rules.json +1024 -0
  79. package/dist/ai-security/injection.d.ts +46 -0
  80. package/dist/ai-security/injection.js +635 -0
  81. package/dist/ai-security/injection.js.map +1 -0
  82. package/dist/ai-security/jailbreak.d.ts +38 -0
  83. package/dist/ai-security/jailbreak.js +73 -0
  84. package/dist/ai-security/jailbreak.js.map +1 -0
  85. package/dist/ai-security/limits.d.ts +84 -0
  86. package/dist/ai-security/limits.js +195 -0
  87. package/dist/ai-security/limits.js.map +1 -0
  88. package/dist/ai-security/mcp.d.ts +82 -0
  89. package/dist/ai-security/mcp.js +150 -0
  90. package/dist/ai-security/mcp.js.map +1 -0
  91. package/dist/ai-security/output.d.ts +107 -0
  92. package/dist/ai-security/output.js +390 -0
  93. package/dist/ai-security/output.js.map +1 -0
  94. package/dist/ai-security/policy.d.ts +125 -0
  95. package/dist/ai-security/policy.js +196 -0
  96. package/dist/ai-security/policy.js.map +1 -0
  97. package/dist/ai-security/rag.d.ts +70 -0
  98. package/dist/ai-security/rag.js +174 -0
  99. package/dist/ai-security/rag.js.map +1 -0
  100. package/dist/ai-security/tool-rules.json +203 -0
  101. package/dist/ai-security/tools.d.ts +46 -0
  102. package/dist/ai-security/tools.js +62 -0
  103. package/dist/ai-security/tools.js.map +1 -0
  104. package/dist/budgets/__tests__/budgets.test.d.ts +1 -0
  105. package/dist/budgets/__tests__/budgets.test.js +134 -0
  106. package/dist/budgets/__tests__/budgets.test.js.map +1 -0
  107. package/dist/budgets/auto.d.ts +25 -0
  108. package/dist/budgets/auto.js +63 -0
  109. package/dist/budgets/auto.js.map +1 -0
  110. package/dist/budgets/index.d.ts +110 -0
  111. package/dist/budgets/index.js +239 -0
  112. package/dist/budgets/index.js.map +1 -0
  113. package/dist/customer/__tests__/customer.test.d.ts +1 -0
  114. package/dist/customer/__tests__/customer.test.js +155 -0
  115. package/dist/customer/__tests__/customer.test.js.map +1 -0
  116. package/dist/customer/index.d.ts +48 -0
  117. package/dist/customer/index.js +132 -0
  118. package/dist/customer/index.js.map +1 -0
  119. package/dist/destination.d.ts +14 -0
  120. package/dist/destination.js +16 -0
  121. package/dist/destination.js.map +1 -1
  122. package/dist/feedback/__tests__/feedback.test.d.ts +1 -0
  123. package/dist/feedback/__tests__/feedback.test.js +80 -0
  124. package/dist/feedback/__tests__/feedback.test.js.map +1 -0
  125. package/dist/feedback/index.d.ts +48 -0
  126. package/dist/feedback/index.js +97 -0
  127. package/dist/feedback/index.js.map +1 -0
  128. package/dist/flags/__tests__/flags.test.d.ts +1 -0
  129. package/dist/flags/__tests__/flags.test.js +301 -0
  130. package/dist/flags/__tests__/flags.test.js.map +1 -0
  131. package/dist/flags/client.d.ts +131 -0
  132. package/dist/flags/client.js +301 -0
  133. package/dist/flags/client.js.map +1 -0
  134. package/dist/flags/engine.d.ts +200 -0
  135. package/dist/flags/engine.js +677 -0
  136. package/dist/flags/engine.js.map +1 -0
  137. package/dist/flags/index.d.ts +4 -0
  138. package/dist/flags/index.js +16 -0
  139. package/dist/flags/index.js.map +1 -0
  140. package/dist/guard/__tests__/findings.test.js +1 -1
  141. package/dist/guard/__tests__/report.test.js +67 -0
  142. package/dist/guard/__tests__/report.test.js.map +1 -1
  143. package/dist/guard/heartbeat.d.ts +34 -0
  144. package/dist/guard/heartbeat.js +83 -0
  145. package/dist/guard/heartbeat.js.map +1 -0
  146. package/dist/guard/integration.d.ts +9 -0
  147. package/dist/guard/integration.js +4 -2
  148. package/dist/guard/integration.js.map +1 -1
  149. package/dist/guard/report.d.ts +24 -1
  150. package/dist/guard/report.js +67 -18
  151. package/dist/guard/report.js.map +1 -1
  152. package/dist/index.d.ts +88 -0
  153. package/dist/index.js +203 -2
  154. package/dist/index.js.map +1 -1
  155. package/dist/instrumentation/__tests__/langchain-wrapper.test.js +1 -1
  156. package/dist/instrumentation/__tests__/langchain-wrapper.test.js.map +1 -1
  157. package/dist/instrumentation/anthropic/wrapper.js +4 -0
  158. package/dist/instrumentation/anthropic/wrapper.js.map +1 -1
  159. package/dist/instrumentation/openai/wrapper.js +6 -0
  160. package/dist/instrumentation/openai/wrapper.js.map +1 -1
  161. package/dist/masking.d.ts +42 -0
  162. package/dist/masking.js +197 -0
  163. package/dist/masking.js.map +1 -0
  164. package/dist/otel/__tests__/app-logs-safety.test.d.ts +1 -0
  165. package/dist/otel/__tests__/app-logs-safety.test.js +129 -0
  166. package/dist/otel/__tests__/app-logs-safety.test.js.map +1 -0
  167. package/dist/otel/__tests__/app-logs.test.d.ts +1 -0
  168. package/dist/otel/__tests__/app-logs.test.js +269 -0
  169. package/dist/otel/__tests__/app-logs.test.js.map +1 -0
  170. package/dist/otel/__tests__/log-auto.test.d.ts +1 -0
  171. package/dist/otel/__tests__/log-auto.test.js +125 -0
  172. package/dist/otel/__tests__/log-auto.test.js.map +1 -0
  173. package/dist/otel/__tests__/log-bridges.test.d.ts +1 -0
  174. package/dist/otel/__tests__/log-bridges.test.js +170 -0
  175. package/dist/otel/__tests__/log-bridges.test.js.map +1 -0
  176. package/dist/otel/__tests__/system-metrics.test.d.ts +1 -0
  177. package/dist/otel/__tests__/system-metrics.test.js +79 -0
  178. package/dist/otel/__tests__/system-metrics.test.js.map +1 -0
  179. package/dist/otel/app-logs.d.ts +80 -0
  180. package/dist/otel/app-logs.js +195 -0
  181. package/dist/otel/app-logs.js.map +1 -0
  182. package/dist/otel/build-info.d.ts +2 -1
  183. package/dist/otel/build-info.js +3 -2
  184. package/dist/otel/build-info.js.map +1 -1
  185. package/dist/otel/events.d.ts +1 -0
  186. package/dist/otel/events.js +22 -13
  187. package/dist/otel/events.js.map +1 -1
  188. package/dist/otel/log-auto.d.ts +44 -0
  189. package/dist/otel/log-auto.js +200 -0
  190. package/dist/otel/log-auto.js.map +1 -0
  191. package/dist/otel/log-bridges.d.ts +54 -0
  192. package/dist/otel/log-bridges.js +307 -0
  193. package/dist/otel/log-bridges.js.map +1 -0
  194. package/dist/otel/metrics.js +1 -1
  195. package/dist/otel/metrics.js.map +1 -1
  196. package/dist/otel/system-metrics.d.ts +39 -0
  197. package/dist/otel/system-metrics.js +166 -0
  198. package/dist/otel/system-metrics.js.map +1 -0
  199. package/dist/otel/tracing.js +6 -2
  200. package/dist/otel/tracing.js.map +1 -1
  201. package/dist/protect/__tests__/protect.test.js +4 -0
  202. package/dist/protect/__tests__/protect.test.js.map +1 -1
  203. package/dist/protect/index.js +9 -4
  204. package/dist/protect/index.js.map +1 -1
  205. package/dist/rasp/__tests__/auto-http.test.d.ts +1 -0
  206. package/dist/rasp/__tests__/auto-http.test.js +136 -0
  207. package/dist/rasp/__tests__/auto-http.test.js.map +1 -0
  208. package/dist/rasp/__tests__/baseline.test.d.ts +1 -0
  209. package/dist/rasp/__tests__/baseline.test.js +86 -0
  210. package/dist/rasp/__tests__/baseline.test.js.map +1 -0
  211. package/dist/rasp/__tests__/benign-corpus.test.d.ts +1 -0
  212. package/dist/rasp/__tests__/benign-corpus.test.js +68 -0
  213. package/dist/rasp/__tests__/benign-corpus.test.js.map +1 -0
  214. package/dist/rasp/__tests__/capture-context.test.d.ts +1 -0
  215. package/dist/rasp/__tests__/capture-context.test.js +135 -0
  216. package/dist/rasp/__tests__/capture-context.test.js.map +1 -0
  217. package/dist/rasp/__tests__/code-hook.test.d.ts +1 -0
  218. package/dist/rasp/__tests__/code-hook.test.js +218 -0
  219. package/dist/rasp/__tests__/code-hook.test.js.map +1 -0
  220. package/dist/rasp/__tests__/config-client.test.d.ts +1 -0
  221. package/dist/rasp/__tests__/config-client.test.js +283 -0
  222. package/dist/rasp/__tests__/config-client.test.js.map +1 -0
  223. package/dist/rasp/__tests__/corpus.d.ts +13 -0
  224. package/dist/rasp/__tests__/corpus.js +111 -0
  225. package/dist/rasp/__tests__/corpus.js.map +1 -0
  226. package/dist/rasp/__tests__/custom-rules.test.d.ts +1 -0
  227. package/dist/rasp/__tests__/custom-rules.test.js +276 -0
  228. package/dist/rasp/__tests__/custom-rules.test.js.map +1 -0
  229. package/dist/rasp/__tests__/db-hook.test.d.ts +1 -0
  230. package/dist/rasp/__tests__/db-hook.test.js +438 -0
  231. package/dist/rasp/__tests__/db-hook.test.js.map +1 -0
  232. package/dist/rasp/__tests__/deception.test.d.ts +1 -0
  233. package/dist/rasp/__tests__/deception.test.js +567 -0
  234. package/dist/rasp/__tests__/deception.test.js.map +1 -0
  235. package/dist/rasp/__tests__/detect.test.d.ts +1 -0
  236. package/dist/rasp/__tests__/detect.test.js +276 -0
  237. package/dist/rasp/__tests__/detect.test.js.map +1 -0
  238. package/dist/rasp/__tests__/esm-exports.test.d.ts +1 -0
  239. package/dist/rasp/__tests__/esm-exports.test.js +20 -0
  240. package/dist/rasp/__tests__/esm-exports.test.js.map +1 -0
  241. package/dist/rasp/__tests__/fs-hook.test.d.ts +1 -0
  242. package/dist/rasp/__tests__/fs-hook.test.js +241 -0
  243. package/dist/rasp/__tests__/fs-hook.test.js.map +1 -0
  244. package/dist/rasp/__tests__/hook-contracts.test.d.ts +1 -0
  245. package/dist/rasp/__tests__/hook-contracts.test.js +201 -0
  246. package/dist/rasp/__tests__/hook-contracts.test.js.map +1 -0
  247. package/dist/rasp/__tests__/hook-kit.d.ts +42 -0
  248. package/dist/rasp/__tests__/hook-kit.js +139 -0
  249. package/dist/rasp/__tests__/hook-kit.js.map +1 -0
  250. package/dist/rasp/__tests__/http-hook.test.d.ts +1 -0
  251. package/dist/rasp/__tests__/http-hook.test.js +250 -0
  252. package/dist/rasp/__tests__/http-hook.test.js.map +1 -0
  253. package/dist/rasp/__tests__/iast.test.d.ts +1 -0
  254. package/dist/rasp/__tests__/iast.test.js +361 -0
  255. package/dist/rasp/__tests__/iast.test.js.map +1 -0
  256. package/dist/rasp/__tests__/include-hook.test.d.ts +1 -0
  257. package/dist/rasp/__tests__/include-hook.test.js +122 -0
  258. package/dist/rasp/__tests__/include-hook.test.js.map +1 -0
  259. package/dist/rasp/__tests__/middleware.test.d.ts +1 -0
  260. package/dist/rasp/__tests__/middleware.test.js +302 -0
  261. package/dist/rasp/__tests__/middleware.test.js.map +1 -0
  262. package/dist/rasp/__tests__/process-hook.test.d.ts +1 -0
  263. package/dist/rasp/__tests__/process-hook.test.js +238 -0
  264. package/dist/rasp/__tests__/process-hook.test.js.map +1 -0
  265. package/dist/rasp/__tests__/reporter.test.d.ts +1 -0
  266. package/dist/rasp/__tests__/reporter.test.js +114 -0
  267. package/dist/rasp/__tests__/reporter.test.js.map +1 -0
  268. package/dist/rasp/__tests__/route.test.d.ts +1 -0
  269. package/dist/rasp/__tests__/route.test.js +46 -0
  270. package/dist/rasp/__tests__/route.test.js.map +1 -0
  271. package/dist/rasp/__tests__/rule-expr.test.d.ts +1 -0
  272. package/dist/rasp/__tests__/rule-expr.test.js +151 -0
  273. package/dist/rasp/__tests__/rule-expr.test.js.map +1 -0
  274. package/dist/rasp/__tests__/rule-phases.test.d.ts +1 -0
  275. package/dist/rasp/__tests__/rule-phases.test.js +271 -0
  276. package/dist/rasp/__tests__/rule-phases.test.js.map +1 -0
  277. package/dist/rasp/__tests__/sinks-hook.test.d.ts +1 -0
  278. package/dist/rasp/__tests__/sinks-hook.test.js +177 -0
  279. package/dist/rasp/__tests__/sinks-hook.test.js.map +1 -0
  280. package/dist/rasp/__tests__/targets.test.d.ts +1 -0
  281. package/dist/rasp/__tests__/targets.test.js +82 -0
  282. package/dist/rasp/__tests__/targets.test.js.map +1 -0
  283. package/dist/rasp/__tests__/template-hook.test.d.ts +1 -0
  284. package/dist/rasp/__tests__/template-hook.test.js +254 -0
  285. package/dist/rasp/__tests__/template-hook.test.js.map +1 -0
  286. package/dist/rasp/__tests__/upload.test.d.ts +1 -0
  287. package/dist/rasp/__tests__/upload.test.js +81 -0
  288. package/dist/rasp/__tests__/upload.test.js.map +1 -0
  289. package/dist/rasp/__tests__/vpatch-engine.test.d.ts +1 -0
  290. package/dist/rasp/__tests__/vpatch-engine.test.js +177 -0
  291. package/dist/rasp/__tests__/vpatch-engine.test.js.map +1 -0
  292. package/dist/rasp/auto-http.d.ts +6 -0
  293. package/dist/rasp/auto-http.js +194 -0
  294. package/dist/rasp/auto-http.js.map +1 -0
  295. package/dist/rasp/baseline.d.ts +35 -0
  296. package/dist/rasp/baseline.js +91 -0
  297. package/dist/rasp/baseline.js.map +1 -0
  298. package/dist/rasp/capture.d.ts +76 -0
  299. package/dist/rasp/capture.js +304 -0
  300. package/dist/rasp/capture.js.map +1 -0
  301. package/dist/rasp/config-client.d.ts +122 -0
  302. package/dist/rasp/config-client.js +337 -0
  303. package/dist/rasp/config-client.js.map +1 -0
  304. package/dist/rasp/context.d.ts +65 -0
  305. package/dist/rasp/context.js +68 -0
  306. package/dist/rasp/context.js.map +1 -0
  307. package/dist/rasp/custom-rules.d.ts +68 -0
  308. package/dist/rasp/custom-rules.js +222 -0
  309. package/dist/rasp/custom-rules.js.map +1 -0
  310. package/dist/rasp/data/default-rules.json +199 -0
  311. package/dist/rasp/data/default-sinks.json +4 -0
  312. package/dist/rasp/data/dnslog-domains.json +11 -0
  313. package/dist/rasp/deception.d.ts +70 -0
  314. package/dist/rasp/deception.js +220 -0
  315. package/dist/rasp/deception.js.map +1 -0
  316. package/dist/rasp/detect.d.ts +68 -0
  317. package/dist/rasp/detect.js +671 -0
  318. package/dist/rasp/detect.js.map +1 -0
  319. package/dist/rasp/engine.d.ts +107 -0
  320. package/dist/rasp/engine.js +330 -0
  321. package/dist/rasp/engine.js.map +1 -0
  322. package/dist/rasp/hooks/code.d.ts +20 -0
  323. package/dist/rasp/hooks/code.js +334 -0
  324. package/dist/rasp/hooks/code.js.map +1 -0
  325. package/dist/rasp/hooks/db.d.ts +48 -0
  326. package/dist/rasp/hooks/db.js +322 -0
  327. package/dist/rasp/hooks/db.js.map +1 -0
  328. package/dist/rasp/hooks/esm.d.ts +7 -0
  329. package/dist/rasp/hooks/esm.js +18 -0
  330. package/dist/rasp/hooks/esm.js.map +1 -0
  331. package/dist/rasp/hooks/fs.d.ts +3 -0
  332. package/dist/rasp/hooks/fs.js +206 -0
  333. package/dist/rasp/hooks/fs.js.map +1 -0
  334. package/dist/rasp/hooks/http.d.ts +4 -0
  335. package/dist/rasp/hooks/http.js +213 -0
  336. package/dist/rasp/hooks/http.js.map +1 -0
  337. package/dist/rasp/hooks/include.d.ts +9 -0
  338. package/dist/rasp/hooks/include.js +79 -0
  339. package/dist/rasp/hooks/include.js.map +1 -0
  340. package/dist/rasp/hooks/marks.d.ts +2 -0
  341. package/dist/rasp/hooks/marks.js +16 -0
  342. package/dist/rasp/hooks/marks.js.map +1 -0
  343. package/dist/rasp/hooks/process.d.ts +22 -0
  344. package/dist/rasp/hooks/process.js +191 -0
  345. package/dist/rasp/hooks/process.js.map +1 -0
  346. package/dist/rasp/hooks/sinks.d.ts +54 -0
  347. package/dist/rasp/hooks/sinks.js +329 -0
  348. package/dist/rasp/hooks/sinks.js.map +1 -0
  349. package/dist/rasp/hooks/template.d.ts +21 -0
  350. package/dist/rasp/hooks/template.js +152 -0
  351. package/dist/rasp/hooks/template.js.map +1 -0
  352. package/dist/rasp/iast-rules.d.ts +82 -0
  353. package/dist/rasp/iast-rules.js +240 -0
  354. package/dist/rasp/iast-rules.js.map +1 -0
  355. package/dist/rasp/iast-scope.d.ts +29 -0
  356. package/dist/rasp/iast-scope.js +54 -0
  357. package/dist/rasp/iast-scope.js.map +1 -0
  358. package/dist/rasp/iast.d.ts +81 -0
  359. package/dist/rasp/iast.js +272 -0
  360. package/dist/rasp/iast.js.map +1 -0
  361. package/dist/rasp/index.d.ts +52 -0
  362. package/dist/rasp/index.js +280 -0
  363. package/dist/rasp/index.js.map +1 -0
  364. package/dist/rasp/lexers.d.ts +32 -0
  365. package/dist/rasp/lexers.js +444 -0
  366. package/dist/rasp/lexers.js.map +1 -0
  367. package/dist/rasp/middleware.d.ts +155 -0
  368. package/dist/rasp/middleware.js +568 -0
  369. package/dist/rasp/middleware.js.map +1 -0
  370. package/dist/rasp/model-output.d.ts +14 -0
  371. package/dist/rasp/model-output.js +107 -0
  372. package/dist/rasp/model-output.js.map +1 -0
  373. package/dist/rasp/normalize.d.ts +23 -0
  374. package/dist/rasp/normalize.js +140 -0
  375. package/dist/rasp/normalize.js.map +1 -0
  376. package/dist/rasp/reporter.d.ts +60 -0
  377. package/dist/rasp/reporter.js +230 -0
  378. package/dist/rasp/reporter.js.map +1 -0
  379. package/dist/rasp/rule-expr.d.ts +236 -0
  380. package/dist/rasp/rule-expr.js +1253 -0
  381. package/dist/rasp/rule-expr.js.map +1 -0
  382. package/dist/rasp/template.d.ts +53 -0
  383. package/dist/rasp/template.js +336 -0
  384. package/dist/rasp/template.js.map +1 -0
  385. package/dist/rasp/types.d.ts +110 -0
  386. package/dist/rasp/types.js +51 -0
  387. package/dist/rasp/types.js.map +1 -0
  388. package/dist/rasp/vpatch.d.ts +55 -0
  389. package/dist/rasp/vpatch.js +120 -0
  390. package/dist/rasp/vpatch.js.map +1 -0
  391. package/dist/register.js +52 -11
  392. package/dist/register.js.map +1 -1
  393. package/dist/semantic-convention.d.ts +2 -0
  394. package/dist/semantic-convention.js +5 -0
  395. package/dist/semantic-convention.js.map +1 -1
  396. package/dist/types.d.ts +77 -1
  397. package/dist/zero-code.d.ts +8 -0
  398. package/dist/zero-code.js +38 -0
  399. package/dist/zero-code.js.map +1 -0
  400. package/package.json +18 -2
@@ -0,0 +1,32 @@
1
+ /**
2
+ * One-pass lexers used by the structural checks: SQL, shell and a generic
3
+ * C-like lexer for code. No regex backtracking; every loop advances.
4
+ */
5
+ export type Token = {
6
+ s: number;
7
+ e: number;
8
+ kind: string;
9
+ text: string;
10
+ };
11
+ export type SqlDialect = 'mysql' | 'postgres' | 'sqlite' | 'mssql' | 'oracle' | 'db2' | 'generic';
12
+ /** Every SQL dialect the lexer knows (README "SQL"). */
13
+ export declare const SQL_DIALECTS: readonly SqlDialect[];
14
+ /**
15
+ * SQL keywords that are not data: OpenRASP's anti-detect list (README
16
+ * "SQL", rule 1). sqli.userinput ignores them; passive IAST never takes one
17
+ * for an identifier from input.
18
+ */
19
+ export declare const SQL_KEYWORDS: ReadonlySet<string>;
20
+ /** Tokenises SQL per the contract's lexer. */
21
+ export declare function sqlTokens(q: string, dialect?: SqlDialect): Token[];
22
+ /** Shell tokens; `sq[i]` marks characters inside single quotes. */
23
+ export declare function shellTokens(cmd: string): {
24
+ tokens: Token[];
25
+ inSingle: Uint8Array;
26
+ };
27
+ /** A generic C-like lexer: identifiers, numbers, quoted strings, comments, punctuation. */
28
+ export declare function codeTokens(src: string): Token[];
29
+ /** Tokens overlapping [idx, idx+len). */
30
+ export declare function overlapping(tokens: Token[], idx: number, len: number): Token[];
31
+ /** Start offsets of `needle` in `hay`, at most `max`. */
32
+ export declare function occurrences(hay: string, needle: string, max?: number): number[];
@@ -0,0 +1,444 @@
1
+ "use strict";
2
+ /**
3
+ * One-pass lexers used by the structural checks: SQL, shell and a generic
4
+ * C-like lexer for code. No regex backtracking; every loop advances.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.SQL_KEYWORDS = exports.SQL_DIALECTS = void 0;
8
+ exports.sqlTokens = sqlTokens;
9
+ exports.shellTokens = shellTokens;
10
+ exports.codeTokens = codeTokens;
11
+ exports.overlapping = overlapping;
12
+ exports.occurrences = occurrences;
13
+ /** Every SQL dialect the lexer knows (README "SQL"). */
14
+ exports.SQL_DIALECTS = ['mysql', 'postgres', 'sqlite', 'mssql', 'oracle', 'db2', 'generic'];
15
+ const isSpace = (c) => c === ' ' || c === '\t' || c === '\n' || c === '\r' || c === '\f' || c === '\v';
16
+ const isDigit = (c) => c >= '0' && c <= '9';
17
+ const isIdStart = (c) => (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c === '_';
18
+ const isIdChar = (c) => isIdStart(c) || isDigit(c) || c === '$';
19
+ const isHex = (c) => isDigit(c) || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F');
20
+ /**
21
+ * SQL keywords that are not data: OpenRASP's anti-detect list (README
22
+ * "SQL", rule 1). sqli.userinput ignores them; passive IAST never takes one
23
+ * for an identifier from input.
24
+ */
25
+ exports.SQL_KEYWORDS = new Set('add all alter analyze and any as asc avg begin between by case create count delete desc do dumpfile else elseif end exists false file float flush follows from group having identified if in insert interval into join last like limit loop not null on or order procedure regexp return rlike select then true union update values xor'.split(' '));
26
+ const SQL_OPS = ['->>', '<=', '>=', '<>', '!=', '||', '&&', '::', ':=', '->', '<<', '>>'];
27
+ /** Tokenises SQL per the contract's lexer. */
28
+ function sqlTokens(q, dialect = 'generic') {
29
+ const out = [];
30
+ const n = q.length;
31
+ const hashComment = dialect === 'mysql' || dialect === 'generic';
32
+ const bracketIdent = dialect === 'mssql' || dialect === 'generic';
33
+ const dollarQuote = dialect === 'postgres' || dialect === 'generic';
34
+ const oracle = dialect === 'oracle';
35
+ const db2 = dialect === 'db2';
36
+ // E'' (backslash escapes) is not a prefix in Oracle or DB2.
37
+ const ePrefix = !oracle && !db2;
38
+ // Oracle and DB2 identifiers may contain '#' after the first character.
39
+ const idChar = oracle || db2 ? (c) => isIdChar(c) || c === '#' : isIdChar;
40
+ let i = 0;
41
+ const push = (s, e, kind) => out.push({ s, e, kind, text: q.slice(s, e) });
42
+ // Reads a quoted run starting at i (q[i] is the quote); returns the end index.
43
+ const quoted = (start, close, backslash) => {
44
+ let j = start + 1;
45
+ while (j < n) {
46
+ const c = q[j];
47
+ if (backslash && c === '\\') {
48
+ j += 2;
49
+ continue;
50
+ }
51
+ if (c === close) {
52
+ if (q[j + 1] === close) {
53
+ j += 2;
54
+ continue;
55
+ }
56
+ return j + 1;
57
+ }
58
+ j++;
59
+ }
60
+ return n;
61
+ };
62
+ // A name part: identifier or quoted identifier; returns end or -1.
63
+ const namePart = (j) => {
64
+ const c = q[j];
65
+ if (c !== undefined && isIdStart(c)) {
66
+ let k = j + 1;
67
+ while (k < n && idChar(q[k]))
68
+ k++;
69
+ return k;
70
+ }
71
+ if (c === '"' || c === '`')
72
+ return quoted(j, c, false);
73
+ if (c === '[' && bracketIdent)
74
+ return quoted(j, ']', false);
75
+ return -1;
76
+ };
77
+ // Oracle alternative quoting q'X…X' (also nq'…'), the quote at j; returns end or -1.
78
+ // The delimiter X is one character (a code point, so possibly multibyte) other than whitespace.
79
+ const altQuoted = (j) => {
80
+ const d = q[j + 1];
81
+ if (d === undefined || isSpace(d))
82
+ return -1;
83
+ const pair = d >= '\uD800' && d <= '\uDBFF' && (q[j + 2] ?? '') >= '\uDC00' && (q[j + 2] ?? '') <= '\uDFFF';
84
+ const open = pair ? q.slice(j + 1, j + 3) : d;
85
+ const close = open === '[' ? ']' : open === '{' ? '}' : open === '(' ? ')' : open === '<' ? '>' : open;
86
+ const k = q.indexOf(close + "'", j + 1 + open.length);
87
+ return k < 0 ? n : k + close.length + 1;
88
+ };
89
+ // A block comment starting at i; nests in db2, postgres and mssql.
90
+ const nestedComments = dialect === 'db2' || dialect === 'postgres' || dialect === 'mssql';
91
+ const blockComment = (i) => {
92
+ if (!nestedComments) {
93
+ const k = q.indexOf('*/', i + 2);
94
+ return k < 0 ? n : k + 2;
95
+ }
96
+ let depth = 1;
97
+ let k = i + 2;
98
+ while (k < n) {
99
+ if (q[k] === '/' && q[k + 1] === '*') {
100
+ depth++;
101
+ k += 2;
102
+ }
103
+ else if (q[k] === '*' && q[k + 1] === '/') {
104
+ k += 2;
105
+ if (--depth === 0)
106
+ return k;
107
+ }
108
+ else
109
+ k++;
110
+ }
111
+ return n;
112
+ };
113
+ while (i < n) {
114
+ const c = q[i];
115
+ if (isSpace(c)) {
116
+ i++;
117
+ continue;
118
+ }
119
+ const start = i;
120
+ // comments
121
+ if (c === '-' && q[i + 1] === '-') {
122
+ const k = q.indexOf('\n', i);
123
+ i = k < 0 ? n : k;
124
+ push(start, i, 'comment');
125
+ continue;
126
+ }
127
+ if (c === '#' && hashComment) {
128
+ const k = q.indexOf('\n', i);
129
+ i = k < 0 ? n : k;
130
+ push(start, i, 'comment');
131
+ continue;
132
+ }
133
+ if (c === '/' && q[i + 1] === '*') {
134
+ i = blockComment(i);
135
+ push(start, i, q[start + 2] === '!' ? 'version_comment' : 'comment');
136
+ continue;
137
+ }
138
+ // strings, with E'' / N'' prefixes
139
+ if (c === "'") {
140
+ i = quoted(i, "'", dialect === 'mysql');
141
+ push(start, i, 'string');
142
+ continue;
143
+ }
144
+ if (oracle) {
145
+ // q'…' / nq'…' alternative quoting
146
+ const p = c === 'N' || c === 'n' ? i + 1 : i;
147
+ if ((q[p] === 'q' || q[p] === 'Q') && q[p + 1] === "'") {
148
+ const k = altQuoted(p + 1);
149
+ if (k > 0) {
150
+ i = k;
151
+ push(start, i, 'string');
152
+ continue;
153
+ }
154
+ }
155
+ }
156
+ if (db2) {
157
+ // X'' hex, G'' graphic, GX'' / UX'' / BX'' hex strings
158
+ const x = (ch) => ch === 'X' || ch === 'x';
159
+ const g = c === 'G' || c === 'g';
160
+ const p = (g || c === 'U' || c === 'u' || c === 'B' || c === 'b') && x(q[i + 1]) ? i + 1 : i;
161
+ if ((p > i || g || x(c)) && q[p + 1] === "'") {
162
+ i = quoted(p + 1, "'", false);
163
+ push(start, i, 'string');
164
+ continue;
165
+ }
166
+ }
167
+ if ((((c === 'E' || c === 'e') && ePrefix) || c === 'N' || c === 'n') && q[i + 1] === "'") {
168
+ i = quoted(i + 1, "'", dialect === 'mysql' || c === 'E' || c === 'e');
169
+ push(start, i, 'string');
170
+ continue;
171
+ }
172
+ // dollar quotes and $n placeholders
173
+ if (c === '$') {
174
+ if (isDigit(q[i + 1] ?? '')) {
175
+ let k = i + 1;
176
+ while (k < n && isDigit(q[k]))
177
+ k++;
178
+ i = k;
179
+ push(start, i, 'placeholder');
180
+ continue;
181
+ }
182
+ if (dollarQuote) {
183
+ let k = i + 1;
184
+ while (k < n && (isIdStart(q[k]) || isDigit(q[k])))
185
+ k++;
186
+ if (q[k] === '$') {
187
+ const tag = q.slice(i, k + 1);
188
+ const end = q.indexOf(tag, k + 1);
189
+ i = end < 0 ? n : end + tag.length;
190
+ push(start, i, 'string');
191
+ continue;
192
+ }
193
+ }
194
+ }
195
+ // placeholders
196
+ if (c === '?') {
197
+ i++;
198
+ push(start, i, 'placeholder');
199
+ continue;
200
+ }
201
+ if ((c === ':' || c === '@') && isIdStart(q[i + 1] ?? '') && !(c === ':' && q[i - 1] === ':')) {
202
+ let k = i + 1;
203
+ while (k < n && idChar(q[k]))
204
+ k++;
205
+ i = k;
206
+ push(start, i, 'placeholder');
207
+ continue;
208
+ }
209
+ if (oracle && c === ':' && isDigit(q[i + 1] ?? '') && q[i - 1] !== ':') {
210
+ // Oracle positional bind :1
211
+ let k = i + 1;
212
+ while (k < n && isDigit(q[k]))
213
+ k++;
214
+ i = k;
215
+ push(start, i, 'placeholder');
216
+ continue;
217
+ }
218
+ if (c === '@' && q[i + 1] === '@' && isIdStart(q[i + 2] ?? '')) {
219
+ let k = i + 2;
220
+ while (k < n && isIdChar(q[k]))
221
+ k++;
222
+ i = k;
223
+ push(start, i, 'word');
224
+ continue;
225
+ }
226
+ if (c === '%' && q[i + 1] === 's') {
227
+ i += 2;
228
+ push(start, i, 'placeholder');
229
+ continue;
230
+ }
231
+ if (c === '%' && q[i + 1] === '(') {
232
+ const k = q.indexOf(')', i + 2);
233
+ if (k > 0 && q[k + 1] === 's') {
234
+ i = k + 2;
235
+ push(start, i, 'placeholder');
236
+ continue;
237
+ }
238
+ }
239
+ // numbers
240
+ if (isDigit(c) || (c === '.' && isDigit(q[i + 1] ?? ''))) {
241
+ let k = i;
242
+ if (c === '0' && (q[i + 1] === 'x' || q[i + 1] === 'X')) {
243
+ k = i + 2;
244
+ while (k < n && isHex(q[k]))
245
+ k++;
246
+ }
247
+ else {
248
+ while (k < n && isDigit(q[k]))
249
+ k++;
250
+ if (q[k] === '.') {
251
+ k++;
252
+ while (k < n && isDigit(q[k]))
253
+ k++;
254
+ }
255
+ if ((q[k] === 'e' || q[k] === 'E') && (isDigit(q[k + 1] ?? '') || ((q[k + 1] === '+' || q[k + 1] === '-') && isDigit(q[k + 2] ?? '')))) {
256
+ k += 2;
257
+ while (k < n && isDigit(q[k]))
258
+ k++;
259
+ }
260
+ }
261
+ i = k;
262
+ push(start, i, 'number');
263
+ continue;
264
+ }
265
+ // identifiers and qualified names (one token)
266
+ const first = namePart(i);
267
+ if (first > 0) {
268
+ let k = first;
269
+ while (q[k] === '.') {
270
+ const next = namePart(k + 1);
271
+ if (next < 0)
272
+ break;
273
+ k = next;
274
+ }
275
+ i = k;
276
+ push(start, i, isIdStart(c) && k === first ? 'word' : 'name');
277
+ continue;
278
+ }
279
+ // operators
280
+ const op = SQL_OPS.find((o) => q.startsWith(o, i));
281
+ i += op ? op.length : 1;
282
+ push(start, i, 'op');
283
+ }
284
+ return out;
285
+ }
286
+ const SHELL_OPS = ['&&', '||', '>>', '<<', '$(', ';', '&', '|', '>', '<', '(', ')', '`', '\n'];
287
+ /** Shell tokens; `sq[i]` marks characters inside single quotes. */
288
+ function shellTokens(cmd) {
289
+ const out = [];
290
+ const inSingle = new Uint8Array(cmd.length);
291
+ const n = cmd.length;
292
+ let i = 0;
293
+ let wordStart = -1;
294
+ let dq = false;
295
+ const endWord = (e) => {
296
+ if (wordStart >= 0 && e > wordStart)
297
+ out.push({ s: wordStart, e, kind: 'word', text: cmd.slice(wordStart, e) });
298
+ wordStart = -1;
299
+ };
300
+ while (i < n) {
301
+ const c = cmd[i];
302
+ if (!dq) {
303
+ if (c === ' ' || c === '\t') {
304
+ endWord(i);
305
+ i++;
306
+ continue;
307
+ }
308
+ const op = SHELL_OPS.find((o) => cmd.startsWith(o, i));
309
+ if (op) {
310
+ endWord(i);
311
+ out.push({ s: i, e: i + op.length, kind: 'op', text: op });
312
+ i += op.length;
313
+ continue;
314
+ }
315
+ if (wordStart < 0)
316
+ wordStart = i;
317
+ if (c === '\\') {
318
+ i += 2;
319
+ continue;
320
+ }
321
+ if (c === "'") {
322
+ const k = cmd.indexOf("'", i + 1);
323
+ const end = k < 0 ? n : k + 1;
324
+ inSingle.fill(1, i, end);
325
+ i = end;
326
+ continue;
327
+ }
328
+ if (c === '"') {
329
+ dq = true;
330
+ i++;
331
+ continue;
332
+ }
333
+ i++;
334
+ continue;
335
+ }
336
+ // inside double quotes
337
+ if (c === '\\') {
338
+ if (wordStart < 0)
339
+ wordStart = i;
340
+ i += 2;
341
+ continue;
342
+ }
343
+ if (c === '"') {
344
+ if (wordStart < 0)
345
+ wordStart = i;
346
+ dq = false;
347
+ i++;
348
+ continue;
349
+ }
350
+ if (c === '`' || (c === '$' && cmd[i + 1] === '(')) {
351
+ endWord(i);
352
+ const len = c === '`' ? 1 : 2;
353
+ out.push({ s: i, e: i + len, kind: 'op', text: cmd.slice(i, i + len) });
354
+ i += len;
355
+ continue;
356
+ }
357
+ if (wordStart < 0)
358
+ wordStart = i;
359
+ i++;
360
+ }
361
+ endWord(n);
362
+ return { tokens: out, inSingle };
363
+ }
364
+ /** A generic C-like lexer: identifiers, numbers, quoted strings, comments, punctuation. */
365
+ function codeTokens(src) {
366
+ const out = [];
367
+ const n = src.length;
368
+ let i = 0;
369
+ while (i < n) {
370
+ const c = src[i];
371
+ if (isSpace(c)) {
372
+ i++;
373
+ continue;
374
+ }
375
+ const s = i;
376
+ if (c === '/' && src[i + 1] === '/') {
377
+ const k = src.indexOf('\n', i);
378
+ i = k < 0 ? n : k;
379
+ out.push({ s, e: i, kind: 'comment', text: src.slice(s, i) });
380
+ continue;
381
+ }
382
+ if (c === '/' && src[i + 1] === '*') {
383
+ const k = src.indexOf('*/', i + 2);
384
+ i = k < 0 ? n : k + 2;
385
+ out.push({ s, e: i, kind: 'comment', text: src.slice(s, i) });
386
+ continue;
387
+ }
388
+ if (c === '"' || c === "'" || c === '`') {
389
+ let k = i + 1;
390
+ while (k < n && src[k] !== c)
391
+ k += src[k] === '\\' ? 2 : 1;
392
+ i = Math.min(n, k + 1);
393
+ out.push({ s, e: i, kind: 'string', text: src.slice(s, i) });
394
+ continue;
395
+ }
396
+ if (isDigit(c)) {
397
+ let k = i + 1;
398
+ while (k < n && (isIdChar(src[k]) || src[k] === '.'))
399
+ k++;
400
+ i = k;
401
+ out.push({ s, e: i, kind: 'number', text: src.slice(s, i) });
402
+ continue;
403
+ }
404
+ if (isIdStart(c) || c === '$' || c.charCodeAt(0) > 127) {
405
+ let k = i + 1;
406
+ while (k < n && (isIdChar(src[k]) || src.charCodeAt(k) > 127))
407
+ k++;
408
+ i = k;
409
+ out.push({ s, e: i, kind: 'word', text: src.slice(s, i) });
410
+ continue;
411
+ }
412
+ i++;
413
+ out.push({ s, e: i, kind: 'op', text: c });
414
+ }
415
+ return out;
416
+ }
417
+ /** Tokens overlapping [idx, idx+len). */
418
+ function overlapping(tokens, idx, len) {
419
+ const end = idx + len;
420
+ const out = [];
421
+ for (const t of tokens) {
422
+ if (t.s >= end)
423
+ break;
424
+ if (t.e > idx)
425
+ out.push(t);
426
+ }
427
+ return out;
428
+ }
429
+ /** Start offsets of `needle` in `hay`, at most `max`. */
430
+ function occurrences(hay, needle, max = 8) {
431
+ const out = [];
432
+ if (!needle)
433
+ return out;
434
+ let from = 0;
435
+ while (out.length < max) {
436
+ const i = hay.indexOf(needle, from);
437
+ if (i < 0)
438
+ break;
439
+ out.push(i);
440
+ from = i + 1;
441
+ }
442
+ return out;
443
+ }
444
+ //# sourceMappingURL=lexers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexers.js","sourceRoot":"","sources":["../../src/rasp/lexers.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AA4BH,8BAgPC;AAKD,kCAsEC;AAGD,gCAgDC;AAGD,kCAQC;AAGD,kCAWC;AA9ZD,wDAAwD;AAC3C,QAAA,YAAY,GAA0B,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;AAExH,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC;AAC/G,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC;AACpD,MAAM,SAAS,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC;AAC/F,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC;AACxE,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;AAE5F;;;;GAIG;AACU,QAAA,YAAY,GAAwB,IAAI,GAAG,CACtD,yUAAyU,CAAC,KAAK,CAC7U,GAAG,CACJ,CACF,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAE1F,8CAA8C;AAC9C,SAAgB,SAAS,CAAC,CAAS,EAAE,UAAsB,SAAS;IAClE,MAAM,GAAG,GAAY,EAAE,CAAC;IACxB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,MAAM,WAAW,GAAG,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,SAAS,CAAC;IACjE,MAAM,YAAY,GAAG,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,SAAS,CAAC;IAClE,MAAM,WAAW,GAAG,OAAO,KAAK,UAAU,IAAI,OAAO,KAAK,SAAS,CAAC;IACpE,MAAM,MAAM,GAAG,OAAO,KAAK,QAAQ,CAAC;IACpC,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,CAAC;IAC9B,4DAA4D;IAC5D,MAAM,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC;IAChC,wEAAwE;IACxE,MAAM,MAAM,GAAG,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;IAClF,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,IAAY,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAEnG,+EAA+E;IAC/E,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,KAAa,EAAE,SAAkB,EAAU,EAAE;QAC1E,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACf,IAAI,SAAS,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC5B,CAAC,IAAI,CAAC,CAAC;gBACP,SAAS;YACX,CAAC;YACD,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;gBAChB,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;oBACvB,CAAC,IAAI,CAAC,CAAC;oBACP,SAAS;gBACX,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,CAAC;YACf,CAAC;YACD,CAAC,EAAE,CAAC;QACN,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;IACF,mEAAmE;IACnE,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAU,EAAE;QACrC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACf,IAAI,CAAC,KAAK,SAAS,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAE,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG;YAAE,OAAO,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,GAAG,IAAI,YAAY;YAAE,OAAO,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAC5D,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC,CAAC;IACF,qFAAqF;IACrF,gGAAgG;IAChG,MAAM,SAAS,GAAG,CAAC,CAAS,EAAU,EAAE;QACtC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACnB,IAAI,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,CAAC,IAAI,QAAQ,IAAI,CAAC,IAAI,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,QAAQ,CAAC;QAC5G,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QACvG,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1C,CAAC,CAAC;IACF,mEAAmE;IACnE,MAAM,cAAc,GAAG,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,UAAU,IAAI,OAAO,KAAK,OAAO,CAAC;IAC1F,MAAM,YAAY,GAAG,CAAC,CAAS,EAAU,EAAE;QACzC,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACb,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACrC,KAAK,EAAE,CAAC;gBACR,CAAC,IAAI,CAAC,CAAC;YACT,CAAC;iBAAM,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBAC5C,CAAC,IAAI,CAAC,CAAC;gBACP,IAAI,EAAE,KAAK,KAAK,CAAC;oBAAE,OAAO,CAAC,CAAC;YAC9B,CAAC;;gBAAM,CAAC,EAAE,CAAC;QACb,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACf,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YACf,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,CAAC,CAAC;QAChB,WAAW;QACX,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAClC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC7B,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClB,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;YAC1B,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;YAC7B,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC7B,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClB,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;YAC1B,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAClC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACrE,SAAS;QACX,CAAC;QACD,mCAAmC;QACnC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACd,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC;YACxC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;YACzB,SAAS;QACX,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACX,mCAAmC;YACnC,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7C,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACvD,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC3B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBACV,CAAC,GAAG,CAAC,CAAC;oBACN,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;oBACzB,SAAS;gBACX,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,GAAG,EAAE,CAAC;YACR,uDAAuD;YACvD,MAAM,CAAC,GAAG,CAAC,EAAsB,EAAE,EAAE,CAAC,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,CAAC;YAC/D,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC;YACjC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7F,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBAC7C,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC9B,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;gBACzB,SAAS;YACX,CAAC;QACH,CAAC;QACD,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAC1F,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,OAAO,KAAK,OAAO,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;YACtE,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;YACzB,SAAS;QACX,CAAC;QACD,oCAAoC;QACpC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACd,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAAE,CAAC,EAAE,CAAC;gBACnC,CAAC,GAAG,CAAC,CAAC;gBACN,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC;gBAC9B,SAAS;YACX,CAAC;YACD,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAAE,CAAC,EAAE,CAAC;gBACxD,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBACjB,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC9B,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;oBAClC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC;oBACnC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;oBACzB,SAAS;gBACX,CAAC;YACH,CAAC;QACH,CAAC;QACD,eAAe;QACf,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACd,CAAC,EAAE,CAAC;YACJ,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC;YAC9B,SAAS;QACX,CAAC;QACD,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YAC9F,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAE,CAAC,EAAE,CAAC;YAClC,CAAC,GAAG,CAAC,CAAC;YACN,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC;YAC9B,SAAS;QACX,CAAC;QACD,IAAI,MAAM,IAAI,CAAC,KAAK,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACvE,4BAA4B;YAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAE,CAAC,EAAE,CAAC;YACnC,CAAC,GAAG,CAAC,CAAC;YACN,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC;YAC9B,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAC/D,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAE,CAAC,EAAE,CAAC;YACpC,CAAC,GAAG,CAAC,CAAC;YACN,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;YACvB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAClC,CAAC,IAAI,CAAC,CAAC;YACP,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC;YAC9B,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAClC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAChC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBAC9B,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACV,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC;gBAC9B,SAAS;YACX,CAAC;QACH,CAAC;QACD,UAAU;QACV,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YACzD,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;gBACxD,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAAE,CAAC,EAAE,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAAE,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBACjB,CAAC,EAAE,CAAC;oBACJ,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBAAE,CAAC,EAAE,CAAC;gBACrC,CAAC;gBACD,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACvI,CAAC,IAAI,CAAC,CAAC;oBACP,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBAAE,CAAC,EAAE,CAAC;gBACrC,CAAC;YACH,CAAC;YACD,CAAC,GAAG,CAAC,CAAC;YACN,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;YACzB,SAAS;QACX,CAAC;QACD,8CAA8C;QAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,IAAI,CAAC,GAAG,KAAK,CAAC;YACd,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACpB,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC7B,IAAI,IAAI,GAAG,CAAC;oBAAE,MAAM;gBACpB,CAAC,GAAG,IAAI,CAAC;YACX,CAAC;YACD,CAAC,GAAG,CAAC,CAAC;YACN,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC9D,SAAS;QACX,CAAC;QACD,YAAY;QACZ,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AAE/F,mEAAmE;AACnE,SAAgB,WAAW,CAAC,GAAW;IACrC,MAAM,GAAG,GAAY,EAAE,CAAC;IACxB,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;IACrB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;IACnB,IAAI,EAAE,GAAG,KAAK,CAAC;IACf,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,EAAE;QAC5B,IAAI,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,SAAS;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAChH,SAAS,GAAG,CAAC,CAAC,CAAC;IACjB,CAAC,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACjB,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC5B,OAAO,CAAC,CAAC,CAAC,CAAC;gBACX,CAAC,EAAE,CAAC;gBACJ,SAAS;YACX,CAAC;YACD,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACvD,IAAI,EAAE,EAAE,CAAC;gBACP,OAAO,CAAC,CAAC,CAAC,CAAC;gBACX,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC3D,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC;gBACf,SAAS;YACX,CAAC;YACD,IAAI,SAAS,GAAG,CAAC;gBAAE,SAAS,GAAG,CAAC,CAAC;YACjC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBACf,CAAC,IAAI,CAAC,CAAC;gBACP,SAAS;YACX,CAAC;YACD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;gBACd,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBAClC,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC9B,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;gBACzB,CAAC,GAAG,GAAG,CAAC;gBACR,SAAS;YACX,CAAC;YACD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;gBACd,EAAE,GAAG,IAAI,CAAC;gBACV,CAAC,EAAE,CAAC;gBACJ,SAAS;YACX,CAAC;YACD,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,uBAAuB;QACvB,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACf,IAAI,SAAS,GAAG,CAAC;gBAAE,SAAS,GAAG,CAAC,CAAC;YACjC,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACd,IAAI,SAAS,GAAG,CAAC;gBAAE,SAAS,GAAG,CAAC,CAAC;YACjC,EAAE,GAAG,KAAK,CAAC;YACX,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YACnD,OAAO,CAAC,CAAC,CAAC,CAAC;YACX,MAAM,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9B,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;YACxE,CAAC,IAAI,GAAG,CAAC;YACT,SAAS;QACX,CAAC;QACD,IAAI,SAAS,GAAG,CAAC;YAAE,SAAS,GAAG,CAAC,CAAC;QACjC,CAAC,EAAE,CAAC;IACN,CAAC;IACD,OAAO,CAAC,CAAC,CAAC,CAAC;IACX,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AACnC,CAAC;AAED,2FAA2F;AAC3F,SAAgB,UAAU,CAAC,GAAW;IACpC,MAAM,GAAG,GAAY,EAAE,CAAC;IACxB,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;IACrB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACjB,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YACf,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,CAAC;QACZ,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACpC,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC/B,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9D,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACpC,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACnC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACtB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9D,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACxC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;gBAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3D,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACvB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAC7D,SAAS;QACX,CAAC;QACD,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;gBAAE,CAAC,EAAE,CAAC;YAC1D,CAAC,GAAG,CAAC,CAAC;YACN,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAC7D,SAAS;QACX,CAAC;QACD,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;YACvD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;gBAAE,CAAC,EAAE,CAAC;YACnE,CAAC,GAAG,CAAC,CAAC;YACN,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3D,SAAS;QACX,CAAC;QACD,CAAC,EAAE,CAAC;QACJ,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,yCAAyC;AACzC,SAAgB,WAAW,CAAC,MAAe,EAAE,GAAW,EAAE,GAAW;IACnE,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IACtB,MAAM,GAAG,GAAY,EAAE,CAAC;IACxB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG;YAAE,MAAM;QACtB,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG;YAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,yDAAyD;AACzD,SAAgB,WAAW,CAAC,GAAW,EAAE,MAAc,EAAE,GAAG,GAAG,CAAC;IAC9D,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,CAAC,MAAM;QAAE,OAAO,GAAG,CAAC;IACxB,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,OAAO,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC;YAAE,MAAM;QACjB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACZ,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Framework middleware: Express, Fastify, Koa, raw `http` and Next.js route
3
+ * handlers. Each runs deception first (deception.ts), then records the request's inputs (query, params, body, cookies,
4
+ * the contract's input headers) in the request's AsyncLocalStorage context,
5
+ * runs the virtual patches, and maps the block error to the contract's 403.
6
+ *
7
+ * None of these needs the framework installed: they are typed structurally.
8
+ * While RASP is not active each passes the request straight through.
9
+ */
10
+ import type { IncomingMessage, ServerResponse } from 'http';
11
+ import { lowerHeaders } from './capture';
12
+ import { RaspBlockedError } from './types';
13
+ export declare function isRaspBlocked(e: unknown): e is RaspBlockedError;
14
+ /** Writes the 403 on a Node response (no-op once the headers are out). */
15
+ export declare function sendBlocked(res: ServerResponse, e: RaspBlockedError): void;
16
+ /** The 403 as a fetch Response (Next.js and other fetch-style handlers). */
17
+ export declare function blockedResponse(e: RaspBlockedError): Response;
18
+ /**
19
+ * The 404 where a framework has no not-found of its own (raw `http`, the
20
+ * zero-code capture): `404 Not Found` as plain text.
21
+ */
22
+ export declare function sendNotFound(res: ServerResponse): void;
23
+ /**
24
+ * Whether a server's `request` listener is a framework app, which resolves the
25
+ * client address itself (`trust proxy`) and has its own not-found: an Express
26
+ * 4/5 app (the app function, with `handle`, `use`, `set` and `settings`), Koa's
27
+ * `callback()` (`handleRequest`) or Fastify's router entry (`preRouting`); the
28
+ * last two are bare closures, so only their names tell. A server an adapter
29
+ * already served (`raspFastify` notes its server when registered, the others
30
+ * on their first request) counts too, which covers a renamed or wrapped app.
31
+ */
32
+ export declare function frameworkServes(server: unknown): boolean;
33
+ type ExpressReq = IncomingMessage & {
34
+ originalUrl?: string;
35
+ query?: unknown;
36
+ params?: unknown;
37
+ body?: unknown;
38
+ route?: {
39
+ path?: unknown;
40
+ };
41
+ ip?: unknown;
42
+ };
43
+ type Next = (err?: unknown) => void;
44
+ /**
45
+ * Express's own answer to an unknown path, byte for byte: finalhandler's 404
46
+ * (`Cannot GET /path` in its HTML page, with its security headers), which
47
+ * Express 4 and 5 send when no route matches. It is written here rather than
48
+ * reached with `next('router')`: that only leaves the router the middleware
49
+ * is mounted on, so mounted on a sub-router it would go on to the parent's
50
+ * handlers, and at the app level it skips the app's own 404 middleware just
51
+ * the same. An app with its own 404 page passes `raspExpress({ notFound })`.
52
+ */
53
+ export declare function sendExpressNotFound(req: IncomingMessage & {
54
+ originalUrl?: string;
55
+ }, res: ServerResponse): void;
56
+ export type RaspExpressOptions = {
57
+ /**
58
+ * Answers a decoy path ("Deception") instead of Express's default 404, for
59
+ * an app with its own not-found page. Must send the response; the route
60
+ * handlers are never called either way.
61
+ */
62
+ notFound?: (req: IncomingMessage, res: ServerResponse) => void;
63
+ };
64
+ /**
65
+ * Express (4 and 5). Register it after the body parsers so the body is seen
66
+ * before the handler; registered earlier, the body is still captured when a
67
+ * sink first reads the inputs.
68
+ *
69
+ * app.use(express.json());
70
+ * app.use(raspExpress());
71
+ * ...routes...
72
+ * app.use(raspExpressErrorHandler());
73
+ */
74
+ export declare function raspExpress(options?: RaspExpressOptions): (req: ExpressReq, res: ServerResponse, next: Next) => void;
75
+ /** Maps the block error from a handler to the 403; passes every other error on. */
76
+ export declare function raspExpressErrorHandler(): (err: unknown, _req: IncomingMessage, res: ServerResponse, next: Next) => void;
77
+ type FastifyRequest = {
78
+ method: string;
79
+ url: string;
80
+ headers: Record<string, string | string[] | undefined>;
81
+ query?: unknown;
82
+ params?: unknown;
83
+ body?: unknown;
84
+ routeOptions?: {
85
+ url?: string;
86
+ };
87
+ routerPath?: string;
88
+ ip?: unknown;
89
+ /** True while Fastify serves the request with its not-found handler (no route matched). */
90
+ is404?: boolean;
91
+ [k: symbol]: unknown;
92
+ };
93
+ type FastifyReply = {
94
+ code(n: number): FastifyReply;
95
+ header(k: string, v: string): FastifyReply;
96
+ send(body: unknown): unknown;
97
+ callNotFound?(): unknown;
98
+ };
99
+ type FastifyLike = {
100
+ server?: unknown;
101
+ addHook(name: string, fn: (request: FastifyRequest, reply: FastifyReply, done: Next) => void): unknown;
102
+ };
103
+ /**
104
+ * Fastify plugin: `fastify.register(raspFastify)`. Applies to every route
105
+ * (it skips encapsulation, as fastify-plugin would). Inputs are captured in
106
+ * `onRequest`, the body in `preHandler`. A handler that lets the block error
107
+ * through gets a 403 from Fastify's default error handler (`statusCode`).
108
+ */
109
+ export declare function raspFastify(fastify: FastifyLike, _opts: unknown, done: Next): void;
110
+ type KoaContext = {
111
+ method: string;
112
+ url: string;
113
+ originalUrl?: string;
114
+ headers?: Record<string, string | string[] | undefined>;
115
+ query?: unknown;
116
+ params?: unknown;
117
+ _matchedRoute?: unknown;
118
+ ip?: unknown;
119
+ request?: {
120
+ body?: unknown;
121
+ headers?: Record<string, string | string[] | undefined>;
122
+ };
123
+ req?: {
124
+ httpVersionMajor?: number;
125
+ };
126
+ status?: number;
127
+ body?: unknown;
128
+ set?(k: string, v: string): void;
129
+ };
130
+ /** Koa middleware: `app.use(raspKoa())`, ideally after the body parser. */
131
+ export declare function raspKoa(): (k: KoaContext, next: () => Promise<unknown>) => Promise<void>;
132
+ type HttpHandler = (req: IncomingMessage, res: ServerResponse) => unknown;
133
+ /**
134
+ * Wraps a raw `http` request handler: `http.createServer(raspHttp(handler))`.
135
+ * The body is the handler's to read; once it has, `recordRequestBody(body)`
136
+ * adds it (and runs the virtual patches that read the body). A `req.body`
137
+ * set by a parser is picked up when a sink first reads the inputs.
138
+ */
139
+ export declare function raspHttp<H extends HttpHandler>(handler: H): H;
140
+ /**
141
+ * Adds a body the app read itself to the current request's inputs and runs
142
+ * the virtual patches that read the body. Throws the block error when one
143
+ * blocks; otherwise never throws.
144
+ */
145
+ export declare function recordRequestBody(body: unknown, contentType?: string): void;
146
+ type RouteHandler<C> = (request: Request, context: C) => Response | Promise<Response>;
147
+ /**
148
+ * Wraps a Next.js App Router route handler (Node.js runtime):
149
+ *
150
+ * export const POST = withRasp(async (request) => { ... });
151
+ *
152
+ * The body is read from a clone (up to 1 MiB), so the handler can still read it.
153
+ */
154
+ export declare function withRasp<C = unknown>(handler: RouteHandler<C>): RouteHandler<C>;
155
+ export { lowerHeaders };