@nastechai-research/ui 0.13.2

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 (352) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +21 -0
  3. package/dist/assets/filler-bg0.webp +0 -0
  4. package/dist/assets.d.ts +38 -0
  5. package/dist/fonts/Collapse-Bold.woff2 +0 -0
  6. package/dist/fonts/Collapse-BoldItalic.woff2 +0 -0
  7. package/dist/fonts/Collapse-Italic.woff2 +0 -0
  8. package/dist/fonts/Collapse-Light.woff2 +0 -0
  9. package/dist/fonts/Collapse-LightItalic.woff2 +0 -0
  10. package/dist/fonts/Collapse-Regular.woff2 +0 -0
  11. package/dist/fonts/Collapse-Thin.woff2 +0 -0
  12. package/dist/fonts/Collapse-ThinItalic.woff2 +0 -0
  13. package/dist/fonts/Mondwest-Regular.woff2 +0 -0
  14. package/dist/fonts/Neuebit-Bold.woff2 +0 -0
  15. package/dist/fonts/RulesCompressed-Medium.woff2 +0 -0
  16. package/dist/fonts/RulesCompressed-Regular.woff2 +0 -0
  17. package/dist/fonts/RulesExpanded-Bold.woff2 +0 -0
  18. package/dist/fonts/RulesExpanded-Regular.woff2 +0 -0
  19. package/dist/fonts.d.ts +6 -0
  20. package/dist/fonts.js +6 -0
  21. package/dist/hooks/use-below-breakpoint.d.ts +2 -0
  22. package/dist/hooks/use-below-breakpoint.js +17 -0
  23. package/dist/hooks/use-capped-frame.d.ts +2 -0
  24. package/dist/hooks/use-capped-frame.js +15 -0
  25. package/dist/hooks/use-confirm-delete.d.ts +10 -0
  26. package/dist/hooks/use-confirm-delete.js +35 -0
  27. package/dist/hooks/use-css-var-dims.d.ts +1 -0
  28. package/dist/hooks/use-css-var-dims.js +29 -0
  29. package/dist/hooks/use-gpu-tier.d.ts +34 -0
  30. package/dist/hooks/use-gpu-tier.js +111 -0
  31. package/dist/hooks/use-render-loop.d.ts +41 -0
  32. package/dist/hooks/use-render-loop.js +63 -0
  33. package/dist/hooks/use-smooth-controls.d.ts +16 -0
  34. package/dist/hooks/use-smooth-controls.js +217 -0
  35. package/dist/hooks/use-toast.d.ts +7 -0
  36. package/dist/hooks/use-toast.js +21 -0
  37. package/dist/index.d.ts +79 -0
  38. package/dist/index.js +107 -0
  39. package/dist/ui/basic-page.d.ts +7 -0
  40. package/dist/ui/basic-page.js +18 -0
  41. package/dist/ui/build.css +4 -0
  42. package/dist/ui/components/animated-count.d.ts +10 -0
  43. package/dist/ui/components/animated-count.js +113 -0
  44. package/dist/ui/components/ascii.d.ts +10 -0
  45. package/dist/ui/components/ascii.js +79 -0
  46. package/dist/ui/components/badge.d.ts +6 -0
  47. package/dist/ui/components/badge.js +40 -0
  48. package/dist/ui/components/badges/nous-girl.d.ts +2 -0
  49. package/dist/ui/components/badges/nous-girl.js +83 -0
  50. package/dist/ui/components/blend-mode.d.ts +28 -0
  51. package/dist/ui/components/blend-mode.js +69 -0
  52. package/dist/ui/components/blink.d.ts +6 -0
  53. package/dist/ui/components/blink.js +17 -0
  54. package/dist/ui/components/bottom-sheet.d.ts +15 -0
  55. package/dist/ui/components/bottom-sheet.js +192 -0
  56. package/dist/ui/components/button.d.ts +14 -0
  57. package/dist/ui/components/button.js +147 -0
  58. package/dist/ui/components/card.d.ts +5 -0
  59. package/dist/ui/components/card.js +74 -0
  60. package/dist/ui/components/checkbox.d.ts +2 -0
  61. package/dist/ui/components/checkbox.js +27 -0
  62. package/dist/ui/components/command-block.d.ts +24 -0
  63. package/dist/ui/components/command-block.js +56 -0
  64. package/dist/ui/components/confirm-dialog.d.ts +13 -0
  65. package/dist/ui/components/confirm-dialog.js +113 -0
  66. package/dist/ui/components/cursor.d.ts +3 -0
  67. package/dist/ui/components/cursor.js +97 -0
  68. package/dist/ui/components/dialog.d.ts +15 -0
  69. package/dist/ui/components/dialog.js +171 -0
  70. package/dist/ui/components/dropdown-menu.d.ts +12 -0
  71. package/dist/ui/components/dropdown-menu.js +102 -0
  72. package/dist/ui/components/fit-text/fit-text.css +42 -0
  73. package/dist/ui/components/fit-text/index.d.ts +9 -0
  74. package/dist/ui/components/fit-text/index.js +25 -0
  75. package/dist/ui/components/graphs/bar-chart.d.ts +12 -0
  76. package/dist/ui/components/graphs/bar-chart.js +129 -0
  77. package/dist/ui/components/graphs/index.d.ts +3 -0
  78. package/dist/ui/components/graphs/index.js +4 -0
  79. package/dist/ui/components/graphs/line-chart.d.ts +14 -0
  80. package/dist/ui/components/graphs/line-chart.js +175 -0
  81. package/dist/ui/components/graphs/utils.d.ts +52 -0
  82. package/dist/ui/components/graphs/utils.js +162 -0
  83. package/dist/ui/components/grid/grid.css +79 -0
  84. package/dist/ui/components/grid/index.d.ts +2 -0
  85. package/dist/ui/components/grid/index.js +17 -0
  86. package/dist/ui/components/hover-bg.d.ts +1 -0
  87. package/dist/ui/components/hover-bg.js +14 -0
  88. package/dist/ui/components/icons/arrow.d.ts +6 -0
  89. package/dist/ui/components/icons/arrow.js +44 -0
  90. package/dist/ui/components/icons/check.d.ts +2 -0
  91. package/dist/ui/components/icons/check.js +13 -0
  92. package/dist/ui/components/icons/chevron.d.ts +6 -0
  93. package/dist/ui/components/icons/chevron.js +51 -0
  94. package/dist/ui/components/icons/discord.d.ts +2 -0
  95. package/dist/ui/components/icons/discord.js +15 -0
  96. package/dist/ui/components/icons/eye.d.ts +2 -0
  97. package/dist/ui/components/icons/eye.js +8 -0
  98. package/dist/ui/components/icons/gear.d.ts +6 -0
  99. package/dist/ui/components/icons/gear.js +30 -0
  100. package/dist/ui/components/icons/github.d.ts +2 -0
  101. package/dist/ui/components/icons/github.js +15 -0
  102. package/dist/ui/components/icons/hamburger.d.ts +6 -0
  103. package/dist/ui/components/icons/hamburger.js +56 -0
  104. package/dist/ui/components/icons/heart.d.ts +2 -0
  105. package/dist/ui/components/icons/heart.js +11 -0
  106. package/dist/ui/components/icons/index.d.ts +12 -0
  107. package/dist/ui/components/icons/index.js +13 -0
  108. package/dist/ui/components/icons/link.d.ts +2 -0
  109. package/dist/ui/components/icons/link.js +13 -0
  110. package/dist/ui/components/icons/minus.d.ts +2 -0
  111. package/dist/ui/components/icons/minus.js +13 -0
  112. package/dist/ui/components/icons/search.d.ts +2 -0
  113. package/dist/ui/components/icons/search.js +33 -0
  114. package/dist/ui/components/image-distortion.d.ts +21 -0
  115. package/dist/ui/components/image-distortion.js +398 -0
  116. package/dist/ui/components/input.d.ts +1 -0
  117. package/dist/ui/components/input.js +21 -0
  118. package/dist/ui/components/label.d.ts +1 -0
  119. package/dist/ui/components/label.js +18 -0
  120. package/dist/ui/components/leva-client.d.ts +1 -0
  121. package/dist/ui/components/leva-client.js +12 -0
  122. package/dist/ui/components/list-item.d.ts +6 -0
  123. package/dist/ui/components/list-item.js +27 -0
  124. package/dist/ui/components/overlays/blend-modes.d.ts +1 -0
  125. package/dist/ui/components/overlays/blend-modes.js +14 -0
  126. package/dist/ui/components/overlays/glitch.d.ts +6 -0
  127. package/dist/ui/components/overlays/glitch.js +209 -0
  128. package/dist/ui/components/overlays/greys.d.ts +6 -0
  129. package/dist/ui/components/overlays/greys.js +339 -0
  130. package/dist/ui/components/overlays/index.d.ts +14 -0
  131. package/dist/ui/components/overlays/index.js +34 -0
  132. package/dist/ui/components/overlays/lens-layers.d.ts +14 -0
  133. package/dist/ui/components/overlays/lens-layers.js +95 -0
  134. package/dist/ui/components/overlays/lens.d.ts +44 -0
  135. package/dist/ui/components/overlays/lens.js +60 -0
  136. package/dist/ui/components/overlays/noise.d.ts +6 -0
  137. package/dist/ui/components/overlays/noise.js +136 -0
  138. package/dist/ui/components/overlays/vignette.d.ts +6 -0
  139. package/dist/ui/components/overlays/vignette.js +47 -0
  140. package/dist/ui/components/poster.d.ts +62 -0
  141. package/dist/ui/components/poster.js +256 -0
  142. package/dist/ui/components/progress.d.ts +9 -0
  143. package/dist/ui/components/progress.js +53 -0
  144. package/dist/ui/components/scene-canvas.d.ts +23 -0
  145. package/dist/ui/components/scene-canvas.js +179 -0
  146. package/dist/ui/components/scramble.d.ts +9 -0
  147. package/dist/ui/components/scramble.js +63 -0
  148. package/dist/ui/components/segmented.d.ts +20 -0
  149. package/dist/ui/components/segmented.js +51 -0
  150. package/dist/ui/components/select.d.ts +18 -0
  151. package/dist/ui/components/select.js +215 -0
  152. package/dist/ui/components/selection-switcher.d.ts +1 -0
  153. package/dist/ui/components/selection-switcher.js +34 -0
  154. package/dist/ui/components/separator.d.ts +5 -0
  155. package/dist/ui/components/separator.js +22 -0
  156. package/dist/ui/components/shader.d.ts +7 -0
  157. package/dist/ui/components/shader.js +60 -0
  158. package/dist/ui/components/socials.d.ts +20 -0
  159. package/dist/ui/components/socials.js +21 -0
  160. package/dist/ui/components/spinner.d.ts +20 -0
  161. package/dist/ui/components/spinner.js +38 -0
  162. package/dist/ui/components/stats.d.ts +16 -0
  163. package/dist/ui/components/stats.js +36 -0
  164. package/dist/ui/components/switch.d.ts +7 -0
  165. package/dist/ui/components/switch.js +37 -0
  166. package/dist/ui/components/tabs.d.ts +14 -0
  167. package/dist/ui/components/tabs.js +44 -0
  168. package/dist/ui/components/terminal-demo.d.ts +32 -0
  169. package/dist/ui/components/terminal-demo.js +125 -0
  170. package/dist/ui/components/theme-toggle.d.ts +6 -0
  171. package/dist/ui/components/theme-toggle.js +66 -0
  172. package/dist/ui/components/tier-card.d.ts +53 -0
  173. package/dist/ui/components/tier-card.js +146 -0
  174. package/dist/ui/components/toast.d.ts +8 -0
  175. package/dist/ui/components/toast.js +39 -0
  176. package/dist/ui/components/tv.d.ts +3 -0
  177. package/dist/ui/components/tv.js +239 -0
  178. package/dist/ui/components/typography/h1.d.ts +11 -0
  179. package/dist/ui/components/typography/h1.js +18 -0
  180. package/dist/ui/components/typography/h2.d.ts +11 -0
  181. package/dist/ui/components/typography/h2.js +18 -0
  182. package/dist/ui/components/typography/index.d.ts +15 -0
  183. package/dist/ui/components/typography/index.js +41 -0
  184. package/dist/ui/components/typography/legend.d.ts +6 -0
  185. package/dist/ui/components/typography/legend.js +20 -0
  186. package/dist/ui/components/typography/small.d.ts +2 -0
  187. package/dist/ui/components/typography/small.js +9 -0
  188. package/dist/ui/components/watchlist.d.ts +11 -0
  189. package/dist/ui/components/watchlist.js +80 -0
  190. package/dist/ui/fonts.css +63 -0
  191. package/dist/ui/footer.d.ts +20 -0
  192. package/dist/ui/footer.js +65 -0
  193. package/dist/ui/globals.css +395 -0
  194. package/dist/ui/header.d.ts +41 -0
  195. package/dist/ui/header.js +270 -0
  196. package/dist/ui/layout-wrapper.d.ts +1 -0
  197. package/dist/ui/layout-wrapper.js +7 -0
  198. package/dist/utils/color.d.ts +4 -0
  199. package/dist/utils/color.js +14 -0
  200. package/dist/utils/index.d.ts +15 -0
  201. package/dist/utils/index.js +48 -0
  202. package/dist/utils/poly.d.ts +8 -0
  203. package/dist/utils/poly.js +3 -0
  204. package/package.json +120 -0
  205. package/src/assets/filler-bg0.webp +0 -0
  206. package/src/assets.d.ts +38 -0
  207. package/src/fonts/Collapse-Bold.woff2 +0 -0
  208. package/src/fonts/Collapse-BoldItalic.woff2 +0 -0
  209. package/src/fonts/Collapse-Italic.woff2 +0 -0
  210. package/src/fonts/Collapse-Light.woff2 +0 -0
  211. package/src/fonts/Collapse-LightItalic.woff2 +0 -0
  212. package/src/fonts/Collapse-Regular.woff2 +0 -0
  213. package/src/fonts/Collapse-Thin.woff2 +0 -0
  214. package/src/fonts/Collapse-ThinItalic.woff2 +0 -0
  215. package/src/fonts/Mondwest-Regular.woff2 +0 -0
  216. package/src/fonts/Neuebit-Bold.woff2 +0 -0
  217. package/src/fonts/RulesCompressed-Medium.woff2 +0 -0
  218. package/src/fonts/RulesCompressed-Regular.woff2 +0 -0
  219. package/src/fonts/RulesExpanded-Bold.woff2 +0 -0
  220. package/src/fonts/RulesExpanded-Regular.woff2 +0 -0
  221. package/src/fonts.ts +6 -0
  222. package/src/hooks/use-below-breakpoint.ts +21 -0
  223. package/src/hooks/use-capped-frame.ts +18 -0
  224. package/src/hooks/use-confirm-delete.ts +43 -0
  225. package/src/hooks/use-css-var-dims.ts +39 -0
  226. package/src/hooks/use-gpu-tier.ts +190 -0
  227. package/src/hooks/use-render-loop.ts +121 -0
  228. package/src/hooks/use-smooth-controls.ts +318 -0
  229. package/src/hooks/use-toast.ts +29 -0
  230. package/src/index.ts +130 -0
  231. package/src/ui/basic-page.tsx +34 -0
  232. package/src/ui/build.css +4 -0
  233. package/src/ui/components/animated-count.stories.tsx +67 -0
  234. package/src/ui/components/animated-count.tsx +168 -0
  235. package/src/ui/components/ascii.stories.tsx +30 -0
  236. package/src/ui/components/ascii.tsx +110 -0
  237. package/src/ui/components/badge.stories.tsx +31 -0
  238. package/src/ui/components/badge.tsx +60 -0
  239. package/src/ui/components/badges/nous-girl.tsx +52 -0
  240. package/src/ui/components/blend-mode.stories.tsx +33 -0
  241. package/src/ui/components/blend-mode.tsx +129 -0
  242. package/src/ui/components/blink.stories.tsx +32 -0
  243. package/src/ui/components/blink.tsx +21 -0
  244. package/src/ui/components/bottom-sheet.stories.tsx +43 -0
  245. package/src/ui/components/bottom-sheet.tsx +227 -0
  246. package/src/ui/components/button.stories.tsx +68 -0
  247. package/src/ui/components/button.tsx +170 -0
  248. package/src/ui/components/card.stories.tsx +63 -0
  249. package/src/ui/components/card.tsx +85 -0
  250. package/src/ui/components/checkbox.stories.tsx +113 -0
  251. package/src/ui/components/checkbox.tsx +36 -0
  252. package/src/ui/components/command-block.stories.tsx +52 -0
  253. package/src/ui/components/command-block.tsx +86 -0
  254. package/src/ui/components/confirm-dialog.stories.tsx +91 -0
  255. package/src/ui/components/confirm-dialog.tsx +130 -0
  256. package/src/ui/components/cursor.tsx +115 -0
  257. package/src/ui/components/dialog.stories.tsx +169 -0
  258. package/src/ui/components/dialog.tsx +177 -0
  259. package/src/ui/components/dropdown-menu.stories.tsx +52 -0
  260. package/src/ui/components/dropdown-menu.tsx +117 -0
  261. package/src/ui/components/fit-text/fit-text.css +42 -0
  262. package/src/ui/components/fit-text/index.stories.tsx +33 -0
  263. package/src/ui/components/fit-text/index.tsx +45 -0
  264. package/src/ui/components/forms.stories.tsx +173 -0
  265. package/src/ui/components/graphs/bar-chart.tsx +153 -0
  266. package/src/ui/components/graphs/index.stories.tsx +64 -0
  267. package/src/ui/components/graphs/index.tsx +4 -0
  268. package/src/ui/components/graphs/line-chart.tsx +213 -0
  269. package/src/ui/components/graphs/utils.tsx +265 -0
  270. package/src/ui/components/grid/grid.css +79 -0
  271. package/src/ui/components/grid/index.tsx +19 -0
  272. package/src/ui/components/hover-bg.stories.tsx +29 -0
  273. package/src/ui/components/hover-bg.tsx +15 -0
  274. package/src/ui/components/icons/arrow.tsx +42 -0
  275. package/src/ui/components/icons/check.tsx +14 -0
  276. package/src/ui/components/icons/chevron.tsx +45 -0
  277. package/src/ui/components/icons/discord.tsx +16 -0
  278. package/src/ui/components/icons/eye.tsx +12 -0
  279. package/src/ui/components/icons/gear.tsx +51 -0
  280. package/src/ui/components/icons/github.tsx +16 -0
  281. package/src/ui/components/icons/hamburger.tsx +52 -0
  282. package/src/ui/components/icons/heart.tsx +12 -0
  283. package/src/ui/components/icons/index.ts +12 -0
  284. package/src/ui/components/icons/link.tsx +14 -0
  285. package/src/ui/components/icons/minus.tsx +14 -0
  286. package/src/ui/components/icons/search.tsx +28 -0
  287. package/src/ui/components/image-distortion.stories.tsx +120 -0
  288. package/src/ui/components/image-distortion.tsx +499 -0
  289. package/src/ui/components/input.stories.tsx +39 -0
  290. package/src/ui/components/input.tsx +20 -0
  291. package/src/ui/components/label.stories.tsx +26 -0
  292. package/src/ui/components/label.tsx +16 -0
  293. package/src/ui/components/leva-client.tsx +14 -0
  294. package/src/ui/components/list-item.stories.tsx +83 -0
  295. package/src/ui/components/list-item.tsx +37 -0
  296. package/src/ui/components/overlays/blend-modes.ts +13 -0
  297. package/src/ui/components/overlays/glitch.tsx +243 -0
  298. package/src/ui/components/overlays/greys.tsx +386 -0
  299. package/src/ui/components/overlays/index.tsx +47 -0
  300. package/src/ui/components/overlays/lens-layers.tsx +121 -0
  301. package/src/ui/components/overlays/lens.ts +91 -0
  302. package/src/ui/components/overlays/noise.tsx +174 -0
  303. package/src/ui/components/overlays/vignette.tsx +60 -0
  304. package/src/ui/components/poster.stories.tsx +513 -0
  305. package/src/ui/components/poster.tsx +411 -0
  306. package/src/ui/components/progress.stories.tsx +48 -0
  307. package/src/ui/components/progress.tsx +56 -0
  308. package/src/ui/components/scene-canvas.tsx +254 -0
  309. package/src/ui/components/scramble.stories.tsx +49 -0
  310. package/src/ui/components/scramble.tsx +95 -0
  311. package/src/ui/components/segmented.stories.tsx +101 -0
  312. package/src/ui/components/segmented.tsx +81 -0
  313. package/src/ui/components/select.stories.tsx +88 -0
  314. package/src/ui/components/select.tsx +267 -0
  315. package/src/ui/components/selection-switcher.tsx +44 -0
  316. package/src/ui/components/separator.stories.tsx +33 -0
  317. package/src/ui/components/separator.tsx +24 -0
  318. package/src/ui/components/shader.tsx +83 -0
  319. package/src/ui/components/socials.tsx +42 -0
  320. package/src/ui/components/spinner.stories.tsx +101 -0
  321. package/src/ui/components/spinner.tsx +60 -0
  322. package/src/ui/components/stats.stories.tsx +24 -0
  323. package/src/ui/components/stats.tsx +53 -0
  324. package/src/ui/components/switch.stories.tsx +77 -0
  325. package/src/ui/components/switch.tsx +48 -0
  326. package/src/ui/components/tabs.stories.tsx +101 -0
  327. package/src/ui/components/tabs.tsx +66 -0
  328. package/src/ui/components/terminal-demo.stories.tsx +67 -0
  329. package/src/ui/components/terminal-demo.tsx +189 -0
  330. package/src/ui/components/theme-toggle.stories.tsx +47 -0
  331. package/src/ui/components/theme-toggle.tsx +66 -0
  332. package/src/ui/components/tier-card.stories.tsx +217 -0
  333. package/src/ui/components/tier-card.tsx +190 -0
  334. package/src/ui/components/toast.stories.tsx +55 -0
  335. package/src/ui/components/toast.tsx +49 -0
  336. package/src/ui/components/tv.stories.tsx +37 -0
  337. package/src/ui/components/tv.tsx +257 -0
  338. package/src/ui/components/typography/h1.tsx +18 -0
  339. package/src/ui/components/typography/h2.tsx +18 -0
  340. package/src/ui/components/typography/index.tsx +54 -0
  341. package/src/ui/components/typography/legend.tsx +24 -0
  342. package/src/ui/components/typography/small.tsx +11 -0
  343. package/src/ui/components/watchlist.stories.tsx +33 -0
  344. package/src/ui/components/watchlist.tsx +105 -0
  345. package/src/ui/fonts.css +63 -0
  346. package/src/ui/footer.tsx +111 -0
  347. package/src/ui/globals.css +395 -0
  348. package/src/ui/header.tsx +398 -0
  349. package/src/ui/layout-wrapper.tsx +11 -0
  350. package/src/utils/color.ts +21 -0
  351. package/src/utils/index.ts +62 -0
  352. package/src/utils/poly.ts +26 -0
@@ -0,0 +1,256 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useState } from "react";
4
+ import fillerBg from "../../assets/filler-bg0.webp";
5
+ import { cn } from "../../utils/index.js";
6
+ import { Blink } from "./blink.js";
7
+ import { ImageDistortion } from "./image-distortion.js";
8
+ import { Typography } from "./typography/index.js";
9
+ import { Small } from "./typography/small.js";
10
+ const ASPECT_CONFIG = {
11
+ landscape: { defaultLayout: "split", height: 1080, width: 1920 },
12
+ portrait: { defaultLayout: "split", height: 1350, width: 1080 },
13
+ square: { defaultLayout: "split", height: 1080, width: 1080 },
14
+ story: { defaultLayout: "stacked", height: 1920, width: 1080 },
15
+ wide: { defaultLayout: "split", height: 900, width: 1600 }
16
+ };
17
+ const DEFAULT_SRC = fillerBg.src ?? fillerBg;
18
+ function useUtcClock() {
19
+ const [now, setNow] = useState(null);
20
+ useEffect(() => {
21
+ setNow(/* @__PURE__ */ new Date());
22
+ const id = setInterval(() => setNow(/* @__PURE__ */ new Date()), 1e3);
23
+ return () => clearInterval(id);
24
+ }, []);
25
+ return now ? now.toISOString().slice(11, 19) : "--:--:--";
26
+ }
27
+ function CornerMark({ className }) {
28
+ return /* @__PURE__ */ jsxs(
29
+ "span",
30
+ {
31
+ "aria-hidden": true,
32
+ className: cn(
33
+ "pointer-events-none absolute block size-4 opacity-50",
34
+ className
35
+ ),
36
+ children: [
37
+ /* @__PURE__ */ jsx("span", { className: "absolute top-1/2 left-0 h-px w-full -translate-y-1/2 bg-current" }),
38
+ /* @__PURE__ */ jsx("span", { className: "absolute top-0 left-1/2 h-full w-px -translate-x-1/2 bg-current" })
39
+ ]
40
+ }
41
+ );
42
+ }
43
+ function ChannelDot() {
44
+ return /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1.5", children: [
45
+ /* @__PURE__ */ jsx("span", { className: "bg-midground size-1.5 animate-pulse rounded-full" }),
46
+ /* @__PURE__ */ jsx(Small, { className: "opacity-70", children: "REC" })
47
+ ] });
48
+ }
49
+ function ScanlineOverlay() {
50
+ return /* @__PURE__ */ jsx(
51
+ "div",
52
+ {
53
+ "aria-hidden": true,
54
+ className: "pointer-events-none absolute inset-0 opacity-20 mix-blend-overlay",
55
+ style: {
56
+ backgroundImage: "repeating-linear-gradient(0deg, transparent 0, transparent 2px, rgba(255,255,255,0.08) 2px, rgba(255,255,255,0.08) 3px)"
57
+ }
58
+ }
59
+ );
60
+ }
61
+ export function Poster({
62
+ aspect = "square",
63
+ autoPlay = "slash",
64
+ body,
65
+ border = true,
66
+ channel,
67
+ children,
68
+ className,
69
+ cornerMarks = true,
70
+ eyebrow,
71
+ headline = ["An Agent", "That Grows", "With You."],
72
+ layout,
73
+ scale = 1,
74
+ seal = "MIT \xB7 2026",
75
+ signature,
76
+ src = DEFAULT_SRC,
77
+ tags,
78
+ tint,
79
+ tintStrength,
80
+ variant = "vibe",
81
+ ...rest
82
+ }) {
83
+ const config = ASPECT_CONFIG[aspect];
84
+ const resolvedLayout = layout ?? config.defaultLayout;
85
+ const outerProps = {
86
+ // `text-midground` (not `text-foreground`) is the readable on-canvas
87
+ // color across every lens. `--foreground` is really the lens's inversion
88
+ // layer color: on dark lenses it has `fgOpacity: 0` and resolves to
89
+ // fully-transparent via `color-mix`, which would make text invisible.
90
+ // `--midground` always has opacity 1 and picks up each lens's accent.
91
+ className: cn(
92
+ "text-midground relative overflow-hidden font-sans",
93
+ border && "border border-current/25",
94
+ className
95
+ ),
96
+ style: {
97
+ aspectRatio: `${config.width} / ${config.height}`,
98
+ background: "var(--background)",
99
+ containerType: "inline-size",
100
+ fontSize: `${16 / config.width * 100}cqi`,
101
+ maxHeight: "calc(100dvh - 8rem)",
102
+ maxWidth: "100%",
103
+ width: `${config.width * scale}px`
104
+ },
105
+ ...rest
106
+ };
107
+ if (variant === "vibe") {
108
+ return /* @__PURE__ */ jsx("div", { ...outerProps, children: /* @__PURE__ */ jsx(
109
+ VibeContent,
110
+ {
111
+ autoPlay,
112
+ channel,
113
+ cornerMarks,
114
+ signature,
115
+ src,
116
+ tint,
117
+ tintStrength
118
+ }
119
+ ) });
120
+ }
121
+ const headlineLines = Array.isArray(headline) ? headline : [headline];
122
+ return /* @__PURE__ */ jsxs("div", { ...outerProps, className: cn("flex flex-col", outerProps.className), children: [
123
+ /* @__PURE__ */ jsx(DispatchHeader, { channel }),
124
+ /* @__PURE__ */ jsxs(
125
+ "div",
126
+ {
127
+ className: cn(
128
+ "relative min-h-0 min-w-0 flex-1",
129
+ resolvedLayout === "split" ? "grid grid-cols-[3fr_2fr]" : "grid grid-rows-[3fr_2fr]"
130
+ ),
131
+ children: [
132
+ /* @__PURE__ */ jsxs(
133
+ "div",
134
+ {
135
+ className: cn(
136
+ "relative overflow-hidden border-current/20",
137
+ resolvedLayout === "split" ? "border-r" : "border-b"
138
+ ),
139
+ style: { backgroundColor: "var(--background)" },
140
+ children: [
141
+ /* @__PURE__ */ jsx(
142
+ ImageDistortion,
143
+ {
144
+ autoPlay,
145
+ src,
146
+ tint,
147
+ tintStrength
148
+ }
149
+ ),
150
+ cornerMarks && /* @__PURE__ */ jsxs(Fragment, { children: [
151
+ /* @__PURE__ */ jsx(CornerMark, { className: "top-3 left-3" }),
152
+ /* @__PURE__ */ jsx(CornerMark, { className: "top-3 right-3" }),
153
+ /* @__PURE__ */ jsx(CornerMark, { className: "bottom-3 left-3" }),
154
+ /* @__PURE__ */ jsx(CornerMark, { className: "right-3 bottom-3" })
155
+ ] }),
156
+ /* @__PURE__ */ jsx(ScanlineOverlay, {}),
157
+ /* @__PURE__ */ jsx(Small, { className: "absolute bottom-4 left-4 z-1 opacity-80", children: "Hermes Agent" })
158
+ ]
159
+ }
160
+ ),
161
+ /* @__PURE__ */ jsxs("aside", { className: "relative flex min-w-0 flex-col justify-between gap-8 p-8", children: [
162
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-5", children: [
163
+ eyebrow && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
164
+ /* @__PURE__ */ jsx("span", { className: "bg-midground/80 h-px flex-1" }),
165
+ /* @__PURE__ */ jsx(Small, { className: "opacity-80", children: eyebrow })
166
+ ] }),
167
+ children ?? /* @__PURE__ */ jsxs(Fragment, { children: [
168
+ /* @__PURE__ */ jsx(
169
+ Typography,
170
+ {
171
+ as: "h1",
172
+ className: "text-[2.75em] leading-[0.95] font-bold tracking-[-0.01em]",
173
+ expanded: true,
174
+ children: headlineLines.map((line, i) => /* @__PURE__ */ jsx("span", { className: "block", children: line }, `${line}-${i}`))
175
+ }
176
+ ),
177
+ body && /* @__PURE__ */ jsx("p", { className: "text-[1.0625em] leading-[1.5] tracking-normal normal-case opacity-60", children: body })
178
+ ] })
179
+ ] }),
180
+ tags && tags.length > 0 && /* @__PURE__ */ jsx("ul", { className: "flex flex-col gap-2 border-t border-current/15 pt-4", children: tags.map((tag, i) => /* @__PURE__ */ jsxs(
181
+ "li",
182
+ {
183
+ className: "flex items-baseline justify-between gap-3",
184
+ children: [
185
+ /* @__PURE__ */ jsx(Small, { className: "font-courier opacity-40", children: String(i + 1).padStart(3, "0") }),
186
+ /* @__PURE__ */ jsx(Small, { className: "opacity-80", children: tag }),
187
+ /* @__PURE__ */ jsx("span", { className: "mx-1 h-px flex-1 translate-y-[-3px] border-b border-dotted border-current/25" }),
188
+ /* @__PURE__ */ jsxs(Small, { className: "font-courier opacity-40", children: [
189
+ String(i + 1).padStart(2, "0"),
190
+ "/",
191
+ String(tags.length).padStart(2, "0")
192
+ ] })
193
+ ]
194
+ },
195
+ `${tag}-${i}`
196
+ )) })
197
+ ] })
198
+ ]
199
+ }
200
+ ),
201
+ /* @__PURE__ */ jsxs("footer", { className: "flex items-center justify-between gap-4 border-t border-current/20 px-6 py-3", children: [
202
+ /* @__PURE__ */ jsxs(Small, { className: "opacity-70", children: [
203
+ signature,
204
+ /* @__PURE__ */ jsx(Blink, {})
205
+ ] }),
206
+ /* @__PURE__ */ jsx(Small, { className: "font-courier opacity-40", children: seal })
207
+ ] })
208
+ ] });
209
+ }
210
+ function DispatchHeader({ channel }) {
211
+ const clock = useUtcClock();
212
+ return /* @__PURE__ */ jsxs("header", { className: "flex items-center justify-between gap-4 border-b border-current/20 px-6 py-3", children: [
213
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
214
+ /* @__PURE__ */ jsx("span", { className: "bg-midground size-2 rounded-sm opacity-70" }),
215
+ /* @__PURE__ */ jsx(Small, { className: "opacity-70", children: channel })
216
+ ] }),
217
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4", children: [
218
+ /* @__PURE__ */ jsx(ChannelDot, {}),
219
+ /* @__PURE__ */ jsxs(Small, { className: "font-courier opacity-50", children: [
220
+ clock,
221
+ " UTC"
222
+ ] })
223
+ ] })
224
+ ] });
225
+ }
226
+ function VibeContent({
227
+ autoPlay,
228
+ channel,
229
+ cornerMarks,
230
+ signature,
231
+ src,
232
+ tint,
233
+ tintStrength
234
+ }) {
235
+ return /* @__PURE__ */ jsxs("div", { className: "absolute inset-0", children: [
236
+ /* @__PURE__ */ jsx(
237
+ ImageDistortion,
238
+ {
239
+ autoPlay,
240
+ src,
241
+ tint,
242
+ tintStrength
243
+ }
244
+ ),
245
+ cornerMarks && /* @__PURE__ */ jsxs(Fragment, { children: [
246
+ /* @__PURE__ */ jsx(CornerMark, { className: "top-5 left-5" }),
247
+ /* @__PURE__ */ jsx(CornerMark, { className: "top-5 right-5" }),
248
+ /* @__PURE__ */ jsx(CornerMark, { className: "bottom-5 left-5" }),
249
+ /* @__PURE__ */ jsx(CornerMark, { className: "right-5 bottom-5" })
250
+ ] }),
251
+ /* @__PURE__ */ jsx(ScanlineOverlay, {}),
252
+ channel && /* @__PURE__ */ jsx(Small, { className: "absolute top-5 left-10 z-1 text-[0.75em] opacity-70", children: channel }),
253
+ /* @__PURE__ */ jsx(Small, { className: "absolute right-10 bottom-5 z-1 text-[0.75em] opacity-80", children: signature })
254
+ ] });
255
+ }
256
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBjbGllbnQnXG5cbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcblxuaW1wb3J0IGZpbGxlckJnIGZyb20gJy4uLy4uL2Fzc2V0cy9maWxsZXItYmcwLndlYnAnXG5pbXBvcnQgeyBjbiB9IGZyb20gJy4uLy4uL3V0aWxzJ1xuXG5pbXBvcnQgeyBCbGluayB9IGZyb20gJy4vYmxpbmsnXG5pbXBvcnQgeyBJbWFnZURpc3RvcnRpb24gfSBmcm9tICcuL2ltYWdlLWRpc3RvcnRpb24nXG5pbXBvcnQgeyBUeXBvZ3JhcGh5IH0gZnJvbSAnLi90eXBvZ3JhcGh5J1xuaW1wb3J0IHsgU21hbGwgfSBmcm9tICcuL3R5cG9ncmFwaHkvc21hbGwnXG5cbmltcG9ydCB0eXBlIHsgQXV0b1BsYXlQYXR0ZXJuIH0gZnJvbSAnLi9pbWFnZS1kaXN0b3J0aW9uJ1xuXG5jb25zdCBBU1BFQ1RfQ09ORklHOiBSZWNvcmQ8XG4gIFBvc3RlckFzcGVjdCxcbiAgeyBkZWZhdWx0TGF5b3V0OiAnc3BsaXQnIHwgJ3N0YWNrZWQnOyBoZWlnaHQ6IG51bWJlcjsgd2lkdGg6IG51bWJlciB9XG4+ID0ge1xuICBsYW5kc2NhcGU6IHsgZGVmYXVsdExheW91dDogJ3NwbGl0JywgaGVpZ2h0OiAxMDgwLCB3aWR0aDogMTkyMCB9LFxuICBwb3J0cmFpdDogeyBkZWZhdWx0TGF5b3V0OiAnc3BsaXQnLCBoZWlnaHQ6IDEzNTAsIHdpZHRoOiAxMDgwIH0sXG4gIHNxdWFyZTogeyBkZWZhdWx0TGF5b3V0OiAnc3BsaXQnLCBoZWlnaHQ6IDEwODAsIHdpZHRoOiAxMDgwIH0sXG4gIHN0b3J5OiB7IGRlZmF1bHRMYXlvdXQ6ICdzdGFja2VkJywgaGVpZ2h0OiAxOTIwLCB3aWR0aDogMTA4MCB9LFxuICB3aWRlOiB7IGRlZmF1bHRMYXlvdXQ6ICdzcGxpdCcsIGhlaWdodDogOTAwLCB3aWR0aDogMTYwMCB9XG59XG5cbmNvbnN0IERFRkFVTFRfU1JDID1cbiAgKGZpbGxlckJnIGFzIHsgc3JjPzogc3RyaW5nIH0pLnNyYyA/PyAoZmlsbGVyQmcgYXMgdW5rbm93biBhcyBzdHJpbmcpXG5cbmZ1bmN0aW9uIHVzZVV0Y0Nsb2NrKCkge1xuICBjb25zdCBbbm93LCBzZXROb3ddID0gdXNlU3RhdGU8RGF0ZSB8IG51bGw+KG51bGwpXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBzZXROb3cobmV3IERhdGUoKSlcbiAgICBjb25zdCBpZCA9IHNldEludGVydmFsKCgpID0+IHNldE5vdyhuZXcgRGF0ZSgpKSwgMTAwMClcblxuICAgIHJldHVybiAoKSA9PiBjbGVhckludGVydmFsKGlkKVxuICB9LCBbXSlcblxuICByZXR1cm4gbm93ID8gbm93LnRvSVNPU3RyaW5nKCkuc2xpY2UoMTEsIDE5KSA6ICctLTotLTotLSdcbn1cblxuZnVuY3Rpb24gQ29ybmVyTWFyayh7IGNsYXNzTmFtZSB9OiB7IGNsYXNzTmFtZT86IHN0cmluZyB9KSB7XG4gIHJldHVybiAoXG4gICAgPHNwYW5cbiAgICAgIGFyaWEtaGlkZGVuXG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAncG9pbnRlci1ldmVudHMtbm9uZSBhYnNvbHV0ZSBibG9jayBzaXplLTQgb3BhY2l0eS01MCcsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICA+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9XCJhYnNvbHV0ZSB0b3AtMS8yIGxlZnQtMCBoLXB4IHctZnVsbCAtdHJhbnNsYXRlLXktMS8yIGJnLWN1cnJlbnRcIiAvPlxuXG4gICAgICA8c3BhbiBjbGFzc05hbWU9XCJhYnNvbHV0ZSB0b3AtMCBsZWZ0LTEvMiBoLWZ1bGwgdy1weCAtdHJhbnNsYXRlLXgtMS8yIGJnLWN1cnJlbnRcIiAvPlxuICAgIDwvc3Bhbj5cbiAgKVxufVxuXG5mdW5jdGlvbiBDaGFubmVsRG90KCkge1xuICByZXR1cm4gKFxuICAgIDxzcGFuIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xLjVcIj5cbiAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImJnLW1pZGdyb3VuZCBzaXplLTEuNSBhbmltYXRlLXB1bHNlIHJvdW5kZWQtZnVsbFwiIC8+XG5cbiAgICAgIDxTbWFsbCBjbGFzc05hbWU9XCJvcGFjaXR5LTcwXCI+UkVDPC9TbWFsbD5cbiAgICA8L3NwYW4+XG4gIClcbn1cblxuZnVuY3Rpb24gU2NhbmxpbmVPdmVybGF5KCkge1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGFyaWEtaGlkZGVuXG4gICAgICBjbGFzc05hbWU9XCJwb2ludGVyLWV2ZW50cy1ub25lIGFic29sdXRlIGluc2V0LTAgb3BhY2l0eS0yMCBtaXgtYmxlbmQtb3ZlcmxheVwiXG4gICAgICBzdHlsZT17e1xuICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6XG4gICAgICAgICAgJ3JlcGVhdGluZy1saW5lYXItZ3JhZGllbnQoMGRlZywgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQgMnB4LCByZ2JhKDI1NSwyNTUsMjU1LDAuMDgpIDJweCwgcmdiYSgyNTUsMjU1LDI1NSwwLjA4KSAzcHgpJ1xuICAgICAgfX1cbiAgICAvPlxuICApXG59XG5cbi8qKlxuICogU29jaWFsLXJlYWR5IGdsaXRjaHkgY2FyZCBidWlsdCBhcm91bmQgdGhlIGhhcHRpYy1kaXN0b3J0aW9uIGltYWdlXG4gKiBjb21wb25lbnQuIFRoZSBwb3N0ZXIgcnVucyB0aGUgc3dvcmQtZ3V5IGRpc3RvcnRpb24gb24gYW4gYXV0by1hbmltYXRlZFxuICogc2xhc2ggcGF0dGVybiBzbyBpdCBjYW4gYmUgc2NyZWVuLXJlY29yZGVkIGFzIGEgR0lGIHdpdGhvdXQgYSBodW1hblxuICogbW92aW5nIGEgY3Vyc29yLlxuICpcbiAqIFR3byB2YXJpYW50cywgbWF0Y2hpbmcgYWN0dWFsIHVzZSBjYXNlczpcbiAqIC0gYCd2aWJlJ2AgKGRlZmF1bHQpOiBmdWxsLWJsZWVkIGRpc3RvcnRlZCBpbWFnZSB3aXRoIGp1c3QgcmVnaXN0cmF0aW9uXG4gKiAgIG1hcmtzIGFuZCBhIHRpbnkgXCJIZXJtZXMgQWdlbnRcIiBtYXJrIGluIHRoZSBjb3JuZXIgXHUyMDE0IG1pcnJvcnMgdGhlXG4gKiAgIG92ZXJsYXkgb24gdGhlIEhlcm1lcyBhZ2VudCB3ZWJzaXRlLlxuICogLSBgJ2Rpc3BhdGNoJ2A6IGJyb2FkY2FzdC1jYXJkIGxheW91dCB3aXRoIHNpZGViYXIgY29weSwgbnVtYmVyZWQgdGFncyxcbiAqICAgYW5kIGNocm9tZSBcdTIwMTQgZm9yIHdoZW4gdGhlIHBvc3RlciBuZWVkcyB0byBjYXJyeSBpbmZvcm1hdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFBvc3Rlcih7XG4gIGFzcGVjdCA9ICdzcXVhcmUnLFxuICBhdXRvUGxheSA9ICdzbGFzaCcsXG4gIGJvZHksXG4gIGJvcmRlciA9IHRydWUsXG4gIGNoYW5uZWwsXG4gIGNoaWxkcmVuLFxuICBjbGFzc05hbWUsXG4gIGNvcm5lck1hcmtzID0gdHJ1ZSxcbiAgZXllYnJvdyxcbiAgaGVhZGxpbmUgPSBbJ0FuIEFnZW50JywgJ1RoYXQgR3Jvd3MnLCAnV2l0aCBZb3UuJ10sXG4gIGxheW91dCxcbiAgc2NhbGUgPSAxLFxuICBzZWFsID0gJ01JVCBcdTAwQjcgMjAyNicsXG4gIHNpZ25hdHVyZSxcbiAgc3JjID0gREVGQVVMVF9TUkMsXG4gIHRhZ3MsXG4gIHRpbnQsXG4gIHRpbnRTdHJlbmd0aCxcbiAgdmFyaWFudCA9ICd2aWJlJyxcbiAgLi4ucmVzdFxufTogUG9zdGVyUHJvcHMpIHtcbiAgY29uc3QgY29uZmlnID0gQVNQRUNUX0NPTkZJR1thc3BlY3RdXG4gIGNvbnN0IHJlc29sdmVkTGF5b3V0ID0gbGF5b3V0ID8/IGNvbmZpZy5kZWZhdWx0TGF5b3V0XG5cbiAgLy8gVXNlIGFzcGVjdC1yYXRpbyArIG1heC13aWR0aC9oZWlnaHQgc28gdGhlIHBvc3RlciBmbHVpZGx5IGZpdHMgYW55IHBhcmVudFxuICAvLyAoc3Rvcnlib29rIGlmcmFtZSwgYSB0d2VldCBwcmV2aWV3LCBhbiBlbWJlZCkgd2l0aG91dCBnZXR0aW5nIGNsaXBwZWQsXG4gIC8vIGJ1dCBjYXBzIGF0IHRoZSBpbnRlbmRlZCBleHBvcnQgd2lkdGggZm9yIHNjcmVlbi1yZWNvcmRpbmcuIGBtYXhIZWlnaHRgXG4gIC8vIHVzZXMgYW4gYWJzb2x1dGUgYGR2aGAtYmFzZWQgdmFsdWUgcmF0aGVyIHRoYW4gYCVgIGJlY2F1c2UgYCVgIGluc2lkZSBhXG4gIC8vIGZsZXggY29udGFpbmVyIGNhbiBjYXVzZSB0aGUgYnJvd3NlciB0byBjbGFtcCBoZWlnaHQgd2l0aG91dCByZS1ydW5uaW5nXG4gIC8vIGFzcGVjdC1yYXRpbyBvbiB3aWR0aCwgcHJvZHVjaW5nIGEgc3VidGx5IHdyb25nIHNoYXBlLiBBbiBhYnNvbHV0ZSBjYXBcbiAgLy8gbGVhdmVzIGFzcGVjdC1yYXRpbyBmdWxseSBpbiBjaGFyZ2U6IG9uY2UgdGhlIGhlaWdodCBiaW5kcywgd2lkdGggaXNcbiAgLy8gcmUtZGVyaXZlZCBjb3JyZWN0bHkuIGBjYWxjKDEwMGR2aCAtIDhyZW0pYCA9IHZpZXdwb3J0IG1pbnVzIGEgdHlwaWNhbFxuICAvLyBob3N0J3MgdmVydGljYWwgcGFkZGluZyAoZS5nLiBTdG9yeWJvb2sncyBgcC04YCA9IDRyZW0gb24gZWFjaCBzaWRlKSxcbiAgLy8gc28gdGhlIHBvc3RlciArIHBhZGRpbmcgZml0IHdpdGhpbiB0aGUgdmlld3BvcnQgd2l0aG91dCBldmVyIHByb2R1Y2luZ1xuICAvLyBzY3JvbGxiYXJzLiBDb250YWluZXIgcXVlcmllcyB0aWUgYWxsIGludGVybmFsIHR5cG9ncmFwaHkgdG8gdGhlXG4gIC8vIGFjdHVhbCByZW5kZXJlZCB3aWR0aCBzbyBoZWFkbGluZS9tZXRhZGF0YSBzY2FsZXMgYWxvbmcgd2l0aCB0aGUgY2FudmFzLlxuICBjb25zdCBvdXRlclByb3BzID0ge1xuICAgIC8vIGB0ZXh0LW1pZGdyb3VuZGAgKG5vdCBgdGV4dC1mb3JlZ3JvdW5kYCkgaXMgdGhlIHJlYWRhYmxlIG9uLWNhbnZhc1xuICAgIC8vIGNvbG9yIGFjcm9zcyBldmVyeSBsZW5zLiBgLS1mb3JlZ3JvdW5kYCBpcyByZWFsbHkgdGhlIGxlbnMncyBpbnZlcnNpb25cbiAgICAvLyBsYXllciBjb2xvcjogb24gZGFyayBsZW5zZXMgaXQgaGFzIGBmZ09wYWNpdHk6IDBgIGFuZCByZXNvbHZlcyB0b1xuICAgIC8vIGZ1bGx5LXRyYW5zcGFyZW50IHZpYSBgY29sb3ItbWl4YCwgd2hpY2ggd291bGQgbWFrZSB0ZXh0IGludmlzaWJsZS5cbiAgICAvLyBgLS1taWRncm91bmRgIGFsd2F5cyBoYXMgb3BhY2l0eSAxIGFuZCBwaWNrcyB1cCBlYWNoIGxlbnMncyBhY2NlbnQuXG4gICAgY2xhc3NOYW1lOiBjbihcbiAgICAgICd0ZXh0LW1pZGdyb3VuZCByZWxhdGl2ZSBvdmVyZmxvdy1oaWRkZW4gZm9udC1zYW5zJyxcbiAgICAgIGJvcmRlciAmJiAnYm9yZGVyIGJvcmRlci1jdXJyZW50LzI1JyxcbiAgICAgIGNsYXNzTmFtZVxuICAgICksXG4gICAgc3R5bGU6IHtcbiAgICAgIGFzcGVjdFJhdGlvOiBgJHtjb25maWcud2lkdGh9IC8gJHtjb25maWcuaGVpZ2h0fWAsXG4gICAgICBiYWNrZ3JvdW5kOiAndmFyKC0tYmFja2dyb3VuZCknLFxuICAgICAgY29udGFpbmVyVHlwZTogJ2lubGluZS1zaXplJyBhcyBjb25zdCxcbiAgICAgIGZvbnRTaXplOiBgJHsoMTYgLyBjb25maWcud2lkdGgpICogMTAwfWNxaWAsXG4gICAgICBtYXhIZWlnaHQ6ICdjYWxjKDEwMGR2aCAtIDhyZW0pJyxcbiAgICAgIG1heFdpZHRoOiAnMTAwJScsXG4gICAgICB3aWR0aDogYCR7Y29uZmlnLndpZHRoICogc2NhbGV9cHhgXG4gICAgfSxcbiAgICAuLi5yZXN0XG4gIH1cblxuICBpZiAodmFyaWFudCA9PT0gJ3ZpYmUnKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgey4uLm91dGVyUHJvcHN9PlxuICAgICAgICA8VmliZUNvbnRlbnRcbiAgICAgICAgICBhdXRvUGxheT17YXV0b1BsYXl9XG4gICAgICAgICAgY2hhbm5lbD17Y2hhbm5lbH1cbiAgICAgICAgICBjb3JuZXJNYXJrcz17Y29ybmVyTWFya3N9XG4gICAgICAgICAgc2lnbmF0dXJlPXtzaWduYXR1cmV9XG4gICAgICAgICAgc3JjPXtzcmN9XG4gICAgICAgICAgdGludD17dGludH1cbiAgICAgICAgICB0aW50U3RyZW5ndGg9e3RpbnRTdHJlbmd0aH1cbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxuXG4gIGNvbnN0IGhlYWRsaW5lTGluZXMgPSBBcnJheS5pc0FycmF5KGhlYWRsaW5lKSA/IGhlYWRsaW5lIDogW2hlYWRsaW5lXVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiB7Li4ub3V0ZXJQcm9wc30gY2xhc3NOYW1lPXtjbignZmxleCBmbGV4LWNvbCcsIG91dGVyUHJvcHMuY2xhc3NOYW1lKX0+XG4gICAgICA8RGlzcGF0Y2hIZWFkZXIgY2hhbm5lbD17Y2hhbm5lbH0gLz5cblxuICAgICAgPGRpdlxuICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICdyZWxhdGl2ZSBtaW4taC0wIG1pbi13LTAgZmxleC0xJyxcbiAgICAgICAgICByZXNvbHZlZExheW91dCA9PT0gJ3NwbGl0J1xuICAgICAgICAgICAgPyAnZ3JpZCBncmlkLWNvbHMtWzNmcl8yZnJdJ1xuICAgICAgICAgICAgOiAnZ3JpZCBncmlkLXJvd3MtWzNmcl8yZnJdJ1xuICAgICAgICApfVxuICAgICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICdyZWxhdGl2ZSBvdmVyZmxvdy1oaWRkZW4gYm9yZGVyLWN1cnJlbnQvMjAnLFxuICAgICAgICAgICAgcmVzb2x2ZWRMYXlvdXQgPT09ICdzcGxpdCcgPyAnYm9yZGVyLXInIDogJ2JvcmRlci1iJ1xuICAgICAgICAgICl9XG4gICAgICAgICAgc3R5bGU9e3sgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tYmFja2dyb3VuZCknIH19XG4gICAgICAgID5cbiAgICAgICAgICA8SW1hZ2VEaXN0b3J0aW9uXG4gICAgICAgICAgICBhdXRvUGxheT17YXV0b1BsYXl9XG4gICAgICAgICAgICBzcmM9e3NyY31cbiAgICAgICAgICAgIHRpbnQ9e3RpbnR9XG4gICAgICAgICAgICB0aW50U3RyZW5ndGg9e3RpbnRTdHJlbmd0aH1cbiAgICAgICAgICAvPlxuXG4gICAgICAgICAge2Nvcm5lck1hcmtzICYmIChcbiAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgIDxDb3JuZXJNYXJrIGNsYXNzTmFtZT1cInRvcC0zIGxlZnQtM1wiIC8+XG4gICAgICAgICAgICAgIDxDb3JuZXJNYXJrIGNsYXNzTmFtZT1cInRvcC0zIHJpZ2h0LTNcIiAvPlxuICAgICAgICAgICAgICA8Q29ybmVyTWFyayBjbGFzc05hbWU9XCJib3R0b20tMyBsZWZ0LTNcIiAvPlxuICAgICAgICAgICAgICA8Q29ybmVyTWFyayBjbGFzc05hbWU9XCJyaWdodC0zIGJvdHRvbS0zXCIgLz5cbiAgICAgICAgICAgIDwvPlxuICAgICAgICAgICl9XG5cbiAgICAgICAgICA8U2NhbmxpbmVPdmVybGF5IC8+XG5cbiAgICAgICAgICA8U21hbGwgY2xhc3NOYW1lPVwiYWJzb2x1dGUgYm90dG9tLTQgbGVmdC00IHotMSBvcGFjaXR5LTgwXCI+XG4gICAgICAgICAgICBIZXJtZXMgQWdlbnRcbiAgICAgICAgICA8L1NtYWxsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8YXNpZGUgY2xhc3NOYW1lPVwicmVsYXRpdmUgZmxleCBtaW4tdy0wIGZsZXgtY29sIGp1c3RpZnktYmV0d2VlbiBnYXAtOCBwLThcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLTVcIj5cbiAgICAgICAgICAgIHtleWVicm93ICYmIChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImJnLW1pZGdyb3VuZC84MCBoLXB4IGZsZXgtMVwiIC8+XG5cbiAgICAgICAgICAgICAgICA8U21hbGwgY2xhc3NOYW1lPVwib3BhY2l0eS04MFwiPntleWVicm93fTwvU21hbGw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAge2NoaWxkcmVuID8/IChcbiAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICA8VHlwb2dyYXBoeVxuICAgICAgICAgICAgICAgICAgYXM9XCJoMVwiXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LVsyLjc1ZW1dIGxlYWRpbmctWzAuOTVdIGZvbnQtYm9sZCB0cmFja2luZy1bLTAuMDFlbV1cIlxuICAgICAgICAgICAgICAgICAgZXhwYW5kZWRcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7aGVhZGxpbmVMaW5lcy5tYXAoKGxpbmUsIGkpID0+IChcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYmxvY2tcIiBrZXk9e2Ake2xpbmV9LSR7aX1gfT5cbiAgICAgICAgICAgICAgICAgICAgICB7bGluZX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgPC9UeXBvZ3JhcGh5PlxuXG4gICAgICAgICAgICAgICAge2JvZHkgJiYgKFxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1bMS4wNjI1ZW1dIGxlYWRpbmctWzEuNV0gdHJhY2tpbmctbm9ybWFsIG5vcm1hbC1jYXNlIG9wYWNpdHktNjBcIj5cbiAgICAgICAgICAgICAgICAgICAge2JvZHl9XG4gICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAge3RhZ3MgJiYgdGFncy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgIDx1bCBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC0yIGJvcmRlci10IGJvcmRlci1jdXJyZW50LzE1IHB0LTRcIj5cbiAgICAgICAgICAgICAge3RhZ3MubWFwKCh0YWcsIGkpID0+IChcbiAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtYmFzZWxpbmUganVzdGlmeS1iZXR3ZWVuIGdhcC0zXCJcbiAgICAgICAgICAgICAgICAgIGtleT17YCR7dGFnfS0ke2l9YH1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8U21hbGwgY2xhc3NOYW1lPVwiZm9udC1jb3VyaWVyIG9wYWNpdHktNDBcIj5cbiAgICAgICAgICAgICAgICAgICAge1N0cmluZyhpICsgMSkucGFkU3RhcnQoMywgJzAnKX1cbiAgICAgICAgICAgICAgICAgIDwvU21hbGw+XG5cbiAgICAgICAgICAgICAgICAgIDxTbWFsbCBjbGFzc05hbWU9XCJvcGFjaXR5LTgwXCI+e3RhZ308L1NtYWxsPlxuXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJteC0xIGgtcHggZmxleC0xIHRyYW5zbGF0ZS15LVstM3B4XSBib3JkZXItYiBib3JkZXItZG90dGVkIGJvcmRlci1jdXJyZW50LzI1XCIgLz5cblxuICAgICAgICAgICAgICAgICAgPFNtYWxsIGNsYXNzTmFtZT1cImZvbnQtY291cmllciBvcGFjaXR5LTQwXCI+XG4gICAgICAgICAgICAgICAgICAgIHtTdHJpbmcoaSArIDEpLnBhZFN0YXJ0KDIsICcwJyl9L1xuICAgICAgICAgICAgICAgICAgICB7U3RyaW5nKHRhZ3MubGVuZ3RoKS5wYWRTdGFydCgyLCAnMCcpfVxuICAgICAgICAgICAgICAgICAgPC9TbWFsbD5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9hc2lkZT5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8Zm9vdGVyIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtNCBib3JkZXItdCBib3JkZXItY3VycmVudC8yMCBweC02IHB5LTNcIj5cbiAgICAgICAgPFNtYWxsIGNsYXNzTmFtZT1cIm9wYWNpdHktNzBcIj5cbiAgICAgICAgICB7c2lnbmF0dXJlfVxuXG4gICAgICAgICAgPEJsaW5rIC8+XG4gICAgICAgIDwvU21hbGw+XG5cbiAgICAgICAgPFNtYWxsIGNsYXNzTmFtZT1cImZvbnQtY291cmllciBvcGFjaXR5LTQwXCI+e3NlYWx9PC9TbWFsbD5cbiAgICAgIDwvZm9vdGVyPlxuICAgIDwvZGl2PlxuICApXG59XG5cbmZ1bmN0aW9uIERpc3BhdGNoSGVhZGVyKHsgY2hhbm5lbCB9OiB7IGNoYW5uZWw6IFJlYWN0LlJlYWN0Tm9kZSB9KSB7XG4gIGNvbnN0IGNsb2NrID0gdXNlVXRjQ2xvY2soKVxuXG4gIHJldHVybiAoXG4gICAgPGhlYWRlciBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTQgYm9yZGVyLWIgYm9yZGVyLWN1cnJlbnQvMjAgcHgtNiBweS0zXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0zXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImJnLW1pZGdyb3VuZCBzaXplLTIgcm91bmRlZC1zbSBvcGFjaXR5LTcwXCIgLz5cblxuICAgICAgICA8U21hbGwgY2xhc3NOYW1lPVwib3BhY2l0eS03MFwiPntjaGFubmVsfTwvU21hbGw+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtNFwiPlxuICAgICAgICA8Q2hhbm5lbERvdCAvPlxuXG4gICAgICAgIDxTbWFsbCBjbGFzc05hbWU9XCJmb250LWNvdXJpZXIgb3BhY2l0eS01MFwiPntjbG9ja30gVVRDPC9TbWFsbD5cbiAgICAgIDwvZGl2PlxuICAgIDwvaGVhZGVyPlxuICApXG59XG5cbmludGVyZmFjZSBWaWJlQ29udGVudFByb3BzIHtcbiAgYXV0b1BsYXk6IEF1dG9QbGF5UGF0dGVyblxuICBjaGFubmVsOiBSZWFjdC5SZWFjdE5vZGVcbiAgY29ybmVyTWFya3M6IGJvb2xlYW5cbiAgc2lnbmF0dXJlOiBSZWFjdC5SZWFjdE5vZGVcbiAgc3JjOiBzdHJpbmdcbiAgdGludD86IHN0cmluZ1xuICB0aW50U3RyZW5ndGg/OiB7IGFjdGl2ZTogbnVtYmVyOyBpbmFjdGl2ZTogbnVtYmVyIH1cbn1cblxuZnVuY3Rpb24gVmliZUNvbnRlbnQoe1xuICBhdXRvUGxheSxcbiAgY2hhbm5lbCxcbiAgY29ybmVyTWFya3MsXG4gIHNpZ25hdHVyZSxcbiAgc3JjLFxuICB0aW50LFxuICB0aW50U3RyZW5ndGhcbn06IFZpYmVDb250ZW50UHJvcHMpIHtcbiAgLy8gQWJzb2x1dGUtaW5zZXQtMCBndWFyYW50ZWVzIHRoaXMgZmlsbHMgdGhlIHBvc3RlciBldmVuIHdoZW4gdGhlIG91dGVyXG4gIC8vIGNvbnRhaW5lciB1c2VzIGFzcGVjdC1yYXRpby1kZXJpdmVkIGhlaWdodCBpbiBhIGJyb3dzZXIgdGhhdCBkb2Vzbid0XG4gIC8vIHByb3BhZ2F0ZSB0aGF0IGFzIGEgZGVmaW5pdGUgaGVpZ2h0IGZvciBwZXJjZW50YWdlLWJhc2VkIGNoaWxkcmVuLlxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQtMFwiPlxuICAgICAgPEltYWdlRGlzdG9ydGlvblxuICAgICAgICBhdXRvUGxheT17YXV0b1BsYXl9XG4gICAgICAgIHNyYz17c3JjfVxuICAgICAgICB0aW50PXt0aW50fVxuICAgICAgICB0aW50U3RyZW5ndGg9e3RpbnRTdHJlbmd0aH1cbiAgICAgIC8+XG5cbiAgICAgIHtjb3JuZXJNYXJrcyAmJiAoXG4gICAgICAgIDw+XG4gICAgICAgICAgPENvcm5lck1hcmsgY2xhc3NOYW1lPVwidG9wLTUgbGVmdC01XCIgLz5cbiAgICAgICAgICA8Q29ybmVyTWFyayBjbGFzc05hbWU9XCJ0b3AtNSByaWdodC01XCIgLz5cbiAgICAgICAgICA8Q29ybmVyTWFyayBjbGFzc05hbWU9XCJib3R0b20tNSBsZWZ0LTVcIiAvPlxuICAgICAgICAgIDxDb3JuZXJNYXJrIGNsYXNzTmFtZT1cInJpZ2h0LTUgYm90dG9tLTVcIiAvPlxuICAgICAgICA8Lz5cbiAgICAgICl9XG5cbiAgICAgIDxTY2FubGluZU92ZXJsYXkgLz5cblxuICAgICAge2NoYW5uZWwgJiYgKFxuICAgICAgICA8U21hbGwgY2xhc3NOYW1lPVwiYWJzb2x1dGUgdG9wLTUgbGVmdC0xMCB6LTEgdGV4dC1bMC43NWVtXSBvcGFjaXR5LTcwXCI+XG4gICAgICAgICAge2NoYW5uZWx9XG4gICAgICAgIDwvU21hbGw+XG4gICAgICApfVxuXG4gICAgICA8U21hbGwgY2xhc3NOYW1lPVwiYWJzb2x1dGUgcmlnaHQtMTAgYm90dG9tLTUgei0xIHRleHQtWzAuNzVlbV0gb3BhY2l0eS04MFwiPlxuICAgICAgICB7c2lnbmF0dXJlfVxuICAgICAgPC9TbWFsbD5cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5leHBvcnQgdHlwZSBQb3N0ZXJBc3BlY3QgPVxuICB8ICdsYW5kc2NhcGUnXG4gIHwgJ3BvcnRyYWl0J1xuICB8ICdzcXVhcmUnXG4gIHwgJ3N0b3J5J1xuICB8ICd3aWRlJ1xuXG5leHBvcnQgdHlwZSBQb3N0ZXJWYXJpYW50ID0gJ2Rpc3BhdGNoJyB8ICd2aWJlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFBvc3RlclByb3BzIHtcbiAgLyoqIE91dHB1dCBhc3BlY3QgcmF0aW8uIFBpY2tzIHNlbnNpYmxlIGRlZmF1bHRzIGZvciBjb21tb24gc29jaWFsIGZvcm1hdHMuICovXG4gIGFzcGVjdD86IFBvc3RlckFzcGVjdFxuICAvKiogRGlzdG9ydGlvbiBjaG9yZW9ncmFwaHkgcGF0dGVybi4gRGVmYXVsdDogYCdzbGFzaCdgLiAqL1xuICBhdXRvUGxheT86IEF1dG9QbGF5UGF0dGVyblxuICAvKiogKGBkaXNwYXRjaGAgb25seSkgRGVzY3JpcHRpdmUgY29weSB1bmRlciB0aGUgaGVhZGxpbmUuICovXG4gIGJvZHk/OiBSZWFjdC5SZWFjdE5vZGVcbiAgLyoqIFNob3cgdGhlIHRoaW4gb3V0ZXIgZnJhbWUgYXJvdW5kIHRoZSBwb3N0ZXIuIERlZmF1bHQgYHRydWVgLiAqL1xuICBib3JkZXI/OiBib29sZWFuXG4gIC8qKiBUaW55IGJyb2FkY2FzdC1zdGF0aW9uIGxhYmVsLiBPcHRpb25hbCBpbiBgdmliZWA7IHNob3duIGluIGhlYWRlciBpbiBgZGlzcGF0Y2hgLiAqL1xuICBjaGFubmVsPzogUmVhY3QuUmVhY3ROb2RlXG4gIC8qKiAoYGRpc3BhdGNoYCBvbmx5KSBPdmVycmlkZSB0aGUgc2lkZWJhciBjb250ZW50ICh0YWtlcyBwcmVjZWRlbmNlIG92ZXIgaGVhZGxpbmUvYm9keSkuICovXG4gIGNoaWxkcmVuPzogUmVhY3QuUmVhY3ROb2RlXG4gIGNsYXNzTmFtZT86IHN0cmluZ1xuICAvKiogU2hvdyB0aGUgc21hbGwgYCtgIGRpZS1saW5lIHJlZ2lzdHJhdGlvbiBtYXJrcyBpbiB0aGUgaW1hZ2UgY29ybmVycy4gRGVmYXVsdCBgdHJ1ZWAuICovXG4gIGNvcm5lck1hcmtzPzogYm9vbGVhblxuICAvKiogKGBkaXNwYXRjaGAgb25seSkgU21hbGwgdGFnbGluZSBhYm92ZSB0aGUgaGVhZGxpbmUuICovXG4gIGV5ZWJyb3c/OiBSZWFjdC5SZWFjdE5vZGVcbiAgLyoqIChgZGlzcGF0Y2hgIG9ubHkpIEJpZyBleHBhbmRlZC10eXBvZ3JhcGh5IGhlYWRsaW5lLiBQYXNzIGFuIGFycmF5IG9mIHN0cmluZ3MgdG8gc3RhY2sgbGluZXMuICovXG4gIGhlYWRsaW5lPzogc3RyaW5nW10gfCBzdHJpbmdcbiAgLyoqIChgZGlzcGF0Y2hgIG9ubHkpIEZvcmNlIHN0YWNrZWQgdnMgc3BsaXQgbGF5b3V0LiBEZWZhdWx0IGluZmVycmVkIGZyb20gYGFzcGVjdGAuICovXG4gIGxheW91dD86ICdzcGxpdCcgfCAnc3RhY2tlZCdcbiAgLyoqIFJlbmRlciBzY2FsZS4gMSA9IGZ1bGwgY2FudmFzICgxMDgwcHgrIGJhc2Ugd2lkdGgpLiAqL1xuICBzY2FsZT86IG51bWJlclxuICAvKiogKGBkaXNwYXRjaGAgb25seSkgU21hbGwgbGVnYWwgLyBzaWduYXR1cmUgbGluZSBhdCB0aGUgYm90dG9tLXJpZ2h0LiAqL1xuICBzZWFsPzogUmVhY3QuUmVhY3ROb2RlXG4gIC8qKlxuICAgKiBTaWduYXR1cmUgbWFyay4gSW4gYHZpYmVgIHRoaXMgaXMgdGhlIHNtYWxsIFwiSGVybWVzIEFnZW50XCIgb3ZlcmxheSBpbiB0aGVcbiAgICogYm90dG9tLXJpZ2h0LiBJbiBgZGlzcGF0Y2hgIHRoaXMgaXMgdGhlIFVSTCAvIENUQSBpbiB0aGUgZm9vdGVyLlxuICAgKi9cbiAgc2lnbmF0dXJlPzogUmVhY3QuUmVhY3ROb2RlXG4gIC8qKiBPdmVycmlkZSB0aGUgcG9zdGVyIGltYWdlLiBEZWZhdWx0cyB0byB0aGUgSGVybWVzIFwiZmlsbGVyLWJnMFwiIGFzc2V0LiAqL1xuICBzcmM/OiBzdHJpbmdcbiAgLyoqIChgZGlzcGF0Y2hgIG9ubHkpIFJhbmtlZCBsaXN0IG9mIGZlYXR1cmVzIC8gcHJpY2luZyB0aWVycyByZW5kZXJlZCBhcyBhIG51bWJlcmVkIHNpZGViYXIgbGlzdC4gKi9cbiAgdGFncz86IHN0cmluZ1tdXG4gIC8qKiBTaGFkZXIgdGludCBvdmVybGF5LiBHcmVhdCBmb3IgdGllci1jb2xvcmVkIHZhcmlhbnRzLiAqL1xuICB0aW50Pzogc3RyaW5nXG4gIC8qKiBBY3RpdmUgLyBpbmFjdGl2ZSB0aW50IHN0cmVuZ3RoIFx1MjAxNCBkZWZhdWx0cyBtYXRjaCBgSW1hZ2VEaXN0b3J0aW9uYC4gKi9cbiAgdGludFN0cmVuZ3RoPzogeyBhY3RpdmU6IG51bWJlcjsgaW5hY3RpdmU6IG51bWJlciB9XG4gIC8qKiBMYXlvdXQgdmFyaWFudC4gYCd2aWJlJ2AgKGRlZmF1bHQpIGlzIGZ1bGwtYmxlZWQgaW1hZ2U7IGAnZGlzcGF0Y2gnYCBpcyB0aGUgYnJvYWRjYXN0LWNhcmQgd2l0aCBzaWRlYmFyIGNvcHkuICovXG4gIHZhcmlhbnQ/OiBQb3N0ZXJWYXJpYW50XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBMkNJLFNBMkpRLFVBcEpOLEtBUEY7QUF6Q0osU0FBUyxXQUFXLGdCQUFnQjtBQUVwQyxPQUFPLGNBQWM7QUFDckIsU0FBUyxVQUFVO0FBRW5CLFNBQVMsYUFBYTtBQUN0QixTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLGtCQUFrQjtBQUMzQixTQUFTLGFBQWE7QUFJdEIsTUFBTSxnQkFHRjtBQUFBLEVBQ0YsV0FBVyxFQUFFLGVBQWUsU0FBUyxRQUFRLE1BQU0sT0FBTyxLQUFLO0FBQUEsRUFDL0QsVUFBVSxFQUFFLGVBQWUsU0FBUyxRQUFRLE1BQU0sT0FBTyxLQUFLO0FBQUEsRUFDOUQsUUFBUSxFQUFFLGVBQWUsU0FBUyxRQUFRLE1BQU0sT0FBTyxLQUFLO0FBQUEsRUFDNUQsT0FBTyxFQUFFLGVBQWUsV0FBVyxRQUFRLE1BQU0sT0FBTyxLQUFLO0FBQUEsRUFDN0QsTUFBTSxFQUFFLGVBQWUsU0FBUyxRQUFRLEtBQUssT0FBTyxLQUFLO0FBQzNEO0FBRUEsTUFBTSxjQUNILFNBQThCLE9BQVE7QUFFekMsU0FBUyxjQUFjO0FBQ3JCLFFBQU0sQ0FBQyxLQUFLLE1BQU0sSUFBSSxTQUFzQixJQUFJO0FBRWhELFlBQVUsTUFBTTtBQUNkLFdBQU8sb0JBQUksS0FBSyxDQUFDO0FBQ2pCLFVBQU0sS0FBSyxZQUFZLE1BQU0sT0FBTyxvQkFBSSxLQUFLLENBQUMsR0FBRyxHQUFJO0FBRXJELFdBQU8sTUFBTSxjQUFjLEVBQUU7QUFBQSxF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
@@ -0,0 +1,9 @@
1
+ import { type TypographyProps } from './typography';
2
+ export declare const Progress: ({ animate, barProps, children, className, speed, value, ...props }: ProgressProps) => import("react").JSX.Element;
3
+ interface ProgressProps extends React.ComponentProps<'div'> {
4
+ animate?: boolean;
5
+ barProps?: TypographyProps<'span'>;
6
+ speed?: number;
7
+ value: number;
8
+ }
9
+ export {};
@@ -0,0 +1,53 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { cn } from "../../utils/index.js";
3
+ import { Typography } from "./typography/index.js";
4
+ export const Progress = ({
5
+ animate = true,
6
+ barProps,
7
+ children,
8
+ className,
9
+ speed = 0.4,
10
+ value,
11
+ ...props
12
+ }) => /* @__PURE__ */ jsxs(
13
+ "div",
14
+ {
15
+ className: cn(
16
+ "relative flex min-h-[2.3rem] min-w-0 flex-1 items-stretch overflow-hidden",
17
+ className
18
+ ),
19
+ ...props,
20
+ children: [
21
+ /* @__PURE__ */ jsx(
22
+ Typography,
23
+ {
24
+ ...barProps,
25
+ className: cn(
26
+ "shrink-0 translate-y-0.5 truncate py-2",
27
+ "bg-midground/20",
28
+ children ? "px-2" : "px-0",
29
+ barProps?.className
30
+ ),
31
+ mono: true,
32
+ style: {
33
+ ...animate && { transition: `width ${speed}s steps(10, end)` },
34
+ width: `${value}%`,
35
+ ...barProps?.style
36
+ },
37
+ children
38
+ }
39
+ ),
40
+ /* @__PURE__ */ jsx(
41
+ "div",
42
+ {
43
+ className: "flex-1",
44
+ style: {
45
+ "--x": ".5rem",
46
+ backgroundImage: `repeating-linear-gradient(to right, transparent 0 var(--x), color-mix(in srgb, var(--color-midground) 17%, transparent) var(--x) calc(var(--x) + 1px))`
47
+ }
48
+ }
49
+ )
50
+ ]
51
+ }
52
+ );
53
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi91dGlscydcblxuaW1wb3J0IHsgVHlwb2dyYXBoeSwgdHlwZSBUeXBvZ3JhcGh5UHJvcHMgfSBmcm9tICcuL3R5cG9ncmFwaHknXG5cbmV4cG9ydCBjb25zdCBQcm9ncmVzcyA9ICh7XG4gIGFuaW1hdGUgPSB0cnVlLFxuICBiYXJQcm9wcyxcbiAgY2hpbGRyZW4sXG4gIGNsYXNzTmFtZSxcbiAgc3BlZWQgPSAwLjQsXG4gIHZhbHVlLFxuICAuLi5wcm9wc1xufTogUHJvZ3Jlc3NQcm9wcykgPT4gKFxuICA8ZGl2XG4gICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICdyZWxhdGl2ZSBmbGV4IG1pbi1oLVsyLjNyZW1dIG1pbi13LTAgZmxleC0xIGl0ZW1zLXN0cmV0Y2ggb3ZlcmZsb3ctaGlkZGVuJyxcbiAgICAgIGNsYXNzTmFtZVxuICAgICl9XG4gICAgey4uLnByb3BzfVxuICA+XG4gICAgPFR5cG9ncmFwaHlcbiAgICAgIHsuLi5iYXJQcm9wc31cbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdzaHJpbmstMCB0cmFuc2xhdGUteS0wLjUgdHJ1bmNhdGUgcHktMicsXG4gICAgICAgICdiZy1taWRncm91bmQvMjAnLFxuICAgICAgICBjaGlsZHJlbiA/ICdweC0yJyA6ICdweC0wJyxcbiAgICAgICAgYmFyUHJvcHM/LmNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIG1vbm9cbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIC4uLihhbmltYXRlICYmIHsgdHJhbnNpdGlvbjogYHdpZHRoICR7c3BlZWR9cyBzdGVwcygxMCwgZW5kKWAgfSksXG4gICAgICAgIHdpZHRoOiBgJHt2YWx1ZX0lYCxcbiAgICAgICAgLi4uYmFyUHJvcHM/LnN0eWxlXG4gICAgICB9fVxuICAgID5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L1R5cG9ncmFwaHk+XG5cbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9XCJmbGV4LTFcIlxuICAgICAgc3R5bGU9e1xuICAgICAgICB7XG4gICAgICAgICAgJy0teCc6ICcuNXJlbScsXG4gICAgICAgICAgYmFja2dyb3VuZEltYWdlOiBgcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byByaWdodCwgdHJhbnNwYXJlbnQgMCB2YXIoLS14KSwgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbG9yLW1pZGdyb3VuZCkgMTclLCB0cmFuc3BhcmVudCkgdmFyKC0teCkgY2FsYyh2YXIoLS14KSArIDFweCkpYFxuICAgICAgICB9IGFzIFJlYWN0LkNTU1Byb3BlcnRpZXNcbiAgICAgIH1cbiAgICAvPlxuICA8L2Rpdj5cbilcblxuaW50ZXJmYWNlIFByb2dyZXNzUHJvcHMgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnRQcm9wczwnZGl2Jz4ge1xuICBhbmltYXRlPzogYm9vbGVhblxuICBiYXJQcm9wcz86IFR5cG9ncmFwaHlQcm9wczwnc3Bhbic+XG4gIHNwZWVkPzogbnVtYmVyXG4gIHZhbHVlOiBudW1iZXJcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQWFFLFNBT0UsS0FQRjtBQWJGLFNBQVMsVUFBVTtBQUVuQixTQUFTLGtCQUF3QztBQUUxQyxhQUFNLFdBQVcsQ0FBQztBQUFBLEVBQ3ZCLFVBQVU7QUFBQSxFQUNWO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBLFFBQVE7QUFBQSxFQUNSO0FBQUEsRUFDQSxHQUFHO0FBQ0wsTUFDRTtBQUFBLEVBQUM7QUFBQTtBQUFBLElBQ0MsV0FBVztBQUFBLE1BQ1Q7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLElBQ0MsR0FBRztBQUFBLElBRUo7QUFBQTtBQUFBLFFBQUM7QUFBQTtBQUFBLFVBQ0UsR0FBRztBQUFBLFVBQ0osV0FBVztBQUFBLFlBQ1Q7QUFBQSxZQUNBO0FBQUEsWUFDQSxXQUFXLFNBQVM7QUFBQSxZQUNwQixVQUFVO0FBQUEsVUFDWjtBQUFBLFVBQ0EsTUFBSTtBQUFBLFVBQ0osT0FBTztBQUFBLFlBQ0wsR0FBSSxXQUFXLEVBQUUsWUFBWSxTQUFTLEtBQUssbUJBQW1CO0FBQUEsWUFDOUQsT0FBTyxHQUFHLEtBQUs7QUFBQSxZQUNmLEdBQUcsVUFBVTtBQUFBLFVBQ2Y7QUFBQSxVQUVDO0FBQUE7QUFBQSxNQUNIO0FBQUEsTUFFQTtBQUFBLFFBQUM7QUFBQTtBQUFBLFVBQ0MsV0FBVTtBQUFBLFVBQ1YsT0FDRTtBQUFBLFlBQ0UsT0FBTztBQUFBLFlBQ1AsaUJBQWlCO0FBQUEsVUFDbkI7QUFBQTtBQUFBLE1BRUo7QUFBQTtBQUFBO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,23 @@
1
+ export declare function SceneCanvas({ camera, children, className, contained, frameloop, noEvents, style }: SceneCanvasProps): import("react").JSX.Element;
2
+ interface SceneCanvasProps {
3
+ camera?: {
4
+ far?: number;
5
+ near?: number;
6
+ position?: [number, number, number];
7
+ zoom?: number;
8
+ };
9
+ children: () => React.ReactNode;
10
+ className?: string;
11
+ contained?: boolean;
12
+ /**
13
+ * R3F frame-loop mode. Defaults to `'always'` for backwards
14
+ * compatibility, but `'demand'` is strongly preferred for static
15
+ * scenes (use `invalidate()` from `useThree` to request frames). The
16
+ * canvas additionally pauses (forces `'never'`) while the document
17
+ * is hidden, regardless of this setting.
18
+ */
19
+ frameloop?: 'always' | 'demand' | 'never';
20
+ noEvents?: boolean;
21
+ style?: React.CSSProperties;
22
+ }
23
+ export {};
@@ -0,0 +1,179 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { Canvas, useFrame, useThree } from "@react-three/fiber";
4
+ import {
5
+ Suspense,
6
+ useEffect,
7
+ useLayoutEffect,
8
+ useMemo,
9
+ useRef,
10
+ useState
11
+ } from "react";
12
+ import * as THREE from "three";
13
+ const GL = {
14
+ alpha: true,
15
+ antialias: true,
16
+ depth: true,
17
+ outputColorSpace: "srgb",
18
+ powerPreference: "high-performance",
19
+ stencil: false
20
+ };
21
+ const tmp = {
22
+ camDir: new THREE.Vector3(),
23
+ hit: new THREE.Vector3(),
24
+ ndc: new THREE.Vector2(),
25
+ origin: new THREE.Vector3(0, 0, 0),
26
+ plane: new THREE.Plane(),
27
+ ray: new THREE.Raycaster()
28
+ };
29
+ function useBounds(target) {
30
+ const bounds = useRef(null);
31
+ useLayoutEffect(() => {
32
+ if (!target) {
33
+ return;
34
+ }
35
+ const measure = () => {
36
+ const b = target.getBoundingClientRect();
37
+ bounds.current = {
38
+ height: b.height,
39
+ pageX: b.left + window.scrollX,
40
+ pageY: b.top + window.scrollY,
41
+ width: b.width
42
+ };
43
+ };
44
+ measure();
45
+ const ro = new ResizeObserver(measure);
46
+ ro.observe(target);
47
+ ro.observe(document.body);
48
+ window.addEventListener("resize", measure, { passive: true });
49
+ return () => {
50
+ ro.disconnect();
51
+ window.removeEventListener("resize", measure);
52
+ };
53
+ }, [target]);
54
+ return bounds;
55
+ }
56
+ function PositionedGroup({
57
+ baseZoom,
58
+ bounds,
59
+ children
60
+ }) {
61
+ const ref = useRef(null);
62
+ const { camera, size, viewport } = useThree();
63
+ useFrame(() => {
64
+ const g = ref.current;
65
+ const b = bounds.current;
66
+ if (!g || !b) {
67
+ return;
68
+ }
69
+ const left = b.pageX - window.scrollX;
70
+ const top = b.pageY - window.scrollY;
71
+ tmp.ndc.set(
72
+ (left + b.width / 2) / size.width * 2 - 1,
73
+ 1 - (top + b.height / 2) / size.height * 2
74
+ );
75
+ camera.getWorldDirection(tmp.camDir);
76
+ tmp.plane.setFromNormalAndCoplanarPoint(tmp.camDir, tmp.origin);
77
+ tmp.ray.setFromCamera(tmp.ndc, camera);
78
+ const hit = tmp.ray.ray.intersectPlane(tmp.plane, tmp.hit);
79
+ if (hit) {
80
+ g.position.copy(hit);
81
+ }
82
+ const zoom = camera.zoom ?? 1;
83
+ g.scale.setScalar(
84
+ Math.min(
85
+ b.width / size.width * viewport.width,
86
+ b.height / size.height * viewport.height
87
+ ) * (baseZoom > 0 ? zoom / baseZoom : 1)
88
+ );
89
+ });
90
+ return /* @__PURE__ */ jsx("group", { ref, children });
91
+ }
92
+ export function SceneCanvas({
93
+ camera,
94
+ children,
95
+ className,
96
+ contained,
97
+ frameloop = "always",
98
+ noEvents,
99
+ style
100
+ }) {
101
+ const [container, setContainer] = useState(null);
102
+ const baseZoom = camera?.zoom ?? 150;
103
+ const bounds = useBounds(
104
+ contained ? container?.parentElement ?? null : null
105
+ );
106
+ useEffect(() => {
107
+ const el = contained && !noEvents ? container : null;
108
+ if (!el) {
109
+ return;
110
+ }
111
+ const lock = () => document.body.style.userSelect = "none";
112
+ const unlock = () => document.body.style.userSelect = "";
113
+ el.addEventListener("pointerdown", lock);
114
+ window.addEventListener("pointerup", unlock);
115
+ return () => {
116
+ el.removeEventListener("pointerdown", lock);
117
+ window.removeEventListener("pointerup", unlock);
118
+ };
119
+ }, [container, contained, noEvents]);
120
+ const [pageHidden, setPageHidden] = useState(
121
+ typeof document !== "undefined" && document.hidden
122
+ );
123
+ useEffect(() => {
124
+ const onVisibility = () => setPageHidden(document.hidden);
125
+ document.addEventListener("visibilitychange", onVisibility);
126
+ return () => document.removeEventListener("visibilitychange", onVisibility);
127
+ }, []);
128
+ const effectiveFrameloop = pageHidden ? "never" : frameloop;
129
+ const cam = useMemo(
130
+ () => ({
131
+ far: camera?.far ?? 100,
132
+ near: camera?.near ?? -100,
133
+ position: camera?.position ?? [0, 0, 10],
134
+ zoom: baseZoom * (contained ? 1 : 2)
135
+ }),
136
+ [baseZoom, camera, contained]
137
+ );
138
+ const canvas = /* @__PURE__ */ jsx(
139
+ Canvas,
140
+ {
141
+ camera: cam,
142
+ className,
143
+ dpr: [1, 2],
144
+ eventPrefix: contained ? "client" : "offset",
145
+ eventSource: contained ? container ?? void 0 : void 0,
146
+ frameloop: effectiveFrameloop,
147
+ gl: GL,
148
+ orthographic: true,
149
+ style: contained ? {
150
+ height: "100dvh",
151
+ inset: 0,
152
+ pointerEvents: "none",
153
+ position: "fixed",
154
+ width: "100dvw",
155
+ zIndex: 0,
156
+ ...style
157
+ } : { height: "100%", width: "100%", ...style },
158
+ children: contained ? /* @__PURE__ */ jsx(PositionedGroup, { baseZoom, bounds, children: children() }) : children()
159
+ }
160
+ );
161
+ return contained ? /* @__PURE__ */ jsxs(Suspense, { children: [
162
+ /* @__PURE__ */ jsx(
163
+ "div",
164
+ {
165
+ ref: setContainer,
166
+ style: {
167
+ height: "100%",
168
+ inset: 0,
169
+ pointerEvents: noEvents ? "none" : "auto",
170
+ position: "absolute",
171
+ width: "100%",
172
+ zIndex: 1
173
+ }
174
+ }
175
+ ),
176
+ canvas
177
+ ] }) : canvas;
178
+ }
179
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBjbGllbnQnXG5cbmltcG9ydCB7IENhbnZhcywgdXNlRnJhbWUsIHVzZVRocmVlIH0gZnJvbSAnQHJlYWN0LXRocmVlL2ZpYmVyJ1xuaW1wb3J0IHtcbiAgU3VzcGVuc2UsXG4gIHVzZUVmZmVjdCxcbiAgdXNlTGF5b3V0RWZmZWN0LFxuICB1c2VNZW1vLFxuICB1c2VSZWYsXG4gIHVzZVN0YXRlXG59IGZyb20gJ3JlYWN0J1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnXG5cbmNvbnN0IEdMID0ge1xuICBhbHBoYTogdHJ1ZSxcbiAgYW50aWFsaWFzOiB0cnVlLFxuICBkZXB0aDogdHJ1ZSxcbiAgb3V0cHV0Q29sb3JTcGFjZTogJ3NyZ2InLFxuICBwb3dlclByZWZlcmVuY2U6ICdoaWdoLXBlcmZvcm1hbmNlJyxcbiAgc3RlbmNpbDogZmFsc2Vcbn0gYXMgY29uc3RcblxuY29uc3QgdG1wID0ge1xuICBjYW1EaXI6IG5ldyBUSFJFRS5WZWN0b3IzKCksXG4gIGhpdDogbmV3IFRIUkVFLlZlY3RvcjMoKSxcbiAgbmRjOiBuZXcgVEhSRUUuVmVjdG9yMigpLFxuICBvcmlnaW46IG5ldyBUSFJFRS5WZWN0b3IzKDAsIDAsIDApLFxuICBwbGFuZTogbmV3IFRIUkVFLlBsYW5lKCksXG4gIHJheTogbmV3IFRIUkVFLlJheWNhc3RlcigpXG59XG5cbnR5cGUgQm91bmRzID0geyBoZWlnaHQ6IG51bWJlcjsgcGFnZVg6IG51bWJlcjsgcGFnZVk6IG51bWJlcjsgd2lkdGg6IG51bWJlciB9XG5cbmZ1bmN0aW9uIHVzZUJvdW5kcyh0YXJnZXQ6IEhUTUxFbGVtZW50IHwgbnVsbCkge1xuICBjb25zdCBib3VuZHMgPSB1c2VSZWY8Qm91bmRzIHwgbnVsbD4obnVsbClcblxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBtZWFzdXJlID0gKCkgPT4ge1xuICAgICAgY29uc3QgYiA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgYm91bmRzLmN1cnJlbnQgPSB7XG4gICAgICAgIGhlaWdodDogYi5oZWlnaHQsXG4gICAgICAgIHBhZ2VYOiBiLmxlZnQgKyB3aW5kb3cuc2Nyb2xsWCxcbiAgICAgICAgcGFnZVk6IGIudG9wICsgd2luZG93LnNjcm9sbFksXG4gICAgICAgIHdpZHRoOiBiLndpZHRoXG4gICAgICB9XG4gICAgfVxuXG4gICAgbWVhc3VyZSgpXG5cbiAgICBjb25zdCBybyA9IG5ldyBSZXNpemVPYnNlcnZlcihtZWFzdXJlKVxuICAgIHJvLm9ic2VydmUodGFyZ2V0KVxuICAgIHJvLm9ic2VydmUoZG9jdW1lbnQuYm9keSlcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgbWVhc3VyZSwgeyBwYXNzaXZlOiB0cnVlIH0pXG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgcm8uZGlzY29ubmVjdCgpXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgbWVhc3VyZSlcbiAgICB9XG4gIH0sIFt0YXJnZXRdKVxuXG4gIHJldHVybiBib3VuZHNcbn1cblxuZnVuY3Rpb24gUG9zaXRpb25lZEdyb3VwKHtcbiAgYmFzZVpvb20sXG4gIGJvdW5kcyxcbiAgY2hpbGRyZW5cbn06IFJlYWN0LlByb3BzV2l0aENoaWxkcmVuPHtcbiAgYmFzZVpvb206IG51bWJlclxuICBib3VuZHM6IFJlYWN0LlJlZk9iamVjdDxCb3VuZHMgfCBudWxsPlxufT4pIHtcbiAgY29uc3QgcmVmID0gdXNlUmVmPFRIUkVFLkdyb3VwPihudWxsKVxuICBjb25zdCB7IGNhbWVyYSwgc2l6ZSwgdmlld3BvcnQgfSA9IHVzZVRocmVlKClcblxuICB1c2VGcmFtZSgoKSA9PiB7XG4gICAgY29uc3QgZyA9IHJlZi5jdXJyZW50XG4gICAgY29uc3QgYiA9IGJvdW5kcy5jdXJyZW50XG5cbiAgICBpZiAoIWcgfHwgIWIpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGxlZnQgPSBiLnBhZ2VYIC0gd2luZG93LnNjcm9sbFhcbiAgICBjb25zdCB0b3AgPSBiLnBhZ2VZIC0gd2luZG93LnNjcm9sbFlcblxuICAgIHRtcC5uZGMuc2V0KFxuICAgICAgKChsZWZ0ICsgYi53aWR0aCAvIDIpIC8gc2l6ZS53aWR0aCkgKiAyIC0gMSxcbiAgICAgIDEgLSAoKHRvcCArIGIuaGVpZ2h0IC8gMikgLyBzaXplLmhlaWdodCkgKiAyXG4gICAgKVxuXG4gICAgY2FtZXJhLmdldFdvcmxkRGlyZWN0aW9uKHRtcC5jYW1EaXIpXG4gICAgdG1wLnBsYW5lLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KHRtcC5jYW1EaXIsIHRtcC5vcmlnaW4pXG4gICAgdG1wLnJheS5zZXRGcm9tQ2FtZXJhKHRtcC5uZGMsIGNhbWVyYSlcblxuICAgIGNvbnN0IGhpdCA9IHRtcC5yYXkucmF5LmludGVyc2VjdFBsYW5lKHRtcC5wbGFuZSwgdG1wLmhpdClcblxuICAgIGlmIChoaXQpIHtcbiAgICAgIGcucG9zaXRpb24uY29weShoaXQpXG4gICAgfVxuXG4gICAgY29uc3Qgem9vbSA9IChjYW1lcmEgYXMgVEhSRUUuQ2FtZXJhICYgeyB6b29tPzogbnVtYmVyIH0pLnpvb20gPz8gMVxuXG4gICAgZy5zY2FsZS5zZXRTY2FsYXIoXG4gICAgICBNYXRoLm1pbihcbiAgICAgICAgKGIud2lkdGggLyBzaXplLndpZHRoKSAqIHZpZXdwb3J0LndpZHRoLFxuICAgICAgICAoYi5oZWlnaHQgLyBzaXplLmhlaWdodCkgKiB2aWV3cG9ydC5oZWlnaHRcbiAgICAgICkgKiAoYmFzZVpvb20gPiAwID8gem9vbSAvIGJhc2Vab29tIDogMSlcbiAgICApXG4gIH0pXG5cbiAgcmV0dXJuIDxncm91cCByZWY9e3JlZn0+e2NoaWxkcmVufTwvZ3JvdXA+XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBTY2VuZUNhbnZhcyh7XG4gIGNhbWVyYSxcbiAgY2hpbGRyZW4sXG4gIGNsYXNzTmFtZSxcbiAgY29udGFpbmVkLFxuICBmcmFtZWxvb3AgPSAnYWx3YXlzJyxcbiAgbm9FdmVudHMsXG4gIHN0eWxlXG59OiBTY2VuZUNhbnZhc1Byb3BzKSB7XG4gIGNvbnN0IFtjb250YWluZXIsIHNldENvbnRhaW5lcl0gPSB1c2VTdGF0ZTxIVE1MRGl2RWxlbWVudCB8IG51bGw+KG51bGwpXG4gIGNvbnN0IGJhc2Vab29tID0gY2FtZXJhPy56b29tID8/IDE1MFxuXG4gIGNvbnN0IGJvdW5kcyA9IHVzZUJvdW5kcyhcbiAgICBjb250YWluZWQgPyAoY29udGFpbmVyPy5wYXJlbnRFbGVtZW50ID8/IG51bGwpIDogbnVsbFxuICApXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBlbCA9IGNvbnRhaW5lZCAmJiAhbm9FdmVudHMgPyBjb250YWluZXIgOiBudWxsXG5cbiAgICBpZiAoIWVsKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBsb2NrID0gKCkgPT4gKGRvY3VtZW50LmJvZHkuc3R5bGUudXNlclNlbGVjdCA9ICdub25lJylcbiAgICBjb25zdCB1bmxvY2sgPSAoKSA9PiAoZG9jdW1lbnQuYm9keS5zdHlsZS51c2VyU2VsZWN0ID0gJycpXG5cbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIGxvY2spXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIHVubG9jaylcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIGxvY2spXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgdW5sb2NrKVxuICAgIH1cbiAgfSwgW2NvbnRhaW5lciwgY29udGFpbmVkLCBub0V2ZW50c10pXG5cbiAgLy8gUGF1c2UgdGhlIFIzRiByZW5kZXIgbG9vcCB3aGVuIHRoZSB0YWIgaXMgaGlkZGVuLiBFdmVuIG9uXG4gIC8vIGBmcmFtZWxvb3A9XCJhbHdheXNcImAgc2NlbmVzIHdlIGRvbid0IHdhbnQgdGhlIEdQVSBydW5uaW5nIHdoaWxlIHRoZVxuICAvLyB1c2VyIGNhbid0IHNlZSBhbnl0aGluZyBcdTIwMTQgdGhpcyBpcyB0aGUgZG9taW5hbnQgZml4IGZvciB0aGUgXCJmYW5zXG4gIC8vIGNyYW5rIHVwIGFmdGVyIGhvdXJzIG9mIGlkbGVcIiBzeW1wdG9tLlxuICBjb25zdCBbcGFnZUhpZGRlbiwgc2V0UGFnZUhpZGRlbl0gPSB1c2VTdGF0ZShcbiAgICB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmhpZGRlblxuICApXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBvblZpc2liaWxpdHkgPSAoKSA9PiBzZXRQYWdlSGlkZGVuKGRvY3VtZW50LmhpZGRlbilcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgb25WaXNpYmlsaXR5KVxuXG4gICAgcmV0dXJuICgpID0+IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCBvblZpc2liaWxpdHkpXG4gIH0sIFtdKVxuXG4gIGNvbnN0IGVmZmVjdGl2ZUZyYW1lbG9vcCA9IHBhZ2VIaWRkZW4gPyAnbmV2ZXInIDogZnJhbWVsb29wXG5cbiAgY29uc3QgY2FtID0gdXNlTWVtbyhcbiAgICAoKSA9PiAoe1xuICAgICAgZmFyOiBjYW1lcmE/LmZhciA/PyAxMDAsXG4gICAgICBuZWFyOiBjYW1lcmE/Lm5lYXIgPz8gLTEwMCxcbiAgICAgIHBvc2l0aW9uOiBjYW1lcmE/LnBvc2l0aW9uID8/IChbMCwgMCwgMTBdIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSksXG4gICAgICB6b29tOiBiYXNlWm9vbSAqIChjb250YWluZWQgPyAxIDogMilcbiAgICB9KSxcbiAgICBbYmFzZVpvb20sIGNhbWVyYSwgY29udGFpbmVkXVxuICApXG5cbiAgY29uc3QgY2FudmFzID0gKFxuICAgIDxDYW52YXNcbiAgICAgIGNhbWVyYT17Y2FtfVxuICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWV9XG4gICAgICBkcHI9e1sxLCAyXX1cbiAgICAgIGV2ZW50UHJlZml4PXtjb250YWluZWQgPyAnY2xpZW50JyA6ICdvZmZzZXQnfVxuICAgICAgZXZlbnRTb3VyY2U9e2NvbnRhaW5lZCA/IChjb250YWluZXIgPz8gdW5kZWZpbmVkKSA6IHVuZGVmaW5lZH1cbiAgICAgIGZyYW1lbG9vcD17ZWZmZWN0aXZlRnJhbWVsb29wfVxuICAgICAgZ2w9e0dMfVxuICAgICAgb3J0aG9ncmFwaGljXG4gICAgICBzdHlsZT17XG4gICAgICAgIGNvbnRhaW5lZFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBoZWlnaHQ6ICcxMDBkdmgnLFxuICAgICAgICAgICAgICBpbnNldDogMCxcbiAgICAgICAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgICAgICAgd2lkdGg6ICcxMDBkdncnLFxuICAgICAgICAgICAgICB6SW5kZXg6IDAsXG4gICAgICAgICAgICAgIC4uLnN0eWxlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7IGhlaWdodDogJzEwMCUnLCB3aWR0aDogJzEwMCUnLCAuLi5zdHlsZSB9XG4gICAgICB9XG4gICAgPlxuICAgICAge2NvbnRhaW5lZCA/IChcbiAgICAgICAgPFBvc2l0aW9uZWRHcm91cCBiYXNlWm9vbT17YmFzZVpvb219IGJvdW5kcz17Ym91bmRzfT5cbiAgICAgICAgICB7Y2hpbGRyZW4oKX1cbiAgICAgICAgPC9Qb3NpdGlvbmVkR3JvdXA+XG4gICAgICApIDogKFxuICAgICAgICBjaGlsZHJlbigpXG4gICAgICApfVxuICAgIDwvQ2FudmFzPlxuICApXG5cbiAgcmV0dXJuIGNvbnRhaW5lZCA/IChcbiAgICA8U3VzcGVuc2U+XG4gICAgICA8ZGl2XG4gICAgICAgIHJlZj17c2V0Q29udGFpbmVyfVxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgICAgIGluc2V0OiAwLFxuICAgICAgICAgIHBvaW50ZXJFdmVudHM6IG5vRXZlbnRzID8gJ25vbmUnIDogJ2F1dG8nLFxuICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgekluZGV4OiAxXG4gICAgICAgIH19XG4gICAgICAvPlxuICAgICAge2NhbnZhc31cbiAgICA8L1N1c3BlbnNlPlxuICApIDogKFxuICAgIGNhbnZhc1xuICApXG59XG5cbmludGVyZmFjZSBTY2VuZUNhbnZhc1Byb3BzIHtcbiAgY2FtZXJhPzoge1xuICAgIGZhcj86IG51bWJlclxuICAgIG5lYXI/OiBudW1iZXJcbiAgICBwb3NpdGlvbj86IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXVxuICAgIHpvb20/OiBudW1iZXJcbiAgfVxuICBjaGlsZHJlbjogKCkgPT4gUmVhY3QuUmVhY3ROb2RlXG4gIGNsYXNzTmFtZT86IHN0cmluZ1xuICBjb250YWluZWQ/OiBib29sZWFuXG4gIC8qKlxuICAgKiBSM0YgZnJhbWUtbG9vcCBtb2RlLiBEZWZhdWx0cyB0byBgJ2Fsd2F5cydgIGZvciBiYWNrd2FyZHNcbiAgICogY29tcGF0aWJpbGl0eSwgYnV0IGAnZGVtYW5kJ2AgaXMgc3Ryb25nbHkgcHJlZmVycmVkIGZvciBzdGF0aWNcbiAgICogc2NlbmVzICh1c2UgYGludmFsaWRhdGUoKWAgZnJvbSBgdXNlVGhyZWVgIHRvIHJlcXVlc3QgZnJhbWVzKS4gVGhlXG4gICAqIGNhbnZhcyBhZGRpdGlvbmFsbHkgcGF1c2VzIChmb3JjZXMgYCduZXZlcidgKSB3aGlsZSB0aGUgZG9jdW1lbnRcbiAgICogaXMgaGlkZGVuLCByZWdhcmRsZXNzIG9mIHRoaXMgc2V0dGluZy5cbiAgICovXG4gIGZyYW1lbG9vcD86ICdhbHdheXMnIHwgJ2RlbWFuZCcgfCAnbmV2ZXInXG4gIG5vRXZlbnRzPzogYm9vbGVhblxuICBzdHlsZT86IFJlYWN0LkNTU1Byb3BlcnRpZXNcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFrSFMsY0FvR0wsWUFwR0s7QUFoSFQsU0FBUyxRQUFRLFVBQVUsZ0JBQWdCO0FBQzNDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFlBQVksV0FBVztBQUV2QixNQUFNLEtBQUs7QUFBQSxFQUNULE9BQU87QUFBQSxFQUNQLFdBQVc7QUFBQSxFQUNYLE9BQU87QUFBQSxFQUNQLGtCQUFrQjtBQUFBLEVBQ2xCLGlCQUFpQjtBQUFBLEVBQ2pCLFNBQVM7QUFDWDtBQUVBLE1BQU0sTUFBTTtBQUFBLEVBQ1YsUUFBUSxJQUFJLE1BQU0sUUFBUTtBQUFBLEVBQzFCLEtBQUssSUFBSSxNQUFNLFFBQVE7QUFBQSxFQUN2QixLQUFLLElBQUksTUFBTSxRQUFRO0FBQUEsRUFDdkIsUUFBUSxJQUFJLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQztBQUFBLEVBQ2pDLE9BQU8sSUFBSSxNQUFNLE1BQU07QUFBQSxFQUN2QixLQUFLLElBQUksTUFBTSxVQUFVO0FBQzNCO0FBSUEsU0FBUyxVQUFVLFFBQTRCO0FBQzdDLFFBQU0sU0FBUyxPQUFzQixJQUFJO0FBRXpDLGtCQUFnQixNQUFNO0FBQ3BCLFFBQUksQ0FBQyxRQUFRO0FBQ1g7QUFBQSxJQUNGO0FBRUEsVUFBTSxVQUFVLE1BQU07QUFDcEIsWUFBTSxJQUFJLE9BQU8sc0JBQXNCO0FBQ3ZDLGFBQU8sVUFBVTtBQUFBLFFBQ2YsUUFBUSxFQUFFO0FBQUEsUUFDVixPQUFPLEVBQUUsT0FBTyxPQUFPO0FBQUEsUUFDdkIsT0FBTyxFQUFFLE1BQU0sT0FBTztBQUFBLFFBQ3RCLE9BQU8sRUFBRTtBQUFBLE1BQ1g7QUFBQSxJQUNGO0FBRUEsWUFBUTtBQUVSLFVBQU0sS0FBSyxJQUFJLGVBQWUsT0FBTztBQUNyQyxPQUFHLFFBQVEsTUFBTTtBQUNqQixPQUFHLFFBQVEsU0FBUyxJQUFJO0FBQ3hCLFdBQU8saUJBQWlCLFVBQVUsU0FBUyxFQUFFLFNBQVMsS0FBSyxDQUFDO0FBRTVELFdBQU8sTUFBTTtBQUNYLFNBQUcsV0FBVztBQUNkLGFBQU8sb0JBQW9CLFVBQVUsT0FBTztBQUFBLElBQzlDO0FBQUEsRUFDRixHQUFHLENBQUMsTUFBTSxDQUFDO0FBRVgsU0FBTztBQUNUO0FBRUEsU0FBUyxnQkFBZ0I7QUFBQSxFQUN2QjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0YsR0FHSTtBQUNGLFFBQU0sTUFBTSxPQUFvQixJQUFJO0FBQ3BDLFFBQU0sRUFBRSxRQUFRLE1BQU0sU0FBUyxJQUFJLFNBQVM7QUFFNUMsV0FBUyxNQUFNO0FBQ2IsVUFBTSxJQUFJLElBQUk7QUFDZCxVQUFNLElBQUksT0FBTztBQUVqQixRQUFJLENBQUMsS0FBSyxDQUFDLEdBQUc7QUFDWjtBQUFBLElBQ0Y7QUFFQSxVQUFNLE9BQU8sRUFBRSxRQUFRLE9BQU87QUFDOUIsVUFBTSxNQUFNLEVBQUUsUUFBUSxPQUFPO0FBRTdCLFFBQUksSUFBSTtBQUFBLE9BQ0osT0FBTyxFQUFFLFFBQVEsS0FBSyxLQUFLLFFBQVMsSUFBSTtBQUFBLE1BQzFDLEtBQU0sTUFBTSxFQUFFLFNBQVMsS0FBSyxLQUFLLFNBQVU7QUFBQSxJQUM3QztBQUVBLFdBQU8sa0JBQWtCLElBQUksTUFBTTtBQUNuQyxRQUFJLE1BQU0sOEJBQThCLElBQUksUUFBUSxJQUFJLE1BQU07QUFDOUQsUUFBSSxJQUFJLGNBQWMsSUFBSSxLQUFLLE1BQU07QUFFckMsVUFBTSxNQUFNLElBQUksSUFBSSxJQUFJLGVBQWUsSUFBSSxPQUFPLElBQUksR0FBRztBQUV6RCxRQUFJLEtBQUs7QUFDUCxRQUFFLFNBQVMsS0FBSyxHQUFHO0FBQUEsSUFDckI7QUFFQSxVQUFNLE9BQVEsT0FBNEMsUUFBUTtBQUVsRSxNQUFFLE1BQU07QUFBQSxNQUNOLEtBQUs7QUFBQSxRQUNGLEVBQUUsUUFBUSxLQUFLLFFBQVMsU0FBUztBQUFBLFFBQ2pDLEVBQUUsU0FBUyxLQUFLLFNBQVUsU0FBUztBQUFBLE1BQ3RDLEtBQUssV0FBVyxJQUFJLE9BQU8sV0FBVztBQUFBLElBQ3hDO0FBQUEsRUFDRixDQUFDO0FBRUQsU0FBTyxvQkFBQyxXQUFNLEtBQVcsVUFBUztBQUNwQztBQUVPLGdCQUFTLFlBQVk7QUFBQSxFQUMxQjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0EsWUFBWTtBQUFBLEVBQ1o7QUFBQSxFQUNBO0FBQ0YsR0FBcUI7QUFDbkIsUUFBTSxDQUFDLFdBQVcsWUFBWSxJQUFJLFNBQWdDLElBQUk7QUFDdEUsUUFBTSxXQUFXLFFBQVEsUUFBUTtBQUVqQyxRQUFNLFNBQVM7QUFBQSxJQUNiLFlBQWEsV0FBVyxpQkFBaUIsT0FBUTtBQUFBLEVBQ25EO0FBRUEsWUFBVSxNQUFNO0FBQ2QsVUFBTSxLQUFLLGFBQWEsQ0FBQyxXQUFXLFlBQVk7QUFFaEQsUUFBSSxDQUFDLElBQUk7QUFDUDtBQUFBLElBQ0Y7QUFFQSxVQUFNLE9BQU8sTUFBTyxTQUFTLEtBQUssTUFBTSxhQUFhO0FBQ3JELFVBQU0sU0FBUyxNQUFPLFNBQVMsS0FBSyxNQUFNLGFBQWE7QUFFdkQsT0FBRyxpQkFBaUIsZUFBZSxJQUFJO0FBQ3ZDLFdBQU8saUJBQWlCLGFBQWEsTUFBTTtBQUUzQyxXQUFPLE1BQU07QUFDWCxTQUFHLG9CQUFvQixlQUFlLElBQUk7QUFDMUMsYUFBTyxvQkFBb0IsYUFBYSxNQUFNO0FBQUEsSUFDaEQ7QUFBQSxFQUNGLEdBQUcsQ0FBQyxXQUFXLFdBQVcsUUFBUSxDQUFDO0FBTW5DLFFBQU0sQ0FBQyxZQUFZLGFBQWEsSUFBSTtBQUFBLElBQ2xDLE9BQU8sYUFBYSxlQUFlLFNBQVM7QUFBQSxFQUM5QztBQUVBLFlBQVUsTUFBTTtBQUNkLFVBQU0sZUFBZSxNQUFNLGNBQWMsU0FBUyxNQUFNO0FBQ3hELGFBQVMsaUJBQWlCLG9CQUFvQixZQUFZO0FBRTFELFdBQU8sTUFBTSxTQUFTLG9CQUFvQixvQkFBb0IsWUFBWTtBQUFBLEVBQzVFLEdBQUcsQ0FBQyxDQUFDO0FBRUwsUUFBTSxxQkFBcUIsYUFBYSxVQUFVO0FBRWxELFFBQU0sTUFBTTtBQUFBLElBQ1YsT0FBTztBQUFBLE1BQ0wsS0FBSyxRQUFRLE9BQU87QUFBQSxNQUNwQixNQUFNLFFBQVEsUUFBUTtBQUFBLE1BQ3RCLFVBQVUsUUFBUSxZQUFhLENBQUMsR0FBRyxHQUFHLEVBQUU7QUFBQSxNQUN4QyxNQUFNLFlBQVksWUFBWSxJQUFJO0FBQUEsSUFDcEM7QUFBQSxJQUNBLENBQUMsVUFBVSxRQUFRLFNBQVM7QUFBQSxFQUM5QjtBQUVBLFFBQU0sU0FDSjtBQUFBLElBQUM7QUFBQTtBQUFBLE1BQ0MsUUFBUTtBQUFBLE1BQ1I7QUFBQSxNQUNBLEtBQUssQ0FBQyxHQUFHLENBQUM7QUFBQSxNQUNWLGFBQWEsWUFBWSxXQUFXO0FBQUEsTUFDcEMsYUFBYSxZQUFhLGFBQWEsU0FBYTtBQUFBLE1BQ3BELFdBQVc7QUFBQSxNQUNYLElBQUk7QUFBQSxNQUNKLGNBQVk7QUFBQSxNQUNaLE9BQ0UsWUFDSTtBQUFBLFFBQ0UsUUFBUTtBQUFBLFFBQ1IsT0FBTztBQUFBLFFBQ1AsZUFBZTtBQUFBLFFBQ2YsVUFBVTtBQUFBLFFBQ1YsT0FBTztBQUFBLFFBQ1AsUUFBUTtBQUFBLFFBQ1IsR0FBRztBQUFBLE1BQ0wsSUFDQSxFQUFFLFFBQVEsUUFBUSxPQUFPLFFBQVEsR0FBRyxNQUFNO0FBQUEsTUFHL0Msc0JBQ0Msb0JBQUMsbUJBQWdCLFVBQW9CLFFBQ2xDLG1CQUFTLEdBQ1osSUFFQSxTQUFTO0FBQUE7QUFBQSxFQUViO0FBR0YsU0FBTyxZQUNMLHFCQUFDLFlBQ0M7QUFBQTtBQUFBLE1BQUM7QUFBQTtBQUFBLFFBQ0MsS0FBSztBQUFBLFFBQ0wsT0FBTztBQUFBLFVBQ0wsUUFBUTtBQUFBLFVBQ1IsT0FBTztBQUFBLFVBQ1AsZUFBZSxXQUFXLFNBQVM7QUFBQSxVQUNuQyxVQUFVO0FBQUEsVUFDVixPQUFPO0FBQUEsVUFDUCxRQUFRO0FBQUEsUUFDVjtBQUFBO0FBQUEsSUFDRjtBQUFBLElBQ0M7QUFBQSxLQUNILElBRUE7QUFFSjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,9 @@
1
+ import type { RefObject } from 'react';
2
+ export declare function Scramble({ children, dur, spread, target }: ScrambleProps): import("react").JSX.Element;
3
+ interface ScrambleProps {
4
+ children: string;
5
+ dur?: number;
6
+ spread?: number;
7
+ target?: RefObject<HTMLElement | null>;
8
+ }
9
+ export {};