@epic-web/workshop-app 6.77.0 → 6.77.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/client/assets/{_exerciseNumber-C1aZpAWV.js → _exerciseNumber-JuXb6JTN.js} +2 -2
- package/build/client/assets/{_exerciseNumber-C1aZpAWV.js.map → _exerciseNumber-JuXb6JTN.js.map} +1 -1
- package/build/client/assets/{_exerciseNumber_.finished-BICggZV1.js → _exerciseNumber_.finished-DD-1txyR.js} +2 -2
- package/build/client/assets/{_exerciseNumber_.finished-BICggZV1.js.map → _exerciseNumber_.finished-DD-1txyR.js.map} +1 -1
- package/build/client/assets/_extra-BfK-kKBL.js +2 -0
- package/build/client/assets/_extra-BfK-kKBL.js.map +1 -0
- package/build/client/assets/{_layout-BZI3FoQD.js → _layout-BsHVX3B_.js} +2 -2
- package/build/client/assets/{_layout-BZI3FoQD.js.map → _layout-BsHVX3B_.js.map} +1 -1
- package/build/client/assets/{_layout-CunOyAg4.js → _layout-CDyeQVKG.js} +2 -2
- package/build/client/assets/{_layout-CunOyAg4.js.map → _layout-CDyeQVKG.js.map} +1 -1
- package/build/client/assets/_layout-mVyOtxmC.js +2 -0
- package/build/client/assets/_layout-mVyOtxmC.js.map +1 -0
- package/build/client/assets/{account-C96cpeZR.js → account-BKXMYhfO.js} +2 -2
- package/build/client/assets/{account-C96cpeZR.js.map → account-BKXMYhfO.js.map} +1 -1
- package/build/client/assets/{app-CJniokic.js → app-AWsnszeo.js} +2 -2
- package/build/client/assets/{app-CJniokic.js.map → app-AWsnszeo.js.map} +1 -1
- package/build/client/assets/{cache-CAr50MIB.js → cache-CxMFS2A_.js} +2 -2
- package/build/client/assets/{cache-CAr50MIB.js.map → cache-CxMFS2A_.js.map} +1 -1
- package/build/client/assets/{db-DAnX-T3_.js → db-BZ-tFzMp.js} +2 -2
- package/build/client/assets/{db-DAnX-T3_.js.map → db-BZ-tFzMp.js.map} +1 -1
- package/build/client/assets/{diff-D8TUonC2.js → diff-0VO9C_Sf.js} +2 -2
- package/build/client/assets/{diff-D8TUonC2.js.map → diff-0VO9C_Sf.js.map} +1 -1
- package/build/client/assets/{diff-Col_iM3X.js → diff-CC_jaH50.js} +2 -2
- package/build/client/assets/{diff-Col_iM3X.js.map → diff-CC_jaH50.js.map} +1 -1
- package/build/client/assets/discord-BVfxP4Rd.js +2 -0
- package/build/client/assets/discord-BVfxP4Rd.js.map +1 -0
- package/build/client/assets/{discord-BJkw0IrB.js → discord-XhHqPI49.js} +2 -2
- package/build/client/assets/{discord-BJkw0IrB.js.map → discord-XhHqPI49.js.map} +1 -1
- package/build/client/assets/{epic-video-BJW6MU1i.js → epic-video-D4jBdSKs.js} +2 -2
- package/build/client/assets/{epic-video-BJW6MU1i.js.map → epic-video-D4jBdSKs.js.map} +1 -1
- package/build/client/assets/{epic-video-jtxu_0bl.js → epic-video-Ddc9rYLT.js} +2 -2
- package/build/client/assets/{epic-video-jtxu_0bl.js.map → epic-video-Ddc9rYLT.js.map} +1 -1
- package/build/client/assets/{finished-C2jP5uE7.js → finished-BSfM_f4M.js} +2 -2
- package/build/client/assets/{finished-C2jP5uE7.js.map → finished-BSfM_f4M.js.map} +1 -1
- package/build/client/assets/{index-CdzVFL-Z.js → index-BrVvTrwg.js} +2 -2
- package/build/client/assets/{index-CdzVFL-Z.js.map → index-BrVvTrwg.js.map} +1 -1
- package/build/client/assets/{index-Dpyv8N6m.js → index-CfPaTqRT.js} +2 -2
- package/build/client/assets/{index-Dpyv8N6m.js.map → index-CfPaTqRT.js.map} +1 -1
- package/build/client/assets/{index-X8or9u7t.js → index-CuCZuiBp.js} +2 -2
- package/build/client/assets/{index-X8or9u7t.js.map → index-CuCZuiBp.js.map} +1 -1
- package/build/client/assets/{index-KRgoKRWG.js → index-D0vH1MiQ.js} +2 -2
- package/build/client/assets/{index-KRgoKRWG.js.map → index-D0vH1MiQ.js.map} +1 -1
- package/build/client/assets/{index-BCQgVrao.js → index-DTC_5pri.js} +2 -2
- package/build/client/assets/{index-BCQgVrao.js.map → index-DTC_5pri.js.map} +1 -1
- package/build/client/assets/{launch-editor-D2exGfVu.js → launch-editor-0oPpbFQe.js} +2 -2
- package/build/client/assets/{launch-editor-D2exGfVu.js.map → launch-editor-0oPpbFQe.js.map} +1 -1
- package/build/client/assets/{loading-CDNzW5oO.js → loading-CaCCsk9k.js} +2 -2
- package/build/client/assets/{loading-CDNzW5oO.js.map → loading-CaCCsk9k.js.map} +1 -1
- package/build/client/assets/{login-mWjVXGbJ.js → login-w4y7RVYa.js} +2 -2
- package/build/client/assets/{login-mWjVXGbJ.js.map → login-w4y7RVYa.js.map} +1 -1
- package/build/client/assets/{manifest-dd28a0e5.js → manifest-a63db2d2.js} +1 -1
- package/build/client/assets/{mdx-DdpoOTHm.js → mdx-DwvWT4Ou.js} +2 -2
- package/build/client/assets/{mdx-DdpoOTHm.js.map → mdx-DwvWT4Ou.js.map} +1 -1
- package/build/client/assets/{onboarding-indicator-B-XR90_G.js → onboarding-indicator-BkeHYs2C.js} +2 -2
- package/build/client/assets/{onboarding-indicator-B-XR90_G.js.map → onboarding-indicator-BkeHYs2C.js.map} +1 -1
- package/build/client/assets/{online-DiNLkgTC.js → online-DVk-W8Cr.js} +2 -2
- package/build/client/assets/{online-DiNLkgTC.js.map → online-DVk-W8Cr.js.map} +1 -1
- package/build/client/assets/{playground-DmEAkxG1.js → playground-DG4B62WX.js} +2 -2
- package/build/client/assets/{playground-DmEAkxG1.js.map → playground-DG4B62WX.js.map} +1 -1
- package/build/client/assets/{playground-window-x2mQ5o1O.js → playground-window-CF8lTXXI.js} +2 -2
- package/build/client/assets/{playground-window-x2mQ5o1O.js.map → playground-window-CF8lTXXI.js.map} +1 -1
- package/build/client/assets/{preferences-B7ND1VS9.js → preferences-Czy5oqWs.js} +2 -2
- package/build/client/assets/{preferences-B7ND1VS9.js.map → preferences-Czy5oqWs.js.map} +1 -1
- package/build/client/assets/{presence-VCvV2mg7.js → presence-Brtc_BN7.js} +2 -2
- package/build/client/assets/{presence-VCvV2mg7.js.map → presence-Brtc_BN7.js.map} +1 -1
- package/build/client/assets/{preview-fhmjENlm.js → preview-Be-plbPz.js} +2 -2
- package/build/client/assets/{preview-fhmjENlm.js.map → preview-Be-plbPz.js.map} +1 -1
- package/build/client/assets/{product-CvyMpYD_.js → product-D4IgPJN5.js} +2 -2
- package/build/client/assets/{product-CvyMpYD_.js.map → product-D4IgPJN5.js.map} +1 -1
- package/build/client/assets/{progress-Bby-ybMA.js → progress-JDMkfyr3.js} +2 -2
- package/build/client/assets/{progress-Bby-ybMA.js.map → progress-JDMkfyr3.js.map} +1 -1
- package/build/client/assets/{revalidation-ws-BJWJviUX.js → revalidation-ws-iocj9Mrl.js} +2 -2
- package/build/client/assets/{revalidation-ws-BJWJviUX.js.map → revalidation-ws-iocj9Mrl.js.map} +1 -1
- package/build/client/assets/{root-B-MkiU1r.js → root-IJJBVEoj.js} +2 -2
- package/build/client/assets/{root-B-MkiU1r.js.map → root-IJJBVEoj.js.map} +1 -1
- package/build/client/assets/{root-loader-BOzEMapJ.js → root-loader-BmUqzUDN.js} +2 -2
- package/build/client/assets/{root-loader-BOzEMapJ.js.map → root-loader-BmUqzUDN.js.map} +1 -1
- package/build/client/assets/{set-playground-BSGwH9dH.js → set-playground-DO5tJu4h.js} +2 -2
- package/build/client/assets/{set-playground-BSGwH9dH.js.map → set-playground-DO5tJu4h.js.map} +1 -1
- package/build/client/assets/{test-BeEphi7e.js → test-C8NrA0Ls.js} +2 -2
- package/build/client/assets/{test-BeEphi7e.js.map → test-C8NrA0Ls.js.map} +1 -1
- package/build/client/assets/{tests-RWSslYc0.js → tests-Bko6qhsh.js} +2 -2
- package/build/client/assets/{tests-RWSslYc0.js.map → tests-Bko6qhsh.js.map} +1 -1
- package/build/client/assets/{user-BsPobzjB.js → user-CYXKquT7.js} +2 -2
- package/build/client/assets/{user-BsPobzjB.js.map → user-CYXKquT7.js.map} +1 -1
- package/build/client/assets/{version-f8qqYbyU.js → version-CwWSRwe5.js} +2 -2
- package/build/client/assets/{version-f8qqYbyU.js.map → version-CwWSRwe5.js.map} +1 -1
- package/build/client/assets/{workshop-config-Zfc8zU0x.js → workshop-config-BMWaKPZT.js} +2 -2
- package/build/client/assets/{workshop-config-Zfc8zU0x.js.map → workshop-config-BMWaKPZT.js.map} +1 -1
- package/build/server/index.js +7 -3
- package/build/server/index.js.map +1 -1
- package/package.json +3 -3
- package/build/client/assets/_extra-Dki7HdFp.js +0 -2
- package/build/client/assets/_extra-Dki7HdFp.js.map +0 -1
- package/build/client/assets/_layout-DTrIGRDO.js +0 -2
- package/build/client/assets/_layout-DTrIGRDO.js.map +0 -1
- package/build/client/assets/discord-r3m19sUM.js +0 -2
- package/build/client/assets/discord-r3m19sUM.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as e}from"./jsx-runtime-C5WNSv3b.js";import{R as _,T as V,V as G,I as U,P as Y,C as $,S as z,a as q,G as S,L as w,b as H,c as M,d as Q,e as W,f as J}from"./index-CJDOQ1bl.js";import{a as b,I as y}from"./misc-W4055b-0.js";import{r as u}from"./index-CqIc3cxq.js";import{f}from"./chunk-EPOLDU6W-BCLmut3y.js";import{B as D}from"./button-Cd-ekki5.js";import{u as K,O as X}from"./onboarding-indicator-B-XR90_G.js";import{s as Z}from"./progress-bar-DpWhcyhC.js";import{D as T,a as I,b as O,c as k,d as E,e as R}from"./dialog-CzO65Z5w.js";import{S as ee}from"./tooltip-Tlsyx2YO.js";import{u as F}from"./pe-CIZUOJMr.js";import{u as se}from"./root-loader-BOzEMapJ.js";const B="set-playground",P="__saved-playgrounds__",te=[];function N(){const n=se(),r=n.preferences?.playground?.persist??!1,o=n.preferences?.onboardingComplete?.includes(B)??!1;return{persistEnabled:r,shouldConfirm:!r&&!o}}function L({open:n,onOpenChange:r,onConfirm:o,isSubmitting:a,persistFetcher:t}){const d=F(),{persistEnabled:p}=N(),l=t.state!=="idle",i=t.data?.status==="success"?t.data.persist:p,c=!i;return e.jsx(T,{open:n,onOpenChange:r,children:e.jsxs(I,{className:"max-w-xl",children:[e.jsxs(O,{children:[e.jsx(k,{children:"Playground ready for your first step"}),e.jsx(E,{children:"Nice work getting here! Setting the playground is how you bring the next step's instructions into your workspace."})]}),e.jsxs("div",{className:"space-y-4 text-sm",children:[e.jsx("p",{className:"text-muted-foreground",children:"This will replace whatever is currently in your playground with the next step's files. That is expected and the default workflow."}),e.jsxs("div",{className:"border-border bg-muted/40 space-y-3 rounded-md border p-4",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-foreground font-semibold",children:"Optional: Save a copy each time"}),e.jsxs("p",{className:"text-muted-foreground mt-1 text-sm",children:["When enabled, every set saves a copy in",e.jsx("span",{className:"font-mono",children:" saved-playgrounds"}),". You can change this later in Preferences."]}),e.jsx("p",{className:"text-muted-foreground mt-2 text-xs",children:"You can always manage this in Preferences."})]}),e.jsxs(t.Form,{method:"POST",action:"/persist-playground",children:[d,e.jsx("input",{type:"hidden",name:"persist",value:c?"true":"false"}),e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-foreground text-sm font-medium",children:"Persistence"}),e.jsx("p",{className:"text-muted-foreground text-xs",children:i?"Enabled":"Disabled"})]}),e.jsx("button",{type:"submit",role:"switch","aria-checked":i,"aria-label":`Toggle playground persistence ${i?"off":"on"}`,className:b("focus-visible:ring-ring relative inline-flex h-6 w-11 items-center rounded-full border transition",i?"border-foreground bg-foreground":"border-border bg-muted",l?"cursor-progress opacity-70":null),disabled:l,children:e.jsx("span",{className:b("bg-background inline-block h-5 w-5 rounded-full shadow transition",i?"translate-x-5":"translate-x-0")})})]})]})]})]}),e.jsxs(R,{children:[e.jsx("button",{type:"button",className:"border-border text-foreground hover:bg-muted focus-visible:ring-ring inline-flex items-center justify-center rounded-md border px-3 py-2 text-sm font-semibold",onClick:()=>r(!1),children:"Cancel"}),e.jsx(D,{varient:"primary",type:"button",onClick:o,disabled:a,children:a?"Setting...":"Set playground"})]})]})})}function re({open:n,onOpenChange:r,allApps:o}){const a=f(),t=f(),[d,p]=u.useState(""),l=a.data?.status==="success"?a.data.savedPlaygrounds:te,i=a.state!=="idle"&&!a.data,c=t.state!=="idle",x=t.formData?.get("savedPlaygroundId"),m=u.useMemo(()=>new Intl.DateTimeFormat(void 0,{dateStyle:"medium",timeStyle:"short"}),[]);u.useEffect(()=>{n&&a.state==="idle"&&a.load("/saved-playgrounds")},[a,n]),u.useEffect(()=>{n||p("")},[n]),u.useEffect(()=>{t.data?.status==="success"&&r(!1)},[t.data,r]);const h=u.useMemo(()=>{const s=d.trim().toLowerCase();return s?l.filter(g=>{const j=o.find(v=>v.name===g.appName)?.displayName??g.appName;return g.appName.toLowerCase().includes(s)||g.id.toLowerCase().includes(s)||j.toLowerCase().includes(s)}):l},[o,d,l]);return e.jsx(T,{open:n,onOpenChange:r,children:e.jsxs(I,{className:"max-w-2xl",children:[e.jsxs(O,{children:[e.jsx(k,{children:"Saved playgrounds"}),e.jsx(E,{children:"Restore a saved playground into your active playground directory."})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{htmlFor:"savedPlaygroundSearch",className:"text-sm font-medium",children:"Search saved playgrounds"}),e.jsx("input",{id:"savedPlaygroundSearch",type:"search",value:d,onChange:s=>p(s.currentTarget.value),placeholder:"Filter by exercise, app name, or timestamp",className:"border-border bg-background text-foreground w-full rounded-md border px-3 py-2 text-sm"})]}),e.jsxs("div",{className:"border-border bg-muted/40 rounded-md border",children:[e.jsxs("div",{className:"border-border text-muted-foreground flex items-center justify-between border-b px-3 py-2 text-xs",children:[e.jsx("span",{children:l.length===1?"1 saved playground":`${l.length} saved playgrounds`}),d?e.jsx("span",{children:h.length===1?"1 match":`${h.length} matches`}):null]}),e.jsx("div",{className:"max-h-72 overflow-y-auto",children:i?e.jsx("div",{className:"text-muted-foreground px-3 py-4 text-sm",children:"Loading saved playgrounds..."}):a.data?.status==="disabled"?e.jsx("div",{className:"text-muted-foreground px-3 py-4 text-sm",children:"Enable playground persistence in Preferences to use saved playgrounds."}):h.length===0?e.jsx("div",{className:"text-muted-foreground px-3 py-4 text-sm",children:d?"No saved playgrounds match your search.":"No saved playgrounds yet. Set the playground to create one."}):h.map(s=>{const g=o.find(A=>A.name===s.appName)?.displayName??s.appName,j=new Date(s.createdAt),v=x===s.id;return e.jsxs("div",{className:"border-border flex items-center justify-between gap-4 border-b px-3 py-3 last:border-b-0",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("p",{className:"text-foreground text-sm font-semibold",children:g}),e.jsx("p",{className:"text-muted-foreground truncate font-mono text-xs",children:s.appName}),e.jsx("time",{className:"text-muted-foreground text-xs",dateTime:s.createdAt,children:Number.isNaN(j.getTime())?s.createdAt:m.format(j)})]}),e.jsx(D,{varient:"primary",type:"button",disabled:c,onClick:()=>t.submit({savedPlaygroundId:s.id},{method:"POST",action:"/saved-playgrounds"}),children:v?"Setting...":"Set playground"})]},s.id)})})]}),t.data?.status==="error"?e.jsx("p",{className:"text-foreground-destructive text-sm",children:t.data.error}):null]}),e.jsx(R,{children:e.jsx("button",{type:"button",className:"border-border text-foreground hover:bg-muted focus-visible:ring-ring inline-flex items-center justify-center rounded-md border px-3 py-2 text-sm font-semibold",onClick:()=>r(!1),children:"Close"})})]})})}function ae({appName:n,reset:r=!1,tooltipText:o,...a}){const t=f(),d=f(),p=F(),{shouldConfirm:l}=N(),[i,c]=u.useState(!1),x=u.useRef(null),m=u.useRef(!1),h=t.state!=="idle",s=e.jsx("button",{type:"submit",...a,className:b(a.className,t.state!=="idle"?"cursor-progress":null,t.data?.status==="error"?"cursor-not-allowed":null)});return e.jsxs(e.Fragment,{children:[e.jsxs(t.Form,{action:"/set-playground",method:"POST",className:"inline-flex items-center justify-center",ref:x,onSubmit:g=>{if(l&&!m.current){g.preventDefault(),c(!0);return}m.current=!1},children:[p,e.jsx("input",{type:"hidden",name:"appName",value:n}),r?e.jsx("input",{type:"hidden",name:"reset",value:"true"}):null,Z,o?e.jsx(ee,{content:o,children:s}):s]}),e.jsx(L,{open:i,onOpenChange:c,isSubmitting:h,persistFetcher:d,onConfirm:()=>{m.current=!0,c(!1),x.current?.requestSubmit()}})]})}function fe({playgroundAppName:n,allApps:r}){const o=f(),a=f(),{shouldConfirm:t,persistEnabled:d}=N(),[p,l]=u.useState(!1),[i,c]=u.useState(!1),[x,m]=u.useState(null),h=o.state!=="idle";return e.jsxs(e.Fragment,{children:[e.jsxs(_,{name:"appName",value:n,onValueChange:s=>{if(s===P){c(!0);return}if(t){m(s),l(!0);return}o.submit({appName:s},{method:"POST",action:"/set-playground"})},children:[e.jsxs(V,{"aria-label":"Select app for playground",className:b("radix-placeholder:text-muted-foreground flex h-full w-full items-center justify-between text-left focus-visible:outline-none",o.state!=="idle"?"cursor-progress":null,o.data?.status==="error"?"cursor-not-allowed":null),children:[e.jsx("span",{className:"scrollbar-thin scrollbar-thumb-scrollbar w-80 flex-1 truncate",children:e.jsx(G,{placeholder:"Select current app",className:"inline-block w-40 truncate"})}),e.jsx(U,{children:e.jsx(y,{name:"TriangleDownSmall"})})]}),e.jsx(Y,{children:e.jsxs($,{position:"popper",align:"start",className:"invert-theme bg-popover text-popover-foreground z-20 max-h-[50vh] lg:max-h-[70vh]",children:[e.jsx(z,{className:"flex h-5 cursor-default items-center justify-center",children:e.jsx(y,{name:"ChevronUp"})}),e.jsxs(q,{className:"p-3",children:[e.jsxs(S,{children:[e.jsx(w,{className:"px-5 pb-3 font-mono uppercase",children:"App"}),r.filter(s=>s.name!=="playground").map(s=>e.jsx(C,{value:s.name,children:s.displayName},s.name))]}),d?e.jsxs(e.Fragment,{children:[e.jsx(H,{className:"bg-border my-2 h-px"}),e.jsxs(S,{children:[e.jsx(w,{className:"text-muted-foreground px-5 pb-2 font-mono text-xs uppercase",children:"Saved playgrounds"}),e.jsx(C,{value:P,children:"Choose a saved playground..."})]})]}):null]}),e.jsx(M,{className:"flex h-5 cursor-default items-center justify-center",children:e.jsx(y,{name:"ChevronDown"})})]})})]}),e.jsx(L,{open:p,onOpenChange:s=>{l(s),s||m(null)},isSubmitting:h,persistFetcher:a,onConfirm:()=>{x&&(l(!1),o.submit({appName:x},{method:"POST",action:"/set-playground"}),m(null))}}),e.jsx(re,{open:i,onOpenChange:c,allApps:r})]})}function C({value:n,children:r}){return e.jsxs(Q,{value:n,className:"radix-disabled:text-muted-foreground radix-highlighted:opacity-100 radix-highlighted:outline-none radix-state-checked:opacity-100 relative flex cursor-pointer items-center rounded px-10 py-2 leading-none opacity-80 select-none",children:[e.jsx(W,{children:r}),e.jsx(J,{className:"absolute left-0 inline-flex w-[25px] items-center justify-center",children:e.jsx(y,{name:"CheckSmall"})})]})}function ye({appName:n,isOutdated:r,hideTextOnNarrow:o,showOnboardingIndicator:a=!1,onClick:t,className:d,...p}){const[l,i]=K(B);if(ENV.EPICSHOP_DEPLOYED)return null;const c=a&&l,x=b(d,c?"relative":null);return e.jsx(ae,{appName:n,tooltipText:r?"The app the playground was set to has been updated. Click to update to the latest version.":"Playground is not set to the right app. Click to set Playground.",...p,className:x,onClick:m=>{t?.(m),a&&i()},children:e.jsxs("span",{className:"text-foreground-destructive flex items-center justify-center gap-1 hover:underline",children:[e.jsx(y,{name:"Unlinked",className:"animate-ping"})," ",e.jsx("span",{className:o?"hidden uppercase @min-[600px]:inline":"uppercase",children:r?"Playground Outdated":"Set to Playground"}),c?e.jsx(X,{tooltip:"Set the playground for this step.",size:"sm"}):null]})})}export{fe as P,ye as S,ae as a};
|
|
2
|
-
//# sourceMappingURL=set-playground-
|
|
1
|
+
import{j as e}from"./jsx-runtime-C5WNSv3b.js";import{R as _,T as V,V as G,I as U,P as Y,C as $,S as z,a as q,G as S,L as w,b as H,c as M,d as Q,e as W,f as J}from"./index-CJDOQ1bl.js";import{a as b,I as y}from"./misc-W4055b-0.js";import{r as u}from"./index-CqIc3cxq.js";import{f}from"./chunk-EPOLDU6W-BCLmut3y.js";import{B as D}from"./button-Cd-ekki5.js";import{u as K,O as X}from"./onboarding-indicator-BkeHYs2C.js";import{s as Z}from"./progress-bar-DpWhcyhC.js";import{D as T,a as I,b as O,c as k,d as E,e as R}from"./dialog-CzO65Z5w.js";import{S as ee}from"./tooltip-Tlsyx2YO.js";import{u as F}from"./pe-CIZUOJMr.js";import{u as se}from"./root-loader-BmUqzUDN.js";const B="set-playground",P="__saved-playgrounds__",te=[];function N(){const n=se(),r=n.preferences?.playground?.persist??!1,o=n.preferences?.onboardingComplete?.includes(B)??!1;return{persistEnabled:r,shouldConfirm:!r&&!o}}function L({open:n,onOpenChange:r,onConfirm:o,isSubmitting:a,persistFetcher:t}){const d=F(),{persistEnabled:p}=N(),l=t.state!=="idle",i=t.data?.status==="success"?t.data.persist:p,c=!i;return e.jsx(T,{open:n,onOpenChange:r,children:e.jsxs(I,{className:"max-w-xl",children:[e.jsxs(O,{children:[e.jsx(k,{children:"Playground ready for your first step"}),e.jsx(E,{children:"Nice work getting here! Setting the playground is how you bring the next step's instructions into your workspace."})]}),e.jsxs("div",{className:"space-y-4 text-sm",children:[e.jsx("p",{className:"text-muted-foreground",children:"This will replace whatever is currently in your playground with the next step's files. That is expected and the default workflow."}),e.jsxs("div",{className:"border-border bg-muted/40 space-y-3 rounded-md border p-4",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-foreground font-semibold",children:"Optional: Save a copy each time"}),e.jsxs("p",{className:"text-muted-foreground mt-1 text-sm",children:["When enabled, every set saves a copy in",e.jsx("span",{className:"font-mono",children:" saved-playgrounds"}),". You can change this later in Preferences."]}),e.jsx("p",{className:"text-muted-foreground mt-2 text-xs",children:"You can always manage this in Preferences."})]}),e.jsxs(t.Form,{method:"POST",action:"/persist-playground",children:[d,e.jsx("input",{type:"hidden",name:"persist",value:c?"true":"false"}),e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-foreground text-sm font-medium",children:"Persistence"}),e.jsx("p",{className:"text-muted-foreground text-xs",children:i?"Enabled":"Disabled"})]}),e.jsx("button",{type:"submit",role:"switch","aria-checked":i,"aria-label":`Toggle playground persistence ${i?"off":"on"}`,className:b("focus-visible:ring-ring relative inline-flex h-6 w-11 items-center rounded-full border transition",i?"border-foreground bg-foreground":"border-border bg-muted",l?"cursor-progress opacity-70":null),disabled:l,children:e.jsx("span",{className:b("bg-background inline-block h-5 w-5 rounded-full shadow transition",i?"translate-x-5":"translate-x-0")})})]})]})]})]}),e.jsxs(R,{children:[e.jsx("button",{type:"button",className:"border-border text-foreground hover:bg-muted focus-visible:ring-ring inline-flex items-center justify-center rounded-md border px-3 py-2 text-sm font-semibold",onClick:()=>r(!1),children:"Cancel"}),e.jsx(D,{varient:"primary",type:"button",onClick:o,disabled:a,children:a?"Setting...":"Set playground"})]})]})})}function re({open:n,onOpenChange:r,allApps:o}){const a=f(),t=f(),[d,p]=u.useState(""),l=a.data?.status==="success"?a.data.savedPlaygrounds:te,i=a.state!=="idle"&&!a.data,c=t.state!=="idle",x=t.formData?.get("savedPlaygroundId"),m=u.useMemo(()=>new Intl.DateTimeFormat(void 0,{dateStyle:"medium",timeStyle:"short"}),[]);u.useEffect(()=>{n&&a.state==="idle"&&a.load("/saved-playgrounds")},[a,n]),u.useEffect(()=>{n||p("")},[n]),u.useEffect(()=>{t.data?.status==="success"&&r(!1)},[t.data,r]);const h=u.useMemo(()=>{const s=d.trim().toLowerCase();return s?l.filter(g=>{const j=o.find(v=>v.name===g.appName)?.displayName??g.appName;return g.appName.toLowerCase().includes(s)||g.id.toLowerCase().includes(s)||j.toLowerCase().includes(s)}):l},[o,d,l]);return e.jsx(T,{open:n,onOpenChange:r,children:e.jsxs(I,{className:"max-w-2xl",children:[e.jsxs(O,{children:[e.jsx(k,{children:"Saved playgrounds"}),e.jsx(E,{children:"Restore a saved playground into your active playground directory."})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{htmlFor:"savedPlaygroundSearch",className:"text-sm font-medium",children:"Search saved playgrounds"}),e.jsx("input",{id:"savedPlaygroundSearch",type:"search",value:d,onChange:s=>p(s.currentTarget.value),placeholder:"Filter by exercise, app name, or timestamp",className:"border-border bg-background text-foreground w-full rounded-md border px-3 py-2 text-sm"})]}),e.jsxs("div",{className:"border-border bg-muted/40 rounded-md border",children:[e.jsxs("div",{className:"border-border text-muted-foreground flex items-center justify-between border-b px-3 py-2 text-xs",children:[e.jsx("span",{children:l.length===1?"1 saved playground":`${l.length} saved playgrounds`}),d?e.jsx("span",{children:h.length===1?"1 match":`${h.length} matches`}):null]}),e.jsx("div",{className:"max-h-72 overflow-y-auto",children:i?e.jsx("div",{className:"text-muted-foreground px-3 py-4 text-sm",children:"Loading saved playgrounds..."}):a.data?.status==="disabled"?e.jsx("div",{className:"text-muted-foreground px-3 py-4 text-sm",children:"Enable playground persistence in Preferences to use saved playgrounds."}):h.length===0?e.jsx("div",{className:"text-muted-foreground px-3 py-4 text-sm",children:d?"No saved playgrounds match your search.":"No saved playgrounds yet. Set the playground to create one."}):h.map(s=>{const g=o.find(A=>A.name===s.appName)?.displayName??s.appName,j=new Date(s.createdAt),v=x===s.id;return e.jsxs("div",{className:"border-border flex items-center justify-between gap-4 border-b px-3 py-3 last:border-b-0",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("p",{className:"text-foreground text-sm font-semibold",children:g}),e.jsx("p",{className:"text-muted-foreground truncate font-mono text-xs",children:s.appName}),e.jsx("time",{className:"text-muted-foreground text-xs",dateTime:s.createdAt,children:Number.isNaN(j.getTime())?s.createdAt:m.format(j)})]}),e.jsx(D,{varient:"primary",type:"button",disabled:c,onClick:()=>t.submit({savedPlaygroundId:s.id},{method:"POST",action:"/saved-playgrounds"}),children:v?"Setting...":"Set playground"})]},s.id)})})]}),t.data?.status==="error"?e.jsx("p",{className:"text-foreground-destructive text-sm",children:t.data.error}):null]}),e.jsx(R,{children:e.jsx("button",{type:"button",className:"border-border text-foreground hover:bg-muted focus-visible:ring-ring inline-flex items-center justify-center rounded-md border px-3 py-2 text-sm font-semibold",onClick:()=>r(!1),children:"Close"})})]})})}function ae({appName:n,reset:r=!1,tooltipText:o,...a}){const t=f(),d=f(),p=F(),{shouldConfirm:l}=N(),[i,c]=u.useState(!1),x=u.useRef(null),m=u.useRef(!1),h=t.state!=="idle",s=e.jsx("button",{type:"submit",...a,className:b(a.className,t.state!=="idle"?"cursor-progress":null,t.data?.status==="error"?"cursor-not-allowed":null)});return e.jsxs(e.Fragment,{children:[e.jsxs(t.Form,{action:"/set-playground",method:"POST",className:"inline-flex items-center justify-center",ref:x,onSubmit:g=>{if(l&&!m.current){g.preventDefault(),c(!0);return}m.current=!1},children:[p,e.jsx("input",{type:"hidden",name:"appName",value:n}),r?e.jsx("input",{type:"hidden",name:"reset",value:"true"}):null,Z,o?e.jsx(ee,{content:o,children:s}):s]}),e.jsx(L,{open:i,onOpenChange:c,isSubmitting:h,persistFetcher:d,onConfirm:()=>{m.current=!0,c(!1),x.current?.requestSubmit()}})]})}function fe({playgroundAppName:n,allApps:r}){const o=f(),a=f(),{shouldConfirm:t,persistEnabled:d}=N(),[p,l]=u.useState(!1),[i,c]=u.useState(!1),[x,m]=u.useState(null),h=o.state!=="idle";return e.jsxs(e.Fragment,{children:[e.jsxs(_,{name:"appName",value:n,onValueChange:s=>{if(s===P){c(!0);return}if(t){m(s),l(!0);return}o.submit({appName:s},{method:"POST",action:"/set-playground"})},children:[e.jsxs(V,{"aria-label":"Select app for playground",className:b("radix-placeholder:text-muted-foreground flex h-full w-full items-center justify-between text-left focus-visible:outline-none",o.state!=="idle"?"cursor-progress":null,o.data?.status==="error"?"cursor-not-allowed":null),children:[e.jsx("span",{className:"scrollbar-thin scrollbar-thumb-scrollbar w-80 flex-1 truncate",children:e.jsx(G,{placeholder:"Select current app",className:"inline-block w-40 truncate"})}),e.jsx(U,{children:e.jsx(y,{name:"TriangleDownSmall"})})]}),e.jsx(Y,{children:e.jsxs($,{position:"popper",align:"start",className:"invert-theme bg-popover text-popover-foreground z-20 max-h-[50vh] lg:max-h-[70vh]",children:[e.jsx(z,{className:"flex h-5 cursor-default items-center justify-center",children:e.jsx(y,{name:"ChevronUp"})}),e.jsxs(q,{className:"p-3",children:[e.jsxs(S,{children:[e.jsx(w,{className:"px-5 pb-3 font-mono uppercase",children:"App"}),r.filter(s=>s.name!=="playground").map(s=>e.jsx(C,{value:s.name,children:s.displayName},s.name))]}),d?e.jsxs(e.Fragment,{children:[e.jsx(H,{className:"bg-border my-2 h-px"}),e.jsxs(S,{children:[e.jsx(w,{className:"text-muted-foreground px-5 pb-2 font-mono text-xs uppercase",children:"Saved playgrounds"}),e.jsx(C,{value:P,children:"Choose a saved playground..."})]})]}):null]}),e.jsx(M,{className:"flex h-5 cursor-default items-center justify-center",children:e.jsx(y,{name:"ChevronDown"})})]})})]}),e.jsx(L,{open:p,onOpenChange:s=>{l(s),s||m(null)},isSubmitting:h,persistFetcher:a,onConfirm:()=>{x&&(l(!1),o.submit({appName:x},{method:"POST",action:"/set-playground"}),m(null))}}),e.jsx(re,{open:i,onOpenChange:c,allApps:r})]})}function C({value:n,children:r}){return e.jsxs(Q,{value:n,className:"radix-disabled:text-muted-foreground radix-highlighted:opacity-100 radix-highlighted:outline-none radix-state-checked:opacity-100 relative flex cursor-pointer items-center rounded px-10 py-2 leading-none opacity-80 select-none",children:[e.jsx(W,{children:r}),e.jsx(J,{className:"absolute left-0 inline-flex w-[25px] items-center justify-center",children:e.jsx(y,{name:"CheckSmall"})})]})}function ye({appName:n,isOutdated:r,hideTextOnNarrow:o,showOnboardingIndicator:a=!1,onClick:t,className:d,...p}){const[l,i]=K(B);if(ENV.EPICSHOP_DEPLOYED)return null;const c=a&&l,x=b(d,c?"relative":null);return e.jsx(ae,{appName:n,tooltipText:r?"The app the playground was set to has been updated. Click to update to the latest version.":"Playground is not set to the right app. Click to set Playground.",...p,className:x,onClick:m=>{t?.(m),a&&i()},children:e.jsxs("span",{className:"text-foreground-destructive flex items-center justify-center gap-1 hover:underline",children:[e.jsx(y,{name:"Unlinked",className:"animate-ping"})," ",e.jsx("span",{className:o?"hidden uppercase @min-[600px]:inline":"uppercase",children:r?"Playground Outdated":"Set to Playground"}),c?e.jsx(X,{tooltip:"Set the playground for this step.",size:"sm"}):null]})})}export{fe as P,ye as S,ae as a};
|
|
2
|
+
//# sourceMappingURL=set-playground-DO5tJu4h.js.map
|
package/build/client/assets/{set-playground-BSGwH9dH.js.map → set-playground-DO5tJu4h.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set-playground-BSGwH9dH.js","sources":["../../../app/routes/set-playground.tsx"],"sourcesContent":["import {\n\tgetAppByName,\n\tgetApps,\n\tisPlaygroundApp,\n\tisProblemApp,\n\tisSolutionApp,\n\tsetPlayground,\n} from '@epic-web/workshop-utils/apps.server'\nimport { markOnboardingComplete } from '@epic-web/workshop-utils/db.server'\nimport { getDiffCode } from '@epic-web/workshop-utils/diff.server'\nimport { clearTestProcessEntry } from '@epic-web/workshop-utils/process-manager.server'\nimport * as Select from '@radix-ui/react-select'\nimport { clsx } from 'clsx'\nimport * as React from 'react'\nimport { type ActionFunctionArgs, useFetcher } from 'react-router'\nimport { z } from 'zod'\nimport { Button } from '#app/components/button.tsx'\nimport { Icon } from '#app/components/icons.tsx'\nimport {\n\tOnboardingBadge,\n\tuseOnboardingIndicator,\n} from '#app/components/onboarding-indicator.tsx'\nimport { showProgressBarField } from '#app/components/progress-bar.tsx'\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n} from '#app/components/ui/dialog.tsx'\nimport { SimpleTooltip } from '#app/components/ui/tooltip.tsx'\nimport { ensureUndeployed, getErrorMessage } from '#app/utils/misc.tsx'\nimport { dataWithPE, usePERedirectInput } from '#app/utils/pe.tsx'\nimport { useRootLoaderData } from '#app/utils/root-loader.ts'\nimport { createToastHeaders } from '#app/utils/toast.server.ts'\n\nconst PLAYGROUND_ONBOARDING_FEATURE_ID = 'set-playground'\n\nconst SetPlaygroundSchema = z.object({\n\tappName: z.string(),\n\treset: z\n\t\t.string()\n\t\t.nullable()\n\t\t.optional()\n\t\t.transform((v) => v === 'true'),\n})\n\nexport async function action({ request }: ActionFunctionArgs) {\n\tensureUndeployed()\n\tconst formData = await request.formData()\n\tconst rawData = {\n\t\tappName: formData.get('appName'),\n\t\tredirectTo: formData.get('redirectTo'),\n\t}\n\tconst result = SetPlaygroundSchema.safeParse(rawData)\n\tif (!result.success) {\n\t\treturn dataWithPE(\n\t\t\trequest,\n\t\t\tformData,\n\t\t\t{ status: 'error', error: result.error.message } as const,\n\t\t\t{ status: 400 },\n\t\t)\n\t}\n\tconst form = result.data\n\tconst app = await getAppByName(form.appName)\n\tif (!app) {\n\t\treturn dataWithPE(\n\t\t\trequest,\n\t\t\tformData,\n\t\t\t{ status: 'error', error: `App ${form.appName} not found` } as const,\n\t\t\t{ status: 404 },\n\t\t)\n\t}\n\tconst converseApp =\n\t\tisProblemApp(app) && app.solutionName\n\t\t\t? await getAppByName(app.solutionName)\n\t\t\t: isSolutionApp(app) && app.problemName\n\t\t\t\t? await getAppByName(app.problemName)\n\t\t\t\t: undefined\n\ttry {\n\t\tawait setPlayground(app.fullPath, { reset: form.reset })\n\t} catch (error: unknown) {\n\t\tconst message = getErrorMessage(error)\n\t\tconsole.error('Error setting playground', message)\n\t\treturn dataWithPE(\n\t\t\trequest,\n\t\t\tformData,\n\t\t\t{ status: 'error', error: message } as const,\n\t\t\t{\n\t\t\t\tstatus: 500,\n\t\t\t\theaders: await createToastHeaders({\n\t\t\t\t\ttype: 'error',\n\t\t\t\t\ttitle: 'Error',\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t'There was an error setting the playground. Check the terminal for details.',\n\t\t\t\t}),\n\t\t\t},\n\t\t)\n\t}\n\tconst apps = await getApps({ forceFresh: true })\n\tconst playground = apps.find(isPlaygroundApp)\n\tif (playground) {\n\t\tclearTestProcessEntry(playground)\n\t\tif (converseApp) {\n\t\t\tvoid getDiffCode(playground, converseApp, { forceFresh: true })\n\t\t}\n\t}\n\tawait markOnboardingComplete(PLAYGROUND_ONBOARDING_FEATURE_ID)\n\treturn dataWithPE(request, formData, { status: 'success' } as const)\n}\n\ntype PersistPlaygroundResult =\n\t| { status: 'success'; persist: boolean }\n\t| { status: 'error' }\n\ntype SavedPlaygroundsLoaderData =\n\t| {\n\t\t\tstatus: 'success'\n\t\t\tsavedPlaygrounds: Array<{\n\t\t\t\tid: string\n\t\t\t\tappName: string\n\t\t\t\tcreatedAt: string\n\t\t\t}>\n\t }\n\t| { status: 'disabled'; savedPlaygrounds: [] }\n\ntype SavedPlaygroundsActionData =\n\t| { status: 'success'; savedPlaygroundId: string }\n\t| { status: 'error'; error: string }\n\nconst savedPlaygroundsValue = '__saved-playgrounds__'\nconst emptySavedPlaygrounds: Array<{\n\tid: string\n\tappName: string\n\tcreatedAt: string\n}> = []\n\nfunction usePlaygroundOnboardingGate() {\n\tconst rootData = useRootLoaderData()\n\tconst persistEnabled = rootData.preferences?.playground?.persist ?? false\n\tconst onboardingComplete =\n\t\trootData.preferences?.onboardingComplete?.includes(\n\t\t\tPLAYGROUND_ONBOARDING_FEATURE_ID,\n\t\t) ?? false\n\treturn {\n\t\tpersistEnabled,\n\t\tshouldConfirm: !persistEnabled && !onboardingComplete,\n\t}\n}\n\nfunction PlaygroundSetDialog({\n\topen,\n\tonOpenChange,\n\tonConfirm,\n\tisSubmitting,\n\tpersistFetcher,\n}: {\n\topen: boolean\n\tonOpenChange: (open: boolean) => void\n\tonConfirm: () => void\n\tisSubmitting: boolean\n\tpersistFetcher: ReturnType<typeof useFetcher<PersistPlaygroundResult>>\n}) {\n\tconst peRedirectInput = usePERedirectInput()\n\tconst { persistEnabled } = usePlaygroundOnboardingGate()\n\tconst isPersisting = persistFetcher.state !== 'idle'\n\tconst currentPersist =\n\t\tpersistFetcher.data?.status === 'success'\n\t\t\t? persistFetcher.data.persist\n\t\t\t: persistEnabled\n\tconst nextPersist = !currentPersist\n\treturn (\n\t\t<Dialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<DialogContent className=\"max-w-xl\">\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>Playground ready for your first step</DialogTitle>\n\t\t\t\t\t<DialogDescription>\n\t\t\t\t\t\tNice work getting here! Setting the playground is how you bring the\n\t\t\t\t\t\tnext step's instructions into your workspace.\n\t\t\t\t\t</DialogDescription>\n\t\t\t\t</DialogHeader>\n\t\t\t\t<div className=\"space-y-4 text-sm\">\n\t\t\t\t\t<p className=\"text-muted-foreground\">\n\t\t\t\t\t\tThis will replace whatever is currently in your playground with the\n\t\t\t\t\t\tnext step's files. That is expected and the default workflow.\n\t\t\t\t\t</p>\n\t\t\t\t\t<div className=\"border-border bg-muted/40 space-y-3 rounded-md border p-4\">\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<p className=\"text-foreground font-semibold\">\n\t\t\t\t\t\t\t\tOptional: Save a copy each time\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p className=\"text-muted-foreground mt-1 text-sm\">\n\t\t\t\t\t\t\t\tWhen enabled, every set saves a copy in\n\t\t\t\t\t\t\t\t<span className=\"font-mono\"> saved-playgrounds</span>. You can\n\t\t\t\t\t\t\t\tchange this later in Preferences.\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p className=\"text-muted-foreground mt-2 text-xs\">\n\t\t\t\t\t\t\t\tYou can always manage this in Preferences.\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<persistFetcher.Form method=\"POST\" action=\"/persist-playground\">\n\t\t\t\t\t\t\t{peRedirectInput}\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype=\"hidden\"\n\t\t\t\t\t\t\t\tname=\"persist\"\n\t\t\t\t\t\t\t\tvalue={nextPersist ? 'true' : 'false'}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<div className=\"flex items-center justify-between gap-3\">\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t<p className=\"text-foreground text-sm font-medium\">\n\t\t\t\t\t\t\t\t\t\tPersistence\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t<p className=\"text-muted-foreground text-xs\">\n\t\t\t\t\t\t\t\t\t\t{currentPersist ? 'Enabled' : 'Disabled'}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\t\t\trole=\"switch\"\n\t\t\t\t\t\t\t\t\taria-checked={currentPersist}\n\t\t\t\t\t\t\t\t\taria-label={`Toggle playground persistence ${\n\t\t\t\t\t\t\t\t\t\tcurrentPersist ? 'off' : 'on'\n\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t'focus-visible:ring-ring relative inline-flex h-6 w-11 items-center rounded-full border transition',\n\t\t\t\t\t\t\t\t\t\tcurrentPersist\n\t\t\t\t\t\t\t\t\t\t\t? 'border-foreground bg-foreground'\n\t\t\t\t\t\t\t\t\t\t\t: 'border-border bg-muted',\n\t\t\t\t\t\t\t\t\t\tisPersisting ? 'cursor-progress opacity-70' : null,\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tdisabled={isPersisting}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t\t'bg-background inline-block h-5 w-5 rounded-full shadow transition',\n\t\t\t\t\t\t\t\t\t\t\tcurrentPersist ? 'translate-x-5' : 'translate-x-0',\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</persistFetcher.Form>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<DialogFooter>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName=\"border-border text-foreground hover:bg-muted focus-visible:ring-ring inline-flex items-center justify-center rounded-md border px-3 py-2 text-sm font-semibold\"\n\t\t\t\t\t\tonClick={() => onOpenChange(false)}\n\t\t\t\t\t>\n\t\t\t\t\t\tCancel\n\t\t\t\t\t</button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvarient=\"primary\"\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={onConfirm}\n\t\t\t\t\t\tdisabled={isSubmitting}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isSubmitting ? 'Setting...' : 'Set playground'}\n\t\t\t\t\t</Button>\n\t\t\t\t</DialogFooter>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t)\n}\n\nfunction SavedPlaygroundsDialog({\n\topen,\n\tonOpenChange,\n\tallApps,\n}: {\n\topen: boolean\n\tonOpenChange: (open: boolean) => void\n\tallApps: Array<{ name: string; displayName: string }>\n}) {\n\tconst listFetcher = useFetcher<SavedPlaygroundsLoaderData>()\n\tconst actionFetcher = useFetcher<SavedPlaygroundsActionData>()\n\tconst [query, setQuery] = React.useState('')\n\tconst savedPlaygrounds =\n\t\tlistFetcher.data?.status === 'success'\n\t\t\t? listFetcher.data.savedPlaygrounds\n\t\t\t: emptySavedPlaygrounds\n\tconst isLoading = listFetcher.state !== 'idle' && !listFetcher.data\n\tconst isSubmitting = actionFetcher.state !== 'idle'\n\tconst activeSubmissionId = actionFetcher.formData?.get(\n\t\t'savedPlaygroundId',\n\t) as string | null\n\tconst formatter = React.useMemo(\n\t\t() =>\n\t\t\tnew Intl.DateTimeFormat(undefined, {\n\t\t\t\tdateStyle: 'medium',\n\t\t\t\ttimeStyle: 'short',\n\t\t\t}),\n\t\t[],\n\t)\n\n\tReact.useEffect(() => {\n\t\tif (!open) return\n\t\tif (listFetcher.state !== 'idle') return\n\t\tvoid listFetcher.load('/saved-playgrounds')\n\t}, [listFetcher, open])\n\n\tReact.useEffect(() => {\n\t\tif (!open) {\n\t\t\tsetQuery('')\n\t\t}\n\t}, [open])\n\n\tReact.useEffect(() => {\n\t\tif (actionFetcher.data?.status === 'success') {\n\t\t\tonOpenChange(false)\n\t\t}\n\t}, [actionFetcher.data, onOpenChange])\n\n\tconst filteredPlaygrounds = React.useMemo(() => {\n\t\tconst normalized = query.trim().toLowerCase()\n\t\tif (!normalized) return savedPlaygrounds\n\t\treturn savedPlaygrounds.filter((entry) => {\n\t\t\tconst displayName =\n\t\t\t\tallApps.find((app) => app.name === entry.appName)?.displayName ??\n\t\t\t\tentry.appName\n\t\t\treturn (\n\t\t\t\tentry.appName.toLowerCase().includes(normalized) ||\n\t\t\t\tentry.id.toLowerCase().includes(normalized) ||\n\t\t\t\tdisplayName.toLowerCase().includes(normalized)\n\t\t\t)\n\t\t})\n\t}, [allApps, query, savedPlaygrounds])\n\n\treturn (\n\t\t<Dialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<DialogContent className=\"max-w-2xl\">\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>Saved playgrounds</DialogTitle>\n\t\t\t\t\t<DialogDescription>\n\t\t\t\t\t\tRestore a saved playground into your active playground directory.\n\t\t\t\t\t</DialogDescription>\n\t\t\t\t</DialogHeader>\n\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t<label\n\t\t\t\t\t\t\thtmlFor=\"savedPlaygroundSearch\"\n\t\t\t\t\t\t\tclassName=\"text-sm font-medium\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tSearch saved playgrounds\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"savedPlaygroundSearch\"\n\t\t\t\t\t\t\ttype=\"search\"\n\t\t\t\t\t\t\tvalue={query}\n\t\t\t\t\t\t\tonChange={(event) => setQuery(event.currentTarget.value)}\n\t\t\t\t\t\t\tplaceholder=\"Filter by exercise, app name, or timestamp\"\n\t\t\t\t\t\t\tclassName=\"border-border bg-background text-foreground w-full rounded-md border px-3 py-2 text-sm\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"border-border bg-muted/40 rounded-md border\">\n\t\t\t\t\t\t<div className=\"border-border text-muted-foreground flex items-center justify-between border-b px-3 py-2 text-xs\">\n\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t{savedPlaygrounds.length === 1\n\t\t\t\t\t\t\t\t\t? '1 saved playground'\n\t\t\t\t\t\t\t\t\t: `${savedPlaygrounds.length} saved playgrounds`}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{query ? (\n\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t{filteredPlaygrounds.length === 1\n\t\t\t\t\t\t\t\t\t\t? '1 match'\n\t\t\t\t\t\t\t\t\t\t: `${filteredPlaygrounds.length} matches`}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"max-h-72 overflow-y-auto\">\n\t\t\t\t\t\t\t{isLoading ? (\n\t\t\t\t\t\t\t\t<div className=\"text-muted-foreground px-3 py-4 text-sm\">\n\t\t\t\t\t\t\t\t\tLoading saved playgrounds...\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : listFetcher.data?.status === 'disabled' ? (\n\t\t\t\t\t\t\t\t<div className=\"text-muted-foreground px-3 py-4 text-sm\">\n\t\t\t\t\t\t\t\t\tEnable playground persistence in Preferences to use saved\n\t\t\t\t\t\t\t\t\tplaygrounds.\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : filteredPlaygrounds.length === 0 ? (\n\t\t\t\t\t\t\t\t<div className=\"text-muted-foreground px-3 py-4 text-sm\">\n\t\t\t\t\t\t\t\t\t{query\n\t\t\t\t\t\t\t\t\t\t? 'No saved playgrounds match your search.'\n\t\t\t\t\t\t\t\t\t\t: 'No saved playgrounds yet. Set the playground to create one.'}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\tfilteredPlaygrounds.map((entry) => {\n\t\t\t\t\t\t\t\t\tconst displayName =\n\t\t\t\t\t\t\t\t\t\tallApps.find((app) => app.name === entry.appName)\n\t\t\t\t\t\t\t\t\t\t\t?.displayName ?? entry.appName\n\t\t\t\t\t\t\t\t\tconst createdAt = new Date(entry.createdAt)\n\t\t\t\t\t\t\t\t\tconst isActive = activeSubmissionId === entry.id\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tkey={entry.id}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"border-border flex items-center justify-between gap-4 border-b px-3 py-3 last:border-b-0\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"min-w-0\">\n\t\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-foreground text-sm font-semibold\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{displayName}\n\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-muted-foreground truncate font-mono text-xs\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{entry.appName}\n\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t<time\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-muted-foreground text-xs\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tdateTime={entry.createdAt}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{Number.isNaN(createdAt.getTime())\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? entry.createdAt\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: formatter.format(createdAt)}\n\t\t\t\t\t\t\t\t\t\t\t\t</time>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\tvarient=\"primary\"\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={isSubmitting}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\t\t\t\tactionFetcher.submit(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ savedPlaygroundId: entry.id },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ method: 'POST', action: '/saved-playgrounds' },\n\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{isActive ? 'Setting...' : 'Set playground'}\n\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t{actionFetcher.data?.status === 'error' ? (\n\t\t\t\t\t\t<p className=\"text-foreground-destructive text-sm\">\n\t\t\t\t\t\t\t{actionFetcher.data.error}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\t\t\t\t<DialogFooter>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName=\"border-border text-foreground hover:bg-muted focus-visible:ring-ring inline-flex items-center justify-center rounded-md border px-3 py-2 text-sm font-semibold\"\n\t\t\t\t\t\tonClick={() => onOpenChange(false)}\n\t\t\t\t\t>\n\t\t\t\t\t\tClose\n\t\t\t\t\t</button>\n\t\t\t\t</DialogFooter>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t)\n}\n\nexport function SetPlayground({\n\tappName,\n\treset = false,\n\ttooltipText,\n\t...buttonProps\n}: {\n\tappName: string\n\ttooltipText?: string\n\treset?: boolean\n} & React.ComponentProps<'button'>) {\n\tconst fetcher = useFetcher<typeof action>()\n\tconst persistFetcher = useFetcher<PersistPlaygroundResult>()\n\tconst peRedirectInput = usePERedirectInput()\n\tconst { shouldConfirm } = usePlaygroundOnboardingGate()\n\tconst [dialogOpen, setDialogOpen] = React.useState(false)\n\tconst formRef = React.useRef<HTMLFormElement>(null)\n\tconst bypassConfirmationRef = React.useRef(false)\n\tconst isSubmitting = fetcher.state !== 'idle'\n\n\tconst submitButton = (\n\t\t<button\n\t\t\ttype=\"submit\"\n\t\t\t{...buttonProps}\n\t\t\tclassName={clsx(\n\t\t\t\tbuttonProps.className,\n\t\t\t\tfetcher.state !== 'idle' ? 'cursor-progress' : null,\n\t\t\t\tfetcher.data?.status === 'error' ? 'cursor-not-allowed' : null,\n\t\t\t)}\n\t\t/>\n\t)\n\treturn (\n\t\t<>\n\t\t\t<fetcher.Form\n\t\t\t\taction=\"/set-playground\"\n\t\t\t\tmethod=\"POST\"\n\t\t\t\tclassName=\"inline-flex items-center justify-center\"\n\t\t\t\tref={formRef}\n\t\t\t\tonSubmit={(event) => {\n\t\t\t\t\tif (shouldConfirm && !bypassConfirmationRef.current) {\n\t\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\t\tsetDialogOpen(true)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tbypassConfirmationRef.current = false\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{peRedirectInput}\n\t\t\t\t<input type=\"hidden\" name=\"appName\" value={appName} />\n\t\t\t\t{reset ? <input type=\"hidden\" name=\"reset\" value=\"true\" /> : null}\n\t\t\t\t{showProgressBarField}\n\t\t\t\t{tooltipText ? (\n\t\t\t\t\t<SimpleTooltip content={tooltipText}>{submitButton}</SimpleTooltip>\n\t\t\t\t) : (\n\t\t\t\t\tsubmitButton\n\t\t\t\t)}\n\t\t\t</fetcher.Form>\n\t\t\t<PlaygroundSetDialog\n\t\t\t\topen={dialogOpen}\n\t\t\t\tonOpenChange={setDialogOpen}\n\t\t\t\tisSubmitting={isSubmitting}\n\t\t\t\tpersistFetcher={persistFetcher}\n\t\t\t\tonConfirm={() => {\n\t\t\t\t\tbypassConfirmationRef.current = true\n\t\t\t\t\tsetDialogOpen(false)\n\t\t\t\t\tformRef.current?.requestSubmit()\n\t\t\t\t}}\n\t\t\t/>\n\t\t</>\n\t)\n}\n\nexport function PlaygroundChooser({\n\tplaygroundAppName,\n\tallApps,\n}: {\n\tplaygroundAppName?: string\n\tallApps: Array<{ name: string; displayName: string }>\n}) {\n\tconst fetcher = useFetcher<typeof action>()\n\tconst persistFetcher = useFetcher<PersistPlaygroundResult>()\n\tconst { shouldConfirm, persistEnabled } = usePlaygroundOnboardingGate()\n\tconst [dialogOpen, setDialogOpen] = React.useState(false)\n\tconst [savedDialogOpen, setSavedDialogOpen] = React.useState(false)\n\tconst [pendingAppName, setPendingAppName] = React.useState<string | null>(\n\t\tnull,\n\t)\n\tconst isSubmitting = fetcher.state !== 'idle'\n\treturn (\n\t\t<>\n\t\t\t<Select.Root\n\t\t\t\tname=\"appName\"\n\t\t\t\tvalue={playgroundAppName}\n\t\t\t\tonValueChange={(appName) => {\n\t\t\t\t\tif (appName === savedPlaygroundsValue) {\n\t\t\t\t\t\tsetSavedDialogOpen(true)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (shouldConfirm) {\n\t\t\t\t\t\tsetPendingAppName(appName)\n\t\t\t\t\t\tsetDialogOpen(true)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tvoid fetcher.submit(\n\t\t\t\t\t\t{ appName },\n\t\t\t\t\t\t{ method: 'POST', action: '/set-playground' },\n\t\t\t\t\t)\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<Select.Trigger\n\t\t\t\t\taria-label=\"Select app for playground\"\n\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t'radix-placeholder:text-muted-foreground flex h-full w-full items-center justify-between text-left focus-visible:outline-none',\n\t\t\t\t\t\tfetcher.state !== 'idle' ? 'cursor-progress' : null,\n\t\t\t\t\t\tfetcher.data?.status === 'error' ? 'cursor-not-allowed' : null,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<span className=\"scrollbar-thin scrollbar-thumb-scrollbar w-80 flex-1 truncate\">\n\t\t\t\t\t\t<Select.Value\n\t\t\t\t\t\t\tplaceholder=\"Select current app\"\n\t\t\t\t\t\t\tclassName=\"inline-block w-40 truncate\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</span>\n\t\t\t\t\t<Select.Icon>\n\t\t\t\t\t\t<Icon name=\"TriangleDownSmall\" />\n\t\t\t\t\t</Select.Icon>\n\t\t\t\t</Select.Trigger>\n\t\t\t\t<Select.Portal>\n\t\t\t\t\t<Select.Content\n\t\t\t\t\t\tposition=\"popper\"\n\t\t\t\t\t\talign=\"start\"\n\t\t\t\t\t\tclassName=\"invert-theme bg-popover text-popover-foreground z-20 max-h-[50vh] lg:max-h-[70vh]\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Select.ScrollUpButton className=\"flex h-5 cursor-default items-center justify-center\">\n\t\t\t\t\t\t\t<Icon name=\"ChevronUp\" />\n\t\t\t\t\t\t</Select.ScrollUpButton>\n\t\t\t\t\t\t<Select.Viewport className=\"p-3\">\n\t\t\t\t\t\t\t<Select.Group>\n\t\t\t\t\t\t\t\t<Select.Label className=\"px-5 pb-3 font-mono uppercase\">\n\t\t\t\t\t\t\t\t\tApp\n\t\t\t\t\t\t\t\t</Select.Label>\n\t\t\t\t\t\t\t\t{allApps\n\t\t\t\t\t\t\t\t\t.filter((app) => app.name !== 'playground')\n\t\t\t\t\t\t\t\t\t.map((app) => {\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<SelectItem key={app.name} value={app.name}>\n\t\t\t\t\t\t\t\t\t\t\t\t{app.displayName}\n\t\t\t\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</Select.Group>\n\t\t\t\t\t\t\t{persistEnabled ? (\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t<Select.Separator className=\"bg-border my-2 h-px\" />\n\t\t\t\t\t\t\t\t\t<Select.Group>\n\t\t\t\t\t\t\t\t\t\t<Select.Label className=\"text-muted-foreground px-5 pb-2 font-mono text-xs uppercase\">\n\t\t\t\t\t\t\t\t\t\t\tSaved playgrounds\n\t\t\t\t\t\t\t\t\t\t</Select.Label>\n\t\t\t\t\t\t\t\t\t\t<SelectItem value={savedPlaygroundsValue}>\n\t\t\t\t\t\t\t\t\t\t\tChoose a saved playground...\n\t\t\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t\t\t</Select.Group>\n\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</Select.Viewport>\n\t\t\t\t\t\t<Select.ScrollDownButton className=\"flex h-5 cursor-default items-center justify-center\">\n\t\t\t\t\t\t\t<Icon name=\"ChevronDown\" />\n\t\t\t\t\t\t</Select.ScrollDownButton>\n\t\t\t\t\t</Select.Content>\n\t\t\t\t</Select.Portal>\n\t\t\t</Select.Root>\n\t\t\t<PlaygroundSetDialog\n\t\t\t\topen={dialogOpen}\n\t\t\t\tonOpenChange={(open) => {\n\t\t\t\t\tsetDialogOpen(open)\n\t\t\t\t\tif (!open) {\n\t\t\t\t\t\tsetPendingAppName(null)\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\tisSubmitting={isSubmitting}\n\t\t\t\tpersistFetcher={persistFetcher}\n\t\t\t\tonConfirm={() => {\n\t\t\t\t\tif (!pendingAppName) return\n\t\t\t\t\tsetDialogOpen(false)\n\t\t\t\t\tvoid fetcher.submit(\n\t\t\t\t\t\t{ appName: pendingAppName },\n\t\t\t\t\t\t{ method: 'POST', action: '/set-playground' },\n\t\t\t\t\t)\n\t\t\t\t\tsetPendingAppName(null)\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t<SavedPlaygroundsDialog\n\t\t\t\topen={savedDialogOpen}\n\t\t\t\tonOpenChange={setSavedDialogOpen}\n\t\t\t\tallApps={allApps}\n\t\t\t/>\n\t\t</>\n\t)\n}\n\nfunction SelectItem({\n\tvalue,\n\tchildren,\n}: {\n\tvalue: string\n\tchildren: React.ReactNode\n}) {\n\treturn (\n\t\t<Select.Item\n\t\t\tvalue={value}\n\t\t\tclassName=\"radix-disabled:text-muted-foreground radix-highlighted:opacity-100 radix-highlighted:outline-none radix-state-checked:opacity-100 relative flex cursor-pointer items-center rounded px-10 py-2 leading-none opacity-80 select-none\"\n\t\t>\n\t\t\t<Select.ItemText>{children}</Select.ItemText>\n\t\t\t<Select.ItemIndicator className=\"absolute left-0 inline-flex w-[25px] items-center justify-center\">\n\t\t\t\t<Icon name=\"CheckSmall\" />\n\t\t\t</Select.ItemIndicator>\n\t\t</Select.Item>\n\t)\n}\n\nexport function SetAppToPlayground({\n\tappName,\n\tisOutdated,\n\thideTextOnNarrow,\n\tshowOnboardingIndicator = false,\n\tonClick,\n\tclassName,\n\t...buttonProps\n}: {\n\tappName: string\n\tisOutdated?: boolean\n\t/** When true, hides text at narrow container widths (for use in @container contexts) */\n\thideTextOnNarrow?: boolean\n\tshowOnboardingIndicator?: boolean\n} & React.ComponentProps<'button'>) {\n\tconst [showBadge, dismissBadge] = useOnboardingIndicator(\n\t\tPLAYGROUND_ONBOARDING_FEATURE_ID,\n\t)\n\tif (ENV.EPICSHOP_DEPLOYED) return null\n\tconst shouldShowBadge = showOnboardingIndicator && showBadge\n\tconst buttonClassName = clsx(className, shouldShowBadge ? 'relative' : null)\n\treturn (\n\t\t<SetPlayground\n\t\t\tappName={appName}\n\t\t\ttooltipText={\n\t\t\t\tisOutdated\n\t\t\t\t\t? 'The app the playground was set to has been updated. Click to update to the latest version.'\n\t\t\t\t\t: 'Playground is not set to the right app. Click to set Playground.'\n\t\t\t}\n\t\t\t{...buttonProps}\n\t\t\tclassName={buttonClassName}\n\t\t\tonClick={(event) => {\n\t\t\t\tonClick?.(event)\n\t\t\t\tif (showOnboardingIndicator) {\n\t\t\t\t\tdismissBadge()\n\t\t\t\t}\n\t\t\t}}\n\t\t>\n\t\t\t<span className=\"text-foreground-destructive flex items-center justify-center gap-1 hover:underline\">\n\t\t\t\t<Icon name=\"Unlinked\" className=\"animate-ping\" />{' '}\n\t\t\t\t<span\n\t\t\t\t\tclassName={\n\t\t\t\t\t\thideTextOnNarrow\n\t\t\t\t\t\t\t? 'hidden uppercase @min-[600px]:inline'\n\t\t\t\t\t\t\t: 'uppercase'\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{isOutdated ? 'Playground Outdated' : 'Set to Playground'}\n\t\t\t\t</span>\n\t\t\t\t{shouldShowBadge ? (\n\t\t\t\t\t<OnboardingBadge\n\t\t\t\t\t\ttooltip=\"Set the playground for this step.\"\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t</span>\n\t\t</SetPlayground>\n\t)\n}\n"],"names":["PLAYGROUND_ONBOARDING_FEATURE_ID","savedPlaygroundsValue","emptySavedPlaygrounds","usePlaygroundOnboardingGate","rootData","useRootLoaderData","persistEnabled","preferences","playground","persist","onboardingComplete","includes","shouldConfirm","PlaygroundSetDialog","open","onOpenChange","onConfirm","isSubmitting","persistFetcher","peRedirectInput","usePERedirectInput","isPersisting","state","currentPersist","data","status","nextPersist","Dialog","children","jsxs","DialogContent","className","DialogHeader","jsx","DialogTitle","DialogDescription","Form","method","action","type","name","value","role","clsx","disabled","DialogFooter","onClick","Button","varient","SavedPlaygroundsDialog","allApps","listFetcher","useFetcher","actionFetcher","query","setQuery","React","savedPlaygrounds","isLoading","activeSubmissionId","formData","get","formatter","Intl","DateTimeFormat","dateStyle","timeStyle","load","filteredPlaygrounds","normalized","trim","toLowerCase","filter","entry","displayName","find","app","appName","id","htmlFor","onChange","event","currentTarget","placeholder","length","map","createdAt","Date","isActive","dateTime","Number","isNaN","getTime","format","submit","savedPlaygroundId","error","SetPlayground","reset","tooltipText","buttonProps","fetcher","dialogOpen","setDialogOpen","formRef","bypassConfirmationRef","submitButton","Fragment","ref","onSubmit","current","preventDefault","showProgressBarField","SimpleTooltip","content","requestSubmit","PlaygroundChooser","playgroundAppName","savedDialogOpen","setSavedDialogOpen","pendingAppName","setPendingAppName","Select","onValueChange","Icon","position","align","SelectItem","SetAppToPlayground","isOutdated","hideTextOnNarrow","showOnboardingIndicator","showBadge","dismissBadge","useOnboardingIndicator","ENV","EPICSHOP_DEPLOYED","shouldShowBadge","buttonClassName","OnboardingBadge","tooltip","size"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"set-playground-DO5tJu4h.js","sources":["../../../app/routes/set-playground.tsx"],"sourcesContent":["import {\n\tgetAppByName,\n\tgetApps,\n\tisPlaygroundApp,\n\tisProblemApp,\n\tisSolutionApp,\n\tsetPlayground,\n} from '@epic-web/workshop-utils/apps.server'\nimport { markOnboardingComplete } from '@epic-web/workshop-utils/db.server'\nimport { getDiffCode } from '@epic-web/workshop-utils/diff.server'\nimport { clearTestProcessEntry } from '@epic-web/workshop-utils/process-manager.server'\nimport * as Select from '@radix-ui/react-select'\nimport { clsx } from 'clsx'\nimport * as React from 'react'\nimport { type ActionFunctionArgs, useFetcher } from 'react-router'\nimport { z } from 'zod'\nimport { Button } from '#app/components/button.tsx'\nimport { Icon } from '#app/components/icons.tsx'\nimport {\n\tOnboardingBadge,\n\tuseOnboardingIndicator,\n} from '#app/components/onboarding-indicator.tsx'\nimport { showProgressBarField } from '#app/components/progress-bar.tsx'\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n} from '#app/components/ui/dialog.tsx'\nimport { SimpleTooltip } from '#app/components/ui/tooltip.tsx'\nimport { ensureUndeployed, getErrorMessage } from '#app/utils/misc.tsx'\nimport { dataWithPE, usePERedirectInput } from '#app/utils/pe.tsx'\nimport { useRootLoaderData } from '#app/utils/root-loader.ts'\nimport { createToastHeaders } from '#app/utils/toast.server.ts'\n\nconst PLAYGROUND_ONBOARDING_FEATURE_ID = 'set-playground'\n\nconst SetPlaygroundSchema = z.object({\n\tappName: z.string(),\n\treset: z\n\t\t.string()\n\t\t.nullable()\n\t\t.optional()\n\t\t.transform((v) => v === 'true'),\n})\n\nexport async function action({ request }: ActionFunctionArgs) {\n\tensureUndeployed()\n\tconst formData = await request.formData()\n\tconst rawData = {\n\t\tappName: formData.get('appName'),\n\t\tredirectTo: formData.get('redirectTo'),\n\t}\n\tconst result = SetPlaygroundSchema.safeParse(rawData)\n\tif (!result.success) {\n\t\treturn dataWithPE(\n\t\t\trequest,\n\t\t\tformData,\n\t\t\t{ status: 'error', error: result.error.message } as const,\n\t\t\t{ status: 400 },\n\t\t)\n\t}\n\tconst form = result.data\n\tconst app = await getAppByName(form.appName)\n\tif (!app) {\n\t\treturn dataWithPE(\n\t\t\trequest,\n\t\t\tformData,\n\t\t\t{ status: 'error', error: `App ${form.appName} not found` } as const,\n\t\t\t{ status: 404 },\n\t\t)\n\t}\n\tconst converseApp =\n\t\tisProblemApp(app) && app.solutionName\n\t\t\t? await getAppByName(app.solutionName)\n\t\t\t: isSolutionApp(app) && app.problemName\n\t\t\t\t? await getAppByName(app.problemName)\n\t\t\t\t: undefined\n\ttry {\n\t\tawait setPlayground(app.fullPath, { reset: form.reset })\n\t} catch (error: unknown) {\n\t\tconst message = getErrorMessage(error)\n\t\tconsole.error('Error setting playground', message)\n\t\treturn dataWithPE(\n\t\t\trequest,\n\t\t\tformData,\n\t\t\t{ status: 'error', error: message } as const,\n\t\t\t{\n\t\t\t\tstatus: 500,\n\t\t\t\theaders: await createToastHeaders({\n\t\t\t\t\ttype: 'error',\n\t\t\t\t\ttitle: 'Error',\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t'There was an error setting the playground. Check the terminal for details.',\n\t\t\t\t}),\n\t\t\t},\n\t\t)\n\t}\n\tconst apps = await getApps({ forceFresh: true })\n\tconst playground = apps.find(isPlaygroundApp)\n\tif (playground) {\n\t\tclearTestProcessEntry(playground)\n\t\tif (converseApp) {\n\t\t\tvoid getDiffCode(playground, converseApp, { forceFresh: true })\n\t\t}\n\t}\n\tawait markOnboardingComplete(PLAYGROUND_ONBOARDING_FEATURE_ID)\n\treturn dataWithPE(request, formData, { status: 'success' } as const)\n}\n\ntype PersistPlaygroundResult =\n\t| { status: 'success'; persist: boolean }\n\t| { status: 'error' }\n\ntype SavedPlaygroundsLoaderData =\n\t| {\n\t\t\tstatus: 'success'\n\t\t\tsavedPlaygrounds: Array<{\n\t\t\t\tid: string\n\t\t\t\tappName: string\n\t\t\t\tcreatedAt: string\n\t\t\t}>\n\t }\n\t| { status: 'disabled'; savedPlaygrounds: [] }\n\ntype SavedPlaygroundsActionData =\n\t| { status: 'success'; savedPlaygroundId: string }\n\t| { status: 'error'; error: string }\n\nconst savedPlaygroundsValue = '__saved-playgrounds__'\nconst emptySavedPlaygrounds: Array<{\n\tid: string\n\tappName: string\n\tcreatedAt: string\n}> = []\n\nfunction usePlaygroundOnboardingGate() {\n\tconst rootData = useRootLoaderData()\n\tconst persistEnabled = rootData.preferences?.playground?.persist ?? false\n\tconst onboardingComplete =\n\t\trootData.preferences?.onboardingComplete?.includes(\n\t\t\tPLAYGROUND_ONBOARDING_FEATURE_ID,\n\t\t) ?? false\n\treturn {\n\t\tpersistEnabled,\n\t\tshouldConfirm: !persistEnabled && !onboardingComplete,\n\t}\n}\n\nfunction PlaygroundSetDialog({\n\topen,\n\tonOpenChange,\n\tonConfirm,\n\tisSubmitting,\n\tpersistFetcher,\n}: {\n\topen: boolean\n\tonOpenChange: (open: boolean) => void\n\tonConfirm: () => void\n\tisSubmitting: boolean\n\tpersistFetcher: ReturnType<typeof useFetcher<PersistPlaygroundResult>>\n}) {\n\tconst peRedirectInput = usePERedirectInput()\n\tconst { persistEnabled } = usePlaygroundOnboardingGate()\n\tconst isPersisting = persistFetcher.state !== 'idle'\n\tconst currentPersist =\n\t\tpersistFetcher.data?.status === 'success'\n\t\t\t? persistFetcher.data.persist\n\t\t\t: persistEnabled\n\tconst nextPersist = !currentPersist\n\treturn (\n\t\t<Dialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<DialogContent className=\"max-w-xl\">\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>Playground ready for your first step</DialogTitle>\n\t\t\t\t\t<DialogDescription>\n\t\t\t\t\t\tNice work getting here! Setting the playground is how you bring the\n\t\t\t\t\t\tnext step's instructions into your workspace.\n\t\t\t\t\t</DialogDescription>\n\t\t\t\t</DialogHeader>\n\t\t\t\t<div className=\"space-y-4 text-sm\">\n\t\t\t\t\t<p className=\"text-muted-foreground\">\n\t\t\t\t\t\tThis will replace whatever is currently in your playground with the\n\t\t\t\t\t\tnext step's files. That is expected and the default workflow.\n\t\t\t\t\t</p>\n\t\t\t\t\t<div className=\"border-border bg-muted/40 space-y-3 rounded-md border p-4\">\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<p className=\"text-foreground font-semibold\">\n\t\t\t\t\t\t\t\tOptional: Save a copy each time\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p className=\"text-muted-foreground mt-1 text-sm\">\n\t\t\t\t\t\t\t\tWhen enabled, every set saves a copy in\n\t\t\t\t\t\t\t\t<span className=\"font-mono\"> saved-playgrounds</span>. You can\n\t\t\t\t\t\t\t\tchange this later in Preferences.\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p className=\"text-muted-foreground mt-2 text-xs\">\n\t\t\t\t\t\t\t\tYou can always manage this in Preferences.\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<persistFetcher.Form method=\"POST\" action=\"/persist-playground\">\n\t\t\t\t\t\t\t{peRedirectInput}\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype=\"hidden\"\n\t\t\t\t\t\t\t\tname=\"persist\"\n\t\t\t\t\t\t\t\tvalue={nextPersist ? 'true' : 'false'}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<div className=\"flex items-center justify-between gap-3\">\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t<p className=\"text-foreground text-sm font-medium\">\n\t\t\t\t\t\t\t\t\t\tPersistence\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t<p className=\"text-muted-foreground text-xs\">\n\t\t\t\t\t\t\t\t\t\t{currentPersist ? 'Enabled' : 'Disabled'}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\t\t\trole=\"switch\"\n\t\t\t\t\t\t\t\t\taria-checked={currentPersist}\n\t\t\t\t\t\t\t\t\taria-label={`Toggle playground persistence ${\n\t\t\t\t\t\t\t\t\t\tcurrentPersist ? 'off' : 'on'\n\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t'focus-visible:ring-ring relative inline-flex h-6 w-11 items-center rounded-full border transition',\n\t\t\t\t\t\t\t\t\t\tcurrentPersist\n\t\t\t\t\t\t\t\t\t\t\t? 'border-foreground bg-foreground'\n\t\t\t\t\t\t\t\t\t\t\t: 'border-border bg-muted',\n\t\t\t\t\t\t\t\t\t\tisPersisting ? 'cursor-progress opacity-70' : null,\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tdisabled={isPersisting}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t\t'bg-background inline-block h-5 w-5 rounded-full shadow transition',\n\t\t\t\t\t\t\t\t\t\t\tcurrentPersist ? 'translate-x-5' : 'translate-x-0',\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</persistFetcher.Form>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<DialogFooter>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName=\"border-border text-foreground hover:bg-muted focus-visible:ring-ring inline-flex items-center justify-center rounded-md border px-3 py-2 text-sm font-semibold\"\n\t\t\t\t\t\tonClick={() => onOpenChange(false)}\n\t\t\t\t\t>\n\t\t\t\t\t\tCancel\n\t\t\t\t\t</button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvarient=\"primary\"\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={onConfirm}\n\t\t\t\t\t\tdisabled={isSubmitting}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isSubmitting ? 'Setting...' : 'Set playground'}\n\t\t\t\t\t</Button>\n\t\t\t\t</DialogFooter>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t)\n}\n\nfunction SavedPlaygroundsDialog({\n\topen,\n\tonOpenChange,\n\tallApps,\n}: {\n\topen: boolean\n\tonOpenChange: (open: boolean) => void\n\tallApps: Array<{ name: string; displayName: string }>\n}) {\n\tconst listFetcher = useFetcher<SavedPlaygroundsLoaderData>()\n\tconst actionFetcher = useFetcher<SavedPlaygroundsActionData>()\n\tconst [query, setQuery] = React.useState('')\n\tconst savedPlaygrounds =\n\t\tlistFetcher.data?.status === 'success'\n\t\t\t? listFetcher.data.savedPlaygrounds\n\t\t\t: emptySavedPlaygrounds\n\tconst isLoading = listFetcher.state !== 'idle' && !listFetcher.data\n\tconst isSubmitting = actionFetcher.state !== 'idle'\n\tconst activeSubmissionId = actionFetcher.formData?.get(\n\t\t'savedPlaygroundId',\n\t) as string | null\n\tconst formatter = React.useMemo(\n\t\t() =>\n\t\t\tnew Intl.DateTimeFormat(undefined, {\n\t\t\t\tdateStyle: 'medium',\n\t\t\t\ttimeStyle: 'short',\n\t\t\t}),\n\t\t[],\n\t)\n\n\tReact.useEffect(() => {\n\t\tif (!open) return\n\t\tif (listFetcher.state !== 'idle') return\n\t\tvoid listFetcher.load('/saved-playgrounds')\n\t}, [listFetcher, open])\n\n\tReact.useEffect(() => {\n\t\tif (!open) {\n\t\t\tsetQuery('')\n\t\t}\n\t}, [open])\n\n\tReact.useEffect(() => {\n\t\tif (actionFetcher.data?.status === 'success') {\n\t\t\tonOpenChange(false)\n\t\t}\n\t}, [actionFetcher.data, onOpenChange])\n\n\tconst filteredPlaygrounds = React.useMemo(() => {\n\t\tconst normalized = query.trim().toLowerCase()\n\t\tif (!normalized) return savedPlaygrounds\n\t\treturn savedPlaygrounds.filter((entry) => {\n\t\t\tconst displayName =\n\t\t\t\tallApps.find((app) => app.name === entry.appName)?.displayName ??\n\t\t\t\tentry.appName\n\t\t\treturn (\n\t\t\t\tentry.appName.toLowerCase().includes(normalized) ||\n\t\t\t\tentry.id.toLowerCase().includes(normalized) ||\n\t\t\t\tdisplayName.toLowerCase().includes(normalized)\n\t\t\t)\n\t\t})\n\t}, [allApps, query, savedPlaygrounds])\n\n\treturn (\n\t\t<Dialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<DialogContent className=\"max-w-2xl\">\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>Saved playgrounds</DialogTitle>\n\t\t\t\t\t<DialogDescription>\n\t\t\t\t\t\tRestore a saved playground into your active playground directory.\n\t\t\t\t\t</DialogDescription>\n\t\t\t\t</DialogHeader>\n\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t<label\n\t\t\t\t\t\t\thtmlFor=\"savedPlaygroundSearch\"\n\t\t\t\t\t\t\tclassName=\"text-sm font-medium\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tSearch saved playgrounds\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"savedPlaygroundSearch\"\n\t\t\t\t\t\t\ttype=\"search\"\n\t\t\t\t\t\t\tvalue={query}\n\t\t\t\t\t\t\tonChange={(event) => setQuery(event.currentTarget.value)}\n\t\t\t\t\t\t\tplaceholder=\"Filter by exercise, app name, or timestamp\"\n\t\t\t\t\t\t\tclassName=\"border-border bg-background text-foreground w-full rounded-md border px-3 py-2 text-sm\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"border-border bg-muted/40 rounded-md border\">\n\t\t\t\t\t\t<div className=\"border-border text-muted-foreground flex items-center justify-between border-b px-3 py-2 text-xs\">\n\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t{savedPlaygrounds.length === 1\n\t\t\t\t\t\t\t\t\t? '1 saved playground'\n\t\t\t\t\t\t\t\t\t: `${savedPlaygrounds.length} saved playgrounds`}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{query ? (\n\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t{filteredPlaygrounds.length === 1\n\t\t\t\t\t\t\t\t\t\t? '1 match'\n\t\t\t\t\t\t\t\t\t\t: `${filteredPlaygrounds.length} matches`}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"max-h-72 overflow-y-auto\">\n\t\t\t\t\t\t\t{isLoading ? (\n\t\t\t\t\t\t\t\t<div className=\"text-muted-foreground px-3 py-4 text-sm\">\n\t\t\t\t\t\t\t\t\tLoading saved playgrounds...\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : listFetcher.data?.status === 'disabled' ? (\n\t\t\t\t\t\t\t\t<div className=\"text-muted-foreground px-3 py-4 text-sm\">\n\t\t\t\t\t\t\t\t\tEnable playground persistence in Preferences to use saved\n\t\t\t\t\t\t\t\t\tplaygrounds.\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : filteredPlaygrounds.length === 0 ? (\n\t\t\t\t\t\t\t\t<div className=\"text-muted-foreground px-3 py-4 text-sm\">\n\t\t\t\t\t\t\t\t\t{query\n\t\t\t\t\t\t\t\t\t\t? 'No saved playgrounds match your search.'\n\t\t\t\t\t\t\t\t\t\t: 'No saved playgrounds yet. Set the playground to create one.'}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\tfilteredPlaygrounds.map((entry) => {\n\t\t\t\t\t\t\t\t\tconst displayName =\n\t\t\t\t\t\t\t\t\t\tallApps.find((app) => app.name === entry.appName)\n\t\t\t\t\t\t\t\t\t\t\t?.displayName ?? entry.appName\n\t\t\t\t\t\t\t\t\tconst createdAt = new Date(entry.createdAt)\n\t\t\t\t\t\t\t\t\tconst isActive = activeSubmissionId === entry.id\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tkey={entry.id}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"border-border flex items-center justify-between gap-4 border-b px-3 py-3 last:border-b-0\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"min-w-0\">\n\t\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-foreground text-sm font-semibold\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{displayName}\n\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-muted-foreground truncate font-mono text-xs\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{entry.appName}\n\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t<time\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-muted-foreground text-xs\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tdateTime={entry.createdAt}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{Number.isNaN(createdAt.getTime())\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? entry.createdAt\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: formatter.format(createdAt)}\n\t\t\t\t\t\t\t\t\t\t\t\t</time>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\tvarient=\"primary\"\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={isSubmitting}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\t\t\t\tactionFetcher.submit(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ savedPlaygroundId: entry.id },\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ method: 'POST', action: '/saved-playgrounds' },\n\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{isActive ? 'Setting...' : 'Set playground'}\n\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t{actionFetcher.data?.status === 'error' ? (\n\t\t\t\t\t\t<p className=\"text-foreground-destructive text-sm\">\n\t\t\t\t\t\t\t{actionFetcher.data.error}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\t\t\t\t<DialogFooter>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName=\"border-border text-foreground hover:bg-muted focus-visible:ring-ring inline-flex items-center justify-center rounded-md border px-3 py-2 text-sm font-semibold\"\n\t\t\t\t\t\tonClick={() => onOpenChange(false)}\n\t\t\t\t\t>\n\t\t\t\t\t\tClose\n\t\t\t\t\t</button>\n\t\t\t\t</DialogFooter>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t)\n}\n\nexport function SetPlayground({\n\tappName,\n\treset = false,\n\ttooltipText,\n\t...buttonProps\n}: {\n\tappName: string\n\ttooltipText?: string\n\treset?: boolean\n} & React.ComponentProps<'button'>) {\n\tconst fetcher = useFetcher<typeof action>()\n\tconst persistFetcher = useFetcher<PersistPlaygroundResult>()\n\tconst peRedirectInput = usePERedirectInput()\n\tconst { shouldConfirm } = usePlaygroundOnboardingGate()\n\tconst [dialogOpen, setDialogOpen] = React.useState(false)\n\tconst formRef = React.useRef<HTMLFormElement>(null)\n\tconst bypassConfirmationRef = React.useRef(false)\n\tconst isSubmitting = fetcher.state !== 'idle'\n\n\tconst submitButton = (\n\t\t<button\n\t\t\ttype=\"submit\"\n\t\t\t{...buttonProps}\n\t\t\tclassName={clsx(\n\t\t\t\tbuttonProps.className,\n\t\t\t\tfetcher.state !== 'idle' ? 'cursor-progress' : null,\n\t\t\t\tfetcher.data?.status === 'error' ? 'cursor-not-allowed' : null,\n\t\t\t)}\n\t\t/>\n\t)\n\treturn (\n\t\t<>\n\t\t\t<fetcher.Form\n\t\t\t\taction=\"/set-playground\"\n\t\t\t\tmethod=\"POST\"\n\t\t\t\tclassName=\"inline-flex items-center justify-center\"\n\t\t\t\tref={formRef}\n\t\t\t\tonSubmit={(event) => {\n\t\t\t\t\tif (shouldConfirm && !bypassConfirmationRef.current) {\n\t\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\t\tsetDialogOpen(true)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tbypassConfirmationRef.current = false\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{peRedirectInput}\n\t\t\t\t<input type=\"hidden\" name=\"appName\" value={appName} />\n\t\t\t\t{reset ? <input type=\"hidden\" name=\"reset\" value=\"true\" /> : null}\n\t\t\t\t{showProgressBarField}\n\t\t\t\t{tooltipText ? (\n\t\t\t\t\t<SimpleTooltip content={tooltipText}>{submitButton}</SimpleTooltip>\n\t\t\t\t) : (\n\t\t\t\t\tsubmitButton\n\t\t\t\t)}\n\t\t\t</fetcher.Form>\n\t\t\t<PlaygroundSetDialog\n\t\t\t\topen={dialogOpen}\n\t\t\t\tonOpenChange={setDialogOpen}\n\t\t\t\tisSubmitting={isSubmitting}\n\t\t\t\tpersistFetcher={persistFetcher}\n\t\t\t\tonConfirm={() => {\n\t\t\t\t\tbypassConfirmationRef.current = true\n\t\t\t\t\tsetDialogOpen(false)\n\t\t\t\t\tformRef.current?.requestSubmit()\n\t\t\t\t}}\n\t\t\t/>\n\t\t</>\n\t)\n}\n\nexport function PlaygroundChooser({\n\tplaygroundAppName,\n\tallApps,\n}: {\n\tplaygroundAppName?: string\n\tallApps: Array<{ name: string; displayName: string }>\n}) {\n\tconst fetcher = useFetcher<typeof action>()\n\tconst persistFetcher = useFetcher<PersistPlaygroundResult>()\n\tconst { shouldConfirm, persistEnabled } = usePlaygroundOnboardingGate()\n\tconst [dialogOpen, setDialogOpen] = React.useState(false)\n\tconst [savedDialogOpen, setSavedDialogOpen] = React.useState(false)\n\tconst [pendingAppName, setPendingAppName] = React.useState<string | null>(\n\t\tnull,\n\t)\n\tconst isSubmitting = fetcher.state !== 'idle'\n\treturn (\n\t\t<>\n\t\t\t<Select.Root\n\t\t\t\tname=\"appName\"\n\t\t\t\tvalue={playgroundAppName}\n\t\t\t\tonValueChange={(appName) => {\n\t\t\t\t\tif (appName === savedPlaygroundsValue) {\n\t\t\t\t\t\tsetSavedDialogOpen(true)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (shouldConfirm) {\n\t\t\t\t\t\tsetPendingAppName(appName)\n\t\t\t\t\t\tsetDialogOpen(true)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tvoid fetcher.submit(\n\t\t\t\t\t\t{ appName },\n\t\t\t\t\t\t{ method: 'POST', action: '/set-playground' },\n\t\t\t\t\t)\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<Select.Trigger\n\t\t\t\t\taria-label=\"Select app for playground\"\n\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t'radix-placeholder:text-muted-foreground flex h-full w-full items-center justify-between text-left focus-visible:outline-none',\n\t\t\t\t\t\tfetcher.state !== 'idle' ? 'cursor-progress' : null,\n\t\t\t\t\t\tfetcher.data?.status === 'error' ? 'cursor-not-allowed' : null,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<span className=\"scrollbar-thin scrollbar-thumb-scrollbar w-80 flex-1 truncate\">\n\t\t\t\t\t\t<Select.Value\n\t\t\t\t\t\t\tplaceholder=\"Select current app\"\n\t\t\t\t\t\t\tclassName=\"inline-block w-40 truncate\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</span>\n\t\t\t\t\t<Select.Icon>\n\t\t\t\t\t\t<Icon name=\"TriangleDownSmall\" />\n\t\t\t\t\t</Select.Icon>\n\t\t\t\t</Select.Trigger>\n\t\t\t\t<Select.Portal>\n\t\t\t\t\t<Select.Content\n\t\t\t\t\t\tposition=\"popper\"\n\t\t\t\t\t\talign=\"start\"\n\t\t\t\t\t\tclassName=\"invert-theme bg-popover text-popover-foreground z-20 max-h-[50vh] lg:max-h-[70vh]\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Select.ScrollUpButton className=\"flex h-5 cursor-default items-center justify-center\">\n\t\t\t\t\t\t\t<Icon name=\"ChevronUp\" />\n\t\t\t\t\t\t</Select.ScrollUpButton>\n\t\t\t\t\t\t<Select.Viewport className=\"p-3\">\n\t\t\t\t\t\t\t<Select.Group>\n\t\t\t\t\t\t\t\t<Select.Label className=\"px-5 pb-3 font-mono uppercase\">\n\t\t\t\t\t\t\t\t\tApp\n\t\t\t\t\t\t\t\t</Select.Label>\n\t\t\t\t\t\t\t\t{allApps\n\t\t\t\t\t\t\t\t\t.filter((app) => app.name !== 'playground')\n\t\t\t\t\t\t\t\t\t.map((app) => {\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<SelectItem key={app.name} value={app.name}>\n\t\t\t\t\t\t\t\t\t\t\t\t{app.displayName}\n\t\t\t\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</Select.Group>\n\t\t\t\t\t\t\t{persistEnabled ? (\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t<Select.Separator className=\"bg-border my-2 h-px\" />\n\t\t\t\t\t\t\t\t\t<Select.Group>\n\t\t\t\t\t\t\t\t\t\t<Select.Label className=\"text-muted-foreground px-5 pb-2 font-mono text-xs uppercase\">\n\t\t\t\t\t\t\t\t\t\t\tSaved playgrounds\n\t\t\t\t\t\t\t\t\t\t</Select.Label>\n\t\t\t\t\t\t\t\t\t\t<SelectItem value={savedPlaygroundsValue}>\n\t\t\t\t\t\t\t\t\t\t\tChoose a saved playground...\n\t\t\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t\t\t</Select.Group>\n\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</Select.Viewport>\n\t\t\t\t\t\t<Select.ScrollDownButton className=\"flex h-5 cursor-default items-center justify-center\">\n\t\t\t\t\t\t\t<Icon name=\"ChevronDown\" />\n\t\t\t\t\t\t</Select.ScrollDownButton>\n\t\t\t\t\t</Select.Content>\n\t\t\t\t</Select.Portal>\n\t\t\t</Select.Root>\n\t\t\t<PlaygroundSetDialog\n\t\t\t\topen={dialogOpen}\n\t\t\t\tonOpenChange={(open) => {\n\t\t\t\t\tsetDialogOpen(open)\n\t\t\t\t\tif (!open) {\n\t\t\t\t\t\tsetPendingAppName(null)\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\tisSubmitting={isSubmitting}\n\t\t\t\tpersistFetcher={persistFetcher}\n\t\t\t\tonConfirm={() => {\n\t\t\t\t\tif (!pendingAppName) return\n\t\t\t\t\tsetDialogOpen(false)\n\t\t\t\t\tvoid fetcher.submit(\n\t\t\t\t\t\t{ appName: pendingAppName },\n\t\t\t\t\t\t{ method: 'POST', action: '/set-playground' },\n\t\t\t\t\t)\n\t\t\t\t\tsetPendingAppName(null)\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t<SavedPlaygroundsDialog\n\t\t\t\topen={savedDialogOpen}\n\t\t\t\tonOpenChange={setSavedDialogOpen}\n\t\t\t\tallApps={allApps}\n\t\t\t/>\n\t\t</>\n\t)\n}\n\nfunction SelectItem({\n\tvalue,\n\tchildren,\n}: {\n\tvalue: string\n\tchildren: React.ReactNode\n}) {\n\treturn (\n\t\t<Select.Item\n\t\t\tvalue={value}\n\t\t\tclassName=\"radix-disabled:text-muted-foreground radix-highlighted:opacity-100 radix-highlighted:outline-none radix-state-checked:opacity-100 relative flex cursor-pointer items-center rounded px-10 py-2 leading-none opacity-80 select-none\"\n\t\t>\n\t\t\t<Select.ItemText>{children}</Select.ItemText>\n\t\t\t<Select.ItemIndicator className=\"absolute left-0 inline-flex w-[25px] items-center justify-center\">\n\t\t\t\t<Icon name=\"CheckSmall\" />\n\t\t\t</Select.ItemIndicator>\n\t\t</Select.Item>\n\t)\n}\n\nexport function SetAppToPlayground({\n\tappName,\n\tisOutdated,\n\thideTextOnNarrow,\n\tshowOnboardingIndicator = false,\n\tonClick,\n\tclassName,\n\t...buttonProps\n}: {\n\tappName: string\n\tisOutdated?: boolean\n\t/** When true, hides text at narrow container widths (for use in @container contexts) */\n\thideTextOnNarrow?: boolean\n\tshowOnboardingIndicator?: boolean\n} & React.ComponentProps<'button'>) {\n\tconst [showBadge, dismissBadge] = useOnboardingIndicator(\n\t\tPLAYGROUND_ONBOARDING_FEATURE_ID,\n\t)\n\tif (ENV.EPICSHOP_DEPLOYED) return null\n\tconst shouldShowBadge = showOnboardingIndicator && showBadge\n\tconst buttonClassName = clsx(className, shouldShowBadge ? 'relative' : null)\n\treturn (\n\t\t<SetPlayground\n\t\t\tappName={appName}\n\t\t\ttooltipText={\n\t\t\t\tisOutdated\n\t\t\t\t\t? 'The app the playground was set to has been updated. Click to update to the latest version.'\n\t\t\t\t\t: 'Playground is not set to the right app. Click to set Playground.'\n\t\t\t}\n\t\t\t{...buttonProps}\n\t\t\tclassName={buttonClassName}\n\t\t\tonClick={(event) => {\n\t\t\t\tonClick?.(event)\n\t\t\t\tif (showOnboardingIndicator) {\n\t\t\t\t\tdismissBadge()\n\t\t\t\t}\n\t\t\t}}\n\t\t>\n\t\t\t<span className=\"text-foreground-destructive flex items-center justify-center gap-1 hover:underline\">\n\t\t\t\t<Icon name=\"Unlinked\" className=\"animate-ping\" />{' '}\n\t\t\t\t<span\n\t\t\t\t\tclassName={\n\t\t\t\t\t\thideTextOnNarrow\n\t\t\t\t\t\t\t? 'hidden uppercase @min-[600px]:inline'\n\t\t\t\t\t\t\t: 'uppercase'\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{isOutdated ? 'Playground Outdated' : 'Set to Playground'}\n\t\t\t\t</span>\n\t\t\t\t{shouldShowBadge ? (\n\t\t\t\t\t<OnboardingBadge\n\t\t\t\t\t\ttooltip=\"Set the playground for this step.\"\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t</span>\n\t\t</SetPlayground>\n\t)\n}\n"],"names":["PLAYGROUND_ONBOARDING_FEATURE_ID","savedPlaygroundsValue","emptySavedPlaygrounds","usePlaygroundOnboardingGate","rootData","useRootLoaderData","persistEnabled","preferences","playground","persist","onboardingComplete","includes","shouldConfirm","PlaygroundSetDialog","open","onOpenChange","onConfirm","isSubmitting","persistFetcher","peRedirectInput","usePERedirectInput","isPersisting","state","currentPersist","data","status","nextPersist","Dialog","children","jsxs","DialogContent","className","DialogHeader","jsx","DialogTitle","DialogDescription","Form","method","action","type","name","value","role","clsx","disabled","DialogFooter","onClick","Button","varient","SavedPlaygroundsDialog","allApps","listFetcher","useFetcher","actionFetcher","query","setQuery","React","savedPlaygrounds","isLoading","activeSubmissionId","formData","get","formatter","Intl","DateTimeFormat","dateStyle","timeStyle","load","filteredPlaygrounds","normalized","trim","toLowerCase","filter","entry","displayName","find","app","appName","id","htmlFor","onChange","event","currentTarget","placeholder","length","map","createdAt","Date","isActive","dateTime","Number","isNaN","getTime","format","submit","savedPlaygroundId","error","SetPlayground","reset","tooltipText","buttonProps","fetcher","dialogOpen","setDialogOpen","formRef","bypassConfirmationRef","submitButton","Fragment","ref","onSubmit","current","preventDefault","showProgressBarField","SimpleTooltip","content","requestSubmit","PlaygroundChooser","playgroundAppName","savedDialogOpen","setSavedDialogOpen","pendingAppName","setPendingAppName","Select","onValueChange","Icon","position","align","SelectItem","SetAppToPlayground","isOutdated","hideTextOnNarrow","showOnboardingIndicator","showBadge","dismissBadge","useOnboardingIndicator","ENV","EPICSHOP_DEPLOYED","shouldShowBadge","buttonClassName","OnboardingBadge","tooltip","size"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{w as r,b as p}from"./chunk-EPOLDU6W-BCLmut3y.js";import{j as m}from"./jsx-runtime-C5WNSv3b.js";import{a as i}from"./tests-
|
|
2
|
-
//# sourceMappingURL=test-
|
|
1
|
+
import{w as r,b as p}from"./chunk-EPOLDU6W-BCLmut3y.js";import{j as m}from"./jsx-runtime-C5WNSv3b.js";import{a as i}from"./tests-Bko6qhsh.js";import"./index-CqIc3cxq.js";import"./accordion-CQ7oujC6.js";import"./tooltip-Tlsyx2YO.js";import"./index-vDCSPjrM.js";import"./misc-W4055b-0.js";import"./index-CJDOQ1bl.js";import"./index-ynYvVAOK.js";import"./epic-video-D4jBdSKs.js";import"./use-event-source-BuD4_2SF.js";import"./index-DzdDahau.js";import"./index-BrVvTrwg.js";import"./root-loader-BmUqzUDN.js";import"./pe-CIZUOJMr.js";import"./schemas-Uj5SZtvt.js";import"./online-DVk-W8Cr.js";import"./loading-CaCCsk9k.js";import"./format-CZ5n8p10.js";import"./user-CYXKquT7.js";import"./workshop-config-BMWaKPZT.js";import"./playground-window-CF8lTXXI.js";import"./set-playground-DO5tJu4h.js";import"./button-Cd-ekki5.js";import"./onboarding-indicator-BkeHYs2C.js";import"./progress-bar-DpWhcyhC.js";import"./dialog-CzO65Z5w.js";const v=r(function(){const{appInfo:t,userHasAccess:o}=p();return m.jsx(i,{playgroundAppInfo:t,userHasAccess:o},t.name)});export{v as default};
|
|
2
|
+
//# sourceMappingURL=test-C8NrA0Ls.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-
|
|
1
|
+
{"version":3,"file":"test-C8NrA0Ls.js","sources":["../../../app/routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test.tsx"],"sourcesContent":["import { requireExerciseApp } from '@epic-web/workshop-utils/apps.server'\nimport { userHasAccessToExerciseStep } from '@epic-web/workshop-utils/epic-api.server'\nimport {\n\tcombineServerTimings,\n\tmakeTimings,\n} from '@epic-web/workshop-utils/timing.server'\nimport {\n\tdata,\n\ttype HeadersFunction,\n\ttype LoaderFunctionArgs,\n\tuseLoaderData,\n} from 'react-router'\nimport { TestUI } from './__shared/tests.tsx'\n\nexport async function loader({ request, params }: LoaderFunctionArgs) {\n\tconst timings = makeTimings('exercise-step-test')\n\tconst exerciseStepApp = await requireExerciseApp(params, { request, timings })\n\n\treturn data(\n\t\t{\n\t\t\tappInfo: {\n\t\t\t\tname: exerciseStepApp?.name,\n\t\t\t\ttest: exerciseStepApp?.test,\n\t\t\t},\n\t\t\tuserHasAccess: await userHasAccessToExerciseStep({\n\t\t\t\texerciseNumber: Number(params.exerciseNumber),\n\t\t\t\tstepNumber: Number(params.stepNumber),\n\t\t\t\trequest,\n\t\t\t\ttimings,\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\theaders: {\n\t\t\t\t'Server-Timing': timings.toString(),\n\t\t\t},\n\t\t},\n\t)\n}\n\nexport const headers: HeadersFunction = ({ loaderHeaders, parentHeaders }) => {\n\tconst headers = {\n\t\t'Cache-Control': loaderHeaders.get('Cache-Control') ?? '',\n\t\t'Server-Timing': combineServerTimings(loaderHeaders, parentHeaders),\n\t}\n\treturn headers\n}\n\nexport default function TestsList() {\n\tconst { appInfo, userHasAccess } = useLoaderData<typeof loader>()\n\n\treturn (\n\t\t<TestUI\n\t\t\tkey={appInfo.name}\n\t\t\tplaygroundAppInfo={appInfo}\n\t\t\tuserHasAccess={userHasAccess}\n\t\t/>\n\t)\n}\n"],"names":["test","_UNSAFE_withComponentProps","appInfo","userHasAccess","useLoaderData","jsx","TestUI","playgroundAppInfo","name"],"mappings":"85BA+CA,MAAAA,EAAAC,EAAA,UAAoC,CACnC,KAAM,CAAEC,QAAAA,EAASC,cAAAA,GAAkBC,EAAA,EAEnC,OACCC,EAAAA,IAACC,EAAA,CAEAC,kBAAmBL,EACnBC,cAAAA,CAAA,EAFKD,EAAQM,IAGd,CAEF,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{j as s}from"./jsx-runtime-C5WNSv3b.js";import{g as Rt,r as L}from"./index-CqIc3cxq.js";import{R as kt,A as Ct,m as Mt}from"./accordion-CQ7oujC6.js";import{l as Ht,f as nt,A as $t}from"./chunk-EPOLDU6W-BCLmut3y.js";import{D as Ot}from"./epic-video-
|
|
1
|
+
import{j as s}from"./jsx-runtime-C5WNSv3b.js";import{g as Rt,r as L}from"./index-CqIc3cxq.js";import{R as kt,A as Ct,m as Mt}from"./accordion-CQ7oujC6.js";import{l as Ht,f as nt,A as $t}from"./chunk-EPOLDU6W-BCLmut3y.js";import{D as Ot}from"./epic-video-D4jBdSKs.js";import{I as N,p as st}from"./misc-W4055b-0.js";import{u as gt}from"./index-BrVvTrwg.js";import{u as z,o as I,k as _t,n as G,s as Q,l as k,i as ht,m as Ut}from"./schemas-Uj5SZtvt.js";import{S as K}from"./tooltip-Tlsyx2YO.js";import{u as Ft}from"./use-event-source-BuD4_2SF.js";import{u as ot}from"./pe-CIZUOJMr.js";import{P as It}from"./playground-window-CF8lTXXI.js";var W={},U={};const Pt="Á",Bt="á",Vt="Ă",Gt="ă",Xt="∾",zt="∿",Yt="∾̳",Jt="Â",Qt="â",Kt="´",Zt="А",Wt="а",tn="Æ",nn="æ",sn="",on="𝔄",cn="𝔞",en="À",rn="à",an="ℵ",ln="ℵ",un="Α",dn="α",pn="Ā",fn="ā",mn="⨿",gn="&",hn="&",bn="⩕",vn="⩓",xn="∧",wn="⩜",yn="⩘",qn="⩚",Ln="∠",Tn="⦤",Sn="∠",En="⦨",jn="⦩",An="⦪",Dn="⦫",Nn="⦬",Rn="⦭",kn="⦮",Cn="⦯",Mn="∡",Hn="∟",$n="⊾",On="⦝",_n="∢",Un="Å",Fn="⍼",In="Ą",Pn="ą",Bn="𝔸",Vn="𝕒",Gn="⩯",Xn="≈",zn="⩰",Yn="≊",Jn="≋",Qn="'",Kn="",Zn="≈",Wn="≊",ts="Å",ns="å",ss="𝒜",os="𝒶",cs="≔",es="*",rs="≈",as="≍",is="Ã",ls="ã",us="Ä",ds="ä",ps="∳",fs="⨑",ms="≌",gs="϶",hs="‵",bs="∽",vs="⋍",xs="∖",ws="⫧",ys="⊽",qs="⌅",Ls="⌆",Ts="⌅",Ss="⎵",Es="⎶",js="≌",As="Б",Ds="б",Ns="„",Rs="∵",ks="∵",Cs="∵",Ms="⦰",Hs="϶",$s="ℬ",Os="ℬ",_s="Β",Us="β",Fs="ℶ",Is="≬",Ps="𝔅",Bs="𝔟",Vs="⋂",Gs="◯",Xs="⋃",zs="⨀",Ys="⨁",Js="⨂",Qs="⨆",Ks="★",Zs="▽",Ws="△",to="⨄",no="⋁",so="⋀",oo="⤍",co="⧫",eo="▪",ro="▴",ao="▾",io="◂",lo="▸",uo="␣",po="▒",fo="░",mo="▓",go="█",ho="=⃥",bo="≡⃥",vo="⫭",xo="⌐",wo="𝔹",yo="𝕓",qo="⊥",Lo="⊥",To="⋈",So="⧉",Eo="┐",jo="╕",Ao="╖",Do="╗",No="┌",Ro="╒",ko="╓",Co="╔",Mo="─",Ho="═",$o="┬",Oo="╤",_o="╥",Uo="╦",Fo="┴",Io="╧",Po="╨",Bo="╩",Vo="⊟",Go="⊞",Xo="⊠",zo="┘",Yo="╛",Jo="╜",Qo="╝",Ko="└",Zo="╘",Wo="╙",tc="╚",nc="│",sc="║",oc="┼",cc="╪",ec="╫",rc="╬",ac="┤",ic="╡",lc="╢",uc="╣",dc="├",pc="╞",fc="╟",mc="╠",gc="‵",hc="˘",bc="˘",vc="¦",xc="𝒷",wc="ℬ",yc="⁏",qc="∽",Lc="⋍",Tc="⧅",Sc="\\",Ec="⟈",jc="•",Ac="•",Dc="≎",Nc="⪮",Rc="≏",kc="≎",Cc="≏",Mc="Ć",Hc="ć",$c="⩄",Oc="⩉",_c="⩋",Uc="∩",Fc="⋒",Ic="⩇",Pc="⩀",Bc="ⅅ",Vc="∩︀",Gc="⁁",Xc="ˇ",zc="ℭ",Yc="⩍",Jc="Č",Qc="č",Kc="Ç",Zc="ç",Wc="Ĉ",te="ĉ",ne="∰",se="⩌",oe="⩐",ce="Ċ",ee="ċ",re="¸",ae="¸",ie="⦲",le="¢",ue="·",de="·",pe="𝔠",fe="ℭ",me="Ч",ge="ч",he="✓",be="✓",ve="Χ",xe="χ",we="ˆ",ye="≗",qe="↺",Le="↻",Te="⊛",Se="⊚",Ee="⊝",je="⊙",Ae="®",De="Ⓢ",Ne="⊖",Re="⊕",ke="⊗",Ce="○",Me="⧃",He="≗",$e="⨐",Oe="⫯",_e="⧂",Ue="∲",Fe="”",Ie="’",Pe="♣",Be="♣",Ve=":",Ge="∷",Xe="⩴",ze="≔",Ye="≔",Je=",",Qe="@",Ke="∁",Ze="∘",We="∁",tr="ℂ",nr="≅",sr="⩭",or="≡",cr="∮",er="∯",rr="∮",ar="𝕔",ir="ℂ",lr="∐",ur="∐",dr="©",pr="©",fr="℗",mr="∳",gr="↵",hr="✗",br="⨯",vr="𝒞",xr="𝒸",wr="⫏",yr="⫑",qr="⫐",Lr="⫒",Tr="⋯",Sr="⤸",Er="⤵",jr="⋞",Ar="⋟",Dr="↶",Nr="⤽",Rr="⩈",kr="⩆",Cr="≍",Mr="∪",Hr="⋓",$r="⩊",Or="⊍",_r="⩅",Ur="∪︀",Fr="↷",Ir="⤼",Pr="⋞",Br="⋟",Vr="⋎",Gr="⋏",Xr="¤",zr="↶",Yr="↷",Jr="⋎",Qr="⋏",Kr="∲",Zr="∱",Wr="⌭",ta="†",na="‡",sa="ℸ",oa="↓",ca="↡",ea="⇓",ra="‐",aa="⫤",ia="⊣",la="⤏",ua="˝",da="Ď",pa="ď",fa="Д",ma="д",ga="‡",ha="⇊",ba="ⅅ",va="ⅆ",xa="⤑",wa="⩷",ya="°",qa="∇",La="Δ",Ta="δ",Sa="⦱",Ea="⥿",ja="𝔇",Aa="𝔡",Da="⥥",Na="⇃",Ra="⇂",ka="´",Ca="˙",Ma="˝",Ha="`",$a="˜",Oa="⋄",_a="⋄",Ua="⋄",Fa="♦",Ia="♦",Pa="¨",Ba="ⅆ",Va="ϝ",Ga="⋲",Xa="÷",za="÷",Ya="⋇",Ja="⋇",Qa="Ђ",Ka="ђ",Za="⌞",Wa="⌍",ti="$",ni="𝔻",si="𝕕",oi="¨",ci="˙",ei="⃜",ri="≐",ai="≑",ii="≐",li="∸",ui="∔",di="⊡",pi="⌆",fi="∯",mi="¨",gi="⇓",hi="⇐",bi="⇔",vi="⫤",xi="⟸",wi="⟺",yi="⟹",qi="⇒",Li="⊨",Ti="⇑",Si="⇕",Ei="∥",ji="⤓",Ai="↓",Di="↓",Ni="⇓",Ri="⇵",ki="̑",Ci="⇊",Mi="⇃",Hi="⇂",$i="⥐",Oi="⥞",_i="⥖",Ui="↽",Fi="⥟",Ii="⥗",Pi="⇁",Bi="↧",Vi="⊤",Gi="⤐",Xi="⌟",zi="⌌",Yi="𝒟",Ji="𝒹",Qi="Ѕ",Ki="ѕ",Zi="⧶",Wi="Đ",tl="đ",nl="⋱",sl="▿",ol="▾",cl="⇵",el="⥯",rl="⦦",al="Џ",il="џ",ll="⟿",ul="É",dl="é",pl="⩮",fl="Ě",ml="ě",gl="Ê",hl="ê",bl="≖",vl="≕",xl="Э",wl="э",yl="⩷",ql="Ė",Ll="ė",Tl="≑",Sl="ⅇ",El="≒",jl="𝔈",Al="𝔢",Dl="⪚",Nl="È",Rl="è",kl="⪖",Cl="⪘",Ml="⪙",Hl="∈",$l="⏧",Ol="ℓ",_l="⪕",Ul="⪗",Fl="Ē",Il="ē",Pl="∅",Bl="∅",Vl="◻",Gl="∅",Xl="▫",zl=" ",Yl=" ",Jl=" ",Ql="Ŋ",Kl="ŋ",Zl=" ",Wl="Ę",tu="ę",nu="𝔼",su="𝕖",ou="⋕",cu="⧣",eu="⩱",ru="ε",au="Ε",iu="ε",lu="ϵ",uu="≖",du="≕",pu="≂",fu="⪖",mu="⪕",gu="⩵",hu="=",bu="≂",vu="≟",xu="⇌",wu="≡",yu="⩸",qu="⧥",Lu="⥱",Tu="≓",Su="ℯ",Eu="ℰ",ju="≐",Au="⩳",Du="≂",Nu="Η",Ru="η",ku="Ð",Cu="ð",Mu="Ë",Hu="ë",$u="€",Ou="!",_u="∃",Uu="∃",Fu="ℰ",Iu="ⅇ",Pu="ⅇ",Bu="≒",Vu="Ф",Gu="ф",Xu="♀",zu="ffi",Yu="ff",Ju="ffl",Qu="𝔉",Ku="𝔣",Zu="fi",Wu="◼",td="▪",nd="fj",sd="♭",od="fl",cd="▱",ed="ƒ",rd="𝔽",ad="𝕗",id="∀",ld="∀",ud="⋔",dd="⫙",pd="ℱ",fd="⨍",md="½",gd="⅓",hd="¼",bd="⅕",vd="⅙",xd="⅛",wd="⅔",yd="⅖",qd="¾",Ld="⅗",Td="⅜",Sd="⅘",Ed="⅚",jd="⅝",Ad="⅞",Dd="⁄",Nd="⌢",Rd="𝒻",kd="ℱ",Cd="ǵ",Md="Γ",Hd="γ",$d="Ϝ",Od="ϝ",_d="⪆",Ud="Ğ",Fd="ğ",Id="Ģ",Pd="Ĝ",Bd="ĝ",Vd="Г",Gd="г",Xd="Ġ",zd="ġ",Yd="≥",Jd="≧",Qd="⪌",Kd="⋛",Zd="≥",Wd="≧",tp="⩾",np="⪩",sp="⩾",op="⪀",cp="⪂",ep="⪄",rp="⋛︀",ap="⪔",ip="𝔊",lp="𝔤",up="≫",dp="⋙",pp="⋙",fp="ℷ",mp="Ѓ",gp="ѓ",hp="⪥",bp="≷",vp="⪒",xp="⪤",wp="⪊",yp="⪊",qp="⪈",Lp="≩",Tp="⪈",Sp="≩",Ep="⋧",jp="𝔾",Ap="𝕘",Dp="`",Np="≥",Rp="⋛",kp="≧",Cp="⪢",Mp="≷",Hp="⩾",$p="≳",Op="𝒢",_p="ℊ",Up="≳",Fp="⪎",Ip="⪐",Pp="⪧",Bp="⩺",Vp=">",Gp=">",Xp="≫",zp="⋗",Yp="⦕",Jp="⩼",Qp="⪆",Kp="⥸",Zp="⋗",Wp="⋛",tf="⪌",nf="≷",sf="≳",of="≩︀",cf="≩︀",ef="ˇ",rf=" ",af="½",lf="ℋ",uf="Ъ",df="ъ",pf="⥈",ff="↔",mf="⇔",gf="↭",hf="^",bf="ℏ",vf="Ĥ",xf="ĥ",wf="♥",yf="♥",qf="…",Lf="⊹",Tf="𝔥",Sf="ℌ",Ef="ℋ",jf="⤥",Af="⤦",Df="⇿",Nf="∻",Rf="↩",kf="↪",Cf="𝕙",Mf="ℍ",Hf="―",$f="─",Of="𝒽",_f="ℋ",Uf="ℏ",Ff="Ħ",If="ħ",Pf="≎",Bf="≏",Vf="⁃",Gf="‐",Xf="Í",zf="í",Yf="",Jf="Î",Qf="î",Kf="И",Zf="и",Wf="İ",tm="Е",nm="е",sm="¡",om="⇔",cm="𝔦",em="ℑ",rm="Ì",am="ì",im="ⅈ",lm="⨌",um="∭",dm="⧜",pm="℩",fm="IJ",mm="ij",gm="Ī",hm="ī",bm="ℑ",vm="ⅈ",xm="ℐ",wm="ℑ",ym="ı",qm="ℑ",Lm="⊷",Tm="Ƶ",Sm="⇒",Em="℅",jm="∞",Am="⧝",Dm="ı",Nm="⊺",Rm="∫",km="∬",Cm="ℤ",Mm="∫",Hm="⊺",$m="⋂",Om="⨗",_m="⨼",Um="",Fm="",Im="Ё",Pm="ё",Bm="Į",Vm="į",Gm="𝕀",Xm="𝕚",zm="Ι",Ym="ι",Jm="⨼",Qm="¿",Km="𝒾",Zm="ℐ",Wm="∈",tg="⋵",ng="⋹",sg="⋴",og="⋳",cg="∈",eg="",rg="Ĩ",ag="ĩ",ig="І",lg="і",ug="Ï",dg="ï",pg="Ĵ",fg="ĵ",mg="Й",gg="й",hg="𝔍",bg="𝔧",vg="ȷ",xg="𝕁",wg="𝕛",yg="𝒥",qg="𝒿",Lg="Ј",Tg="ј",Sg="Є",Eg="є",jg="Κ",Ag="κ",Dg="ϰ",Ng="Ķ",Rg="ķ",kg="К",Cg="к",Mg="𝔎",Hg="𝔨",$g="ĸ",Og="Х",_g="х",Ug="Ќ",Fg="ќ",Ig="𝕂",Pg="𝕜",Bg="𝒦",Vg="𝓀",Gg="⇚",Xg="Ĺ",zg="ĺ",Yg="⦴",Jg="ℒ",Qg="Λ",Kg="λ",Zg="⟨",Wg="⟪",th="⦑",nh="⟨",sh="⪅",oh="ℒ",ch="«",eh="⇤",rh="⤟",ah="←",ih="↞",lh="⇐",uh="⤝",dh="↩",ph="↫",fh="⤹",mh="⥳",gh="↢",hh="⤙",bh="⤛",vh="⪫",xh="⪭",wh="⪭︀",yh="⤌",qh="⤎",Lh="❲",Th="{",Sh="[",Eh="⦋",jh="⦏",Ah="⦍",Dh="Ľ",Nh="ľ",Rh="Ļ",kh="ļ",Ch="⌈",Mh="{",Hh="Л",$h="л",Oh="⤶",_h="“",Uh="„",Fh="⥧",Ih="⥋",Ph="↲",Bh="≤",Vh="≦",Gh="⟨",Xh="⇤",zh="←",Yh="←",Jh="⇐",Qh="⇆",Kh="↢",Zh="⌈",Wh="⟦",tb="⥡",nb="⥙",sb="⇃",ob="⌊",cb="↽",eb="↼",rb="⇇",ab="↔",ib="↔",lb="⇔",ub="⇆",db="⇋",pb="↭",fb="⥎",mb="↤",gb="⊣",hb="⥚",bb="⋋",vb="⧏",xb="⊲",wb="⊴",yb="⥑",qb="⥠",Lb="⥘",Tb="↿",Sb="⥒",Eb="↼",jb="⪋",Ab="⋚",Db="≤",Nb="≦",Rb="⩽",kb="⪨",Cb="⩽",Mb="⩿",Hb="⪁",$b="⪃",Ob="⋚︀",_b="⪓",Ub="⪅",Fb="⋖",Ib="⋚",Pb="⪋",Bb="⋚",Vb="≦",Gb="≶",Xb="≶",zb="⪡",Yb="≲",Jb="⩽",Qb="≲",Kb="⥼",Zb="⌊",Wb="𝔏",tv="𝔩",nv="≶",sv="⪑",ov="⥢",cv="↽",ev="↼",rv="⥪",av="▄",iv="Љ",lv="љ",uv="⇇",dv="≪",pv="⋘",fv="⌞",mv="⇚",gv="⥫",hv="◺",bv="Ŀ",vv="ŀ",xv="⎰",wv="⎰",yv="⪉",qv="⪉",Lv="⪇",Tv="≨",Sv="⪇",Ev="≨",jv="⋦",Av="⟬",Dv="⇽",Nv="⟦",Rv="⟵",kv="⟵",Cv="⟸",Mv="⟷",Hv="⟷",$v="⟺",Ov="⟼",_v="⟶",Uv="⟶",Fv="⟹",Iv="↫",Pv="↬",Bv="⦅",Vv="𝕃",Gv="𝕝",Xv="⨭",zv="⨴",Yv="∗",Jv="_",Qv="↙",Kv="↘",Zv="◊",Wv="◊",tx="⧫",nx="(",sx="⦓",ox="⇆",cx="⌟",ex="⇋",rx="⥭",ax="",ix="⊿",lx="‹",ux="𝓁",dx="ℒ",px="↰",fx="↰",mx="≲",gx="⪍",hx="⪏",bx="[",vx="‘",xx="‚",wx="Ł",yx="ł",qx="⪦",Lx="⩹",Tx="<",Sx="<",Ex="≪",jx="⋖",Ax="⋋",Dx="⋉",Nx="⥶",Rx="⩻",kx="◃",Cx="⊴",Mx="◂",Hx="⦖",$x="⥊",Ox="⥦",_x="≨︀",Ux="≨︀",Fx="¯",Ix="♂",Px="✠",Bx="✠",Vx="↦",Gx="↦",Xx="↧",zx="↤",Yx="↥",Jx="▮",Qx="⨩",Kx="М",Zx="м",Wx="—",tw="∺",nw="∡",sw=" ",ow="ℳ",cw="𝔐",ew="𝔪",rw="℧",aw="µ",iw="*",lw="⫰",uw="∣",dw="·",pw="⊟",fw="−",mw="∸",gw="⨪",hw="∓",bw="⫛",vw="…",xw="∓",ww="⊧",yw="𝕄",qw="𝕞",Lw="∓",Tw="𝓂",Sw="ℳ",Ew="∾",jw="Μ",Aw="μ",Dw="⊸",Nw="⊸",Rw="∇",kw="Ń",Cw="ń",Mw="∠⃒",Hw="≉",$w="⩰̸",Ow="≋̸",_w="ʼn",Uw="≉",Fw="♮",Iw="ℕ",Pw="♮",Bw=" ",Vw="≎̸",Gw="≏̸",Xw="⩃",zw="Ň",Yw="ň",Jw="Ņ",Qw="ņ",Kw="≇",Zw="⩭̸",Ww="⩂",ty="Н",ny="н",sy="–",oy="⤤",cy="↗",ey="⇗",ry="↗",ay="≠",iy="≐̸",ly="",uy="",dy="",py="",fy="≢",my="⤨",gy="≂̸",hy="≫",by="≪",vy=`
|
|
2
2
|
`,xy="∄",wy="∄",yy="𝔑",qy="𝔫",Ly="≧̸",Ty="≱",Sy="≱",Ey="≧̸",jy="⩾̸",Ay="⩾̸",Dy="⋙̸",Ny="≵",Ry="≫⃒",ky="≯",Cy="≯",My="≫̸",Hy="↮",$y="⇎",Oy="⫲",_y="∋",Uy="⋼",Fy="⋺",Iy="∋",Py="Њ",By="њ",Vy="↚",Gy="⇍",Xy="‥",zy="≦̸",Yy="≰",Jy="↚",Qy="⇍",Ky="↮",Zy="⇎",Wy="≰",tq="≦̸",nq="⩽̸",sq="⩽̸",oq="≮",cq="⋘̸",eq="≴",rq="≪⃒",aq="≮",iq="⋪",lq="⋬",uq="≪̸",dq="∤",pq="",fq=" ",mq="𝕟",gq="ℕ",hq="⫬",bq="¬",vq="≢",xq="≭",wq="∦",yq="∉",qq="≠",Lq="≂̸",Tq="∄",Sq="≯",Eq="≱",jq="≧̸",Aq="≫̸",Dq="≹",Nq="⩾̸",Rq="≵",kq="≎̸",Cq="≏̸",Mq="∉",Hq="⋵̸",$q="⋹̸",Oq="∉",_q="⋷",Uq="⋶",Fq="⧏̸",Iq="⋪",Pq="⋬",Bq="≮",Vq="≰",Gq="≸",Xq="≪̸",zq="⩽̸",Yq="≴",Jq="⪢̸",Qq="⪡̸",Kq="∌",Zq="∌",Wq="⋾",t1="⋽",n1="⊀",s1="⪯̸",o1="⋠",c1="∌",e1="⧐̸",r1="⋫",a1="⋭",i1="⊏̸",l1="⋢",u1="⊐̸",d1="⋣",p1="⊂⃒",f1="⊈",m1="⊁",g1="⪰̸",h1="⋡",b1="≿̸",v1="⊃⃒",x1="⊉",w1="≁",y1="≄",q1="≇",L1="≉",T1="∤",S1="∦",E1="∦",j1="⫽⃥",A1="∂̸",D1="⨔",N1="⊀",R1="⋠",k1="⊀",C1="⪯̸",M1="⪯̸",H1="⤳̸",$1="↛",O1="⇏",_1="↝̸",U1="↛",F1="⇏",I1="⋫",P1="⋭",B1="⊁",V1="⋡",G1="⪰̸",X1="𝒩",z1="𝓃",Y1="∤",J1="∦",Q1="≁",K1="≄",Z1="≄",W1="∤",tL="∦",nL="⋢",sL="⋣",oL="⊄",cL="⫅̸",eL="⊈",rL="⊂⃒",aL="⊈",iL="⫅̸",lL="⊁",uL="⪰̸",dL="⊅",pL="⫆̸",fL="⊉",mL="⊃⃒",gL="⊉",hL="⫆̸",bL="≹",vL="Ñ",xL="ñ",wL="≸",yL="⋪",qL="⋬",LL="⋫",TL="⋭",SL="Ν",EL="ν",jL="#",AL="№",DL=" ",NL="≍⃒",RL="⊬",kL="⊭",CL="⊮",ML="⊯",HL="≥⃒",$L=">⃒",OL="⤄",_L="⧞",UL="⤂",FL="≤⃒",IL="<⃒",PL="⊴⃒",BL="⤃",VL="⊵⃒",GL="∼⃒",XL="⤣",zL="↖",YL="⇖",JL="↖",QL="⤧",KL="Ó",ZL="ó",WL="⊛",tT="Ô",nT="ô",sT="⊚",oT="О",cT="о",eT="⊝",rT="Ő",aT="ő",iT="⨸",lT="⊙",uT="⦼",dT="Œ",pT="œ",fT="⦿",mT="𝔒",gT="𝔬",hT="˛",bT="Ò",vT="ò",xT="⧁",wT="⦵",yT="Ω",qT="∮",LT="↺",TT="⦾",ST="⦻",ET="‾",jT="⧀",AT="Ō",DT="ō",NT="Ω",RT="ω",kT="Ο",CT="ο",MT="⦶",HT="⊖",$T="𝕆",OT="𝕠",_T="⦷",UT="“",FT="‘",IT="⦹",PT="⊕",BT="↻",VT="⩔",GT="∨",XT="⩝",zT="ℴ",YT="ℴ",JT="ª",QT="º",KT="⊶",ZT="⩖",WT="⩗",tS="⩛",nS="Ⓢ",sS="𝒪",oS="ℴ",cS="Ø",eS="ø",rS="⊘",aS="Õ",iS="õ",lS="⨶",uS="⨷",dS="⊗",pS="Ö",fS="ö",mS="⌽",gS="‾",hS="⏞",bS="⎴",vS="⏜",xS="¶",wS="∥",yS="∥",qS="⫳",LS="⫽",TS="∂",SS="∂",ES="П",jS="п",AS="%",DS=".",NS="‰",RS="⊥",kS="‱",CS="𝔓",MS="𝔭",HS="Φ",$S="φ",OS="ϕ",_S="ℳ",US="☎",FS="Π",IS="π",PS="⋔",BS="ϖ",VS="ℏ",GS="ℎ",XS="ℏ",zS="⨣",YS="⊞",JS="⨢",QS="+",KS="∔",ZS="⨥",WS="⩲",t0="±",n0="±",s0="⨦",o0="⨧",c0="±",e0="ℌ",r0="⨕",a0="𝕡",i0="ℙ",l0="£",u0="⪷",d0="⪻",p0="≺",f0="≼",m0="⪷",g0="≺",h0="≼",b0="≺",v0="⪯",x0="≼",w0="≾",y0="⪯",q0="⪹",L0="⪵",T0="⋨",S0="⪯",E0="⪳",j0="≾",A0="′",D0="″",N0="ℙ",R0="⪹",k0="⪵",C0="⋨",M0="∏",H0="∏",$0="⌮",O0="⌒",_0="⌓",U0="∝",F0="∝",I0="∷",P0="∝",B0="≾",V0="⊰",G0="𝒫",X0="𝓅",z0="Ψ",Y0="ψ",J0=" ",Q0="𝔔",K0="𝔮",Z0="⨌",W0="𝕢",tE="ℚ",nE="⁗",sE="𝒬",oE="𝓆",cE="ℍ",eE="⨖",rE="?",aE="≟",iE='"',lE='"',uE="⇛",dE="∽̱",pE="Ŕ",fE="ŕ",mE="√",gE="⦳",hE="⟩",bE="⟫",vE="⦒",xE="⦥",wE="⟩",yE="»",qE="⥵",LE="⇥",TE="⤠",SE="⤳",EE="→",jE="↠",AE="⇒",DE="⤞",NE="↪",RE="↬",kE="⥅",CE="⥴",ME="⤖",HE="↣",$E="↝",OE="⤚",_E="⤜",UE="∶",FE="ℚ",IE="⤍",PE="⤏",BE="⤐",VE="❳",GE="}",XE="]",zE="⦌",YE="⦎",JE="⦐",QE="Ř",KE="ř",ZE="Ŗ",WE="ŗ",tj="⌉",nj="}",sj="Р",oj="р",cj="⤷",ej="⥩",rj="”",aj="”",ij="↳",lj="ℜ",uj="ℛ",dj="ℜ",pj="ℝ",fj="ℜ",mj="▭",gj="®",hj="®",bj="∋",vj="⇋",xj="⥯",wj="⥽",yj="⌋",qj="𝔯",Lj="ℜ",Tj="⥤",Sj="⇁",Ej="⇀",jj="⥬",Aj="Ρ",Dj="ρ",Nj="ϱ",Rj="⟩",kj="⇥",Cj="→",Mj="→",Hj="⇒",$j="⇄",Oj="↣",_j="⌉",Uj="⟧",Fj="⥝",Ij="⥕",Pj="⇂",Bj="⌋",Vj="⇁",Gj="⇀",Xj="⇄",zj="⇌",Yj="⇉",Jj="↝",Qj="↦",Kj="⊢",Zj="⥛",Wj="⋌",tA="⧐",nA="⊳",sA="⊵",oA="⥏",cA="⥜",eA="⥔",rA="↾",aA="⥓",iA="⇀",lA="˚",uA="≓",dA="⇄",pA="⇌",fA="",mA="⎱",gA="⎱",hA="⫮",bA="⟭",vA="⇾",xA="⟧",wA="⦆",yA="𝕣",qA="ℝ",LA="⨮",TA="⨵",SA="⥰",EA=")",jA="⦔",AA="⨒",DA="⇉",NA="⇛",RA="›",kA="𝓇",CA="ℛ",MA="↱",HA="↱",$A="]",OA="’",_A="’",UA="⋌",FA="⋊",IA="▹",PA="⊵",BA="▸",VA="⧎",GA="⧴",XA="⥨",zA="℞",YA="Ś",JA="ś",QA="‚",KA="⪸",ZA="Š",WA="š",tD="⪼",nD="≻",sD="≽",oD="⪰",cD="⪴",eD="Ş",rD="ş",aD="Ŝ",iD="ŝ",lD="⪺",uD="⪶",dD="⋩",pD="⨓",fD="≿",mD="С",gD="с",hD="⊡",bD="⋅",vD="⩦",xD="⤥",wD="↘",yD="⇘",qD="↘",LD="§",TD=";",SD="⤩",ED="∖",jD="∖",AD="✶",DD="𝔖",ND="𝔰",RD="⌢",kD="♯",CD="Щ",MD="щ",HD="Ш",$D="ш",OD="↓",_D="←",UD="∣",FD="∥",ID="→",PD="↑",BD="",VD="Σ",GD="σ",XD="ς",zD="ς",YD="∼",JD="⩪",QD="≃",KD="≃",ZD="⪞",WD="⪠",tN="⪝",nN="⪟",sN="≆",oN="⨤",cN="⥲",eN="←",rN="∘",aN="∖",iN="⨳",lN="⧤",uN="∣",dN="⌣",pN="⪪",fN="⪬",mN="⪬︀",gN="Ь",hN="ь",bN="⌿",vN="⧄",xN="/",wN="𝕊",yN="𝕤",qN="♠",LN="♠",TN="∥",SN="⊓",EN="⊓︀",jN="⊔",AN="⊔︀",DN="√",NN="⊏",RN="⊑",kN="⊏",CN="⊑",MN="⊐",HN="⊒",$N="⊐",ON="⊒",_N="□",UN="□",FN="⊓",IN="⊏",PN="⊑",BN="⊐",VN="⊒",GN="⊔",XN="▪",zN="□",YN="▪",JN="→",QN="𝒮",KN="𝓈",ZN="∖",WN="⌣",tR="⋆",nR="⋆",sR="☆",oR="★",cR="ϵ",eR="ϕ",rR="¯",aR="⊂",iR="⋐",lR="⪽",uR="⫅",dR="⊆",pR="⫃",fR="⫁",mR="⫋",gR="⊊",hR="⪿",bR="⥹",vR="⊂",xR="⋐",wR="⊆",yR="⫅",qR="⊆",LR="⊊",TR="⫋",SR="⫇",ER="⫕",jR="⫓",AR="⪸",DR="≻",NR="≽",RR="≻",kR="⪰",CR="≽",MR="≿",HR="⪰",$R="⪺",OR="⪶",_R="⋩",UR="≿",FR="∋",IR="∑",PR="∑",BR="♪",VR="¹",GR="²",XR="³",zR="⊃",YR="⋑",JR="⪾",QR="⫘",KR="⫆",ZR="⊇",WR="⫄",tk="⊃",nk="⊇",sk="⟉",ok="⫗",ck="⥻",ek="⫂",rk="⫌",ak="⊋",ik="⫀",lk="⊃",uk="⋑",dk="⊇",pk="⫆",fk="⊋",mk="⫌",gk="⫈",hk="⫔",bk="⫖",vk="⤦",xk="↙",wk="⇙",yk="↙",qk="⤪",Lk="ß",Tk=" ",Sk="⌖",Ek="Τ",jk="τ",Ak="⎴",Dk="Ť",Nk="ť",Rk="Ţ",kk="ţ",Ck="Т",Mk="т",Hk="⃛",$k="⌕",Ok="𝔗",_k="𝔱",Uk="∴",Fk="∴",Ik="∴",Pk="Θ",Bk="θ",Vk="ϑ",Gk="ϑ",Xk="≈",zk="∼",Yk=" ",Jk=" ",Qk=" ",Kk="≈",Zk="∼",Wk="Þ",tC="þ",nC="˜",sC="∼",oC="≃",cC="≅",eC="≈",rC="⨱",aC="⊠",iC="×",lC="⨰",uC="∭",dC="⤨",pC="⌶",fC="⫱",mC="⊤",gC="𝕋",hC="𝕥",bC="⫚",vC="⤩",xC="‴",wC="™",yC="™",qC="▵",LC="▿",TC="◃",SC="⊴",EC="≜",jC="▹",AC="⊵",DC="◬",NC="≜",RC="⨺",kC="⃛",CC="⨹",MC="⧍",HC="⨻",$C="⏢",OC="𝒯",_C="𝓉",UC="Ц",FC="ц",IC="Ћ",PC="ћ",BC="Ŧ",VC="ŧ",GC="≬",XC="↞",zC="↠",YC="Ú",JC="ú",QC="↑",KC="↟",ZC="⇑",WC="⥉",tM="Ў",nM="ў",sM="Ŭ",oM="ŭ",cM="Û",eM="û",rM="У",aM="у",iM="⇅",lM="Ű",uM="ű",dM="⥮",pM="⥾",fM="𝔘",mM="𝔲",gM="Ù",hM="ù",bM="⥣",vM="↿",xM="↾",wM="▀",yM="⌜",qM="⌜",LM="⌏",TM="◸",SM="Ū",EM="ū",jM="¨",AM="_",DM="⏟",NM="⎵",RM="⏝",kM="⋃",CM="⊎",MM="Ų",HM="ų",$M="𝕌",OM="𝕦",_M="⤒",UM="↑",FM="↑",IM="⇑",PM="⇅",BM="↕",VM="↕",GM="⇕",XM="⥮",zM="↿",YM="↾",JM="⊎",QM="↖",KM="↗",ZM="υ",WM="ϒ",tH="ϒ",nH="Υ",sH="υ",oH="↥",cH="⊥",eH="⇈",rH="⌝",aH="⌝",iH="⌎",lH="Ů",uH="ů",dH="◹",pH="𝒰",fH="𝓊",mH="⋰",gH="Ũ",hH="ũ",bH="▵",vH="▴",xH="⇈",wH="Ü",yH="ü",qH="⦧",LH="⦜",TH="ϵ",SH="ϰ",EH="∅",jH="ϕ",AH="ϖ",DH="∝",NH="↕",RH="⇕",kH="ϱ",CH="ς",MH="⊊︀",HH="⫋︀",$H="⊋︀",OH="⫌︀",_H="ϑ",UH="⊲",FH="⊳",IH="⫨",PH="⫫",BH="⫩",VH="В",GH="в",XH="⊢",zH="⊨",YH="⊩",JH="⊫",QH="⫦",KH="⊻",ZH="∨",WH="⋁",t2="≚",n2="⋮",s2="|",o2="‖",c2="|",e2="‖",r2="∣",a2="|",i2="❘",l2="≀",u2=" ",d2="𝔙",p2="𝔳",f2="⊲",m2="⊂⃒",g2="⊃⃒",h2="𝕍",b2="𝕧",v2="∝",x2="⊳",w2="𝒱",y2="𝓋",q2="⫋︀",L2="⊊︀",T2="⫌︀",S2="⊋︀",E2="⊪",j2="⦚",A2="Ŵ",D2="ŵ",N2="⩟",R2="∧",k2="⋀",C2="≙",M2="℘",H2="𝔚",$2="𝔴",O2="𝕎",_2="𝕨",U2="℘",F2="≀",I2="≀",P2="𝒲",B2="𝓌",V2="⋂",G2="◯",X2="⋃",z2="▽",Y2="𝔛",J2="𝔵",Q2="⟷",K2="⟺",Z2="Ξ",W2="ξ",t$="⟵",n$="⟸",s$="⟼",o$="⋻",c$="⨀",e$="𝕏",r$="𝕩",a$="⨁",i$="⨂",l$="⟶",u$="⟹",d$="𝒳",p$="𝓍",f$="⨆",m$="⨄",g$="△",h$="⋁",b$="⋀",v$="Ý",x$="ý",w$="Я",y$="я",q$="Ŷ",L$="ŷ",T$="Ы",S$="ы",E$="¥",j$="𝔜",A$="𝔶",D$="Ї",N$="ї",R$="𝕐",k$="𝕪",C$="𝒴",M$="𝓎",H$="Ю",$$="ю",O$="ÿ",_$="Ÿ",U$="Ź",F$="ź",I$="Ž",P$="ž",B$="З",V$="з",G$="Ż",X$="ż",z$="ℨ",Y$="",J$="Ζ",Q$="ζ",K$="𝔷",Z$="ℨ",W$="Ж",tO="ж",nO="⇝",sO="𝕫",oO="ℤ",cO="𝒵",eO="𝓏",rO="",aO="",bt={Aacute:Pt,aacute:Bt,Abreve:Vt,abreve:Gt,ac:Xt,acd:zt,acE:Yt,Acirc:Jt,acirc:Qt,acute:Kt,Acy:Zt,acy:Wt,AElig:tn,aelig:nn,af:sn,Afr:on,afr:cn,Agrave:en,agrave:rn,alefsym:an,aleph:ln,Alpha:un,alpha:dn,Amacr:pn,amacr:fn,amalg:mn,amp:gn,AMP:hn,andand:bn,And:vn,and:xn,andd:wn,andslope:yn,andv:qn,ang:Ln,ange:Tn,angle:Sn,angmsdaa:En,angmsdab:jn,angmsdac:An,angmsdad:Dn,angmsdae:Nn,angmsdaf:Rn,angmsdag:kn,angmsdah:Cn,angmsd:Mn,angrt:Hn,angrtvb:$n,angrtvbd:On,angsph:_n,angst:Un,angzarr:Fn,Aogon:In,aogon:Pn,Aopf:Bn,aopf:Vn,apacir:Gn,ap:Xn,apE:zn,ape:Yn,apid:Jn,apos:Qn,ApplyFunction:Kn,approx:Zn,approxeq:Wn,Aring:ts,aring:ns,Ascr:ss,ascr:os,Assign:cs,ast:es,asymp:rs,asympeq:as,Atilde:is,atilde:ls,Auml:us,auml:ds,awconint:ps,awint:fs,backcong:ms,backepsilon:gs,backprime:hs,backsim:bs,backsimeq:vs,Backslash:xs,Barv:ws,barvee:ys,barwed:qs,Barwed:Ls,barwedge:Ts,bbrk:Ss,bbrktbrk:Es,bcong:js,Bcy:As,bcy:Ds,bdquo:Ns,becaus:Rs,because:ks,Because:Cs,bemptyv:Ms,bepsi:Hs,bernou:$s,Bernoullis:Os,Beta:_s,beta:Us,beth:Fs,between:Is,Bfr:Ps,bfr:Bs,bigcap:Vs,bigcirc:Gs,bigcup:Xs,bigodot:zs,bigoplus:Ys,bigotimes:Js,bigsqcup:Qs,bigstar:Ks,bigtriangledown:Zs,bigtriangleup:Ws,biguplus:to,bigvee:no,bigwedge:so,bkarow:oo,blacklozenge:co,blacksquare:eo,blacktriangle:ro,blacktriangledown:ao,blacktriangleleft:io,blacktriangleright:lo,blank:uo,blk12:po,blk14:fo,blk34:mo,block:go,bne:ho,bnequiv:bo,bNot:vo,bnot:xo,Bopf:wo,bopf:yo,bot:qo,bottom:Lo,bowtie:To,boxbox:So,boxdl:Eo,boxdL:jo,boxDl:Ao,boxDL:Do,boxdr:No,boxdR:Ro,boxDr:ko,boxDR:Co,boxh:Mo,boxH:Ho,boxhd:$o,boxHd:Oo,boxhD:_o,boxHD:Uo,boxhu:Fo,boxHu:Io,boxhU:Po,boxHU:Bo,boxminus:Vo,boxplus:Go,boxtimes:Xo,boxul:zo,boxuL:Yo,boxUl:Jo,boxUL:Qo,boxur:Ko,boxuR:Zo,boxUr:Wo,boxUR:tc,boxv:nc,boxV:sc,boxvh:oc,boxvH:cc,boxVh:ec,boxVH:rc,boxvl:ac,boxvL:ic,boxVl:lc,boxVL:uc,boxvr:dc,boxvR:pc,boxVr:fc,boxVR:mc,bprime:gc,breve:hc,Breve:bc,brvbar:vc,bscr:xc,Bscr:wc,bsemi:yc,bsim:qc,bsime:Lc,bsolb:Tc,bsol:Sc,bsolhsub:Ec,bull:jc,bullet:Ac,bump:Dc,bumpE:Nc,bumpe:Rc,Bumpeq:kc,bumpeq:Cc,Cacute:Mc,cacute:Hc,capand:$c,capbrcup:Oc,capcap:_c,cap:Uc,Cap:Fc,capcup:Ic,capdot:Pc,CapitalDifferentialD:Bc,caps:Vc,caret:Gc,caron:Xc,Cayleys:zc,ccaps:Yc,Ccaron:Jc,ccaron:Qc,Ccedil:Kc,ccedil:Zc,Ccirc:Wc,ccirc:te,Cconint:ne,ccups:se,ccupssm:oe,Cdot:ce,cdot:ee,cedil:re,Cedilla:ae,cemptyv:ie,cent:le,centerdot:ue,CenterDot:de,cfr:pe,Cfr:fe,CHcy:me,chcy:ge,check:he,checkmark:be,Chi:ve,chi:xe,circ:we,circeq:ye,circlearrowleft:qe,circlearrowright:Le,circledast:Te,circledcirc:Se,circleddash:Ee,CircleDot:je,circledR:Ae,circledS:De,CircleMinus:Ne,CirclePlus:Re,CircleTimes:ke,cir:Ce,cirE:Me,cire:He,cirfnint:$e,cirmid:Oe,cirscir:_e,ClockwiseContourIntegral:Ue,CloseCurlyDoubleQuote:Fe,CloseCurlyQuote:Ie,clubs:Pe,clubsuit:Be,colon:Ve,Colon:Ge,Colone:Xe,colone:ze,coloneq:Ye,comma:Je,commat:Qe,comp:Ke,compfn:Ze,complement:We,complexes:tr,cong:nr,congdot:sr,Congruent:or,conint:cr,Conint:er,ContourIntegral:rr,copf:ar,Copf:ir,coprod:lr,Coproduct:ur,copy:dr,COPY:pr,copysr:fr,CounterClockwiseContourIntegral:mr,crarr:gr,cross:hr,Cross:br,Cscr:vr,cscr:xr,csub:wr,csube:yr,csup:qr,csupe:Lr,ctdot:Tr,cudarrl:Sr,cudarrr:Er,cuepr:jr,cuesc:Ar,cularr:Dr,cularrp:Nr,cupbrcap:Rr,cupcap:kr,CupCap:Cr,cup:Mr,Cup:Hr,cupcup:$r,cupdot:Or,cupor:_r,cups:Ur,curarr:Fr,curarrm:Ir,curlyeqprec:Pr,curlyeqsucc:Br,curlyvee:Vr,curlywedge:Gr,curren:Xr,curvearrowleft:zr,curvearrowright:Yr,cuvee:Jr,cuwed:Qr,cwconint:Kr,cwint:Zr,cylcty:Wr,dagger:ta,Dagger:na,daleth:sa,darr:oa,Darr:ca,dArr:ea,dash:ra,Dashv:aa,dashv:ia,dbkarow:la,dblac:ua,Dcaron:da,dcaron:pa,Dcy:fa,dcy:ma,ddagger:ga,ddarr:ha,DD:ba,dd:va,DDotrahd:xa,ddotseq:wa,deg:ya,Del:qa,Delta:La,delta:Ta,demptyv:Sa,dfisht:Ea,Dfr:ja,dfr:Aa,dHar:Da,dharl:Na,dharr:Ra,DiacriticalAcute:ka,DiacriticalDot:Ca,DiacriticalDoubleAcute:Ma,DiacriticalGrave:Ha,DiacriticalTilde:$a,diam:Oa,diamond:_a,Diamond:Ua,diamondsuit:Fa,diams:Ia,die:Pa,DifferentialD:Ba,digamma:Va,disin:Ga,div:Xa,divide:za,divideontimes:Ya,divonx:Ja,DJcy:Qa,djcy:Ka,dlcorn:Za,dlcrop:Wa,dollar:ti,Dopf:ni,dopf:si,Dot:oi,dot:ci,DotDot:ei,doteq:ri,doteqdot:ai,DotEqual:ii,dotminus:li,dotplus:ui,dotsquare:di,doublebarwedge:pi,DoubleContourIntegral:fi,DoubleDot:mi,DoubleDownArrow:gi,DoubleLeftArrow:hi,DoubleLeftRightArrow:bi,DoubleLeftTee:vi,DoubleLongLeftArrow:xi,DoubleLongLeftRightArrow:wi,DoubleLongRightArrow:yi,DoubleRightArrow:qi,DoubleRightTee:Li,DoubleUpArrow:Ti,DoubleUpDownArrow:Si,DoubleVerticalBar:Ei,DownArrowBar:ji,downarrow:Ai,DownArrow:Di,Downarrow:Ni,DownArrowUpArrow:Ri,DownBreve:ki,downdownarrows:Ci,downharpoonleft:Mi,downharpoonright:Hi,DownLeftRightVector:$i,DownLeftTeeVector:Oi,DownLeftVectorBar:_i,DownLeftVector:Ui,DownRightTeeVector:Fi,DownRightVectorBar:Ii,DownRightVector:Pi,DownTeeArrow:Bi,DownTee:Vi,drbkarow:Gi,drcorn:Xi,drcrop:zi,Dscr:Yi,dscr:Ji,DScy:Qi,dscy:Ki,dsol:Zi,Dstrok:Wi,dstrok:tl,dtdot:nl,dtri:sl,dtrif:ol,duarr:cl,duhar:el,dwangle:rl,DZcy:al,dzcy:il,dzigrarr:ll,Eacute:ul,eacute:dl,easter:pl,Ecaron:fl,ecaron:ml,Ecirc:gl,ecirc:hl,ecir:bl,ecolon:vl,Ecy:xl,ecy:wl,eDDot:yl,Edot:ql,edot:Ll,eDot:Tl,ee:Sl,efDot:El,Efr:jl,efr:Al,eg:Dl,Egrave:Nl,egrave:Rl,egs:kl,egsdot:Cl,el:Ml,Element:Hl,elinters:$l,ell:Ol,els:_l,elsdot:Ul,Emacr:Fl,emacr:Il,empty:Pl,emptyset:Bl,EmptySmallSquare:Vl,emptyv:Gl,EmptyVerySmallSquare:Xl,emsp13:zl,emsp14:Yl,emsp:Jl,ENG:Ql,eng:Kl,ensp:Zl,Eogon:Wl,eogon:tu,Eopf:nu,eopf:su,epar:ou,eparsl:cu,eplus:eu,epsi:ru,Epsilon:au,epsilon:iu,epsiv:lu,eqcirc:uu,eqcolon:du,eqsim:pu,eqslantgtr:fu,eqslantless:mu,Equal:gu,equals:hu,EqualTilde:bu,equest:vu,Equilibrium:xu,equiv:wu,equivDD:yu,eqvparsl:qu,erarr:Lu,erDot:Tu,escr:Su,Escr:Eu,esdot:ju,Esim:Au,esim:Du,Eta:Nu,eta:Ru,ETH:ku,eth:Cu,Euml:Mu,euml:Hu,euro:$u,excl:Ou,exist:_u,Exists:Uu,expectation:Fu,exponentiale:Iu,ExponentialE:Pu,fallingdotseq:Bu,Fcy:Vu,fcy:Gu,female:Xu,ffilig:zu,fflig:Yu,ffllig:Ju,Ffr:Qu,ffr:Ku,filig:Zu,FilledSmallSquare:Wu,FilledVerySmallSquare:td,fjlig:nd,flat:sd,fllig:od,fltns:cd,fnof:ed,Fopf:rd,fopf:ad,forall:id,ForAll:ld,fork:ud,forkv:dd,Fouriertrf:pd,fpartint:fd,frac12:md,frac13:gd,frac14:hd,frac15:bd,frac16:vd,frac18:xd,frac23:wd,frac25:yd,frac34:qd,frac35:Ld,frac38:Td,frac45:Sd,frac56:Ed,frac58:jd,frac78:Ad,frasl:Dd,frown:Nd,fscr:Rd,Fscr:kd,gacute:Cd,Gamma:Md,gamma:Hd,Gammad:$d,gammad:Od,gap:_d,Gbreve:Ud,gbreve:Fd,Gcedil:Id,Gcirc:Pd,gcirc:Bd,Gcy:Vd,gcy:Gd,Gdot:Xd,gdot:zd,ge:Yd,gE:Jd,gEl:Qd,gel:Kd,geq:Zd,geqq:Wd,geqslant:tp,gescc:np,ges:sp,gesdot:op,gesdoto:cp,gesdotol:ep,gesl:rp,gesles:ap,Gfr:ip,gfr:lp,gg:up,Gg:dp,ggg:pp,gimel:fp,GJcy:mp,gjcy:gp,gla:hp,gl:bp,glE:vp,glj:xp,gnap:wp,gnapprox:yp,gne:qp,gnE:Lp,gneq:Tp,gneqq:Sp,gnsim:Ep,Gopf:jp,gopf:Ap,grave:Dp,GreaterEqual:Np,GreaterEqualLess:Rp,GreaterFullEqual:kp,GreaterGreater:Cp,GreaterLess:Mp,GreaterSlantEqual:Hp,GreaterTilde:$p,Gscr:Op,gscr:_p,gsim:Up,gsime:Fp,gsiml:Ip,gtcc:Pp,gtcir:Bp,gt:Vp,GT:Gp,Gt:Xp,gtdot:zp,gtlPar:Yp,gtquest:Jp,gtrapprox:Qp,gtrarr:Kp,gtrdot:Zp,gtreqless:Wp,gtreqqless:tf,gtrless:nf,gtrsim:sf,gvertneqq:of,gvnE:cf,Hacek:ef,hairsp:rf,half:af,hamilt:lf,HARDcy:uf,hardcy:df,harrcir:pf,harr:ff,hArr:mf,harrw:gf,Hat:hf,hbar:bf,Hcirc:vf,hcirc:xf,hearts:wf,heartsuit:yf,hellip:qf,hercon:Lf,hfr:Tf,Hfr:Sf,HilbertSpace:Ef,hksearow:jf,hkswarow:Af,hoarr:Df,homtht:Nf,hookleftarrow:Rf,hookrightarrow:kf,hopf:Cf,Hopf:Mf,horbar:Hf,HorizontalLine:$f,hscr:Of,Hscr:_f,hslash:Uf,Hstrok:Ff,hstrok:If,HumpDownHump:Pf,HumpEqual:Bf,hybull:Vf,hyphen:Gf,Iacute:Xf,iacute:zf,ic:Yf,Icirc:Jf,icirc:Qf,Icy:Kf,icy:Zf,Idot:Wf,IEcy:tm,iecy:nm,iexcl:sm,iff:om,ifr:cm,Ifr:em,Igrave:rm,igrave:am,ii:im,iiiint:lm,iiint:um,iinfin:dm,iiota:pm,IJlig:fm,ijlig:mm,Imacr:gm,imacr:hm,image:bm,ImaginaryI:vm,imagline:xm,imagpart:wm,imath:ym,Im:qm,imof:Lm,imped:Tm,Implies:Sm,incare:Em,in:"∈",infin:jm,infintie:Am,inodot:Dm,intcal:Nm,int:Rm,Int:km,integers:Cm,Integral:Mm,intercal:Hm,Intersection:$m,intlarhk:Om,intprod:_m,InvisibleComma:Um,InvisibleTimes:Fm,IOcy:Im,iocy:Pm,Iogon:Bm,iogon:Vm,Iopf:Gm,iopf:Xm,Iota:zm,iota:Ym,iprod:Jm,iquest:Qm,iscr:Km,Iscr:Zm,isin:Wm,isindot:tg,isinE:ng,isins:sg,isinsv:og,isinv:cg,it:eg,Itilde:rg,itilde:ag,Iukcy:ig,iukcy:lg,Iuml:ug,iuml:dg,Jcirc:pg,jcirc:fg,Jcy:mg,jcy:gg,Jfr:hg,jfr:bg,jmath:vg,Jopf:xg,jopf:wg,Jscr:yg,jscr:qg,Jsercy:Lg,jsercy:Tg,Jukcy:Sg,jukcy:Eg,Kappa:jg,kappa:Ag,kappav:Dg,Kcedil:Ng,kcedil:Rg,Kcy:kg,kcy:Cg,Kfr:Mg,kfr:Hg,kgreen:$g,KHcy:Og,khcy:_g,KJcy:Ug,kjcy:Fg,Kopf:Ig,kopf:Pg,Kscr:Bg,kscr:Vg,lAarr:Gg,Lacute:Xg,lacute:zg,laemptyv:Yg,lagran:Jg,Lambda:Qg,lambda:Kg,lang:Zg,Lang:Wg,langd:th,langle:nh,lap:sh,Laplacetrf:oh,laquo:ch,larrb:eh,larrbfs:rh,larr:ah,Larr:ih,lArr:lh,larrfs:uh,larrhk:dh,larrlp:ph,larrpl:fh,larrsim:mh,larrtl:gh,latail:hh,lAtail:bh,lat:vh,late:xh,lates:wh,lbarr:yh,lBarr:qh,lbbrk:Lh,lbrace:Th,lbrack:Sh,lbrke:Eh,lbrksld:jh,lbrkslu:Ah,Lcaron:Dh,lcaron:Nh,Lcedil:Rh,lcedil:kh,lceil:Ch,lcub:Mh,Lcy:Hh,lcy:$h,ldca:Oh,ldquo:_h,ldquor:Uh,ldrdhar:Fh,ldrushar:Ih,ldsh:Ph,le:Bh,lE:Vh,LeftAngleBracket:Gh,LeftArrowBar:Xh,leftarrow:zh,LeftArrow:Yh,Leftarrow:Jh,LeftArrowRightArrow:Qh,leftarrowtail:Kh,LeftCeiling:Zh,LeftDoubleBracket:Wh,LeftDownTeeVector:tb,LeftDownVectorBar:nb,LeftDownVector:sb,LeftFloor:ob,leftharpoondown:cb,leftharpoonup:eb,leftleftarrows:rb,leftrightarrow:ab,LeftRightArrow:ib,Leftrightarrow:lb,leftrightarrows:ub,leftrightharpoons:db,leftrightsquigarrow:pb,LeftRightVector:fb,LeftTeeArrow:mb,LeftTee:gb,LeftTeeVector:hb,leftthreetimes:bb,LeftTriangleBar:vb,LeftTriangle:xb,LeftTriangleEqual:wb,LeftUpDownVector:yb,LeftUpTeeVector:qb,LeftUpVectorBar:Lb,LeftUpVector:Tb,LeftVectorBar:Sb,LeftVector:Eb,lEg:jb,leg:Ab,leq:Db,leqq:Nb,leqslant:Rb,lescc:kb,les:Cb,lesdot:Mb,lesdoto:Hb,lesdotor:$b,lesg:Ob,lesges:_b,lessapprox:Ub,lessdot:Fb,lesseqgtr:Ib,lesseqqgtr:Pb,LessEqualGreater:Bb,LessFullEqual:Vb,LessGreater:Gb,lessgtr:Xb,LessLess:zb,lesssim:Yb,LessSlantEqual:Jb,LessTilde:Qb,lfisht:Kb,lfloor:Zb,Lfr:Wb,lfr:tv,lg:nv,lgE:sv,lHar:ov,lhard:cv,lharu:ev,lharul:rv,lhblk:av,LJcy:iv,ljcy:lv,llarr:uv,ll:dv,Ll:pv,llcorner:fv,Lleftarrow:mv,llhard:gv,lltri:hv,Lmidot:bv,lmidot:vv,lmoustache:xv,lmoust:wv,lnap:yv,lnapprox:qv,lne:Lv,lnE:Tv,lneq:Sv,lneqq:Ev,lnsim:jv,loang:Av,loarr:Dv,lobrk:Nv,longleftarrow:Rv,LongLeftArrow:kv,Longleftarrow:Cv,longleftrightarrow:Mv,LongLeftRightArrow:Hv,Longleftrightarrow:$v,longmapsto:Ov,longrightarrow:_v,LongRightArrow:Uv,Longrightarrow:Fv,looparrowleft:Iv,looparrowright:Pv,lopar:Bv,Lopf:Vv,lopf:Gv,loplus:Xv,lotimes:zv,lowast:Yv,lowbar:Jv,LowerLeftArrow:Qv,LowerRightArrow:Kv,loz:Zv,lozenge:Wv,lozf:tx,lpar:nx,lparlt:sx,lrarr:ox,lrcorner:cx,lrhar:ex,lrhard:rx,lrm:ax,lrtri:ix,lsaquo:lx,lscr:ux,Lscr:dx,lsh:px,Lsh:fx,lsim:mx,lsime:gx,lsimg:hx,lsqb:bx,lsquo:vx,lsquor:xx,Lstrok:wx,lstrok:yx,ltcc:qx,ltcir:Lx,lt:Tx,LT:Sx,Lt:Ex,ltdot:jx,lthree:Ax,ltimes:Dx,ltlarr:Nx,ltquest:Rx,ltri:kx,ltrie:Cx,ltrif:Mx,ltrPar:Hx,lurdshar:$x,luruhar:Ox,lvertneqq:_x,lvnE:Ux,macr:Fx,male:Ix,malt:Px,maltese:Bx,Map:"⤅",map:Vx,mapsto:Gx,mapstodown:Xx,mapstoleft:zx,mapstoup:Yx,marker:Jx,mcomma:Qx,Mcy:Kx,mcy:Zx,mdash:Wx,mDDot:tw,measuredangle:nw,MediumSpace:sw,Mellintrf:ow,Mfr:cw,mfr:ew,mho:rw,micro:aw,midast:iw,midcir:lw,mid:uw,middot:dw,minusb:pw,minus:fw,minusd:mw,minusdu:gw,MinusPlus:hw,mlcp:bw,mldr:vw,mnplus:xw,models:ww,Mopf:yw,mopf:qw,mp:Lw,mscr:Tw,Mscr:Sw,mstpos:Ew,Mu:jw,mu:Aw,multimap:Dw,mumap:Nw,nabla:Rw,Nacute:kw,nacute:Cw,nang:Mw,nap:Hw,napE:$w,napid:Ow,napos:_w,napprox:Uw,natural:Fw,naturals:Iw,natur:Pw,nbsp:Bw,nbump:Vw,nbumpe:Gw,ncap:Xw,Ncaron:zw,ncaron:Yw,Ncedil:Jw,ncedil:Qw,ncong:Kw,ncongdot:Zw,ncup:Ww,Ncy:ty,ncy:ny,ndash:sy,nearhk:oy,nearr:cy,neArr:ey,nearrow:ry,ne:ay,nedot:iy,NegativeMediumSpace:ly,NegativeThickSpace:uy,NegativeThinSpace:dy,NegativeVeryThinSpace:py,nequiv:fy,nesear:my,nesim:gy,NestedGreaterGreater:hy,NestedLessLess:by,NewLine:vy,nexist:xy,nexists:wy,Nfr:yy,nfr:qy,ngE:Ly,nge:Ty,ngeq:Sy,ngeqq:Ey,ngeqslant:jy,nges:Ay,nGg:Dy,ngsim:Ny,nGt:Ry,ngt:ky,ngtr:Cy,nGtv:My,nharr:Hy,nhArr:$y,nhpar:Oy,ni:_y,nis:Uy,nisd:Fy,niv:Iy,NJcy:Py,njcy:By,nlarr:Vy,nlArr:Gy,nldr:Xy,nlE:zy,nle:Yy,nleftarrow:Jy,nLeftarrow:Qy,nleftrightarrow:Ky,nLeftrightarrow:Zy,nleq:Wy,nleqq:tq,nleqslant:nq,nles:sq,nless:oq,nLl:cq,nlsim:eq,nLt:rq,nlt:aq,nltri:iq,nltrie:lq,nLtv:uq,nmid:dq,NoBreak:pq,NonBreakingSpace:fq,nopf:mq,Nopf:gq,Not:hq,not:bq,NotCongruent:vq,NotCupCap:xq,NotDoubleVerticalBar:wq,NotElement:yq,NotEqual:qq,NotEqualTilde:Lq,NotExists:Tq,NotGreater:Sq,NotGreaterEqual:Eq,NotGreaterFullEqual:jq,NotGreaterGreater:Aq,NotGreaterLess:Dq,NotGreaterSlantEqual:Nq,NotGreaterTilde:Rq,NotHumpDownHump:kq,NotHumpEqual:Cq,notin:Mq,notindot:Hq,notinE:$q,notinva:Oq,notinvb:_q,notinvc:Uq,NotLeftTriangleBar:Fq,NotLeftTriangle:Iq,NotLeftTriangleEqual:Pq,NotLess:Bq,NotLessEqual:Vq,NotLessGreater:Gq,NotLessLess:Xq,NotLessSlantEqual:zq,NotLessTilde:Yq,NotNestedGreaterGreater:Jq,NotNestedLessLess:Qq,notni:Kq,notniva:Zq,notnivb:Wq,notnivc:t1,NotPrecedes:n1,NotPrecedesEqual:s1,NotPrecedesSlantEqual:o1,NotReverseElement:c1,NotRightTriangleBar:e1,NotRightTriangle:r1,NotRightTriangleEqual:a1,NotSquareSubset:i1,NotSquareSubsetEqual:l1,NotSquareSuperset:u1,NotSquareSupersetEqual:d1,NotSubset:p1,NotSubsetEqual:f1,NotSucceeds:m1,NotSucceedsEqual:g1,NotSucceedsSlantEqual:h1,NotSucceedsTilde:b1,NotSuperset:v1,NotSupersetEqual:x1,NotTilde:w1,NotTildeEqual:y1,NotTildeFullEqual:q1,NotTildeTilde:L1,NotVerticalBar:T1,nparallel:S1,npar:E1,nparsl:j1,npart:A1,npolint:D1,npr:N1,nprcue:R1,nprec:k1,npreceq:C1,npre:M1,nrarrc:H1,nrarr:$1,nrArr:O1,nrarrw:_1,nrightarrow:U1,nRightarrow:F1,nrtri:I1,nrtrie:P1,nsc:B1,nsccue:V1,nsce:G1,Nscr:X1,nscr:z1,nshortmid:Y1,nshortparallel:J1,nsim:Q1,nsime:K1,nsimeq:Z1,nsmid:W1,nspar:tL,nsqsube:nL,nsqsupe:sL,nsub:oL,nsubE:cL,nsube:eL,nsubset:rL,nsubseteq:aL,nsubseteqq:iL,nsucc:lL,nsucceq:uL,nsup:dL,nsupE:pL,nsupe:fL,nsupset:mL,nsupseteq:gL,nsupseteqq:hL,ntgl:bL,Ntilde:vL,ntilde:xL,ntlg:wL,ntriangleleft:yL,ntrianglelefteq:qL,ntriangleright:LL,ntrianglerighteq:TL,Nu:SL,nu:EL,num:jL,numero:AL,numsp:DL,nvap:NL,nvdash:RL,nvDash:kL,nVdash:CL,nVDash:ML,nvge:HL,nvgt:$L,nvHarr:OL,nvinfin:_L,nvlArr:UL,nvle:FL,nvlt:IL,nvltrie:PL,nvrArr:BL,nvrtrie:VL,nvsim:GL,nwarhk:XL,nwarr:zL,nwArr:YL,nwarrow:JL,nwnear:QL,Oacute:KL,oacute:ZL,oast:WL,Ocirc:tT,ocirc:nT,ocir:sT,Ocy:oT,ocy:cT,odash:eT,Odblac:rT,odblac:aT,odiv:iT,odot:lT,odsold:uT,OElig:dT,oelig:pT,ofcir:fT,Ofr:mT,ofr:gT,ogon:hT,Ograve:bT,ograve:vT,ogt:xT,ohbar:wT,ohm:yT,oint:qT,olarr:LT,olcir:TT,olcross:ST,oline:ET,olt:jT,Omacr:AT,omacr:DT,Omega:NT,omega:RT,Omicron:kT,omicron:CT,omid:MT,ominus:HT,Oopf:$T,oopf:OT,opar:_T,OpenCurlyDoubleQuote:UT,OpenCurlyQuote:FT,operp:IT,oplus:PT,orarr:BT,Or:VT,or:GT,ord:XT,order:zT,orderof:YT,ordf:JT,ordm:QT,origof:KT,oror:ZT,orslope:WT,orv:tS,oS:nS,Oscr:sS,oscr:oS,Oslash:cS,oslash:eS,osol:rS,Otilde:aS,otilde:iS,otimesas:lS,Otimes:uS,otimes:dS,Ouml:pS,ouml:fS,ovbar:mS,OverBar:gS,OverBrace:hS,OverBracket:bS,OverParenthesis:vS,para:xS,parallel:wS,par:yS,parsim:qS,parsl:LS,part:TS,PartialD:SS,Pcy:ES,pcy:jS,percnt:AS,period:DS,permil:NS,perp:RS,pertenk:kS,Pfr:CS,pfr:MS,Phi:HS,phi:$S,phiv:OS,phmmat:_S,phone:US,Pi:FS,pi:IS,pitchfork:PS,piv:BS,planck:VS,planckh:GS,plankv:XS,plusacir:zS,plusb:YS,pluscir:JS,plus:QS,plusdo:KS,plusdu:ZS,pluse:WS,PlusMinus:t0,plusmn:n0,plussim:s0,plustwo:o0,pm:c0,Poincareplane:e0,pointint:r0,popf:a0,Popf:i0,pound:l0,prap:u0,Pr:d0,pr:p0,prcue:f0,precapprox:m0,prec:g0,preccurlyeq:h0,Precedes:b0,PrecedesEqual:v0,PrecedesSlantEqual:x0,PrecedesTilde:w0,preceq:y0,precnapprox:q0,precneqq:L0,precnsim:T0,pre:S0,prE:E0,precsim:j0,prime:A0,Prime:D0,primes:N0,prnap:R0,prnE:k0,prnsim:C0,prod:M0,Product:H0,profalar:$0,profline:O0,profsurf:_0,prop:U0,Proportional:F0,Proportion:I0,propto:P0,prsim:B0,prurel:V0,Pscr:G0,pscr:X0,Psi:z0,psi:Y0,puncsp:J0,Qfr:Q0,qfr:K0,qint:Z0,qopf:W0,Qopf:tE,qprime:nE,Qscr:sE,qscr:oE,quaternions:cE,quatint:eE,quest:rE,questeq:aE,quot:iE,QUOT:lE,rAarr:uE,race:dE,Racute:pE,racute:fE,radic:mE,raemptyv:gE,rang:hE,Rang:bE,rangd:vE,range:xE,rangle:wE,raquo:yE,rarrap:qE,rarrb:LE,rarrbfs:TE,rarrc:SE,rarr:EE,Rarr:jE,rArr:AE,rarrfs:DE,rarrhk:NE,rarrlp:RE,rarrpl:kE,rarrsim:CE,Rarrtl:ME,rarrtl:HE,rarrw:$E,ratail:OE,rAtail:_E,ratio:UE,rationals:FE,rbarr:IE,rBarr:PE,RBarr:BE,rbbrk:VE,rbrace:GE,rbrack:XE,rbrke:zE,rbrksld:YE,rbrkslu:JE,Rcaron:QE,rcaron:KE,Rcedil:ZE,rcedil:WE,rceil:tj,rcub:nj,Rcy:sj,rcy:oj,rdca:cj,rdldhar:ej,rdquo:rj,rdquor:aj,rdsh:ij,real:lj,realine:uj,realpart:dj,reals:pj,Re:fj,rect:mj,reg:gj,REG:hj,ReverseElement:bj,ReverseEquilibrium:vj,ReverseUpEquilibrium:xj,rfisht:wj,rfloor:yj,rfr:qj,Rfr:Lj,rHar:Tj,rhard:Sj,rharu:Ej,rharul:jj,Rho:Aj,rho:Dj,rhov:Nj,RightAngleBracket:Rj,RightArrowBar:kj,rightarrow:Cj,RightArrow:Mj,Rightarrow:Hj,RightArrowLeftArrow:$j,rightarrowtail:Oj,RightCeiling:_j,RightDoubleBracket:Uj,RightDownTeeVector:Fj,RightDownVectorBar:Ij,RightDownVector:Pj,RightFloor:Bj,rightharpoondown:Vj,rightharpoonup:Gj,rightleftarrows:Xj,rightleftharpoons:zj,rightrightarrows:Yj,rightsquigarrow:Jj,RightTeeArrow:Qj,RightTee:Kj,RightTeeVector:Zj,rightthreetimes:Wj,RightTriangleBar:tA,RightTriangle:nA,RightTriangleEqual:sA,RightUpDownVector:oA,RightUpTeeVector:cA,RightUpVectorBar:eA,RightUpVector:rA,RightVectorBar:aA,RightVector:iA,ring:lA,risingdotseq:uA,rlarr:dA,rlhar:pA,rlm:fA,rmoustache:mA,rmoust:gA,rnmid:hA,roang:bA,roarr:vA,robrk:xA,ropar:wA,ropf:yA,Ropf:qA,roplus:LA,rotimes:TA,RoundImplies:SA,rpar:EA,rpargt:jA,rppolint:AA,rrarr:DA,Rrightarrow:NA,rsaquo:RA,rscr:kA,Rscr:CA,rsh:MA,Rsh:HA,rsqb:$A,rsquo:OA,rsquor:_A,rthree:UA,rtimes:FA,rtri:IA,rtrie:PA,rtrif:BA,rtriltri:VA,RuleDelayed:GA,ruluhar:XA,rx:zA,Sacute:YA,sacute:JA,sbquo:QA,scap:KA,Scaron:ZA,scaron:WA,Sc:tD,sc:nD,sccue:sD,sce:oD,scE:cD,Scedil:eD,scedil:rD,Scirc:aD,scirc:iD,scnap:lD,scnE:uD,scnsim:dD,scpolint:pD,scsim:fD,Scy:mD,scy:gD,sdotb:hD,sdot:bD,sdote:vD,searhk:xD,searr:wD,seArr:yD,searrow:qD,sect:LD,semi:TD,seswar:SD,setminus:ED,setmn:jD,sext:AD,Sfr:DD,sfr:ND,sfrown:RD,sharp:kD,SHCHcy:CD,shchcy:MD,SHcy:HD,shcy:$D,ShortDownArrow:OD,ShortLeftArrow:_D,shortmid:UD,shortparallel:FD,ShortRightArrow:ID,ShortUpArrow:PD,shy:BD,Sigma:VD,sigma:GD,sigmaf:XD,sigmav:zD,sim:YD,simdot:JD,sime:QD,simeq:KD,simg:ZD,simgE:WD,siml:tN,simlE:nN,simne:sN,simplus:oN,simrarr:cN,slarr:eN,SmallCircle:rN,smallsetminus:aN,smashp:iN,smeparsl:lN,smid:uN,smile:dN,smt:pN,smte:fN,smtes:mN,SOFTcy:gN,softcy:hN,solbar:bN,solb:vN,sol:xN,Sopf:wN,sopf:yN,spades:qN,spadesuit:LN,spar:TN,sqcap:SN,sqcaps:EN,sqcup:jN,sqcups:AN,Sqrt:DN,sqsub:NN,sqsube:RN,sqsubset:kN,sqsubseteq:CN,sqsup:MN,sqsupe:HN,sqsupset:$N,sqsupseteq:ON,square:_N,Square:UN,SquareIntersection:FN,SquareSubset:IN,SquareSubsetEqual:PN,SquareSuperset:BN,SquareSupersetEqual:VN,SquareUnion:GN,squarf:XN,squ:zN,squf:YN,srarr:JN,Sscr:QN,sscr:KN,ssetmn:ZN,ssmile:WN,sstarf:tR,Star:nR,star:sR,starf:oR,straightepsilon:cR,straightphi:eR,strns:rR,sub:aR,Sub:iR,subdot:lR,subE:uR,sube:dR,subedot:pR,submult:fR,subnE:mR,subne:gR,subplus:hR,subrarr:bR,subset:vR,Subset:xR,subseteq:wR,subseteqq:yR,SubsetEqual:qR,subsetneq:LR,subsetneqq:TR,subsim:SR,subsub:ER,subsup:jR,succapprox:AR,succ:DR,succcurlyeq:NR,Succeeds:RR,SucceedsEqual:kR,SucceedsSlantEqual:CR,SucceedsTilde:MR,succeq:HR,succnapprox:$R,succneqq:OR,succnsim:_R,succsim:UR,SuchThat:FR,sum:IR,Sum:PR,sung:BR,sup1:VR,sup2:GR,sup3:XR,sup:zR,Sup:YR,supdot:JR,supdsub:QR,supE:KR,supe:ZR,supedot:WR,Superset:tk,SupersetEqual:nk,suphsol:sk,suphsub:ok,suplarr:ck,supmult:ek,supnE:rk,supne:ak,supplus:ik,supset:lk,Supset:uk,supseteq:dk,supseteqq:pk,supsetneq:fk,supsetneqq:mk,supsim:gk,supsub:hk,supsup:bk,swarhk:vk,swarr:xk,swArr:wk,swarrow:yk,swnwar:qk,szlig:Lk,Tab:Tk,target:Sk,Tau:Ek,tau:jk,tbrk:Ak,Tcaron:Dk,tcaron:Nk,Tcedil:Rk,tcedil:kk,Tcy:Ck,tcy:Mk,tdot:Hk,telrec:$k,Tfr:Ok,tfr:_k,there4:Uk,therefore:Fk,Therefore:Ik,Theta:Pk,theta:Bk,thetasym:Vk,thetav:Gk,thickapprox:Xk,thicksim:zk,ThickSpace:Yk,ThinSpace:Jk,thinsp:Qk,thkap:Kk,thksim:Zk,THORN:Wk,thorn:tC,tilde:nC,Tilde:sC,TildeEqual:oC,TildeFullEqual:cC,TildeTilde:eC,timesbar:rC,timesb:aC,times:iC,timesd:lC,tint:uC,toea:dC,topbot:pC,topcir:fC,top:mC,Topf:gC,topf:hC,topfork:bC,tosa:vC,tprime:xC,trade:wC,TRADE:yC,triangle:qC,triangledown:LC,triangleleft:TC,trianglelefteq:SC,triangleq:EC,triangleright:jC,trianglerighteq:AC,tridot:DC,trie:NC,triminus:RC,TripleDot:kC,triplus:CC,trisb:MC,tritime:HC,trpezium:$C,Tscr:OC,tscr:_C,TScy:UC,tscy:FC,TSHcy:IC,tshcy:PC,Tstrok:BC,tstrok:VC,twixt:GC,twoheadleftarrow:XC,twoheadrightarrow:zC,Uacute:YC,uacute:JC,uarr:QC,Uarr:KC,uArr:ZC,Uarrocir:WC,Ubrcy:tM,ubrcy:nM,Ubreve:sM,ubreve:oM,Ucirc:cM,ucirc:eM,Ucy:rM,ucy:aM,udarr:iM,Udblac:lM,udblac:uM,udhar:dM,ufisht:pM,Ufr:fM,ufr:mM,Ugrave:gM,ugrave:hM,uHar:bM,uharl:vM,uharr:xM,uhblk:wM,ulcorn:yM,ulcorner:qM,ulcrop:LM,ultri:TM,Umacr:SM,umacr:EM,uml:jM,UnderBar:AM,UnderBrace:DM,UnderBracket:NM,UnderParenthesis:RM,Union:kM,UnionPlus:CM,Uogon:MM,uogon:HM,Uopf:$M,uopf:OM,UpArrowBar:_M,uparrow:UM,UpArrow:FM,Uparrow:IM,UpArrowDownArrow:PM,updownarrow:BM,UpDownArrow:VM,Updownarrow:GM,UpEquilibrium:XM,upharpoonleft:zM,upharpoonright:YM,uplus:JM,UpperLeftArrow:QM,UpperRightArrow:KM,upsi:ZM,Upsi:WM,upsih:tH,Upsilon:nH,upsilon:sH,UpTeeArrow:oH,UpTee:cH,upuparrows:eH,urcorn:rH,urcorner:aH,urcrop:iH,Uring:lH,uring:uH,urtri:dH,Uscr:pH,uscr:fH,utdot:mH,Utilde:gH,utilde:hH,utri:bH,utrif:vH,uuarr:xH,Uuml:wH,uuml:yH,uwangle:qH,vangrt:LH,varepsilon:TH,varkappa:SH,varnothing:EH,varphi:jH,varpi:AH,varpropto:DH,varr:NH,vArr:RH,varrho:kH,varsigma:CH,varsubsetneq:MH,varsubsetneqq:HH,varsupsetneq:$H,varsupsetneqq:OH,vartheta:_H,vartriangleleft:UH,vartriangleright:FH,vBar:IH,Vbar:PH,vBarv:BH,Vcy:VH,vcy:GH,vdash:XH,vDash:zH,Vdash:YH,VDash:JH,Vdashl:QH,veebar:KH,vee:ZH,Vee:WH,veeeq:t2,vellip:n2,verbar:s2,Verbar:o2,vert:c2,Vert:e2,VerticalBar:r2,VerticalLine:a2,VerticalSeparator:i2,VerticalTilde:l2,VeryThinSpace:u2,Vfr:d2,vfr:p2,vltri:f2,vnsub:m2,vnsup:g2,Vopf:h2,vopf:b2,vprop:v2,vrtri:x2,Vscr:w2,vscr:y2,vsubnE:q2,vsubne:L2,vsupnE:T2,vsupne:S2,Vvdash:E2,vzigzag:j2,Wcirc:A2,wcirc:D2,wedbar:N2,wedge:R2,Wedge:k2,wedgeq:C2,weierp:M2,Wfr:H2,wfr:$2,Wopf:O2,wopf:_2,wp:U2,wr:F2,wreath:I2,Wscr:P2,wscr:B2,xcap:V2,xcirc:G2,xcup:X2,xdtri:z2,Xfr:Y2,xfr:J2,xharr:Q2,xhArr:K2,Xi:Z2,xi:W2,xlarr:t$,xlArr:n$,xmap:s$,xnis:o$,xodot:c$,Xopf:e$,xopf:r$,xoplus:a$,xotime:i$,xrarr:l$,xrArr:u$,Xscr:d$,xscr:p$,xsqcup:f$,xuplus:m$,xutri:g$,xvee:h$,xwedge:b$,Yacute:v$,yacute:x$,YAcy:w$,yacy:y$,Ycirc:q$,ycirc:L$,Ycy:T$,ycy:S$,yen:E$,Yfr:j$,yfr:A$,YIcy:D$,yicy:N$,Yopf:R$,yopf:k$,Yscr:C$,yscr:M$,YUcy:H$,yucy:$$,yuml:O$,Yuml:_$,Zacute:U$,zacute:F$,Zcaron:I$,zcaron:P$,Zcy:B$,zcy:V$,Zdot:G$,zdot:X$,zeetrf:z$,ZeroWidthSpace:Y$,Zeta:J$,zeta:Q$,zfr:K$,Zfr:Z$,ZHcy:W$,zhcy:tO,zigrarr:nO,zopf:sO,Zopf:oO,Zscr:cO,zscr:eO,zwj:rO,zwnj:aO},iO="Á",lO="á",uO="Â",dO="â",pO="´",fO="Æ",mO="æ",gO="À",hO="à",bO="&",vO="&",xO="Å",wO="å",yO="Ã",qO="ã",LO="Ä",TO="ä",SO="¦",EO="Ç",jO="ç",AO="¸",DO="¢",NO="©",RO="©",kO="¤",CO="°",MO="÷",HO="É",$O="é",OO="Ê",_O="ê",UO="È",FO="è",IO="Ð",PO="ð",BO="Ë",VO="ë",GO="½",XO="¼",zO="¾",YO=">",JO=">",QO="Í",KO="í",ZO="Î",WO="î",t_="¡",n_="Ì",s_="ì",o_="¿",c_="Ï",e_="ï",r_="«",a_="<",i_="<",l_="¯",u_="µ",d_="·",p_=" ",f_="¬",m_="Ñ",g_="ñ",h_="Ó",b_="ó",v_="Ô",x_="ô",w_="Ò",y_="ò",q_="ª",L_="º",T_="Ø",S_="ø",E_="Õ",j_="õ",A_="Ö",D_="ö",N_="¶",R_="±",k_="£",C_='"',M_='"',H_="»",$_="®",O_="®",__="§",U_="",F_="¹",I_="²",P_="³",B_="ß",V_="Þ",G_="þ",X_="×",z_="Ú",Y_="ú",J_="Û",Q_="û",K_="Ù",Z_="ù",W_="¨",tU="Ü",nU="ü",sU="Ý",oU="ý",cU="¥",eU="ÿ",rU={Aacute:iO,aacute:lO,Acirc:uO,acirc:dO,acute:pO,AElig:fO,aelig:mO,Agrave:gO,agrave:hO,amp:bO,AMP:vO,Aring:xO,aring:wO,Atilde:yO,atilde:qO,Auml:LO,auml:TO,brvbar:SO,Ccedil:EO,ccedil:jO,cedil:AO,cent:DO,copy:NO,COPY:RO,curren:kO,deg:CO,divide:MO,Eacute:HO,eacute:$O,Ecirc:OO,ecirc:_O,Egrave:UO,egrave:FO,ETH:IO,eth:PO,Euml:BO,euml:VO,frac12:GO,frac14:XO,frac34:zO,gt:YO,GT:JO,Iacute:QO,iacute:KO,Icirc:ZO,icirc:WO,iexcl:t_,Igrave:n_,igrave:s_,iquest:o_,Iuml:c_,iuml:e_,laquo:r_,lt:a_,LT:i_,macr:l_,micro:u_,middot:d_,nbsp:p_,not:f_,Ntilde:m_,ntilde:g_,Oacute:h_,oacute:b_,Ocirc:v_,ocirc:x_,Ograve:w_,ograve:y_,ordf:q_,ordm:L_,Oslash:T_,oslash:S_,Otilde:E_,otilde:j_,Ouml:A_,ouml:D_,para:N_,plusmn:R_,pound:k_,quot:C_,QUOT:M_,raquo:H_,reg:$_,REG:O_,sect:__,shy:U_,sup1:F_,sup2:I_,sup3:P_,szlig:B_,THORN:V_,thorn:G_,times:X_,Uacute:z_,uacute:Y_,Ucirc:J_,ucirc:Q_,Ugrave:K_,ugrave:Z_,uml:W_,Uuml:tU,uuml:nU,Yacute:sU,yacute:oU,yen:cU,yuml:eU},aU="&",iU="'",lU=">",uU="<",dU='"',vt={amp:aU,apos:iU,gt:lU,lt:uU,quot:dU};var V={};const pU={0:65533,128:8364,130:8218,131:402,132:8222,133:8230,134:8224,135:8225,136:710,137:8240,138:352,139:8249,140:338,142:381,145:8216,146:8217,147:8220,148:8221,149:8226,150:8211,151:8212,152:732,153:8482,154:353,155:8250,156:339,158:382,159:376};var it;function fU(){if(it)return V;it=1;var c=V&&V.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(V,"__esModule",{value:!0});var r=c(pU),i=String.fromCodePoint||function(e){var g="";return e>65535&&(e-=65536,g+=String.fromCharCode(e>>>10&1023|55296),e=56320|e&1023),g+=String.fromCharCode(e),g};function m(e){return e>=55296&&e<=57343||e>1114111?"�":(e in r.default&&(e=r.default[e]),i(e))}return V.default=m,V}var lt;function ut(){if(lt)return U;lt=1;var c=U&&U.__importDefault||function(p){return p&&p.__esModule?p:{default:p}};Object.defineProperty(U,"__esModule",{value:!0}),U.decodeHTML=U.decodeHTMLStrict=U.decodeXML=void 0;var r=c(bt),i=c(rU),m=c(vt),e=c(fU()),g=/&(?:[a-zA-Z0-9]+|#[xX][\da-fA-F]+|#\d+);/g;U.decodeXML=T(m.default),U.decodeHTMLStrict=T(r.default);function T(p){var v=w(p);return function(l){return String(l).replace(g,v)}}var h=function(p,v){return p<v?1:-1};U.decodeHTML=(function(){for(var p=Object.keys(i.default).sort(h),v=Object.keys(r.default).sort(h),l=0,b=0;l<v.length;l++)p[b]===v[l]?(v[l]+=";?",b++):v[l]+=";";var q=new RegExp("&(?:"+v.join("|")+"|#[xX][\\da-fA-F]+;?|#\\d+;?)","g"),j=w(r.default);function S(y){return y.substr(-1)!==";"&&(y+=";"),j(y)}return function(y){return String(y).replace(q,S)}})();function w(p){return function(l){if(l.charAt(1)==="#"){var b=l.charAt(2);return b==="X"||b==="x"?e.default(parseInt(l.substr(3),16)):e.default(parseInt(l.substr(2),10))}return p[l.slice(1,-1)]||l}}return U}var D={},dt;function pt(){if(dt)return D;dt=1;var c=D&&D.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(D,"__esModule",{value:!0}),D.escapeUTF8=D.escape=D.encodeNonAsciiHTML=D.encodeHTML=D.encodeXML=void 0;var r=c(vt),i=h(r.default),m=w(i);D.encodeXML=y(i);var e=c(bt),g=h(e.default),T=w(g);D.encodeHTML=b(g,T),D.encodeNonAsciiHTML=y(g);function h(u){return Object.keys(u).sort().reduce(function(x,A){return x[u[A]]="&"+A+";",x},{})}function w(u){for(var x=[],A=[],R=0,B=Object.keys(u);R<B.length;R++){var P=B[R];P.length===1?x.push("\\"+P):A.push(P)}x.sort();for(var M=0;M<x.length-1;M++){for(var F=M;F<x.length-1&&x[F].charCodeAt(1)+1===x[F+1].charCodeAt(1);)F+=1;var Y=1+F-M;Y<3||x.splice(M,Y,x[M]+"-"+x[F])}return A.unshift("["+x.join("")+"]"),new RegExp(A.join("|"),"g")}var p=/(?:[\x80-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g,v=String.prototype.codePointAt!=null?function(u){return u.codePointAt(0)}:function(u){return(u.charCodeAt(0)-55296)*1024+u.charCodeAt(1)-56320+65536};function l(u){return"&#x"+(u.length>1?v(u):u.charCodeAt(0)).toString(16).toUpperCase()+";"}function b(u,x){return function(A){return A.replace(x,function(R){return u[R]}).replace(p,l)}}var q=new RegExp(m.source+"|"+p.source,"g");function j(u){return u.replace(q,l)}D.escape=j;function S(u){return u.replace(m,l)}D.escapeUTF8=S;function y(u){return function(x){return x.replace(q,function(A){return u[A]||l(A)})}}return D}var ft;function mU(){return ft||(ft=1,(function(c){Object.defineProperty(c,"__esModule",{value:!0}),c.decodeXMLStrict=c.decodeHTML5Strict=c.decodeHTML4Strict=c.decodeHTML5=c.decodeHTML4=c.decodeHTMLStrict=c.decodeHTML=c.decodeXML=c.encodeHTML5=c.encodeHTML4=c.escapeUTF8=c.escape=c.encodeNonAsciiHTML=c.encodeHTML=c.encodeXML=c.encode=c.decodeStrict=c.decode=void 0;var r=ut(),i=pt();function m(w,p){return(!p||p<=0?r.decodeXML:r.decodeHTML)(w)}c.decode=m;function e(w,p){return(!p||p<=0?r.decodeXML:r.decodeHTMLStrict)(w)}c.decodeStrict=e;function g(w,p){return(!p||p<=0?i.encodeXML:i.encodeHTML)(w)}c.encode=g;var T=pt();Object.defineProperty(c,"encodeXML",{enumerable:!0,get:function(){return T.encodeXML}}),Object.defineProperty(c,"encodeHTML",{enumerable:!0,get:function(){return T.encodeHTML}}),Object.defineProperty(c,"encodeNonAsciiHTML",{enumerable:!0,get:function(){return T.encodeNonAsciiHTML}}),Object.defineProperty(c,"escape",{enumerable:!0,get:function(){return T.escape}}),Object.defineProperty(c,"escapeUTF8",{enumerable:!0,get:function(){return T.escapeUTF8}}),Object.defineProperty(c,"encodeHTML4",{enumerable:!0,get:function(){return T.encodeHTML}}),Object.defineProperty(c,"encodeHTML5",{enumerable:!0,get:function(){return T.encodeHTML}});var h=ut();Object.defineProperty(c,"decodeXML",{enumerable:!0,get:function(){return h.decodeXML}}),Object.defineProperty(c,"decodeHTML",{enumerable:!0,get:function(){return h.decodeHTML}}),Object.defineProperty(c,"decodeHTMLStrict",{enumerable:!0,get:function(){return h.decodeHTMLStrict}}),Object.defineProperty(c,"decodeHTML4",{enumerable:!0,get:function(){return h.decodeHTML}}),Object.defineProperty(c,"decodeHTML5",{enumerable:!0,get:function(){return h.decodeHTML}}),Object.defineProperty(c,"decodeHTML4Strict",{enumerable:!0,get:function(){return h.decodeHTMLStrict}}),Object.defineProperty(c,"decodeHTML5Strict",{enumerable:!0,get:function(){return h.decodeHTMLStrict}}),Object.defineProperty(c,"decodeXMLStrict",{enumerable:!0,get:function(){return h.decodeXML}})})(W)),W}var tt,mt;function gU(){if(mt)return tt;mt=1;function c(t,n){if(!(t instanceof n))throw new TypeError("Cannot call a class as a function")}function r(t,n){for(var o=0;o<n.length;o++){var a=n[o];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(t,a.key,a)}}function i(t,n,o){return n&&r(t.prototype,n),t}function m(t,n){var o=typeof Symbol<"u"&&t[Symbol.iterator]||t["@@iterator"];if(!o){if(Array.isArray(t)||(o=e(t))||n){o&&(t=o);var a=0,f=function(){};return{s:f,n:function(){return a>=t.length?{done:!0}:{done:!1,value:t[a++]}},e:function($){throw $},f}}throw new TypeError(`Invalid attempt to iterate non-iterable instance.
|
|
3
3
|
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var d=!0,H=!1,C;return{s:function(){o=o.call(t)},n:function(){var $=o.next();return d=$.done,$},e:function($){H=!0,C=$},f:function(){try{!d&&o.return!=null&&o.return()}finally{if(H)throw C}}}}function e(t,n){if(t){if(typeof t=="string")return g(t,n);var o=Object.prototype.toString.call(t).slice(8,-1);if(o==="Object"&&t.constructor&&(o=t.constructor.name),o==="Map"||o==="Set")return Array.from(t);if(o==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o))return g(t,n)}}function g(t,n){(n==null||n>t.length)&&(n=t.length);for(var o=0,a=new Array(n);o<n;o++)a[o]=t[o];return a}var T=mU(),h={fg:"#FFF",bg:"#000",newline:!1,escapeXML:!1,stream:!1,colors:w()};function w(){var t={0:"#000",1:"#A00",2:"#0A0",3:"#A50",4:"#00A",5:"#A0A",6:"#0AA",7:"#AAA",8:"#555",9:"#F55",10:"#5F5",11:"#FF5",12:"#55F",13:"#F5F",14:"#5FF",15:"#FFF"};return y(0,5).forEach(function(n){y(0,5).forEach(function(o){y(0,5).forEach(function(a){return p(n,o,a,t)})})}),y(0,23).forEach(function(n){var o=n+232,a=v(n*10+8);t[o]="#"+a+a+a}),t}function p(t,n,o,a){var f=16+t*36+n*6+o,d=t>0?t*40+55:0,H=n>0?n*40+55:0,C=o>0?o*40+55:0;a[f]=l([d,H,C])}function v(t){for(var n=t.toString(16);n.length<2;)n="0"+n;return n}function l(t){var n=[],o=m(t),a;try{for(o.s();!(a=o.n()).done;){var f=a.value;n.push(v(f))}}catch(d){o.e(d)}finally{o.f()}return"#"+n.join("")}function b(t,n,o,a){var f;return n==="text"?f=A(o,a):n==="display"?f=j(t,o,a):n==="xterm256Foreground"?f=P(t,a.colors[o]):n==="xterm256Background"?f=M(t,a.colors[o]):n==="rgb"&&(f=q(t,o)),f}function q(t,n){n=n.substring(2).slice(0,-1);var o=+n.substr(0,2),a=n.substring(5).split(";"),f=a.map(function(d){return("0"+Number(d).toString(16)).substr(-2)}).join("");return B(t,(o===38?"color:#":"background-color:#")+f)}function j(t,n,o){n=parseInt(n,10);var a={"-1":function(){return"<br/>"},0:function(){return t.length&&S(t)},1:function(){return R(t,"b")},3:function(){return R(t,"i")},4:function(){return R(t,"u")},8:function(){return B(t,"display:none")},9:function(){return R(t,"strike")},22:function(){return B(t,"font-weight:normal;text-decoration:none;font-style:normal")},23:function(){return F(t,"i")},24:function(){return F(t,"u")},39:function(){return P(t,o.fg)},49:function(){return M(t,o.bg)},53:function(){return B(t,"text-decoration:overline")}},f;return a[n]?f=a[n]():4<n&&n<7?f=R(t,"blink"):29<n&&n<38?f=P(t,o.colors[n-30]):39<n&&n<48?f=M(t,o.colors[n-40]):89<n&&n<98?f=P(t,o.colors[8+(n-90)]):99<n&&n<108&&(f=M(t,o.colors[8+(n-100)])),f}function S(t){var n=t.slice(0);return t.length=0,n.reverse().map(function(o){return"</"+o+">"}).join("")}function y(t,n){for(var o=[],a=t;a<=n;a++)o.push(a);return o}function u(t){return function(n){return(t===null||n.category!==t)&&t!=="all"}}function x(t){t=parseInt(t,10);var n=null;return t===0?n="all":t===1?n="bold":2<t&&t<5?n="underline":4<t&&t<7?n="blink":t===8?n="hide":t===9?n="strike":29<t&&t<38||t===39||89<t&&t<98?n="foreground-color":(39<t&&t<48||t===49||99<t&&t<108)&&(n="background-color"),n}function A(t,n){return n.escapeXML?T.encodeXML(t):t}function R(t,n,o){return o||(o=""),t.push(n),"<".concat(n).concat(o?' style="'.concat(o,'"'):"",">")}function B(t,n){return R(t,"span",n)}function P(t,n){return R(t,"span","color:"+n)}function M(t,n){return R(t,"span","background-color:"+n)}function F(t,n){var o;if(t.slice(-1)[0]===n&&(o=t.pop()),o)return"</"+n+">"}function Y(t,n,o){var a=!1,f=3;function d(){return""}function H(O,_){return o("xterm256Foreground",_),""}function C(O,_){return o("xterm256Background",_),""}function E(O){return n.newline?o("display",-1):o("text",O),""}function $(O,_){a=!0,_.trim().length===0&&(_="0"),_=_.trimRight(";").split(";");var J=m(_),at;try{for(J.s();!(at=J.n()).done;){var Dt=at.value;o("display",Dt)}}catch(Nt){J.e(Nt)}finally{J.f()}return""}function Lt(O){return o("text",O),""}function Tt(O){return o("rgb",O),""}var ct=[{pattern:/^\x08+/,sub:d},{pattern:/^\x1b\[[012]?K/,sub:d},{pattern:/^\x1b\[\(B/,sub:d},{pattern:/^\x1b\[[34]8;2;\d+;\d+;\d+m/,sub:Tt},{pattern:/^\x1b\[38;5;(\d+)m/,sub:H},{pattern:/^\x1b\[48;5;(\d+)m/,sub:C},{pattern:/^\n/,sub:E},{pattern:/^\r+\n/,sub:E},{pattern:/^\r/,sub:E},{pattern:/^\x1b\[((?:\d{1,3};?)+|)m/,sub:$},{pattern:/^\x1b\[\d?J/,sub:d},{pattern:/^\x1b\[\d{0,3};\d{0,3}f/,sub:d},{pattern:/^\x1b\[?[\d;]{0,3}/,sub:d},{pattern:/^(([^\x1b\x08\r\n])+)/,sub:Lt}];function St(O,_){_>f&&a||(a=!1,t=t.replace(O.pattern,O.sub))}var et=[],Et=t,X=Et.length;t:for(;X>0;){for(var Z=0,rt=0,jt=ct.length;rt<jt;Z=++rt){var At=ct[Z];if(St(At,Z),t.length!==X){X=t.length;continue t}}if(t.length===X)break;et.push(0),X=t.length}return et}function yt(t,n,o){return n!=="text"&&(t=t.filter(u(x(o))),t.push({token:n,data:o,category:x(o)})),t}var qt=(function(){function t(n){c(this,t),n=n||{},n.colors&&(n.colors=Object.assign({},h.colors,n.colors)),this.options=Object.assign({},h,n),this.stack=[],this.stickyStack=[]}return i(t,[{key:"toHtml",value:function(o){var a=this;o=typeof o=="string"?[o]:o;var f=this.stack,d=this.options,H=[];return this.stickyStack.forEach(function(C){var E=b(f,C.token,C.data,d);E&&H.push(E)}),Y(o.join(""),d,function(C,E){var $=b(f,C,E,d);$&&H.push($),d.stream&&(a.stickyStack=yt(a.stickyStack,C,E))}),f.length&&H.push(S(f)),H.join("")}}]),t})();return tt=qt,tt}var hU=gU();const bU=Rt(hU);function xt(){const c=gt();return L.useMemo(()=>new bU(c==="dark"?{fg:"#d6deeb",bg:"#121318",escapeXML:!0}:{fg:"#000000",bg:"#f3f3f3",escapeXML:!0}),[c])}function wt(c){return c.replace(/\u001b\[\d+A/g,"").replace(/\u001b\[\d+K/g,"")}const vU=_t(I({type:k("epicshop:test-status-update"),timestamp:G()}),z([I({status:k("pending")}),I({status:k("pass")}),I({status:k("fail"),error:Q()})])),xU=I({type:k("epicshop:test-step-update"),status:k("pass"),title:Q(),timestamp:G()}),wU=z([xU,vU]);function yU({pathname:c,testFile:r}){const i=gt(),m=xt(),e=L.useRef(null),[g,T]=L.useState(null),[h,w]=L.useState([]);L.useEffect(()=>{function b(q){if(q.source!==e.current?.contentWindow||"request"in q.data)return;const j=wU.safeParse(q.data);if(!j.success){console.error("Invalid message from test iframe",q.data,j.error);return}const{data:S}=j;S.type==="epicshop:test-status-update"&&(S.status==="pending"&&w([]),T(S)),S.type==="epicshop:test-step-update"&&w(y=>[...y,S])}return window.addEventListener("message",b),()=>{window.removeEventListener("message",b)}},[]);const p={pending:s.jsx(st,{size:14,"aria-label":"Pending"}),pass:s.jsx(N,{name:"CheckSmall","aria-label":"Passed",className:"text-success"}),fail:s.jsx(N,{name:"Remove","aria-label":"Failed",className:"text-foreground-destructive"}),unknown:s.jsx(N,{name:"Question","aria-label":"Unknown",className:"animate-pulse"})}[g?.status??"unknown"],v=h.sort((b,q)=>b.timestamp-q.timestamp),l={pass:s.jsx(N,{name:"CheckSmall","aria-label":"Passed"}),fail:s.jsx(N,{name:"Remove","aria-label":"Failed"}),unknown:s.jsx(N,{name:"Question","aria-label":"Unknown",className:"animate-pulse"})};return s.jsx(s.Fragment,{children:s.jsx(kt,{className:"w-full",type:"multiple",children:s.jsx(Ct,{icon:p,title:r,forceMount:!0,children:s.jsxs("div",{className:"not-prose",children:[s.jsxs("div",{className:"flex flex-col gap-2 p-5 pt-3",children:[s.jsx("ul",{className:"flex flex-col gap-2",children:v.map((b,q)=>s.jsx("li",{children:s.jsxs("div",{className:"text-success flex items-baseline gap-2",children:[s.jsxs("span",{children:[q+1,"."]}),s.jsx("span",{children:l[b.status]}),s.jsx("pre",{className:"scrollbar-thin scrollbar-thumb-scrollbar max-h-48 overflow-y-auto p-4",children:b.title})]})},b.timestamp+b.title))}),g?.status==="fail"?s.jsxs("div",{className:"text-foreground-destructive flex items-baseline gap-2",children:[s.jsxs("span",{children:[v.length+1,"."]}),s.jsx("span",{children:l.fail}),s.jsx("pre",{className:"scrollbar-thin scrollbar-thumb-scrollbar max-h-48 overflow-y-auto p-4",dangerouslySetInnerHTML:{__html:m.toHtml(wt(g.error))}})]}):null,s.jsx("iframe",{ref:e,title:r,src:c+r,className:"bg-background mt-5 min-h-[420px] w-full border",style:{colorScheme:i},allow:"clipboard-write"})]}),s.jsxs("div",{className:"flex border-y",children:[s.jsx("button",{onClick:()=>e.current?.contentWindow?.location.reload(),className:"border-r p-3",children:s.jsx(N,{name:"Refresh","aria-label":"Rerun Tests"})}),s.jsx("a",{href:c+r,target:"_blank",rel:"noreferrer",className:"border-r p-3",children:s.jsx(N,{name:"ExternalLink","aria-label":"Open in New Window"})})]})]})})})})}const qU=z([I({type:k("init"),exitCode:G().nullable().optional(),isRunning:Ut(),output:ht(I({type:z([k("stdout"),k("stderr")]),content:Q(),timestamp:G()}))}),I({type:z([k("stdout"),k("stderr")]),data:Q(),timestamp:G()}),I({type:k("exit"),isRunning:k(!1),code:G().nullable()})]),LU=ht(qU);function TU(c,r){return r(c)}function SU({name:c}){const[r,i]=L.useReducer(TU,{version:0,isRunning:!1,exitCode:void 0,lines:[]}),m=Ht(),e=L.useRef(m);L.useEffect(()=>{e.current=m},[m]);const g=xt(),{version:T,isRunning:h,exitCode:w,lines:p}=r,v=Ft(`/test?${new URLSearchParams({name:c})}&v=${T}`);return L.useEffect(()=>{if(!v)return;const l=JSON.parse(v),b=LU.safeParse(l);if(!b.success){console.error(b.error.flatten());return}for(const q of b.data)switch(q.type){case"exit":{const{isRunning:j,code:S}=q;i(y=>({...y,isRunning:j,exitCode:S})),e.current.revalidate();break}case"init":{const{output:j,exitCode:S,isRunning:y}=q;i(u=>({...u,lines:j,exitCode:S,isRunning:y}));break}case"stderr":case"stdout":{const{type:j,data:S,timestamp:y}=q;i(u=>({...u,lines:[...u.lines,{type:j,content:S,timestamp:y}].sort((x,A)=>x.timestamp-A.timestamp),isRunning:!0}));break}}},[v]),s.jsxs("div",{className:"relative flex h-full w-full flex-col overflow-hidden",children:[s.jsxs("div",{className:"flex h-12 w-full shrink-0 items-center justify-between border-b",children:[s.jsxs("div",{className:"flex h-full items-center",children:[!h&&s.jsx(EU,{name:c,onRun:()=>{i(l=>({...l,exitCode:void 0,lines:[],version:l.version+1}))}}),h?s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"flex h-full grow items-center justify-center border-r px-3.5",children:s.jsx(st,{role:"status","aria-label":"Running Tests"})}),s.jsx(AU,{name:c})]}):null]}),!h&&w!==void 0&&s.jsx("p",{className:"pr-3.5 leading-none",children:w===0?"Tests passed":`Test failed (exit code ${String(w)})`}),!h&&w!==void 0&&s.jsx(jU,{name:c,onClear:()=>{i(l=>({...l,exitCode:void 0,lines:[]}))}})]}),s.jsxs("div",{className:"flex min-h-0 flex-1 flex-col gap-5 p-5",children:[s.jsx("p",{className:"font-mono text-sm font-medium uppercase",children:"Test Output"}),s.jsx("pre",{className:"shadow-on-scrollbox scrollbar-thin scrollbar-thumb-scrollbar min-h-0 flex-1 overflow-y-auto",children:p.map(l=>s.jsx("code",{"data-type":l.type,dangerouslySetInnerHTML:{__html:g.toHtml(wt(l.content))}},l.timestamp))})]})]})}function EU({name:c,onRun:r}){const i=nt(),m=ot(),e=L.useRef(r);return L.useEffect(()=>{e.current=r},[r]),L.useEffect(()=>{i.data?.success&&e.current?.()},[i.data]),s.jsxs(i.Form,{method:"POST",action:"/test",className:"h-full",children:[m,s.jsx("input",{type:"hidden",name:"name",value:c}),s.jsx(K,{content:i.state==="idle"?"Run Tests":"Running Tests...",children:s.jsx("button",{type:"submit",name:"intent",value:"run",className:"flex h-full grow items-center justify-center border-r px-3.5",children:i.state==="idle"?s.jsx(N,{name:"TriangleSmall"}):s.jsx(st,{role:"status"})})})]})}function jU({name:c,onClear:r}){const i=nt(),m=ot(),e=L.useRef(r);return L.useEffect(()=>{e.current=r},[r]),L.useEffect(()=>{i.data?.success&&e.current?.()},[i.data]),s.jsxs(i.Form,{method:"POST",action:"/test",className:"h-full",children:[m,s.jsx("input",{type:"hidden",name:"name",value:c}),s.jsx(K,{content:i.state==="idle"?"Clear Tests":"Clearing Tests...",children:s.jsx("button",{type:"submit",name:"intent",value:"clear",className:"flex h-full grow items-center justify-center border-l px-3.5",children:i.state==="idle"?s.jsx(N,{name:"Clear"}):s.jsx(N,{name:"Clear",className:"animate-pulse",role:"status"})})})]})}function AU({name:c,onStop:r}){const i=nt(),m=ot(),e=L.useRef(r);return L.useEffect(()=>{e.current=r},[r]),L.useEffect(()=>{i.data?.success&&e.current?.()},[i.data]),s.jsxs(i.Form,{method:"POST",action:"/test",className:"h-full",children:[m,s.jsx("input",{type:"hidden",name:"name",value:c}),s.jsx(K,{content:i.state==="idle"?"Stop Tests":"Stopping Tests...",children:s.jsx("button",{type:"submit",name:"intent",value:"stop",className:"flex h-full grow items-center justify-center border-r px-3.5",children:i.state==="idle"?s.jsx(N,{name:"Stop"}):s.jsx(N,{name:"Stop",className:"animate-pulse",role:"status"})})})]})}function PU({appInfo:c,problemAppName:r,allApps:i,isUpToDate:m,userHasAccessPromise:e}){return s.jsx(It,{playgroundAppName:c?.appName,problemAppName:r,allApps:i,isUpToDate:m,children:s.jsx(Mt,{fallbackRender:()=>s.jsx("div",{className:"w-full p-12",children:s.jsxs("div",{className:"flex w-full flex-col gap-4 text-center",children:[s.jsx("p",{className:"text-2xl font-bold",children:"Error"}),s.jsx("p",{className:"text-lg",children:"There was an error loading the user access."})]})}),children:s.jsx(L.Suspense,{fallback:s.jsx("div",{className:"flex items-center justify-center p-8",children:s.jsx(K,{content:"Loading user access",children:s.jsx(N,{name:"Refresh",className:"animate-spin"})})}),children:s.jsx($t,{resolve:e,children:g=>s.jsx(DU,{playgroundAppInfo:c,userHasAccess:g})})})})})}function DU({userHasAccess:c,playgroundAppInfo:r}){const[i,m]=L.useState(0);if(!c)return s.jsxs("div",{className:"w-full p-12",children:[s.jsxs("div",{className:"flex w-full flex-col gap-4 text-center",children:[s.jsx("p",{className:"text-2xl font-bold",children:"Access Denied"}),s.jsx("p",{className:"text-lg",children:"You must login or register for the workshop to view and run the tests."})]}),s.jsx("div",{className:"h-16"}),s.jsx("p",{className:"pb-4",children:"Check out this video to see how the test tab works."}),s.jsx(Ot,{url:"https://www.epicweb.dev/tips/epic-workshop-test-tab-demo"})]});if(!r)return s.jsx("div",{className:"flex h-full items-center justify-center text-lg",children:s.jsx("p",{children:"No tests here 😢 Sorry."})});if(r.test.type==="script")return s.jsx(SU,{name:r.name});if(r.test.type==="browser"){const{pathname:e}=r.test;return s.jsxs("div",{className:"flex h-full min-h-0 w-full grow flex-col overflow-y-auto",children:[r.test.testFiles.map(g=>s.jsx("div",{children:s.jsx(yU,{pathname:e,testFile:g})},g)),s.jsx("div",{className:"px-3 py-[21px]",children:s.jsxs("button",{onClick:()=>m(g=>g+1),className:"flex items-center gap-2 font-mono text-sm leading-none uppercase",children:[s.jsx(N,{name:"Refresh","aria-hidden":!0})," Rerun All Tests"]})})]},i)}return s.jsx("div",{className:"flex h-full items-center justify-center text-lg",children:s.jsx("p",{children:"No tests here 😢 Sorry."})})}export{PU as T,DU as a};
|
|
4
|
-
//# sourceMappingURL=tests-
|
|
4
|
+
//# sourceMappingURL=tests-Bko6qhsh.js.map
|