nlcurl 0.6.0 → 0.8.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 (354) hide show
  1. package/README.md +143 -140
  2. package/dist/cache/groups.d.ts +75 -0
  3. package/dist/cache/groups.d.ts.map +1 -0
  4. package/dist/cache/groups.js +118 -0
  5. package/dist/cache/groups.js.map +1 -0
  6. package/dist/cache/no-vary-search.d.ts +33 -0
  7. package/dist/cache/no-vary-search.d.ts.map +1 -0
  8. package/dist/cache/no-vary-search.js +148 -0
  9. package/dist/cache/no-vary-search.js.map +1 -0
  10. package/dist/cache/range.d.ts +120 -0
  11. package/dist/cache/range.d.ts.map +1 -0
  12. package/dist/cache/range.js +193 -0
  13. package/dist/cache/range.js.map +1 -0
  14. package/dist/cache/store.d.ts +111 -0
  15. package/dist/cache/store.d.ts.map +1 -0
  16. package/dist/cache/store.js +414 -0
  17. package/dist/cache/store.js.map +1 -0
  18. package/dist/cache/types.d.ts +69 -0
  19. package/dist/cache/types.d.ts.map +1 -0
  20. package/dist/cache/types.js +2 -0
  21. package/dist/cache/types.js.map +1 -0
  22. package/dist/cli/args.d.ts +4 -37
  23. package/dist/cli/args.d.ts.map +1 -1
  24. package/dist/cli/args.js +3 -4
  25. package/dist/cli/args.js.map +1 -1
  26. package/dist/cli/index.d.ts +0 -5
  27. package/dist/cli/index.d.ts.map +1 -1
  28. package/dist/cli/index.js +1 -6
  29. package/dist/cli/index.js.map +1 -1
  30. package/dist/cli/output.d.ts +14 -20
  31. package/dist/cli/output.d.ts.map +1 -1
  32. package/dist/cli/output.js +14 -20
  33. package/dist/cli/output.js.map +1 -1
  34. package/dist/cookies/jar.d.ts +33 -31
  35. package/dist/cookies/jar.d.ts.map +1 -1
  36. package/dist/cookies/jar.js +69 -33
  37. package/dist/cookies/jar.js.map +1 -1
  38. package/dist/cookies/parser.d.ts +14 -16
  39. package/dist/cookies/parser.d.ts.map +1 -1
  40. package/dist/cookies/parser.js +30 -13
  41. package/dist/cookies/parser.js.map +1 -1
  42. package/dist/cookies/psl-data.d.ts +1 -1
  43. package/dist/cookies/psl-data.js +1 -1
  44. package/dist/cookies/public-suffix.d.ts +5 -27
  45. package/dist/cookies/public-suffix.d.ts.map +1 -1
  46. package/dist/cookies/public-suffix.js +5 -37
  47. package/dist/cookies/public-suffix.js.map +1 -1
  48. package/dist/core/auth.d.ts +30 -0
  49. package/dist/core/auth.d.ts.map +1 -0
  50. package/dist/core/auth.js +34 -0
  51. package/dist/core/auth.js.map +1 -0
  52. package/dist/core/client.d.ts +28 -40
  53. package/dist/core/client.d.ts.map +1 -1
  54. package/dist/core/client.js +34 -41
  55. package/dist/core/client.js.map +1 -1
  56. package/dist/core/errors.d.ts +64 -88
  57. package/dist/core/errors.d.ts.map +1 -1
  58. package/dist/core/errors.js +64 -88
  59. package/dist/core/errors.js.map +1 -1
  60. package/dist/core/request.d.ts +63 -85
  61. package/dist/core/request.d.ts.map +1 -1
  62. package/dist/core/response.d.ts +64 -59
  63. package/dist/core/response.d.ts.map +1 -1
  64. package/dist/core/response.js +70 -52
  65. package/dist/core/response.js.map +1 -1
  66. package/dist/core/session.d.ts +81 -70
  67. package/dist/core/session.d.ts.map +1 -1
  68. package/dist/core/session.js +198 -71
  69. package/dist/core/session.js.map +1 -1
  70. package/dist/core/validation.d.ts +44 -42
  71. package/dist/core/validation.d.ts.map +1 -1
  72. package/dist/core/validation.js +47 -58
  73. package/dist/core/validation.js.map +1 -1
  74. package/dist/dns/cache.d.ts +59 -0
  75. package/dist/dns/cache.d.ts.map +1 -0
  76. package/dist/dns/cache.js +99 -0
  77. package/dist/dns/cache.js.map +1 -0
  78. package/dist/dns/codec.d.ts +39 -0
  79. package/dist/dns/codec.d.ts.map +1 -0
  80. package/dist/dns/codec.js +238 -0
  81. package/dist/dns/codec.js.map +1 -0
  82. package/dist/dns/doh-resolver.d.ts +38 -0
  83. package/dist/dns/doh-resolver.d.ts.map +1 -0
  84. package/dist/dns/doh-resolver.js +191 -0
  85. package/dist/dns/doh-resolver.js.map +1 -0
  86. package/dist/dns/dot-resolver.d.ts +89 -0
  87. package/dist/dns/dot-resolver.d.ts.map +1 -0
  88. package/dist/dns/dot-resolver.js +158 -0
  89. package/dist/dns/dot-resolver.js.map +1 -0
  90. package/dist/dns/https-rr.d.ts +40 -0
  91. package/dist/dns/https-rr.d.ts.map +1 -0
  92. package/dist/dns/https-rr.js +109 -0
  93. package/dist/dns/https-rr.js.map +1 -0
  94. package/dist/dns/types.d.ts +82 -0
  95. package/dist/dns/types.d.ts.map +1 -0
  96. package/dist/dns/types.js +23 -0
  97. package/dist/dns/types.js.map +1 -0
  98. package/dist/fingerprints/akamai.d.ts +3 -11
  99. package/dist/fingerprints/akamai.d.ts.map +1 -1
  100. package/dist/fingerprints/akamai.js +3 -11
  101. package/dist/fingerprints/akamai.js.map +1 -1
  102. package/dist/fingerprints/database.d.ts +6 -14
  103. package/dist/fingerprints/database.d.ts.map +1 -1
  104. package/dist/fingerprints/database.js +6 -14
  105. package/dist/fingerprints/database.js.map +1 -1
  106. package/dist/fingerprints/extensions.d.ts +56 -71
  107. package/dist/fingerprints/extensions.d.ts.map +1 -1
  108. package/dist/fingerprints/extensions.js +58 -71
  109. package/dist/fingerprints/extensions.js.map +1 -1
  110. package/dist/fingerprints/ja3.d.ts +12 -30
  111. package/dist/fingerprints/ja3.d.ts.map +1 -1
  112. package/dist/fingerprints/ja3.js +12 -30
  113. package/dist/fingerprints/ja3.js.map +1 -1
  114. package/dist/fingerprints/ja4.d.ts +18 -0
  115. package/dist/fingerprints/ja4.d.ts.map +1 -0
  116. package/dist/fingerprints/ja4.js +83 -0
  117. package/dist/fingerprints/ja4.js.map +1 -0
  118. package/dist/fingerprints/profiles/chrome.d.ts +18 -21
  119. package/dist/fingerprints/profiles/chrome.d.ts.map +1 -1
  120. package/dist/fingerprints/profiles/chrome.js +35 -31
  121. package/dist/fingerprints/profiles/chrome.js.map +1 -1
  122. package/dist/fingerprints/profiles/edge.d.ts +7 -10
  123. package/dist/fingerprints/profiles/edge.d.ts.map +1 -1
  124. package/dist/fingerprints/profiles/edge.js +7 -10
  125. package/dist/fingerprints/profiles/edge.js.map +1 -1
  126. package/dist/fingerprints/profiles/firefox.d.ts +8 -11
  127. package/dist/fingerprints/profiles/firefox.d.ts.map +1 -1
  128. package/dist/fingerprints/profiles/firefox.js +8 -11
  129. package/dist/fingerprints/profiles/firefox.js.map +1 -1
  130. package/dist/fingerprints/profiles/safari.d.ts +11 -14
  131. package/dist/fingerprints/profiles/safari.d.ts.map +1 -1
  132. package/dist/fingerprints/profiles/safari.js +11 -14
  133. package/dist/fingerprints/profiles/safari.js.map +1 -1
  134. package/dist/fingerprints/profiles/tor.d.ts +5 -8
  135. package/dist/fingerprints/profiles/tor.d.ts.map +1 -1
  136. package/dist/fingerprints/profiles/tor.js +5 -8
  137. package/dist/fingerprints/profiles/tor.js.map +1 -1
  138. package/dist/fingerprints/types.d.ts +42 -73
  139. package/dist/fingerprints/types.d.ts.map +1 -1
  140. package/dist/hsts/store.d.ts +39 -0
  141. package/dist/hsts/store.d.ts.map +1 -0
  142. package/dist/hsts/store.js +163 -0
  143. package/dist/hsts/store.js.map +1 -0
  144. package/dist/hsts/types.d.ts +24 -0
  145. package/dist/hsts/types.d.ts.map +1 -0
  146. package/dist/hsts/types.js +2 -0
  147. package/dist/hsts/types.js.map +1 -0
  148. package/dist/http/alt-svc.d.ts +67 -0
  149. package/dist/http/alt-svc.d.ts.map +1 -0
  150. package/dist/http/alt-svc.js +186 -0
  151. package/dist/http/alt-svc.js.map +1 -0
  152. package/dist/http/early-hints.d.ts +23 -0
  153. package/dist/http/early-hints.d.ts.map +1 -0
  154. package/dist/http/early-hints.js +33 -0
  155. package/dist/http/early-hints.js.map +1 -0
  156. package/dist/http/form-data.d.ts +17 -35
  157. package/dist/http/form-data.d.ts.map +1 -1
  158. package/dist/http/form-data.js +12 -34
  159. package/dist/http/form-data.js.map +1 -1
  160. package/dist/http/h1/client.d.ts +14 -26
  161. package/dist/http/h1/client.d.ts.map +1 -1
  162. package/dist/http/h1/client.js +29 -22
  163. package/dist/http/h1/client.js.map +1 -1
  164. package/dist/http/h1/encoder.d.ts +10 -17
  165. package/dist/http/h1/encoder.d.ts.map +1 -1
  166. package/dist/http/h1/encoder.js +10 -17
  167. package/dist/http/h1/encoder.js.map +1 -1
  168. package/dist/http/h1/parser.d.ts +22 -59
  169. package/dist/http/h1/parser.d.ts.map +1 -1
  170. package/dist/http/h1/parser.js +15 -47
  171. package/dist/http/h1/parser.js.map +1 -1
  172. package/dist/http/h2/client.d.ts +18 -59
  173. package/dist/http/h2/client.d.ts.map +1 -1
  174. package/dist/http/h2/client.js +29 -64
  175. package/dist/http/h2/client.js.map +1 -1
  176. package/dist/http/h2/frames.d.ts +53 -84
  177. package/dist/http/h2/frames.d.ts.map +1 -1
  178. package/dist/http/h2/frames.js +48 -76
  179. package/dist/http/h2/frames.js.map +1 -1
  180. package/dist/http/h2/hpack.d.ts +16 -35
  181. package/dist/http/h2/hpack.d.ts.map +1 -1
  182. package/dist/http/h2/hpack.js +16 -35
  183. package/dist/http/h2/hpack.js.map +1 -1
  184. package/dist/http/h3/detection.d.ts +15 -0
  185. package/dist/http/h3/detection.d.ts.map +1 -0
  186. package/dist/http/h3/detection.js +41 -0
  187. package/dist/http/h3/detection.js.map +1 -0
  188. package/dist/http/negotiator.d.ts +43 -33
  189. package/dist/http/negotiator.d.ts.map +1 -1
  190. package/dist/http/negotiator.js +99 -41
  191. package/dist/http/negotiator.js.map +1 -1
  192. package/dist/http/pool.d.ts +34 -64
  193. package/dist/http/pool.d.ts.map +1 -1
  194. package/dist/http/pool.js +22 -41
  195. package/dist/http/pool.js.map +1 -1
  196. package/dist/http/resumable-upload.d.ts +76 -0
  197. package/dist/http/resumable-upload.d.ts.map +1 -0
  198. package/dist/http/resumable-upload.js +104 -0
  199. package/dist/http/resumable-upload.js.map +1 -0
  200. package/dist/http/trailers.d.ts +29 -0
  201. package/dist/http/trailers.d.ts.map +1 -0
  202. package/dist/http/trailers.js +57 -0
  203. package/dist/http/trailers.js.map +1 -0
  204. package/dist/index.d.ts +36 -8
  205. package/dist/index.d.ts.map +1 -1
  206. package/dist/index.js +32 -1
  207. package/dist/index.js.map +1 -1
  208. package/dist/middleware/interceptor.d.ts +13 -32
  209. package/dist/middleware/interceptor.d.ts.map +1 -1
  210. package/dist/middleware/interceptor.js +11 -16
  211. package/dist/middleware/interceptor.js.map +1 -1
  212. package/dist/middleware/rate-limiter.d.ts +8 -17
  213. package/dist/middleware/rate-limiter.d.ts.map +1 -1
  214. package/dist/middleware/rate-limiter.js +15 -12
  215. package/dist/middleware/rate-limiter.js.map +1 -1
  216. package/dist/middleware/retry-after.d.ts +15 -0
  217. package/dist/middleware/retry-after.d.ts.map +1 -0
  218. package/dist/middleware/retry-after.js +36 -0
  219. package/dist/middleware/retry-after.js.map +1 -0
  220. package/dist/middleware/retry.d.ts +9 -18
  221. package/dist/middleware/retry.d.ts.map +1 -1
  222. package/dist/middleware/retry.js +12 -9
  223. package/dist/middleware/retry.js.map +1 -1
  224. package/dist/proxy/auth.d.ts +73 -0
  225. package/dist/proxy/auth.d.ts.map +1 -0
  226. package/dist/proxy/auth.js +128 -0
  227. package/dist/proxy/auth.js.map +1 -0
  228. package/dist/proxy/env-proxy.d.ts +11 -0
  229. package/dist/proxy/env-proxy.d.ts.map +1 -0
  230. package/dist/proxy/env-proxy.js +56 -0
  231. package/dist/proxy/env-proxy.js.map +1 -0
  232. package/dist/proxy/http-proxy.d.ts +13 -18
  233. package/dist/proxy/http-proxy.d.ts.map +1 -1
  234. package/dist/proxy/http-proxy.js +24 -14
  235. package/dist/proxy/http-proxy.js.map +1 -1
  236. package/dist/proxy/socks.d.ts +13 -20
  237. package/dist/proxy/socks.d.ts.map +1 -1
  238. package/dist/proxy/socks.js +6 -9
  239. package/dist/proxy/socks.js.map +1 -1
  240. package/dist/sse/parser.d.ts +47 -0
  241. package/dist/sse/parser.d.ts.map +1 -0
  242. package/dist/sse/parser.js +139 -0
  243. package/dist/sse/parser.js.map +1 -0
  244. package/dist/tls/constants.d.ts +15 -74
  245. package/dist/tls/constants.d.ts.map +1 -1
  246. package/dist/tls/constants.js +15 -74
  247. package/dist/tls/constants.js.map +1 -1
  248. package/dist/tls/ct.d.ts +78 -0
  249. package/dist/tls/ct.d.ts.map +1 -0
  250. package/dist/tls/ct.js +175 -0
  251. package/dist/tls/ct.js.map +1 -0
  252. package/dist/tls/early-data.d.ts +45 -0
  253. package/dist/tls/early-data.d.ts.map +1 -0
  254. package/dist/tls/early-data.js +46 -0
  255. package/dist/tls/early-data.js.map +1 -0
  256. package/dist/tls/ech.d.ts +130 -0
  257. package/dist/tls/ech.d.ts.map +1 -0
  258. package/dist/tls/ech.js +353 -0
  259. package/dist/tls/ech.js.map +1 -0
  260. package/dist/tls/keylog.d.ts +34 -0
  261. package/dist/tls/keylog.d.ts.map +1 -0
  262. package/dist/tls/keylog.js +64 -0
  263. package/dist/tls/keylog.js.map +1 -0
  264. package/dist/tls/node-engine.d.ts +15 -14
  265. package/dist/tls/node-engine.d.ts.map +1 -1
  266. package/dist/tls/node-engine.js +54 -14
  267. package/dist/tls/node-engine.js.map +1 -1
  268. package/dist/tls/ocsp.d.ts +55 -0
  269. package/dist/tls/ocsp.d.ts.map +1 -0
  270. package/dist/tls/ocsp.js +131 -0
  271. package/dist/tls/ocsp.js.map +1 -0
  272. package/dist/tls/pin-verification.d.ts +10 -0
  273. package/dist/tls/pin-verification.d.ts.map +1 -0
  274. package/dist/tls/pin-verification.js +28 -0
  275. package/dist/tls/pin-verification.js.map +1 -0
  276. package/dist/tls/session-cache.d.ts +58 -0
  277. package/dist/tls/session-cache.d.ts.map +1 -0
  278. package/dist/tls/session-cache.js +76 -0
  279. package/dist/tls/session-cache.js.map +1 -0
  280. package/dist/tls/stealth/client-hello.d.ts +34 -32
  281. package/dist/tls/stealth/client-hello.d.ts.map +1 -1
  282. package/dist/tls/stealth/client-hello.js +116 -11
  283. package/dist/tls/stealth/client-hello.js.map +1 -1
  284. package/dist/tls/stealth/engine.d.ts +5 -15
  285. package/dist/tls/stealth/engine.d.ts.map +1 -1
  286. package/dist/tls/stealth/engine.js +163 -47
  287. package/dist/tls/stealth/engine.js.map +1 -1
  288. package/dist/tls/stealth/handshake.d.ts +23 -32
  289. package/dist/tls/stealth/handshake.d.ts.map +1 -1
  290. package/dist/tls/stealth/handshake.js +112 -27
  291. package/dist/tls/stealth/handshake.js.map +1 -1
  292. package/dist/tls/stealth/key-schedule.d.ts +59 -86
  293. package/dist/tls/stealth/key-schedule.d.ts.map +1 -1
  294. package/dist/tls/stealth/key-schedule.js +46 -58
  295. package/dist/tls/stealth/key-schedule.js.map +1 -1
  296. package/dist/tls/stealth/record-layer.d.ts +52 -75
  297. package/dist/tls/stealth/record-layer.d.ts.map +1 -1
  298. package/dist/tls/stealth/record-layer.js +47 -63
  299. package/dist/tls/stealth/record-layer.js.map +1 -1
  300. package/dist/tls/stealth/tls12-handshake.d.ts +30 -0
  301. package/dist/tls/stealth/tls12-handshake.d.ts.map +1 -0
  302. package/dist/tls/stealth/tls12-handshake.js +470 -0
  303. package/dist/tls/stealth/tls12-handshake.js.map +1 -0
  304. package/dist/tls/types.d.ts +46 -48
  305. package/dist/tls/types.d.ts.map +1 -1
  306. package/dist/utils/buffer-reader.d.ts +26 -81
  307. package/dist/utils/buffer-reader.d.ts.map +1 -1
  308. package/dist/utils/buffer-reader.js +26 -81
  309. package/dist/utils/buffer-reader.js.map +1 -1
  310. package/dist/utils/buffer-writer.d.ts +30 -66
  311. package/dist/utils/buffer-writer.d.ts.map +1 -1
  312. package/dist/utils/buffer-writer.js +30 -66
  313. package/dist/utils/buffer-writer.js.map +1 -1
  314. package/dist/utils/compression.d.ts +18 -0
  315. package/dist/utils/compression.d.ts.map +1 -0
  316. package/dist/utils/compression.js +34 -0
  317. package/dist/utils/compression.js.map +1 -0
  318. package/dist/utils/dictionary-transport.d.ts +97 -0
  319. package/dist/utils/dictionary-transport.d.ts.map +1 -0
  320. package/dist/utils/dictionary-transport.js +171 -0
  321. package/dist/utils/dictionary-transport.js.map +1 -0
  322. package/dist/utils/encoding.d.ts +12 -28
  323. package/dist/utils/encoding.d.ts.map +1 -1
  324. package/dist/utils/encoding.js +77 -40
  325. package/dist/utils/encoding.js.map +1 -1
  326. package/dist/utils/happy-eyeballs.d.ts +20 -7
  327. package/dist/utils/happy-eyeballs.d.ts.map +1 -1
  328. package/dist/utils/happy-eyeballs.js +57 -25
  329. package/dist/utils/happy-eyeballs.js.map +1 -1
  330. package/dist/utils/logger.d.ts +54 -81
  331. package/dist/utils/logger.d.ts.map +1 -1
  332. package/dist/utils/logger.js +92 -64
  333. package/dist/utils/logger.js.map +1 -1
  334. package/dist/utils/tcp-fast-open.d.ts +30 -0
  335. package/dist/utils/tcp-fast-open.d.ts.map +1 -0
  336. package/dist/utils/tcp-fast-open.js +36 -0
  337. package/dist/utils/tcp-fast-open.js.map +1 -0
  338. package/dist/utils/url.d.ts +18 -25
  339. package/dist/utils/url.d.ts.map +1 -1
  340. package/dist/utils/url.js +18 -25
  341. package/dist/utils/url.js.map +1 -1
  342. package/dist/ws/client.d.ts +35 -52
  343. package/dist/ws/client.d.ts.map +1 -1
  344. package/dist/ws/client.js +92 -37
  345. package/dist/ws/client.js.map +1 -1
  346. package/dist/ws/frame.d.ts +27 -42
  347. package/dist/ws/frame.d.ts.map +1 -1
  348. package/dist/ws/frame.js +25 -37
  349. package/dist/ws/frame.js.map +1 -1
  350. package/dist/ws/permessage-deflate.d.ts +53 -0
  351. package/dist/ws/permessage-deflate.d.ts.map +1 -0
  352. package/dist/ws/permessage-deflate.js +140 -0
  353. package/dist/ws/permessage-deflate.js.map +1 -0
  354. package/package.json +62 -62
package/dist/tls/ct.js ADDED
@@ -0,0 +1,175 @@
1
+ /** Hash algorithms used in Signed Certificate Timestamps. */
2
+ export var SCTHashAlgorithm;
3
+ (function (SCTHashAlgorithm) {
4
+ SCTHashAlgorithm[SCTHashAlgorithm["NONE"] = 0] = "NONE";
5
+ SCTHashAlgorithm[SCTHashAlgorithm["MD5"] = 1] = "MD5";
6
+ SCTHashAlgorithm[SCTHashAlgorithm["SHA1"] = 2] = "SHA1";
7
+ SCTHashAlgorithm[SCTHashAlgorithm["SHA224"] = 3] = "SHA224";
8
+ SCTHashAlgorithm[SCTHashAlgorithm["SHA256"] = 4] = "SHA256";
9
+ SCTHashAlgorithm[SCTHashAlgorithm["SHA384"] = 5] = "SHA384";
10
+ SCTHashAlgorithm[SCTHashAlgorithm["SHA512"] = 6] = "SHA512";
11
+ })(SCTHashAlgorithm || (SCTHashAlgorithm = {}));
12
+ /** Digital signature algorithms used in Signed Certificate Timestamps. */
13
+ export var SCTSignatureAlgorithm;
14
+ (function (SCTSignatureAlgorithm) {
15
+ SCTSignatureAlgorithm[SCTSignatureAlgorithm["ANONYMOUS"] = 0] = "ANONYMOUS";
16
+ SCTSignatureAlgorithm[SCTSignatureAlgorithm["RSA"] = 1] = "RSA";
17
+ SCTSignatureAlgorithm[SCTSignatureAlgorithm["DSA"] = 2] = "DSA";
18
+ SCTSignatureAlgorithm[SCTSignatureAlgorithm["ECDSA"] = 3] = "ECDSA";
19
+ })(SCTSignatureAlgorithm || (SCTSignatureAlgorithm = {}));
20
+ /** Signed Certificate Timestamp version identifiers. */
21
+ export var SCTVersion;
22
+ (function (SCTVersion) {
23
+ SCTVersion[SCTVersion["V1"] = 0] = "V1";
24
+ })(SCTVersion || (SCTVersion = {}));
25
+ /**
26
+ * Parse a serialized SCT list into individual SCT entries.
27
+ *
28
+ * @param {Buffer} data - TLS-encoded SCT list buffer.
29
+ * @returns {SCT[]} Array of parsed {@link SCT} objects.
30
+ */
31
+ export function parseSCTList(data) {
32
+ if (data.length < 2)
33
+ return [];
34
+ const listLength = data.readUInt16BE(0);
35
+ if (listLength + 2 > data.length)
36
+ return [];
37
+ const scts = [];
38
+ let offset = 2;
39
+ const end = 2 + listLength;
40
+ while (offset + 2 <= end) {
41
+ const sctLength = data.readUInt16BE(offset);
42
+ offset += 2;
43
+ if (offset + sctLength > end)
44
+ break;
45
+ const sct = parseSingleSCT(data.subarray(offset, offset + sctLength));
46
+ if (sct)
47
+ scts.push(sct);
48
+ offset += sctLength;
49
+ }
50
+ return scts;
51
+ }
52
+ function parseSingleSCT(data) {
53
+ if (data.length < 1 + 32 + 8 + 2 + 2 + 2)
54
+ return null;
55
+ let offset = 0;
56
+ const version = data[offset];
57
+ if (version !== SCTVersion.V1)
58
+ return null;
59
+ offset += 1;
60
+ const logId = Buffer.from(data.subarray(offset, offset + 32));
61
+ offset += 32;
62
+ const timestampMs = Number(data.readBigUInt64BE(offset));
63
+ const timestamp = new Date(timestampMs);
64
+ offset += 8;
65
+ const extensionsLength = data.readUInt16BE(offset);
66
+ offset += 2;
67
+ const extensions = Buffer.from(data.subarray(offset, offset + extensionsLength));
68
+ offset += extensionsLength;
69
+ if (offset + 4 > data.length)
70
+ return null;
71
+ const hashAlgorithm = data[offset];
72
+ offset += 1;
73
+ const signatureAlgorithm = data[offset];
74
+ offset += 1;
75
+ const signatureLength = data.readUInt16BE(offset);
76
+ offset += 2;
77
+ if (offset + signatureLength > data.length)
78
+ return null;
79
+ const signature = Buffer.from(data.subarray(offset, offset + signatureLength));
80
+ return {
81
+ version,
82
+ logId,
83
+ timestamp,
84
+ extensions,
85
+ hashAlgorithm,
86
+ signatureAlgorithm,
87
+ signature,
88
+ };
89
+ }
90
+ /**
91
+ * Validate a set of SCTs for Certificate Transparency compliance.
92
+ *
93
+ * Deduplicates by log ID and requires at least two unique logs.
94
+ *
95
+ * @param {SCT[]} scts - Array of parsed SCTs.
96
+ * @returns {SCTValidationResult} Validation result with compliance status.
97
+ */
98
+ export function validateSCTs(scts) {
99
+ const uniqueLogs = new Set();
100
+ const uniqueSCTs = [];
101
+ for (const sct of scts) {
102
+ const logIdHex = sct.logId.toString("hex");
103
+ if (!uniqueLogs.has(logIdHex)) {
104
+ uniqueLogs.add(logIdHex);
105
+ uniqueSCTs.push(sct);
106
+ }
107
+ }
108
+ return {
109
+ compliant: uniqueLogs.size >= 2,
110
+ sctCount: uniqueSCTs.length,
111
+ scts: uniqueSCTs,
112
+ };
113
+ }
114
+ /**
115
+ * Extract embedded SCTs from a TLS socket's peer certificate.
116
+ *
117
+ * @param {{ getPeerCertificate?: (detailed?: boolean) => { raw?: Buffer; serialNumber?: string } }} socket - Socket with a `getPeerCertificate` method.
118
+ * @returns {SCTValidationResult | undefined} Validation result, or `undefined` if SCTs cannot be extracted.
119
+ */
120
+ export function extractSCTsFromSocket(socket) {
121
+ if (!socket.getPeerCertificate)
122
+ return undefined;
123
+ const cert = socket.getPeerCertificate(true);
124
+ if (!cert || !cert.raw)
125
+ return undefined;
126
+ const sctExtOid = Buffer.from([0x06, 0x0a, 0x2b, 0x06, 0x01, 0x04, 0x01, 0xd6, 0x79, 0x02, 0x04, 0x02]);
127
+ const extIdx = cert.raw.indexOf(sctExtOid);
128
+ if (extIdx === -1) {
129
+ return { compliant: false, sctCount: 0, scts: [] };
130
+ }
131
+ let offset = extIdx + sctExtOid.length;
132
+ if (offset < cert.raw.length && cert.raw[offset] === 0x01) {
133
+ offset += 3;
134
+ }
135
+ if (offset >= cert.raw.length || cert.raw[offset] !== 0x04) {
136
+ return { compliant: false, sctCount: 0, scts: [] };
137
+ }
138
+ offset++;
139
+ const result = readLength(cert.raw, offset);
140
+ if (result.value === -1)
141
+ return { compliant: false, sctCount: 0, scts: [] };
142
+ offset += result.bytesRead;
143
+ if (offset >= cert.raw.length || cert.raw[offset] !== 0x04) {
144
+ const scts = parseSCTList(cert.raw.subarray(offset));
145
+ const validation = validateSCTs(scts);
146
+ validation.source = "embedded";
147
+ return validation;
148
+ }
149
+ offset++;
150
+ const innerResult = readLength(cert.raw, offset);
151
+ if (innerResult.value === -1)
152
+ return { compliant: false, sctCount: 0, scts: [] };
153
+ offset += innerResult.bytesRead;
154
+ const sctData = cert.raw.subarray(offset, offset + innerResult.value);
155
+ const scts = parseSCTList(sctData);
156
+ const validation = validateSCTs(scts);
157
+ validation.source = "embedded";
158
+ return validation;
159
+ }
160
+ function readLength(buf, offset) {
161
+ if (offset >= buf.length)
162
+ return { value: -1, bytesRead: 0 };
163
+ const first = buf[offset];
164
+ if (first < 0x80)
165
+ return { value: first, bytesRead: 1 };
166
+ const numBytes = first & 0x7f;
167
+ if (numBytes === 0 || numBytes > 4 || offset + numBytes >= buf.length)
168
+ return { value: -1, bytesRead: 0 };
169
+ let value = 0;
170
+ for (let i = 0; i < numBytes; i++) {
171
+ value = (value << 8) | buf[offset + 1 + i];
172
+ }
173
+ return { value, bytesRead: 1 + numBytes };
174
+ }
175
+ //# sourceMappingURL=ct.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ct.js","sourceRoot":"","sources":["../../src/tls/ct.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /** Configuration for TLS 1.3 early data (0-RTT). */
2
+ export interface EarlyDataConfig {
3
+ /** Enable early data transmission. */
4
+ enabled?: boolean;
5
+ /** Maximum early data payload size in bytes. */
6
+ maxSize?: number;
7
+ /** Restrict early data to safe (idempotent) HTTP methods only. */
8
+ safeOnly?: boolean;
9
+ }
10
+ /** Outcome of an early data (0-RTT) transmission attempt. */
11
+ export interface EarlyDataResult {
12
+ /** Whether the server accepted the early data. */
13
+ accepted: boolean;
14
+ /** Whether early data transmission was attempted. */
15
+ attempted: boolean;
16
+ /** Number of bytes sent as early data. */
17
+ bytesSent: number;
18
+ }
19
+ /**
20
+ * Determine whether early data can be sent for the given HTTP method.
21
+ *
22
+ * @param {string} method - HTTP method string.
23
+ * @param {EarlyDataConfig} [config] - Early data configuration.
24
+ * @returns {boolean} `true` if early data is permitted.
25
+ */
26
+ export declare function canSendEarlyData(method: string, config?: EarlyDataConfig): boolean;
27
+ /**
28
+ * Prepare request data for 0-RTT transmission.
29
+ *
30
+ * @param {Buffer} requestData - Serialized request bytes.
31
+ * @param {EarlyDataConfig} [config] - Early data configuration.
32
+ * @returns {Buffer|null} Buffer to send as early data, or `null` if not applicable.
33
+ */
34
+ export declare function prepareEarlyData(requestData: Buffer, config?: EarlyDataConfig): Buffer | null;
35
+ /**
36
+ * Check whether the server accepted early data on a connected socket.
37
+ *
38
+ * @param {{ alpnProtocol?: string | false; earlyData?: boolean }} socket - Socket with optional `earlyData` flag.
39
+ * @returns {EarlyDataResult} Early data acceptance result.
40
+ */
41
+ export declare function checkEarlyDataAccepted(socket: {
42
+ alpnProtocol?: string | false;
43
+ earlyData?: boolean;
44
+ }): EarlyDataResult;
45
+ //# sourceMappingURL=early-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"early-data.d.ts","sourceRoot":"","sources":["../../src/tls/early-data.ts"],"names":[],"mappings":"AAEA,oDAAoD;AACpD,MAAM,WAAW,eAAe;IAC9B,sCAAsC;IACtC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,6DAA6D;AAC7D,MAAM,WAAW,eAAe;IAC9B,kDAAkD;IAClD,QAAQ,EAAE,OAAO,CAAC;IAClB,qDAAqD;IACrD,SAAS,EAAE,OAAO,CAAC;IACnB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,eAAe,GAAG,OAAO,CAMlF;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAO7F;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,eAAe,CAOtH"}
@@ -0,0 +1,46 @@
1
+ const SAFE_EARLY_DATA_METHODS = new Set(["GET", "HEAD", "OPTIONS"]);
2
+ /**
3
+ * Determine whether early data can be sent for the given HTTP method.
4
+ *
5
+ * @param {string} method - HTTP method string.
6
+ * @param {EarlyDataConfig} [config] - Early data configuration.
7
+ * @returns {boolean} `true` if early data is permitted.
8
+ */
9
+ export function canSendEarlyData(method, config) {
10
+ if (!config?.enabled)
11
+ return false;
12
+ if (config.safeOnly !== false && !SAFE_EARLY_DATA_METHODS.has(method.toUpperCase())) {
13
+ return false;
14
+ }
15
+ return true;
16
+ }
17
+ /**
18
+ * Prepare request data for 0-RTT transmission.
19
+ *
20
+ * @param {Buffer} requestData - Serialized request bytes.
21
+ * @param {EarlyDataConfig} [config] - Early data configuration.
22
+ * @returns {Buffer|null} Buffer to send as early data, or `null` if not applicable.
23
+ */
24
+ export function prepareEarlyData(requestData, config) {
25
+ if (!config?.enabled)
26
+ return null;
27
+ const maxSize = config.maxSize ?? 16384;
28
+ if (requestData.length > maxSize)
29
+ return null;
30
+ return requestData;
31
+ }
32
+ /**
33
+ * Check whether the server accepted early data on a connected socket.
34
+ *
35
+ * @param {{ alpnProtocol?: string | false; earlyData?: boolean }} socket - Socket with optional `earlyData` flag.
36
+ * @returns {EarlyDataResult} Early data acceptance result.
37
+ */
38
+ export function checkEarlyDataAccepted(socket) {
39
+ const accepted = socket.earlyData === true;
40
+ return {
41
+ accepted,
42
+ attempted: true,
43
+ bytesSent: 0,
44
+ };
45
+ }
46
+ //# sourceMappingURL=early-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"early-data.js","sourceRoot":"","sources":["../../src/tls/early-data.ts"],"names":[],"mappings":"AAAA,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;AAsBpE;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,MAAwB;IACvE,IAAI,CAAC,MAAM,EAAE,OAAO;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QACpF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB,EAAE,MAAwB;IAC5E,IAAI,CAAC,MAAM,EAAE,OAAO;QAAE,OAAO,IAAI,CAAC;IAElC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC;IACxC,IAAI,WAAW,CAAC,MAAM,GAAG,OAAO;QAAE,OAAO,IAAI,CAAC;IAE9C,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAA8D;IACnG,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,KAAK,IAAI,CAAC;IAC3C,OAAO;QACL,QAAQ;QACR,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,CAAC;KACb,CAAC;AACJ,CAAC"}
@@ -0,0 +1,130 @@
1
+ /** Parsed individual Encrypted Client Hello configuration entry. */
2
+ export interface ECHConfig {
3
+ /** ECH config version identifier. */
4
+ version: number;
5
+ /** Length of the configuration contents. */
6
+ length: number;
7
+ /** Raw configuration content bytes. */
8
+ contents: Buffer;
9
+ /** Public name (outer SNI) extracted from the config. */
10
+ publicName: string;
11
+ }
12
+ /** Complete parsed ECH configuration list with outer SNI. */
13
+ export interface ECHParameters {
14
+ /** Raw serialized ECHConfigList buffer. */
15
+ echConfigList: Buffer;
16
+ /** Outer SNI derived from the first config's public name. */
17
+ outerSNI: string;
18
+ /** Individual ECH configuration entries. */
19
+ configs: ECHConfig[];
20
+ }
21
+ /** User-facing options for Encrypted Client Hello. */
22
+ export interface ECHOptions {
23
+ /** Enable ECH support. */
24
+ enabled?: boolean;
25
+ /** Base64 or binary ECHConfigList. */
26
+ echConfigList?: string | Buffer;
27
+ /** Send a GREASE ECH extension when no real config is available. */
28
+ grease?: boolean;
29
+ /** Maximum number of ECH retry attempts. */
30
+ maxRetries?: number;
31
+ }
32
+ /**
33
+ * Parse a serialized ECHConfigList into structured parameters.
34
+ *
35
+ * @param {Buffer} data - Raw ECHConfigList buffer.
36
+ * @returns {ECHParameters|null} Parsed parameters, or `null` if the data is invalid.
37
+ */
38
+ export declare function parseECHConfigList(data: Buffer): ECHParameters | null;
39
+ /**
40
+ * Generate a GREASE Encrypted Client Hello extension payload.
41
+ *
42
+ * @returns {Buffer} Random GREASE ECH extension data.
43
+ */
44
+ export declare function generateGreaseECH(): Buffer;
45
+ /** Parsed HPKE key configuration from an ECHConfig entry. */
46
+ export interface HpkeKeyConfig {
47
+ /** Configuration identifier byte. */
48
+ configId: number;
49
+ /** Key Encapsulation Mechanism identifier. */
50
+ kemId: number;
51
+ /** Receiver's public key bytes. */
52
+ publicKey: Buffer;
53
+ /** Supported KDF and AEAD cipher suite pairs. */
54
+ cipherSuites: Array<{
55
+ kdfId: number;
56
+ aeadId: number;
57
+ }>;
58
+ }
59
+ /**
60
+ * Parse the HPKE key configuration from ECHConfig contents.
61
+ *
62
+ * @param {Buffer} contents - Raw contents buffer of an ECHConfig entry.
63
+ * @returns {HpkeKeyConfig|null} Parsed HPKE key config, or `null` if malformed.
64
+ */
65
+ export declare function parseHpkeKeyConfig(contents: Buffer): HpkeKeyConfig | null;
66
+ /**
67
+ * Extract the maximum name length field from ECHConfig contents.
68
+ *
69
+ * @param {Buffer} contents - Raw ECHConfig contents.
70
+ * @returns {number} Maximum name length, or `0` if unparseable.
71
+ */
72
+ export declare function getMaxNameLength(contents: Buffer): number;
73
+ /**
74
+ * Build the outer ECH extension data for a ClientHello.
75
+ *
76
+ * @param {number} kdfId - KDF identifier.
77
+ * @param {number} aeadId - AEAD identifier.
78
+ * @param {number} configId - ECH config ID.
79
+ * @param {Buffer} enc - HPKE encapsulated key.
80
+ * @param {Buffer} payload - Encrypted inner ClientHello payload.
81
+ * @returns {Buffer} Serialized ECH outer extension bytes.
82
+ */
83
+ export declare function buildECHOuterExtData(kdfId: number, aeadId: number, configId: number, enc: Buffer, payload: Buffer): Buffer;
84
+ /** Parameters required to encrypt an inner ClientHello with ECH. */
85
+ export interface ECHEncryptionParams {
86
+ /** Selected ECH configuration entry. */
87
+ config: ECHConfig;
88
+ /** Raw bytes of the selected configuration (including version and length). */
89
+ configRaw: Buffer;
90
+ }
91
+ /**
92
+ * Extract the first raw ECHConfig entry from a serialized ECHConfigList.
93
+ *
94
+ * @param {Buffer} echConfigList - Full serialized ECHConfigList buffer.
95
+ * @returns {Buffer | null} Raw config bytes, or `null` if the list is too short.
96
+ */
97
+ export declare function extractFirstECHConfigRaw(echConfigList: Buffer): Buffer | null;
98
+ /**
99
+ * Encrypt an inner ClientHello body using HPKE for Encrypted Client Hello.
100
+ *
101
+ * @param {Buffer} innerCHBody - Serialized inner ClientHello body.
102
+ * @param {Buffer} outerCHAAD - Additional authenticated data from the outer ClientHello.
103
+ * @param {ECHConfig} config - Parsed ECH configuration entry.
104
+ * @param {Buffer} configRaw - Raw bytes of the ECH configuration.
105
+ * @returns {{ extensionData: Buffer; enc: Buffer; kdfId: number; aeadId: number; configId: number }} Extension data, encapsulated key, and algorithm identifiers.
106
+ */
107
+ export declare function echEncryptInner(innerCHBody: Buffer, outerCHAAD: Buffer, config: ECHConfig, configRaw: Buffer): {
108
+ extensionData: Buffer;
109
+ enc: Buffer;
110
+ kdfId: number;
111
+ aeadId: number;
112
+ configId: number;
113
+ };
114
+ /**
115
+ * Parse ECH retry configuration from a server's EncryptedExtensions.
116
+ *
117
+ * @param {Buffer} data - Serialized ECHConfigList from the retry_configs extension.
118
+ * @returns {ECHParameters | null} Parsed retry parameters, or `null` if invalid.
119
+ */
120
+ export declare function parseECHRetryConfigs(data: Buffer): ECHParameters | null;
121
+ /**
122
+ * Determine whether an ECH retry should be attempted.
123
+ *
124
+ * @param {number} retryCount - Number of retries already attempted.
125
+ * @param {number} maxRetries - Maximum allowed retries.
126
+ * @param {ECHParameters | null} retryConfigs - Retry ECH configs from the server.
127
+ * @returns {boolean} `true` if another retry is warranted.
128
+ */
129
+ export declare function shouldRetryECH(retryCount: number, maxRetries: number, retryConfigs: ECHParameters | null): boolean;
130
+ //# sourceMappingURL=ech.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ech.d.ts","sourceRoot":"","sources":["../../src/tls/ech.ts"],"names":[],"mappings":"AAEA,oEAAoE;AACpE,MAAM,WAAW,SAAS;IACxB,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,6DAA6D;AAC7D,MAAM,WAAW,aAAa;IAC5B,2CAA2C;IAC3C,aAAa,EAAE,MAAM,CAAC;IACtB,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,OAAO,EAAE,SAAS,EAAE,CAAC;CACtB;AAED,sDAAsD;AACtD,MAAM,WAAW,UAAU;IACzB,0BAA0B;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sCAAsC;IACtC,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAChC,oEAAoE;IACpE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAwCrE;AA4BD;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CA0B1C;AAED,6DAA6D;AAC7D,MAAM,WAAW,aAAa;IAC5B,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,YAAY,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAiCzE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiBzD;AA8HD;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAkB1H;AAED,oEAAoE;AACpE,MAAM,WAAW,mBAAmB;IAClC,wCAAwC;IACxC,MAAM,EAAE,SAAS,CAAC;IAClB,8EAA8E;IAC9E,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAU7E;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAqBtM;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAEvE;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,GAAG,IAAI,GAAG,OAAO,CAIlH"}