livemark 0.24.1 → 0.26.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 (397) hide show
  1. package/README.md +3 -2
  2. package/build/actions/config/define.d.ts +6 -0
  3. package/build/actions/config/define.unit.js +8 -1
  4. package/build/actions/escape/copy.d.ts +11 -0
  5. package/build/actions/escape/copy.js +29 -0
  6. package/build/actions/escape/copy.unit.d.ts +1 -0
  7. package/build/actions/escape/copy.unit.js +37 -0
  8. package/build/actions/escape/list.d.ts +12 -0
  9. package/build/actions/escape/list.js +27 -0
  10. package/build/actions/escape/list.unit.d.ts +1 -0
  11. package/build/actions/escape/list.unit.js +36 -0
  12. package/build/actions/target/build.d.ts +9 -26
  13. package/build/actions/target/build.js +50 -71
  14. package/build/actions/target/build.unit.d.ts +1 -0
  15. package/build/actions/target/build.unit.js +76 -0
  16. package/build/actions/target/clear.d.ts +4 -0
  17. package/build/actions/target/clear.js +14 -0
  18. package/build/actions/target/clear.unit.d.ts +1 -0
  19. package/build/actions/target/clear.unit.js +23 -0
  20. package/build/commands/build.js +1 -2
  21. package/build/commands/clear.d.ts +5 -0
  22. package/build/commands/clear.js +15 -0
  23. package/build/commands/escape.d.ts +4 -3
  24. package/build/commands/escape.js +45 -48
  25. package/build/commands/preview.js +1 -2
  26. package/build/commands/start.js +1 -2
  27. package/build/components/Abbr.d.ts +1 -1
  28. package/build/components/Abbr.js +2 -4
  29. package/build/components/AnsiCode.d.ts +1 -1
  30. package/build/components/AnsiCode.js +2 -2
  31. package/build/components/Article.d.ts +2 -1
  32. package/build/components/Article.js +7 -14
  33. package/build/components/BackToTop.d.ts +1 -1
  34. package/build/components/Banner.d.ts +2 -2
  35. package/build/components/Banner.js +7 -3
  36. package/build/components/BlogIndex.d.ts +1 -1
  37. package/build/components/BlogIndex.js +2 -11
  38. package/build/components/Breadcrumbs.d.ts +1 -1
  39. package/build/components/Breadcrumbs.js +2 -3
  40. package/build/components/Callout.d.ts +1 -1
  41. package/build/components/Callout.js +5 -9
  42. package/build/components/Card.d.ts +1 -1
  43. package/build/components/Card.js +2 -3
  44. package/build/components/Cards.d.ts +1 -1
  45. package/build/components/ChangelogIndex.d.ts +1 -1
  46. package/build/components/ChangelogIndex.js +2 -11
  47. package/build/components/ChoiceList.d.ts +15 -0
  48. package/build/components/ChoiceList.js +13 -0
  49. package/build/components/CodeBlock.d.ts +1 -1
  50. package/build/components/CodeBlock.js +3 -16
  51. package/build/components/CodeTabs.d.ts +1 -1
  52. package/build/components/CodeTabs.js +2 -3
  53. package/build/components/Column.d.ts +1 -1
  54. package/build/components/Columns.d.ts +1 -1
  55. package/build/components/Content.d.ts +1 -1
  56. package/build/components/ContentTab.d.ts +1 -1
  57. package/build/components/ContentTabs.d.ts +1 -1
  58. package/build/components/ContentTabs.js +2 -3
  59. package/build/components/DefaultCatchBoundary.d.ts +1 -1
  60. package/build/components/DefaultCatchBoundary.js +5 -7
  61. package/build/components/DefinitionList.d.ts +3 -3
  62. package/build/components/Details.d.ts +1 -1
  63. package/build/components/Details.js +2 -5
  64. package/build/components/FileTree.d.ts +1 -1
  65. package/build/components/FileTree.js +3 -5
  66. package/build/components/Footer.d.ts +1 -1
  67. package/build/components/Footer.js +2 -5
  68. package/build/components/FootnoteRef.d.ts +1 -1
  69. package/build/components/FootnoteRef.js +2 -4
  70. package/build/components/Header.d.ts +6 -0
  71. package/build/components/Header.js +26 -0
  72. package/build/components/HeaderMenu.d.ts +2 -0
  73. package/build/components/HeaderMenu.js +27 -0
  74. package/build/components/HeaderNav.d.ts +6 -0
  75. package/build/components/HeaderNav.js +74 -0
  76. package/build/components/HeaderSearch.d.ts +4 -0
  77. package/build/components/HeaderSearch.js +33 -0
  78. package/build/components/Heading.d.ts +6 -6
  79. package/build/components/InlineBadge.d.ts +2 -2
  80. package/build/components/InlineBadge.js +1 -1
  81. package/build/components/InlineIcon.d.ts +1 -1
  82. package/build/components/InlineToc.d.ts +1 -1
  83. package/build/components/InlineToc.js +2 -4
  84. package/build/components/Layout.d.ts +2 -1
  85. package/build/components/Layout.js +5 -58
  86. package/build/components/LinkButton.d.ts +2 -2
  87. package/build/components/LinkButton.js +1 -1
  88. package/build/components/MenuSheet.d.ts +22 -0
  89. package/build/components/MenuSheet.js +27 -0
  90. package/build/components/Mermaid.d.ts +1 -1
  91. package/build/components/MermaidRenderer.d.ts +1 -1
  92. package/build/components/MermaidRenderer.js +20 -8
  93. package/build/components/NotFound.d.ts +1 -1
  94. package/build/components/NotFound.js +3 -6
  95. package/build/components/PackageTabs.d.ts +1 -1
  96. package/build/components/PackageTabs.js +3 -7
  97. package/build/components/PageToolbar.d.ts +1 -1
  98. package/build/components/PageToolbar.js +2 -10
  99. package/build/components/PrevNext.d.ts +1 -1
  100. package/build/components/PrevNext.js +2 -10
  101. package/build/components/Root.d.ts +4 -0
  102. package/build/components/Root.js +8 -0
  103. package/build/components/Search.d.ts +5 -2
  104. package/build/components/Search.js +11 -9
  105. package/build/components/SearchDialog.d.ts +1 -1
  106. package/build/components/SearchDialog.js +10 -133
  107. package/build/components/Section.d.ts +1 -1
  108. package/build/components/SectionHeader.d.ts +1 -1
  109. package/build/components/SheetPanel.d.ts +12 -0
  110. package/build/components/SheetPanel.js +19 -0
  111. package/build/components/Sidebar.d.ts +1 -1
  112. package/build/components/Sidebar.js +12 -14
  113. package/build/components/SidebarArticles.d.ts +4 -1
  114. package/build/components/SidebarArticles.js +5 -9
  115. package/build/components/SidebarLinks.d.ts +4 -1
  116. package/build/components/SidebarLinks.js +6 -9
  117. package/build/components/SidebarPosts.d.ts +4 -1
  118. package/build/components/SidebarPosts.js +7 -23
  119. package/build/components/SidebarReleases.d.ts +4 -1
  120. package/build/components/SidebarReleases.js +5 -15
  121. package/build/components/SidebarSectionPicker.d.ts +8 -0
  122. package/build/components/SidebarSectionPicker.js +31 -0
  123. package/build/components/SidebarSections.d.ts +1 -1
  124. package/build/components/SidebarSections.js +5 -9
  125. package/build/components/SiteLink.d.ts +1 -1
  126. package/build/components/SiteTitle.d.ts +1 -1
  127. package/build/components/SiteTitle.js +2 -6
  128. package/build/components/SortableTable.d.ts +1 -1
  129. package/build/components/SoundCloud.d.ts +1 -1
  130. package/build/components/SoundCloud.js +2 -2
  131. package/build/components/TagIndex.d.ts +1 -1
  132. package/build/components/TagIndex.js +2 -11
  133. package/build/components/Theme.d.ts +2 -1
  134. package/build/components/Theme.js +35 -15
  135. package/build/components/Toc.d.ts +5 -4
  136. package/build/components/Toc.js +35 -35
  137. package/build/components/YouTube.d.ts +1 -1
  138. package/build/components/YouTube.js +2 -2
  139. package/build/components/ZoomImage.d.ts +1 -1
  140. package/build/content-collections.js +5 -1
  141. package/build/elements/accordion.d.ts +4 -4
  142. package/build/elements/accordion.js +2 -3
  143. package/build/elements/alert-dialog.d.ts +12 -12
  144. package/build/elements/alert-dialog.js +2 -4
  145. package/build/elements/alert.d.ts +4 -4
  146. package/build/elements/alert.js +2 -2
  147. package/build/elements/aspect-ratio.d.ts +1 -1
  148. package/build/elements/avatar.d.ts +6 -6
  149. package/build/elements/badge.d.ts +1 -1
  150. package/build/elements/badge.js +3 -1
  151. package/build/elements/breadcrumb.d.ts +6 -6
  152. package/build/elements/breadcrumb.js +2 -4
  153. package/build/elements/button-group.d.ts +2 -2
  154. package/build/elements/button-group.js +5 -5
  155. package/build/elements/button.d.ts +2 -2
  156. package/build/elements/button.js +9 -7
  157. package/build/elements/calendar.d.ts +2 -2
  158. package/build/elements/calendar.js +2 -2
  159. package/build/elements/card.d.ts +7 -7
  160. package/build/elements/card.js +4 -4
  161. package/build/elements/carousel.d.ts +5 -5
  162. package/build/elements/carousel.js +3 -7
  163. package/build/elements/chart.d.ts +6 -6
  164. package/build/elements/chart.js +5 -11
  165. package/build/elements/checkbox.d.ts +1 -1
  166. package/build/elements/collapsible.d.ts +3 -3
  167. package/build/elements/command.d.ts +9 -9
  168. package/build/elements/command.js +5 -11
  169. package/build/elements/context-menu.d.ts +15 -15
  170. package/build/elements/context-menu.js +6 -9
  171. package/build/elements/dialog.d.ts +10 -10
  172. package/build/elements/dialog.js +2 -6
  173. package/build/elements/drawer.d.ts +14 -12
  174. package/build/elements/drawer.js +14 -15
  175. package/build/elements/dropdown-menu.d.ts +15 -15
  176. package/build/elements/dropdown-menu.js +7 -10
  177. package/build/elements/empty.d.ts +6 -6
  178. package/build/elements/empty.js +2 -2
  179. package/build/elements/field.d.ts +10 -10
  180. package/build/elements/field.js +3 -4
  181. package/build/elements/hover-card.d.ts +3 -3
  182. package/build/elements/hover-card.js +2 -2
  183. package/build/elements/input-group.d.ts +7 -7
  184. package/build/elements/input-group.js +5 -5
  185. package/build/elements/input-otp.d.ts +4 -4
  186. package/build/elements/input.d.ts +1 -1
  187. package/build/elements/input.js +2 -2
  188. package/build/elements/item.d.ts +9 -9
  189. package/build/elements/item.js +2 -2
  190. package/build/elements/kbd.d.ts +2 -2
  191. package/build/elements/label.d.ts +1 -1
  192. package/build/elements/menubar.d.ts +16 -16
  193. package/build/elements/menubar.js +9 -11
  194. package/build/elements/native-select.d.ts +3 -3
  195. package/build/elements/native-select.js +2 -4
  196. package/build/elements/navigation-menu.d.ts +8 -8
  197. package/build/elements/navigation-menu.js +3 -5
  198. package/build/elements/pagination.d.ts +7 -7
  199. package/build/elements/pagination.js +4 -10
  200. package/build/elements/popover.d.ts +6 -6
  201. package/build/elements/popover.js +2 -2
  202. package/build/elements/progress.d.ts +5 -5
  203. package/build/elements/progress.js +2 -3
  204. package/build/elements/radio-group.d.ts +2 -2
  205. package/build/elements/resizable.d.ts +3 -3
  206. package/build/elements/scroll-area.d.ts +2 -2
  207. package/build/elements/scroll-area.js +2 -4
  208. package/build/elements/select.d.ts +9 -9
  209. package/build/elements/select.js +4 -9
  210. package/build/elements/separator.d.ts +1 -1
  211. package/build/elements/sheet.d.ts +8 -8
  212. package/build/elements/sheet.js +2 -6
  213. package/build/elements/sidebar.d.ts +19 -19
  214. package/build/elements/sidebar.js +15 -37
  215. package/build/elements/skeleton.d.ts +1 -1
  216. package/build/elements/slider.d.ts +2 -1
  217. package/build/elements/slider.js +2 -3
  218. package/build/elements/sonner.d.ts +1 -1
  219. package/build/elements/spinner.d.ts +1 -1
  220. package/build/elements/switch.d.ts +1 -1
  221. package/build/elements/table.d.ts +8 -8
  222. package/build/elements/tabs.d.ts +4 -4
  223. package/build/elements/tabs.js +3 -3
  224. package/build/elements/textarea.d.ts +1 -1
  225. package/build/elements/textarea.js +2 -2
  226. package/build/elements/toggle-group.d.ts +3 -2
  227. package/build/elements/toggle-group.js +3 -3
  228. package/build/elements/toggle.d.ts +1 -1
  229. package/build/elements/toggle.js +2 -2
  230. package/build/elements/tooltip.d.ts +4 -4
  231. package/build/elements/tooltip.js +2 -3
  232. package/build/head.d.ts +4 -0
  233. package/build/head.js +6 -0
  234. package/build/helpers/article-search.d.ts +19 -0
  235. package/build/helpers/article-search.js +134 -0
  236. package/build/helpers/dependency-dir.d.ts +5 -0
  237. package/build/helpers/dependency-dir.js +20 -0
  238. package/build/helpers/dependency-dir.unit.d.ts +1 -0
  239. package/build/helpers/dependency-dir.unit.js +25 -0
  240. package/build/helpers/dynamic-icon-resolver.d.ts +1 -1
  241. package/build/helpers/dynamic-icon.d.ts +1 -1
  242. package/build/helpers/head.d.ts +53 -0
  243. package/build/helpers/head.js +69 -0
  244. package/build/helpers/head.unit.d.ts +1 -0
  245. package/build/helpers/head.unit.js +108 -0
  246. package/build/helpers/nav-items.d.ts +11 -0
  247. package/build/helpers/nav-items.js +65 -0
  248. package/build/helpers/render-inline-markdown.d.ts +1 -0
  249. package/build/helpers/render-inline-markdown.js +34 -0
  250. package/build/helpers/render-inline-markdown.unit.d.ts +1 -0
  251. package/build/helpers/render-inline-markdown.unit.js +20 -0
  252. package/build/helpers/search-highlight.d.ts +8 -0
  253. package/build/helpers/search-highlight.js +59 -0
  254. package/build/helpers/search-highlight.unit.d.ts +1 -0
  255. package/build/helpers/search-highlight.unit.js +36 -0
  256. package/build/helpers/target-export.d.ts +9 -0
  257. package/build/helpers/target-export.js +24 -0
  258. package/build/helpers/target-export.unit.d.ts +1 -0
  259. package/build/helpers/target-export.unit.js +25 -0
  260. package/build/helpers/theme.d.ts +6 -2
  261. package/build/helpers/theme.js +40 -7
  262. package/build/helpers/theme.unit.d.ts +1 -0
  263. package/build/helpers/theme.unit.js +30 -0
  264. package/build/hooks/hydrated.d.ts +2 -0
  265. package/build/hooks/hydrated.js +15 -0
  266. package/build/index.d.ts +1 -0
  267. package/build/index.js +1 -1
  268. package/build/models/config.d.ts +32 -6
  269. package/build/models/config.js +10 -1
  270. package/build/models/section.d.ts +4 -2
  271. package/build/models/section.js +1 -1
  272. package/build/plugins/vite-livemark.d.ts +4 -5
  273. package/build/plugins/vite-livemark.js +56 -90
  274. package/build/program.js +4 -2
  275. package/build/routes/$.d.ts +4 -1
  276. package/build/routes/$.js +20 -9
  277. package/build/routes/__root.js +29 -63
  278. package/build/settings.js +2 -1
  279. package/package.json +68 -66
  280. package/{.agents/skills → skills}/livemark-authoring/SKILL.md +2 -2
  281. package/{.agents/skills → skills}/livemark-configuration/SKILL.md +12 -5
  282. package/skills/livemark-customization/SKILL.md +145 -0
  283. package/source/actions/config/define.unit.ts +9 -0
  284. package/source/actions/escape/copy.ts +35 -0
  285. package/source/actions/escape/copy.unit.ts +51 -0
  286. package/source/actions/escape/list.ts +30 -0
  287. package/source/actions/escape/list.unit.ts +42 -0
  288. package/source/actions/target/build.ts +49 -69
  289. package/source/actions/target/build.unit.ts +95 -0
  290. package/source/actions/target/clear.ts +14 -0
  291. package/source/actions/target/clear.unit.ts +25 -0
  292. package/source/commands/build.ts +0 -1
  293. package/source/commands/clear.ts +15 -0
  294. package/source/commands/escape.ts +42 -59
  295. package/source/commands/preview.ts +0 -1
  296. package/source/commands/start.ts +0 -1
  297. package/source/components/AnsiCode.tsx +1 -1
  298. package/source/components/Article.tsx +8 -4
  299. package/source/components/Banner.tsx +12 -2
  300. package/source/components/BlogIndex.tsx +1 -1
  301. package/source/components/Callout.tsx +4 -6
  302. package/source/components/ChangelogIndex.tsx +1 -1
  303. package/source/components/ChoiceList.tsx +69 -0
  304. package/source/components/CodeBlock.tsx +6 -6
  305. package/source/components/CodeTabs.tsx +1 -1
  306. package/source/components/ContentTabs.tsx +1 -1
  307. package/source/components/DefaultCatchBoundary.tsx +4 -6
  308. package/source/components/Details.tsx +1 -1
  309. package/source/components/FileTree.tsx +1 -1
  310. package/source/components/Header.tsx +52 -0
  311. package/source/components/HeaderMenu.tsx +41 -0
  312. package/source/components/HeaderNav.tsx +145 -0
  313. package/source/components/HeaderSearch.tsx +77 -0
  314. package/source/components/InlineBadge.tsx +1 -1
  315. package/source/components/InlineToc.tsx +1 -1
  316. package/source/components/Layout.tsx +16 -160
  317. package/source/components/LinkButton.tsx +9 -1
  318. package/source/components/MenuSheet.tsx +92 -0
  319. package/source/components/MermaidRenderer.tsx +19 -8
  320. package/source/components/NotFound.tsx +3 -5
  321. package/source/components/PackageTabs.tsx +2 -2
  322. package/source/components/PageToolbar.tsx +11 -3
  323. package/source/components/PrevNext.tsx +2 -2
  324. package/source/components/Root.tsx +13 -0
  325. package/source/components/Search.tsx +28 -8
  326. package/source/components/SearchDialog.tsx +15 -189
  327. package/source/components/SheetPanel.tsx +69 -0
  328. package/source/components/Sidebar.tsx +27 -14
  329. package/source/components/SidebarArticles.tsx +4 -3
  330. package/source/components/SidebarLinks.tsx +3 -2
  331. package/source/components/SidebarPosts.tsx +3 -2
  332. package/source/components/SidebarReleases.tsx +3 -2
  333. package/source/components/SidebarSectionPicker.tsx +70 -0
  334. package/source/components/SiteTitle.tsx +5 -5
  335. package/source/components/SoundCloud.tsx +1 -1
  336. package/source/components/TagIndex.tsx +1 -1
  337. package/source/components/Theme.tsx +55 -29
  338. package/source/components/Toc.tsx +76 -55
  339. package/source/components/YouTube.tsx +1 -1
  340. package/source/content-collections.ts +4 -0
  341. package/source/elements/alert-dialog.tsx +1 -1
  342. package/source/elements/alert.tsx +1 -1
  343. package/source/elements/badge.tsx +4 -0
  344. package/source/elements/button-group.tsx +4 -4
  345. package/source/elements/button.tsx +10 -6
  346. package/source/elements/calendar.tsx +1 -1
  347. package/source/elements/card.tsx +3 -3
  348. package/source/elements/command.tsx +7 -4
  349. package/source/elements/context-menu.tsx +5 -5
  350. package/source/elements/dialog.tsx +1 -1
  351. package/source/elements/drawer.tsx +59 -43
  352. package/source/elements/dropdown-menu.tsx +6 -6
  353. package/source/elements/empty.tsx +1 -1
  354. package/source/elements/field.tsx +1 -1
  355. package/source/elements/hover-card.tsx +1 -1
  356. package/source/elements/input-group.tsx +4 -4
  357. package/source/elements/input.tsx +1 -1
  358. package/source/elements/item.tsx +1 -1
  359. package/source/elements/menubar.tsx +8 -8
  360. package/source/elements/native-select.tsx +1 -1
  361. package/source/elements/popover.tsx +1 -1
  362. package/source/elements/select.tsx +3 -3
  363. package/source/elements/sidebar.tsx +8 -21
  364. package/source/elements/tabs.tsx +2 -2
  365. package/source/elements/textarea.tsx +1 -1
  366. package/source/elements/toggle-group.tsx +2 -2
  367. package/source/elements/toggle.tsx +1 -1
  368. package/source/env.d.ts +1 -0
  369. package/source/head.ts +7 -0
  370. package/source/helpers/article-search.tsx +192 -0
  371. package/source/helpers/dependency-dir.ts +20 -0
  372. package/source/helpers/dependency-dir.unit.ts +39 -0
  373. package/source/helpers/head.ts +94 -0
  374. package/source/helpers/head.unit.ts +116 -0
  375. package/source/helpers/nav-items.tsx +102 -0
  376. package/source/helpers/render-inline-markdown.ts +44 -0
  377. package/source/helpers/render-inline-markdown.unit.ts +30 -0
  378. package/source/helpers/search-highlight.ts +73 -0
  379. package/source/helpers/search-highlight.unit.ts +42 -0
  380. package/source/helpers/target-export.ts +28 -0
  381. package/source/helpers/target-export.unit.ts +37 -0
  382. package/source/helpers/theme.ts +40 -6
  383. package/source/helpers/theme.unit.ts +32 -0
  384. package/source/hooks/hydrated.ts +18 -0
  385. package/source/index.ts +1 -0
  386. package/source/models/config.ts +13 -0
  387. package/source/models/section.ts +3 -0
  388. package/source/plugins/vite-livemark.ts +54 -95
  389. package/source/program.ts +2 -0
  390. package/source/routes/$.tsx +27 -9
  391. package/source/routes/__root.tsx +51 -71
  392. package/source/settings.ts +1 -0
  393. package/source/styles/general.css +59 -11
  394. package/source/styles/markdown.css +13 -7
  395. package/source/styles/shape.css +14 -0
  396. package/.agents/skills/change-review/SKILL.md +0 -47
  397. package/.agents/skills/livemark-customization/SKILL.md +0 -118
@@ -1,17 +1,21 @@
1
- import { cpSync, existsSync, rmSync } from "node:fs";
1
+ import { cpSync, existsSync, rmSync, statSync } from "node:fs";
2
2
  import { join, sep } from "node:path";
3
- import { watch as chokidarWatch } from "chokidar";
4
3
  import { mergeConfig } from "vite";
4
+ import packageJson from "../../package.json" with { type: "json" };
5
5
  import { buildTarget } from "../actions/target/build.js";
6
+ import { renderInlineMarkdown } from "../helpers/render-inline-markdown.js";
7
+ import { resolveTargetExport } from "../helpers/target-export.js";
6
8
  import { WebsiteConfig } from "../models/config.js";
7
9
  import { ESCAPABLE_FILES, ESCAPABLE_FOLDERS } from "../settings.js";
8
10
  const SOURCE_DIR = join(import.meta.dirname, "..");
11
+ const IS_INSTALLED = SOURCE_DIR.includes(`${sep}node_modules${sep}`);
9
12
  /** Single virtual module exposing livemark's runtime values to consumer
10
13
  * override files via named exports:
11
14
  *
12
15
  * import { config } from "livemark:virtual"
13
16
  *
14
- * Currently exports `config` (validated `WebsiteConfig`); future
17
+ * Currently exports `config` (validated `WebsiteConfig`) and `bannerHtml`
18
+ * (`config.banner` rendered from inline Markdown at build time); future
15
19
  * additions (e.g. `articles`, `sections`) land here as new named
16
20
  * exports without consumers changing their import statements.
17
21
  *
@@ -20,33 +24,36 @@ const SOURCE_DIR = join(import.meta.dirname, "..");
20
24
  * or load it from disk". */
21
25
  const VIRTUAL_ID = "livemark:virtual";
22
26
  const VIRTUAL_RESOLVED_ID = `\0${VIRTUAL_ID}`;
23
- /** Owns the per-consumer `targets/<hash>/` mount: synthesizes it via
27
+ /** Owns the project's `.livemark/.target/` mount: synthesizes it via
24
28
  * `buildTarget()`, returns the Vite config that anchors there, and
25
- * watches the consumer's `.livemark/` (plus livemark's `source/` in
26
- * dev) for changes that need to be re-copied into the target. The
27
- * override mechanism is pure file-system (full copies) — no resolveId
28
- * redirection, no realpath surprises. */
29
+ * copies `.livemark/` edits (plus livemark's `source/` in its own dev)
30
+ * into the target. Vite watches the target natively, so its own HMR
31
+ * decides between Fast Refresh, CSS updates and a page reload. */
29
32
  export function livemark(opts) {
30
33
  const overridesRoot = join(opts.config.root, ".livemark");
34
+ const outDir = join(overridesRoot, "build");
31
35
  let targetDir = "";
32
36
  return {
33
37
  name: "livemark",
34
38
  enforce: "pre",
35
39
  async config(_, env) {
36
- targetDir = buildTarget(opts.config.configPath);
40
+ targetDir = buildTarget({
41
+ configPath: opts.config.configPath,
42
+ sourceDir: SOURCE_DIR,
43
+ });
37
44
  const base = {
38
45
  root: targetDir,
46
+ // The default `<root>/node_modules/.vite` would land inside the
47
+ // dependency link, i.e. in livemark's shared install.
48
+ cacheDir: join(targetDir, ".vite"),
39
49
  // Mount everything (asset URLs, modulepreloads, dev server) under
40
50
  // `config.base` so the same build works at root or at a sub-path
41
51
  // (e.g. GitHub Pages `https://user.github.io/repo/`). The router
42
52
  // and asset-path resolver mirror this at runtime.
43
53
  base: opts.config.base ? `${opts.config.base}/` : "/",
44
- // outDir lives outside the target root (in the consumer's
45
- // .livemark/) so the consumer can find their deployable output
46
- // without digging into node_modules. Vite's default refusal to
47
- // empty out-of-root directories doesn't apply here because the
48
- // target/ root is livemark's, not the consumer's.
49
- build: { outDir: join(overridesRoot, "build"), emptyOutDir: true },
54
+ // outDir lives outside the target root, so Vite's refusal to
55
+ // empty out-of-root directories needs `emptyOutDir`.
56
+ build: { outDir, emptyOutDir: true },
50
57
  resolve: { dedupe: ["react", "react-dom"] },
51
58
  // For the SSR build only, inline every node_modules dep into
52
59
  // server.js. The prerender step (which runs server.js with
@@ -64,83 +71,59 @@ export function livemark(opts) {
64
71
  resolveId(id) {
65
72
  if (id === VIRTUAL_ID)
66
73
  return VIRTUAL_RESOLVED_ID;
67
- return null;
74
+ return resolveTargetExport({ id, targetDir, exports: packageJson.exports }) ?? null;
68
75
  },
69
76
  load(id) {
70
77
  if (id !== VIRTUAL_RESOLVED_ID)
71
78
  return null;
72
79
  const config = WebsiteConfig.parse(opts.config);
73
- return `export const config = ${JSON.stringify(config)}`;
80
+ const bannerHtml = config.banner
81
+ ? renderInlineMarkdown(config.banner, config.base)
82
+ : undefined;
83
+ return [
84
+ `export const config = ${JSON.stringify(config)}`,
85
+ `export const bannerHtml = ${JSON.stringify(bannerHtml)}`,
86
+ ].join("\n");
74
87
  },
75
88
  configureServer(server) {
76
- // Two reasons we don't use Vite's own `server.watcher`:
77
- // 1. Vite 8 bundles chokidar 3 with `disableGlobbing: true`, and
78
- // paths added via `server.watcher.add()` for surfaces outside
79
- // Vite's root never fire — getWatched() reports them but no
80
- // events arrive for external editors.
81
- // 2. Vite's chokidar ignores `**\/node_modules/**` by default, so
82
- // even if (1) were fixed, our targetDir (which lives inside
83
- // livemark's own node_modules in consumer projects) would be
84
- // silently filtered. We emit the change event manually onto
85
- // `server.watcher` after cpSync — see {@link notifyVite}.
86
- // A dedicated chokidar 5 watcher set up directly on these paths
87
- // fires reliably; we forward events into Vite's HMR pipeline below.
88
- const overlayPaths = [];
89
- for (const folder of ESCAPABLE_FOLDERS) {
90
- overlayPaths.push(join(overridesRoot, folder));
91
- }
92
- for (const file of ESCAPABLE_FILES) {
93
- overlayPaths.push(join(overridesRoot, file));
94
- }
95
- const watcher = chokidarWatch([opts.config.configPath, ...overlayPaths, SOURCE_DIR], { ignoreInitial: true, ignorePermissionErrors: true });
96
- watcher.on("change", file => onChange(file, "change"));
97
- watcher.on("add", file => onChange(file, "add"));
98
- watcher.on("unlink", file => onChange(file, "unlink"));
99
- const closeWatcher = () => {
100
- watcher.close();
101
- };
102
- server.httpServer?.once("close", closeWatcher);
89
+ // Vite watches only its root (the target); the files the target is
90
+ // copied from join its watcher here. `.livemark/` always exists
91
+ // because the target lives inside it.
92
+ server.watcher.add([opts.config.configPath, overridesRoot]);
93
+ if (!IS_INSTALLED)
94
+ server.watcher.add(SOURCE_DIR);
95
+ server.watcher.on("change", file => onChange(file, "change"));
96
+ server.watcher.on("add", file => onChange(file, "add"));
97
+ server.watcher.on("unlink", file => onChange(file, "unlink"));
98
+ server.watcher.on("unlinkDir", file => onChange(file, "unlink"));
103
99
  function onChange(file, kind) {
104
100
  if (file === opts.config.configPath) {
105
101
  server.restart();
106
102
  return;
107
103
  }
108
- const overlayHit = matchOverlay(file, overridesRoot);
104
+ if (isWithin(file, targetDir) || isWithin(file, outDir))
105
+ return;
106
+ const overlayHit = matchPath(file, overridesRoot);
109
107
  if (overlayHit) {
110
108
  syncOverlay(overlayHit, kind, targetDir, overridesRoot);
111
- notifyVite(server, join(targetDir, overlayHit.rel), kind);
112
- if (kind !== "change")
113
- fullReload(server);
114
109
  return;
115
110
  }
116
- const sourceHit = matchSource(file);
117
- if (sourceHit) {
111
+ const sourceHit = matchPath(file, SOURCE_DIR);
112
+ if (sourceHit && !sourceHit.rel.includes("routeTree.gen.ts")) {
118
113
  syncSource(sourceHit, kind, targetDir, overridesRoot);
119
- notifyVite(server, join(targetDir, sourceHit.rel), kind);
120
- if (kind !== "change")
121
- fullReload(server);
122
114
  }
123
115
  }
124
116
  },
125
117
  };
126
118
  }
127
- function matchOverlay(file, overridesRoot) {
128
- const prefix = `${overridesRoot}${sep}`;
129
- if (!file.startsWith(prefix))
119
+ function matchPath(file, root) {
120
+ if (!isWithin(file, root) || file === root)
130
121
  return null;
131
- const rel = file.slice(prefix.length);
122
+ const rel = file.slice(root.length + sep.length);
132
123
  return { rel, category: classify(rel) };
133
124
  }
134
- function matchSource(file) {
135
- const prefix = `${SOURCE_DIR}${sep}`;
136
- if (!file.startsWith(prefix))
137
- return null;
138
- // Skip the targets/ output dir itself (sibling of source/) and any
139
- // `.gen.ts` files that downstream tools regenerate inside the target.
140
- const rel = file.slice(prefix.length);
141
- if (rel === "" || rel.includes("routeTree.gen.ts"))
142
- return null;
143
- return { rel, category: classify(rel) };
125
+ function isWithin(file, dir) {
126
+ return file === dir || file.startsWith(`${dir}${sep}`);
144
127
  }
145
128
  function classify(rel) {
146
129
  const [head] = rel.split(sep);
@@ -158,7 +141,11 @@ function syncOverlay(hit, kind, targetDir, overridesRoot) {
158
141
  const dest = join(targetDir, hit.rel);
159
142
  const source = join(SOURCE_DIR, hit.rel);
160
143
  if (kind === "unlink") {
161
- rmSync(dest, { force: true, recursive: true });
144
+ // Copy a file's default over the escape in one write: an unlink then
145
+ // an add reaches Vite as two events and costs a page reload.
146
+ if (!existsSync(source) || statSync(source).isDirectory()) {
147
+ rmSync(dest, { force: true, recursive: true });
148
+ }
162
149
  if (existsSync(source))
163
150
  cpSync(source, dest, { recursive: true, force: true });
164
151
  return;
@@ -181,27 +168,6 @@ function syncSource(hit, kind, targetDir, overridesRoot) {
181
168
  if (existsSync(source))
182
169
  cpSync(source, dest, { recursive: true, force: true });
183
170
  }
184
- function fullReload(server) {
185
- server.ws.send({ type: "full-reload" });
186
- }
187
- /** Drive Vite's HMR pipeline manually for a target file we just synced.
188
- * Vite's chokidar ignores `**\/node_modules/**` by default and our
189
- * targetDir lives inside livemark's own node_modules in consumer
190
- * projects, so cpSync writes there are silently filtered out.
191
- *
192
- * Emitting on `server.watcher` runs Vite's HMR analysis per environment
193
- * (CSS gets `hmr update`, route modules trigger `(ssr) page reload`).
194
- * But `(ssr) page reload` only sends `full-reload` on the SSR
195
- * environment's hot channel — the browser is connected to the *client*
196
- * channel and never sees it. So we also fire `full-reload` on the
197
- * client hot directly, which is what TanStack Start needs for route
198
- * edits to actually refresh the page. CSS HMR still works because
199
- * Vite's analysis runs first and updates already-flushed before our
200
- * reload. */
201
- function notifyVite(server, targetFile, kind) {
202
- server.watcher.emit(kind, targetFile);
203
- server.environments.client.hot.send({ type: "full-reload" });
204
- }
205
171
  /** Resolve livemark.config.ts's `vite` field — either a config object
206
172
  * or a function `(env) => config` (matching Vite's own `defineConfig`).
207
173
  * Schema stores it as `unknown`; typing for the consumer's editor
@@ -218,4 +184,4 @@ async function resolveViteOverride(vite, env) {
218
184
  function isObject(v) {
219
185
  return v !== null && typeof v === "object";
220
186
  }
221
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS1saXZlbWFyay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9wbHVnaW5zL3ZpdGUtbGl2ZW1hcmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3BELE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ3JDLE9BQU8sRUFBRSxLQUFLLElBQUksYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBRWpELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDbEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFBO0FBRXhELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFNbkUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQTtBQUVsRDs7Ozs7Ozs7Ozs7NkJBVzZCO0FBQzdCLE1BQU0sVUFBVSxHQUFHLGtCQUFrQixDQUFBO0FBQ3JDLE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxVQUFVLEVBQUUsQ0FBQTtBQUU3Qzs7Ozs7MENBSzBDO0FBQzFDLE1BQU0sVUFBVSxRQUFRLENBQUMsSUFBcUI7SUFDNUMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBQ3pELElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQTtJQUNsQixPQUFPO1FBQ0wsSUFBSSxFQUFFLFVBQVU7UUFDaEIsT0FBTyxFQUFFLEtBQUs7UUFDZCxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHO1lBQ2pCLFNB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QUFTLFVBQVUsQ0FDakIsTUFBcUIsRUFDckIsVUFBa0IsRUFDbEIsSUFBaUM7SUFFakMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBQ3JDLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQTtBQUM5RCxDQUFDO0FBRUQ7OztxQ0FHcUM7QUFDckMsS0FBSyxVQUFVLG1CQUFtQixDQUNoQyxJQUFhLEVBQ2IsR0FBYztJQUVkLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxJQUFJLENBQUE7SUFDdEIsSUFBSSxPQUFPLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUMvQixNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7UUFDMUQsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO0lBQ3pDLENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7QUFDckMsQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFDLENBQVU7SUFDMUIsT0FBTyxDQUFDLEtBQUssSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQTtBQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3BTeW5jLCBleGlzdHNTeW5jLCBybVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgeyBqb2luLCBzZXAgfSBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IHdhdGNoIGFzIGNob2tpZGFyV2F0Y2ggfSBmcm9tIFwiY2hva2lkYXJcIlxuaW1wb3J0IHR5cGUgeyBDb25maWdFbnYsIFBsdWdpbiwgVXNlckNvbmZpZyBhcyBWaXRlVXNlckNvbmZpZywgVml0ZURldlNlcnZlciB9IGZyb20gXCJ2aXRlXCJcbmltcG9ydCB7IG1lcmdlQ29uZmlnIH0gZnJvbSBcInZpdGVcIlxuaW1wb3J0IHsgYnVpbGRUYXJnZXQgfSBmcm9tIFwiLi4vYWN0aW9ucy90YXJnZXQvYnVpbGQudHNcIlxuaW1wb3J0IHR5cGUgeyBDb25maWcgfSBmcm9tIFwiLi4vbW9kZWxzL2NvbmZpZy50c1wiXG5pbXBvcnQgeyBXZWJzaXRlQ29uZmlnIH0gZnJvbSBcIi4uL21vZGVscy9jb25maWcudHNcIlxuaW1wb3J0IHsgRVNDQVBBQkxFX0ZJTEVTLCBFU0NBUEFCTEVfRk9MREVSUyB9IGZyb20gXCIuLi9zZXR0aW5ncy50c1wiXG5cbmV4cG9ydCBpbnRlcmZhY2UgTGl2ZW1hcmtPcHRpb25zIHtcbiAgY29uZmlnOiBDb25maWdcbn1cblxuY29uc3QgU09VUkNFX0RJUiA9IGpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLlwiKVxuXG4vKiogU2luZ2xlIHZpcnR1YWwgbW9kdWxlIGV4cG9zaW5nIGxpdmVtYXJrJ3MgcnVudGltZSB2YWx1ZXMgdG8gY29uc3VtZXJcbiAqICBvdmVycmlkZSBmaWxlcyB2aWEgbmFtZWQgZXhwb3J0czpcbiAqXG4gKiAgICAgIGltcG9ydCB7IGNvbmZpZyB9IGZyb20gXCJsaXZlbWFyazp2aXJ0dWFsXCJcbiAqXG4gKiAgQ3VycmVudGx5IGV4cG9ydHMgYGNvbmZpZ2AgKHZhbGlkYXRlZCBgV2Vic2l0ZUNvbmZpZ2ApOyBmdXR1cmVcbiAqICBhZGRpdGlvbnMgKGUuZy4gYGFydGljbGVzYCwgYHNlY3Rpb25zYCkgbGFuZCBoZXJlIGFzIG5ldyBuYW1lZFxuICogIGV4cG9ydHMgd2l0aG91dCBjb25zdW1lcnMgY2hhbmdpbmcgdGhlaXIgaW1wb3J0IHN0YXRlbWVudHMuXG4gKlxuICogIFRoZSBgXFwwYCBwcmVmaXggb24gdGhlIHJlc29sdmVkIGlkIGlzIFZpdGUncyBjb252ZW50aW9uIHRvIHNpZ25hbFxuICogIFwidGhpcyBpcyBhIHZpcnR1YWwgbW9kdWxlIOKAlCBubyBvdGhlciBwbHVnaW4gc2hvdWxkIHRyeSB0byByZXNvbHZlXG4gKiAgb3IgbG9hZCBpdCBmcm9tIGRpc2tcIi4gKi9cbmNvbnN0IFZJUlRVQUxfSUQgPSBcImxpdmVtYXJrOnZpcnR1YWxcIlxuY29uc3QgVklSVFVBTF9SRVNPTFZFRF9JRCA9IGBcXDAke1ZJUlRVQUxfSUR9YFxuXG4vKiogT3ducyB0aGUgcGVyLWNvbnN1bWVyIGB0YXJnZXRzLzxoYXNoPi9gIG1vdW50OiBzeW50aGVzaXplcyBpdCB2aWFcbiAqICBgYnVpbGRUYXJnZXQoKWAsIHJldHVybnMgdGhlIFZpdGUgY29uZmlnIHRoYXQgYW5jaG9ycyB0aGVyZSwgYW5kXG4gKiAgd2F0Y2hlcyB0aGUgY29uc3VtZXIncyBgLmxpdmVtYXJrL2AgKHBsdXMgbGl2ZW1hcmsncyBgc291cmNlL2AgaW5cbiAqICBkZXYpIGZvciBjaGFuZ2VzIHRoYXQgbmVlZCB0byBiZSByZS1jb3BpZWQgaW50byB0aGUgdGFyZ2V0LiBUaGVcbiAqICBvdmVycmlkZSBtZWNoYW5pc20gaXMgcHVyZSBmaWxlLXN5c3RlbSAoZnVsbCBjb3BpZXMpIOKAlCBubyByZXNvbHZlSWRcbiAqICByZWRpcmVjdGlvbiwgbm8gcmVhbHBhdGggc3VycHJpc2VzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpdmVtYXJrKG9wdHM6IExpdmVtYXJrT3B0aW9ucyk6IFBsdWdpbiB7XG4gIGNvbnN0IG92ZXJyaWRlc1Jvb3QgPSBqb2luKG9wdHMuY29uZmlnLnJvb3QsIFwiLmxpdmVtYXJrXCIpXG4gIGxldCB0YXJnZXREaXIgPSBcIlwiXG4gIHJldHVybiB7XG4gICAgbmFtZTogXCJsaXZlbWFya1wiLFxuICAgIGVuZm9yY2U6IFwicHJlXCIsXG4gICAgYXN5bmMgY29uZmlnKF8sIGVudikge1xuICAgICAgdGFyZ2V0RGlyID0gYnVpbGRUYXJnZXQob3B0cy5jb25maWcuY29uZmlnUGF0aClcbiAgICAgIGNvbnN0IGJhc2U6IFZpdGVVc2VyQ29uZmlnID0ge1xuICAgICAgICByb290OiB0YXJnZXREaXIsXG4gICAgICAgIC8vIE1vdW50IGV2ZXJ5dGhpbmcgKGFzc2V0IFVSTHMsIG1vZHVsZXByZWxvYWRzLCBkZXYgc2VydmVyKSB1bmRlclxuICAgICAgICAvLyBgY29uZmlnLmJhc2VgIHNvIHRoZSBzYW1lIGJ1aWxkIHdvcmtzIGF0IHJvb3Qgb3IgYXQgYSBzdWItcGF0aFxuICAgICAgICAvLyAoZS5nLiBHaXRIdWIgUGFnZXMgYGh0dHBzOi8vdXNlci5naXRodWIuaW8vcmVwby9gKS4gVGhlIHJvdXRlclxuICAgICAgICAvLyBhbmQgYXNzZXQtcGF0aCByZXNvbHZlciBtaXJyb3IgdGhpcyBhdCBydW50aW1lLlxuICAgICAgICBiYXNlOiBvcHRzLmNvbmZpZy5iYXNlID8gYCR7b3B0cy5jb25maWcuYmFzZX0vYCA6IFwiL1wiLFxuICAgICAgICAvLyBvdXREaXIgbGl2ZXMgb3V0c2lkZSB0aGUgdGFyZ2V0IHJvb3QgKGluIHRoZSBjb25zdW1lcidzXG4gICAgICAgIC8vIC5saXZlbWFyay8pIHNvIHRoZSBjb25zdW1lciBjYW4gZmluZCB0aGVpciBkZXBsb3lhYmxlIG91dHB1dFxuICAgICAgICAvLyB3aXRob3V0IGRpZ2dpbmcgaW50byBub2RlX21vZHVsZXMuIFZpdGUncyBkZWZhdWx0IHJlZnVzYWwgdG9cbiAgICAgICAgLy8gZW1wdHkgb3V0LW9mLXJvb3QgZGlyZWN0b3JpZXMgZG9lc24ndCBhcHBseSBoZXJlIGJlY2F1c2UgdGhlXG4gICAgICAgIC8vIHRhcmdldC8gcm9vdCBpcyBsaXZlbWFyaydzLCBub3QgdGhlIGNvbnN1bWVyJ3MuXG4gICAgICAgIGJ1aWxkOiB7IG91dERpcjogam9pbihvdmVycmlkZXNSb290LCBcImJ1aWxkXCIpLCBlbXB0eU91dERpcjogdHJ1ZSB9LFxuICAgICAgICByZXNvbHZlOiB7IGRlZHVwZTogW1wicmVhY3RcIiwgXCJyZWFjdC1kb21cIl0gfSxcbiAgICAgICAgLy8gRm9yIHRoZSBTU1IgYnVpbGQgb25seSwgaW5saW5lIGV2ZXJ5IG5vZGVfbW9kdWxlcyBkZXAgaW50b1xuICAgICAgICAvLyBzZXJ2ZXIuanMuIFRoZSBwcmVyZW5kZXIgc3RlcCAod2hpY2ggcnVucyBzZXJ2ZXIuanMgd2l0aFxuICAgICAgICAvLyBOb2RlKSB3YWxrcyBub2RlX21vZHVsZXMgZnJvbSB0aGUgYnVpbGQvIGRpciBhbmQgY2FuJ3QgcmVhY2hcbiAgICAgICAgLy8gcGFja2FnZXMgYnVyaWVkIGluIHBucG0ncyBgLnBucG0vKi9ub2RlX21vZHVsZXMvYCAoZS5nLlxuICAgICAgICAvLyBUYW5TdGFjay1pbnRlcm5hbCBhbGlhc2VzIGxpa2UgYGgzLXYyYCkuIFNlbGYtY29udGFpbmVkXG4gICAgICAgIC8vIGJ1bmRsZSBieXBhc3NlcyB0aGUgaXNzdWUuIERldiBTU1Iga2VlcHMgZXh0ZXJuYWxzIChmYXN0ZXIpLlxuICAgICAgICAuLi4oZW52LmNvbW1hbmQgPT09IFwiYnVpbGRcIiAmJiB7XG4gICAgICAgICAgZW52aXJvbm1lbnRzOiB7IHNzcjogeyByZXNvbHZlOiB7IG5vRXh0ZXJuYWw6IHRydWUgfSB9IH0sXG4gICAgICAgIH0pLFxuICAgICAgfVxuICAgICAgY29uc3Qgb3ZlcnJpZGUgPSBhd2FpdCByZXNvbHZlVml0ZU92ZXJyaWRlKG9wdHMuY29uZmlnLnZpdGUsIGVudilcbiAgICAgIHJldHVybiBvdmVycmlkZSA/IG1lcmdlQ29uZmlnKGJhc2UsIG92ZXJyaWRlKSA6IGJhc2VcbiAgICB9LFxuICAgIHJlc29sdmVJZChpZCkge1xuICAgICAgaWYgKGlkID09PSBWSVJUVUFMX0lEKSByZXR1cm4gVklSVFVBTF9SRVNPTFZFRF9JRFxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9LFxuICAgIGxvYWQoaWQpIHtcbiAgICAgIGlmIChpZCAhPT0gVklSVFVBTF9SRVNPTFZFRF9JRCkgcmV0dXJuIG51bGxcbiAgICAgIGNvbnN0IGNvbmZpZyA9IFdlYnNpdGVDb25maWcucGFyc2Uob3B0cy5jb25maWcpXG4gICAgICByZXR1cm4gYGV4cG9ydCBjb25zdCBjb25maWcgPSAke0pTT04uc3RyaW5naWZ5KGNvbmZpZyl9YFxuICAgIH0sXG4gICAgY29uZmlndXJlU2VydmVyKHNlcnZlcikge1xuICAgICAgLy8gVHdvIHJlYXNvbnMgd2UgZG9uJ3QgdXNlIFZpdGUncyBvd24gYHNlcnZlci53YXRjaGVyYDpcbiAgICAgIC8vICAgMS4gVml0ZSA4IGJ1bmRsZXMgY2hva2lkYXIgMyB3aXRoIGBkaXNhYmxlR2xvYmJpbmc6IHRydWVgLCBhbmRcbiAgICAgIC8vICAgICAgcGF0aHMgYWRkZWQgdmlhIGBzZXJ2ZXIud2F0Y2hlci5hZGQoKWAgZm9yIHN1cmZhY2VzIG91dHNpZGVcbiAgICAgIC8vICAgICAgVml0ZSdzIHJvb3QgbmV2ZXIgZmlyZSDigJQgZ2V0V2F0Y2hlZCgpIHJlcG9ydHMgdGhlbSBidXQgbm9cbiAgICAgIC8vICAgICAgZXZlbnRzIGFycml2ZSBmb3IgZXh0ZXJuYWwgZWRpdG9ycy5cbiAgICAgIC8vICAgMi4gVml0ZSdzIGNob2tpZGFyIGlnbm9yZXMgYCoqXFwvbm9kZV9tb2R1bGVzLyoqYCBieSBkZWZhdWx0LCBzb1xuICAgICAgLy8gICAgICBldmVuIGlmICgxKSB3ZXJlIGZpeGVkLCBvdXIgdGFyZ2V0RGlyICh3aGljaCBsaXZlcyBpbnNpZGVcbiAgICAgIC8vICAgICAgbGl2ZW1hcmsncyBvd24gbm9kZV9tb2R1bGVzIGluIGNvbnN1bWVyIHByb2plY3RzKSB3b3VsZCBiZVxuICAgICAgLy8gICAgICBzaWxlbnRseSBmaWx0ZXJlZC4gV2UgZW1pdCB0aGUgY2hhbmdlIGV2ZW50IG1hbnVhbGx5IG9udG9cbiAgICAgIC8vICAgICAgYHNlcnZlci53YXRjaGVyYCBhZnRlciBjcFN5bmMg4oCUIHNlZSB7QGxpbmsgbm90aWZ5Vml0ZX0uXG4gICAgICAvLyBBIGRlZGljYXRlZCBjaG9raWRhciA1IHdhdGNoZXIgc2V0IHVwIGRpcmVjdGx5IG9uIHRoZXNlIHBhdGhzXG4gICAgICAvLyBmaXJlcyByZWxpYWJseTsgd2UgZm9yd2FyZCBldmVudHMgaW50byBWaXRlJ3MgSE1SIHBpcGVsaW5lIGJlbG93LlxuICAgICAgY29uc3Qgb3ZlcmxheVBhdGhzOiBzdHJpbmdbXSA9IFtdXG4gICAgICBmb3IgKGNvbnN0IGZvbGRlciBvZiBFU0NBUEFCTEVfRk9MREVSUykge1xuICAgICAgICBvdmVybGF5UGF0aHMucHVzaChqb2luKG92ZXJyaWRlc1Jvb3QsIGZvbGRlcikpXG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgRVNDQVBBQkxFX0ZJTEVTKSB7XG4gICAgICAgIG92ZXJsYXlQYXRocy5wdXNoKGpvaW4ob3ZlcnJpZGVzUm9vdCwgZmlsZSkpXG4gICAgICB9XG4gICAgICBjb25zdCB3YXRjaGVyID0gY2hva2lkYXJXYXRjaChcbiAgICAgICAgW29wdHMuY29uZmlnLmNvbmZpZ1BhdGgsIC4uLm92ZXJsYXlQYXRocywgU09VUkNFX0RJUl0sXG4gICAgICAgIHsgaWdub3JlSW5pdGlhbDogdHJ1ZSwgaWdub3JlUGVybWlzc2lvbkVycm9yczogdHJ1ZSB9LFxuICAgICAgKVxuICAgICAgd2F0Y2hlci5vbihcImNoYW5nZVwiLCBmaWxlID0+IG9uQ2hhbmdlKGZpbGUsIFwiY2hhbmdlXCIpKVxuICAgICAgd2F0Y2hlci5vbihcImFkZFwiLCBmaWxlID0+IG9uQ2hhbmdlKGZpbGUsIFwiYWRkXCIpKVxuICAgICAgd2F0Y2hlci5vbihcInVubGlua1wiLCBmaWxlID0+IG9uQ2hhbmdlKGZpbGUsIFwidW5saW5rXCIpKVxuICAgICAgY29uc3QgY2xvc2VXYXRjaGVyID0gKCkgPT4ge1xuICAgICAgICB3YXRjaGVyLmNsb3NlKClcbiAgICAgIH1cbiAgICAgIHNlcnZlci5odHRwU2VydmVyPy5vbmNlKFwiY2xvc2VcIiwgY2xvc2VXYXRjaGVyKVxuXG4gICAgICBmdW5jdGlvbiBvbkNoYW5nZShmaWxlOiBzdHJpbmcsIGtpbmQ6IFwiY2hhbmdlXCIgfCBcImFkZFwiIHwgXCJ1bmxpbmtcIikge1xuICAgICAgICBpZiAoZmlsZSA9PT0gb3B0cy5jb25maWcuY29uZmlnUGF0aCkge1xuICAgICAgICAgIHNlcnZlci5yZXN0YXJ0KClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvdmVybGF5SGl0ID0gbWF0Y2hPdmVybGF5KGZpbGUsIG92ZXJyaWRlc1Jvb3QpXG4gICAgICAgIGlmIChvdmVybGF5SGl0KSB7XG4gICAgICAgICAgc3luY092ZXJsYXkob3ZlcmxheUhpdCwga2luZCwgdGFyZ2V0RGlyLCBvdmVycmlkZXNSb290KVxuICAgICAgICAgIG5vdGlmeVZpdGUoc2VydmVyLCBqb2luKHRhcmdldERpciwgb3ZlcmxheUhpdC5yZWwpLCBraW5kKVxuICAgICAgICAgIGlmIChraW5kICE9PSBcImNoYW5nZVwiKSBmdWxsUmVsb2FkKHNlcnZlcilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3VyY2VIaXQgPSBtYXRjaFNvdXJjZShmaWxlKVxuICAgICAgICBpZiAoc291cmNlSGl0KSB7XG4gICAgICAgICAgc3luY1NvdXJjZShzb3VyY2VIaXQsIGtpbmQsIHRhcmdldERpciwgb3ZlcnJpZGVzUm9vdClcbiAgICAgICAgICBub3RpZnlWaXRlKHNlcnZlciwgam9pbih0YXJnZXREaXIsIHNvdXJjZUhpdC5yZWwpLCBraW5kKVxuICAgICAgICAgIGlmIChraW5kICE9PSBcImNoYW5nZVwiKSBmdWxsUmVsb2FkKHNlcnZlcilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gIH1cbn1cblxuaW50ZXJmYWNlIEhpdCB7XG4gIHJlbDogc3RyaW5nXG4gIGNhdGVnb3J5OiBcImZvbGRlclwiIHwgXCJmaWxlXCIgfCBudWxsXG59XG5cbmZ1bmN0aW9uIG1hdGNoT3ZlcmxheShmaWxlOiBzdHJpbmcsIG92ZXJyaWRlc1Jvb3Q6IHN0cmluZyk6IEhpdCB8IG51bGwge1xuICBjb25zdCBwcmVmaXggPSBgJHtvdmVycmlkZXNSb290fSR7c2VwfWBcbiAgaWYgKCFmaWxlLnN0YXJ0c1dpdGgocHJlZml4KSkgcmV0dXJuIG51bGxcbiAgY29uc3QgcmVsID0gZmlsZS5zbGljZShwcmVmaXgubGVuZ3RoKVxuICByZXR1cm4geyByZWwsIGNhdGVnb3J5OiBjbGFzc2lmeShyZWwpIH1cbn1cblxuZnVuY3Rpb24gbWF0Y2hTb3VyY2UoZmlsZTogc3RyaW5nKTogSGl0IHwgbnVsbCB7XG4gIGNvbnN0IHByZWZpeCA9IGAke1NPVVJDRV9ESVJ9JHtzZXB9YFxuICBpZiAoIWZpbGUuc3RhcnRzV2l0aChwcmVmaXgpKSByZXR1cm4gbnVsbFxuICAvLyBTa2lwIHRoZSB0YXJnZXRzLyBvdXRwdXQgZGlyIGl0c2VsZiAoc2libGluZyBvZiBzb3VyY2UvKSBhbmQgYW55XG4gIC8vIGAuZ2VuLnRzYCBmaWxlcyB0aGF0IGRvd25zdHJlYW0gdG9vbHMgcmVnZW5lcmF0ZSBpbnNpZGUgdGhlIHRhcmdldC5cbiAgY29uc3QgcmVsID0gZmlsZS5zbGljZShwcmVmaXgubGVuZ3RoKVxuICBpZiAocmVsID09PSBcIlwiIHx8IHJlbC5pbmNsdWRlcyhcInJvdXRlVHJlZS5nZW4udHNcIikpIHJldHVybiBudWxsXG4gIHJldHVybiB7IHJlbCwgY2F0ZWdvcnk6IGNsYXNzaWZ5KHJlbCkgfVxufVxuXG5mdW5jdGlvbiBjbGFzc2lmeShyZWw6IHN0cmluZyk6IFwiZm9sZGVyXCIgfCBcImZpbGVcIiB8IG51bGwge1xuICBjb25zdCBbaGVhZF0gPSByZWwuc3BsaXQoc2VwKVxuICBpZiAoaGVhZCAmJiBFU0NBUEFCTEVfRk9MREVSUy5pbmNsdWRlcyhoZWFkKSkgcmV0dXJuIFwiZm9sZGVyXCJcbiAgaWYgKEVTQ0FQQUJMRV9GSUxFUy5pbmNsdWRlcyhyZWwpKSByZXR1cm4gXCJmaWxlXCJcbiAgLy8gTm9uLWVzY2FwYWJsZSBzb3VyY2UgZmlsZXMgc3RpbGwgbmVlZCB0byBmbG93IGludG8gdGFyZ2V0IGR1cmluZ1xuICAvLyBsaXZlbWFyaydzIG93biBkZXYg4oCUIHRoZSB1c2VyIGlzIGVkaXRpbmcgdGhlIGNhbm9uaWNhbCBzb3VyY2UuXG4gIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIHN5bmNPdmVybGF5KFxuICBoaXQ6IEhpdCxcbiAga2luZDogXCJjaGFuZ2VcIiB8IFwiYWRkXCIgfCBcInVubGlua1wiLFxuICB0YXJnZXREaXI6IHN0cmluZyxcbiAgb3ZlcnJpZGVzUm9vdDogc3RyaW5nLFxuKSB7XG4gIGlmICghaGl0LmNhdGVnb3J5KSByZXR1cm5cbiAgY29uc3QgZGVzdCA9IGpvaW4odGFyZ2V0RGlyLCBoaXQucmVsKVxuICBjb25zdCBzb3VyY2UgPSBqb2luKFNPVVJDRV9ESVIsIGhpdC5yZWwpXG4gIGlmIChraW5kID09PSBcInVubGlua1wiKSB7XG4gICAgcm1TeW5jKGRlc3QsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgIGlmIChleGlzdHNTeW5jKHNvdXJjZSkpIGNwU3luYyhzb3VyY2UsIGRlc3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KVxuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IG92ZXJsYXkgPSBqb2luKG92ZXJyaWRlc1Jvb3QsIGhpdC5yZWwpXG4gIGlmIChleGlzdHNTeW5jKG92ZXJsYXkpKSBjcFN5bmMob3ZlcmxheSwgZGVzdCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG59XG5cbmZ1bmN0aW9uIHN5bmNTb3VyY2UoXG4gIGhpdDogSGl0LFxuICBraW5kOiBcImNoYW5nZVwiIHwgXCJhZGRcIiB8IFwidW5saW5rXCIsXG4gIHRhcmdldERpcjogc3RyaW5nLFxuICBvdmVycmlkZXNSb290OiBzdHJpbmcsXG4pIHtcbiAgLy8gSWYgdGhlIGNvbnN1bWVyIGhhcyBhbiBvdmVybGF5IGZvciB0aGlzIGZpbGUgKGFuZCBpdCdzIGVzY2FwYWJsZSksXG4gIC8vIHRoZSBvdmVybGF5IHdpbnMg4oCUIGlnbm9yZSBzb3VyY2UgY2hhbmdlcy5cbiAgaWYgKGhpdC5jYXRlZ29yeSAmJiBleGlzdHNTeW5jKGpvaW4ob3ZlcnJpZGVzUm9vdCwgaGl0LnJlbCkpKSByZXR1cm5cbiAgY29uc3QgZGVzdCA9IGpvaW4odGFyZ2V0RGlyLCBoaXQucmVsKVxuICBjb25zdCBzb3VyY2UgPSBqb2luKFNPVVJDRV9ESVIsIGhpdC5yZWwpXG4gIGlmIChraW5kID09PSBcInVubGlua1wiKSB7XG4gICAgcm1TeW5jKGRlc3QsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgIHJldHVyblxuICB9XG4gIGlmIChleGlzdHNTeW5jKHNvdXJjZSkpIGNwU3luYyhzb3VyY2UsIGRlc3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KVxufVxuXG5mdW5jdGlvbiBmdWxsUmVsb2FkKHNlcnZlcjogVml0ZURldlNlcnZlcikge1xuICBzZXJ2ZXIud3Muc2VuZCh7IHR5cGU6IFwiZnVsbC1yZWxvYWRcIiB9KVxufVxuXG4vKiogRHJpdmUgVml0ZSdzIEhNUiBwaXBlbGluZSBtYW51YWxseSBmb3IgYSB0YXJnZXQgZmlsZSB3ZSBqdXN0IHN5bmNlZC5cbiAqICBWaXRlJ3MgY2hva2lkYXIgaWdub3JlcyBgKipcXC9ub2RlX21vZHVsZXMvKipgIGJ5IGRlZmF1bHQgYW5kIG91clxuICogIHRhcmdldERpciBsaXZlcyBpbnNpZGUgbGl2ZW1hcmsncyBvd24gbm9kZV9tb2R1bGVzIGluIGNvbnN1bWVyXG4gKiAgcHJvamVjdHMsIHNvIGNwU3luYyB3cml0ZXMgdGhlcmUgYXJlIHNpbGVudGx5IGZpbHRlcmVkIG91dC5cbiAqXG4gKiAgRW1pdHRpbmcgb24gYHNlcnZlci53YXRjaGVyYCBydW5zIFZpdGUncyBITVIgYW5hbHlzaXMgcGVyIGVudmlyb25tZW50XG4gKiAgKENTUyBnZXRzIGBobXIgdXBkYXRlYCwgcm91dGUgbW9kdWxlcyB0cmlnZ2VyIGAoc3NyKSBwYWdlIHJlbG9hZGApLlxuICogIEJ1dCBgKHNzcikgcGFnZSByZWxvYWRgIG9ubHkgc2VuZHMgYGZ1bGwtcmVsb2FkYCBvbiB0aGUgU1NSXG4gKiAgZW52aXJvbm1lbnQncyBob3QgY2hhbm5lbCDigJQgdGhlIGJyb3dzZXIgaXMgY29ubmVjdGVkIHRvIHRoZSAqY2xpZW50KlxuICogIGNoYW5uZWwgYW5kIG5ldmVyIHNlZXMgaXQuIFNvIHdlIGFsc28gZmlyZSBgZnVsbC1yZWxvYWRgIG9uIHRoZVxuICogIGNsaWVudCBob3QgZGlyZWN0bHksIHdoaWNoIGlzIHdoYXQgVGFuU3RhY2sgU3RhcnQgbmVlZHMgZm9yIHJvdXRlXG4gKiAgZWRpdHMgdG8gYWN0dWFsbHkgcmVmcmVzaCB0aGUgcGFnZS4gQ1NTIEhNUiBzdGlsbCB3b3JrcyBiZWNhdXNlXG4gKiAgVml0ZSdzIGFuYWx5c2lzIHJ1bnMgZmlyc3QgYW5kIHVwZGF0ZXMgYWxyZWFkeS1mbHVzaGVkIGJlZm9yZSBvdXJcbiAqICByZWxvYWQuICovXG5mdW5jdGlvbiBub3RpZnlWaXRlKFxuICBzZXJ2ZXI6IFZpdGVEZXZTZXJ2ZXIsXG4gIHRhcmdldEZpbGU6IHN0cmluZyxcbiAga2luZDogXCJjaGFuZ2VcIiB8IFwiYWRkXCIgfCBcInVubGlua1wiLFxuKSB7XG4gIHNlcnZlci53YXRjaGVyLmVtaXQoa2luZCwgdGFyZ2V0RmlsZSlcbiAgc2VydmVyLmVudmlyb25tZW50cy5jbGllbnQuaG90LnNlbmQoeyB0eXBlOiBcImZ1bGwtcmVsb2FkXCIgfSlcbn1cblxuLyoqIFJlc29sdmUgbGl2ZW1hcmsuY29uZmlnLnRzJ3MgYHZpdGVgIGZpZWxkIOKAlCBlaXRoZXIgYSBjb25maWcgb2JqZWN0XG4gKiAgb3IgYSBmdW5jdGlvbiBgKGVudikgPT4gY29uZmlnYCAobWF0Y2hpbmcgVml0ZSdzIG93biBgZGVmaW5lQ29uZmlnYCkuXG4gKiAgU2NoZW1hIHN0b3JlcyBpdCBhcyBgdW5rbm93bmA7IHR5cGluZyBmb3IgdGhlIGNvbnN1bWVyJ3MgZWRpdG9yXG4gKiAgbGl2ZXMgb24ge0BsaW5rIFZpdGVPdmVycmlkZX0uICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlVml0ZU92ZXJyaWRlKFxuICB2aXRlOiB1bmtub3duLFxuICBlbnY6IENvbmZpZ0Vudixcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsPiB7XG4gIGlmICghdml0ZSkgcmV0dXJuIG51bGxcbiAgaWYgKHR5cGVvZiB2aXRlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBSZWZsZWN0LmFwcGx5KHZpdGUsIHVuZGVmaW5lZCwgW2Vudl0pXG4gICAgcmV0dXJuIGlzT2JqZWN0KHJlc3VsdCkgPyByZXN1bHQgOiBudWxsXG4gIH1cbiAgcmV0dXJuIGlzT2JqZWN0KHZpdGUpID8gdml0ZSA6IG51bGxcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QodjogdW5rbm93bik6IHYgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdiAhPT0gbnVsbCAmJiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIlxufVxuIl19
187
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS1saXZlbWFyay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9wbHVnaW5zL3ZpdGUtbGl2ZW1hcmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUM5RCxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUVyQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQ2xDLE9BQU8sV0FBVyxNQUFNLG9CQUFvQixDQUFDLE9BQU8sSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFBO0FBQ2xFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUN4RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQTtBQUMzRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQTtBQUVqRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBTW5FLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUE7QUFDbEQsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEdBQUcsZUFBZSxHQUFHLEVBQUUsQ0FBQyxDQUFBO0FBRXBFOzs7Ozs7Ozs7Ozs7NkJBWTZCO0FBQzdCLE1BQU0sVUFBVSxHQUFHLGtCQUFrQixDQUFBO0FBQ3JDLE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxVQUFVLEVBQUUsQ0FBQTtBQUU3Qzs7OzttRUFJbUU7QUFDbkUsTUFBTSxVQUFVLFFBQVEsQ0FBQyxJQUFxQjtJQUM1QyxNQUFNLGFBQWEsR0FB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QTtRQUMxRCxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7SUFDekMsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtBQUNyQyxDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsQ0FBVTtJQUMxQixPQUFPLENBQUMsS0FBSyxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFBO0FBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcFN5bmMsIGV4aXN0c1N5bmMsIHJtU3luYywgc3RhdFN5bmMgfSBmcm9tIFwibm9kZTpmc1wiXG5pbXBvcnQgeyBqb2luLCBzZXAgfSBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB0eXBlIHsgQ29uZmlnRW52LCBQbHVnaW4sIFVzZXJDb25maWcgYXMgVml0ZVVzZXJDb25maWcgfSBmcm9tIFwidml0ZVwiXG5pbXBvcnQgeyBtZXJnZUNvbmZpZyB9IGZyb20gXCJ2aXRlXCJcbmltcG9ydCBwYWNrYWdlSnNvbiBmcm9tIFwiLi4vLi4vcGFja2FnZS5qc29uXCIgd2l0aCB7IHR5cGU6IFwianNvblwiIH1cbmltcG9ydCB7IGJ1aWxkVGFyZ2V0IH0gZnJvbSBcIi4uL2FjdGlvbnMvdGFyZ2V0L2J1aWxkLnRzXCJcbmltcG9ydCB7IHJlbmRlcklubGluZU1hcmtkb3duIH0gZnJvbSBcIi4uL2hlbHBlcnMvcmVuZGVyLWlubGluZS1tYXJrZG93bi50c1wiXG5pbXBvcnQgeyByZXNvbHZlVGFyZ2V0RXhwb3J0IH0gZnJvbSBcIi4uL2hlbHBlcnMvdGFyZ2V0LWV4cG9ydC50c1wiXG5pbXBvcnQgdHlwZSB7IENvbmZpZyB9IGZyb20gXCIuLi9tb2RlbHMvY29uZmlnLnRzXCJcbmltcG9ydCB7IFdlYnNpdGVDb25maWcgfSBmcm9tIFwiLi4vbW9kZWxzL2NvbmZpZy50c1wiXG5pbXBvcnQgeyBFU0NBUEFCTEVfRklMRVMsIEVTQ0FQQUJMRV9GT0xERVJTIH0gZnJvbSBcIi4uL3NldHRpbmdzLnRzXCJcblxuZXhwb3J0IGludGVyZmFjZSBMaXZlbWFya09wdGlvbnMge1xuICBjb25maWc6IENvbmZpZ1xufVxuXG5jb25zdCBTT1VSQ0VfRElSID0gam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi4uXCIpXG5jb25zdCBJU19JTlNUQUxMRUQgPSBTT1VSQ0VfRElSLmluY2x1ZGVzKGAke3NlcH1ub2RlX21vZHVsZXMke3NlcH1gKVxuXG4vKiogU2luZ2xlIHZpcnR1YWwgbW9kdWxlIGV4cG9zaW5nIGxpdmVtYXJrJ3MgcnVudGltZSB2YWx1ZXMgdG8gY29uc3VtZXJcbiAqICBvdmVycmlkZSBmaWxlcyB2aWEgbmFtZWQgZXhwb3J0czpcbiAqXG4gKiAgICAgIGltcG9ydCB7IGNvbmZpZyB9IGZyb20gXCJsaXZlbWFyazp2aXJ0dWFsXCJcbiAqXG4gKiAgQ3VycmVudGx5IGV4cG9ydHMgYGNvbmZpZ2AgKHZhbGlkYXRlZCBgV2Vic2l0ZUNvbmZpZ2ApIGFuZCBgYmFubmVySHRtbGBcbiAqICAoYGNvbmZpZy5iYW5uZXJgIHJlbmRlcmVkIGZyb20gaW5saW5lIE1hcmtkb3duIGF0IGJ1aWxkIHRpbWUpOyBmdXR1cmVcbiAqICBhZGRpdGlvbnMgKGUuZy4gYGFydGljbGVzYCwgYHNlY3Rpb25zYCkgbGFuZCBoZXJlIGFzIG5ldyBuYW1lZFxuICogIGV4cG9ydHMgd2l0aG91dCBjb25zdW1lcnMgY2hhbmdpbmcgdGhlaXIgaW1wb3J0IHN0YXRlbWVudHMuXG4gKlxuICogIFRoZSBgXFwwYCBwcmVmaXggb24gdGhlIHJlc29sdmVkIGlkIGlzIFZpdGUncyBjb252ZW50aW9uIHRvIHNpZ25hbFxuICogIFwidGhpcyBpcyBhIHZpcnR1YWwgbW9kdWxlIOKAlCBubyBvdGhlciBwbHVnaW4gc2hvdWxkIHRyeSB0byByZXNvbHZlXG4gKiAgb3IgbG9hZCBpdCBmcm9tIGRpc2tcIi4gKi9cbmNvbnN0IFZJUlRVQUxfSUQgPSBcImxpdmVtYXJrOnZpcnR1YWxcIlxuY29uc3QgVklSVFVBTF9SRVNPTFZFRF9JRCA9IGBcXDAke1ZJUlRVQUxfSUR9YFxuXG4vKiogT3ducyB0aGUgcHJvamVjdCdzIGAubGl2ZW1hcmsvLnRhcmdldC9gIG1vdW50OiBzeW50aGVzaXplcyBpdCB2aWFcbiAqICBgYnVpbGRUYXJnZXQoKWAsIHJldHVybnMgdGhlIFZpdGUgY29uZmlnIHRoYXQgYW5jaG9ycyB0aGVyZSwgYW5kXG4gKiAgY29waWVzIGAubGl2ZW1hcmsvYCBlZGl0cyAocGx1cyBsaXZlbWFyaydzIGBzb3VyY2UvYCBpbiBpdHMgb3duIGRldilcbiAqICBpbnRvIHRoZSB0YXJnZXQuIFZpdGUgd2F0Y2hlcyB0aGUgdGFyZ2V0IG5hdGl2ZWx5LCBzbyBpdHMgb3duIEhNUlxuICogIGRlY2lkZXMgYmV0d2VlbiBGYXN0IFJlZnJlc2gsIENTUyB1cGRhdGVzIGFuZCBhIHBhZ2UgcmVsb2FkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpdmVtYXJrKG9wdHM6IExpdmVtYXJrT3B0aW9ucyk6IFBsdWdpbiB7XG4gIGNvbnN0IG92ZXJyaWRlc1Jvb3QgPSBqb2luKG9wdHMuY29uZmlnLnJvb3QsIFwiLmxpdmVtYXJrXCIpXG4gIGNvbnN0IG91dERpciA9IGpvaW4ob3ZlcnJpZGVzUm9vdCwgXCJidWlsZFwiKVxuICBsZXQgdGFyZ2V0RGlyID0gXCJcIlxuICByZXR1cm4ge1xuICAgIG5hbWU6IFwibGl2ZW1hcmtcIixcbiAgICBlbmZvcmNlOiBcInByZVwiLFxuICAgIGFzeW5jIGNvbmZpZyhfLCBlbnYpIHtcbiAgICAgIHRhcmdldERpciA9IGJ1aWxkVGFyZ2V0KHtcbiAgICAgICAgY29uZmlnUGF0aDogb3B0cy5jb25maWcuY29uZmlnUGF0aCxcbiAgICAgICAgc291cmNlRGlyOiBTT1VSQ0VfRElSLFxuICAgICAgfSlcbiAgICAgIGNvbnN0IGJhc2U6IFZpdGVVc2VyQ29uZmlnID0ge1xuICAgICAgICByb290OiB0YXJnZXREaXIsXG4gICAgICAgIC8vIFRoZSBkZWZhdWx0IGA8cm9vdD4vbm9kZV9tb2R1bGVzLy52aXRlYCB3b3VsZCBsYW5kIGluc2lkZSB0aGVcbiAgICAgICAgLy8gZGVwZW5kZW5jeSBsaW5rLCBpLmUuIGluIGxpdmVtYXJrJ3Mgc2hhcmVkIGluc3RhbGwuXG4gICAgICAgIGNhY2hlRGlyOiBqb2luKHRhcmdldERpciwgXCIudml0ZVwiKSxcbiAgICAgICAgLy8gTW91bnQgZXZlcnl0aGluZyAoYXNzZXQgVVJMcywgbW9kdWxlcHJlbG9hZHMsIGRldiBzZXJ2ZXIpIHVuZGVyXG4gICAgICAgIC8vIGBjb25maWcuYmFzZWAgc28gdGhlIHNhbWUgYnVpbGQgd29ya3MgYXQgcm9vdCBvciBhdCBhIHN1Yi1wYXRoXG4gICAgICAgIC8vIChlLmcuIEdpdEh1YiBQYWdlcyBgaHR0cHM6Ly91c2VyLmdpdGh1Yi5pby9yZXBvL2ApLiBUaGUgcm91dGVyXG4gICAgICAgIC8vIGFuZCBhc3NldC1wYXRoIHJlc29sdmVyIG1pcnJvciB0aGlzIGF0IHJ1bnRpbWUuXG4gICAgICAgIGJhc2U6IG9wdHMuY29uZmlnLmJhc2UgPyBgJHtvcHRzLmNvbmZpZy5iYXNlfS9gIDogXCIvXCIsXG4gICAgICAgIC8vIG91dERpciBsaXZlcyBvdXRzaWRlIHRoZSB0YXJnZXQgcm9vdCwgc28gVml0ZSdzIHJlZnVzYWwgdG9cbiAgICAgICAgLy8gZW1wdHkgb3V0LW9mLXJvb3QgZGlyZWN0b3JpZXMgbmVlZHMgYGVtcHR5T3V0RGlyYC5cbiAgICAgICAgYnVpbGQ6IHsgb3V0RGlyLCBlbXB0eU91dERpcjogdHJ1ZSB9LFxuICAgICAgICByZXNvbHZlOiB7IGRlZHVwZTogW1wicmVhY3RcIiwgXCJyZWFjdC1kb21cIl0gfSxcbiAgICAgICAgLy8gRm9yIHRoZSBTU1IgYnVpbGQgb25seSwgaW5saW5lIGV2ZXJ5IG5vZGVfbW9kdWxlcyBkZXAgaW50b1xuICAgICAgICAvLyBzZXJ2ZXIuanMuIFRoZSBwcmVyZW5kZXIgc3RlcCAod2hpY2ggcnVucyBzZXJ2ZXIuanMgd2l0aFxuICAgICAgICAvLyBOb2RlKSB3YWxrcyBub2RlX21vZHVsZXMgZnJvbSB0aGUgYnVpbGQvIGRpciBhbmQgY2FuJ3QgcmVhY2hcbiAgICAgICAgLy8gcGFja2FnZXMgYnVyaWVkIGluIHBucG0ncyBgLnBucG0vKi9ub2RlX21vZHVsZXMvYCAoZS5nLlxuICAgICAgICAvLyBUYW5TdGFjay1pbnRlcm5hbCBhbGlhc2VzIGxpa2UgYGgzLXYyYCkuIFNlbGYtY29udGFpbmVkXG4gICAgICAgIC8vIGJ1bmRsZSBieXBhc3NlcyB0aGUgaXNzdWUuIERldiBTU1Iga2VlcHMgZXh0ZXJuYWxzIChmYXN0ZXIpLlxuICAgICAgICAuLi4oZW52LmNvbW1hbmQgPT09IFwiYnVpbGRcIiAmJiB7XG4gICAgICAgICAgZW52aXJvbm1lbnRzOiB7IHNzcjogeyByZXNvbHZlOiB7IG5vRXh0ZXJuYWw6IHRydWUgfSB9IH0sXG4gICAgICAgIH0pLFxuICAgICAgfVxuICAgICAgY29uc3Qgb3ZlcnJpZGUgPSBhd2FpdCByZXNvbHZlVml0ZU92ZXJyaWRlKG9wdHMuY29uZmlnLnZpdGUsIGVudilcbiAgICAgIHJldHVybiBvdmVycmlkZSA/IG1lcmdlQ29uZmlnKGJhc2UsIG92ZXJyaWRlKSA6IGJhc2VcbiAgICB9LFxuICAgIHJlc29sdmVJZChpZCkge1xuICAgICAgaWYgKGlkID09PSBWSVJUVUFMX0lEKSByZXR1cm4gVklSVFVBTF9SRVNPTFZFRF9JRFxuICAgICAgcmV0dXJuIHJlc29sdmVUYXJnZXRFeHBvcnQoeyBpZCwgdGFyZ2V0RGlyLCBleHBvcnRzOiBwYWNrYWdlSnNvbi5leHBvcnRzIH0pID8/IG51bGxcbiAgICB9LFxuICAgIGxvYWQoaWQpIHtcbiAgICAgIGlmIChpZCAhPT0gVklSVFVBTF9SRVNPTFZFRF9JRCkgcmV0dXJuIG51bGxcbiAgICAgIGNvbnN0IGNvbmZpZyA9IFdlYnNpdGVDb25maWcucGFyc2Uob3B0cy5jb25maWcpXG4gICAgICBjb25zdCBiYW5uZXJIdG1sID0gY29uZmlnLmJhbm5lclxuICAgICAgICA/IHJlbmRlcklubGluZU1hcmtkb3duKGNvbmZpZy5iYW5uZXIsIGNvbmZpZy5iYXNlKVxuICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgYGV4cG9ydCBjb25zdCBjb25maWcgPSAke0pTT04uc3RyaW5naWZ5KGNvbmZpZyl9YCxcbiAgICAgICAgYGV4cG9ydCBjb25zdCBiYW5uZXJIdG1sID0gJHtKU09OLnN0cmluZ2lmeShiYW5uZXJIdG1sKX1gLFxuICAgICAgXS5qb2luKFwiXFxuXCIpXG4gICAgfSxcbiAgICBjb25maWd1cmVTZXJ2ZXIoc2VydmVyKSB7XG4gICAgICAvLyBWaXRlIHdhdGNoZXMgb25seSBpdHMgcm9vdCAodGhlIHRhcmdldCk7IHRoZSBmaWxlcyB0aGUgdGFyZ2V0IGlzXG4gICAgICAvLyBjb3BpZWQgZnJvbSBqb2luIGl0cyB3YXRjaGVyIGhlcmUuIGAubGl2ZW1hcmsvYCBhbHdheXMgZXhpc3RzXG4gICAgICAvLyBiZWNhdXNlIHRoZSB0YXJnZXQgbGl2ZXMgaW5zaWRlIGl0LlxuICAgICAgc2VydmVyLndhdGNoZXIuYWRkKFtvcHRzLmNvbmZpZy5jb25maWdQYXRoLCBvdmVycmlkZXNSb290XSlcbiAgICAgIGlmICghSVNfSU5TVEFMTEVEKSBzZXJ2ZXIud2F0Y2hlci5hZGQoU09VUkNFX0RJUilcbiAgICAgIHNlcnZlci53YXRjaGVyLm9uKFwiY2hhbmdlXCIsIGZpbGUgPT4gb25DaGFuZ2UoZmlsZSwgXCJjaGFuZ2VcIikpXG4gICAgICBzZXJ2ZXIud2F0Y2hlci5vbihcImFkZFwiLCBmaWxlID0+IG9uQ2hhbmdlKGZpbGUsIFwiYWRkXCIpKVxuICAgICAgc2VydmVyLndhdGNoZXIub24oXCJ1bmxpbmtcIiwgZmlsZSA9PiBvbkNoYW5nZShmaWxlLCBcInVubGlua1wiKSlcbiAgICAgIHNlcnZlci53YXRjaGVyLm9uKFwidW5saW5rRGlyXCIsIGZpbGUgPT4gb25DaGFuZ2UoZmlsZSwgXCJ1bmxpbmtcIikpXG5cbiAgICAgIGZ1bmN0aW9uIG9uQ2hhbmdlKGZpbGU6IHN0cmluZywga2luZDogXCJjaGFuZ2VcIiB8IFwiYWRkXCIgfCBcInVubGlua1wiKSB7XG4gICAgICAgIGlmIChmaWxlID09PSBvcHRzLmNvbmZpZy5jb25maWdQYXRoKSB7XG4gICAgICAgICAgc2VydmVyLnJlc3RhcnQoKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChpc1dpdGhpbihmaWxlLCB0YXJnZXREaXIpIHx8IGlzV2l0aGluKGZpbGUsIG91dERpcikpIHJldHVyblxuICAgICAgICBjb25zdCBvdmVybGF5SGl0ID0gbWF0Y2hQYXRoKGZpbGUsIG92ZXJyaWRlc1Jvb3QpXG4gICAgICAgIGlmIChvdmVybGF5SGl0KSB7XG4gICAgICAgICAgc3luY092ZXJsYXkob3ZlcmxheUhpdCwga2luZCwgdGFyZ2V0RGlyLCBvdmVycmlkZXNSb290KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvdXJjZUhpdCA9IG1hdGNoUGF0aChmaWxlLCBTT1VSQ0VfRElSKVxuICAgICAgICBpZiAoc291cmNlSGl0ICYmICFzb3VyY2VIaXQucmVsLmluY2x1ZGVzKFwicm91dGVUcmVlLmdlbi50c1wiKSkge1xuICAgICAgICAgIHN5bmNTb3VyY2Uoc291cmNlSGl0LCBraW5kLCB0YXJnZXREaXIsIG92ZXJyaWRlc1Jvb3QpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICB9XG59XG5cbmludGVyZmFjZSBIaXQge1xuICByZWw6IHN0cmluZ1xuICBjYXRlZ29yeTogXCJmb2xkZXJcIiB8IFwiZmlsZVwiIHwgbnVsbFxufVxuXG5mdW5jdGlvbiBtYXRjaFBhdGgoZmlsZTogc3RyaW5nLCByb290OiBzdHJpbmcpOiBIaXQgfCBudWxsIHtcbiAgaWYgKCFpc1dpdGhpbihmaWxlLCByb290KSB8fCBmaWxlID09PSByb290KSByZXR1cm4gbnVsbFxuICBjb25zdCByZWwgPSBmaWxlLnNsaWNlKHJvb3QubGVuZ3RoICsgc2VwLmxlbmd0aClcbiAgcmV0dXJuIHsgcmVsLCBjYXRlZ29yeTogY2xhc3NpZnkocmVsKSB9XG59XG5cbmZ1bmN0aW9uIGlzV2l0aGluKGZpbGU6IHN0cmluZywgZGlyOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGZpbGUgPT09IGRpciB8fCBmaWxlLnN0YXJ0c1dpdGgoYCR7ZGlyfSR7c2VwfWApXG59XG5cbmZ1bmN0aW9uIGNsYXNzaWZ5KHJlbDogc3RyaW5nKTogXCJmb2xkZXJcIiB8IFwiZmlsZVwiIHwgbnVsbCB7XG4gIGNvbnN0IFtoZWFkXSA9IHJlbC5zcGxpdChzZXApXG4gIGlmIChoZWFkICYmIEVTQ0FQQUJMRV9GT0xERVJTLmluY2x1ZGVzKGhlYWQpKSByZXR1cm4gXCJmb2xkZXJcIlxuICBpZiAoRVNDQVBBQkxFX0ZJTEVTLmluY2x1ZGVzKHJlbCkpIHJldHVybiBcImZpbGVcIlxuICAvLyBOb24tZXNjYXBhYmxlIHNvdXJjZSBmaWxlcyBzdGlsbCBuZWVkIHRvIGZsb3cgaW50byB0YXJnZXQgZHVyaW5nXG4gIC8vIGxpdmVtYXJrJ3Mgb3duIGRldiDigJQgdGhlIHVzZXIgaXMgZWRpdGluZyB0aGUgY2Fub25pY2FsIHNvdXJjZS5cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gc3luY092ZXJsYXkoXG4gIGhpdDogSGl0LFxuICBraW5kOiBcImNoYW5nZVwiIHwgXCJhZGRcIiB8IFwidW5saW5rXCIsXG4gIHRhcmdldERpcjogc3RyaW5nLFxuICBvdmVycmlkZXNSb290OiBzdHJpbmcsXG4pIHtcbiAgaWYgKCFoaXQuY2F0ZWdvcnkpIHJldHVyblxuICBjb25zdCBkZXN0ID0gam9pbih0YXJnZXREaXIsIGhpdC5yZWwpXG4gIGNvbnN0IHNvdXJjZSA9IGpvaW4oU09VUkNFX0RJUiwgaGl0LnJlbClcbiAgaWYgKGtpbmQgPT09IFwidW5saW5rXCIpIHtcbiAgICAvLyBDb3B5IGEgZmlsZSdzIGRlZmF1bHQgb3ZlciB0aGUgZXNjYXBlIGluIG9uZSB3cml0ZTogYW4gdW5saW5rIHRoZW5cbiAgICAvLyBhbiBhZGQgcmVhY2hlcyBWaXRlIGFzIHR3byBldmVudHMgYW5kIGNvc3RzIGEgcGFnZSByZWxvYWQuXG4gICAgaWYgKCFleGlzdHNTeW5jKHNvdXJjZSkgfHwgc3RhdFN5bmMoc291cmNlKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBybVN5bmMoZGVzdCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgfVxuICAgIGlmIChleGlzdHNTeW5jKHNvdXJjZSkpIGNwU3luYyhzb3VyY2UsIGRlc3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KVxuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IG92ZXJsYXkgPSBqb2luKG92ZXJyaWRlc1Jvb3QsIGhpdC5yZWwpXG4gIGlmIChleGlzdHNTeW5jKG92ZXJsYXkpKSBjcFN5bmMob3ZlcmxheSwgZGVzdCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG59XG5cbmZ1bmN0aW9uIHN5bmNTb3VyY2UoXG4gIGhpdDogSGl0LFxuICBraW5kOiBcImNoYW5nZVwiIHwgXCJhZGRcIiB8IFwidW5saW5rXCIsXG4gIHRhcmdldERpcjogc3RyaW5nLFxuICBvdmVycmlkZXNSb290OiBzdHJpbmcsXG4pIHtcbiAgLy8gSWYgdGhlIGNvbnN1bWVyIGhhcyBhbiBvdmVybGF5IGZvciB0aGlzIGZpbGUgKGFuZCBpdCdzIGVzY2FwYWJsZSksXG4gIC8vIHRoZSBvdmVybGF5IHdpbnMg4oCUIGlnbm9yZSBzb3VyY2UgY2hhbmdlcy5cbiAgaWYgKGhpdC5jYXRlZ29yeSAmJiBleGlzdHNTeW5jKGpvaW4ob3ZlcnJpZGVzUm9vdCwgaGl0LnJlbCkpKSByZXR1cm5cbiAgY29uc3QgZGVzdCA9IGpvaW4odGFyZ2V0RGlyLCBoaXQucmVsKVxuICBjb25zdCBzb3VyY2UgPSBqb2luKFNPVVJDRV9ESVIsIGhpdC5yZWwpXG4gIGlmIChraW5kID09PSBcInVubGlua1wiKSB7XG4gICAgcm1TeW5jKGRlc3QsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgIHJldHVyblxuICB9XG4gIGlmIChleGlzdHNTeW5jKHNvdXJjZSkpIGNwU3luYyhzb3VyY2UsIGRlc3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KVxufVxuXG4vKiogUmVzb2x2ZSBsaXZlbWFyay5jb25maWcudHMncyBgdml0ZWAgZmllbGQg4oCUIGVpdGhlciBhIGNvbmZpZyBvYmplY3RcbiAqICBvciBhIGZ1bmN0aW9uIGAoZW52KSA9PiBjb25maWdgIChtYXRjaGluZyBWaXRlJ3Mgb3duIGBkZWZpbmVDb25maWdgKS5cbiAqICBTY2hlbWEgc3RvcmVzIGl0IGFzIGB1bmtub3duYDsgdHlwaW5nIGZvciB0aGUgY29uc3VtZXIncyBlZGl0b3JcbiAqICBsaXZlcyBvbiB7QGxpbmsgVml0ZU92ZXJyaWRlfS4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVWaXRlT3ZlcnJpZGUoXG4gIHZpdGU6IHVua25vd24sXG4gIGVudjogQ29uZmlnRW52LFxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw+IHtcbiAgaWYgKCF2aXRlKSByZXR1cm4gbnVsbFxuICBpZiAodHlwZW9mIHZpdGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFJlZmxlY3QuYXBwbHkodml0ZSwgdW5kZWZpbmVkLCBbZW52XSlcbiAgICByZXR1cm4gaXNPYmplY3QocmVzdWx0KSA/IHJlc3VsdCA6IG51bGxcbiAgfVxuICByZXR1cm4gaXNPYmplY3Qodml0ZSkgPyB2aXRlIDogbnVsbFxufVxuXG5mdW5jdGlvbiBpc09iamVjdCh2OiB1bmtub3duKTogdiBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB2ICE9PSBudWxsICYmIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiXG59XG4iXX0=
package/build/program.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { Command } from "commander";
2
2
  import { build } from "./commands/build.js";
3
+ import { clear } from "./commands/clear.js";
3
4
  import { escape } from "./commands/escape.js";
4
5
  import { preview } from "./commands/preview.js";
5
6
  import { start } from "./commands/start.js";
@@ -14,5 +15,6 @@ export const program = new Command()
14
15
  .addCommand(start)
15
16
  .addCommand(build)
16
17
  .addCommand(preview)
17
- .addCommand(escape);
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3JhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NvdXJjZS9wcm9ncmFtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDbkMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFDL0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQzNDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBQ3hELE9BQU8sV0FBVyxNQUFNLGlCQUFpQixDQUFDLE9BQU8sSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFBO0FBRS9ELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBRTtLQUNqQyxJQUFJLENBQUMsVUFBVSxDQUFDO0tBQ2hCLFdBQVcsQ0FBQyxnQ0FBZ0MsQ0FBQztLQUM3QyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxlQUFlLEVBQUUsOEJBQThCLENBQUM7S0FDN0UsTUFBTSxDQUFDLHFCQUFxQixFQUFFLHFCQUFxQixDQUFDO0tBQ3BELGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQztLQUNoQyxVQUFVLENBQUMsS0FBSyxDQUFDO0tBQ2pCLFVBQVUsQ0FBQyxLQUFLLENBQUM7S0FDakIsVUFBVSxDQUFDLE9BQU8sQ0FBQztLQUNuQixVQUFVLENBQUMsTUFBTSxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBidWlsZCB9IGZyb20gXCIuL2NvbW1hbmRzL2J1aWxkLnRzXCJcbmltcG9ydCB7IGVzY2FwZSB9IGZyb20gXCIuL2NvbW1hbmRzL2VzY2FwZS50c1wiXG5pbXBvcnQgeyBwcmV2aWV3IH0gZnJvbSBcIi4vY29tbWFuZHMvcHJldmlldy50c1wiXG5pbXBvcnQgeyBzdGFydCB9IGZyb20gXCIuL2NvbW1hbmRzL3N0YXJ0LnRzXCJcbmltcG9ydCB7IGhlbHBDb25maWd1cmF0aW9uIH0gZnJvbSBcIi4vaGVscGVycy9wcm9ncmFtLnRzXCJcbmltcG9ydCBwYWNrYWdlSnNvbiBmcm9tIFwiLi4vcGFja2FnZS5qc29uXCIgd2l0aCB7IHR5cGU6IFwianNvblwiIH1cblxuZXhwb3J0IGNvbnN0IHByb2dyYW0gPSBuZXcgQ29tbWFuZCgpXG4gIC5uYW1lKFwibGl2ZW1hcmtcIilcbiAgLmRlc2NyaXB0aW9uKFwiTGl2ZW1hcmsgc3RhdGljIHNpdGUgZ2VuZXJhdG9yXCIpXG4gIC52ZXJzaW9uKHBhY2thZ2VKc29uLnZlcnNpb24sIFwiLXYsIC0tdmVyc2lvblwiLCBcImRpc3BsYXkgdGhlIGxpdmVtYXJrIHZlcnNpb25cIilcbiAgLm9wdGlvbihcIi1jLCAtLWNvbmZpZyA8cGF0aD5cIiwgXCJwYXRoIHRvIGNvbmZpZyBmaWxlXCIpXG4gIC5jb25maWd1cmVIZWxwKGhlbHBDb25maWd1cmF0aW9uKVxuICAuYWRkQ29tbWFuZChzdGFydClcbiAgLmFkZENvbW1hbmQoYnVpbGQpXG4gIC5hZGRDb21tYW5kKHByZXZpZXcpXG4gIC5hZGRDb21tYW5kKGVzY2FwZSlcbiJdfQ==
18
+ .addCommand(escape)
19
+ .addCommand(clear);
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3JhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NvdXJjZS9wcm9ncmFtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDbkMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQzNDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDN0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQy9DLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUMzQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUN4RCxPQUFPLFdBQVcsTUFBTSxpQkFBaUIsQ0FBQyxPQUFPLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQTtBQUUvRCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUU7S0FDakMsSUFBSSxDQUFDLFVBQVUsQ0FBQztLQUNoQixXQUFXLENBQUMsZ0NBQWdDLENBQUM7S0FDN0MsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsZUFBZSxFQUFFLDhCQUE4QixDQUFDO0tBQzdFLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxxQkFBcUIsQ0FBQztLQUNwRCxhQUFhLENBQUMsaUJBQWlCLENBQUM7S0FDaEMsVUFBVSxDQUFDLEtBQUssQ0FBQztLQUNqQixVQUFVLENBQUMsS0FBSyxDQUFDO0tBQ2pCLFVBQVUsQ0FBQyxPQUFPLENBQUM7S0FDbkIsVUFBVSxDQUFDLE1BQU0sQ0FBQztLQUNsQixVQUFVLENBQUMsS0FBSyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiXG5pbXBvcnQgeyBidWlsZCB9IGZyb20gXCIuL2NvbW1hbmRzL2J1aWxkLnRzXCJcbmltcG9ydCB7IGNsZWFyIH0gZnJvbSBcIi4vY29tbWFuZHMvY2xlYXIudHNcIlxuaW1wb3J0IHsgZXNjYXBlIH0gZnJvbSBcIi4vY29tbWFuZHMvZXNjYXBlLnRzXCJcbmltcG9ydCB7IHByZXZpZXcgfSBmcm9tIFwiLi9jb21tYW5kcy9wcmV2aWV3LnRzXCJcbmltcG9ydCB7IHN0YXJ0IH0gZnJvbSBcIi4vY29tbWFuZHMvc3RhcnQudHNcIlxuaW1wb3J0IHsgaGVscENvbmZpZ3VyYXRpb24gfSBmcm9tIFwiLi9oZWxwZXJzL3Byb2dyYW0udHNcIlxuaW1wb3J0IHBhY2thZ2VKc29uIGZyb20gXCIuLi9wYWNrYWdlLmpzb25cIiB3aXRoIHsgdHlwZTogXCJqc29uXCIgfVxuXG5leHBvcnQgY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKClcbiAgLm5hbWUoXCJsaXZlbWFya1wiKVxuICAuZGVzY3JpcHRpb24oXCJMaXZlbWFyayBzdGF0aWMgc2l0ZSBnZW5lcmF0b3JcIilcbiAgLnZlcnNpb24ocGFja2FnZUpzb24udmVyc2lvbiwgXCItdiwgLS12ZXJzaW9uXCIsIFwiZGlzcGxheSB0aGUgbGl2ZW1hcmsgdmVyc2lvblwiKVxuICAub3B0aW9uKFwiLWMsIC0tY29uZmlnIDxwYXRoPlwiLCBcInBhdGggdG8gY29uZmlnIGZpbGVcIilcbiAgLmNvbmZpZ3VyZUhlbHAoaGVscENvbmZpZ3VyYXRpb24pXG4gIC5hZGRDb21tYW5kKHN0YXJ0KVxuICAuYWRkQ29tbWFuZChidWlsZClcbiAgLmFkZENvbW1hbmQocHJldmlldylcbiAgLmFkZENvbW1hbmQoZXNjYXBlKVxuICAuYWRkQ29tbWFuZChjbGVhcilcbiJdfQ==
@@ -1 +1,4 @@
1
- export declare const Route: import("@tanstack/router-core").Route<import("@tanstack/react-router").Register, any, "/$", "/$", "/$", "/$", undefined, import("@tanstack/react-router").ResolveParams<"/$">, import("@tanstack/react-router").AnyContext, import("@tanstack/react-router").AnyContext, import("@tanstack/react-router").AnyContext, {}, ({ params }: import("@tanstack/router-core").LoaderFnContext<import("@tanstack/react-router").Register, any, "/$", import("@tanstack/react-router").ResolveParams<"/$">, {}, import("@tanstack/react-router").AnyContext, import("@tanstack/react-router").AnyContext, import("@tanstack/react-router").AnyContext, unknown, undefined>) => any, unknown, unknown, unknown, unknown, undefined>;
1
+ import { z } from "zod";
2
+ export declare const Route: import("@tanstack/router-core").Route<import("@tanstack/react-router").Register, any, "/$", "/$", "/$", "/$", z.ZodObject<{
3
+ highlight: z.ZodCatch<z.ZodOptional<z.ZodString>>;
4
+ }, z.core.$loose>, import("@tanstack/react-router").ResolveParams<"/$">, import("@tanstack/react-router").AnyContext, import("@tanstack/react-router").AnyContext, import("@tanstack/react-router").AnyContext, {}, ({ params }: import("@tanstack/router-core").LoaderFnContext<import("@tanstack/react-router").Register, any, "/$", import("@tanstack/react-router").ResolveParams<"/$">, {}, import("@tanstack/react-router").AnyContext, import("@tanstack/react-router").AnyContext, import("@tanstack/react-router").AnyContext, unknown, undefined>) => any, unknown, unknown, unknown, unknown, undefined>;
package/build/routes/$.js CHANGED
@@ -1,12 +1,18 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { config } from "livemark:virtual";
2
3
  import { createFileRoute, notFound, redirect } from "@tanstack/react-router";
4
+ import { z } from "zod";
3
5
  import { currentSection, firstArticle, homeArticle, sortedArticles, } from "../content/article.js";
4
6
  import { sectionTags } from "../content/tag.js";
7
+ import { buildPageHead } from "../helpers/head.js";
5
8
  import { Article } from "../components/Article.js";
6
9
  import { BlogIndex } from "../components/BlogIndex.js";
7
10
  import { ChangelogIndex } from "../components/ChangelogIndex.js";
11
+ import { Layout } from "../components/Layout.js";
8
12
  import { TagIndex } from "../components/TagIndex.js";
9
13
  export const Route = createFileRoute("/$")({
14
+ // Loose, so keys this route does not own (UTM tags, devtools flags) survive.
15
+ validateSearch: z.looseObject({ highlight: z.string().optional().catch(undefined) }),
10
16
  loader: ({ params }) => {
11
17
  if (!params._splat) {
12
18
  if (homeArticle)
@@ -57,18 +63,23 @@ export const Route = createFileRoute("/$")({
57
63
  }
58
64
  throw notFound();
59
65
  },
60
- head: ({ loaderData }) => ({
61
- meta: [
62
- ...(loaderData ? [{ title: loaderData.title }] : []),
63
- ...("description" in loaderData && loaderData.description
64
- ? [{ name: "description", content: loaderData.description }]
65
- : []),
66
- ],
66
+ head: ({ loaderData, params }) => buildPageHead({
67
+ config,
68
+ path: params._splat ? `/${params._splat}/` : "/",
69
+ title: loaderData?.title,
70
+ description: loaderData && "description" in loaderData ? loaderData.description : undefined,
71
+ image: loaderData && "image" in loaderData ? loaderData.image : undefined,
72
+ isArticle: loaderData && "file" in loaderData,
67
73
  }),
68
74
  component: Component,
69
75
  });
70
76
  function Component() {
71
77
  const data = Route.useLoaderData();
78
+ return (_jsx(Layout, { withSidebar: data.sidebar, children: _jsx(Page, {}) }));
79
+ }
80
+ function Page() {
81
+ const data = Route.useLoaderData();
82
+ const search = Route.useSearch();
72
83
  if ("blogIndex" in data) {
73
84
  return _jsx(BlogIndex, { sectionPrefix: data.sectionPrefix });
74
85
  }
@@ -78,6 +89,6 @@ function Component() {
78
89
  if ("tagPage" in data) {
79
90
  return _jsx(TagIndex, { sectionPrefix: data.sectionPrefix, tag: data.tag });
80
91
  }
81
- return _jsx(Article, { article: data });
92
+ return _jsx(Article, { article: data, highlight: search.highlight });
82
93
  }
83
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiJC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9yb3V0ZXMvJC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQzVFLE9BQU8sRUFDTCxjQUFjLEVBQ2QsWUFBWSxFQUNaLFdBQVcsRUFDWCxjQUFjLEdBQ2YsTUFBTSx1QkFBdUIsQ0FBQTtBQUM5QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDL0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDBCQUEyQixDQUFBO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0QkFBNkIsQ0FBQTtBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUNBQWtDLENBQUE7QUFDakUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDJCQUE0QixDQUFBO0FBRXJELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekMsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO1FBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkIsSUFBSSxXQUFXO2dCQUFFLE9BQU8sRUFBRSxHQUFHLFdBQVcsRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFBO1lBQ3hFLElBQUksQ0FBQyxZQUFZO2dCQUFFLE1BQU0sUUFBUSxFQUFFLENBQUE7WUFDbkMsTUFBTSxRQUFRLENBQUM7Z0JBQ2IsRUFBRSxFQUFFLElBQUk7Z0JBQ1IsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsRUFBRTthQUM5RCxDQUFDLENBQUE7UUFDSixDQUFDO1FBQ0QsTUFBTSxLQUFLLEdB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YSxHQUFJLENBQUE7SUFDOUQsQ0FBQztJQUNELElBQUksU0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3RCLE9BQU8sS0FBQyxRQUFRLElBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUksQ0FBQTtJQUN2RSxDQUFDO0lBQ0QsT0FBTyxLQUFDLE9BQU8sSUFBQyxPQUFPLEVBQUUsSUFBSSxHQUFJLENBQUE7QUFDbkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUZpbGVSb3V0ZSwgbm90Rm91bmQsIHJlZGlyZWN0IH0gZnJvbSBcIkB0YW5zdGFjay9yZWFjdC1yb3V0ZXJcIlxuaW1wb3J0IHtcbiAgY3VycmVudFNlY3Rpb24sXG4gIGZpcnN0QXJ0aWNsZSxcbiAgaG9tZUFydGljbGUsXG4gIHNvcnRlZEFydGljbGVzLFxufSBmcm9tIFwiLi4vY29udGVudC9hcnRpY2xlLnRzXCJcbmltcG9ydCB7IHNlY3Rpb25UYWdzIH0gZnJvbSBcIi4uL2NvbnRlbnQvdGFnLnRzXCJcbmltcG9ydCB7IEFydGljbGUgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9BcnRpY2xlLnRzeFwiXG5pbXBvcnQgeyBCbG9nSW5kZXggfSBmcm9tIFwiLi4vY29tcG9uZW50cy9CbG9nSW5kZXgudHN4XCJcbmltcG9ydCB7IENoYW5nZWxvZ0luZGV4IH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvQ2hhbmdlbG9nSW5kZXgudHN4XCJcbmltcG9ydCB7IFRhZ0luZGV4IH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvVGFnSW5kZXgudHN4XCJcblxuZXhwb3J0IGNvbnN0IFJvdXRlID0gY3JlYXRlRmlsZVJvdXRlKFwiLyRcIikoe1xuICBsb2FkZXI6ICh7IHBhcmFtcyB9KSA9PiB7XG4gICAgaWYgKCFwYXJhbXMuX3NwbGF0KSB7XG4gICAgICBpZiAoaG9tZUFydGljbGUpIHJldHVybiB7IC4uLmhvbWVBcnRpY2xlLCBzaWRlYmFyOiBob21lQXJ0aWNsZS5zaWRlYmFyIH1cbiAgICAgIGlmICghZmlyc3RBcnRpY2xlKSB0aHJvdyBub3RGb3VuZCgpXG4gICAgICB0aHJvdyByZWRpcmVjdCh7XG4gICAgICAgIHRvOiBcIi8kXCIsXG4gICAgICAgIHBhcmFtczogeyBfc3BsYXQ6IGZpcnN0QXJ0aWNsZS5wYXRoLnJlcGxhY2UoL15cXC98XFwvJC9nLCBcIlwiKSB9LFxuICAgICAgfSlcbiAgICB9XG4gICAgY29uc3Qgc3BsYXQgPSBgLyR7cGFyYW1zLl9zcGxhdH0vYFxuICAgIGNvbnN0IGFydGljbGUgPSBzb3J0ZWRBcnRpY2xlcy5maW5kKGEgPT4gYS5wYXRoID09PSBzcGxhdClcbiAgICBpZiAoYXJ0aWNsZSkgcmV0dXJuIGFydGljbGVcblxuICAgIGNvbnN0IHNlY3Rpb24gPSBjdXJyZW50U2VjdGlvbihzcGxhdClcbiAgICBpZiAoc2VjdGlvbj8udHlwZSA9PT0gXCJjaGFuZ2Vsb2dcIiAmJiBzZWN0aW9uLnByZWZpeCA9PT0gc3BsYXQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNoYW5nZWxvZ0luZGV4OiB0cnVlIGFzIGNvbnN0LFxuICAgICAgICBzZWN0aW9uUHJlZml4OiBzZWN0aW9uLnByZWZpeCxcbiAgICAgICAgdGl0bGU6IHNlY3Rpb24udGl0bGUsXG4gICAgICAgIHNpZGViYXI6IHRydWUsXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzZWN0aW9uPy50eXBlID09PSBcImJsb2dcIikge1xuICAgICAgaWYgKHNlY3Rpb24ucHJlZml4ID09PSBzcGxhdCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGJsb2dJbmRleDogdHJ1ZSBhcyBjb25zdCxcbiAgICAgICAgICBzZWN0aW9uUHJlZml4OiBzZWN0aW9uLnByZWZpeCxcbiAgICAgICAgICB0aXRsZTogc2VjdGlvbi50aXRsZSxcbiAgICAgICAgICBzaWRlYmFyOiB0cnVlLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRhZ01hdGNoID0gc3BsYXQubWF0Y2gobmV3IFJlZ0V4cChgXiR7c2VjdGlvbi5wcmVmaXh9dGFncy8oW14vXSspLyRgKSlcbiAgICAgIGNvbnN0IHRhZyA9IHRhZ01hdGNoPy5bMV1cbiAgICAgIGlmICh0YWcpIHtcbiAgICAgICAgY29uc3QgdGFnTWFwID0gc2VjdGlvblRhZ3MuZ2V0KHNlY3Rpb24ucHJlZml4KVxuICAgICAgICBpZiAodGFnTWFwPy5oYXModGFnKSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0YWdQYWdlOiB0cnVlIGFzIGNvbnN0LFxuICAgICAgICAgICAgc2VjdGlvblByZWZpeDogc2VjdGlvbi5wcmVmaXgsXG4gICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICB0aXRsZTogYFBvc3RzIHRhZ2dlZCAnJHt0YWd9J2AsXG4gICAgICAgICAgICBzaWRlYmFyOiB0cnVlLFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5vdEZvdW5kKClcbiAgfSxcbiAgaGVhZDogKHsgbG9hZGVyRGF0YSB9KSA9PiAoe1xuICAgIG1ldGE6IFtcbiAgICAgIC4uLihsb2FkZXJEYXRhID8gW3sgdGl0bGU6IGxvYWRlckRhdGEudGl0bGUgfV0gOiBbXSksXG4gICAgICAuLi4oXCJkZXNjcmlwdGlvblwiIGluIGxvYWRlckRhdGEgJiYgbG9hZGVyRGF0YS5kZXNjcmlwdGlvblxuICAgICAgICA/IFt7IG5hbWU6IFwiZGVzY3JpcHRpb25cIiwgY29udGVudDogbG9hZGVyRGF0YS5kZXNjcmlwdGlvbiB9XVxuICAgICAgICA6IFtdKSxcbiAgICBdLFxuICB9KSxcbiAgY29tcG9uZW50OiBDb21wb25lbnQsXG59KVxuXG5mdW5jdGlvbiBDb21wb25lbnQoKSB7XG4gIGNvbnN0IGRhdGEgPSBSb3V0ZS51c2VMb2FkZXJEYXRhKClcbiAgaWYgKFwiYmxvZ0luZGV4XCIgaW4gZGF0YSkge1xuICAgIHJldHVybiA8QmxvZ0luZGV4IHNlY3Rpb25QcmVmaXg9e2RhdGEuc2VjdGlvblByZWZpeH0gLz5cbiAgfVxuICBpZiAoXCJjaGFuZ2Vsb2dJbmRleFwiIGluIGRhdGEpIHtcbiAgICByZXR1cm4gPENoYW5nZWxvZ0luZGV4IHNlY3Rpb25QcmVmaXg9e2RhdGEuc2VjdGlvblByZWZpeH0gLz5cbiAgfVxuICBpZiAoXCJ0YWdQYWdlXCIgaW4gZGF0YSkge1xuICAgIHJldHVybiA8VGFnSW5kZXggc2VjdGlvblByZWZpeD17ZGF0YS5zZWN0aW9uUHJlZml4fSB0YWc9e2RhdGEudGFnfSAvPlxuICB9XG4gIHJldHVybiA8QXJ0aWNsZSBhcnRpY2xlPXtkYXRhfSAvPlxufVxuIl19
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiJC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9yb3V0ZXMvJC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUN6QyxPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUM1RSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFBO0FBQ3ZCLE9BQU8sRUFDTCxjQUFjLEVBQ2QsWUFBWSxFQUNaLFdBQVcsRUFDWCxjQUFjLEdBQ2YsTUFBTSx1QkFBdUIsQ0FBQTtBQUM5QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQ2xELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwwQkFBMkIsQ0FBQTtBQUNuRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTZCLENBQUE7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFrQyxDQUFBO0FBQ2pFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx5QkFBMEIsQ0FBQTtBQUNqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMkJBQTRCLENBQUE7QUFFckQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6Qyw2RUFBNkU7SUFDN0UsY0FBYyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO0lBQ3BGLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTtRQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxD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azp2aXJ0dWFsXCJcbmltcG9ydCB7IGNyZWF0ZUZpbGVSb3V0ZSwgbm90Rm91bmQsIHJlZGlyZWN0IH0gZnJvbSBcIkB0YW5zdGFjay9yZWFjdC1yb3V0ZXJcIlxuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIlxuaW1wb3J0IHtcbiAgY3VycmVudFNlY3Rpb24sXG4gIGZpcnN0QXJ0aWNsZSxcbiAgaG9tZUFydGljbGUsXG4gIHNvcnRlZEFydGljbGVzLFxufSBmcm9tIFwiLi4vY29udGVudC9hcnRpY2xlLnRzXCJcbmltcG9ydCB7IHNlY3Rpb25UYWdzIH0gZnJvbSBcIi4uL2NvbnRlbnQvdGFnLnRzXCJcbmltcG9ydCB7IGJ1aWxkUGFnZUhlYWQgfSBmcm9tIFwiLi4vaGVscGVycy9oZWFkLnRzXCJcbmltcG9ydCB7IEFydGljbGUgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9BcnRpY2xlLnRzeFwiXG5pbXBvcnQgeyBCbG9nSW5kZXggfSBmcm9tIFwiLi4vY29tcG9uZW50cy9CbG9nSW5kZXgudHN4XCJcbmltcG9ydCB7IENoYW5nZWxvZ0luZGV4IH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvQ2hhbmdlbG9nSW5kZXgudHN4XCJcbmltcG9ydCB7IExheW91dCB9IGZyb20gXCIuLi9jb21wb25lbnRzL0xheW91dC50c3hcIlxuaW1wb3J0IHsgVGFnSW5kZXggfSBmcm9tIFwiLi4vY29tcG9uZW50cy9UYWdJbmRleC50c3hcIlxuXG5leHBvcnQgY29uc3QgUm91dGUgPSBjcmVhdGVGaWxlUm91dGUoXCIvJFwiKSh7XG4gIC8vIExvb3NlLCBzbyBrZXlzIHRoaXMgcm91dGUgZG9lcyBub3Qgb3duIChVVE0gdGFncywgZGV2dG9vbHMgZmxhZ3MpIHN1cnZpdmUuXG4gIHZhbGlkYXRlU2VhcmNoOiB6Lmxvb3NlT2JqZWN0KHsgaGlnaGxpZ2h0OiB6LnN0cmluZygpLm9wdGlvbmFsKCkuY2F0Y2godW5kZWZpbmVkKSB9KSxcbiAgbG9hZGVyOiAoeyBwYXJhbXMgfSkgPT4ge1xuICAgIGlmICghcGFyYW1zLl9zcGxhdCkge1xuICAgICAgaWYgKGhvbWVBcnRpY2xlKSByZXR1cm4geyAuLi5ob21lQXJ0aWNsZSwgc2lkZWJhcjogaG9tZUFydGljbGUuc2lkZWJhciB9XG4gICAgICBpZiAoIWZpcnN0QXJ0aWNsZSkgdGhyb3cgbm90Rm91bmQoKVxuICAgICAgdGhyb3cgcmVkaXJlY3Qoe1xuICAgICAgICB0bzogXCIvJFwiLFxuICAgICAgICBwYXJhbXM6IHsgX3NwbGF0OiBmaXJzdEFydGljbGUucGF0aC5yZXBsYWNlKC9eXFwvfFxcLyQvZywgXCJcIikgfSxcbiAgICAgIH0pXG4gICAgfVxuICAgIGNvbnN0IHNwbGF0ID0gYC8ke3BhcmFtcy5fc3BsYXR9L2BcbiAgICBjb25zdCBhcnRpY2xlID0gc29ydGVkQXJ0aWNsZXMuZmluZChhID0+IGEucGF0aCA9PT0gc3BsYXQpXG4gICAgaWYgKGFydGljbGUpIHJldHVybiBhcnRpY2xlXG5cbiAgICBjb25zdCBzZWN0aW9uID0gY3VycmVudFNlY3Rpb24oc3BsYXQpXG4gICAgaWYgKHNlY3Rpb24/LnR5cGUgPT09IFwiY2hhbmdlbG9nXCIgJiYgc2VjdGlvbi5wcmVmaXggPT09IHNwbGF0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjaGFuZ2Vsb2dJbmRleDogdHJ1ZSBhcyBjb25zdCxcbiAgICAgICAgc2VjdGlvblByZWZpeDogc2VjdGlvbi5wcmVmaXgsXG4gICAgICAgIHRpdGxlOiBzZWN0aW9uLnRpdGxlLFxuICAgICAgICBzaWRlYmFyOiB0cnVlLFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2VjdGlvbj8udHlwZSA9PT0gXCJibG9nXCIpIHtcbiAgICAgIGlmIChzZWN0aW9uLnByZWZpeCA9PT0gc3BsYXQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBibG9nSW5kZXg6IHRydWUgYXMgY29uc3QsXG4gICAgICAgICAgc2VjdGlvblByZWZpeDogc2VjdGlvbi5wcmVmaXgsXG4gICAgICAgICAgdGl0bGU6IHNlY3Rpb24udGl0bGUsXG4gICAgICAgICAgc2lkZWJhcjogdHJ1ZSxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0YWdNYXRjaCA9IHNwbGF0Lm1hdGNoKG5ldyBSZWdFeHAoYF4ke3NlY3Rpb24ucHJlZml4fXRhZ3MvKFteL10rKS8kYCkpXG4gICAgICBjb25zdCB0YWcgPSB0YWdNYXRjaD8uWzFdXG4gICAgICBpZiAodGFnKSB7XG4gICAgICAgIGNvbnN0IHRhZ01hcCA9IHNlY3Rpb25UYWdzLmdldChzZWN0aW9uLnByZWZpeClcbiAgICAgICAgaWYgKHRhZ01hcD8uaGFzKHRhZykpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGFnUGFnZTogdHJ1ZSBhcyBjb25zdCxcbiAgICAgICAgICAgIHNlY3Rpb25QcmVmaXg6IHNlY3Rpb24ucHJlZml4LFxuICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgdGl0bGU6IGBQb3N0cyB0YWdnZWQgJyR7dGFnfSdgLFxuICAgICAgICAgICAgc2lkZWJhcjogdHJ1ZSxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBub3RGb3VuZCgpXG4gIH0sXG4gIGhlYWQ6ICh7IGxvYWRlckRhdGEsIHBhcmFtcyB9KSA9PlxuICAgIGJ1aWxkUGFnZUhlYWQoe1xuICAgICAgY29uZmlnLFxuICAgICAgcGF0aDogcGFyYW1zLl9zcGxhdCA/IGAvJHtwYXJhbXMuX3NwbGF0fS9gIDogXCIvXCIsXG4gICAgICB0aXRsZTogbG9hZGVyRGF0YT8udGl0bGUsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgbG9hZGVyRGF0YSAmJiBcImRlc2NyaXB0aW9uXCIgaW4gbG9hZGVyRGF0YSA/IGxvYWRlckRhdGEuZGVzY3JpcHRpb24gOiB1bmRlZmluZWQsXG4gICAgICBpbWFnZTogbG9hZGVyRGF0YSAmJiBcImltYWdlXCIgaW4gbG9hZGVyRGF0YSA/IGxvYWRlckRhdGEuaW1hZ2UgOiB1bmRlZmluZWQsXG4gICAgICBpc0FydGljbGU6IGxvYWRlckRhdGEgJiYgXCJmaWxlXCIgaW4gbG9hZGVyRGF0YSxcbiAgICB9KSxcbiAgY29tcG9uZW50OiBDb21wb25lbnQsXG59KVxuXG5mdW5jdGlvbiBDb21wb25lbnQoKSB7XG4gIGNvbnN0IGRhdGEgPSBSb3V0ZS51c2VMb2FkZXJEYXRhKClcbiAgcmV0dXJuIChcbiAgICA8TGF5b3V0IHdpdGhTaWRlYmFyPXtkYXRhLnNpZGViYXJ9PlxuICAgICAgPFBhZ2UgLz5cbiAgICA8L0xheW91dD5cbiAgKVxufVxuXG5mdW5jdGlvbiBQYWdlKCkge1xuICBjb25zdCBkYXRhID0gUm91dGUudXNlTG9hZGVyRGF0YSgpXG4gIGNvbnN0IHNlYXJjaCA9IFJvdXRlLnVzZVNlYXJjaCgpXG4gIGlmIChcImJsb2dJbmRleFwiIGluIGRhdGEpIHtcbiAgICByZXR1cm4gPEJsb2dJbmRleCBzZWN0aW9uUHJlZml4PXtkYXRhLnNlY3Rpb25QcmVmaXh9IC8+XG4gIH1cbiAgaWYgKFwiY2hhbmdlbG9nSW5kZXhcIiBpbiBkYXRhKSB7XG4gICAgcmV0dXJuIDxDaGFuZ2Vsb2dJbmRleCBzZWN0aW9uUHJlZml4PXtkYXRhLnNlY3Rpb25QcmVmaXh9IC8+XG4gIH1cbiAgaWYgKFwidGFnUGFnZVwiIGluIGRhdGEpIHtcbiAgICByZXR1cm4gPFRhZ0luZGV4IHNlY3Rpb25QcmVmaXg9e2RhdGEuc2VjdGlvblByZWZpeH0gdGFnPXtkYXRhLnRhZ30gLz5cbiAgfVxuICByZXR1cm4gPEFydGljbGUgYXJ0aWNsZT17ZGF0YX0gaGlnaGxpZ2h0PXtzZWFyY2guaGlnaGxpZ2h0fSAvPlxufVxuIl19
@@ -1,83 +1,49 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { config } from "livemark:virtual";
3
3
  import { TanStackDevtools } from "@tanstack/react-devtools";
4
4
  import { ReactQueryDevtoolsPanel } from "@tanstack/react-query-devtools";
5
- import { createRootRoute, HeadContent, Outlet, Scripts, useMatch, } from "@tanstack/react-router";
5
+ import { createRootRoute, HeadContent, Outlet, Scripts } from "@tanstack/react-router";
6
6
  import { TanStackRouterDevtoolsPanel } from "@tanstack/react-router-devtools";
7
+ import { useEffect } from "react";
7
8
  import { Layout } from "../components/Layout.js";
9
+ import { Root } from "../components/Root.js";
8
10
  import { DefaultCatchBoundary } from "../components/DefaultCatchBoundary.js";
9
11
  import { NotFound } from "../components/NotFound.js";
12
+ import { useHydrated } from "../hooks/hydrated.js";
10
13
  import { Toaster } from "../elements/sonner.js";
11
- import { faviconType } from "../helpers/favicon.js";
12
- import { prefixUrl } from "../helpers/prefix-url.js";
14
+ import { buildRootHead } from "../helpers/head.js";
15
+ import { startTheme } from "../helpers/theme.js";
16
+ import { customizeHead } from "../head.js";
13
17
  import defaultFavicon from "../assets/logo.svg";
14
18
  import generalCss from "../styles/general.css?url";
15
19
  import markdownCss from "../styles/markdown.css?url";
16
20
  export const Route = createRootRoute({
17
- head: () => {
18
- const favicon = prefixUrl(config.favicon ?? config.logo ?? defaultFavicon, config.base);
19
- const feedLinks = config.site
20
- ? (config.sections ?? [])
21
- .filter(s => s.type === "blog")
22
- .map(s => ({
23
- rel: "alternate",
24
- type: "application/rss+xml",
25
- title: `${s.siteTitle ?? s.title} RSS Feed`,
26
- href: prefixUrl(`${s.prefix}rss.xml`, config.base),
27
- }))
28
- : [];
29
- return {
30
- meta: [
31
- { charSet: "utf-8" },
32
- { title: config.title },
33
- { name: "description", content: config.description },
34
- { property: "og:title", content: config.title },
35
- {
36
- property: "og:description",
37
- content: config.description,
38
- },
39
- { property: "og:site_name", content: config.title },
40
- { property: "og:type", content: "website" },
41
- {
42
- name: "viewport",
43
- content: "width=device-width, initial-scale=1",
44
- },
45
- ],
46
- links: [
47
- { rel: "icon", href: favicon, type: faviconType(favicon) },
48
- { rel: "shortcut icon", href: favicon, type: faviconType(favicon) },
49
- { rel: "stylesheet", href: generalCss },
50
- { rel: "stylesheet", href: markdownCss },
51
- ...feedLinks,
52
- ],
53
- };
54
- },
55
- notFoundComponent: () => _jsx(NotFound, {}),
21
+ head: () => customizeHead(buildRootHead({ config, defaultFavicon, stylesheets: [generalCss, markdownCss] })),
22
+ notFoundComponent: () => (_jsx(Layout, { children: _jsx(NotFound, {}) })),
56
23
  errorComponent: props => {
57
- return (_jsx(Document, { children: _jsx(DefaultCatchBoundary, { ...props }) }));
24
+ return (_jsx(Document, { children: _jsx(Layout, { children: _jsx(DefaultCatchBoundary, { ...props }) }) }));
58
25
  },
59
26
  component: () => {
60
27
  return (_jsx(Document, { children: _jsx(Outlet, {}) }));
61
28
  },
62
29
  });
63
30
  function Document(props) {
64
- const articleRoute = useMatch({ from: "/$", shouldThrow: false });
65
- const withSidebar = articleRoute?.loaderData?.sidebar;
66
- return (_jsxs("html", { lang: "en", children: [
67
- _jsx("head", { children: _jsx(HeadContent, {}) }), _jsxs("body", { children: [
68
- _jsx(Layout, { withSidebar: withSidebar, children: props.children }), _jsx(Toaster, { position: "top-center" }), _jsx(TanStackDevtools, { config: { hideUntilHover: true, position: "bottom-left" }, plugins: [
69
- {
70
- name: "TanStack Query",
71
- render: _jsx(ReactQueryDevtoolsPanel, {}),
72
- defaultOpen: true,
73
- },
74
- {
75
- name: "TanStack Router",
76
- render: _jsx(TanStackRouterDevtoolsPanel, {}),
77
- defaultOpen: false,
78
- },
79
- ] }), _jsx(Scripts, {})
80
- ] })
81
- ] }));
31
+ // Off the raw URL, not the router's parsed search: a route whose validateSearch
32
+ // does not declare this key strips it.
33
+ const hydrated = useHydrated();
34
+ const devtools = hydrated && window.location.search.includes("tanstack-devtools");
35
+ useEffect(startTheme, []);
36
+ return (_jsxs("html", { lang: "en", suppressHydrationWarning: true, children: [_jsx("head", { children: _jsx(HeadContent, {}) }), _jsxs("body", { children: [_jsx(Root, { children: props.children }), _jsx(Toaster, { position: "top-center" }), devtools && (_jsx(_Fragment, { children: _jsx(TanStackDevtools, { config: { requireUrlFlag: true, position: "bottom-left" }, plugins: [
37
+ {
38
+ name: "TanStack Query",
39
+ render: _jsx(ReactQueryDevtoolsPanel, {}),
40
+ defaultOpen: true,
41
+ },
42
+ {
43
+ name: "TanStack Router",
44
+ render: _jsx(TanStackRouterDevtoolsPanel, {}),
45
+ defaultOpen: false,
46
+ },
47
+ ] }) })), _jsx(Scripts, {})] })] }));
82
48
  }
83
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX19yb290LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL3JvdXRlcy9fX3Jvb3QudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDekMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFDM0QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0NBQWdDLENBQUE7QUFDeEUsT0FBTyxFQUNMLGVBQWUsRUFDZixXQUFXLEVBQ1gsTUFBTSxFQUNOLE9BQU8sRUFDUCxRQUFRLEdBQ1QsTUFBTSx3QkFBd0IsQ0FBQTtBQUMvQixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQTtBQUU3RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQTBCLENBQUE7QUFDakQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUNBQXdDLENBQUE7QUFDN0UsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDJCQUE0QixDQUFBO0FBQ3JELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx1QkFBd0IsQ0FBQTtBQUNoRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFDbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBQ3BELE9BQU8sY0FBYyxNQUFNLG9CQUFvQixDQUFBO0FBQy9DLE9BQU8sVUFBVSxNQUFNLDJCQUEyQixDQUFBO0FBQ2xELE9BQU8sV0FBVyxNQUFNLDRCQUE0QixDQUFBO0FBRXBELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUM7SUFDbkMsSUFBSSxFQUFFLEdBQUcsRUFBRTtRQUNULE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FDdkIsTUFBTSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLGNBQWMsRUFDL0MsTUFBTSxDQUFDLElBQUks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LEVBQzNELEtBQUMsT0FBTyxJQUFDLFFBQVEsRUFBQyxZQUFZLEdBQUcsRUFDakMsS0FBQyxnQkFBZ0IsSUFDZixNQUFNLEVBQUUsRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsRUFDekQsT0FBTyxFQUFFOzRCQUNQO2dDQUNFLElBQUksRUFBRSxnQkFBZ0I7Z0NBQ3RCLE1BQU0sRUFBRSxLQUFDLHVCQUF1QixLQUFHO2dDQUNuQyxXQUFXLEVBQUUsSUFBSTs2QkFDbEI7NEJBQ0Q7Z0NBQ0UsSUFBSSxFQUFFLGlCQUFpQjtnQ0FDdkIsTUFBTSxFQUFFLEtBQUMsMkJBQTJCLEtBQUc7Z0NBQ3ZDLFdBQVcsRUFBRSxLQUFLOzZCQUNuQjt5QkFDRixHQUNELEVBQ0YsS0FBQyxPQUFPLEtBQUc7b0JBQ047WUFDRixDQUNSLENBQUE7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29uZmlnIH0gZnJvbSBcImxpdmVtYXJrOnZpcnR1YWxcIlxuaW1wb3J0IHsgVGFuU3RhY2tEZXZ0b29scyB9IGZyb20gXCJAdGFuc3RhY2svcmVhY3QtZGV2dG9vbHNcIlxuaW1wb3J0IHsgUmVhY3RRdWVyeURldnRvb2xzUGFuZWwgfSBmcm9tIFwiQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5LWRldnRvb2xzXCJcbmltcG9ydCB7XG4gIGNyZWF0ZVJvb3RSb3V0ZSxcbiAgSGVhZENvbnRlbnQsXG4gIE91dGxldCxcbiAgU2NyaXB0cyxcbiAgdXNlTWF0Y2gsXG59IGZyb20gXCJAdGFuc3RhY2svcmVhY3Qtcm91dGVyXCJcbmltcG9ydCB7IFRhblN0YWNrUm91dGVyRGV2dG9vbHNQYW5lbCB9IGZyb20gXCJAdGFuc3RhY2svcmVhY3Qtcm91dGVyLWRldnRvb2xzXCJcbmltcG9ydCB0eXBlICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCJcbmltcG9ydCB7IExheW91dCB9IGZyb20gXCIuLi9jb21wb25lbnRzL0xheW91dC50c3hcIlxuaW1wb3J0IHsgRGVmYXVsdENhdGNoQm91bmRhcnkgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9EZWZhdWx0Q2F0Y2hCb3VuZGFyeS50c3hcIlxuaW1wb3J0IHsgTm90Rm91bmQgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9Ob3RGb3VuZC50c3hcIlxuaW1wb3J0IHsgVG9hc3RlciB9IGZyb20gXCIuLi9lbGVtZW50cy9zb25uZXIudHN4XCJcbmltcG9ydCB7IGZhdmljb25UeXBlIH0gZnJvbSBcIi4uL2hlbHBlcnMvZmF2aWNvbi50c1wiXG5pbXBvcnQgeyBwcmVmaXhVcmwgfSBmcm9tIFwiLi4vaGVscGVycy9wcmVmaXgtdXJsLnRzXCJcbmltcG9ydCBkZWZhdWx0RmF2aWNvbiBmcm9tIFwiLi4vYXNzZXRzL2xvZ28uc3ZnXCJcbmltcG9ydCBnZW5lcmFsQ3NzIGZyb20gXCIuLi9zdHlsZXMvZ2VuZXJhbC5jc3M/dXJsXCJcbmltcG9ydCBtYXJrZG93bkNzcyBmcm9tIFwiLi4vc3R5bGVzL21hcmtkb3duLmNzcz91cmxcIlxuXG5leHBvcnQgY29uc3QgUm91dGUgPSBjcmVhdGVSb290Um91dGUoe1xuICBoZWFkOiAoKSA9PiB7XG4gICAgY29uc3QgZmF2aWNvbiA9IHByZWZpeFVybChcbiAgICAgIGNvbmZpZy5mYXZpY29uID8/IGNvbmZpZy5sb2dvID8/IGRlZmF1bHRGYXZpY29uLFxuICAgICAgY29uZmlnLmJhc2UsXG4gICAgKVxuICAgIGNvbnN0IGZlZWRMaW5rcyA9IGNvbmZpZy5zaXRlXG4gICAgICA/IChjb25maWcuc2VjdGlvbnMgPz8gW10pXG4gICAgICAgICAgLmZpbHRlcihzID0+IHMudHlwZSA9PT0gXCJibG9nXCIpXG4gICAgICAgICAgLm1hcChzID0+ICh7XG4gICAgICAgICAgICByZWw6IFwiYWx0ZXJuYXRlXCIsXG4gICAgICAgICAgICB0eXBlOiBcImFwcGxpY2F0aW9uL3Jzcyt4bWxcIixcbiAgICAgICAgICAgIHRpdGxlOiBgJHtzLnNpdGVUaXRsZSA/PyBzLnRpdGxlfSBSU1MgRmVlZGAsXG4gICAgICAgICAgICBocmVmOiBwcmVmaXhVcmwoYCR7cy5wcmVmaXh9cnNzLnhtbGAsIGNvbmZpZy5iYXNlKSxcbiAgICAgICAgICB9KSlcbiAgICAgIDogW11cbiAgICByZXR1cm4ge1xuICAgICAgbWV0YTogW1xuICAgICAgICB7IGNoYXJTZXQ6IFwidXRmLThcIiB9LFxuICAgICAgICB7IHRpdGxlOiBjb25maWcudGl0bGUgfSxcbiAgICAgICAgeyBuYW1lOiBcImRlc2NyaXB0aW9uXCIsIGNvbnRlbnQ6IGNvbmZpZy5kZXNjcmlwdGlvbiB9LFxuICAgICAgICB7IHByb3BlcnR5OiBcIm9nOnRpdGxlXCIsIGNvbnRlbnQ6IGNvbmZpZy50aXRsZSB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvcGVydHk6IFwib2c6ZGVzY3JpcHRpb25cIixcbiAgICAgICAgICBjb250ZW50OiBjb25maWcuZGVzY3JpcHRpb24sXG4gICAgICAgIH0sXG4gICAgICAgIHsgcHJvcGVydHk6IFwib2c6c2l0ZV9uYW1lXCIsIGNvbnRlbnQ6IGNvbmZpZy50aXRsZSB9LFxuICAgICAgICB7IHByb3BlcnR5OiBcIm9nOnR5cGVcIiwgY29udGVudDogXCJ3ZWJzaXRlXCIgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwidmlld3BvcnRcIixcbiAgICAgICAgICBjb250ZW50OiBcIndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgbGlua3M6IFtcbiAgICAgICAgeyByZWw6IFwiaWNvblwiLCBocmVmOiBmYXZpY29uLCB0eXBlOiBmYXZpY29uVHlwZShmYXZpY29uKSB9LFxuICAgICAgICB7IHJlbDogXCJzaG9ydGN1dCBpY29uXCIsIGhyZWY6IGZhdmljb24sIHR5cGU6IGZhdmljb25UeXBlKGZhdmljb24pIH0sXG4gICAgICAgIHsgcmVsOiBcInN0eWxlc2hlZXRcIiwgaHJlZjogZ2VuZXJhbENzcyB9LFxuICAgICAgICB7IHJlbDogXCJzdHlsZXNoZWV0XCIsIGhyZWY6IG1hcmtkb3duQ3NzIH0sXG4gICAgICAgIC4uLmZlZWRMaW5rcyxcbiAgICAgIF0sXG4gICAgfVxuICB9LFxuICBub3RGb3VuZENvbXBvbmVudDogKCkgPT4gPE5vdEZvdW5kIC8+LFxuICBlcnJvckNvbXBvbmVudDogcHJvcHMgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICA8RG9jdW1lbnQ+XG4gICAgICAgIDxEZWZhdWx0Q2F0Y2hCb3VuZGFyeSB7Li4ucHJvcHN9IC8+XG4gICAgICA8L0RvY3VtZW50PlxuICAgIClcbiAgfSxcbiAgY29tcG9uZW50OiAoKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxEb2N1bWVudD5cbiAgICAgICAgPE91dGxldCAvPlxuICAgICAgPC9Eb2N1bWVudD5cbiAgICApXG4gIH0sXG59KVxuXG5mdW5jdGlvbiBEb2N1bWVudChwcm9wczogeyBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlIH0pIHtcbiAgY29uc3QgYXJ0aWNsZVJvdXRlID0gdXNlTWF0Y2goeyBmcm9tOiBcIi8kXCIsIHNob3VsZFRocm93OiBmYWxzZSB9KVxuICBjb25zdCB3aXRoU2lkZWJhciA9IGFydGljbGVSb3V0ZT8ubG9hZGVyRGF0YT8uc2lkZWJhclxuXG4gIHJldHVybiAoXG4gICAgPGh0bWwgbGFuZz1cImVuXCI+XG4gICAgICA8aGVhZD5cbiAgICAgICAgPEhlYWRDb250ZW50IC8+XG4gICAgICA8L2hlYWQ+XG4gICAgICA8Ym9keT5cbiAgICAgICAgPExheW91dCB3aXRoU2lkZWJhcj17d2l0aFNpZGViYXJ9Pntwcm9wcy5jaGlsZHJlbn08L0xheW91dD5cbiAgICAgICAgPFRvYXN0ZXIgcG9zaXRpb249XCJ0b3AtY2VudGVyXCIgLz5cbiAgICAgICAgPFRhblN0YWNrRGV2dG9vbHNcbiAgICAgICAgICBjb25maWc9e3sgaGlkZVVudGlsSG92ZXI6IHRydWUsIHBvc2l0aW9uOiBcImJvdHRvbS1sZWZ0XCIgfX1cbiAgICAgICAgICBwbHVnaW5zPXtbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6IFwiVGFuU3RhY2sgUXVlcnlcIixcbiAgICAgICAgICAgICAgcmVuZGVyOiA8UmVhY3RRdWVyeURldnRvb2xzUGFuZWwgLz4sXG4gICAgICAgICAgICAgIGRlZmF1bHRPcGVuOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogXCJUYW5TdGFjayBSb3V0ZXJcIixcbiAgICAgICAgICAgICAgcmVuZGVyOiA8VGFuU3RhY2tSb3V0ZXJEZXZ0b29sc1BhbmVsIC8+LFxuICAgICAgICAgICAgICBkZWZhdWx0T3BlbjogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF19XG4gICAgICAgIC8+XG4gICAgICAgIDxTY3JpcHRzIC8+XG4gICAgICA8L2JvZHk+XG4gICAgPC9odG1sPlxuICApXG59XG4iXX0=
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX19yb290LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL3JvdXRlcy9fX3Jvb3QudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDekMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFDM0QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0NBQWdDLENBQUE7QUFDeEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQ3RGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGlDQUFpQyxDQUFBO0FBRTdFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxPQUFPLENBQUE7QUFDakMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHlCQUEwQixDQUFBO0FBQ2pELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSx1QkFBd0IsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1Q0FBd0MsQ0FBQTtBQUM3RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMkJBQTRCLENBQUE7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBQ2xELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx1QkFBd0IsQ0FBQTtBQUNoRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQ2hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDMUMsT0FBTyxjQUFjLE1BQU0sb0JBQW9CLENBQUE7QUFDL0MsT0FBTyxVQUFVLE1BQU0sMkJBQTJCLENBQUE7QUFDbEQsT0FBTyxXQUFXLE1BQU0sNEJBQTRCLENBQUE7QUFFcEQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQztJQUNuQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQ1QsYUFBYSxDQUNYLGFBQWEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FDbEY7SUFDSCxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUN2QixLQUFDLE1BQU0sY0FDTCxLQUFDLFFBQVEsS0FBRyxHQUNMLENBQ1Y7SUFDRCxjQUFjLEVBQUUsS0FBSyxDQUFDLEVBQUU7UUFDdEIsT0FBTyxDQUNMLEtBQUMsUUFBUSxjQUNQLEtBQUMsTUFBTSxjQUNMLEtBQUMsb0JBQW9CLE9BQUssS0FBSyxHQUFJLEdBQzVCLEdBQ0EsQ0FDWixDQUFBO0lBQ0gsQ0FBQztJQUNELFNBQVMsRUFBRSxHQUFHLEVBQUU7UUFDZCxPQUFPLENBQ0wsS0FBQyxRQUFRLGNBQ1AsS0FBQyxNQUFNLEtBQUcsR0FDRCxDQUNaLENBQUE7SUFDSCxDQUFDO0NBQ0YsQ0FBQyxDQUFBO0FBRUYsU0FBUyxRQUFRLENBQUMsS0FBb0M7SUFDcEQsZ0ZBQWdGO0lBQ2hGLHVDQUF1QztJQUN2QyxNQUFNLFFBQVEsR0FBRyxXQUFXLEVBQUUsQ0FBQTtJQUM5QixNQUFNLFFBQVEsR0FBRyxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLENBQUE7SUFFakYsU0FBUyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUV6QixPQUFPLENBQ0wsZ0JBQU0sSUFBSSxFQUFDLElBQUksRUFBQyx3QkFBd0IsbUJBQ3RDLHlCQUNFLEtBQUMsV0FBVyxLQUFHLEdBQ1YsRUFDUCwyQkFDRSxLQUFDLElBQUksY0FBRSxLQUFLLENBQUMsUUFBUSxHQUFRLEVBQzdCLEtBQUMsT0FBTyxJQUFDLFFBQVEsRUFBQyxZQUFZLEdBQUcsRUFNaEMsUUFBUSxJQUFJLENBQ1gsNEJBQ0UsS0FBQyxnQkFBZ0IsSUFDZixNQUFNLEVBQUUsRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsRUFDekQsT0FBTyxFQUFFO2dDQUNQO29DQUNFLElBQUksRUFBRSxnQkFBZ0I7b0NBQ3RCLE1BQU0sRUFBRSxLQUFDLHVCQUF1QixLQUFHO29DQUNuQyxXQUFXLEVBQUUsSUFBSTtpQ0FDbEI7Z0NBQ0Q7b0NBQ0UsSUFBSSxFQUFFLGlCQUFpQjtvQ0FDdkIsTUFBTSxFQUFFLEtBQUMsMkJBQTJCLEtBQUc7b0NBQ3ZDLFdBQVcsRUFBRSxLQUFLO2lDQUNuQjs2QkFDRixHQUNELEdBQ0QsQ0FDSixFQUNELEtBQUMsT0FBTyxLQUFHLElBQ04sSUFDRixDQUNSLENBQUE7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29uZmlnIH0gZnJvbSBcImxpdmVtYXJrOnZpcnR1YWxcIlxuaW1wb3J0IHsgVGFuU3RhY2tEZXZ0b29scyB9IGZyb20gXCJAdGFuc3RhY2svcmVhY3QtZGV2dG9vbHNcIlxuaW1wb3J0IHsgUmVhY3RRdWVyeURldnRvb2xzUGFuZWwgfSBmcm9tIFwiQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5LWRldnRvb2xzXCJcbmltcG9ydCB7IGNyZWF0ZVJvb3RSb3V0ZSwgSGVhZENvbnRlbnQsIE91dGxldCwgU2NyaXB0cyB9IGZyb20gXCJAdGFuc3RhY2svcmVhY3Qtcm91dGVyXCJcbmltcG9ydCB7IFRhblN0YWNrUm91dGVyRGV2dG9vbHNQYW5lbCB9IGZyb20gXCJAdGFuc3RhY2svcmVhY3Qtcm91dGVyLWRldnRvb2xzXCJcbmltcG9ydCB0eXBlICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCJcbmltcG9ydCB7IHVzZUVmZmVjdCB9IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgeyBMYXlvdXQgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9MYXlvdXQudHN4XCJcbmltcG9ydCB7IFJvb3QgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9Sb290LnRzeFwiXG5pbXBvcnQgeyBEZWZhdWx0Q2F0Y2hCb3VuZGFyeSB9IGZyb20gXCIuLi9jb21wb25lbnRzL0RlZmF1bHRDYXRjaEJvdW5kYXJ5LnRzeFwiXG5pbXBvcnQgeyBOb3RGb3VuZCB9IGZyb20gXCIuLi9jb21wb25lbnRzL05vdEZvdW5kLnRzeFwiXG5pbXBvcnQgeyB1c2VIeWRyYXRlZCB9IGZyb20gXCIuLi9ob29rcy9oeWRyYXRlZC50c1wiXG5pbXBvcnQgeyBUb2FzdGVyIH0gZnJvbSBcIi4uL2VsZW1lbnRzL3Nvbm5lci50c3hcIlxuaW1wb3J0IHsgYnVpbGRSb290SGVhZCB9IGZyb20gXCIuLi9oZWxwZXJzL2hlYWQudHNcIlxuaW1wb3J0IHsgc3RhcnRUaGVtZSB9IGZyb20gXCIuLi9oZWxwZXJzL3RoZW1lLnRzXCJcbmltcG9ydCB7IGN1c3RvbWl6ZUhlYWQgfSBmcm9tIFwiLi4vaGVhZC50c1wiXG5pbXBvcnQgZGVmYXVsdEZhdmljb24gZnJvbSBcIi4uL2Fzc2V0cy9sb2dvLnN2Z1wiXG5pbXBvcnQgZ2VuZXJhbENzcyBmcm9tIFwiLi4vc3R5bGVzL2dlbmVyYWwuY3NzP3VybFwiXG5pbXBvcnQgbWFya2Rvd25Dc3MgZnJvbSBcIi4uL3N0eWxlcy9tYXJrZG93bi5jc3M/dXJsXCJcblxuZXhwb3J0IGNvbnN0IFJvdXRlID0gY3JlYXRlUm9vdFJvdXRlKHtcbiAgaGVhZDogKCkgPT5cbiAgICBjdXN0b21pemVIZWFkKFxuICAgICAgYnVpbGRSb290SGVhZCh7IGNvbmZpZywgZGVmYXVsdEZhdmljb24sIHN0eWxlc2hlZXRzOiBbZ2VuZXJhbENzcywgbWFya2Rvd25Dc3NdIH0pLFxuICAgICksXG4gIG5vdEZvdW5kQ29tcG9uZW50OiAoKSA9PiAoXG4gICAgPExheW91dD5cbiAgICAgIDxOb3RGb3VuZCAvPlxuICAgIDwvTGF5b3V0PlxuICApLFxuICBlcnJvckNvbXBvbmVudDogcHJvcHMgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICA8RG9jdW1lbnQ+XG4gICAgICAgIDxMYXlvdXQ+XG4gICAgICAgICAgPERlZmF1bHRDYXRjaEJvdW5kYXJ5IHsuLi5wcm9wc30gLz5cbiAgICAgICAgPC9MYXlvdXQ+XG4gICAgICA8L0RvY3VtZW50PlxuICAgIClcbiAgfSxcbiAgY29tcG9uZW50OiAoKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxEb2N1bWVudD5cbiAgICAgICAgPE91dGxldCAvPlxuICAgICAgPC9Eb2N1bWVudD5cbiAgICApXG4gIH0sXG59KVxuXG5mdW5jdGlvbiBEb2N1bWVudChwcm9wczogeyBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlIH0pIHtcbiAgLy8gT2ZmIHRoZSByYXcgVVJMLCBub3QgdGhlIHJvdXRlcidzIHBhcnNlZCBzZWFyY2g6IGEgcm91dGUgd2hvc2UgdmFsaWRhdGVTZWFyY2hcbiAgLy8gZG9lcyBub3QgZGVjbGFyZSB0aGlzIGtleSBzdHJpcHMgaXQuXG4gIGNvbnN0IGh5ZHJhdGVkID0gdXNlSHlkcmF0ZWQoKVxuICBjb25zdCBkZXZ0b29scyA9IGh5ZHJhdGVkICYmIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guaW5jbHVkZXMoXCJ0YW5zdGFjay1kZXZ0b29sc1wiKVxuXG4gIHVzZUVmZmVjdChzdGFydFRoZW1lLCBbXSlcblxuICByZXR1cm4gKFxuICAgIDxodG1sIGxhbmc9XCJlblwiIHN1cHByZXNzSHlkcmF0aW9uV2FybmluZz5cbiAgICAgIDxoZWFkPlxuICAgICAgICA8SGVhZENvbnRlbnQgLz5cbiAgICAgIDwvaGVhZD5cbiAgICAgIDxib2R5PlxuICAgICAgICA8Um9vdD57cHJvcHMuY2hpbGRyZW59PC9Sb290PlxuICAgICAgICA8VG9hc3RlciBwb3NpdGlvbj1cInRvcC1jZW50ZXJcIiAvPlxuICAgICAgICB7LyogR2F0ZWQgaGVyZSwgbm90IGJ5IHRoZSBkZXZ0b29scycgb3duIGByZXF1aXJlVXJsRmxhZ2A6IHRoYXQgc2V0dGluZyBzZWVkc1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlIG9uIGEgYnJvd3NlcidzIGZpcnN0IHJ1biBhbmQgaXMgcmVhZCBmcm9tIHRoZXJlIGFmdGVyd2FyZHMsXG4gICAgICAgICAgICBzbyBhIGJyb3dzZXIgdGhhdCBsb2FkZWQgdGhlIHNpdGUgYmVmb3JlIGl0IHdhcyBzZXQga2VlcHMgdGhlIHRyaWdnZXIuICovfVxuICAgICAgICB7LyogVGhlIGJ1aWxkIHN0cmlwcyB0aGUgZGV2dG9vbHMgZWxlbWVudCBhbG9uZTsgdGhlIGZyYWdtZW50IGtlZXBzXG4gICAgICAgICAgICBgZGV2dG9vbHMgJiYgKDw+PC8+KWAgdmFsaWQgaW5zdGVhZCBvZiB0aGUgc3ludGF4IGVycm9yIGAmJiAoKWAuICovfVxuICAgICAgICB7ZGV2dG9vbHMgJiYgKFxuICAgICAgICAgIDw+XG4gICAgICAgICAgICA8VGFuU3RhY2tEZXZ0b29sc1xuICAgICAgICAgICAgICBjb25maWc9e3sgcmVxdWlyZVVybEZsYWc6IHRydWUsIHBvc2l0aW9uOiBcImJvdHRvbS1sZWZ0XCIgfX1cbiAgICAgICAgICAgICAgcGx1Z2lucz17W1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IFwiVGFuU3RhY2sgUXVlcnlcIixcbiAgICAgICAgICAgICAgICAgIHJlbmRlcjogPFJlYWN0UXVlcnlEZXZ0b29sc1BhbmVsIC8+LFxuICAgICAgICAgICAgICAgICAgZGVmYXVsdE9wZW46IHRydWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBcIlRhblN0YWNrIFJvdXRlclwiLFxuICAgICAgICAgICAgICAgICAgcmVuZGVyOiA8VGFuU3RhY2tSb3V0ZXJEZXZ0b29sc1BhbmVsIC8+LFxuICAgICAgICAgICAgICAgICAgZGVmYXVsdE9wZW46IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvPlxuICAgICAgICApfVxuICAgICAgICA8U2NyaXB0cyAvPlxuICAgICAgPC9ib2R5PlxuICAgIDwvaHRtbD5cbiAgKVxufVxuIl19