@epic-web/workshop-app 5.6.0 → 5.7.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 (143) hide show
  1. package/build/client/assets/{_-hAKYb2AG.js → _-CjjFMNGC.js} +2 -2
  2. package/build/client/assets/{_-hAKYb2AG.js.map → _-CjjFMNGC.js.map} +1 -1
  3. package/build/client/assets/_exerciseNumber-CqkGzsgV.js +2 -0
  4. package/build/client/assets/{_exerciseNumber-PTdG9GGB.js.map → _exerciseNumber-CqkGzsgV.js.map} +1 -1
  5. package/build/client/assets/{_exerciseNumber_._stepNumber-03erOIGo.js → _exerciseNumber_._stepNumber-BNWGPi9m.js} +2 -2
  6. package/build/client/assets/{_exerciseNumber_._stepNumber-03erOIGo.js.map → _exerciseNumber_._stepNumber-BNWGPi9m.js.map} +1 -1
  7. package/build/client/assets/_exerciseNumber_.finished-CdNhLhKg.js +2 -0
  8. package/build/client/assets/{_exerciseNumber_.finished-DQg4F1NL.js.map → _exerciseNumber_.finished-CdNhLhKg.js.map} +1 -1
  9. package/build/client/assets/_layout-BMa5nZcJ.js +2 -0
  10. package/build/client/assets/{_layout-DHoH74NH.js.map → _layout-BMa5nZcJ.js.map} +1 -1
  11. package/build/client/assets/{_layout-B4JGpA3A.js → _layout-CwTidn3v.js} +2 -2
  12. package/build/client/assets/{_layout-B4JGpA3A.js.map → _layout-CwTidn3v.js.map} +1 -1
  13. package/build/client/assets/{_layout-BJbMl6SJ.js → _layout-DV29dlKr.js} +2 -2
  14. package/build/client/assets/{_layout-BJbMl6SJ.js.map → _layout-DV29dlKr.js.map} +1 -1
  15. package/build/client/assets/{_layout-Bu0lel3p.js → _layout-Muw3ERYT.js} +3 -3
  16. package/build/client/assets/{_layout-Bu0lel3p.js.map → _layout-Muw3ERYT.js.map} +1 -1
  17. package/build/client/assets/{accordion-DLg7gJkp.js → accordion-C-sW--in.js} +2 -2
  18. package/build/client/assets/{accordion-DLg7gJkp.js.map → accordion-C-sW--in.js.map} +1 -1
  19. package/build/client/assets/account-Cc968svU.js +2 -0
  20. package/build/client/assets/account-Cc968svU.js.map +1 -0
  21. package/build/client/assets/app-BOqXK9hi.js +2 -0
  22. package/build/client/assets/{app-DJDjmdlu.js.map → app-BOqXK9hi.js.map} +1 -1
  23. package/build/client/assets/{button-39zQyNX6.js → button-BS845Tjo.js} +2 -2
  24. package/build/client/assets/{button-39zQyNX6.js.map → button-BS845Tjo.js.map} +1 -1
  25. package/build/client/assets/{components-DUNtf72c.js → components-DrvY4pal.js} +4 -4
  26. package/build/client/assets/{components-DUNtf72c.js.map → components-DrvY4pal.js.map} +1 -1
  27. package/build/client/assets/diff-D0e_PrB7.js +2 -0
  28. package/build/client/assets/{diff-B3oaU_KB.js.map → diff-D0e_PrB7.js.map} +1 -1
  29. package/build/client/assets/{diff-BNCREJvf.js → diff-DtvfyjPI.js} +2 -2
  30. package/build/client/assets/{diff-BNCREJvf.js.map → diff-DtvfyjPI.js.map} +1 -1
  31. package/build/client/assets/{discord-CEOqKs_c.js → discord-BfP_Rny5.js} +2 -2
  32. package/build/client/assets/{discord-CEOqKs_c.js.map → discord-BfP_Rny5.js.map} +1 -1
  33. package/build/client/assets/discord-DILzAZN8.js +2 -0
  34. package/build/client/assets/discord-DILzAZN8.js.map +1 -0
  35. package/build/client/assets/{entry.client-CrlHhRMR.js → entry.client-CQusg5Iz.js} +2 -2
  36. package/build/client/assets/{entry.client-CrlHhRMR.js.map → entry.client-CQusg5Iz.js.map} +1 -1
  37. package/build/client/assets/epic-video-qHKPWPt1.js +3053 -0
  38. package/build/client/assets/epic-video-qHKPWPt1.js.map +1 -0
  39. package/build/client/assets/error-boundary-Beul7lrT.js +2 -0
  40. package/build/client/assets/{error-boundary-3zItlMUO.js.map → error-boundary-Beul7lrT.js.map} +1 -1
  41. package/build/client/assets/finished-DUKfL220.js +2 -0
  42. package/build/client/assets/{finished-rUzUjnEm.js.map → finished-DUKfL220.js.map} +1 -1
  43. package/build/client/assets/{index-CV3nxGFp.js → index-BHwOR8R1.js} +2 -2
  44. package/build/client/assets/{index-CV3nxGFp.js.map → index-BHwOR8R1.js.map} +1 -1
  45. package/build/client/assets/index-BOQWfIQC.js +36 -0
  46. package/build/client/assets/index-BOQWfIQC.js.map +1 -0
  47. package/build/client/assets/{index-DFqQCjCw.js → index-BPegC-d3.js} +2 -2
  48. package/build/client/assets/{index-DFqQCjCw.js.map → index-BPegC-d3.js.map} +1 -1
  49. package/build/client/assets/{index-LjRZeU7x.js → index-CB8bjE90.js} +2 -2
  50. package/build/client/assets/{index-LjRZeU7x.js.map → index-CB8bjE90.js.map} +1 -1
  51. package/build/client/assets/{index-C_B1-9rF.js → index-CGzylDPY.js} +2 -2
  52. package/build/client/assets/{index-C_B1-9rF.js.map → index-CGzylDPY.js.map} +1 -1
  53. package/build/client/assets/index-DbCT6N5p.js +2 -0
  54. package/build/client/assets/{index-DE-jwnOP.js.map → index-DbCT6N5p.js.map} +1 -1
  55. package/build/client/assets/{index-DDqzbGM2.js → index-cZQeGrqL.js} +2 -2
  56. package/build/client/assets/{index-DDqzbGM2.js.map → index-cZQeGrqL.js.map} +1 -1
  57. package/build/client/assets/{index-CLNXC84j.js → index-egcHQOpF.js} +2 -2
  58. package/build/client/assets/{index-CLNXC84j.js.map → index-egcHQOpF.js.map} +1 -1
  59. package/build/client/assets/index-oED4uZLa.js +2 -0
  60. package/build/client/assets/{index-mivnjq36.js.map → index-oED4uZLa.js.map} +1 -1
  61. package/build/client/assets/{loading-DW_I206H.js → loading-C2wPVvQw.js} +2 -2
  62. package/build/client/assets/{loading-DW_I206H.js.map → loading-C2wPVvQw.js.map} +1 -1
  63. package/build/client/assets/login-DoU7gifi.js +2 -0
  64. package/build/client/assets/{login-CdNej0Z7.js.map → login-DoU7gifi.js.map} +1 -1
  65. package/build/client/assets/manifest-93f34003.js +1 -0
  66. package/build/client/assets/mdx-CsS30JUo.js +2 -0
  67. package/build/client/assets/{mdx-C9dqA6IZ.js.map → mdx-CsS30JUo.js.map} +1 -1
  68. package/build/client/assets/{misc-DIdEn_jt.js → misc-BtjCSy-T.js} +2 -2
  69. package/build/client/assets/{misc-DIdEn_jt.js.map → misc-BtjCSy-T.js.map} +1 -1
  70. package/build/client/assets/{nav-chevrons-B3SvZV8B.js → nav-chevrons-2hLTwAZb.js} +2 -2
  71. package/build/client/assets/{nav-chevrons-B3SvZV8B.js.map → nav-chevrons-2hLTwAZb.js.map} +1 -1
  72. package/build/client/assets/onboarding-Cu6eD7KS.js +2 -0
  73. package/build/client/assets/{onboarding-CC9zz4rl.js.map → onboarding-Cu6eD7KS.js.map} +1 -1
  74. package/build/client/assets/{pe-D5h19vSo.js → pe-DXT2FOp1.js} +2 -2
  75. package/build/client/assets/{pe-D5h19vSo.js.map → pe-DXT2FOp1.js.map} +1 -1
  76. package/build/client/assets/preferences-br0VSK51.js +2 -0
  77. package/build/client/assets/preferences-br0VSK51.js.map +1 -0
  78. package/build/client/assets/{presence-D1DPz__2.js → presence-CrYBA3ta.js} +3 -3
  79. package/build/client/assets/{presence-D1DPz__2.js.map → presence-CrYBA3ta.js.map} +1 -1
  80. package/build/client/assets/preview-C2y4Z0qO.js +2 -0
  81. package/build/client/assets/{preview-BEtmdi0E.js.map → preview-C2y4Z0qO.js.map} +1 -1
  82. package/build/client/assets/{product-CYOFfeJM.js → product-gqq_YQBW.js} +2 -2
  83. package/build/client/assets/{product-CYOFfeJM.js.map → product-gqq_YQBW.js.map} +1 -1
  84. package/build/client/assets/{progress-D6SP0Gec.js → progress-D-HsH4j3.js} +2 -2
  85. package/build/client/assets/{progress-D6SP0Gec.js.map → progress-D-HsH4j3.js.map} +1 -1
  86. package/build/client/assets/{progress-bar-CBDBzRQ2.js → progress-bar-CTPCfvDi.js} +2 -2
  87. package/build/client/assets/{progress-bar-CBDBzRQ2.js.map → progress-bar-CTPCfvDi.js.map} +1 -1
  88. package/build/client/assets/revalidation-ws-DYaJNyw1.js +2 -0
  89. package/build/client/assets/{revalidation-ws-DK5QOPlL.js.map → revalidation-ws-DYaJNyw1.js.map} +1 -1
  90. package/build/client/assets/{root-Bg-hxaOK.js → root-DGY0y7_0.js} +3 -3
  91. package/build/client/assets/{root-Bg-hxaOK.js.map → root-DGY0y7_0.js.map} +1 -1
  92. package/build/client/assets/{set-playground-CMoUFgkO.js → set-playground-DQzAhC0t.js} +2 -2
  93. package/build/client/assets/{set-playground-CMoUFgkO.js.map → set-playground-DQzAhC0t.js.map} +1 -1
  94. package/build/client/assets/{support-CPzYlWkd.js → support-lgEG2piy.js} +2 -2
  95. package/build/client/assets/{support-CPzYlWkd.js.map → support-lgEG2piy.js.map} +1 -1
  96. package/build/client/assets/tailwind-CRGTilRc.css +1 -0
  97. package/build/client/assets/test-CDWRwwO-.js +2 -0
  98. package/build/client/assets/{test-C8wkLh9a.js.map → test-CDWRwwO-.js.map} +1 -1
  99. package/build/client/assets/{tests-CiM4RPOf.js → tests-LWW8wCYZ.js} +3 -3
  100. package/build/client/assets/{tests-CiM4RPOf.js.map → tests-LWW8wCYZ.js.map} +1 -1
  101. package/build/client/assets/{tooltip-BoVikCa-.js → tooltip-Bp9KHnLy.js} +2 -2
  102. package/build/client/assets/{tooltip-BoVikCa-.js.map → tooltip-Bp9KHnLy.js.map} +1 -1
  103. package/build/client/assets/{use-event-source-M87p8Tme.js → use-event-source-AZJtQsFX.js} +2 -2
  104. package/build/client/assets/{use-event-source-M87p8Tme.js.map → use-event-source-AZJtQsFX.js.map} +1 -1
  105. package/build/client/assets/{user-CbbIYEs8.js → user-C0j04V55.js} +2 -2
  106. package/build/client/assets/{user-CbbIYEs8.js.map → user-C0j04V55.js.map} +1 -1
  107. package/build/client/assets/{version-CIF3cX3N.js → version-D61Qvt0X.js} +2 -2
  108. package/build/client/assets/{version-CIF3cX3N.js.map → version-D61Qvt0X.js.map} +1 -1
  109. package/build/client/assets/{workshop-config-C5sYl312.js → workshop-config-oL_FWDKq.js} +2 -2
  110. package/build/client/assets/{workshop-config-C5sYl312.js.map → workshop-config-oL_FWDKq.js.map} +1 -1
  111. package/build/server/index.js +516 -444
  112. package/build/server/index.js.map +1 -1
  113. package/package.json +3 -3
  114. package/build/client/assets/_exerciseNumber-PTdG9GGB.js +0 -2
  115. package/build/client/assets/_exerciseNumber_.finished-DQg4F1NL.js +0 -2
  116. package/build/client/assets/_layout-DHoH74NH.js +0 -2
  117. package/build/client/assets/account-DLDPrc9J.js +0 -2
  118. package/build/client/assets/account-DLDPrc9J.js.map +0 -1
  119. package/build/client/assets/app-DJDjmdlu.js +0 -2
  120. package/build/client/assets/diff-B3oaU_KB.js +0 -2
  121. package/build/client/assets/discord-CpIgvYus.js +0 -2
  122. package/build/client/assets/discord-CpIgvYus.js.map +0 -1
  123. package/build/client/assets/epic-video-D8ex9vao.js +0 -2
  124. package/build/client/assets/epic-video-D8ex9vao.js.map +0 -1
  125. package/build/client/assets/error-boundary-3zItlMUO.js +0 -2
  126. package/build/client/assets/finished-rUzUjnEm.js +0 -2
  127. package/build/client/assets/index-BajUQsFT.js +0 -3053
  128. package/build/client/assets/index-BajUQsFT.js.map +0 -1
  129. package/build/client/assets/index-DE-jwnOP.js +0 -2
  130. package/build/client/assets/index-DH1w3QmP.js +0 -36
  131. package/build/client/assets/index-DH1w3QmP.js.map +0 -1
  132. package/build/client/assets/index-mivnjq36.js +0 -2
  133. package/build/client/assets/login-CdNej0Z7.js +0 -2
  134. package/build/client/assets/manifest-62ea49c4.js +0 -1
  135. package/build/client/assets/mdx-C9dqA6IZ.js +0 -2
  136. package/build/client/assets/onboarding-CC9zz4rl.js +0 -2
  137. package/build/client/assets/preview-BEtmdi0E.js +0 -2
  138. package/build/client/assets/request-info-vBkaf3Rk.js +0 -2
  139. package/build/client/assets/request-info-vBkaf3Rk.js.map +0 -1
  140. package/build/client/assets/revalidation-ws-DK5QOPlL.js +0 -2
  141. package/build/client/assets/tailwind-B5AAMtGC.css +0 -1
  142. package/build/client/assets/test-C8wkLh9a.js +0 -2
  143. /package/build/client/assets/{index-DUnRvy1A.css → epic-video-DUnRvy1A.css} +0 -0
@@ -7,7 +7,7 @@ import { renderToPipeableStream, renderToStaticMarkup } from "react-dom/server";
7
7
  import path from "node:path";
8
8
  import { makeSingletonCache, cachified, deleteCache, compiledCodeCache, diffFilesCache, diffCodeCache, shouldForceFresh, fsCache, getAllFileCacheEntries, ogCache } from "@epic-web/workshop-utils/cache.server";
9
9
  import { getWorkshopConfig } from "@epic-web/workshop-utils/config.server";
10
- import { getAuthInfo, getPreferences, readOnboardingData, requireAuthInfo, PlayerPreferencesSchema, setPlayerPreferences, deleteDb, setPresencePreferences, setAuthInfo, markOnboardingVideoWatched } from "@epic-web/workshop-utils/db.server";
10
+ import { getAuthInfo, getPreferences, readOnboardingData, requireAuthInfo, deleteDb, setPreferences, PlayerPreferencesSchema, setAuthInfo, markOnboardingVideoWatched } from "@epic-web/workshop-utils/db.server";
11
11
  import { getUserInfo, userHasAccessToWorkshop, getProgress, updateProgress, getEpicVideoInfos } from "@epic-web/workshop-utils/epic-api.server";
12
12
  import { getUserId, getSetClientIdCookieHeader } from "@epic-web/workshop-utils/user.server";
13
13
  import { z } from "zod";
@@ -41,7 +41,6 @@ import { motion, useAnimationControls } from "framer-motion";
41
41
  import { useHydrated } from "remix-utils/use-hydrated";
42
42
  import * as DialogPrimitive from "@radix-ui/react-dialog";
43
43
  import { invariantResponse, invariant } from "@epic-web/invariant";
44
- import RealMuxPlayer, { MinResolution, MaxResolution } from "@mux/mux-player-react";
45
44
  import path$1 from "path";
46
45
  import etag from "etag";
47
46
  import fsExtra from "fs-extra";
@@ -50,6 +49,7 @@ import fs from "fs";
50
49
  import { getDirModifiedTime, modifiedMoreRecentlyThan } from "@epic-web/workshop-utils/modified-time.server";
51
50
  import * as esbuild from "esbuild";
52
51
  import { ElementScrollRestoration } from "@epic-web/restore-scroll";
52
+ import RealMuxPlayer, { MinResolution, MaxResolution } from "@mux/mux-player-react";
53
53
  import child_process from "child_process";
54
54
  import os from "os";
55
55
  import shellQuote from "shell-quote";
@@ -437,6 +437,12 @@ const extendedTheme = {
437
437
  h5: ["1.5rem", { lineHeight: "2rem", fontWeight: "700" }],
438
438
  /** 16px size / 20px high / bold */
439
439
  h6: ["1rem", { lineHeight: "1.25rem", fontWeight: "700" }],
440
+ /** 48px size / 52px high / normal */
441
+ "body-5xl": ["3rem", { lineHeight: "3.25rem" }],
442
+ /** 40px size / 44px high / normal */
443
+ "body-4xl": ["2.5rem", { lineHeight: "2.75rem" }],
444
+ /** 36px size / 40px high / normal */
445
+ "body-3xl": ["2.25rem", { lineHeight: "2.5rem" }],
440
446
  /** 32px size / 36px high / normal */
441
447
  "body-2xl": ["2rem", { lineHeight: "2.25rem" }],
442
448
  /** 28px size / 36px high / normal */
@@ -845,7 +851,7 @@ const ROUTE_PATH = "/theme";
845
851
  const ThemeFormSchema = z.object({
846
852
  theme: z.enum(["system", "light", "dark"])
847
853
  });
848
- async function action$b({ request }) {
854
+ async function action$c({ request }) {
849
855
  const formData = await request.formData();
850
856
  const submission = parseWithZod(formData, {
851
857
  schema: ThemeFormSchema
@@ -915,14 +921,14 @@ function useTheme() {
915
921
  }
916
922
  return requestInfo.session.theme ?? hints.theme;
917
923
  }
918
- const route44 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
924
+ const route45 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
919
925
  __proto__: null,
920
926
  ThemeSwitch,
921
- action: action$b,
927
+ action: action$c,
922
928
  useTheme
923
929
  }, Symbol.toStringTag, { value: "Module" }));
924
930
  const appStylesheetUrl = "/assets/app-b7uXHF5m.css";
925
- const tailwindStylesheetUrl = "/assets/tailwind-B5AAMtGC.css";
931
+ const tailwindStylesheetUrl = "/assets/tailwind-CRGTilRc.css";
926
932
  const cookieName = "EpicShop_confetti";
927
933
  function getConfetti(request) {
928
934
  const cookieHeader = request.headers.get("cookie");
@@ -1189,7 +1195,7 @@ const meta$6 = ({ data: data2 }) => {
1189
1195
  requestInfo: data2.requestInfo
1190
1196
  });
1191
1197
  };
1192
- async function loader$x({ request }) {
1198
+ async function loader$y({ request }) {
1193
1199
  var _a;
1194
1200
  const timings = makeTimings("rootLoader");
1195
1201
  const workshopConfig = getWorkshopConfig();
@@ -1267,9 +1273,10 @@ async function loader$x({ request }) {
1267
1273
  function Document({
1268
1274
  children,
1269
1275
  env = {},
1270
- className
1276
+ className,
1277
+ style
1271
1278
  }) {
1272
- return /* @__PURE__ */ jsxs("html", { lang: "en", className, children: [
1279
+ return /* @__PURE__ */ jsxs("html", { lang: "en", className, style, children: [
1273
1280
  /* @__PURE__ */ jsxs("head", { children: [
1274
1281
  /* @__PURE__ */ jsx(ClientHintCheck, {}),
1275
1282
  /* @__PURE__ */ jsx(Meta, {}),
@@ -1293,6 +1300,7 @@ function Document({
1293
1300
  ] });
1294
1301
  }
1295
1302
  function App$1() {
1303
+ var _a, _b;
1296
1304
  const data2 = useLoaderData();
1297
1305
  const navigation = useNavigation();
1298
1306
  const showSpinner = useSpinDelay(navigation.state !== "idle", {
@@ -1304,6 +1312,7 @@ function App$1() {
1304
1312
  return /* @__PURE__ */ jsxs(
1305
1313
  Document,
1306
1314
  {
1315
+ style: ((_a = data2.preferences) == null ? void 0 : _a.fontSize) ? { fontSize: `${(_b = data2.preferences) == null ? void 0 : _b.fontSize}px` } : {},
1307
1316
  className: cn(
1308
1317
  "antialiased h-screen-safe",
1309
1318
  theme,
@@ -1332,10 +1341,10 @@ const route0 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProper
1332
1341
  ErrorBoundary: ErrorBoundary$6,
1333
1342
  default: AppWithProviders,
1334
1343
  links,
1335
- loader: loader$x,
1344
+ loader: loader$y,
1336
1345
  meta: meta$6
1337
1346
  }, Symbol.toStringTag, { value: "Module" }));
1338
- async function loader$w({ params }) {
1347
+ async function loader$x({ params }) {
1339
1348
  const splat = params["*"];
1340
1349
  const segments = (splat == null ? void 0 : splat.split("/")) ?? [];
1341
1350
  if (segments.length > 0 && !isNaN(Number(segments[0]))) {
@@ -1373,7 +1382,7 @@ const route1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProper
1373
1382
  __proto__: null,
1374
1383
  ErrorBoundary: ErrorBoundary$5,
1375
1384
  default: NotFound,
1376
- loader: loader$w
1385
+ loader: loader$x
1377
1386
  }, Symbol.toStringTag, { value: "Module" }));
1378
1387
  function makeMediaQueryStore(mediaQuery, serverSnapshot) {
1379
1388
  function getSnapshot() {
@@ -1744,7 +1753,7 @@ function useProgressItem({
1744
1753
  }
1745
1754
  return null;
1746
1755
  }
1747
- async function action$a({ request }) {
1756
+ async function action$b({ request }) {
1748
1757
  ensureUndeployed();
1749
1758
  await requireAuthInfo({ request });
1750
1759
  const formData = await request.formData();
@@ -1912,10 +1921,10 @@ function ProgressToggle({
1912
1921
  )
1913
1922
  ] });
1914
1923
  }
1915
- const route38 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
1924
+ const route39 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
1916
1925
  __proto__: null,
1917
1926
  ProgressToggle,
1918
- action: action$a,
1927
+ action: action$b,
1919
1928
  useEpicProgress,
1920
1929
  useExerciseProgressClassName,
1921
1930
  useNextExerciseRoute,
@@ -1923,7 +1932,7 @@ const route38 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
1923
1932
  useProgressItemClassName,
1924
1933
  useRequireEpicProgress
1925
1934
  }, Symbol.toStringTag, { value: "Module" }));
1926
- async function loader$v({ request }) {
1935
+ async function loader$w({ request }) {
1927
1936
  var _a, _b;
1928
1937
  const timings = makeTimings("appLayoutLoader");
1929
1938
  const { title: workshopTitle } = getWorkshopConfig();
@@ -3021,7 +3030,7 @@ const route2 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProper
3021
3030
  __proto__: null,
3022
3031
  default: App,
3023
3032
  headers: headers$b,
3024
- loader: loader$v
3033
+ loader: loader$w
3025
3034
  }, Symbol.toStringTag, { value: "Module" }));
3026
3035
  function PendingState() {
3027
3036
  return /* @__PURE__ */ jsx("span", { className: "inline-block animate-spin", children: "🌀" });
@@ -3087,237 +3096,15 @@ function ButtonLink({
3087
3096
  }
3088
3097
  ) });
3089
3098
  }
3090
- const PlaybackTimeSchema = z.object({
3091
- time: z.number(),
3092
- expiresAt: z.string()
3093
- }).transform((data2) => {
3094
- return { time: Number(data2.time), expiresAt: new Date(data2.expiresAt) };
3095
- });
3096
- function usePlayerPreferences() {
3097
- var _a;
3098
- const data2 = useRouteLoaderData("root");
3099
- return ((_a = data2 == null ? void 0 : data2.preferences) == null ? void 0 : _a.player) ?? null;
3100
- }
3101
- const ignoredInputs = [
3102
- "INPUT",
3103
- "SELECT",
3104
- "BUTTON",
3105
- "TEXTAREA",
3106
- "MUX-PLAYER",
3107
- "SUMMARY"
3108
- ];
3109
- const ignoredRoles = ["button", "option", "combobox", "tab", "tablist"];
3110
- function shouldIgnoreHotkey(el) {
3111
- let current = el;
3112
- while (current) {
3113
- if (!(current instanceof HTMLElement)) return false;
3114
- const isIgnored = ignoredInputs.includes(current.tagName) || ignoredRoles.includes(current.getAttribute("role") || "") || current.isContentEditable;
3115
- if (isIgnored) return true;
3116
- current = current.parentElement;
3117
- }
3118
- return false;
3119
- }
3120
- async function action$9({ request }) {
3121
- const result = PlayerPreferencesSchema.safeParse(await request.json());
3122
- if (!result.success) {
3123
- return unstable_data$1({ status: "error", error: result.error.flatten() }, {
3124
- status: 400
3125
- });
3126
- }
3127
- await setPlayerPreferences(result.data);
3128
- return { status: "success" };
3129
- }
3130
- function useLatest(value) {
3131
- const ref = React.useRef(value);
3132
- React.useEffect(() => {
3133
- ref.current = value;
3134
- }, [value]);
3135
- return ref;
3136
- }
3137
- function MuxPlayer({
3138
- muxPlayerRef,
3139
- ...props
3140
- }) {
3141
- const playerPreferences = usePlayerPreferences();
3142
- const playerPreferencesFetcher = useFetcher();
3143
- const [metadataLoaded, setMetadataLoaded] = React.useState(false);
3144
- const currentTimeSessionKey = `${props.playbackId}:currentTime`;
3145
- const [currentTime, setCurrentTime] = React.useState(0);
3146
- const fetcherRef = useLatest(playerPreferencesFetcher);
3147
- const playerPreferencesRef = useLatest(playerPreferences);
3148
- React.useEffect(() => {
3149
- if (typeof document === "undefined") return;
3150
- const stored = sessionStorage.getItem(currentTimeSessionKey);
3151
- if (!stored) return;
3152
- try {
3153
- const { time: time2, expiresAt } = PlaybackTimeSchema.parse(JSON.parse(stored));
3154
- if (expiresAt.getTime() < Date.now()) throw new Error("Time expired");
3155
- setCurrentTime(time2);
3156
- } catch {
3157
- sessionStorage.removeItem(currentTimeSessionKey);
3158
- }
3159
- }, [currentTimeSessionKey]);
3160
- React.useEffect(() => {
3161
- function handleUserKeyPress(e) {
3162
- if (!muxPlayerRef.current) return;
3163
- const activeElement = document.activeElement;
3164
- if (shouldIgnoreHotkey(activeElement)) return;
3165
- if (shouldIgnoreHotkey(e.target)) return;
3166
- if (e.key === " ") {
3167
- e.preventDefault();
3168
- void (muxPlayerRef.current.paused ? muxPlayerRef.current.play() : muxPlayerRef.current.pause());
3169
- }
3170
- if (e.key === "ArrowRight") {
3171
- e.preventDefault();
3172
- muxPlayerRef.current.currentTime = muxPlayerRef.current.currentTime + (muxPlayerRef.current.forwardSeekOffset || 10);
3173
- }
3174
- if (e.key === "ArrowLeft") {
3175
- e.preventDefault();
3176
- muxPlayerRef.current.currentTime = muxPlayerRef.current.currentTime - (muxPlayerRef.current.forwardSeekOffset || 10);
3177
- }
3178
- if (e.key === "f" && !e.metaKey && !e.ctrlKey) {
3179
- e.preventDefault();
3180
- void (document.fullscreenElement ? document.exitFullscreen() : muxPlayerRef.current.requestFullscreen());
3181
- }
3182
- }
3183
- window.document.addEventListener("keydown", handleUserKeyPress);
3184
- return () => {
3185
- window.document.removeEventListener("keydown", handleUserKeyPress);
3186
- };
3187
- }, [muxPlayerRef]);
3188
- const updatePreferences = useDebounce(() => {
3189
- const player = muxPlayerRef.current;
3190
- if (!player) return;
3191
- const subs = Array.from(player.textTracks ?? []).find(
3192
- (t) => t.kind === "subtitles"
3193
- );
3194
- const newPrefs = {
3195
- playbackRate: player.playbackRate,
3196
- volumeRate: player.volume,
3197
- subtitle: subs ? { id: subs.id, mode: subs.mode } : { id: null, mode: "disabled" }
3198
- };
3199
- if (isDeepEqual(newPrefs, playerPreferencesRef.current)) return;
3200
- fetcherRef.current.submit(newPrefs, {
3201
- method: "POST",
3202
- action: "/video-player",
3203
- encType: "application/json"
3204
- });
3205
- }, 300);
3206
- React.useEffect(() => {
3207
- var _a, _b;
3208
- if (!metadataLoaded) return;
3209
- const textTracks = (_a = muxPlayerRef.current) == null ? void 0 : _a.textTracks;
3210
- if (!textTracks) return;
3211
- const subtitlePref = (_b = playerPreferencesRef.current) == null ? void 0 : _b.subtitle;
3212
- if (subtitlePref == null ? void 0 : subtitlePref.id) {
3213
- const preferredTextTrack = textTracks.getTrackById(subtitlePref.id);
3214
- if (preferredTextTrack) {
3215
- preferredTextTrack.mode = subtitlePref.mode ?? "hidden";
3216
- }
3217
- }
3218
- textTracks.addEventListener("change", updatePreferences);
3219
- return () => {
3220
- textTracks.removeEventListener("change", updatePreferences);
3221
- };
3222
- }, [metadataLoaded, muxPlayerRef, playerPreferencesRef, updatePreferences]);
3223
- return /* @__PURE__ */ jsx("div", { className: "flex aspect-video flex-col", children: /* @__PURE__ */ jsx(
3224
- RealMuxPlayer,
3225
- {
3226
- ref: muxPlayerRef,
3227
- playbackRates: [
3228
- 0.5,
3229
- 0.75,
3230
- 1,
3231
- 1.25,
3232
- 1.5,
3233
- 1.75,
3234
- 2,
3235
- 2.5,
3236
- 3,
3237
- 3.5,
3238
- // lol, someone really asked for this and I think it's funny so let's do it
3239
- // https://twitter.com/zackerydev/status/1710840197879918840
3240
- 4
3241
- ],
3242
- volume: (playerPreferences == null ? void 0 : playerPreferences.volumeRate) ?? 1,
3243
- playbackRate: (playerPreferences == null ? void 0 : playerPreferences.playbackRate) ?? 1,
3244
- thumbnailTime: currentTime,
3245
- onRateChange: updatePreferences,
3246
- onVolumeChange: updatePreferences,
3247
- streamType: "on-demand",
3248
- defaultHiddenCaptions: true,
3249
- currentTime,
3250
- onTimeUpdate: () => {
3251
- var _a;
3252
- return sessionStorage.setItem(
3253
- currentTimeSessionKey,
3254
- JSON.stringify({
3255
- time: (_a = muxPlayerRef.current) == null ? void 0 : _a.currentTime,
3256
- expiresAt: new Date(Date.now() + 1e3 * 60 * 30).toISOString()
3257
- })
3258
- );
3259
- },
3260
- accentColor: "#427cf0",
3261
- targetLiveWindow: NaN,
3262
- onLoadedMetadata: () => setMetadataLoaded(true),
3263
- minResolution: getMinResolutionValue(playerPreferences == null ? void 0 : playerPreferences.minResolution),
3264
- maxResolution: getMaxResolutionValue(playerPreferences == null ? void 0 : playerPreferences.maxResolution),
3265
- ...props
3266
- }
3267
- ) });
3268
- }
3269
- function isDeepEqual(obj1, obj2) {
3270
- if (obj1 === obj2) return true;
3271
- if (typeof obj1 !== typeof obj2) return false;
3272
- if (typeof obj1 !== "object" || typeof obj2 !== "object") return false;
3273
- if (obj1 === null || obj2 === null) return false;
3274
- if (Array.isArray(obj1) !== Array.isArray(obj2)) return false;
3275
- if (Array.isArray(obj1) && Array.isArray(obj2)) {
3276
- if (obj1.length !== obj2.length) return false;
3277
- for (let i = 0; i < obj1.length; i++) {
3278
- if (!isDeepEqual(obj1[i], obj2[i])) return false;
3279
- }
3280
- return true;
3281
- }
3282
- const keys1 = Object.keys(obj1);
3283
- const keys2 = Object.keys(obj2);
3284
- if (keys1.length !== keys2.length) return false;
3285
- for (const key of keys1) {
3286
- if (!isDeepEqual(obj1[key], obj2[key])) return false;
3287
- }
3288
- return true;
3289
- }
3290
- function getMinResolutionValue(resolution) {
3291
- if (!resolution) return void 0;
3292
- if (resolution <= 480) return MinResolution.noLessThan480p;
3293
- if (resolution <= 540) return MinResolution.noLessThan540p;
3294
- if (resolution <= 720) return MinResolution.noLessThan720p;
3295
- if (resolution <= 1080) return MinResolution.noLessThan1080p;
3296
- if (resolution <= 1440) return MinResolution.noLessThan1440p;
3297
- return MinResolution.noLessThan2160p;
3298
- }
3299
- function getMaxResolutionValue(resolution) {
3300
- if (!resolution) return void 0;
3301
- if (resolution <= 720) return MaxResolution.upTo720p;
3302
- if (resolution <= 1080) return MaxResolution.upTo1080p;
3303
- if (resolution <= 1440) return MaxResolution.upTo1440p;
3304
- return MaxResolution.upTo2160p;
3305
- }
3306
- const route45 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
3307
- __proto__: null,
3308
- MuxPlayer,
3309
- action: action$9,
3310
- usePlayerPreferences
3311
- }, Symbol.toStringTag, { value: "Module" }));
3312
3099
  const handle$9 = {
3313
3100
  getSitemapEntries: () => null
3314
3101
  };
3315
- async function loader$u({ request }) {
3102
+ async function loader$v({ request }) {
3316
3103
  ensureUndeployed();
3317
3104
  await requireAuthInfo({ request });
3318
3105
  return {};
3319
3106
  }
3320
- async function action$8({ request }) {
3107
+ async function action$a({ request }) {
3321
3108
  ensureUndeployed();
3322
3109
  const formData = await request.formData();
3323
3110
  const intent = formData.get("intent");
@@ -3331,24 +3118,12 @@ async function action$8({ request }) {
3331
3118
  });
3332
3119
  } else if (intent === "presence-opt-out") {
3333
3120
  const optOut = formData.get("optOut") === "true";
3334
- await setPresencePreferences({ optOut });
3121
+ await setPreferences({ presence: { optOut } });
3335
3122
  return redirectWithToast("/account", {
3336
3123
  title: optOut ? "Opted out" : "Opted in",
3337
3124
  description: `You are now ${optOut ? "invisible" : "visible"}.`,
3338
3125
  type: "success"
3339
3126
  });
3340
- } else if (intent === "update-player-preferences") {
3341
- const minResolution = formData.get("minResolution");
3342
- const maxResolution = formData.get("maxResolution");
3343
- await setPlayerPreferences({
3344
- minResolution: minResolution ? Number(minResolution) : void 0,
3345
- maxResolution: maxResolution ? Number(maxResolution) : void 0
3346
- });
3347
- return redirectWithToast("/account", {
3348
- title: "Preferences updated",
3349
- description: "Your video player preferences have been updated.",
3350
- type: "success"
3351
- });
3352
3127
  }
3353
3128
  return redirect$1("/account");
3354
3129
  }
@@ -3360,12 +3135,9 @@ function useConnectDiscordURL$1() {
3360
3135
  }
3361
3136
  function Account() {
3362
3137
  const user = useUser();
3138
+ const config = useWorkshopConfig();
3363
3139
  const discordMember = useOptionalDiscordMember();
3364
- const presencePreferences = usePresencePreferences();
3365
- const playerPreferences = usePlayerPreferences();
3366
3140
  const connectDiscordURL = useConnectDiscordURL$1();
3367
- const navigation = useNavigation();
3368
- const isSubmitting = navigation.state === "submitting";
3369
3141
  return /* @__PURE__ */ jsxs("main", { className: "container flex h-full w-full max-w-3xl flex-grow flex-col items-center justify-center gap-4", children: [
3370
3142
  user.imageUrlLarge ? /* @__PURE__ */ jsx(
3371
3143
  "img",
@@ -3405,23 +3177,6 @@ function Account() {
3405
3177
  ),
3406
3178
  /* @__PURE__ */ jsx(SimpleTooltip, { content: "This will give you access to the exclusive Discord channels for Epic Web", children: /* @__PURE__ */ jsx(Icon, { name: "Question", tabIndex: 0 }) })
3407
3179
  ] }),
3408
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
3409
- /* @__PURE__ */ jsxs(Form, { method: "POST", children: [
3410
- /* @__PURE__ */ jsx(
3411
- "input",
3412
- {
3413
- name: "optOut",
3414
- type: "hidden",
3415
- value: (presencePreferences == null ? void 0 : presencePreferences.optOut) ? "false" : "true"
3416
- }
3417
- ),
3418
- /* @__PURE__ */ jsxs(Button, { varient: "mono", name: "intent", value: "presence-opt-out", children: [
3419
- (presencePreferences == null ? void 0 : presencePreferences.optOut) ? "Opt in to" : "Opt out of",
3420
- " presence"
3421
- ] })
3422
- ] }),
3423
- /* @__PURE__ */ jsx(SimpleTooltip, { content: "This controls whether your name and avatar are displayed in the pile of faces in navigation", children: /* @__PURE__ */ jsx(Icon, { name: "Question", tabIndex: 0 }) })
3424
- ] }),
3425
3180
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
3426
3181
  /* @__PURE__ */ jsx(Form, { method: "post", children: /* @__PURE__ */ jsx(Button, { varient: "mono", name: "intent", value: "logout", children: "Log device out" }) }),
3427
3182
  /* @__PURE__ */ jsx(
@@ -3439,82 +3194,30 @@ function Account() {
3439
3194
  )
3440
3195
  ] }),
3441
3196
  /* @__PURE__ */ jsx("hr", { className: "w-full" }),
3442
- /* @__PURE__ */ jsxs("div", { children: [
3443
- /* @__PURE__ */ jsx("h2", { className: "mb-2 text-xl", children: "Video Player Preferences" }),
3444
- /* @__PURE__ */ jsxs(Form, { method: "post", className: "flex flex-col gap-4", children: [
3445
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
3446
- /* @__PURE__ */ jsx("label", { htmlFor: "minResolution", children: "Minimum Resolution:" }),
3447
- /* @__PURE__ */ jsxs(
3448
- "select",
3449
- {
3450
- id: "minResolution",
3451
- name: "minResolution",
3452
- defaultValue: playerPreferences == null ? void 0 : playerPreferences.minResolution,
3453
- children: [
3454
- /* @__PURE__ */ jsx("option", { value: "", children: "Auto" }),
3455
- /* @__PURE__ */ jsx("option", { value: "480", children: "480p" }),
3456
- /* @__PURE__ */ jsx("option", { value: "720", children: "720p" }),
3457
- /* @__PURE__ */ jsx("option", { value: "1080", children: "1080p" }),
3458
- /* @__PURE__ */ jsx("option", { value: "1440", children: "1440p" }),
3459
- /* @__PURE__ */ jsx("option", { value: "2160", children: "2160p (4K)" })
3460
- ]
3461
- }
3462
- )
3463
- ] }),
3464
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
3465
- /* @__PURE__ */ jsx("label", { htmlFor: "maxResolution", children: "Maximum Resolution:" }),
3466
- /* @__PURE__ */ jsxs(
3467
- "select",
3468
- {
3469
- id: "maxResolution",
3470
- name: "maxResolution",
3471
- defaultValue: playerPreferences == null ? void 0 : playerPreferences.maxResolution,
3472
- children: [
3473
- /* @__PURE__ */ jsx("option", { value: "", children: "Auto" }),
3474
- /* @__PURE__ */ jsx("option", { value: "720", children: "720p" }),
3475
- /* @__PURE__ */ jsx("option", { value: "1080", children: "1080p" }),
3476
- /* @__PURE__ */ jsx("option", { value: "1440", children: "1440p" }),
3477
- /* @__PURE__ */ jsx("option", { value: "2160", children: "2160p (4K)" })
3478
- ]
3479
- }
3480
- )
3481
- ] }),
3482
- /* @__PURE__ */ jsx(
3483
- Button,
3484
- {
3485
- varient: "mono",
3486
- type: "submit",
3487
- name: "intent",
3488
- value: "update-player-preferences",
3489
- disabled: isSubmitting,
3490
- children: isSubmitting ? "Updating..." : "Update Player Preferences"
3491
- }
3492
- )
3493
- ] })
3494
- ] }),
3495
- /* @__PURE__ */ jsx("hr", { className: "w-full" }),
3496
- /* @__PURE__ */ jsxs("p", { children: [
3497
- "Check",
3498
- " ",
3499
- /* @__PURE__ */ jsx(Link, { to: "/onboarding", className: "underline", children: "/onboarding" }),
3500
- " ",
3501
- "if you'd like to review onboarding again."
3502
- ] }),
3503
- /* @__PURE__ */ jsxs("p", { children: [
3504
- "Check",
3505
- " ",
3506
- /* @__PURE__ */ jsx(Link, { to: "/support", className: "underline", children: "/support" }),
3507
- " ",
3508
- "if you need support."
3197
+ /* @__PURE__ */ jsxs("ul", { className: "flex list-inside list-disc flex-col gap-2 self-start", children: [
3198
+ /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
3199
+ Link,
3200
+ {
3201
+ to: `https://${config.product.host}/profile`,
3202
+ className: "inline-flex gap-1 underline",
3203
+ children: [
3204
+ /* @__PURE__ */ jsx("span", { children: "Manage your account" }),
3205
+ /* @__PURE__ */ jsx(Icon, { name: "ExternalLink" })
3206
+ ]
3207
+ }
3208
+ ) }),
3209
+ /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Link, { to: "/preferences", className: "underline", children: "Manage your preferences" }) }),
3210
+ /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Link, { to: "/onboarding", className: "underline", children: "Review onboarding" }) }),
3211
+ /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Link, { to: "/support", className: "underline", children: "Get support" }) })
3509
3212
  ] })
3510
3213
  ] });
3511
3214
  }
3512
3215
  const route3 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
3513
3216
  __proto__: null,
3514
- action: action$8,
3217
+ action: action$a,
3515
3218
  default: Account,
3516
3219
  handle: handle$9,
3517
- loader: loader$u
3220
+ loader: loader$v
3518
3221
  }, Symbol.toStringTag, { value: "Module" }));
3519
3222
  async function getForceFresh(filePath, cacheEntry) {
3520
3223
  if (!cacheEntry) return true;
@@ -3604,7 +3307,7 @@ async function firstExisting(...files) {
3604
3307
  }
3605
3308
  return null;
3606
3309
  }
3607
- async function loader$t({ request, params }) {
3310
+ async function loader$u({ request, params }) {
3608
3311
  const timings = makeTimings("app-file");
3609
3312
  const { fileApp, app } = await resolveApps({ request, params, timings });
3610
3313
  if (!fileApp || !app) {
@@ -3662,9 +3365,9 @@ async function loader$t({ request, params }) {
3662
3365
  }
3663
3366
  const route4 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
3664
3367
  __proto__: null,
3665
- loader: loader$t
3368
+ loader: loader$u
3666
3369
  }, Symbol.toStringTag, { value: "Module" }));
3667
- async function loader$s(args) {
3370
+ async function loader$t(args) {
3668
3371
  const api = await getApiModule(args);
3669
3372
  invariantResponse(
3670
3373
  api.mod.loader,
@@ -3678,7 +3381,7 @@ async function loader$s(args) {
3678
3381
  api.cleanupError(error);
3679
3382
  }
3680
3383
  }
3681
- async function action$7(args) {
3384
+ async function action$9(args) {
3682
3385
  const api = await getApiModule(args);
3683
3386
  invariantResponse(
3684
3387
  api.mod.action,
@@ -3766,10 +3469,10 @@ async function getApiModule({ request, params }) {
3766
3469
  }
3767
3470
  const route5 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
3768
3471
  __proto__: null,
3769
- action: action$7,
3770
- loader: loader$s
3472
+ action: action$9,
3473
+ loader: loader$t
3771
3474
  }, Symbol.toStringTag, { value: "Module" }));
3772
- async function loader$r({ request, params }) {
3475
+ async function loader$s({ request, params }) {
3773
3476
  const timings = makeTimings("epic_ws script");
3774
3477
  const { fileApp, app } = await resolveApps({ request, params, timings });
3775
3478
  if (!fileApp || !app) {
@@ -3838,9 +3541,9 @@ async function loader$r({ request, params }) {
3838
3541
  }
3839
3542
  const route6 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
3840
3543
  __proto__: null,
3841
- loader: loader$r
3544
+ loader: loader$s
3842
3545
  }, Symbol.toStringTag, { value: "Module" }));
3843
- async function loader$q({ request, params }) {
3546
+ async function loader$r({ request, params }) {
3844
3547
  var _a;
3845
3548
  const timings = makeTimings("app");
3846
3549
  const { fileApp, app } = await resolveApps({ request, params, timings });
@@ -3926,9 +3629,9 @@ async function loader$q({ request, params }) {
3926
3629
  }
3927
3630
  const route7 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
3928
3631
  __proto__: null,
3929
- loader: loader$q
3632
+ loader: loader$r
3930
3633
  }, Symbol.toStringTag, { value: "Module" }));
3931
- async function loader$p({ request, params }) {
3634
+ async function loader$q({ request, params }) {
3932
3635
  var _a;
3933
3636
  const timings = makeTimings("app_test_loader");
3934
3637
  const userHasAccess = await userHasAccessToWorkshop({
@@ -4065,15 +3768,15 @@ ${testScriptTag}`;
4065
3768
  }
4066
3769
  const route8 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
4067
3770
  __proto__: null,
4068
- loader: loader$p
3771
+ loader: loader$q
4069
3772
  }, Symbol.toStringTag, { value: "Module" }));
4070
3773
  const route9 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
4071
3774
  __proto__: null,
4072
- loader: loader$r
3775
+ loader: loader$s
4073
3776
  }, Symbol.toStringTag, { value: "Module" }));
4074
3777
  const route10 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
4075
3778
  __proto__: null,
4076
- loader: loader$r
3779
+ loader: loader$s
4077
3780
  }, Symbol.toStringTag, { value: "Module" }));
4078
3781
  const handle$8 = {
4079
3782
  getSitemapEntries: () => null
@@ -4206,17 +3909,239 @@ const handle$7 = {
4206
3909
  route: `/exercise/${e.exerciseNumber.toString().padStart(2, "0")}/finished`
4207
3910
  }]);
4208
3911
  }
4209
- };
4210
- function ExercisesLayout() {
4211
- return /* @__PURE__ */ jsx("div", {
4212
- className: "flex h-full flex-grow",
4213
- children: /* @__PURE__ */ jsx(Outlet, {})
4214
- });
3912
+ };
3913
+ function ExercisesLayout() {
3914
+ return /* @__PURE__ */ jsx("div", {
3915
+ className: "flex h-full flex-grow",
3916
+ children: /* @__PURE__ */ jsx(Outlet, {})
3917
+ });
3918
+ }
3919
+ const route12 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
3920
+ __proto__: null,
3921
+ default: ExercisesLayout,
3922
+ handle: handle$7
3923
+ }, Symbol.toStringTag, { value: "Module" }));
3924
+ const PlaybackTimeSchema = z.object({
3925
+ time: z.number(),
3926
+ expiresAt: z.string()
3927
+ }).transform((data2) => {
3928
+ return { time: Number(data2.time), expiresAt: new Date(data2.expiresAt) };
3929
+ });
3930
+ function usePlayerPreferences() {
3931
+ var _a;
3932
+ const data2 = useRouteLoaderData("root");
3933
+ return ((_a = data2 == null ? void 0 : data2.preferences) == null ? void 0 : _a.player) ?? null;
3934
+ }
3935
+ const ignoredInputs = [
3936
+ "INPUT",
3937
+ "SELECT",
3938
+ "BUTTON",
3939
+ "TEXTAREA",
3940
+ "MUX-PLAYER",
3941
+ "SUMMARY"
3942
+ ];
3943
+ const ignoredRoles = ["button", "option", "combobox", "tab", "tablist"];
3944
+ function shouldIgnoreHotkey(el) {
3945
+ let current = el;
3946
+ while (current) {
3947
+ if (!(current instanceof HTMLElement)) return false;
3948
+ const isIgnored = ignoredInputs.includes(current.tagName) || ignoredRoles.includes(current.getAttribute("role") || "") || current.isContentEditable;
3949
+ if (isIgnored) return true;
3950
+ current = current.parentElement;
3951
+ }
3952
+ return false;
3953
+ }
3954
+ async function action$8({ request }) {
3955
+ const result = PlayerPreferencesSchema.safeParse(await request.json());
3956
+ if (!result.success) {
3957
+ return unstable_data$1({ status: "error", error: result.error.flatten() }, {
3958
+ status: 400
3959
+ });
3960
+ }
3961
+ await setPreferences({ player: result.data });
3962
+ return { status: "success" };
3963
+ }
3964
+ function useLatest(value) {
3965
+ const ref = React.useRef(value);
3966
+ React.useEffect(() => {
3967
+ ref.current = value;
3968
+ }, [value]);
3969
+ return ref;
3970
+ }
3971
+ function MuxPlayer({
3972
+ muxPlayerRef,
3973
+ ...props
3974
+ }) {
3975
+ const playerPreferences = usePlayerPreferences();
3976
+ const playerPreferencesFetcher = useFetcher();
3977
+ const [metadataLoaded, setMetadataLoaded] = React.useState(false);
3978
+ const currentTimeSessionKey = `${props.playbackId}:currentTime`;
3979
+ const [currentTime, setCurrentTime] = React.useState(0);
3980
+ const fetcherRef = useLatest(playerPreferencesFetcher);
3981
+ const playerPreferencesRef = useLatest(playerPreferences);
3982
+ React.useEffect(() => {
3983
+ if (typeof document === "undefined") return;
3984
+ const stored = sessionStorage.getItem(currentTimeSessionKey);
3985
+ if (!stored) return;
3986
+ try {
3987
+ const { time: time2, expiresAt } = PlaybackTimeSchema.parse(JSON.parse(stored));
3988
+ if (expiresAt.getTime() < Date.now()) throw new Error("Time expired");
3989
+ setCurrentTime(time2);
3990
+ } catch {
3991
+ sessionStorage.removeItem(currentTimeSessionKey);
3992
+ }
3993
+ }, [currentTimeSessionKey]);
3994
+ React.useEffect(() => {
3995
+ function handleUserKeyPress(e) {
3996
+ if (!muxPlayerRef.current) return;
3997
+ const activeElement = document.activeElement;
3998
+ if (shouldIgnoreHotkey(activeElement)) return;
3999
+ if (shouldIgnoreHotkey(e.target)) return;
4000
+ if (e.key === " ") {
4001
+ e.preventDefault();
4002
+ void (muxPlayerRef.current.paused ? muxPlayerRef.current.play() : muxPlayerRef.current.pause());
4003
+ }
4004
+ if (e.key === "ArrowRight") {
4005
+ e.preventDefault();
4006
+ muxPlayerRef.current.currentTime = muxPlayerRef.current.currentTime + (muxPlayerRef.current.forwardSeekOffset || 10);
4007
+ }
4008
+ if (e.key === "ArrowLeft") {
4009
+ e.preventDefault();
4010
+ muxPlayerRef.current.currentTime = muxPlayerRef.current.currentTime - (muxPlayerRef.current.forwardSeekOffset || 10);
4011
+ }
4012
+ if (e.key === "f" && !e.metaKey && !e.ctrlKey) {
4013
+ e.preventDefault();
4014
+ void (document.fullscreenElement ? document.exitFullscreen() : muxPlayerRef.current.requestFullscreen());
4015
+ }
4016
+ }
4017
+ window.document.addEventListener("keydown", handleUserKeyPress);
4018
+ return () => {
4019
+ window.document.removeEventListener("keydown", handleUserKeyPress);
4020
+ };
4021
+ }, [muxPlayerRef]);
4022
+ const updatePreferences = useDebounce(() => {
4023
+ const player = muxPlayerRef.current;
4024
+ if (!player) return;
4025
+ const subs = Array.from(player.textTracks ?? []).find(
4026
+ (t) => t.kind === "subtitles"
4027
+ );
4028
+ const newPrefs = {
4029
+ playbackRate: player.playbackRate,
4030
+ volumeRate: player.volume,
4031
+ subtitle: subs ? { id: subs.id, mode: subs.mode } : { id: null, mode: "disabled" }
4032
+ };
4033
+ if (isDeepEqual(newPrefs, playerPreferencesRef.current)) return;
4034
+ fetcherRef.current.submit(newPrefs, {
4035
+ method: "POST",
4036
+ action: "/video-player",
4037
+ encType: "application/json"
4038
+ });
4039
+ }, 300);
4040
+ React.useEffect(() => {
4041
+ var _a, _b;
4042
+ if (!metadataLoaded) return;
4043
+ const textTracks = (_a = muxPlayerRef.current) == null ? void 0 : _a.textTracks;
4044
+ if (!textTracks) return;
4045
+ const subtitlePref = (_b = playerPreferencesRef.current) == null ? void 0 : _b.subtitle;
4046
+ if (subtitlePref == null ? void 0 : subtitlePref.id) {
4047
+ const preferredTextTrack = textTracks.getTrackById(subtitlePref.id);
4048
+ if (preferredTextTrack) {
4049
+ preferredTextTrack.mode = subtitlePref.mode ?? "hidden";
4050
+ }
4051
+ }
4052
+ textTracks.addEventListener("change", updatePreferences);
4053
+ return () => {
4054
+ textTracks.removeEventListener("change", updatePreferences);
4055
+ };
4056
+ }, [metadataLoaded, muxPlayerRef, playerPreferencesRef, updatePreferences]);
4057
+ return /* @__PURE__ */ jsx("div", { className: "flex aspect-video flex-col", children: /* @__PURE__ */ jsx(
4058
+ RealMuxPlayer,
4059
+ {
4060
+ ref: muxPlayerRef,
4061
+ playbackRates: [
4062
+ 0.5,
4063
+ 0.75,
4064
+ 1,
4065
+ 1.25,
4066
+ 1.5,
4067
+ 1.75,
4068
+ 2,
4069
+ 2.5,
4070
+ 3,
4071
+ 3.5,
4072
+ // lol, someone really asked for this and I think it's funny so let's do it
4073
+ // https://twitter.com/zackerydev/status/1710840197879918840
4074
+ 4
4075
+ ],
4076
+ volume: (playerPreferences == null ? void 0 : playerPreferences.volumeRate) ?? 1,
4077
+ playbackRate: (playerPreferences == null ? void 0 : playerPreferences.playbackRate) ?? 1,
4078
+ thumbnailTime: currentTime,
4079
+ onRateChange: updatePreferences,
4080
+ onVolumeChange: updatePreferences,
4081
+ streamType: "on-demand",
4082
+ defaultHiddenCaptions: true,
4083
+ currentTime,
4084
+ onTimeUpdate: () => {
4085
+ var _a;
4086
+ return sessionStorage.setItem(
4087
+ currentTimeSessionKey,
4088
+ JSON.stringify({
4089
+ time: (_a = muxPlayerRef.current) == null ? void 0 : _a.currentTime,
4090
+ expiresAt: new Date(Date.now() + 1e3 * 60 * 30).toISOString()
4091
+ })
4092
+ );
4093
+ },
4094
+ accentColor: "#427cf0",
4095
+ targetLiveWindow: NaN,
4096
+ onLoadedMetadata: () => setMetadataLoaded(true),
4097
+ minResolution: getMinResolutionValue(playerPreferences == null ? void 0 : playerPreferences.minResolution),
4098
+ maxResolution: getMaxResolutionValue(playerPreferences == null ? void 0 : playerPreferences.maxResolution),
4099
+ ...props
4100
+ }
4101
+ ) });
4102
+ }
4103
+ function isDeepEqual(obj1, obj2) {
4104
+ if (obj1 === obj2) return true;
4105
+ if (typeof obj1 !== typeof obj2) return false;
4106
+ if (typeof obj1 !== "object" || typeof obj2 !== "object") return false;
4107
+ if (obj1 === null || obj2 === null) return false;
4108
+ if (Array.isArray(obj1) !== Array.isArray(obj2)) return false;
4109
+ if (Array.isArray(obj1) && Array.isArray(obj2)) {
4110
+ if (obj1.length !== obj2.length) return false;
4111
+ for (let i = 0; i < obj1.length; i++) {
4112
+ if (!isDeepEqual(obj1[i], obj2[i])) return false;
4113
+ }
4114
+ return true;
4115
+ }
4116
+ const keys1 = Object.keys(obj1);
4117
+ const keys2 = Object.keys(obj2);
4118
+ if (keys1.length !== keys2.length) return false;
4119
+ for (const key of keys1) {
4120
+ if (!isDeepEqual(obj1[key], obj2[key])) return false;
4121
+ }
4122
+ return true;
4215
4123
  }
4216
- const route12 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
4124
+ function getMinResolutionValue(resolution) {
4125
+ if (!resolution) return void 0;
4126
+ if (resolution <= 480) return MinResolution.noLessThan480p;
4127
+ if (resolution <= 540) return MinResolution.noLessThan540p;
4128
+ if (resolution <= 720) return MinResolution.noLessThan720p;
4129
+ if (resolution <= 1080) return MinResolution.noLessThan1080p;
4130
+ if (resolution <= 1440) return MinResolution.noLessThan1440p;
4131
+ return MinResolution.noLessThan2160p;
4132
+ }
4133
+ function getMaxResolutionValue(resolution) {
4134
+ if (!resolution) return void 0;
4135
+ if (resolution <= 720) return MaxResolution.upTo720p;
4136
+ if (resolution <= 1080) return MaxResolution.upTo1080p;
4137
+ if (resolution <= 1440) return MaxResolution.upTo1440p;
4138
+ return MaxResolution.upTo2160p;
4139
+ }
4140
+ const route46 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
4217
4141
  __proto__: null,
4218
- default: ExercisesLayout,
4219
- handle: handle$7
4142
+ MuxPlayer,
4143
+ action: action$8,
4144
+ usePlayerPreferences
4220
4145
  }, Symbol.toStringTag, { value: "Module" }));
4221
4146
  function Loading({
4222
4147
  className,
@@ -5059,7 +4984,7 @@ const LaunchSchema = z.intersection(
5059
4984
  }),
5060
4985
  getFileDescriptorSchema(z.array(z.string()))
5061
4986
  );
5062
- async function action$6({ request }) {
4987
+ async function action$7({ request }) {
5063
4988
  ensureUndeployed();
5064
4989
  const formData = await request.formData();
5065
4990
  const syncTo = {
@@ -5306,11 +5231,11 @@ function EditFileOnGitHub({
5306
5231
  );
5307
5232
  }
5308
5233
  const LaunchEditor = ENV.EPICSHOP_DEPLOYED ? LaunchGitHub : LaunchEditorImpl;
5309
- const route33 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
5234
+ const route34 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
5310
5235
  __proto__: null,
5311
5236
  EditFileOnGitHub,
5312
5237
  LaunchEditor,
5313
- action: action$6
5238
+ action: action$7
5314
5239
  }, Symbol.toStringTag, { value: "Module" }));
5315
5240
  const safePath = (s) => s.replace(/\\/g, "/");
5316
5241
  function getRelativePath(file, separator, type) {
@@ -5507,7 +5432,7 @@ const meta$5 = ({
5507
5432
  requestInfo: rootData.requestInfo
5508
5433
  });
5509
5434
  };
5510
- async function loader$o({ request, params }) {
5435
+ async function loader$p({ request, params }) {
5511
5436
  const timings = makeTimings("exerciseNumberLoader");
5512
5437
  invariantResponse(params.exerciseNumber, "exerciseNumber is required");
5513
5438
  const { title: workshopTitle } = getWorkshopConfig();
@@ -5650,10 +5575,10 @@ const route13 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
5650
5575
  ErrorBoundary: ErrorBoundary$4,
5651
5576
  default: ExerciseNumberRoute,
5652
5577
  headers: headers$a,
5653
- loader: loader$o,
5578
+ loader: loader$p,
5654
5579
  meta: meta$5
5655
5580
  }, Symbol.toStringTag, { value: "Module" }));
5656
- async function loader$n({ request, params }) {
5581
+ async function loader$o({ request, params }) {
5657
5582
  const timings = makeTimings("stepLoader");
5658
5583
  invariantResponse(params.exerciseNumber, "exerciseNumber is required");
5659
5584
  const exercises = await getExercises({ request, timings });
@@ -5708,7 +5633,7 @@ const route14 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
5708
5633
  ErrorBoundary: ErrorBoundary$3,
5709
5634
  default: StepRoute,
5710
5635
  headers: headers$9,
5711
- loader: loader$n
5636
+ loader: loader$o
5712
5637
  }, Symbol.toStringTag, { value: "Module" }));
5713
5638
  function NavChevrons({
5714
5639
  prev,
@@ -6159,7 +6084,7 @@ const SetPlaygroundSchema = z.object({
6159
6084
  appName: z.string(),
6160
6085
  reset: z.string().nullable().optional().transform((v) => v === "true")
6161
6086
  });
6162
- async function action$5({ request }) {
6087
+ async function action$6({ request }) {
6163
6088
  ensureUndeployed();
6164
6089
  const formData = await request.formData();
6165
6090
  const rawData = {
@@ -6334,12 +6259,12 @@ function SetAppToPlayground({ appName }) {
6334
6259
  }
6335
6260
  );
6336
6261
  }
6337
- const route40 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
6262
+ const route41 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
6338
6263
  __proto__: null,
6339
6264
  PlaygroundChooser,
6340
6265
  SetAppToPlayground,
6341
6266
  SetPlayground,
6342
- action: action$5
6267
+ action: action$6
6343
6268
  }, Symbol.toStringTag, { value: "Module" }));
6344
6269
  const StepContext = React.createContext(null);
6345
6270
  function useStepContext() {
@@ -6680,7 +6605,7 @@ const meta$4 = ({
6680
6605
  requestInfo: rootData.requestInfo
6681
6606
  });
6682
6607
  };
6683
- async function loader$m({ request, params }) {
6608
+ async function loader$n({ request, params }) {
6684
6609
  var _a, _b;
6685
6610
  const timings = makeTimings("exerciseStepTypeLayoutLoader");
6686
6611
  const url = new URL(request.url);
@@ -6942,10 +6867,10 @@ const route15 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
6942
6867
  ErrorBoundary: ErrorBoundary$2,
6943
6868
  default: ExercisePartRoute$1,
6944
6869
  headers: headers$8,
6945
- loader: loader$m,
6870
+ loader: loader$n,
6946
6871
  meta: meta$4
6947
6872
  }, Symbol.toStringTag, { value: "Module" }));
6948
- async function action$4({ request }) {
6873
+ async function action$5({ request }) {
6949
6874
  ensureUndeployed();
6950
6875
  const formData = await request.formData();
6951
6876
  const intent = formData.get("intent");
@@ -7082,12 +7007,12 @@ function AppStarter({ name }) {
7082
7007
  fetcher.state === "idle" ? /* @__PURE__ */ jsx(Button, { type: "submit", name: "intent", value: "start", varient: "mono", children: "Start App" }) : /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(Loading, { children: "Starting App" }) })
7083
7008
  ] });
7084
7009
  }
7085
- const route42 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
7010
+ const route43 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
7086
7011
  __proto__: null,
7087
7012
  AppStarter,
7088
7013
  AppStopper,
7089
7014
  PortStopper,
7090
- action: action$4
7015
+ action: action$5
7091
7016
  }, Symbol.toStringTag, { value: "Module" }));
7092
7017
  const historyCallDataSchema = z.intersection(
7093
7018
  z.object({
@@ -7545,7 +7470,7 @@ async function getAppRunningState(a) {
7545
7470
  const portIsAvailable = isRunning ? null : await isPortAvailable(a.dev.portNumber);
7546
7471
  return { isRunning, portIsAvailable };
7547
7472
  }
7548
- async function loader$l({ request, params }) {
7473
+ async function loader$m({ request, params }) {
7549
7474
  const timings = makeTimings("exercise-step-test");
7550
7475
  const exerciseStepApp = await requireExerciseApp(params, { request, timings });
7551
7476
  const { isRunning, portIsAvailable } = await getAppRunningState(exerciseStepApp);
@@ -7585,7 +7510,7 @@ const route16 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
7585
7510
  __proto__: null,
7586
7511
  default: TestsList$1,
7587
7512
  headers: headers$7,
7588
- loader: loader$l
7513
+ loader: loader$m
7589
7514
  }, Symbol.toStringTag, { value: "Module" }));
7590
7515
  const AccordionComponent = ({
7591
7516
  title,
@@ -8461,7 +8386,7 @@ const testEventSchema = z.union([
8461
8386
  })
8462
8387
  ]);
8463
8388
  const testEventQueueSchema = z.array(testEventSchema);
8464
- async function loader$k({ request }) {
8389
+ async function loader$l({ request }) {
8465
8390
  ensureUndeployed();
8466
8391
  const url = new URL(request.url);
8467
8392
  const name = url.searchParams.get("name");
@@ -8537,7 +8462,7 @@ async function loader$k({ request }) {
8537
8462
  };
8538
8463
  });
8539
8464
  }
8540
- async function action$3({ request }) {
8465
+ async function action$4({ request }) {
8541
8466
  var _a;
8542
8467
  ensureUndeployed();
8543
8468
  const formData = await request.formData();
@@ -8810,14 +8735,14 @@ function StopTest({
8810
8735
  )
8811
8736
  ] });
8812
8737
  }
8813
- const route43 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
8738
+ const route44 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
8814
8739
  __proto__: null,
8815
8740
  ClearTest,
8816
8741
  StopTest,
8817
8742
  TestOutput,
8818
8743
  TestRunner,
8819
- action: action$3,
8820
- loader: loader$k
8744
+ action: action$4,
8745
+ loader: loader$l
8821
8746
  }, Symbol.toStringTag, { value: "Module" }));
8822
8747
  function Tests({
8823
8748
  appInfo: playgroundAppInfo,
@@ -8884,7 +8809,7 @@ function TestUI({
8884
8809
  }
8885
8810
  return /* @__PURE__ */ jsx("div", { className: "flex h-full items-center justify-center text-lg", children: /* @__PURE__ */ jsx("p", { children: "No tests here 😢 Sorry." }) });
8886
8811
  }
8887
- async function loader$j({ request, params }) {
8812
+ async function loader$k({ request, params }) {
8888
8813
  const timings = makeTimings("exerciseStepTypeIndexLoader");
8889
8814
  const userHasAccess = await userHasAccessToWorkshop({
8890
8815
  request,
@@ -9204,9 +9129,9 @@ const route17 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
9204
9129
  ErrorBoundary: ErrorBoundary$1,
9205
9130
  default: ExercisePartRoute,
9206
9131
  headers: headers$6,
9207
- loader: loader$j
9132
+ loader: loader$k
9208
9133
  }, Symbol.toStringTag, { value: "Module" }));
9209
- async function loader$i({ request, params }) {
9134
+ async function loader$j({ request, params }) {
9210
9135
  const timings = makeTimings("exercise-step-test");
9211
9136
  const exerciseStepApp = await requireExerciseApp(params, { request, timings });
9212
9137
  return unstable_data$1(
@@ -9238,9 +9163,9 @@ const route18 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
9238
9163
  __proto__: null,
9239
9164
  default: TestsList,
9240
9165
  headers: headers$5,
9241
- loader: loader$i
9166
+ loader: loader$j
9242
9167
  }, Symbol.toStringTag, { value: "Module" }));
9243
- async function loader$h({ params }) {
9168
+ async function loader$i({ params }) {
9244
9169
  const problemApp = await getExerciseApp({ ...params, type: "problem" }).then(
9245
9170
  (a) => isProblemApp(a) ? a : null
9246
9171
  );
@@ -9262,7 +9187,7 @@ async function loader$h({ params }) {
9262
9187
  }
9263
9188
  const route19 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
9264
9189
  __proto__: null,
9265
- loader: loader$h
9190
+ loader: loader$i
9266
9191
  }, Symbol.toStringTag, { value: "Module" }));
9267
9192
  const meta$3 = ({
9268
9193
  data: data2,
@@ -9281,7 +9206,7 @@ const meta$3 = ({
9281
9206
  requestInfo: rootData.requestInfo
9282
9207
  });
9283
9208
  };
9284
- async function loader$g({ request, params }) {
9209
+ async function loader$h({ request, params }) {
9285
9210
  const timings = makeTimings("exerciseFinishedLoader");
9286
9211
  invariantResponse(params.exerciseNumber, "exerciseNumber is required");
9287
9212
  const exercise = await getExercise(params.exerciseNumber, {
@@ -9445,7 +9370,7 @@ const route20 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
9445
9370
  __proto__: null,
9446
9371
  default: ExerciseFinished$1,
9447
9372
  headers: headers$4,
9448
- loader: loader$g,
9373
+ loader: loader$h,
9449
9374
  meta: meta$3
9450
9375
  }, Symbol.toStringTag, { value: "Module" }));
9451
9376
  const handle$6 = {
@@ -9466,7 +9391,7 @@ const meta$2 = ({
9466
9391
  requestInfo: rootData.requestInfo
9467
9392
  });
9468
9393
  };
9469
- async function loader$f({ request }) {
9394
+ async function loader$g({ request }) {
9470
9395
  const timings = makeTimings("finishedLoader");
9471
9396
  const exercises = await getExercises({ request, timings });
9472
9397
  const compiledFinished = await time(() => getWorkshopFinished({ request }), {
@@ -9602,10 +9527,10 @@ const route21 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
9602
9527
  default: ExerciseFinished,
9603
9528
  handle: handle$6,
9604
9529
  headers: headers$3,
9605
- loader: loader$f,
9530
+ loader: loader$g,
9606
9531
  meta: meta$2
9607
9532
  }, Symbol.toStringTag, { value: "Module" }));
9608
- async function loader$e({ request }) {
9533
+ async function loader$f({ request }) {
9609
9534
  const timings = makeTimings("indexLoader");
9610
9535
  const { title } = getWorkshopConfig();
9611
9536
  const [exercises, workshopReadme] = await Promise.all([
@@ -9731,7 +9656,7 @@ const route22 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
9731
9656
  ErrorBoundary,
9732
9657
  default: Index,
9733
9658
  headers: headers$2,
9734
- loader: loader$e
9659
+ loader: loader$f
9735
9660
  }, Symbol.toStringTag, { value: "Module" }));
9736
9661
  const EVENTS = {
9737
9662
  USER_CODE_RECEIVED: "USER_CODE_RECEIVED",
@@ -9809,7 +9734,7 @@ const EventSchema = z.union([
9809
9734
  AuthResolvedEventSchema,
9810
9735
  AuthRejectedEventSchema
9811
9736
  ]);
9812
- async function loader$d({ request }) {
9737
+ async function loader$e({ request }) {
9813
9738
  ensureUndeployed();
9814
9739
  return eventStream(request.signal, function setup(send) {
9815
9740
  function handleCodeReceived(data) {
@@ -9843,21 +9768,21 @@ async function loader$d({ request }) {
9843
9768
  };
9844
9769
  });
9845
9770
  }
9846
- const route34 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
9771
+ const route35 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
9847
9772
  __proto__: null,
9848
9773
  EventSchema,
9849
- loader: loader$d
9774
+ loader: loader$e
9850
9775
  }, Symbol.toStringTag, { value: "Module" }));
9851
9776
  const handle$5 = {
9852
9777
  getSitemapEntries: () => null
9853
9778
  };
9854
- async function loader$c() {
9779
+ async function loader$d() {
9855
9780
  ensureUndeployed();
9856
9781
  const isAuthenticated = Boolean(await getAuthInfo());
9857
9782
  if (isAuthenticated) throw redirect$1("/account");
9858
9783
  return {};
9859
9784
  }
9860
- async function action$2() {
9785
+ async function action$3() {
9861
9786
  ensureUndeployed();
9862
9787
  void registerDevice();
9863
9788
  return { status: "pending" };
@@ -9968,9 +9893,148 @@ function Login() {
9968
9893
  }
9969
9894
  const route23 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
9970
9895
  __proto__: null,
9971
- action: action$2,
9896
+ action: action$3,
9972
9897
  default: Login,
9973
9898
  handle: handle$5,
9899
+ loader: loader$d
9900
+ }, Symbol.toStringTag, { value: "Module" }));
9901
+ async function loader$c() {
9902
+ ensureUndeployed();
9903
+ const preferences = await getPreferences();
9904
+ return { preferences };
9905
+ }
9906
+ async function action$2({ request }) {
9907
+ ensureUndeployed();
9908
+ const formData = await request.formData();
9909
+ const minResolution = formData.get("minResolution");
9910
+ const maxResolution = formData.get("maxResolution");
9911
+ const fontSize = formData.get("fontSize");
9912
+ const optOutPresence = formData.get("optOutPresence") === "on";
9913
+ await setPreferences({
9914
+ player: {
9915
+ minResolution: minResolution ? Number(minResolution) : void 0,
9916
+ maxResolution: maxResolution ? Number(maxResolution) : void 0
9917
+ },
9918
+ fontSize: fontSize ? Number(fontSize) : void 0,
9919
+ presence: {
9920
+ optOut: optOutPresence
9921
+ }
9922
+ });
9923
+ return redirectWithToast("/preferences", {
9924
+ title: "Preferences updated",
9925
+ description: "Your preferences have been updated.",
9926
+ type: "success"
9927
+ });
9928
+ }
9929
+ function AccountSettings() {
9930
+ var _a, _b, _c;
9931
+ const data = useRouteLoaderData("root");
9932
+ const playerPreferences = (_a = data == null ? void 0 : data.preferences) == null ? void 0 : _a.player;
9933
+ const fontSizePreference = (_b = data == null ? void 0 : data.preferences) == null ? void 0 : _b.fontSize;
9934
+ const presencePreferences = (_c = data == null ? void 0 : data.preferences) == null ? void 0 : _c.presence;
9935
+ const navigation = useNavigation();
9936
+ const isSubmitting = navigation.state === "submitting";
9937
+ return /* @__PURE__ */ jsxs("main", { className: "container mt-12 flex h-full w-full max-w-3xl flex-grow flex-col gap-4", children: [
9938
+ /* @__PURE__ */ jsx("h1", { className: "mb-4 text-h1", children: "Preferences" }),
9939
+ /* @__PURE__ */ jsxs(Form, { method: "post", className: "flex w-full max-w-sm flex-col gap-4", children: [
9940
+ /* @__PURE__ */ jsxs("div", { children: [
9941
+ /* @__PURE__ */ jsx("h2", { className: "mb-2 text-body-xl", children: "Video Player Preferences" }),
9942
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
9943
+ /* @__PURE__ */ jsx("label", { htmlFor: "minResolution", children: "Minimum Resolution:" }),
9944
+ /* @__PURE__ */ jsxs(
9945
+ "select",
9946
+ {
9947
+ id: "minResolution",
9948
+ name: "minResolution",
9949
+ defaultValue: playerPreferences == null ? void 0 : playerPreferences.minResolution,
9950
+ children: [
9951
+ /* @__PURE__ */ jsx("option", { value: "", children: "Auto" }),
9952
+ /* @__PURE__ */ jsx("option", { value: "480", children: "480p" }),
9953
+ /* @__PURE__ */ jsx("option", { value: "720", children: "720p" }),
9954
+ /* @__PURE__ */ jsx("option", { value: "1080", children: "1080p" }),
9955
+ /* @__PURE__ */ jsx("option", { value: "1440", children: "1440p" }),
9956
+ /* @__PURE__ */ jsx("option", { value: "2160", children: "2160p (4K)" })
9957
+ ]
9958
+ }
9959
+ )
9960
+ ] }),
9961
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
9962
+ /* @__PURE__ */ jsx("label", { htmlFor: "maxResolution", children: "Maximum Resolution:" }),
9963
+ /* @__PURE__ */ jsxs(
9964
+ "select",
9965
+ {
9966
+ id: "maxResolution",
9967
+ name: "maxResolution",
9968
+ defaultValue: playerPreferences == null ? void 0 : playerPreferences.maxResolution,
9969
+ children: [
9970
+ /* @__PURE__ */ jsx("option", { value: "", children: "Auto" }),
9971
+ /* @__PURE__ */ jsx("option", { value: "720", children: "720p" }),
9972
+ /* @__PURE__ */ jsx("option", { value: "1080", children: "1080p" }),
9973
+ /* @__PURE__ */ jsx("option", { value: "1440", children: "1440p" }),
9974
+ /* @__PURE__ */ jsx("option", { value: "2160", children: "2160p (4K)" })
9975
+ ]
9976
+ }
9977
+ )
9978
+ ] })
9979
+ ] }),
9980
+ /* @__PURE__ */ jsxs("div", { children: [
9981
+ /* @__PURE__ */ jsxs("div", { className: "mb-2 flex items-center gap-2", children: [
9982
+ /* @__PURE__ */ jsx("h2", { className: "text-body-xl", children: "Font Size Preference" }),
9983
+ /* @__PURE__ */ jsx(SimpleTooltip, { content: "Defaults to 16px", children: /* @__PURE__ */ jsx(Icon, { name: "Question", tabIndex: 0 }) })
9984
+ ] }),
9985
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
9986
+ /* @__PURE__ */ jsx("label", { htmlFor: "fontSize", children: "Font Size" }),
9987
+ /* @__PURE__ */ jsx(
9988
+ "input",
9989
+ {
9990
+ type: "number",
9991
+ id: "fontSize",
9992
+ name: "fontSize",
9993
+ defaultValue: fontSizePreference ?? 16,
9994
+ step: "1",
9995
+ min: "12",
9996
+ max: "26"
9997
+ }
9998
+ )
9999
+ ] })
10000
+ ] }),
10001
+ /* @__PURE__ */ jsxs("div", { children: [
10002
+ /* @__PURE__ */ jsxs("div", { className: "mb-2 flex items-center gap-2", children: [
10003
+ /* @__PURE__ */ jsx("h2", { className: "text-body-xl", children: "Presence Preference" }),
10004
+ /* @__PURE__ */ jsx(SimpleTooltip, { content: "This controls whether your name and avatar are displayed in the pile of faces in navigation", children: /* @__PURE__ */ jsx(Icon, { name: "Question", tabIndex: 0 }) })
10005
+ ] }),
10006
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
10007
+ /* @__PURE__ */ jsx(
10008
+ "input",
10009
+ {
10010
+ type: "checkbox",
10011
+ id: "optOutPresence",
10012
+ name: "optOutPresence",
10013
+ defaultChecked: presencePreferences == null ? void 0 : presencePreferences.optOut
10014
+ }
10015
+ ),
10016
+ /* @__PURE__ */ jsx("label", { htmlFor: "optOutPresence", children: "Opt out of presence features" })
10017
+ ] })
10018
+ ] }),
10019
+ /* @__PURE__ */ jsx("div", { className: "h-4" }),
10020
+ /* @__PURE__ */ jsx(
10021
+ Button,
10022
+ {
10023
+ varient: "primary",
10024
+ type: "submit",
10025
+ name: "intent",
10026
+ value: "update-preferences",
10027
+ disabled: isSubmitting,
10028
+ children: isSubmitting ? "Updating..." : "Update Preferences"
10029
+ }
10030
+ )
10031
+ ] })
10032
+ ] });
10033
+ }
10034
+ const route24 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10035
+ __proto__: null,
10036
+ action: action$2,
10037
+ default: AccountSettings,
9974
10038
  loader: loader$c
9975
10039
  }, Symbol.toStringTag, { value: "Module" }));
9976
10040
  const handle$4 = {
@@ -10029,7 +10093,7 @@ function Support() {
10029
10093
  ] })
10030
10094
  ] });
10031
10095
  }
10032
- const route24 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10096
+ const route25 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10033
10097
  __proto__: null,
10034
10098
  default: Support,
10035
10099
  handle: handle$4
@@ -10056,7 +10120,7 @@ function AdminLayout$1() {
10056
10120
  ] })
10057
10121
  ] });
10058
10122
  }
10059
- const route25 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10123
+ const route26 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10060
10124
  __proto__: null,
10061
10125
  default: AdminLayout$1,
10062
10126
  handle: handle$3,
@@ -10067,7 +10131,7 @@ async function loader$b() {
10067
10131
  const apps = await getApps();
10068
10132
  return Response.json({ apps });
10069
10133
  }
10070
- const route26 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10134
+ const route27 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10071
10135
  __proto__: null,
10072
10136
  loader: loader$b
10073
10137
  }, Symbol.toStringTag, { value: "Module" }));
@@ -10076,7 +10140,7 @@ async function loader$a() {
10076
10140
  const entries = await getAllFileCacheEntries();
10077
10141
  return Response.json({ entries });
10078
10142
  }
10079
- const route27 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10143
+ const route28 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10080
10144
  __proto__: null,
10081
10145
  loader: loader$a
10082
10146
  }, Symbol.toStringTag, { value: "Module" }));
@@ -10315,7 +10379,7 @@ function Pinger({
10315
10379
  )
10316
10380
  ] });
10317
10381
  }
10318
- const route28 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10382
+ const route29 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10319
10383
  __proto__: null,
10320
10384
  action: action$1,
10321
10385
  default: AdminLayout,
@@ -10425,7 +10489,7 @@ function Version() {
10425
10489
  ] })
10426
10490
  ] });
10427
10491
  }
10428
- const route29 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10492
+ const route30 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10429
10493
  __proto__: null,
10430
10494
  default: Version,
10431
10495
  handle: handle$1,
@@ -10440,7 +10504,7 @@ async function loader$7({ request }) {
10440
10504
  { headers: { "Server-Timing": getServerTimeHeader(timings) } }
10441
10505
  );
10442
10506
  }
10443
- const route30 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10507
+ const route31 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10444
10508
  __proto__: null,
10445
10509
  loader: loader$7
10446
10510
  }, Symbol.toStringTag, { value: "Module" }));
@@ -10529,7 +10593,7 @@ function DiffViewer() {
10529
10593
  }
10530
10594
  );
10531
10595
  }
10532
- const route31 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10596
+ const route32 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10533
10597
  __proto__: null,
10534
10598
  default: DiffViewer,
10535
10599
  loader: loader$6
@@ -10542,7 +10606,7 @@ async function loader$5({ request }) {
10542
10606
  { headers: { "Server-Timing": getServerTimeHeader(timings) } }
10543
10607
  );
10544
10608
  }
10545
- const route32 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10609
+ const route33 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10546
10610
  __proto__: null,
10547
10611
  loader: loader$5
10548
10612
  }, Symbol.toStringTag, { value: "Module" }));
@@ -10873,7 +10937,7 @@ function OgLayout({
10873
10937
  }
10874
10938
  );
10875
10939
  }
10876
- const route35 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10940
+ const route36 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10877
10941
  __proto__: null,
10878
10942
  loader: loader$4
10879
10943
  }, Symbol.toStringTag, { value: "Module" }));
@@ -10921,7 +10985,7 @@ function Onboarding() {
10921
10985
  /* @__PURE__ */ jsx(Form, { method: "post", className: "pb-4", children: /* @__PURE__ */ jsx(Button, { name: "intent", value: "complete", varient: "primary", children: "I've watched it. Let's go!" }) })
10922
10986
  ] });
10923
10987
  }
10924
- const route36 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10988
+ const route37 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10925
10989
  __proto__: null,
10926
10990
  action,
10927
10991
  default: Onboarding,
@@ -10947,7 +11011,7 @@ async function loader$2() {
10947
11011
  }
10948
11012
  return Response.json({ processes, testProcesses });
10949
11013
  }
10950
- const route37 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11014
+ const route38 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10951
11015
  __proto__: null,
10952
11016
  loader: loader$2
10953
11017
  }, Symbol.toStringTag, { value: "Module" }));
@@ -10956,7 +11020,7 @@ function loader$1({ request }) {
10956
11020
  { type: "sitemap", value: `${getDomainUrl(request)}/sitemap.xml` }
10957
11021
  ]);
10958
11022
  }
10959
- const route39 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11023
+ const route40 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10960
11024
  __proto__: null,
10961
11025
  loader: loader$1
10962
11026
  }, Symbol.toStringTag, { value: "Module" }));
@@ -10969,11 +11033,11 @@ async function loader({ request, context }) {
10969
11033
  }
10970
11034
  });
10971
11035
  }
10972
- const route41 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
11036
+ const route42 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10973
11037
  __proto__: null,
10974
11038
  loader
10975
11039
  }, Symbol.toStringTag, { value: "Module" }));
10976
- const serverManifest = { "entry": { "module": "/assets/entry.client-CrlHhRMR.js", "imports": ["/assets/index-C_B1-9rF.js", "/assets/components-DUNtf72c.js"], "css": [] }, "routes": { "root": { "id": "root", "parentId": void 0, "path": "", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/root-Bg-hxaOK.js", "imports": ["/assets/index-C_B1-9rF.js", "/assets/components-DUNtf72c.js", "/assets/misc-DIdEn_jt.js", "/assets/pe-D5h19vSo.js", "/assets/error-boundary-3zItlMUO.js", "/assets/progress-bar-CBDBzRQ2.js", "/assets/index-LjRZeU7x.js", "/assets/tooltip-BoVikCa-.js", "/assets/index-DH1w3QmP.js", "/assets/presence-D1DPz__2.js", "/assets/seo-pBpFCWsy.js", "/assets/request-info-vBkaf3Rk.js"], "css": [] }, "routes/$": { "id": "routes/$", "parentId": "root", "path": "*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_-hAKYb2AG.js", "imports": ["/assets/index-C_B1-9rF.js", "/assets/error-boundary-3zItlMUO.js", "/assets/misc-DIdEn_jt.js", "/assets/components-DUNtf72c.js"], "css": [] }, "routes/_app+/_layout": { "id": "routes/_app+/_layout", "parentId": "root", "path": void 0, "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-Bu0lel3p.js", "imports": ["/assets/index-C_B1-9rF.js", "/assets/misc-DIdEn_jt.js", "/assets/pe-D5h19vSo.js", "/assets/product-CYOFfeJM.js", "/assets/revalidation-ws-DK5QOPlL.js", "/assets/tooltip-BoVikCa-.js", "/assets/index-CV3nxGFp.js", "/assets/user-CbbIYEs8.js", "/assets/workshop-config-C5sYl312.js", "/assets/presence-D1DPz__2.js", "/assets/progress-D6SP0Gec.js", "/assets/index-DH1w3QmP.js", "/assets/components-DUNtf72c.js", "/assets/request-info-vBkaf3Rk.js"], "css": [] }, "routes/_app+/account": { "id": "routes/_app+/account", "parentId": "routes/_app+/_layout", "path": "account", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/account-DLDPrc9J.js", "imports": ["/assets/index-C_B1-9rF.js", "/assets/button-39zQyNX6.js", "/assets/misc-DIdEn_jt.js", "/assets/tooltip-BoVikCa-.js", "/assets/user-CbbIYEs8.js", "/assets/workshop-config-C5sYl312.js", "/assets/presence-D1DPz__2.js", "/assets/index-BajUQsFT.js", "/assets/components-DUNtf72c.js", "/assets/request-info-vBkaf3Rk.js"], "css": ["/assets/index-DUnRvy1A.css"] }, "routes/_app+/app.$appName+/$": { "id": "routes/_app+/app.$appName+/$", "parentId": "routes/_app+/_layout", "path": "app/:appName/*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/api.$": { "id": "routes/_app+/app.$appName+/api.$", "parentId": "routes/_app+/_layout", "path": "app/:appName/api/*", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/api._-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/epic_ws[.js]": { "id": "routes/_app+/app.$appName+/epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/:appName/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/index": { "id": "routes/_app+/app.$appName+/index", "parentId": "routes/_app+/_layout", "path": "app/:appName/", "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/test.$testName": { "id": "routes/_app+/app.$appName+/test.$testName", "parentId": "routes/_app+/_layout", "path": "app/:appName/test/:testName", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test._testName-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/test.epic_ws[.js]": { "id": "routes/_app+/app.$appName+/test.epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/:appName/test/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test.epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.epic_ws[.js]": { "id": "routes/_app+/app.epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/app.epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/discord": { "id": "routes/_app+/discord", "parentId": "routes/_app+/_layout", "path": "discord", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/discord-CpIgvYus.js", "imports": ["/assets/discord-CEOqKs_c.js", "/assets/index-C_B1-9rF.js", "/assets/misc-DIdEn_jt.js", "/assets/components-DUNtf72c.js", "/assets/user-CbbIYEs8.js", "/assets/workshop-config-C5sYl312.js"], "css": [] }, "routes/_app+/exercise+/_layout": { "id": "routes/_app+/exercise+/_layout", "parentId": "routes/_app+/_layout", "path": "exercise", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-B4JGpA3A.js", "imports": ["/assets/index-C_B1-9rF.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber": { "id": "routes/_app+/exercise+/$exerciseNumber", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber-PTdG9GGB.js", "imports": ["/assets/index-C_B1-9rF.js", "/assets/index-CLNXC84j.js", "/assets/epic-video-D8ex9vao.js", "/assets/revalidation-ws-DK5QOPlL.js", "/assets/mdx-C9dqA6IZ.js", "/assets/progress-D6SP0Gec.js", "/assets/misc-DIdEn_jt.js", "/assets/seo-pBpFCWsy.js", "/assets/components-DUNtf72c.js", "/assets/index-DH1w3QmP.js", "/assets/request-info-vBkaf3Rk.js", "/assets/tooltip-BoVikCa-.js", "/assets/pe-D5h19vSo.js", "/assets/index-BajUQsFT.js", "/assets/loading-DW_I206H.js", "/assets/user-CbbIYEs8.js", "/assets/workshop-config-C5sYl312.js", "/assets/progress-bar-CBDBzRQ2.js"], "css": ["/assets/index-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber/:stepNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber_._stepNumber-03erOIGo.js", "imports": ["/assets/index-C_B1-9rF.js", "/assets/misc-DIdEn_jt.js", "/assets/components-DUNtf72c.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "path": ":type", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_layout-DHoH74NH.js", "imports": ["/assets/index-C_B1-9rF.js", "/assets/index-CLNXC84j.js", "/assets/error-boundary-3zItlMUO.js", "/assets/nav-chevrons-B3SvZV8B.js", "/assets/revalidation-ws-DK5QOPlL.js", "/assets/mdx-C9dqA6IZ.js", "/assets/progress-D6SP0Gec.js", "/assets/set-playground-CMoUFgkO.js", "/assets/seo-pBpFCWsy.js", "/assets/misc-DIdEn_jt.js", "/assets/epic-video-D8ex9vao.js", "/assets/tooltip-BoVikCa-.js", "/assets/request-info-vBkaf3Rk.js", "/assets/components-DUNtf72c.js", "/assets/index-CV3nxGFp.js", "/assets/progress-bar-CBDBzRQ2.js", "/assets/pe-D5h19vSo.js", "/assets/index-DFqQCjCw.js", "/assets/index-DH1w3QmP.js", "/assets/index-BajUQsFT.js", "/assets/loading-DW_I206H.js", "/assets/user-CbbIYEs8.js", "/assets/workshop-config-C5sYl312.js"], "css": ["/assets/index-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": "app", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/app-DJDjmdlu.js", "imports": ["/assets/index-C_B1-9rF.js", "/assets/preview-BEtmdi0E.js", "/assets/components-DUNtf72c.js", "/assets/misc-DIdEn_jt.js", "/assets/request-info-vBkaf3Rk.js", "/assets/button-39zQyNX6.js", "/assets/loading-DW_I206H.js", "/assets/index-DH1w3QmP.js", "/assets/tooltip-BoVikCa-.js", "/assets/pe-D5h19vSo.js", "/assets/progress-bar-CBDBzRQ2.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/index-DE-jwnOP.js", "imports": ["/assets/index-C_B1-9rF.js", "/assets/tooltip-BoVikCa-.js", "/assets/index-DFqQCjCw.js", "/assets/misc-DIdEn_jt.js", "/assets/diff-BNCREJvf.js", "/assets/error-boundary-3zItlMUO.js", "/assets/loading-DW_I206H.js", "/assets/discord-CEOqKs_c.js", "/assets/components-DUNtf72c.js", "/assets/index-LjRZeU7x.js", "/assets/set-playground-CMoUFgkO.js", "/assets/tests-CiM4RPOf.js", "/assets/preview-BEtmdi0E.js", "/assets/index-CV3nxGFp.js", "/assets/accordion-DLg7gJkp.js", "/assets/mdx-C9dqA6IZ.js", "/assets/epic-video-D8ex9vao.js", "/assets/index-DH1w3QmP.js", "/assets/request-info-vBkaf3Rk.js", "/assets/pe-D5h19vSo.js", "/assets/index-BajUQsFT.js", "/assets/user-CbbIYEs8.js", "/assets/workshop-config-C5sYl312.js", "/assets/progress-bar-CBDBzRQ2.js", "/assets/revalidation-ws-DK5QOPlL.js", "/assets/use-event-source-M87p8Tme.js", "/assets/button-39zQyNX6.js"], "css": ["/assets/index-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": "test", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test-C8wkLh9a.js", "imports": ["/assets/index-C_B1-9rF.js", "/assets/tests-CiM4RPOf.js", "/assets/components-DUNtf72c.js", "/assets/epic-video-D8ex9vao.js", "/assets/index-DH1w3QmP.js", "/assets/request-info-vBkaf3Rk.js", "/assets/misc-DIdEn_jt.js", "/assets/tooltip-BoVikCa-.js", "/assets/pe-D5h19vSo.js", "/assets/index-BajUQsFT.js", "/assets/loading-DW_I206H.js", "/assets/user-CbbIYEs8.js", "/assets/workshop-config-C5sYl312.js", "/assets/accordion-DLg7gJkp.js", "/assets/index-DFqQCjCw.js", "/assets/index-CV3nxGFp.js", "/assets/use-event-source-M87p8Tme.js", "/assets/set-playground-CMoUFgkO.js", "/assets/progress-bar-CBDBzRQ2.js"], "css": ["/assets/index-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_exerciseNumber_._stepNumber.index-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/exercise+/$exerciseNumber_.finished": { "id": "routes/_app+/exercise+/$exerciseNumber_.finished", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber/finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_exerciseNumber_.finished-DQg4F1NL.js", "imports": ["/assets/index-C_B1-9rF.js", "/assets/index-CLNXC84j.js", "/assets/epic-video-D8ex9vao.js", "/assets/loading-DW_I206H.js", "/assets/nav-chevrons-B3SvZV8B.js", "/assets/revalidation-ws-DK5QOPlL.js", "/assets/mdx-C9dqA6IZ.js", "/assets/progress-D6SP0Gec.js", "/assets/misc-DIdEn_jt.js", "/assets/seo-pBpFCWsy.js", "/assets/components-DUNtf72c.js", "/assets/index-DH1w3QmP.js", "/assets/request-info-vBkaf3Rk.js", "/assets/tooltip-BoVikCa-.js", "/assets/pe-D5h19vSo.js", "/assets/index-BajUQsFT.js", "/assets/user-CbbIYEs8.js", "/assets/workshop-config-C5sYl312.js", "/assets/progress-bar-CBDBzRQ2.js"], "css": ["/assets/index-DUnRvy1A.css"] }, "routes/_app+/finished": { "id": "routes/_app+/finished", "parentId": "routes/_app+/_layout", "path": "finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/finished-rUzUjnEm.js", "imports": ["/assets/index-C_B1-9rF.js", "/assets/index-CLNXC84j.js", "/assets/epic-video-D8ex9vao.js", "/assets/loading-DW_I206H.js", "/assets/nav-chevrons-B3SvZV8B.js", "/assets/revalidation-ws-DK5QOPlL.js", "/assets/mdx-C9dqA6IZ.js", "/assets/misc-DIdEn_jt.js", "/assets/seo-pBpFCWsy.js", "/assets/progress-D6SP0Gec.js", "/assets/components-DUNtf72c.js", "/assets/index-DH1w3QmP.js", "/assets/request-info-vBkaf3Rk.js", "/assets/tooltip-BoVikCa-.js", "/assets/pe-D5h19vSo.js", "/assets/index-BajUQsFT.js", "/assets/user-CbbIYEs8.js", "/assets/workshop-config-C5sYl312.js", "/assets/progress-bar-CBDBzRQ2.js"], "css": ["/assets/index-DUnRvy1A.css"] }, "routes/_app+/index": { "id": "routes/_app+/index", "parentId": "routes/_app+/_layout", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/index-mivnjq36.js", "imports": ["/assets/index-C_B1-9rF.js", "/assets/index-CLNXC84j.js", "/assets/epic-video-D8ex9vao.js", "/assets/error-boundary-3zItlMUO.js", "/assets/mdx-C9dqA6IZ.js", "/assets/misc-DIdEn_jt.js", "/assets/progress-D6SP0Gec.js", "/assets/components-DUNtf72c.js", "/assets/index-DH1w3QmP.js", "/assets/request-info-vBkaf3Rk.js", "/assets/tooltip-BoVikCa-.js", "/assets/pe-D5h19vSo.js", "/assets/index-BajUQsFT.js", "/assets/loading-DW_I206H.js", "/assets/user-CbbIYEs8.js", "/assets/workshop-config-C5sYl312.js", "/assets/progress-bar-CBDBzRQ2.js"], "css": ["/assets/index-DUnRvy1A.css"] }, "routes/_app+/login": { "id": "routes/_app+/login", "parentId": "routes/_app+/_layout", "path": "login", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/login-CdNej0Z7.js", "imports": ["/assets/index-C_B1-9rF.js", "/assets/use-event-source-M87p8Tme.js", "/assets/button-39zQyNX6.js", "/assets/loading-DW_I206H.js", "/assets/product-CYOFfeJM.js", "/assets/workshop-config-C5sYl312.js", "/assets/request-info-vBkaf3Rk.js", "/assets/components-DUNtf72c.js", "/assets/misc-DIdEn_jt.js", "/assets/index-DH1w3QmP.js", "/assets/tooltip-BoVikCa-.js", "/assets/pe-D5h19vSo.js"], "css": [] }, "routes/_app+/support": { "id": "routes/_app+/support", "parentId": "routes/_app+/_layout", "path": "support", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/support-CPzYlWkd.js", "imports": ["/assets/index-C_B1-9rF.js", "/assets/components-DUNtf72c.js"], "css": [] }, "routes/admin+/_layout": { "id": "routes/admin+/_layout", "parentId": "root", "path": "admin", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-BJbMl6SJ.js", "imports": ["/assets/index-C_B1-9rF.js", "/assets/components-DUNtf72c.js"], "css": [] }, "routes/admin+/apps": { "id": "routes/admin+/apps", "parentId": "routes/admin+/_layout", "path": "apps", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/apps-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/admin+/cache": { "id": "routes/admin+/cache", "parentId": "routes/admin+/_layout", "path": "cache", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/cache-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/admin+/index": { "id": "routes/admin+/index", "parentId": "routes/admin+/_layout", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-DDqzbGM2.js", "imports": ["/assets/index-C_B1-9rF.js", "/assets/misc-DIdEn_jt.js", "/assets/tooltip-BoVikCa-.js", "/assets/progress-D6SP0Gec.js", "/assets/components-DUNtf72c.js", "/assets/pe-D5h19vSo.js"], "css": [] }, "routes/admin+/version": { "id": "routes/admin+/version", "parentId": "routes/admin+/_layout", "path": "version", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/version-CIF3cX3N.js", "imports": ["/assets/index-C_B1-9rF.js", "/assets/workshop-config-C5sYl312.js", "/assets/components-DUNtf72c.js"], "css": [] }, "routes/apps": { "id": "routes/apps", "parentId": "root", "path": "apps", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/apps-DP2rzg_V.js", "imports": [], "css": [] }, "routes/diff": { "id": "routes/diff", "parentId": "root", "path": "diff", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/diff-B3oaU_KB.js", "imports": ["/assets/index-C_B1-9rF.js", "/assets/misc-DIdEn_jt.js", "/assets/diff-BNCREJvf.js", "/assets/nav-chevrons-B3SvZV8B.js", "/assets/components-DUNtf72c.js", "/assets/accordion-DLg7gJkp.js", "/assets/tooltip-BoVikCa-.js", "/assets/index-DFqQCjCw.js", "/assets/index-CV3nxGFp.js", "/assets/mdx-C9dqA6IZ.js", "/assets/epic-video-D8ex9vao.js", "/assets/index-DH1w3QmP.js", "/assets/request-info-vBkaf3Rk.js", "/assets/pe-D5h19vSo.js", "/assets/index-BajUQsFT.js", "/assets/loading-DW_I206H.js", "/assets/user-CbbIYEs8.js", "/assets/workshop-config-C5sYl312.js", "/assets/progress-bar-CBDBzRQ2.js", "/assets/revalidation-ws-DK5QOPlL.js"], "css": ["/assets/index-DUnRvy1A.css"] }, "routes/exercises": { "id": "routes/exercises", "parentId": "root", "path": "exercises", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/exercises-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/launch-editor": { "id": "routes/launch-editor", "parentId": "root", "path": "launch-editor", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/launch-editor-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/login-sse": { "id": "routes/login-sse", "parentId": "root", "path": "login-sse", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/login-sse-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/og": { "id": "routes/og", "parentId": "root", "path": "og", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/og-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/onboarding": { "id": "routes/onboarding", "parentId": "root", "path": "onboarding", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/onboarding-CC9zz4rl.js", "imports": ["/assets/index-C_B1-9rF.js", "/assets/button-39zQyNX6.js", "/assets/epic-video-D8ex9vao.js", "/assets/components-DUNtf72c.js", "/assets/misc-DIdEn_jt.js", "/assets/index-DH1w3QmP.js", "/assets/request-info-vBkaf3Rk.js", "/assets/tooltip-BoVikCa-.js", "/assets/pe-D5h19vSo.js", "/assets/index-BajUQsFT.js", "/assets/loading-DW_I206H.js", "/assets/user-CbbIYEs8.js", "/assets/workshop-config-C5sYl312.js"], "css": ["/assets/index-DUnRvy1A.css"] }, "routes/processes": { "id": "routes/processes", "parentId": "root", "path": "processes", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/processes-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/progress": { "id": "routes/progress", "parentId": "root", "path": "progress", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/progress-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/robots[.]txt": { "id": "routes/robots[.]txt", "parentId": "root", "path": "robots.txt", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/robots_._txt-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/set-playground": { "id": "routes/set-playground", "parentId": "root", "path": "set-playground", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/set-playground-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/sitemap[.]xml": { "id": "routes/sitemap[.]xml", "parentId": "root", "path": "sitemap.xml", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/sitemap_._xml-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/start": { "id": "routes/start", "parentId": "root", "path": "start", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/start-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/test": { "id": "routes/test", "parentId": "root", "path": "test", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/theme/index": { "id": "routes/theme/index", "parentId": "root", "path": "theme", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-DP2rzg_V.js", "imports": [], "css": [] }, "routes/video-player/index": { "id": "routes/video-player/index", "parentId": "root", "path": "video-player", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-K6Dvbx-E.js", "imports": [], "css": [] } }, "url": "/assets/manifest-62ea49c4.js", "version": "62ea49c4" };
11040
+ const serverManifest = { "entry": { "module": "/assets/entry.client-CQusg5Iz.js", "imports": ["/assets/index-CGzylDPY.js", "/assets/components-DrvY4pal.js"], "css": [] }, "routes": { "root": { "id": "root", "parentId": void 0, "path": "", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/root-DGY0y7_0.js", "imports": ["/assets/index-CGzylDPY.js", "/assets/components-DrvY4pal.js", "/assets/misc-BtjCSy-T.js", "/assets/pe-DXT2FOp1.js", "/assets/error-boundary-Beul7lrT.js", "/assets/progress-bar-CTPCfvDi.js", "/assets/index-CB8bjE90.js", "/assets/tooltip-Bp9KHnLy.js", "/assets/index-BOQWfIQC.js", "/assets/presence-CrYBA3ta.js", "/assets/seo-pBpFCWsy.js"], "css": [] }, "routes/$": { "id": "routes/$", "parentId": "root", "path": "*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_-CjjFMNGC.js", "imports": ["/assets/index-CGzylDPY.js", "/assets/error-boundary-Beul7lrT.js", "/assets/misc-BtjCSy-T.js", "/assets/components-DrvY4pal.js"], "css": [] }, "routes/_app+/_layout": { "id": "routes/_app+/_layout", "parentId": "root", "path": void 0, "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-Muw3ERYT.js", "imports": ["/assets/index-CGzylDPY.js", "/assets/misc-BtjCSy-T.js", "/assets/pe-DXT2FOp1.js", "/assets/product-gqq_YQBW.js", "/assets/revalidation-ws-DYaJNyw1.js", "/assets/tooltip-Bp9KHnLy.js", "/assets/index-BHwOR8R1.js", "/assets/user-C0j04V55.js", "/assets/workshop-config-oL_FWDKq.js", "/assets/presence-CrYBA3ta.js", "/assets/progress-D-HsH4j3.js", "/assets/index-BOQWfIQC.js", "/assets/components-DrvY4pal.js"], "css": [] }, "routes/_app+/account": { "id": "routes/_app+/account", "parentId": "routes/_app+/_layout", "path": "account", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/account-Cc968svU.js", "imports": ["/assets/index-CGzylDPY.js", "/assets/button-BS845Tjo.js", "/assets/misc-BtjCSy-T.js", "/assets/tooltip-Bp9KHnLy.js", "/assets/user-C0j04V55.js", "/assets/workshop-config-oL_FWDKq.js", "/assets/components-DrvY4pal.js"], "css": [] }, "routes/_app+/app.$appName+/$": { "id": "routes/_app+/app.$appName+/$", "parentId": "routes/_app+/_layout", "path": "app/:appName/*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/api.$": { "id": "routes/_app+/app.$appName+/api.$", "parentId": "routes/_app+/_layout", "path": "app/:appName/api/*", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/api._-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/epic_ws[.js]": { "id": "routes/_app+/app.$appName+/epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/:appName/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/index": { "id": "routes/_app+/app.$appName+/index", "parentId": "routes/_app+/_layout", "path": "app/:appName/", "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/test.$testName": { "id": "routes/_app+/app.$appName+/test.$testName", "parentId": "routes/_app+/_layout", "path": "app/:appName/test/:testName", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test._testName-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/test.epic_ws[.js]": { "id": "routes/_app+/app.$appName+/test.epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/:appName/test/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test.epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.epic_ws[.js]": { "id": "routes/_app+/app.epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/app.epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/discord": { "id": "routes/_app+/discord", "parentId": "routes/_app+/_layout", "path": "discord", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/discord-DILzAZN8.js", "imports": ["/assets/discord-BfP_Rny5.js", "/assets/index-CGzylDPY.js", "/assets/misc-BtjCSy-T.js", "/assets/components-DrvY4pal.js", "/assets/user-C0j04V55.js", "/assets/workshop-config-oL_FWDKq.js"], "css": [] }, "routes/_app+/exercise+/_layout": { "id": "routes/_app+/exercise+/_layout", "parentId": "routes/_app+/_layout", "path": "exercise", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-CwTidn3v.js", "imports": ["/assets/index-CGzylDPY.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber": { "id": "routes/_app+/exercise+/$exerciseNumber", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber-CqkGzsgV.js", "imports": ["/assets/index-CGzylDPY.js", "/assets/index-egcHQOpF.js", "/assets/epic-video-qHKPWPt1.js", "/assets/revalidation-ws-DYaJNyw1.js", "/assets/mdx-CsS30JUo.js", "/assets/progress-D-HsH4j3.js", "/assets/misc-BtjCSy-T.js", "/assets/seo-pBpFCWsy.js", "/assets/components-DrvY4pal.js", "/assets/index-BOQWfIQC.js", "/assets/tooltip-Bp9KHnLy.js", "/assets/pe-DXT2FOp1.js", "/assets/loading-C2wPVvQw.js", "/assets/user-C0j04V55.js", "/assets/workshop-config-oL_FWDKq.js", "/assets/progress-bar-CTPCfvDi.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber/:stepNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber_._stepNumber-BNWGPi9m.js", "imports": ["/assets/index-CGzylDPY.js", "/assets/misc-BtjCSy-T.js", "/assets/components-DrvY4pal.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "path": ":type", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_layout-BMa5nZcJ.js", "imports": ["/assets/index-CGzylDPY.js", "/assets/index-egcHQOpF.js", "/assets/error-boundary-Beul7lrT.js", "/assets/nav-chevrons-2hLTwAZb.js", "/assets/revalidation-ws-DYaJNyw1.js", "/assets/mdx-CsS30JUo.js", "/assets/progress-D-HsH4j3.js", "/assets/set-playground-DQzAhC0t.js", "/assets/seo-pBpFCWsy.js", "/assets/misc-BtjCSy-T.js", "/assets/epic-video-qHKPWPt1.js", "/assets/tooltip-Bp9KHnLy.js", "/assets/index-BOQWfIQC.js", "/assets/components-DrvY4pal.js", "/assets/index-BHwOR8R1.js", "/assets/progress-bar-CTPCfvDi.js", "/assets/pe-DXT2FOp1.js", "/assets/index-BPegC-d3.js", "/assets/loading-C2wPVvQw.js", "/assets/user-C0j04V55.js", "/assets/workshop-config-oL_FWDKq.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": "app", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/app-BOqXK9hi.js", "imports": ["/assets/index-CGzylDPY.js", "/assets/preview-C2y4Z0qO.js", "/assets/components-DrvY4pal.js", "/assets/misc-BtjCSy-T.js", "/assets/index-BOQWfIQC.js", "/assets/tooltip-Bp9KHnLy.js", "/assets/pe-DXT2FOp1.js", "/assets/button-BS845Tjo.js", "/assets/loading-C2wPVvQw.js", "/assets/progress-bar-CTPCfvDi.js"], "css": [] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/index-DbCT6N5p.js", "imports": ["/assets/index-CGzylDPY.js", "/assets/tooltip-Bp9KHnLy.js", "/assets/index-BPegC-d3.js", "/assets/misc-BtjCSy-T.js", "/assets/diff-DtvfyjPI.js", "/assets/error-boundary-Beul7lrT.js", "/assets/loading-C2wPVvQw.js", "/assets/discord-BfP_Rny5.js", "/assets/components-DrvY4pal.js", "/assets/index-CB8bjE90.js", "/assets/set-playground-DQzAhC0t.js", "/assets/tests-LWW8wCYZ.js", "/assets/preview-C2y4Z0qO.js", "/assets/index-BHwOR8R1.js", "/assets/accordion-C-sW--in.js", "/assets/mdx-CsS30JUo.js", "/assets/epic-video-qHKPWPt1.js", "/assets/index-BOQWfIQC.js", "/assets/pe-DXT2FOp1.js", "/assets/user-C0j04V55.js", "/assets/workshop-config-oL_FWDKq.js", "/assets/progress-bar-CTPCfvDi.js", "/assets/revalidation-ws-DYaJNyw1.js", "/assets/use-event-source-AZJtQsFX.js", "/assets/button-BS845Tjo.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout", "path": "test", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test-CDWRwwO-.js", "imports": ["/assets/index-CGzylDPY.js", "/assets/tests-LWW8wCYZ.js", "/assets/components-DrvY4pal.js", "/assets/epic-video-qHKPWPt1.js", "/assets/index-BOQWfIQC.js", "/assets/misc-BtjCSy-T.js", "/assets/tooltip-Bp9KHnLy.js", "/assets/pe-DXT2FOp1.js", "/assets/loading-C2wPVvQw.js", "/assets/user-C0j04V55.js", "/assets/workshop-config-oL_FWDKq.js", "/assets/accordion-C-sW--in.js", "/assets/index-BPegC-d3.js", "/assets/index-BHwOR8R1.js", "/assets/use-event-source-AZJtQsFX.js", "/assets/set-playground-DQzAhC0t.js", "/assets/progress-bar-CTPCfvDi.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index": { "id": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index", "parentId": "routes/_app+/exercise+/$exerciseNumber_.$stepNumber", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_exerciseNumber_._stepNumber.index-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/exercise+/$exerciseNumber_.finished": { "id": "routes/_app+/exercise+/$exerciseNumber_.finished", "parentId": "routes/_app+/exercise+/_layout", "path": ":exerciseNumber/finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_exerciseNumber_.finished-CdNhLhKg.js", "imports": ["/assets/index-CGzylDPY.js", "/assets/index-egcHQOpF.js", "/assets/epic-video-qHKPWPt1.js", "/assets/loading-C2wPVvQw.js", "/assets/nav-chevrons-2hLTwAZb.js", "/assets/revalidation-ws-DYaJNyw1.js", "/assets/mdx-CsS30JUo.js", "/assets/progress-D-HsH4j3.js", "/assets/misc-BtjCSy-T.js", "/assets/seo-pBpFCWsy.js", "/assets/components-DrvY4pal.js", "/assets/index-BOQWfIQC.js", "/assets/tooltip-Bp9KHnLy.js", "/assets/pe-DXT2FOp1.js", "/assets/user-C0j04V55.js", "/assets/workshop-config-oL_FWDKq.js", "/assets/progress-bar-CTPCfvDi.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/finished": { "id": "routes/_app+/finished", "parentId": "routes/_app+/_layout", "path": "finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/finished-DUKfL220.js", "imports": ["/assets/index-CGzylDPY.js", "/assets/index-egcHQOpF.js", "/assets/epic-video-qHKPWPt1.js", "/assets/loading-C2wPVvQw.js", "/assets/nav-chevrons-2hLTwAZb.js", "/assets/revalidation-ws-DYaJNyw1.js", "/assets/mdx-CsS30JUo.js", "/assets/misc-BtjCSy-T.js", "/assets/seo-pBpFCWsy.js", "/assets/progress-D-HsH4j3.js", "/assets/components-DrvY4pal.js", "/assets/index-BOQWfIQC.js", "/assets/tooltip-Bp9KHnLy.js", "/assets/pe-DXT2FOp1.js", "/assets/user-C0j04V55.js", "/assets/workshop-config-oL_FWDKq.js", "/assets/progress-bar-CTPCfvDi.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/index": { "id": "routes/_app+/index", "parentId": "routes/_app+/_layout", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/index-oED4uZLa.js", "imports": ["/assets/index-CGzylDPY.js", "/assets/index-egcHQOpF.js", "/assets/epic-video-qHKPWPt1.js", "/assets/error-boundary-Beul7lrT.js", "/assets/mdx-CsS30JUo.js", "/assets/misc-BtjCSy-T.js", "/assets/progress-D-HsH4j3.js", "/assets/components-DrvY4pal.js", "/assets/index-BOQWfIQC.js", "/assets/tooltip-Bp9KHnLy.js", "/assets/pe-DXT2FOp1.js", "/assets/loading-C2wPVvQw.js", "/assets/user-C0j04V55.js", "/assets/workshop-config-oL_FWDKq.js", "/assets/progress-bar-CTPCfvDi.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/login": { "id": "routes/_app+/login", "parentId": "routes/_app+/_layout", "path": "login", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/login-DoU7gifi.js", "imports": ["/assets/index-CGzylDPY.js", "/assets/use-event-source-AZJtQsFX.js", "/assets/button-BS845Tjo.js", "/assets/loading-C2wPVvQw.js", "/assets/product-gqq_YQBW.js", "/assets/workshop-config-oL_FWDKq.js", "/assets/index-BOQWfIQC.js", "/assets/components-DrvY4pal.js", "/assets/misc-BtjCSy-T.js", "/assets/tooltip-Bp9KHnLy.js", "/assets/pe-DXT2FOp1.js"], "css": [] }, "routes/_app+/preferences": { "id": "routes/_app+/preferences", "parentId": "routes/_app+/_layout", "path": "preferences", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/preferences-br0VSK51.js", "imports": ["/assets/index-CGzylDPY.js", "/assets/button-BS845Tjo.js", "/assets/misc-BtjCSy-T.js", "/assets/tooltip-Bp9KHnLy.js", "/assets/components-DrvY4pal.js"], "css": [] }, "routes/_app+/support": { "id": "routes/_app+/support", "parentId": "routes/_app+/_layout", "path": "support", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/support-lgEG2piy.js", "imports": ["/assets/index-CGzylDPY.js", "/assets/components-DrvY4pal.js"], "css": [] }, "routes/admin+/_layout": { "id": "routes/admin+/_layout", "parentId": "root", "path": "admin", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-DV29dlKr.js", "imports": ["/assets/index-CGzylDPY.js", "/assets/components-DrvY4pal.js"], "css": [] }, "routes/admin+/apps": { "id": "routes/admin+/apps", "parentId": "routes/admin+/_layout", "path": "apps", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/apps-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/admin+/cache": { "id": "routes/admin+/cache", "parentId": "routes/admin+/_layout", "path": "cache", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/cache-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/admin+/index": { "id": "routes/admin+/index", "parentId": "routes/admin+/_layout", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-cZQeGrqL.js", "imports": ["/assets/index-CGzylDPY.js", "/assets/misc-BtjCSy-T.js", "/assets/tooltip-Bp9KHnLy.js", "/assets/progress-D-HsH4j3.js", "/assets/components-DrvY4pal.js", "/assets/pe-DXT2FOp1.js"], "css": [] }, "routes/admin+/version": { "id": "routes/admin+/version", "parentId": "routes/admin+/_layout", "path": "version", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/version-D61Qvt0X.js", "imports": ["/assets/index-CGzylDPY.js", "/assets/workshop-config-oL_FWDKq.js", "/assets/components-DrvY4pal.js"], "css": [] }, "routes/apps": { "id": "routes/apps", "parentId": "root", "path": "apps", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/apps-DP2rzg_V.js", "imports": [], "css": [] }, "routes/diff": { "id": "routes/diff", "parentId": "root", "path": "diff", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/diff-D0e_PrB7.js", "imports": ["/assets/index-CGzylDPY.js", "/assets/misc-BtjCSy-T.js", "/assets/diff-DtvfyjPI.js", "/assets/nav-chevrons-2hLTwAZb.js", "/assets/components-DrvY4pal.js", "/assets/accordion-C-sW--in.js", "/assets/tooltip-Bp9KHnLy.js", "/assets/index-BPegC-d3.js", "/assets/index-BHwOR8R1.js", "/assets/mdx-CsS30JUo.js", "/assets/epic-video-qHKPWPt1.js", "/assets/index-BOQWfIQC.js", "/assets/pe-DXT2FOp1.js", "/assets/loading-C2wPVvQw.js", "/assets/user-C0j04V55.js", "/assets/workshop-config-oL_FWDKq.js", "/assets/progress-bar-CTPCfvDi.js", "/assets/revalidation-ws-DYaJNyw1.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/exercises": { "id": "routes/exercises", "parentId": "root", "path": "exercises", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/exercises-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/launch-editor": { "id": "routes/launch-editor", "parentId": "root", "path": "launch-editor", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/launch-editor-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/login-sse": { "id": "routes/login-sse", "parentId": "root", "path": "login-sse", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/login-sse-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/og": { "id": "routes/og", "parentId": "root", "path": "og", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/og-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/onboarding": { "id": "routes/onboarding", "parentId": "root", "path": "onboarding", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/onboarding-Cu6eD7KS.js", "imports": ["/assets/index-CGzylDPY.js", "/assets/button-BS845Tjo.js", "/assets/epic-video-qHKPWPt1.js", "/assets/components-DrvY4pal.js", "/assets/misc-BtjCSy-T.js", "/assets/index-BOQWfIQC.js", "/assets/tooltip-Bp9KHnLy.js", "/assets/pe-DXT2FOp1.js", "/assets/loading-C2wPVvQw.js", "/assets/user-C0j04V55.js", "/assets/workshop-config-oL_FWDKq.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/processes": { "id": "routes/processes", "parentId": "root", "path": "processes", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/processes-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/progress": { "id": "routes/progress", "parentId": "root", "path": "progress", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/progress-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/robots[.]txt": { "id": "routes/robots[.]txt", "parentId": "root", "path": "robots.txt", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/robots_._txt-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/set-playground": { "id": "routes/set-playground", "parentId": "root", "path": "set-playground", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/set-playground-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/sitemap[.]xml": { "id": "routes/sitemap[.]xml", "parentId": "root", "path": "sitemap.xml", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/sitemap_._xml-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/start": { "id": "routes/start", "parentId": "root", "path": "start", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/start-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/test": { "id": "routes/test", "parentId": "root", "path": "test", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/theme/index": { "id": "routes/theme/index", "parentId": "root", "path": "theme", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-DP2rzg_V.js", "imports": [], "css": [] }, "routes/video-player/index": { "id": "routes/video-player/index", "parentId": "root", "path": "video-player", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-K6Dvbx-E.js", "imports": [], "css": [] } }, "url": "/assets/manifest-93f34003.js", "version": "93f34003" };
10977
11041
  const mode = "production";
10978
11042
  const assetsBuildDirectory = "build/client";
10979
11043
  const basename = "/";
@@ -11174,13 +11238,21 @@ const routes = {
11174
11238
  caseSensitive: void 0,
11175
11239
  module: route23
11176
11240
  },
11241
+ "routes/_app+/preferences": {
11242
+ id: "routes/_app+/preferences",
11243
+ parentId: "routes/_app+/_layout",
11244
+ path: "preferences",
11245
+ index: void 0,
11246
+ caseSensitive: void 0,
11247
+ module: route24
11248
+ },
11177
11249
  "routes/_app+/support": {
11178
11250
  id: "routes/_app+/support",
11179
11251
  parentId: "routes/_app+/_layout",
11180
11252
  path: "support",
11181
11253
  index: void 0,
11182
11254
  caseSensitive: void 0,
11183
- module: route24
11255
+ module: route25
11184
11256
  },
11185
11257
  "routes/admin+/_layout": {
11186
11258
  id: "routes/admin+/_layout",
@@ -11188,7 +11260,7 @@ const routes = {
11188
11260
  path: "admin",
11189
11261
  index: void 0,
11190
11262
  caseSensitive: void 0,
11191
- module: route25
11263
+ module: route26
11192
11264
  },
11193
11265
  "routes/admin+/apps": {
11194
11266
  id: "routes/admin+/apps",
@@ -11196,7 +11268,7 @@ const routes = {
11196
11268
  path: "apps",
11197
11269
  index: void 0,
11198
11270
  caseSensitive: void 0,
11199
- module: route26
11271
+ module: route27
11200
11272
  },
11201
11273
  "routes/admin+/cache": {
11202
11274
  id: "routes/admin+/cache",
@@ -11204,7 +11276,7 @@ const routes = {
11204
11276
  path: "cache",
11205
11277
  index: void 0,
11206
11278
  caseSensitive: void 0,
11207
- module: route27
11279
+ module: route28
11208
11280
  },
11209
11281
  "routes/admin+/index": {
11210
11282
  id: "routes/admin+/index",
@@ -11212,7 +11284,7 @@ const routes = {
11212
11284
  path: void 0,
11213
11285
  index: true,
11214
11286
  caseSensitive: void 0,
11215
- module: route28
11287
+ module: route29
11216
11288
  },
11217
11289
  "routes/admin+/version": {
11218
11290
  id: "routes/admin+/version",
@@ -11220,7 +11292,7 @@ const routes = {
11220
11292
  path: "version",
11221
11293
  index: void 0,
11222
11294
  caseSensitive: void 0,
11223
- module: route29
11295
+ module: route30
11224
11296
  },
11225
11297
  "routes/apps": {
11226
11298
  id: "routes/apps",
@@ -11228,7 +11300,7 @@ const routes = {
11228
11300
  path: "apps",
11229
11301
  index: void 0,
11230
11302
  caseSensitive: void 0,
11231
- module: route30
11303
+ module: route31
11232
11304
  },
11233
11305
  "routes/diff": {
11234
11306
  id: "routes/diff",
@@ -11236,7 +11308,7 @@ const routes = {
11236
11308
  path: "diff",
11237
11309
  index: void 0,
11238
11310
  caseSensitive: void 0,
11239
- module: route31
11311
+ module: route32
11240
11312
  },
11241
11313
  "routes/exercises": {
11242
11314
  id: "routes/exercises",
@@ -11244,7 +11316,7 @@ const routes = {
11244
11316
  path: "exercises",
11245
11317
  index: void 0,
11246
11318
  caseSensitive: void 0,
11247
- module: route32
11319
+ module: route33
11248
11320
  },
11249
11321
  "routes/launch-editor": {
11250
11322
  id: "routes/launch-editor",
@@ -11252,7 +11324,7 @@ const routes = {
11252
11324
  path: "launch-editor",
11253
11325
  index: void 0,
11254
11326
  caseSensitive: void 0,
11255
- module: route33
11327
+ module: route34
11256
11328
  },
11257
11329
  "routes/login-sse": {
11258
11330
  id: "routes/login-sse",
@@ -11260,7 +11332,7 @@ const routes = {
11260
11332
  path: "login-sse",
11261
11333
  index: void 0,
11262
11334
  caseSensitive: void 0,
11263
- module: route34
11335
+ module: route35
11264
11336
  },
11265
11337
  "routes/og": {
11266
11338
  id: "routes/og",
@@ -11268,7 +11340,7 @@ const routes = {
11268
11340
  path: "og",
11269
11341
  index: void 0,
11270
11342
  caseSensitive: void 0,
11271
- module: route35
11343
+ module: route36
11272
11344
  },
11273
11345
  "routes/onboarding": {
11274
11346
  id: "routes/onboarding",
@@ -11276,7 +11348,7 @@ const routes = {
11276
11348
  path: "onboarding",
11277
11349
  index: void 0,
11278
11350
  caseSensitive: void 0,
11279
- module: route36
11351
+ module: route37
11280
11352
  },
11281
11353
  "routes/processes": {
11282
11354
  id: "routes/processes",
@@ -11284,7 +11356,7 @@ const routes = {
11284
11356
  path: "processes",
11285
11357
  index: void 0,
11286
11358
  caseSensitive: void 0,
11287
- module: route37
11359
+ module: route38
11288
11360
  },
11289
11361
  "routes/progress": {
11290
11362
  id: "routes/progress",
@@ -11292,7 +11364,7 @@ const routes = {
11292
11364
  path: "progress",
11293
11365
  index: void 0,
11294
11366
  caseSensitive: void 0,
11295
- module: route38
11367
+ module: route39
11296
11368
  },
11297
11369
  "routes/robots[.]txt": {
11298
11370
  id: "routes/robots[.]txt",
@@ -11300,7 +11372,7 @@ const routes = {
11300
11372
  path: "robots.txt",
11301
11373
  index: void 0,
11302
11374
  caseSensitive: void 0,
11303
- module: route39
11375
+ module: route40
11304
11376
  },
11305
11377
  "routes/set-playground": {
11306
11378
  id: "routes/set-playground",
@@ -11308,7 +11380,7 @@ const routes = {
11308
11380
  path: "set-playground",
11309
11381
  index: void 0,
11310
11382
  caseSensitive: void 0,
11311
- module: route40
11383
+ module: route41
11312
11384
  },
11313
11385
  "routes/sitemap[.]xml": {
11314
11386
  id: "routes/sitemap[.]xml",
@@ -11316,7 +11388,7 @@ const routes = {
11316
11388
  path: "sitemap.xml",
11317
11389
  index: void 0,
11318
11390
  caseSensitive: void 0,
11319
- module: route41
11391
+ module: route42
11320
11392
  },
11321
11393
  "routes/start": {
11322
11394
  id: "routes/start",
@@ -11324,7 +11396,7 @@ const routes = {
11324
11396
  path: "start",
11325
11397
  index: void 0,
11326
11398
  caseSensitive: void 0,
11327
- module: route42
11399
+ module: route43
11328
11400
  },
11329
11401
  "routes/test": {
11330
11402
  id: "routes/test",
@@ -11332,7 +11404,7 @@ const routes = {
11332
11404
  path: "test",
11333
11405
  index: void 0,
11334
11406
  caseSensitive: void 0,
11335
- module: route43
11407
+ module: route44
11336
11408
  },
11337
11409
  "routes/theme/index": {
11338
11410
  id: "routes/theme/index",
@@ -11340,7 +11412,7 @@ const routes = {
11340
11412
  path: "theme",
11341
11413
  index: void 0,
11342
11414
  caseSensitive: void 0,
11343
- module: route44
11415
+ module: route45
11344
11416
  },
11345
11417
  "routes/video-player/index": {
11346
11418
  id: "routes/video-player/index",
@@ -11348,7 +11420,7 @@ const routes = {
11348
11420
  path: "video-player",
11349
11421
  index: void 0,
11350
11422
  caseSensitive: void 0,
11351
- module: route45
11423
+ module: route46
11352
11424
  }
11353
11425
  };
11354
11426
  export {