@camstack/addon-pipeline 0.1.20 → 0.2.1
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/dist/audio-analyzer/index.js +736 -719
- package/dist/audio-analyzer/index.mjs +726 -679
- package/dist/audio-codec-nodeav/index.js +304 -461
- package/dist/audio-codec-nodeav/index.mjs +300 -462
- package/dist/chunk-BdkLduGY.mjs +5 -0
- package/dist/chunk-D6vf50IK.js +28 -0
- package/dist/codec-runtime-BOk-13PN.js +202 -0
- package/dist/codec-runtime-BsqlEjPi.mjs +197 -0
- package/dist/constants-B_b0a-6h.mjs +3119 -0
- package/dist/{index-CMcx_k6Y.js → constants-D65v6yp6.js} +3107 -2935
- package/dist/decoder-nodeav/index.js +1374 -1444
- package/dist/decoder-nodeav/index.mjs +1369 -1425
- package/dist/detection-pipeline/index.js +6462 -5613
- package/dist/detection-pipeline/index.mjs +6451 -5574
- package/dist/dist-7ewQjTle.js +22454 -0
- package/dist/dist-C5jnNl0n.mjs +22089 -0
- package/dist/motion-wasm/index.js +469 -467
- package/dist/motion-wasm/index.mjs +464 -446
- package/dist/pipeline-runner/index.js +2029 -1827
- package/dist/pipeline-runner/index.mjs +2025 -1811
- package/dist/recorder/index.js +2045 -2157
- package/dist/recorder/index.mjs +2042 -2156
- package/dist/stream-broker/_stub.js +1806 -1352
- package/dist/stream-broker/_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-D4-DHanK.mjs +156 -0
- package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-Tf-HACFd.mjs +26 -0
- package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-C9WX5HNw.mjs +26 -0
- package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-BO7TIbJV.mjs +26 -0
- package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare__react__loadShare__.js-C9j-2lBe.mjs +26 -0
- package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-XO0-Pyu6.mjs +26 -0
- package/dist/stream-broker/dist-CYZr2fwk.mjs +2726 -0
- package/dist/stream-broker/hostInit-Di6vceAU.mjs +129 -0
- package/dist/stream-broker/index.js +17778 -15470
- package/dist/stream-broker/index.mjs +17769 -15465
- package/dist/stream-broker/remoteEntry.js +134 -2973
- package/dist/stream-broker/remoteEntry.ssr.js +33 -0
- package/dist/stream-broker/virtualExposes-dYNvIwoR.mjs +27 -0
- package/dist/stream-broker/virtual_mf-exposes-ssr___mfe_internal__addon_stream_broker_widgets__remoteEntry_js-Cmqfp4i_.mjs +10 -0
- package/embed-dist/assets/index-B8VlSD0-.js +150 -0
- package/embed-dist/assets/index-ZhDdp1Nd.css +2 -0
- package/embed-dist/index.html +13 -0
- package/package.json +25 -7
- package/wasm/assembly/index.ts +41 -16
- package/dist/audio-analyzer/index.js.map +0 -1
- package/dist/audio-analyzer/index.mjs.map +0 -1
- package/dist/audio-codec-nodeav/index.js.map +0 -1
- package/dist/audio-codec-nodeav/index.mjs.map +0 -1
- package/dist/decoder-nodeav/index.js.map +0 -1
- package/dist/decoder-nodeav/index.mjs.map +0 -1
- package/dist/detection-pipeline/index.js.map +0 -1
- package/dist/detection-pipeline/index.mjs.map +0 -1
- package/dist/index-5aYef068.mjs +0 -17514
- package/dist/index-5aYef068.mjs.map +0 -1
- package/dist/index-B36NMAdu.js +0 -17513
- package/dist/index-B36NMAdu.js.map +0 -1
- package/dist/index-CMcx_k6Y.js.map +0 -1
- package/dist/index-CYb7cFrv.mjs +0 -5790
- package/dist/index-CYb7cFrv.mjs.map +0 -1
- package/dist/motion-wasm/index.js.map +0 -1
- package/dist/motion-wasm/index.mjs.map +0 -1
- package/dist/pipeline-runner/index.js.map +0 -1
- package/dist/pipeline-runner/index.mjs.map +0 -1
- package/dist/recorder/index.js.map +0 -1
- package/dist/recorder/index.mjs.map +0 -1
- package/dist/stream-broker/@mf-types/compiled-types/stream-broker/widgets/FfmpegParamsField.d.ts +0 -41
- package/dist/stream-broker/@mf-types/compiled-types/stream-broker/widgets/GeometryBuilder.d.ts +0 -54
- package/dist/stream-broker/@mf-types/compiled-types/stream-broker/widgets/StreamBrokerPanel.d.ts +0 -21
- package/dist/stream-broker/@mf-types/compiled-types/stream-broker/widgets/format-ua.d.ts +0 -13
- package/dist/stream-broker/@mf-types/compiled-types/stream-broker/widgets/index.d.ts +0 -15
- package/dist/stream-broker/@mf-types/widgets.d.ts +0 -2
- package/dist/stream-broker/@mf-types.d.ts +0 -3
- package/dist/stream-broker/@mf-types.zip +0 -0
- package/dist/stream-broker/__mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_sdk__loadShare__.mjs-lantnv8e.mjs +0 -12
- package/dist/stream-broker/__mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.mjs-DJ3UNg7O.mjs +0 -30
- package/dist/stream-broker/__mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.mjs-CYXy_bhS.mjs +0 -21
- package/dist/stream-broker/__mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.mjs-U1EUeEPs.mjs +0 -104
- package/dist/stream-broker/__mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_trpc_mf_1_client__loadShare__.mjs-DeouEaSs.mjs +0 -85
- package/dist/stream-broker/__mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_trpc_mf_1_react_mf_2_query__loadShare__.mjs-DHUwjbb9.mjs +0 -62
- package/dist/stream-broker/__mfe_internal__addon_stream_broker_widgets__loadShare__react__loadShare__.mjs-CaDEYBIU.mjs +0 -89
- package/dist/stream-broker/__mfe_internal__addon_stream_broker_widgets__loadShare__react__loadShare__.mjs_commonjs-proxy-D6EROtlA.mjs +0 -29
- package/dist/stream-broker/__mfe_internal__addon_stream_broker_widgets__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.mjs-x6pP3Ghk.mjs +0 -36
- package/dist/stream-broker/__mfe_internal__addon_stream_broker_widgets__loadShare__react_mf_2_dom__loadShare__.mjs-DYEKzzY-.mjs +0 -45
- package/dist/stream-broker/__mfe_internal__addon_stream_broker_widgets__loadShare__react_mf_2_dom__loadShare__.mjs_commonjs-proxy-CcnN6sbA.mjs +0 -6
- package/dist/stream-broker/__mfe_internal__addon_stream_broker_widgets__loadShare__react_mf_2_dom_mf_1_client__loadShare__.mjs-DICOtMTl.mjs +0 -34
- package/dist/stream-broker/_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-CL9DR49k.mjs +0 -156
- package/dist/stream-broker/client-BvTmMOQu.mjs +0 -9836
- package/dist/stream-broker/getErrorShape-BPSzUA7W-TlK8ipWe.mjs +0 -211
- package/dist/stream-broker/hostInit-ChmiMPS0.mjs +0 -168
- package/dist/stream-broker/index-BxsFuFmE.mjs +0 -2603
- package/dist/stream-broker/index-C-248uOU.mjs +0 -725
- package/dist/stream-broker/index-C05B6jqp.mjs +0 -185
- package/dist/stream-broker/index-CWkKuNLr.mjs +0 -232
- package/dist/stream-broker/index-DOJoSShD.mjs +0 -67784
- package/dist/stream-broker/index-DtOI1aTU.mjs +0 -18504
- package/dist/stream-broker/index-oMq6ilgR.mjs +0 -1641
- package/dist/stream-broker/index-vIWZQBIL.mjs +0 -435
- package/dist/stream-broker/index-xncRG7-x.mjs +0 -2713
- package/dist/stream-broker/index.js.map +0 -1
- package/dist/stream-broker/index.mjs.map +0 -1
- package/dist/stream-broker/jsx-runtime-BRT_HL0A.mjs +0 -55
- package/dist/stream-broker/schemas-B7L0qZtq.mjs +0 -3599
- package/dist/stream-broker/virtualExposes-pCd777Rp.mjs +0 -42
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! tailwindcss v4.3.1 | MIT License | https://tailwindcss.com */
|
|
2
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-950:oklch(25.8% .092 26.042);--color-orange-300:oklch(83.7% .128 66.29);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-950:oklch(27.9% .077 45.635);--color-green-50:oklch(98.2% .018 155.826);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-950:oklch(26.6% .065 152.934);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-700:oklch(50.8% .118 165.612);--color-emerald-900:oklch(37.8% .077 168.94);--color-emerald-950:oklch(26.2% .051 172.552);--color-cyan-50:oklch(98.4% .019 200.873);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-500:oklch(71.5% .143 215.221);--color-cyan-600:oklch(60.9% .126 221.723);--color-cyan-950:oklch(30.2% .056 229.695);--color-sky-50:oklch(97.7% .013 236.62);--color-sky-200:oklch(90.1% .058 230.902);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-500:oklch(68.5% .169 237.323);--color-blue-50:oklch(97% .014 254.604);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-950:oklch(28.2% .091 267.935);--color-violet-400:oklch(70.2% .183 293.541);--color-violet-500:oklch(60.6% .25 292.717);--color-purple-50:oklch(97.7% .014 308.299);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-950:oklch(29.1% .149 302.717);--color-fuchsia-50:oklch(97.7% .017 320.058);--color-fuchsia-400:oklch(74% .238 322.16);--color-fuchsia-600:oklch(59.1% .293 322.896);--color-fuchsia-950:oklch(29.3% .136 325.661);--color-pink-400:oklch(71.8% .202 349.761);--color-pink-500:oklch(65.6% .241 354.308);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-500:oklch(64.5% .246 16.439);--color-slate-50:oklch(98.4% .003 247.858);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-950:oklch(12.9% .042 264.695);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-zinc-50:oklch(98.5% 0 0);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-700:oklch(37% .013 285.805);--color-zinc-800:oklch(27.4% .006 286.033);--color-zinc-900:oklch(21% .006 285.885);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-sm:4px;--radius-md:6px;--radius-lg:8px;--radius-xl:12px;--ease-out:cubic-bezier(0, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--blur-md:12px;--aspect-video:16 / 9;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-primary:#f59e42;--color-primary-foreground:#0c0a09;--color-background:#0c0a09;--color-background-elevated:#1c1917;--color-surface:#1c1917;--color-surface-hover:#292524;--color-border:#292524;--color-border-subtle:#1c1917;--color-foreground:#fafaf9;--color-foreground-muted:#a8a29e;--color-foreground-subtle:#78716c;--color-foreground-disabled:#57534e;--color-success:#4ade80;--color-warning:#fbbf24;--color-danger:#f87171;--color-info:#60a5fa;--color-provider-frigate:#3b82f6;--color-provider-scrypted:#a855f7;--color-provider-reolink:#06b6d4;--color-provider-rtsp:#78716c}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.\@container{container-type:inline-size}.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:0}.-inset-x-1\.5{inset-inline:calc(var(--spacing) * -1.5)}.inset-x-0{inset-inline:0}.inset-x-2{inset-inline:calc(var(--spacing) * 2)}.inset-y-0{inset-block:0}.inset-y-\[-2px\]{inset-block:-2px}.-top-1{top:calc(var(--spacing) * -1)}.-top-4{top:calc(var(--spacing) * -4)}.top-0{top:0}.top-0\.5{top:calc(var(--spacing) * .5)}.top-1{top:var(--spacing)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-3{top:calc(var(--spacing) * 3)}.top-full{top:100%}.right-0{right:0}.right-1{right:var(--spacing)}.right-1\.5{right:calc(var(--spacing) * 1.5)}.right-2{right:calc(var(--spacing) * 2)}.right-2\.5{right:calc(var(--spacing) * 2.5)}.right-3{right:calc(var(--spacing) * 3)}.bottom-0{bottom:0}.bottom-1{bottom:var(--spacing)}.bottom-2{bottom:calc(var(--spacing) * 2)}.bottom-full{bottom:100%}.left-0{left:0}.left-0\.5{left:calc(var(--spacing) * .5)}.left-1{left:var(--spacing)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing) * 2)}.left-2\.5{left:calc(var(--spacing) * 2.5)}.left-auto{left:auto}.left-full{left:100%}.isolate{isolation:isolate}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[1\]{z-index:1}.z-\[5\]{z-index:5}.z-\[9999\]{z-index:9999}.col-span-1{grid-column:span 1/span 1}.col-span-2{grid-column:span 2/span 2}.col-span-3{grid-column:span 3/span 3}.col-span-4{grid-column:span 4/span 4}.col-span-full{grid-column:1/-1}.\!container{width:100%!important}@media (width>=40rem){.\!container{max-width:40rem!important}}@media (width>=48rem){.\!container{max-width:48rem!important}}@media (width>=64rem){.\!container{max-width:64rem!important}}@media (width>=80rem){.\!container{max-width:80rem!important}}@media (width>=96rem){.\!container{max-width:96rem!important}}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.m-0{margin:0}.mx-0\.5{margin-inline:calc(var(--spacing) * .5)}.mx-1{margin-inline:var(--spacing)}.mx-4{margin-inline:calc(var(--spacing) * 4)}.my-1{margin-block:var(--spacing)}.my-2{margin-block:calc(var(--spacing) * 2)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-auto{margin-top:auto}.mr-0\.5{margin-right:calc(var(--spacing) * .5)}.mr-1{margin-right:var(--spacing)}.-mb-1{margin-bottom:calc(var(--spacing) * -1)}.mb-0{margin-bottom:0}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.-ml-1\.5{margin-left:calc(var(--spacing) * -1.5)}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-5{margin-left:calc(var(--spacing) * 5)}.ml-auto{margin-left:auto}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.table-row{display:table-row}.aspect-video{aspect-ratio:var(--aspect-video)}.h-1{height:var(--spacing)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-16{height:calc(var(--spacing) * 16)}.h-20{height:calc(var(--spacing) * 20)}.h-28{height:calc(var(--spacing) * 28)}.h-36{height:calc(var(--spacing) * 36)}.h-40{height:calc(var(--spacing) * 40)}.h-48{height:calc(var(--spacing) * 48)}.h-\[18px\]{height:18px}.h-\[150px\]{height:150px}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-80{max-height:calc(var(--spacing) * 80)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[80dvh\]{max-height:80dvh}.max-h-\[calc\(100dvh-2rem\)\]{max-height:calc(100dvh - 2rem)}.min-h-0{min-height:0}.min-h-\[38px\]{min-height:38px}.min-h-\[44px\]{min-height:44px}.min-h-\[60px\]{min-height:60px}.min-h-\[96px\]{min-height:96px}.min-h-screen{min-height:100vh}.w-0\.5{width:calc(var(--spacing) * .5)}.w-1{width:var(--spacing)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-1\/2{width:50%}.w-1\/3{width:33.3333%}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-2\/3{width:66.6667%}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-3\/4{width:75%}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-12{width:calc(var(--spacing) * 12)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-28{width:calc(var(--spacing) * 28)}.w-32{width:calc(var(--spacing) * 32)}.w-36{width:calc(var(--spacing) * 36)}.w-40{width:calc(var(--spacing) * 40)}.w-44{width:calc(var(--spacing) * 44)}.w-48{width:calc(var(--spacing) * 48)}.w-56{width:calc(var(--spacing) * 56)}.w-64{width:calc(var(--spacing) * 64)}.w-72{width:calc(var(--spacing) * 72)}.w-\[18px\]{width:18px}.w-\[70px\]{width:70px}.w-\[140px\]{width:140px}.w-\[150px\]{width:150px}.w-\[180px\]{width:180px}.w-\[200px\]{width:200px}.w-\[360px\]{width:360px}.w-\[calc\(100vw-2rem\)\]{width:calc(100vw - 2rem)}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.max-w-\[10rem\]{max-width:10rem}.max-w-\[16rem\]{max-width:16rem}.max-w-\[120px\]{max-width:120px}.max-w-\[140px\]{max-width:140px}.max-w-\[160px\]{max-width:160px}.max-w-\[200px\]{max-width:200px}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.min-w-7{min-width:calc(var(--spacing) * 7)}.min-w-\[44px\]{min-width:44px}.min-w-\[80px\]{min-width:80px}.min-w-\[120px\]{min-width:120px}.min-w-\[140px\]{min-width:140px}.min-w-\[160px\]{min-width:160px}.min-w-\[180px\]{min-width:180px}.min-w-\[200px\]{min-width:200px}.min-w-\[Npx\]{min-width:Npx}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.basis-\[160px\]{flex-basis:160px}.border-collapse{border-collapse:collapse}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-px{--tw-translate-x:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0{--tw-translate-x:0;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0\.5{--tw-translate-x:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-1{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-3\.5{--tw-translate-x:calc(var(--spacing) * 3.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-4{--tw-translate-x:calc(var(--spacing) * 4);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-6{--tw-translate-x:calc(var(--spacing) * 6);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-px{--tw-translate-y:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-0{--tw-translate-y:0;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-full{--tw-translate-y:100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.transform-gpu{transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-\[dash_1\.5s_ease-in-out_infinite\]{animation:1.5s ease-in-out infinite dash}.animate-ping{animation:var(--animate-ping)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}.cursor-help{cursor:help}.cursor-move{cursor:move}.cursor-not-allowed{cursor:not-allowed}.cursor-ns-resize{cursor:ns-resize}.cursor-nwse-resize{cursor:nwse-resize}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.cursor-wait{cursor:wait}.touch-none{touch-action:none}.resize{resize:both}.resize-y{resize:vertical}.appearance-none{appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-nowrap{flex-wrap:nowrap}.flex-wrap{flex-wrap:wrap}.content-start{align-content:flex-start}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-px{gap:1px}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.gap-y-1{row-gap:var(--spacing)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.gap-y-2\.5{row-gap:calc(var(--spacing) * 2.5)}.gap-y-3{row-gap:calc(var(--spacing) * 3)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border>:not(:last-child)){border-color:var(--color-border)}:where(.divide-border-subtle>:not(:last-child)){border-color:var(--color-border-subtle)}:where(.divide-border\/30>:not(:last-child)){border-color:#2925244d}@supports (color:color-mix(in lab, red, red)){:where(.divide-border\/30>:not(:last-child)){border-color:color-mix(in oklab, var(--color-border) 30%, transparent)}}:where(.divide-border\/50>:not(:last-child)){border-color:#29252480}@supports (color:color-mix(in lab, red, red)){:where(.divide-border\/50>:not(:last-child)){border-color:color-mix(in oklab, var(--color-border) 50%, transparent)}}.self-center{align-self:center}.self-end{align-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[19px\]{border-radius:19px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-sm{border-top-left-radius:var(--radius-sm);border-top-right-radius:var(--radius-sm)}.rounded-t-xl{border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}.rounded-r-md{border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-x{border-inline-style:var(--tw-border-style);border-inline-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-r-0{border-right-style:var(--tw-border-style);border-right-width:0}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-200{border-color:var(--color-amber-200)}.border-amber-400{border-color:var(--color-amber-400)}.border-amber-500\/30{border-color:#f99c004d}@supports (color:color-mix(in lab, red, red)){.border-amber-500\/30{border-color:color-mix(in oklab, var(--color-amber-500) 30%, transparent)}}.border-amber-500\/40{border-color:#f99c0066}@supports (color:color-mix(in lab, red, red)){.border-amber-500\/40{border-color:color-mix(in oklab, var(--color-amber-500) 40%, transparent)}}.border-amber-700\/60{border-color:#b7500099}@supports (color:color-mix(in lab, red, red)){.border-amber-700\/60{border-color:color-mix(in oklab, var(--color-amber-700) 60%, transparent)}}.border-blue-400{border-color:var(--color-blue-400)}.border-blue-500\/30{border-color:#3080ff4d}@supports (color:color-mix(in lab, red, red)){.border-blue-500\/30{border-color:color-mix(in oklab, var(--color-blue-500) 30%, transparent)}}.border-border{border-color:var(--color-border)}.border-border-subtle{border-color:var(--color-border-subtle)}.border-border-subtle\/40{border-color:#1c191766}@supports (color:color-mix(in lab, red, red)){.border-border-subtle\/40{border-color:color-mix(in oklab, var(--color-border-subtle) 40%, transparent)}}.border-border-subtle\/50{border-color:#1c191780}@supports (color:color-mix(in lab, red, red)){.border-border-subtle\/50{border-color:color-mix(in oklab, var(--color-border-subtle) 50%, transparent)}}.border-border\/30{border-color:#2925244d}@supports (color:color-mix(in lab, red, red)){.border-border\/30{border-color:color-mix(in oklab, var(--color-border) 30%, transparent)}}.border-border\/40{border-color:#29252466}@supports (color:color-mix(in lab, red, red)){.border-border\/40{border-color:color-mix(in oklab, var(--color-border) 40%, transparent)}}.border-border\/50{border-color:#29252480}@supports (color:color-mix(in lab, red, red)){.border-border\/50{border-color:color-mix(in oklab, var(--color-border) 50%, transparent)}}.border-border\/60{border-color:#29252499}@supports (color:color-mix(in lab, red, red)){.border-border\/60{border-color:color-mix(in oklab, var(--color-border) 60%, transparent)}}.border-current\/30{border-color:currentColor}@supports (color:color-mix(in lab, red, red)){.border-current\/30{border-color:color-mix(in oklab, currentcolor 30%, transparent)}}.border-cyan-400{border-color:var(--color-cyan-400)}.border-cyan-500\/30{border-color:#00b7d74d}@supports (color:color-mix(in lab, red, red)){.border-cyan-500\/30{border-color:color-mix(in oklab, var(--color-cyan-500) 30%, transparent)}}.border-danger{border-color:var(--color-danger)}.border-danger\/20{border-color:#f8717133}@supports (color:color-mix(in lab, red, red)){.border-danger\/20{border-color:color-mix(in oklab, var(--color-danger) 20%, transparent)}}.border-danger\/30{border-color:#f871714d}@supports (color:color-mix(in lab, red, red)){.border-danger\/30{border-color:color-mix(in oklab, var(--color-danger) 30%, transparent)}}.border-danger\/40{border-color:#f8717166}@supports (color:color-mix(in lab, red, red)){.border-danger\/40{border-color:color-mix(in oklab, var(--color-danger) 40%, transparent)}}.border-emerald-200{border-color:var(--color-emerald-200)}.border-emerald-500\/30{border-color:#00bb7f4d}@supports (color:color-mix(in lab, red, red)){.border-emerald-500\/30{border-color:color-mix(in oklab, var(--color-emerald-500) 30%, transparent)}}.border-emerald-500\/40{border-color:#00bb7f66}@supports (color:color-mix(in lab, red, red)){.border-emerald-500\/40{border-color:color-mix(in oklab, var(--color-emerald-500) 40%, transparent)}}.border-foreground-subtle\/20{border-color:#78716c33}@supports (color:color-mix(in lab, red, red)){.border-foreground-subtle\/20{border-color:color-mix(in oklab, var(--color-foreground-subtle) 20%, transparent)}}.border-foreground-subtle\/60{border-color:#78716c99}@supports (color:color-mix(in lab, red, red)){.border-foreground-subtle\/60{border-color:color-mix(in oklab, var(--color-foreground-subtle) 60%, transparent)}}.border-fuchsia-400{border-color:var(--color-fuchsia-400)}.border-gray-500\/40{border-color:#6a728266}@supports (color:color-mix(in lab, red, red)){.border-gray-500\/40{border-color:color-mix(in oklab, var(--color-gray-500) 40%, transparent)}}.border-green-400{border-color:var(--color-green-400)}.border-info{border-color:var(--color-info)}.border-orange-500\/20{border-color:#fe6e0033}@supports (color:color-mix(in lab, red, red)){.border-orange-500\/20{border-color:color-mix(in oklab, var(--color-orange-500) 20%, transparent)}}.border-orange-500\/30{border-color:#fe6e004d}@supports (color:color-mix(in lab, red, red)){.border-orange-500\/30{border-color:color-mix(in oklab, var(--color-orange-500) 30%, transparent)}}.border-pink-500\/30{border-color:#f6339a4d}@supports (color:color-mix(in lab, red, red)){.border-pink-500\/30{border-color:color-mix(in oklab, var(--color-pink-500) 30%, transparent)}}.border-primary{border-color:var(--color-primary)}.border-primary\/30{border-color:#f59e424d}@supports (color:color-mix(in lab, red, red)){.border-primary\/30{border-color:color-mix(in oklab, var(--color-primary) 30%, transparent)}}.border-primary\/40{border-color:#f59e4266}@supports (color:color-mix(in lab, red, red)){.border-primary\/40{border-color:color-mix(in oklab, var(--color-primary) 40%, transparent)}}.border-primary\/50{border-color:#f59e4280}@supports (color:color-mix(in lab, red, red)){.border-primary\/50{border-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.border-purple-400{border-color:var(--color-purple-400)}.border-purple-500\/30{border-color:#ac4bff4d}@supports (color:color-mix(in lab, red, red)){.border-purple-500\/30{border-color:color-mix(in oklab, var(--color-purple-500) 30%, transparent)}}.border-red-500\/30{border-color:#fb2c364d}@supports (color:color-mix(in lab, red, red)){.border-red-500\/30{border-color:color-mix(in oklab, var(--color-red-500) 30%, transparent)}}.border-red-500\/40{border-color:#fb2c3666}@supports (color:color-mix(in lab, red, red)){.border-red-500\/40{border-color:color-mix(in oklab, var(--color-red-500) 40%, transparent)}}.border-red-500\/50{border-color:#fb2c3680}@supports (color:color-mix(in lab, red, red)){.border-red-500\/50{border-color:color-mix(in oklab, var(--color-red-500) 50%, transparent)}}.border-sky-500\/30{border-color:#00a5ef4d}@supports (color:color-mix(in lab, red, red)){.border-sky-500\/30{border-color:color-mix(in oklab, var(--color-sky-500) 30%, transparent)}}.border-slate-400{border-color:var(--color-slate-400)}.border-success{border-color:var(--color-success)}.border-success\/30{border-color:#4ade804d}@supports (color:color-mix(in lab, red, red)){.border-success\/30{border-color:color-mix(in oklab, var(--color-success) 30%, transparent)}}.border-success\/40{border-color:#4ade8066}@supports (color:color-mix(in lab, red, red)){.border-success\/40{border-color:color-mix(in oklab, var(--color-success) 40%, transparent)}}.border-success\/50{border-color:#4ade8080}@supports (color:color-mix(in lab, red, red)){.border-success\/50{border-color:color-mix(in oklab, var(--color-success) 50%, transparent)}}.border-transparent{border-color:#0000}.border-violet-500\/30{border-color:#8d54ff4d}@supports (color:color-mix(in lab, red, red)){.border-violet-500\/30{border-color:color-mix(in oklab, var(--color-violet-500) 30%, transparent)}}.border-warning{border-color:var(--color-warning)}.border-warning\/30{border-color:#fbbf244d}@supports (color:color-mix(in lab, red, red)){.border-warning\/30{border-color:color-mix(in oklab, var(--color-warning) 30%, transparent)}}.border-warning\/40{border-color:#fbbf2466}@supports (color:color-mix(in lab, red, red)){.border-warning\/40{border-color:color-mix(in oklab, var(--color-warning) 40%, transparent)}}.border-white\/20{border-color:#fff3}@supports (color:color-mix(in lab, red, red)){.border-white\/20{border-color:color-mix(in oklab, var(--color-white) 20%, transparent)}}.border-white\/30{border-color:#ffffff4d}@supports (color:color-mix(in lab, red, red)){.border-white\/30{border-color:color-mix(in oklab, var(--color-white) 30%, transparent)}}.border-zinc-300{border-color:var(--color-zinc-300)}.border-zinc-700{border-color:var(--color-zinc-700)}.border-t-white\/60{border-top-color:#fff9}@supports (color:color-mix(in lab, red, red)){.border-t-white\/60{border-top-color:color-mix(in oklab, var(--color-white) 60%, transparent)}}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-400{background-color:var(--color-amber-400)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\/5{background-color:#f99c000d}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\/5{background-color:color-mix(in oklab, var(--color-amber-500) 5%, transparent)}}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\/10{background-color:color-mix(in oklab, var(--color-amber-500) 10%, transparent)}}.bg-amber-500\/15{background-color:#f99c0026}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\/15{background-color:color-mix(in oklab, var(--color-amber-500) 15%, transparent)}}.bg-background{background-color:var(--color-background)}.bg-background-elevated{background-color:var(--color-background-elevated)}.bg-background\/40{background-color:#0c0a0966}@supports (color:color-mix(in lab, red, red)){.bg-background\/40{background-color:color-mix(in oklab, var(--color-background) 40%, transparent)}}.bg-black{background-color:var(--color-black)}.bg-black\/0{background-color:#0000}@supports (color:color-mix(in lab, red, red)){.bg-black\/0{background-color:color-mix(in oklab, var(--color-black) 0%, transparent)}}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab, red, red)){.bg-black\/30{background-color:color-mix(in oklab, var(--color-black) 30%, transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.bg-black\/50{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.bg-black\/55{background-color:#0000008c}@supports (color:color-mix(in lab, red, red)){.bg-black\/55{background-color:color-mix(in oklab, var(--color-black) 55%, transparent)}}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab, red, red)){.bg-black\/60{background-color:color-mix(in oklab, var(--color-black) 60%, transparent)}}.bg-black\/70{background-color:#000000b3}@supports (color:color-mix(in lab, red, red)){.bg-black\/70{background-color:color-mix(in oklab, var(--color-black) 70%, transparent)}}.bg-black\/90{background-color:#000000e6}@supports (color:color-mix(in lab, red, red)){.bg-black\/90{background-color:color-mix(in oklab, var(--color-black) 90%, transparent)}}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-400{background-color:var(--color-blue-400)}.bg-blue-500\/8{background-color:#3080ff14}@supports (color:color-mix(in lab, red, red)){.bg-blue-500\/8{background-color:color-mix(in oklab, var(--color-blue-500) 8%, transparent)}}.bg-blue-500\/10{background-color:#3080ff1a}@supports (color:color-mix(in lab, red, red)){.bg-blue-500\/10{background-color:color-mix(in oklab, var(--color-blue-500) 10%, transparent)}}.bg-blue-500\/12{background-color:#3080ff1f}@supports (color:color-mix(in lab, red, red)){.bg-blue-500\/12{background-color:color-mix(in oklab, var(--color-blue-500) 12%, transparent)}}.bg-blue-500\/15{background-color:#3080ff26}@supports (color:color-mix(in lab, red, red)){.bg-blue-500\/15{background-color:color-mix(in oklab, var(--color-blue-500) 15%, transparent)}}.bg-border{background-color:var(--color-border)}.bg-border-subtle{background-color:var(--color-border-subtle)}.bg-cyan-50{background-color:var(--color-cyan-50)}.bg-cyan-400{background-color:var(--color-cyan-400)}.bg-cyan-500\/15{background-color:#00b7d726}@supports (color:color-mix(in lab, red, red)){.bg-cyan-500\/15{background-color:color-mix(in oklab, var(--color-cyan-500) 15%, transparent)}}.bg-danger{background-color:var(--color-danger)}.bg-danger\/5{background-color:#f871710d}@supports (color:color-mix(in lab, red, red)){.bg-danger\/5{background-color:color-mix(in oklab, var(--color-danger) 5%, transparent)}}.bg-danger\/10{background-color:#f871711a}@supports (color:color-mix(in lab, red, red)){.bg-danger\/10{background-color:color-mix(in oklab, var(--color-danger) 10%, transparent)}}.bg-danger\/15{background-color:#f8717126}@supports (color:color-mix(in lab, red, red)){.bg-danger\/15{background-color:color-mix(in oklab, var(--color-danger) 15%, transparent)}}.bg-danger\/90{background-color:#f87171e6}@supports (color:color-mix(in lab, red, red)){.bg-danger\/90{background-color:color-mix(in oklab, var(--color-danger) 90%, transparent)}}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-500\/5{background-color:#00bb7f0d}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\/5{background-color:color-mix(in oklab, var(--color-emerald-500) 5%, transparent)}}.bg-emerald-500\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\/10{background-color:color-mix(in oklab, var(--color-emerald-500) 10%, transparent)}}.bg-emerald-500\/15{background-color:#00bb7f26}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\/15{background-color:color-mix(in oklab, var(--color-emerald-500) 15%, transparent)}}.bg-foreground{background-color:var(--color-foreground)}.bg-foreground-subtle{background-color:var(--color-foreground-subtle)}.bg-foreground-subtle\/10{background-color:#78716c1a}@supports (color:color-mix(in lab, red, red)){.bg-foreground-subtle\/10{background-color:color-mix(in oklab, var(--color-foreground-subtle) 10%, transparent)}}.bg-foreground-subtle\/20{background-color:#78716c33}@supports (color:color-mix(in lab, red, red)){.bg-foreground-subtle\/20{background-color:color-mix(in oklab, var(--color-foreground-subtle) 20%, transparent)}}.bg-foreground-subtle\/30{background-color:#78716c4d}@supports (color:color-mix(in lab, red, red)){.bg-foreground-subtle\/30{background-color:color-mix(in oklab, var(--color-foreground-subtle) 30%, transparent)}}.bg-foreground-subtle\/40{background-color:#78716c66}@supports (color:color-mix(in lab, red, red)){.bg-foreground-subtle\/40{background-color:color-mix(in oklab, var(--color-foreground-subtle) 40%, transparent)}}.bg-foreground-subtle\/\[0\.03\]{background-color:#78716c08}@supports (color:color-mix(in lab, red, red)){.bg-foreground-subtle\/\[0\.03\]{background-color:color-mix(in oklab, var(--color-foreground-subtle) 3%, transparent)}}.bg-fuchsia-50{background-color:var(--color-fuchsia-50)}.bg-fuchsia-400{background-color:var(--color-fuchsia-400)}.bg-gray-300{background-color:var(--color-gray-300)}.bg-gray-400{background-color:var(--color-gray-400)}.bg-gray-500\/10{background-color:#6a72821a}@supports (color:color-mix(in lab, red, red)){.bg-gray-500\/10{background-color:color-mix(in oklab, var(--color-gray-500) 10%, transparent)}}.bg-green-50{background-color:var(--color-green-50)}.bg-green-400{background-color:var(--color-green-400)}.bg-green-500{background-color:var(--color-green-500)}.bg-green-500\/8{background-color:#00c75814}@supports (color:color-mix(in lab, red, red)){.bg-green-500\/8{background-color:color-mix(in oklab, var(--color-green-500) 8%, transparent)}}.bg-green-500\/12{background-color:#00c7581f}@supports (color:color-mix(in lab, red, red)){.bg-green-500\/12{background-color:color-mix(in oklab, var(--color-green-500) 12%, transparent)}}.bg-green-500\/20{background-color:#00c75833}@supports (color:color-mix(in lab, red, red)){.bg-green-500\/20{background-color:color-mix(in oklab, var(--color-green-500) 20%, transparent)}}.bg-info\/5{background-color:#60a5fa0d}@supports (color:color-mix(in lab, red, red)){.bg-info\/5{background-color:color-mix(in oklab, var(--color-info) 5%, transparent)}}.bg-info\/15{background-color:#60a5fa26}@supports (color:color-mix(in lab, red, red)){.bg-info\/15{background-color:color-mix(in oklab, var(--color-info) 15%, transparent)}}.bg-orange-500{background-color:var(--color-orange-500)}.bg-orange-500\/10{background-color:#fe6e001a}@supports (color:color-mix(in lab, red, red)){.bg-orange-500\/10{background-color:color-mix(in oklab, var(--color-orange-500) 10%, transparent)}}.bg-orange-500\/15{background-color:#fe6e0026}@supports (color:color-mix(in lab, red, red)){.bg-orange-500\/15{background-color:color-mix(in oklab, var(--color-orange-500) 15%, transparent)}}.bg-pink-500\/15{background-color:#f6339a26}@supports (color:color-mix(in lab, red, red)){.bg-pink-500\/15{background-color:color-mix(in oklab, var(--color-pink-500) 15%, transparent)}}.bg-primary{background-color:var(--color-primary)}.bg-primary-foreground\/20{background-color:#0c0a0933}@supports (color:color-mix(in lab, red, red)){.bg-primary-foreground\/20{background-color:color-mix(in oklab, var(--color-primary-foreground) 20%, transparent)}}.bg-primary\/5{background-color:#f59e420d}@supports (color:color-mix(in lab, red, red)){.bg-primary\/5{background-color:color-mix(in oklab, var(--color-primary) 5%, transparent)}}.bg-primary\/10{background-color:#f59e421a}@supports (color:color-mix(in lab, red, red)){.bg-primary\/10{background-color:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.bg-primary\/15{background-color:#f59e4226}@supports (color:color-mix(in lab, red, red)){.bg-primary\/15{background-color:color-mix(in oklab, var(--color-primary) 15%, transparent)}}.bg-primary\/20{background-color:#f59e4233}@supports (color:color-mix(in lab, red, red)){.bg-primary\/20{background-color:color-mix(in oklab, var(--color-primary) 20%, transparent)}}.bg-primary\/80{background-color:#f59e42cc}@supports (color:color-mix(in lab, red, red)){.bg-primary\/80{background-color:color-mix(in oklab, var(--color-primary) 80%, transparent)}}.bg-primary\/\[0\.08\]{background-color:#f59e4214}@supports (color:color-mix(in lab, red, red)){.bg-primary\/\[0\.08\]{background-color:color-mix(in oklab, var(--color-primary) 8%, transparent)}}.bg-provider-frigate{background-color:var(--color-provider-frigate)}.bg-provider-reolink{background-color:var(--color-provider-reolink)}.bg-provider-rtsp{background-color:var(--color-provider-rtsp)}.bg-provider-scrypted{background-color:var(--color-provider-scrypted)}.bg-purple-50{background-color:var(--color-purple-50)}.bg-purple-400{background-color:var(--color-purple-400)}.bg-purple-500\/15{background-color:#ac4bff26}@supports (color:color-mix(in lab, red, red)){.bg-purple-500\/15{background-color:color-mix(in oklab, var(--color-purple-500) 15%, transparent)}}.bg-red-400{background-color:var(--color-red-400)}.bg-red-500{background-color:var(--color-red-500)}.bg-red-500\/10{background-color:#fb2c361a}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/10{background-color:color-mix(in oklab, var(--color-red-500) 10%, transparent)}}.bg-red-500\/15{background-color:#fb2c3626}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/15{background-color:color-mix(in oklab, var(--color-red-500) 15%, transparent)}}.bg-red-500\/20{background-color:#fb2c3633}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/20{background-color:color-mix(in oklab, var(--color-red-500) 20%, transparent)}}.bg-rose-500{background-color:var(--color-rose-500)}.bg-sky-500\/15{background-color:#00a5ef26}@supports (color:color-mix(in lab, red, red)){.bg-sky-500\/15{background-color:color-mix(in oklab, var(--color-sky-500) 15%, transparent)}}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-400{background-color:var(--color-slate-400)}.bg-slate-600{background-color:var(--color-slate-600)}.bg-success{background-color:var(--color-success)}.bg-success\/5{background-color:#4ade800d}@supports (color:color-mix(in lab, red, red)){.bg-success\/5{background-color:color-mix(in oklab, var(--color-success) 5%, transparent)}}.bg-success\/10{background-color:#4ade801a}@supports (color:color-mix(in lab, red, red)){.bg-success\/10{background-color:color-mix(in oklab, var(--color-success) 10%, transparent)}}.bg-success\/15{background-color:#4ade8026}@supports (color:color-mix(in lab, red, red)){.bg-success\/15{background-color:color-mix(in oklab, var(--color-success) 15%, transparent)}}.bg-success\/30{background-color:#4ade804d}@supports (color:color-mix(in lab, red, red)){.bg-success\/30{background-color:color-mix(in oklab, var(--color-success) 30%, transparent)}}.bg-surface{background-color:var(--color-surface)}.bg-surface-hover{background-color:var(--color-surface-hover)}.bg-surface-hover\/10{background-color:#2925241a}@supports (color:color-mix(in lab, red, red)){.bg-surface-hover\/10{background-color:color-mix(in oklab, var(--color-surface-hover) 10%, transparent)}}.bg-surface-hover\/20{background-color:#29252433}@supports (color:color-mix(in lab, red, red)){.bg-surface-hover\/20{background-color:color-mix(in oklab, var(--color-surface-hover) 20%, transparent)}}.bg-surface-hover\/30{background-color:#2925244d}@supports (color:color-mix(in lab, red, red)){.bg-surface-hover\/30{background-color:color-mix(in oklab, var(--color-surface-hover) 30%, transparent)}}.bg-surface-hover\/40{background-color:#29252466}@supports (color:color-mix(in lab, red, red)){.bg-surface-hover\/40{background-color:color-mix(in oklab, var(--color-surface-hover) 40%, transparent)}}.bg-surface\/40{background-color:#1c191766}@supports (color:color-mix(in lab, red, red)){.bg-surface\/40{background-color:color-mix(in oklab, var(--color-surface) 40%, transparent)}}.bg-surface\/50{background-color:#1c191780}@supports (color:color-mix(in lab, red, red)){.bg-surface\/50{background-color:color-mix(in oklab, var(--color-surface) 50%, transparent)}}.bg-surface\/80{background-color:#1c1917cc}@supports (color:color-mix(in lab, red, red)){.bg-surface\/80{background-color:color-mix(in oklab, var(--color-surface) 80%, transparent)}}.bg-surface\/95{background-color:#1c1917f2}@supports (color:color-mix(in lab, red, red)){.bg-surface\/95{background-color:color-mix(in oklab, var(--color-surface) 95%, transparent)}}.bg-transparent{background-color:#0000}.bg-violet-500{background-color:var(--color-violet-500)}.bg-violet-500\/10{background-color:#8d54ff1a}@supports (color:color-mix(in lab, red, red)){.bg-violet-500\/10{background-color:color-mix(in oklab, var(--color-violet-500) 10%, transparent)}}.bg-violet-500\/15{background-color:#8d54ff26}@supports (color:color-mix(in lab, red, red)){.bg-violet-500\/15{background-color:color-mix(in oklab, var(--color-violet-500) 15%, transparent)}}.bg-violet-500\/20{background-color:#8d54ff33}@supports (color:color-mix(in lab, red, red)){.bg-violet-500\/20{background-color:color-mix(in oklab, var(--color-violet-500) 20%, transparent)}}.bg-warning{background-color:var(--color-warning)}.bg-warning\/5{background-color:#fbbf240d}@supports (color:color-mix(in lab, red, red)){.bg-warning\/5{background-color:color-mix(in oklab, var(--color-warning) 5%, transparent)}}.bg-warning\/10{background-color:#fbbf241a}@supports (color:color-mix(in lab, red, red)){.bg-warning\/10{background-color:color-mix(in oklab, var(--color-warning) 10%, transparent)}}.bg-warning\/15{background-color:#fbbf2426}@supports (color:color-mix(in lab, red, red)){.bg-warning\/15{background-color:color-mix(in oklab, var(--color-warning) 15%, transparent)}}.bg-warning\/20{background-color:#fbbf2433}@supports (color:color-mix(in lab, red, red)){.bg-warning\/20{background-color:color-mix(in oklab, var(--color-warning) 20%, transparent)}}.bg-white{background-color:var(--color-white)}.bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.bg-white\/10{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.bg-white\/15{background-color:#ffffff26}@supports (color:color-mix(in lab, red, red)){.bg-white\/15{background-color:color-mix(in oklab, var(--color-white) 15%, transparent)}}.bg-white\/20{background-color:#fff3}@supports (color:color-mix(in lab, red, red)){.bg-white\/20{background-color:color-mix(in oklab, var(--color-white) 20%, transparent)}}.bg-white\/60{background-color:#fff9}@supports (color:color-mix(in lab, red, red)){.bg-white\/60{background-color:color-mix(in oklab, var(--color-white) 60%, transparent)}}.bg-white\/70{background-color:#ffffffb3}@supports (color:color-mix(in lab, red, red)){.bg-white\/70{background-color:color-mix(in oklab, var(--color-white) 70%, transparent)}}.bg-zinc-50{background-color:var(--color-zinc-50)}.bg-zinc-300{background-color:var(--color-zinc-300)}.bg-zinc-500{background-color:var(--color-zinc-500)}.bg-zinc-800{background-color:var(--color-zinc-800)}.bg-zinc-800\/80{background-color:#27272acc}@supports (color:color-mix(in lab, red, red)){.bg-zinc-800\/80{background-color:color-mix(in oklab, var(--color-zinc-800) 80%, transparent)}}.bg-zinc-900{background-color:var(--color-zinc-900)}.bg-zinc-900\/90{background-color:#18181be6}@supports (color:color-mix(in lab, red, red)){.bg-zinc-900\/90{background-color:color-mix(in oklab, var(--color-zinc-900) 90%, transparent)}}.bg-zinc-900\/95{background-color:#18181bf2}@supports (color:color-mix(in lab, red, red)){.bg-zinc-900\/95{background-color:color-mix(in oklab, var(--color-zinc-900) 95%, transparent)}}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-t{--tw-gradient-position:to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-black\/80{--tw-gradient-from:#000c}@supports (color:color-mix(in lab, red, red)){.from-black\/80{--tw-gradient-from:color-mix(in oklab, var(--color-black) 80%, transparent)}}.from-black\/80{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-emerald-700\/40{--tw-gradient-from:#00795666}@supports (color:color-mix(in lab, red, red)){.from-emerald-700\/40{--tw-gradient-from:color-mix(in oklab, var(--color-emerald-700) 40%, transparent)}}.from-emerald-700\/40{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-primary{--tw-gradient-from:var(--color-primary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-sky-200{--tw-gradient-from:var(--color-sky-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-surface-hover{--tw-gradient-from:var(--color-surface-hover);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-emerald-900\/30{--tw-gradient-to:#004e3b4d}@supports (color:color-mix(in lab, red, red)){.to-emerald-900\/30{--tw-gradient-to:color-mix(in oklab, var(--color-emerald-900) 30%, transparent)}}.to-emerald-900\/30{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-primary\/80{--tw-gradient-to:#f59e42cc}@supports (color:color-mix(in lab, red, red)){.to-primary\/80{--tw-gradient-to:color-mix(in oklab, var(--color-primary) 80%, transparent)}}.to-primary\/80{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-sky-50{--tw-gradient-to:var(--color-sky-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-surface{--tw-gradient-to:var(--color-surface);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.object-fill{object-fit:fill}.p-0{padding:0}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-0\.5{padding-inline:calc(var(--spacing) * .5)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.py-0{padding-block:0}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-px{padding-block:1px}.pt-0{padding-top:0}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-1{padding-top:var(--spacing)}.pt-1\.5{padding-top:calc(var(--spacing) * 1.5)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pt-\[env\(safe-area-inset-top\)\]{padding-top:env(safe-area-inset-top)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-2\.5{padding-right:calc(var(--spacing) * 2.5)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-5{padding-right:calc(var(--spacing) * 5)}.pr-6{padding-right:calc(var(--spacing) * 6)}.pr-7{padding-right:calc(var(--spacing) * 7)}.pr-9{padding-right:calc(var(--spacing) * 9)}.pr-10{padding-right:calc(var(--spacing) * 10)}.pb-1{padding-bottom:var(--spacing)}.pb-1\.5{padding-bottom:calc(var(--spacing) * 1.5)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-\[env\(safe-area-inset-bottom\)\]{padding-bottom:env(safe-area-inset-bottom)}.pl-1\.5{padding-left:calc(var(--spacing) * 1.5)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-6{padding-left:calc(var(--spacing) * 6)}.pl-7{padding-left:calc(var(--spacing) * 7)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.align-top{vertical-align:top}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[8\.5px\]{font-size:8.5px}.text-\[8px\]{font-size:8px}.text-\[9\.5px\]{font-size:9.5px}.text-\[9px\]{font-size:9px}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.leading-4{--tw-leading:calc(var(--spacing) * 4);line-height:calc(var(--spacing) * 4)}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-line{white-space:pre-line}.text-amber-400{color:var(--color-amber-400)}.text-amber-400\/60{color:#fcbb0099}@supports (color:color-mix(in lab, red, red)){.text-amber-400\/60{color:color-mix(in oklab, var(--color-amber-400) 60%, transparent)}}.text-amber-400\/80{color:#fcbb00cc}@supports (color:color-mix(in lab, red, red)){.text-amber-400\/80{color:color-mix(in oklab, var(--color-amber-400) 80%, transparent)}}.text-amber-500{color:var(--color-amber-500)}.text-amber-600{color:var(--color-amber-600)}.text-amber-700{color:var(--color-amber-700)}.text-amber-950{color:var(--color-amber-950)}.text-background{color:var(--color-background)}.text-blue-300{color:var(--color-blue-300)}.text-blue-400{color:var(--color-blue-400)}.text-blue-400\/50{color:#54a2ff80}@supports (color:color-mix(in lab, red, red)){.text-blue-400\/50{color:color-mix(in oklab, var(--color-blue-400) 50%, transparent)}}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-blue-950{color:var(--color-blue-950)}.text-cyan-400{color:var(--color-cyan-400)}.text-cyan-600{color:var(--color-cyan-600)}.text-cyan-950{color:var(--color-cyan-950)}.text-danger{color:var(--color-danger)}.text-danger\/80{color:#f87171cc}@supports (color:color-mix(in lab, red, red)){.text-danger\/80{color:color-mix(in oklab, var(--color-danger) 80%, transparent)}}.text-emerald-400{color:var(--color-emerald-400)}.text-emerald-500{color:var(--color-emerald-500)}.text-emerald-700{color:var(--color-emerald-700)}.text-emerald-950{color:var(--color-emerald-950)}.text-foreground{color:var(--color-foreground)}.text-foreground-disabled{color:var(--color-foreground-disabled)}.text-foreground-muted{color:var(--color-foreground-muted)}.text-foreground-subtle{color:var(--color-foreground-subtle)}.text-foreground-subtle\/25{color:#78716c40}@supports (color:color-mix(in lab, red, red)){.text-foreground-subtle\/25{color:color-mix(in oklab, var(--color-foreground-subtle) 25%, transparent)}}.text-foreground-subtle\/30{color:#78716c4d}@supports (color:color-mix(in lab, red, red)){.text-foreground-subtle\/30{color:color-mix(in oklab, var(--color-foreground-subtle) 30%, transparent)}}.text-foreground-subtle\/40{color:#78716c66}@supports (color:color-mix(in lab, red, red)){.text-foreground-subtle\/40{color:color-mix(in oklab, var(--color-foreground-subtle) 40%, transparent)}}.text-foreground-subtle\/50{color:#78716c80}@supports (color:color-mix(in lab, red, red)){.text-foreground-subtle\/50{color:color-mix(in oklab, var(--color-foreground-subtle) 50%, transparent)}}.text-foreground-subtle\/60{color:#78716c99}@supports (color:color-mix(in lab, red, red)){.text-foreground-subtle\/60{color:color-mix(in oklab, var(--color-foreground-subtle) 60%, transparent)}}.text-foreground-subtle\/70{color:#78716cb3}@supports (color:color-mix(in lab, red, red)){.text-foreground-subtle\/70{color:color-mix(in oklab, var(--color-foreground-subtle) 70%, transparent)}}.text-foreground-subtle\/80{color:#78716ccc}@supports (color:color-mix(in lab, red, red)){.text-foreground-subtle\/80{color:color-mix(in oklab, var(--color-foreground-subtle) 80%, transparent)}}.text-fuchsia-600{color:var(--color-fuchsia-600)}.text-fuchsia-950{color:var(--color-fuchsia-950)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-green-400{color:var(--color-green-400)}.text-green-400\/50{color:#05df7280}@supports (color:color-mix(in lab, red, red)){.text-green-400\/50{color:color-mix(in oklab, var(--color-green-400) 50%, transparent)}}.text-green-950{color:var(--color-green-950)}.text-info{color:var(--color-info)}.text-orange-300{color:var(--color-orange-300)}.text-orange-400{color:var(--color-orange-400)}.text-pink-400{color:var(--color-pink-400)}.text-pink-500{color:var(--color-pink-500)}.text-primary{color:var(--color-primary)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-primary\/70{color:#f59e42b3}@supports (color:color-mix(in lab, red, red)){.text-primary\/70{color:color-mix(in oklab, var(--color-primary) 70%, transparent)}}.text-purple-400{color:var(--color-purple-400)}.text-purple-600{color:var(--color-purple-600)}.text-purple-950{color:var(--color-purple-950)}.text-red-400{color:var(--color-red-400)}.text-red-950{color:var(--color-red-950)}.text-rose-400{color:var(--color-rose-400)}.text-sky-400{color:var(--color-sky-400)}.text-slate-600{color:var(--color-slate-600)}.text-slate-950{color:var(--color-slate-950)}.text-success{color:var(--color-success)}.text-violet-400{color:var(--color-violet-400)}.text-violet-500{color:var(--color-violet-500)}.text-warning{color:var(--color-warning)}.text-white{color:var(--color-white)}.text-white\/30{color:#ffffff4d}@supports (color:color-mix(in lab, red, red)){.text-white\/30{color:color-mix(in oklab, var(--color-white) 30%, transparent)}}.text-white\/40{color:#fff6}@supports (color:color-mix(in lab, red, red)){.text-white\/40{color:color-mix(in oklab, var(--color-white) 40%, transparent)}}.text-white\/60{color:#fff9}@supports (color:color-mix(in lab, red, red)){.text-white\/60{color:color-mix(in oklab, var(--color-white) 60%, transparent)}}.text-white\/80{color:#fffc}@supports (color:color-mix(in lab, red, red)){.text-white\/80{color:color-mix(in oklab, var(--color-white) 80%, transparent)}}.text-white\/90{color:#ffffffe6}@supports (color:color-mix(in lab, red, red)){.text-white\/90{color:color-mix(in oklab, var(--color-white) 90%, transparent)}}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-700{color:var(--color-zinc-700)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline{text-decoration-line:underline}.accent-primary{accent-color:var(--color-primary)}.accent-violet-500{accent-color:var(--color-violet-500)}.opacity-0{opacity:0}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.opacity-100{opacity:1}.opacity-\[0\.45\]{opacity:.45}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_0_6px\]{--tw-shadow:0 0 6px var(--tw-shadow-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring,.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-amber-500{--tw-shadow-color:oklch(76.9% .188 70.08)}@supports (color:color-mix(in lab, red, red)){.shadow-amber-500{--tw-shadow-color:color-mix(in oklab, var(--color-amber-500) var(--tw-shadow-alpha), transparent)}}.shadow-black\/10{--tw-shadow-color:#0000001a}@supports (color:color-mix(in lab, red, red)){.shadow-black\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/30{--tw-shadow-color:#0000004d}@supports (color:color-mix(in lab, red, red)){.shadow-black\/30{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 30%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/40{--tw-shadow-color:#0006}@supports (color:color-mix(in lab, red, red)){.shadow-black\/40{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 40%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-amber-400{--tw-ring-color:var(--color-amber-400)}.ring-primary{--tw-ring-color:var(--color-primary)}.ring-primary\/40{--tw-ring-color:#f59e4266}@supports (color:color-mix(in lab, red, red)){.ring-primary\/40{--tw-ring-color:color-mix(in oklab, var(--color-primary) 40%, transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.ring-inset{--tw-ring-inset:inset}@media (hover:hover){.group-hover\:bg-black\/30:is(:where(.group):hover *){background-color:#0000004d}@supports (color:color-mix(in lab, red, red)){.group-hover\:bg-black\/30:is(:where(.group):hover *){background-color:color-mix(in oklab, var(--color-black) 30%, transparent)}}.group-hover\:bg-surface-hover:is(:where(.group):hover *){background-color:var(--color-surface-hover)}.group-hover\:text-foreground-subtle:is(:where(.group):hover *){color:var(--color-foreground-subtle)}.group-hover\:text-primary\/60:is(:where(.group):hover *){color:#f59e4299}@supports (color:color-mix(in lab, red, red)){.group-hover\:text-primary\/60:is(:where(.group):hover *){color:color-mix(in oklab, var(--color-primary) 60%, transparent)}}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.group-hover\/sort\:opacity-30:is(:where(.group\/sort):hover *){opacity:.3}}.placeholder\:text-foreground-disabled::placeholder{color:var(--color-foreground-disabled)}.placeholder\:text-foreground-subtle::placeholder{color:var(--color-foreground-subtle)}.placeholder\:text-foreground-subtle\/60::placeholder{color:#78716c99}@supports (color:color-mix(in lab, red, red)){.placeholder\:text-foreground-subtle\/60::placeholder{color:color-mix(in oklab, var(--color-foreground-subtle) 60%, transparent)}}.backdrop\:bg-black\/50::backdrop{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.backdrop\:bg-black\/50::backdrop{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.backdrop\:backdrop-blur-sm::backdrop{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.focus-within\:border-primary:focus-within{border-color:var(--color-primary)}.focus-within\:ring-1:focus-within{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-within\:ring-primary\/30:focus-within{--tw-ring-color:#f59e424d}@supports (color:color-mix(in lab, red, red)){.focus-within\:ring-primary\/30:focus-within{--tw-ring-color:color-mix(in oklab, var(--color-primary) 30%, transparent)}}@media (hover:hover){.hover\:scale-110:hover{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:border-danger\/50:hover{border-color:#f8717180}@supports (color:color-mix(in lab, red, red)){.hover\:border-danger\/50:hover{border-color:color-mix(in oklab, var(--color-danger) 50%, transparent)}}.hover\:border-foreground-subtle\/30:hover{border-color:#78716c4d}@supports (color:color-mix(in lab, red, red)){.hover\:border-foreground-subtle\/30:hover{border-color:color-mix(in oklab, var(--color-foreground-subtle) 30%, transparent)}}.hover\:border-primary:hover{border-color:var(--color-primary)}.hover\:border-primary\/30:hover{border-color:#f59e424d}@supports (color:color-mix(in lab, red, red)){.hover\:border-primary\/30:hover{border-color:color-mix(in oklab, var(--color-primary) 30%, transparent)}}.hover\:border-primary\/40:hover{border-color:#f59e4266}@supports (color:color-mix(in lab, red, red)){.hover\:border-primary\/40:hover{border-color:color-mix(in oklab, var(--color-primary) 40%, transparent)}}.hover\:border-primary\/50:hover{border-color:#f59e4280}@supports (color:color-mix(in lab, red, red)){.hover\:border-primary\/50:hover{border-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.hover\:border-red-400\/40:hover{border-color:#ff656866}@supports (color:color-mix(in lab, red, red)){.hover\:border-red-400\/40:hover{border-color:color-mix(in oklab, var(--color-red-400) 40%, transparent)}}.hover\:border-white\/40:hover{border-color:#fff6}@supports (color:color-mix(in lab, red, red)){.hover\:border-white\/40:hover{border-color:color-mix(in oklab, var(--color-white) 40%, transparent)}}.hover\:bg-background\/60:hover{background-color:#0c0a0999}@supports (color:color-mix(in lab, red, red)){.hover\:bg-background\/60:hover{background-color:color-mix(in oklab, var(--color-background) 60%, transparent)}}.hover\:bg-black\/75:hover{background-color:#000000bf}@supports (color:color-mix(in lab, red, red)){.hover\:bg-black\/75:hover{background-color:color-mix(in oklab, var(--color-black) 75%, transparent)}}.hover\:bg-current\/10:hover{background-color:currentColor}@supports (color:color-mix(in lab, red, red)){.hover\:bg-current\/10:hover{background-color:color-mix(in oklab, currentcolor 10%, transparent)}}.hover\:bg-danger\/10:hover{background-color:#f871711a}@supports (color:color-mix(in lab, red, red)){.hover\:bg-danger\/10:hover{background-color:color-mix(in oklab, var(--color-danger) 10%, transparent)}}.hover\:bg-danger\/15:hover{background-color:#f8717126}@supports (color:color-mix(in lab, red, red)){.hover\:bg-danger\/15:hover{background-color:color-mix(in oklab, var(--color-danger) 15%, transparent)}}.hover\:bg-danger\/20:hover{background-color:#f8717133}@supports (color:color-mix(in lab, red, red)){.hover\:bg-danger\/20:hover{background-color:color-mix(in oklab, var(--color-danger) 20%, transparent)}}.hover\:bg-danger\/90:hover{background-color:#f87171e6}@supports (color:color-mix(in lab, red, red)){.hover\:bg-danger\/90:hover{background-color:color-mix(in oklab, var(--color-danger) 90%, transparent)}}.hover\:bg-foreground-subtle\/10:hover{background-color:#78716c1a}@supports (color:color-mix(in lab, red, red)){.hover\:bg-foreground-subtle\/10:hover{background-color:color-mix(in oklab, var(--color-foreground-subtle) 10%, transparent)}}.hover\:bg-orange-600:hover{background-color:var(--color-orange-600)}.hover\:bg-primary:hover{background-color:var(--color-primary)}.hover\:bg-primary\/5:hover{background-color:#f59e420d}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/5:hover{background-color:color-mix(in oklab, var(--color-primary) 5%, transparent)}}.hover\:bg-primary\/10:hover{background-color:#f59e421a}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/10:hover{background-color:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.hover\:bg-primary\/20:hover{background-color:#f59e4233}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/20:hover{background-color:color-mix(in oklab, var(--color-primary) 20%, transparent)}}.hover\:bg-primary\/25:hover{background-color:#f59e4240}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/25:hover{background-color:color-mix(in oklab, var(--color-primary) 25%, transparent)}}.hover\:bg-primary\/90:hover{background-color:#f59e42e6}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--color-primary) 90%, transparent)}}.hover\:bg-red-500\/10:hover{background-color:#fb2c361a}@supports (color:color-mix(in lab, red, red)){.hover\:bg-red-500\/10:hover{background-color:color-mix(in oklab, var(--color-red-500) 10%, transparent)}}.hover\:bg-red-500\/20:hover{background-color:#fb2c3633}@supports (color:color-mix(in lab, red, red)){.hover\:bg-red-500\/20:hover{background-color:color-mix(in oklab, var(--color-red-500) 20%, transparent)}}.hover\:bg-red-600:hover{background-color:var(--color-red-600)}.hover\:bg-success\/15:hover{background-color:#4ade8026}@supports (color:color-mix(in lab, red, red)){.hover\:bg-success\/15:hover{background-color:color-mix(in oklab, var(--color-success) 15%, transparent)}}.hover\:bg-success\/25:hover{background-color:#4ade8040}@supports (color:color-mix(in lab, red, red)){.hover\:bg-success\/25:hover{background-color:color-mix(in oklab, var(--color-success) 25%, transparent)}}.hover\:bg-surface:hover{background-color:var(--color-surface)}.hover\:bg-surface-hover:hover{background-color:var(--color-surface-hover)}.hover\:bg-surface-hover\/30:hover{background-color:#2925244d}@supports (color:color-mix(in lab, red, red)){.hover\:bg-surface-hover\/30:hover{background-color:color-mix(in oklab, var(--color-surface-hover) 30%, transparent)}}.hover\:bg-surface-hover\/40:hover{background-color:#29252466}@supports (color:color-mix(in lab, red, red)){.hover\:bg-surface-hover\/40:hover{background-color:color-mix(in oklab, var(--color-surface-hover) 40%, transparent)}}.hover\:bg-surface\/60:hover{background-color:#1c191799}@supports (color:color-mix(in lab, red, red)){.hover\:bg-surface\/60:hover{background-color:color-mix(in oklab, var(--color-surface) 60%, transparent)}}.hover\:bg-warning\/20:hover{background-color:#fbbf2433}@supports (color:color-mix(in lab, red, red)){.hover\:bg-warning\/20:hover{background-color:color-mix(in oklab, var(--color-warning) 20%, transparent)}}.hover\:bg-white\/15:hover{background-color:#ffffff26}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/15:hover{background-color:color-mix(in oklab, var(--color-white) 15%, transparent)}}.hover\:bg-white\/20:hover{background-color:#fff3}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/20:hover{background-color:color-mix(in oklab, var(--color-white) 20%, transparent)}}.hover\:text-amber-400:hover{color:var(--color-amber-400)}.hover\:text-danger:hover{color:var(--color-danger)}.hover\:text-foreground:hover{color:var(--color-foreground)}.hover\:text-primary:hover{color:var(--color-primary)}.hover\:text-red-400:hover{color:var(--color-red-400)}.hover\:text-red-500:hover{color:var(--color-red-500)}.hover\:text-white:hover{color:var(--color-white)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-80:hover{opacity:.8}.hover\:opacity-100:hover{opacity:1}}.focus\:border-primary:focus{border-color:var(--color-primary)}.focus\:border-primary\/50:focus{border-color:#f59e4280}@supports (color:color-mix(in lab, red, red)){.focus\:border-primary\/50:focus{border-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-primary:focus{--tw-ring-color:var(--color-primary)}.focus\:ring-primary\/30:focus{--tw-ring-color:#f59e424d}@supports (color:color-mix(in lab, red, red)){.focus\:ring-primary\/30:focus{--tw-ring-color:color-mix(in oklab, var(--color-primary) 30%, transparent)}}.focus\:ring-primary\/40:focus{--tw-ring-color:#f59e4266}@supports (color:color-mix(in lab, red, red)){.focus\:ring-primary\/40:focus{--tw-ring-color:color-mix(in oklab, var(--color-primary) 40%, transparent)}}.focus\:ring-primary\/50:focus{--tw-ring-color:#f59e4280}@supports (color:color-mix(in lab, red, red)){.focus\:ring-primary\/50:focus{--tw-ring-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.active\:cursor-grabbing:active{cursor:grabbing}.active\:bg-surface-hover\/80:active{background-color:#292524cc}@supports (color:color-mix(in lab, red, red)){.active\:bg-surface-hover\/80:active{background-color:color-mix(in oklab, var(--color-surface-hover) 80%, transparent)}}.active\:bg-white\/25:active{background-color:#ffffff40}@supports (color:color-mix(in lab, red, red)){.active\:bg-white\/25:active{background-color:color-mix(in oklab, var(--color-white) 25%, transparent)}}.active\:bg-white\/30:active{background-color:#ffffff4d}@supports (color:color-mix(in lab, red, red)){.active\:bg-white\/30:active{background-color:color-mix(in oklab, var(--color-white) 30%, transparent)}}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}@media (hover:hover){.disabled\:hover\:bg-surface:disabled:hover{background-color:var(--color-surface)}}@media (width>=40rem){.sm\:block{display:block}.sm\:hidden{display:none}.sm\:inline{display:inline}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:flex-nowrap{flex-wrap:nowrap}.sm\:items-center{align-items:center}.sm\:items-start{align-items:flex-start}.sm\:justify-between{justify-content:space-between}.sm\:gap-3{gap:calc(var(--spacing) * 3)}:where(.sm\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}.sm\:p-3{padding:calc(var(--spacing) * 3)}.sm\:p-4{padding:calc(var(--spacing) * 4)}.sm\:px-2{padding-inline:calc(var(--spacing) * 2)}.sm\:px-3{padding-inline:calc(var(--spacing) * 3)}.sm\:px-4{padding-inline:calc(var(--spacing) * 4)}.sm\:px-5{padding-inline:calc(var(--spacing) * 5)}.sm\:py-1{padding-block:var(--spacing)}.sm\:py-2{padding-block:calc(var(--spacing) * 2)}.sm\:py-3{padding-block:calc(var(--spacing) * 3)}.sm\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.sm\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.sm\:text-\[11px\]{font-size:11px}}@media (width>=48rem){.md\:flex{display:flex}.md\:table-cell{display:table-cell}.md\:w-44{width:calc(var(--spacing) * 44)}.md\:flex-shrink-0{flex-shrink:0}.md\:flex-row{flex-direction:row}.md\:border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.md\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}}@media (width>=64rem){.lg\:table-cell{display:table-cell}.lg\:w-52{width:calc(var(--spacing) * 52)}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:p-4{padding:calc(var(--spacing) * 4)}}@media (width>=80rem){.xl\:inline{display:inline}.xl\:table-cell{display:table-cell}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@container (width>=280px){.\@\[280px\]\:inline{display:inline}.\@\[280px\]\:px-3{padding-inline:calc(var(--spacing) * 3)}}@container (width>=480px){.\@\[480px\]\:col-span-2{grid-column:span 2/span 2}.\@\[480px\]\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@container (width>=880px){.\@\[880px\]\:col-span-3{grid-column:span 3/span 3}.\@\[880px\]\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@container (width>=1140px){.\@\[1140px\]\:col-span-4{grid-column:span 4/span 4}.\@\[1140px\]\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (prefers-color-scheme:dark){.dark\:bg-amber-950{background-color:var(--color-amber-950)}.dark\:bg-blue-950{background-color:var(--color-blue-950)}.dark\:bg-cyan-950{background-color:var(--color-cyan-950)}.dark\:bg-fuchsia-950{background-color:var(--color-fuchsia-950)}.dark\:bg-green-950{background-color:var(--color-green-950)}.dark\:bg-purple-950{background-color:var(--color-purple-950)}.dark\:bg-slate-950{background-color:var(--color-slate-950)}.dark\:bg-zinc-900{background-color:var(--color-zinc-900)}.dark\:text-amber-300{color:var(--color-amber-300)}.dark\:text-amber-400{color:var(--color-amber-400)}.dark\:text-blue-400{color:var(--color-blue-400)}.dark\:text-cyan-400{color:var(--color-cyan-400)}.dark\:text-emerald-300{color:var(--color-emerald-300)}.dark\:text-fuchsia-400{color:var(--color-fuchsia-400)}.dark\:text-purple-400{color:var(--color-purple-400)}.dark\:text-slate-400{color:var(--color-slate-400)}}.\[\&\:\:-webkit-scrollbar\]\:w-1::-webkit-scrollbar{width:var(--spacing)}.\[\&\:\:-webkit-scrollbar-thumb\]\:rounded-full::-webkit-scrollbar-thumb{border-radius:3.40282e38px}.\[\&\:\:-webkit-scrollbar-thumb\]\:bg-surface-hover::-webkit-scrollbar-thumb{background-color:var(--color-surface-hover)}.\[\&\:\:-webkit-scrollbar-track\]\:bg-transparent::-webkit-scrollbar-track{background-color:#0000}.\[\&\>\*\]\:h-full>*{height:100%}.\[\&\>\*\]\:w-full>*,.\[\&\>\*\:last-child\]\:w-full>:last-child{width:100%}.\[\&\>img\]\:object-cover>img,.\[\&\>video\]\:object-cover>video{object-fit:cover}}.dark{--color-primary:#f59e42;--color-primary-foreground:#0c0a09;--color-background:#0c0a09;--color-background-elevated:#1c1917;--color-surface:#1c1917;--color-surface-hover:#292524;--color-border:#292524;--color-border-subtle:#1c1917;--color-foreground:#fafaf9;--color-foreground-muted:#a8a29e;--color-foreground-subtle:#78716c;--color-foreground-disabled:#57534e;--color-success:#4ade80;--color-warning:#fbbf24;--color-danger:#f87171;--color-info:#60a5fa}.light{--color-primary:#e67e22;--color-primary-foreground:#fff;--color-background:#fafaf9;--color-background-elevated:#fff;--color-surface:#f5f5f4;--color-surface-hover:#e7e5e4;--color-border:#d6d3d1;--color-border-subtle:#e7e5e4;--color-foreground:#1c1917;--color-foreground-muted:#57534e;--color-foreground-subtle:#78716c;--color-foreground-disabled:#a8a29e;--color-success:#16a34a;--color-warning:#d97706;--color-danger:#dc2626;--color-info:#2563eb}@media (prefers-color-scheme:light){:root:not(.dark){--color-primary:#e67e22;--color-primary-foreground:#fff;--color-background:#fafaf9;--color-background-elevated:#fff;--color-surface:#f5f5f4;--color-surface-hover:#e7e5e4;--color-border:#d6d3d1;--color-border-subtle:#e7e5e4;--color-foreground:#1c1917;--color-foreground-muted:#57534e;--color-foreground-subtle:#78716c;--color-foreground-disabled:#a8a29e;--color-success:#16a34a;--color-warning:#d97706;--color-danger:#dc2626;--color-info:#2563eb}}:root{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}html,body,#root{height:100%;margin:0}body{background:#000}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<title>CamStack Embed</title>
|
|
7
|
+
<script type="module" crossorigin src="./assets/index-B8VlSD0-.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="./assets/index-ZhDdp1Nd.css">
|
|
9
|
+
</head>
|
|
10
|
+
<body>
|
|
11
|
+
<div id="root"></div>
|
|
12
|
+
</body>
|
|
13
|
+
</html>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camstack/addon-pipeline",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "CamStack Pipeline bundle — runner, detection, motion, decoders, audio + stream broker. Multi-entry npm package shipping 7 addons under a single bundle.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"camstack",
|
|
@@ -56,6 +56,7 @@
|
|
|
56
56
|
},
|
|
57
57
|
"files": [
|
|
58
58
|
"dist",
|
|
59
|
+
"embed-dist",
|
|
59
60
|
"python",
|
|
60
61
|
"swift",
|
|
61
62
|
"wasm",
|
|
@@ -280,12 +281,15 @@
|
|
|
280
281
|
]
|
|
281
282
|
},
|
|
282
283
|
"scripts": {
|
|
283
|
-
"build": "vite build && vite build --config vite.widgets.stream-broker.config.ts",
|
|
284
|
+
"build": "vite build && vite build --config vite.widgets.stream-broker.config.ts && npm run build:embed",
|
|
284
285
|
"build:server": "vite build",
|
|
285
286
|
"build:widgets": "vite build --config vite.widgets.stream-broker.config.ts",
|
|
287
|
+
"build:embed": "vite build -c embed/vite.config.ts",
|
|
286
288
|
"dev": "vite build --watch",
|
|
287
289
|
"typecheck": "tsc --noEmit",
|
|
290
|
+
"typecheck:embed": "tsc --noEmit -p embed/tsconfig.json",
|
|
288
291
|
"test": "vitest run",
|
|
292
|
+
"test:embed": "vitest run -c embed/vitest.config.ts",
|
|
289
293
|
"publish": "npm publish --access public"
|
|
290
294
|
},
|
|
291
295
|
"peerDependencies": {
|
|
@@ -297,17 +301,31 @@
|
|
|
297
301
|
},
|
|
298
302
|
"dependencies": {
|
|
299
303
|
"@camstack/core": "*",
|
|
304
|
+
"lucide-react": "^0.511.0",
|
|
305
|
+
"mp4box": "0.5.4",
|
|
300
306
|
"node-av": "^5.2.4",
|
|
301
307
|
"onnxruntime-node": "^1.24.3",
|
|
302
|
-
"sharp": "^0.
|
|
308
|
+
"sharp": "^0.35.2",
|
|
303
309
|
"zod": "^4.3.6"
|
|
304
310
|
},
|
|
305
311
|
"devDependencies": {
|
|
312
|
+
"@camstack/sdk": "*",
|
|
313
|
+
"@camstack/shm-ring": "*",
|
|
306
314
|
"@camstack/types": "*",
|
|
307
|
-
"@
|
|
308
|
-
"@
|
|
309
|
-
"
|
|
310
|
-
"
|
|
315
|
+
"@camstack/ui-library": "*",
|
|
316
|
+
"@module-federation/vite": "^1.16.9",
|
|
317
|
+
"@tailwindcss/vite": "^4.2.0",
|
|
318
|
+
"@tanstack/react-query": "^5.90.0",
|
|
319
|
+
"@testing-library/jest-dom": "^6.9.1",
|
|
320
|
+
"@testing-library/react": "^16.3.2",
|
|
321
|
+
"@trpc/react-query": "^11.16.0",
|
|
322
|
+
"@types/react": "^19.1.0",
|
|
323
|
+
"@types/react-dom": "^19.1.0",
|
|
324
|
+
"@vitejs/plugin-react": "^6.0.2",
|
|
325
|
+
"jsdom": "^29.0.1",
|
|
326
|
+
"tailwindcss": "^4.2.0",
|
|
327
|
+
"typescript": "~6.0.3",
|
|
328
|
+
"vite": "^8.0.11",
|
|
311
329
|
"vitest": "^3.2.4"
|
|
312
330
|
}
|
|
313
331
|
}
|
package/wasm/assembly/index.ts
CHANGED
|
@@ -60,11 +60,17 @@ export function init(w: i32, h: i32): i32 {
|
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
/** Get offset for writing current frame */
|
|
63
|
-
export function getCurrOffset(): i32 {
|
|
63
|
+
export function getCurrOffset(): i32 {
|
|
64
|
+
return currOff
|
|
65
|
+
}
|
|
64
66
|
/** Get offset for writing previous frame */
|
|
65
|
-
export function getPrevOffset(): i32 {
|
|
67
|
+
export function getPrevOffset(): i32 {
|
|
68
|
+
return prevOff
|
|
69
|
+
}
|
|
66
70
|
/** Get offset for reading region results */
|
|
67
|
-
export function getRegionOffset(): i32 {
|
|
71
|
+
export function getRegionOffset(): i32 {
|
|
72
|
+
return regionOff
|
|
73
|
+
}
|
|
68
74
|
|
|
69
75
|
// ── Box blur (separable) ──
|
|
70
76
|
|
|
@@ -74,7 +80,7 @@ function boxBlurH(srcOff: i32, dstOff: i32, w: i32, h: i32, r: i32): void {
|
|
|
74
80
|
const row = y * w
|
|
75
81
|
let sum: i32 = 0
|
|
76
82
|
for (let k: i32 = -r; k <= r; k++) {
|
|
77
|
-
const cx = k < 0 ? 0 :
|
|
83
|
+
const cx = k < 0 ? 0 : k >= w ? w - 1 : k
|
|
78
84
|
sum += <i32>load<u8>(srcOff + row + cx)
|
|
79
85
|
}
|
|
80
86
|
store<u8>(dstOff + row, <u8>(<f32>sum * inv))
|
|
@@ -92,7 +98,7 @@ function boxBlurV(srcOff: i32, dstOff: i32, w: i32, h: i32, r: i32): void {
|
|
|
92
98
|
for (let x: i32 = 0; x < w; x++) {
|
|
93
99
|
let sum: i32 = 0
|
|
94
100
|
for (let k: i32 = -r; k <= r; k++) {
|
|
95
|
-
const cy = k < 0 ? 0 :
|
|
101
|
+
const cy = k < 0 ? 0 : k >= h ? h - 1 : k
|
|
96
102
|
sum += <i32>load<u8>(srcOff + cy * w + x)
|
|
97
103
|
}
|
|
98
104
|
store<u8>(dstOff + x, <u8>(<f32>sum * inv))
|
|
@@ -134,28 +140,40 @@ function dilate(off: i32, w: i32, h: i32, r: i32): void {
|
|
|
134
140
|
let last: i32 = -r - 1
|
|
135
141
|
for (let x: i32 = 0; x < w; x++) {
|
|
136
142
|
const idx = off + y * w + x
|
|
137
|
-
if (load<u8>(idx)) {
|
|
138
|
-
|
|
143
|
+
if (load<u8>(idx)) {
|
|
144
|
+
last = x
|
|
145
|
+
} else if (x - last <= r) {
|
|
146
|
+
store<u8>(idx, 255)
|
|
147
|
+
}
|
|
139
148
|
}
|
|
140
149
|
last = w + r + 1
|
|
141
150
|
for (let x: i32 = w - 1; x >= 0; x--) {
|
|
142
151
|
const idx = off + y * w + x
|
|
143
|
-
if (load<u8>(idx)) {
|
|
144
|
-
|
|
152
|
+
if (load<u8>(idx)) {
|
|
153
|
+
last = x
|
|
154
|
+
} else if (last - x <= r) {
|
|
155
|
+
store<u8>(idx, 255)
|
|
156
|
+
}
|
|
145
157
|
}
|
|
146
158
|
}
|
|
147
159
|
for (let x: i32 = 0; x < w; x++) {
|
|
148
160
|
let last: i32 = -r - 1
|
|
149
161
|
for (let y: i32 = 0; y < h; y++) {
|
|
150
162
|
const idx = off + y * w + x
|
|
151
|
-
if (load<u8>(idx)) {
|
|
152
|
-
|
|
163
|
+
if (load<u8>(idx)) {
|
|
164
|
+
last = y
|
|
165
|
+
} else if (y - last <= r) {
|
|
166
|
+
store<u8>(idx, 255)
|
|
167
|
+
}
|
|
153
168
|
}
|
|
154
169
|
last = h + r + 1
|
|
155
170
|
for (let y: i32 = h - 1; y >= 0; y--) {
|
|
156
171
|
const idx = off + y * w + x
|
|
157
|
-
if (load<u8>(idx)) {
|
|
158
|
-
|
|
172
|
+
if (load<u8>(idx)) {
|
|
173
|
+
last = y
|
|
174
|
+
} else if (last - y <= r) {
|
|
175
|
+
store<u8>(idx, 255)
|
|
176
|
+
}
|
|
159
177
|
}
|
|
160
178
|
}
|
|
161
179
|
}
|
|
@@ -173,7 +191,8 @@ function ufFind(x: i32): i32 {
|
|
|
173
191
|
}
|
|
174
192
|
|
|
175
193
|
function ufUnion(a: i32, b: i32): void {
|
|
176
|
-
const ra = ufFind(a),
|
|
194
|
+
const ra = ufFind(a),
|
|
195
|
+
rb = ufFind(b)
|
|
177
196
|
if (ra !== rb) store<i32>(parentOff + (rb << 2), ra)
|
|
178
197
|
}
|
|
179
198
|
|
|
@@ -243,7 +262,9 @@ export function detectMotion(
|
|
|
243
262
|
dilateRadius: i32 = 4,
|
|
244
263
|
minArea: i32 = 200,
|
|
245
264
|
): i32 {
|
|
246
|
-
const w = W,
|
|
265
|
+
const w = W,
|
|
266
|
+
h = H,
|
|
267
|
+
size = SIZE
|
|
247
268
|
|
|
248
269
|
// Blur prev → blurA (using diffOff as temp — safe, will be overwritten by diffThreshold)
|
|
249
270
|
blur(prevOff, blurAOff, diffOff, w, h, blurRadius)
|
|
@@ -264,7 +285,11 @@ export function detectMotion(
|
|
|
264
285
|
// Extract bboxes — return ALL regions (minArea filtering done in JS)
|
|
265
286
|
let regionCount: i32 = 0
|
|
266
287
|
for (let c: i32 = 1; c <= numComp && regionCount < MAX_REGIONS; c++) {
|
|
267
|
-
let minX: i32 = w,
|
|
288
|
+
let minX: i32 = w,
|
|
289
|
+
minY: i32 = h,
|
|
290
|
+
maxX: i32 = 0,
|
|
291
|
+
maxY: i32 = 0,
|
|
292
|
+
px: i32 = 0
|
|
268
293
|
for (let y: i32 = 0; y < h; y++) {
|
|
269
294
|
for (let x: i32 = 0; x < w; x++) {
|
|
270
295
|
if (load<i32>(labelOff + ((y * w + x) << 2)) === c) {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/audio-analyzer/audio-pipeline.ts","../../src/audio-analyzer/addons/analyzer/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access -- existing audio pipeline carries unsafe ONNX runtime calls; pre-existing tech debt, not introduced by Phase E. */\n/**\n * Audio classification pipeline.\n *\n * - macOS: Apple SoundAnalysis framework (303 built-in sound categories)\n * - Cross-platform: YAMNet ONNX via onnxruntime-node\n *\n * This is independent from the video pipeline — different input (audio samples),\n * different engine (no shared pool), different output cadence.\n */\nimport type { IScopedLogger } from '@camstack/types'\nimport * as path from 'node:path'\nimport * as fs from 'node:fs'\nimport { errMsg, HF_BASE_URL } from '@camstack/types'\n// eslint-disable-next-line no-restricted-imports -- downloadFile is a build-time dep used to materialise the YAMNet model on first boot. Mirrors the waiver detection-pipeline + addon-embedding-encoder use for the same reason. Single source of truth lives in `@camstack/core/download/model-downloader`; consolidating it via `ctx.deps.downloadFile` would require extending `IAddonDepsManager` across every kernel context — out of scope for this addon's first auto-download wiring.\nimport { downloadFile } from '@camstack/core'\n\n// `__dirname` is shimmed by tsup (`shims: true`) for both CJS and ESM\n// output, so it works whether this bundle is loaded by `require` or by\n// `await import(...)` (the agent path).\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface AudioClassificationResult {\n readonly classifications: readonly {\n readonly className: string\n readonly score: number\n }[]\n readonly inferenceMs: number\n}\n\nexport interface AudioChunk {\n readonly data: Float32Array\n readonly sampleRate: number\n readonly channels: number\n}\n\nexport interface IAudioPipeline {\n initialize(): Promise<void>\n classify(chunk: AudioChunk): Promise<AudioClassificationResult>\n dispose(): Promise<void>\n}\n\nexport type AudioBackend = 'yamnet-onnx' | 'apple-soundanalysis'\n\nexport interface AudioPipelineOptions {\n readonly backend?: AudioBackend\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create the appropriate audio pipeline.\n *\n * - 'yamnet-onnx': Cross-platform YAMNet ONNX (requires model download)\n * - 'apple-soundanalysis': macOS 12+ Apple SoundAnalysis (zero model download, Neural Engine)\n * - undefined: auto-detect (Apple SA on macOS, YAMNet on Linux)\n */\nexport async function createAudioPipeline(\n modelsDir: string,\n logger: IScopedLogger,\n options?: AudioPipelineOptions,\n): Promise<IAudioPipeline> {\n const backend = options?.backend ?? (process.platform === 'darwin' ? 'apple-soundanalysis' : 'yamnet-onnx')\n\n if (backend === 'apple-soundanalysis') {\n return new AppleSoundAnalysisPipeline(logger)\n }\n return new YamnetOnnxPipeline(modelsDir, logger)\n}\n\n// ---------------------------------------------------------------------------\n// YAMNet ONNX (cross-platform)\n// ---------------------------------------------------------------------------\n\n/**\n * Canonical model URLs on the camstack HuggingFace mirror. Mirrors the\n * convention every detection model follows (single point of truth =\n * `HF_BASE_URL` from `@camstack/types`); the auto-download path uses\n * `downloadFile` from `@camstack/core`, the SAME helper detection-\n * pipeline uses to materialise its YOLO/face/plate models. Missing\n * model on disk → fetch from HF; cached file → no-op.\n *\n * Repo layout follows the detection-pipeline pattern:\n * {domain}/{family}/{format}/{filename}\n * For YAMNet that's `audioClassification/yamnet/onnx/camstack-yamnet.onnx`,\n * with the labels JSON sitting one level up (`audioClassification/yamnet/`)\n * because they're format-agnostic (same 521 AudioSet class names whether\n * the runtime is ONNX, OpenVINO, or TF).\n */\nconst YAMNET_MODEL_URL = `${HF_BASE_URL}/audioClassification/yamnet/onnx/camstack-yamnet.onnx`\nconst YAMNET_LABELS_URL = `${HF_BASE_URL}/audioClassification/yamnet/camstack-yamnet-labels.json`\n\nclass YamnetOnnxPipeline implements IAudioPipeline {\n private session: import('onnxruntime-node').InferenceSession | null = null\n private inputName = ''\n private labels: readonly string[] = []\n private readonly log: IScopedLogger\n\n constructor(\n private readonly modelsDir: string,\n logger: IScopedLogger,\n ) {\n this.log = logger\n }\n\n async initialize(): Promise<void> {\n const ort = await import('onnxruntime-node')\n const modelPath = path.join(this.modelsDir, 'camstack-yamnet.onnx')\n const labelsPath = path.join(this.modelsDir, 'camstack-yamnet-labels.json')\n\n // Auto-download model + labels from the camstack HF mirror — same\n // pattern as detection-pipeline's `ensureModel`. `downloadFile` is\n // a no-op when the file is already on disk; on first boot it\n // streams atomically (`.downloading` tmp + rename on success).\n if (!fs.existsSync(modelPath)) {\n this.log.info('YAMNet ONNX model not found locally — downloading from HuggingFace', {\n meta: { url: YAMNET_MODEL_URL, dest: modelPath },\n })\n await downloadFile(YAMNET_MODEL_URL, modelPath)\n this.log.info('YAMNet ONNX model downloaded', {\n meta: { sizeBytes: fs.statSync(modelPath).size },\n })\n }\n if (!fs.existsSync(labelsPath)) {\n this.log.info('YAMNet labels not found locally — downloading from HuggingFace', {\n meta: { url: YAMNET_LABELS_URL, dest: labelsPath },\n })\n await downloadFile(YAMNET_LABELS_URL, labelsPath)\n }\n\n this.session = await ort.InferenceSession.create(modelPath)\n this.inputName = this.session.inputNames[0] ?? 'waveform'\n\n if (fs.existsSync(labelsPath)) {\n this.labels = JSON.parse(fs.readFileSync(labelsPath, 'utf8')) as string[]\n } else {\n this.log.warn('YAMNet labels file not found — classifications will use numeric indices')\n }\n\n this.log.info(`YAMNet ONNX pipeline initialized (${this.labels.length} labels)`)\n }\n\n async classify(chunk: AudioChunk): Promise<AudioClassificationResult> {\n if (!this.session) {\n throw new Error('YAMNet pipeline not initialized')\n }\n\n const start = Date.now()\n const ort = await import('onnxruntime-node')\n\n // Resample to 16kHz mono if needed\n const waveform = chunk.sampleRate === 16000 && chunk.channels === 1\n ? chunk.data\n : resampleMono16k(chunk)\n\n // Create ONNX tensor — YAMNet expects 1D float32 waveform\n const tensor = new ort.Tensor('float32', waveform, [waveform.length])\n const feeds: Record<string, import('onnxruntime-node').Tensor> = { [this.inputName]: tensor }\n\n const results = await this.session.run(feeds)\n\n // output_0: [N_frames, 521] scores\n const scoresData = results[this.session.outputNames[0]!]\n if (!scoresData) {\n throw new Error('YAMNet returned no output')\n }\n\n const scores = scoresData.data as Float32Array\n const numClasses = 521\n const numFrames = scores.length / numClasses\n\n // Average across frames\n const avgScores = new Float32Array(numClasses)\n for (let f = 0; f < numFrames; f++) {\n for (let c = 0; c < numClasses; c++) {\n avgScores[c]! += scores[f * numClasses + c]!\n }\n }\n for (let c = 0; c < numClasses; c++) {\n avgScores[c] = avgScores[c]! / numFrames\n }\n\n // Collect above threshold, sorted\n const minScore = 0.05\n const classifications: { className: string; score: number }[] = []\n for (let c = 0; c < numClasses; c++) {\n const score = avgScores[c]!\n if (score >= minScore) {\n const label = c < this.labels.length ? this.labels[c]! : String(c)\n classifications.push({ className: label, score: Math.round(score * 1000) / 1000 })\n }\n }\n classifications.sort((a, b) => b.score - a.score)\n\n return {\n classifications: classifications.slice(0, 10),\n inferenceMs: Date.now() - start,\n }\n }\n\n async dispose(): Promise<void> {\n if (this.session) {\n await this.session.release()\n this.session = null\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Apple SoundAnalysis (macOS)\n// ---------------------------------------------------------------------------\n\nclass AppleSoundAnalysisPipeline implements IAudioPipeline {\n private readonly log: IScopedLogger\n private process: import('node:child_process').ChildProcess | null = null\n private receiveBuffer: Buffer = Buffer.alloc(0)\n private pendingResolve: ((value: Record<string, unknown>) => void) | null = null\n private pendingReject: ((reason: Error) => void) | null = null\n private binaryPath: string | null = null\n private debugCount = 0\n\n constructor(logger: IScopedLogger) {\n this.log = logger\n }\n\n async initialize(): Promise<void> {\n this.binaryPath = await this.resolveSwiftBinary()\n if (!this.binaryPath) {\n throw new Error('Apple SoundAnalysis: Swift CLI not found and compilation failed. macOS with Xcode CLI tools required.')\n }\n\n const { spawn } = await import('node:child_process')\n this.process = spawn(this.binaryPath, ['--sample-rate=16000', '--top-k=10'], {\n stdio: ['pipe', 'pipe', 'pipe'],\n })\n\n this.process.stderr?.on('data', (chunk: Buffer) => {\n const lines = chunk.toString().split('\\n')\n for (const line of lines) {\n const trimmed = line.trim()\n if (trimmed) this.log.warn(trimmed)\n }\n })\n\n this.process.on('error', (err) => {\n this.log.error('Swift process error', { meta: { error: err.message } })\n this.pendingReject?.(err)\n this.pendingReject = null\n this.pendingResolve = null\n })\n\n this.process.on('exit', (code) => {\n if (code !== 0 && code !== null) {\n this.log.error('Swift process exited', { meta: { code } })\n const err = new Error(`Apple SoundAnalysis: process exited with code ${code}`)\n this.pendingReject?.(err)\n this.pendingReject = null\n this.pendingResolve = null\n }\n })\n\n this.process.stdout!.on('data', (chunk: Buffer) => {\n this.receiveBuffer = Buffer.concat([this.receiveBuffer, chunk])\n this.tryReceive()\n })\n\n const ready = await this.receiveMessage()\n if (ready['status'] !== 'ready') {\n throw new Error(`Apple SoundAnalysis: unexpected init response: ${JSON.stringify(ready)}`)\n }\n this.log.info('Apple SoundAnalysis pipeline initialized (macOS built-in, Swift CLI bridge)')\n }\n\n async classify(chunk: AudioChunk): Promise<AudioClassificationResult> {\n if (!this.process?.stdin) {\n throw new Error('Apple SoundAnalysis: process not initialized')\n }\n\n const waveform = chunk.sampleRate === 16000 && chunk.channels === 1\n ? chunk.data\n : resampleMono16k(chunk)\n\n const audioBuffer = Buffer.from(waveform.buffer, waveform.byteOffset, waveform.byteLength)\n const lengthBuf = Buffer.allocUnsafe(4)\n lengthBuf.writeUInt32LE(audioBuffer.length, 0)\n this.process.stdin.write(Buffer.concat([lengthBuf, audioBuffer]))\n\n const result = await this.receiveMessage()\n const classifications = (result['classifications'] as Array<{ className: string; score: number }>) ?? []\n const inferenceMs = (result['inferenceMs'] as number) ?? 0\n\n if (this.debugCount < 3) {\n const keys = Object.keys(result)\n this.log.info('classify debug sample', {\n meta: {\n phase: 'apple-sa',\n index: this.debugCount,\n keys,\n classifications: classifications.length,\n inferenceMs,\n audioBytes: Buffer.from(chunk.data.buffer, chunk.data.byteOffset, chunk.data.byteLength).length,\n sampleRate: chunk.sampleRate,\n channels: chunk.channels,\n },\n })\n if (result['error']) {\n this.log.error('Swift error', { meta: { phase: 'apple-sa', error: result['error'] } })\n }\n this.debugCount++\n }\n\n return { classifications, inferenceMs }\n }\n\n async dispose(): Promise<void> {\n const proc = this.process\n if (!proc) return\n this.process = null\n proc.stdin?.end()\n proc.kill('SIGTERM')\n\n const exited = await new Promise<boolean>((resolve) => {\n const timer = setTimeout(() => resolve(false), 5_000)\n proc.once('exit', () => { clearTimeout(timer); resolve(true) })\n })\n if (!exited) {\n try { proc.kill('SIGKILL') } catch { /* already dead */ }\n this.log.warn('Swift process did not exit gracefully — sent SIGKILL')\n }\n }\n\n private receiveMessage(): Promise<Record<string, unknown>> {\n return new Promise<Record<string, unknown>>((resolve, reject) => {\n this.pendingResolve = resolve\n this.pendingReject = reject\n })\n }\n\n private tryReceive(): void {\n if (this.receiveBuffer.length < 4) return\n const length = this.receiveBuffer.readUInt32LE(0)\n if (this.receiveBuffer.length < 4 + length) return\n\n const jsonBytes = this.receiveBuffer.subarray(4, 4 + length)\n this.receiveBuffer = this.receiveBuffer.subarray(4 + length)\n\n const resolve = this.pendingResolve\n const reject = this.pendingReject\n this.pendingResolve = null\n this.pendingReject = null\n\n if (!resolve) return\n try {\n const parsed = JSON.parse(jsonBytes.toString('utf8')) as Record<string, unknown>\n resolve(parsed)\n } catch (err) {\n reject?.(err instanceof Error ? err : new Error(String(err)))\n }\n }\n\n /** Find pre-compiled binary or compile from Swift source. */\n private async resolveSwiftBinary(): Promise<string | null> {\n // Phase D bundle merge: audio-analyzer ships inside\n // `@camstack/addon-pipeline/dist/audio-analyzer/`, with swift\n // sources at the bundle's `swift/audio-analyzer/` sub-folder.\n // From `dist/audio-analyzer/index.js`, that's `../../swift/audio-analyzer`.\n const candidates = [\n path.join(__dirname, '../../swift/audio-analyzer/apple-sound-classifier'),\n // Fallback for in-tree dev (src/<id>/swift/) and pre-merge layouts.\n path.join(__dirname, '../swift/apple-sound-classifier'),\n path.join(__dirname, '../../swift/apple-sound-classifier'),\n path.join(__dirname, '../../../swift/apple-sound-classifier'),\n ]\n\n for (const p of candidates) {\n if (fs.existsSync(p)) {\n this.log.info('Found pre-compiled Swift CLI', { meta: { path: p } })\n return p\n }\n }\n\n const sourceCandidates = [\n path.join(__dirname, '../../swift/audio-analyzer/apple-sound-classifier.swift'),\n path.join(__dirname, '../swift/apple-sound-classifier.swift'),\n path.join(__dirname, '../../swift/apple-sound-classifier.swift'),\n path.join(__dirname, '../../../swift/apple-sound-classifier.swift'),\n ]\n const sourcePath = sourceCandidates.find(p => fs.existsSync(p))\n if (!sourcePath) {\n this.log.error('Swift source not found', { meta: { searched: sourceCandidates } })\n return null\n }\n\n const outputPath = sourcePath.replace('.swift', '')\n this.log.info('Compiling Swift CLI...', { meta: { source: sourcePath, output: outputPath } })\n\n const { execFileSync } = await import('node:child_process')\n try {\n execFileSync('swiftc', ['-O', '-o', outputPath, sourcePath], {\n timeout: 60_000,\n stdio: 'pipe',\n })\n this.log.info('Swift CLI compiled successfully')\n return outputPath\n } catch (err) {\n this.log.error('Swift compilation failed — install Xcode Command Line Tools', {\n meta: { error: errMsg(err) },\n })\n return null\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Audio helpers\n// ---------------------------------------------------------------------------\n\n/** Simple resample to 16kHz mono by linear interpolation. */\nfunction resampleMono16k(chunk: AudioChunk): Float32Array {\n const { data, sampleRate, channels } = chunk\n const numSamples = data.length / channels\n\n // Mix to mono\n const mono = new Float32Array(numSamples)\n for (let i = 0; i < numSamples; i++) {\n let sum = 0\n for (let c = 0; c < channels; c++) {\n sum += data[i * channels + c]!\n }\n mono[i] = sum / channels\n }\n\n // Resample to 16kHz\n const ratio = 16000 / sampleRate\n const outLen = Math.floor(numSamples * ratio)\n const out = new Float32Array(outLen)\n for (let i = 0; i < outLen; i++) {\n const srcIdx = i / ratio\n const lo = Math.floor(srcIdx)\n const hi = Math.min(lo + 1, numSamples - 1)\n const frac = srcIdx - lo\n out[i] = mono[lo]! * (1 - frac) + mono[hi]! * frac\n }\n return out\n}\n","import type {\n AudioAnalyzerGlobalConfig,\n AudioBackendChoice,\n AudioChunkInput,\n AudioAnalysisResult,\n AudioAnalysisSettings,\n IAudioAnalyzer,\n ConfigUISchema,\n ConfigUISchemaWithValues,\n ProviderRegistration,\n} from '@camstack/types'\nimport {\n AUDIO_BACKEND_CHOICES,\n BaseAddon,\n DEFAULT_AUDIO_ANALYZER_CONFIG,\n audioAnalysisCapability,\n audioAnalyzerCapability,\n errMsg,\n hydrateSchema,\n mapAudioLabelToMacro,\n} from '@camstack/types'\nimport type { AudioClassificationResult } from '@camstack/types'\nimport type { IScopedLogger } from '@camstack/types'\nimport type { AudioBackend, IAudioPipeline } from '../../audio-pipeline.js'\nimport { createAudioPipeline } from '../../audio-pipeline.js'\n\n/**\n * Choices presented in the Audio Model dropdown. YAMNet runs via ONNX\n * when backend=yamnet-onnx; Apple SoundAnalysis is a built-in macOS\n * model and has no swappable modelId — the backend IS the model.\n */\nconst AUDIO_MODEL_OPTIONS = [\n { value: '', label: 'Auto (matches backend)' },\n { value: 'yamnet-onnx', label: 'YAMNet (ONNX)' },\n { value: 'apple-soundanalysis', label: 'Apple SoundAnalysis (built-in)' },\n] as const\n\n/**\n * AudioAnalyzerProvider — implements IAudioAnalyzer.\n *\n * Computes dB/RMS on every chunk and classifies via the in-process\n * IAudioPipeline (YAMNet ONNX / Apple SoundAnalysis). No tRPC roundtrip\n * to a separate audio-classifier addon.\n */\n\n// Suppress repeated classify-error logs. Timeouts are expected during\n// pipeline startup or under CPU pressure — log once, then silence for 30s.\nconst CLASSIFY_ERROR_SUPPRESS_MS = 30_000\n\n// Minimum ms between inference calls per camera. Prevents a single camera\n// from immediately re-queuing on the same pipeline after finishing.\nconst CLASSIFY_MIN_INTERVAL_MS = 500\n\n// Sentinel key used when no deviceId is supplied (legacy callers).\nconst GLOBAL_DEVICE_KEY = -1\n\ninterface CameraClassifyState {\n inProgress: boolean\n lastEndMs: number\n}\n\n/**\n * Reconstruct a Float32 view over f32le PCM bytes carried in a Uint8Array.\n *\n * `@msgpack/msgpack` decodes a binary blob into a Uint8Array that is a subview\n * of its internal decode buffer, whose `byteOffset` is NOT guaranteed to be\n * 4-byte aligned (observed e.g. 9). `new Float32Array(buf, offset, …)` then\n * throws \"start offset of Float32Array should be a multiple of 4\". When the\n * offset is misaligned we copy into a fresh 0-offset buffer; the aligned\n * fast-path reuses the existing view with no copy.\n */\nfunction float32FromBytes(raw: Uint8Array): Float32Array {\n const bytes = raw.byteOffset % 4 === 0 ? raw : new Uint8Array(raw)\n return new Float32Array(bytes.buffer, bytes.byteOffset, Math.floor(bytes.byteLength / 4))\n}\n\nexport class AudioAnalyzerProvider implements IAudioAnalyzer {\n private readonly log: IScopedLogger\n private classifyCallCount = 0\n private lastClassifyErrorMs = 0\n private suppressedClassifyErrors = 0\n private classifyCount = 0\n private backendName = 'unknown'\n /** When true, logs a raw-label sample every 100 classifications (opt-in\n * debug aid). Off by default — the watchdog heartbeat covers liveness. */\n private readonly debugClassifySamples = false\n /** Per-camera in-flight state. Key = deviceId (or GLOBAL_DEVICE_KEY for legacy callers). */\n private readonly cameraState = new Map<number, CameraClassifyState>()\n /** Global pipeline lock — Apple SA and ONNX are single-channel: only one classify() can\n * run at a time. Without this, concurrent calls from different cameras overwrite the\n * single pendingResolve slot in AppleSoundAnalysisPipeline, causing 30s timeouts. */\n private pipelineBusy = false\n\n constructor(\n logger: IScopedLogger,\n private readonly pipeline: IAudioPipeline,\n /** The backend that ACTUALLY backs `pipeline` — passed in by the\n * addon's `onInitialize` after `resolveAudioBackend()` has picked\n * the effective choice (operator override or platform default).\n * Used only for `engine:` log tagging on classify samples. */\n backendName: string,\n private readonly deviceSettingsResolver: (deviceId: number) => Promise<AudioAnalysisSettings | null>,\n private readonly deviceContributionResolver: (deviceId: number) => Promise<ConfigUISchemaWithValues | null>,\n private readonly deviceSettingsPatcher: (deviceId: number, patch: Record<string, unknown>) => Promise<void>,\n private readonly reprobeImpl: () => Promise<{ backend: string }>,\n ) {\n this.log = logger\n this.backendName = backendName\n }\n\n // ── Device-details aggregator contribution ──────────────────────────────\n\n async getDeviceSettingsContribution(input: { deviceId: number }): Promise<ConfigUISchemaWithValues | null> {\n return this.deviceContributionResolver(input.deviceId)\n }\n\n async getDeviceLiveContribution(_input: { deviceId: number }): Promise<ConfigUISchemaWithValues | null> {\n return null\n }\n\n async applyDeviceSettingsPatch(input: { deviceId: number; patch: Record<string, unknown> }): Promise<{ success: true }> {\n await this.deviceSettingsPatcher(input.deviceId, input.patch)\n return { success: true as const }\n }\n\n /**\n * Return the effective per-device audio-analyzer settings, resolved via\n * the kernel's 3-level settings resolver (schema default → global →\n * device override). Orchestrator consumers call this method so they\n * never need to know the audio-analyzer schema field names.\n */\n async resolveDeviceSettings({ deviceId }: { deviceId: number }): Promise<AudioAnalysisSettings | null> {\n return this.deviceSettingsResolver(deviceId)\n }\n\n async analyseChunk({\n chunk,\n settings,\n }: {\n chunk: AudioChunkInput\n settings: AudioAnalysisSettings\n }): Promise<AudioAnalysisResult | null> {\n // AudioChunkInput.data carries raw f32le bytes (4 bytes per sample).\n // Reconstruct the Float32Array view here — do NOT iterate the Uint8Array\n // directly, because each byte (0–255) is NOT a sample value.\n // MsgPack decodes the blob into a Uint8Array that is a subview of its\n // internal buffer, whose byteOffset is NOT guaranteed 4-byte aligned\n // (e.g. 9) — `new Float32Array(buf, offset, …)` then throws \"start offset\n // … multiple of 4\". Copy into a fresh 0-offset buffer when misaligned\n // (fast-path reuses the view when already aligned).\n const samples = float32FromBytes(chunk.data)\n\n // ── Compute dB/RMS levels (always) ──\n let sumSquares = 0\n for (let i = 0; i < samples.length; i++) {\n sumSquares += samples[i]! * samples[i]!\n }\n const rms = Math.sqrt(sumSquares / samples.length)\n const dbfs = rms > 0 ? 20 * Math.log10(rms) : -96\n\n const level = {\n rms: Math.round(rms * 10000) / 10000,\n dbfs: Math.round(dbfs * 10) / 10,\n }\n\n // ── Classification (in-process pipeline) ──\n let classification: AudioAnalysisResult['classification'] | undefined\n\n try {\n const result = await this.classify(chunk)\n if (this.classifyCallCount < 3) {\n const topRaw = result.labels.slice(0, 5).map(l => `${l.className}(${(l.score * 100).toFixed(0)}%)`).join(', ')\n this.log.info('classify debug sample', {\n tags: chunk.deviceId !== undefined ? { deviceId: chunk.deviceId } : undefined,\n meta: {\n index: this.classifyCallCount,\n labelCount: result.labels.length,\n top: topRaw,\n inferenceMs: result.inferenceMs,\n minConf: settings.minConfidence,\n allowedClasses: settings.allowedClasses,\n },\n })\n }\n this.classifyCallCount++\n\n if (result.inferenceMs > 0) {\n // Apply filtering (analyzer responsibility — settings come from per-device config)\n const minConf = settings.minConfidence\n const allowedSet = settings.allowedClasses.length > 0\n ? new Set(settings.allowedClasses.map(c => c.toLowerCase()))\n : null\n\n let filtered = result.labels.filter(c => c.score >= minConf)\n if (allowedSet) {\n filtered = filtered.filter(c => allowedSet.has(c.className.toLowerCase()))\n }\n\n if (filtered.length > 0) {\n classification = {\n labels: filtered,\n inferenceMs: result.inferenceMs,\n }\n }\n }\n } catch (err: unknown) {\n const now = Date.now()\n const sinceLastMs = now - this.lastClassifyErrorMs\n if (sinceLastMs >= CLASSIFY_ERROR_SUPPRESS_MS) {\n const suppressed = this.suppressedClassifyErrors\n this.suppressedClassifyErrors = 0\n this.lastClassifyErrorMs = now\n const msg = errMsg(err)\n const stack = err instanceof Error ? err.stack : undefined\n this.log.warn('Audio classification failed', {\n tags: chunk.deviceId !== undefined ? { deviceId: chunk.deviceId } : undefined,\n meta: { error: msg, stack, suppressedSince: suppressed > 0 ? suppressed : undefined },\n })\n } else {\n this.suppressedClassifyErrors++\n }\n }\n\n return { level, classification, timestamp: chunk.timestamp }\n }\n\n async classify(chunk: AudioChunkInput): Promise<AudioClassificationResult> {\n // Per-camera concurrency guard: at most 1 chunk in flight per device.\n // Drops the incoming call immediately if that camera already has one\n // in progress or hasn't waited the minimum interval since its last call.\n // Cameras are isolated — camera A classifying does NOT block camera B.\n const camKey = chunk.deviceId ?? GLOBAL_DEVICE_KEY\n const now = Date.now()\n const state = this.cameraState.get(camKey)\n if (state?.inProgress || (state !== undefined && (now - state.lastEndMs) < CLASSIFY_MIN_INTERVAL_MS)) {\n return { labels: [], rawLabels: [], inferenceMs: 0 }\n }\n\n if (this.pipelineBusy) {\n return { labels: [], rawLabels: [], inferenceMs: 0 }\n }\n\n this.cameraState.set(camKey, { inProgress: true, lastEndMs: state?.lastEndMs ?? 0 })\n this.pipelineBusy = true\n // AudioChunkInput.data carries raw f32le bytes — reconstruct Float32Array\n // before passing to the pipeline (YAMNet/Apple SoundAnalysis need floats).\n // See float32FromBytes: msgpack-decoded Uint8Arrays may be 4-byte-misaligned.\n const f32Data = float32FromBytes(chunk.data)\n const result = await this.pipeline.classify({\n data: f32Data,\n sampleRate: chunk.sampleRate,\n channels: chunk.channels,\n }).finally(() => {\n this.pipelineBusy = false\n this.cameraState.set(camKey, { inProgress: false, lastEndMs: Date.now() })\n })\n\n // Log raw labels at regular intervals — opt-in debug only.\n if (this.debugClassifySamples && (this.classifyCount < 3 || this.classifyCount % 100 === 0)) {\n const rawTop = result.classifications.slice(0, 5).map(c => `\"${c.className}\"(${(c.score * 100).toFixed(0)}%)`).join(', ')\n this.log.info('classify debug sample', {\n tags: chunk.deviceId !== undefined ? { deviceId: chunk.deviceId } : undefined,\n meta: {\n index: this.classifyCount,\n engine: this.backendName,\n rawLabelCount: result.classifications.length,\n top: rawTop,\n inferenceMs: result.inferenceMs,\n },\n })\n }\n this.classifyCount++\n\n // Map raw labels → macro classes, aggregate scores per macro class.\n const macroAccum = new Map<string, { score: number; rawTop: string }>()\n for (const c of result.classifications) {\n const macro = mapAudioLabelToMacro(c.className)\n if (!macro) continue\n const prev = macroAccum.get(macro)\n if (!prev || c.score > prev.score) {\n macroAccum.set(macro, { score: c.score, rawTop: c.className })\n }\n }\n\n // Sort by score descending\n const labels = [...macroAccum.entries()]\n .sort((a, b) => b[1].score - a[1].score)\n .map(([className, { score, rawTop }]) => ({ className, originalClass: rawTop, score }))\n\n // Raw backend-native labels (no macro aggregation), sorted by score descending.\n const rawLabels = [...result.classifications]\n .sort((a, b) => b.score - a.score)\n .map((c) => ({ className: c.className, originalClass: c.className, score: c.score }))\n\n return { labels, rawLabels, inferenceMs: result.inferenceMs }\n }\n\n isReady(): boolean {\n return this.pipeline !== null\n }\n\n async dispose(): Promise<void> {\n await this.pipeline.dispose()\n }\n\n // Expose via the cap so the reprobe button in the UI reaches the\n // right worker. Delegates to the addon-owned reprobe (it touches\n // `ctx.settings.writeAddonStore` which only the addon has access to).\n async reprobeAudioEngine(): Promise<{ backend: string }> {\n return this.reprobeImpl()\n }\n}\n\n/**\n * Audio Analyzer addon — provides the `audio-analyzer` capability.\n *\n * Owns the IAudioPipeline directly — no tRPC roundtrip to a separate\n * audio-classifier addon.\n */\nexport class AudioAnalyzerAddon extends BaseAddon<AudioAnalyzerGlobalConfig> {\n readonly id = 'audio-analyzer'\n\n private provider: AudioAnalyzerProvider | null = null\n private pipeline: IAudioPipeline | null = null\n\n constructor() { super(DEFAULT_AUDIO_ANALYZER_CONFIG) }\n\n protected globalSettingsSchema(): ConfigUISchema {\n return {\n sections: [\n {\n id: 'audio-engine',\n title: 'Audio',\n // Co-located with detection-pipeline's `engine` section under\n // a single \"Engine\" tab. Both sections handle inference-engine\n // selection but for different modalities — distinct purposes\n // are conveyed through section titles (\"Detection engine\" vs\n // \"Audio inference engine\") and descriptions, not separate\n // tabs.\n tab: 'engine',\n // Renders after detection-pipeline's `engine` section\n // (`order: 0`) on the \"Inference Engine\" tab.\n order: 10,\n description:\n 'Audio classification backend (Apple SoundAnalysis or YAMNet ONNX). Independent from the vision-detection engine above. \"Auto\" picks Apple SoundAnalysis on macOS, YAMNet on Linux. Click the refresh icon next to \"Probed best\" to re-run the probe.',\n // Field order — `probedBest*` lives at the top so the operator\n // sees the auto-detected hint first and can compare it against\n // their override below at a glance. Same convention as the\n // detection-pipeline section.\n fields: [\n {\n type: 'text' as const,\n key: 'probedBestAudioBackend',\n label: 'Probed best',\n description: 'Auto-detected best audio backend on this host. Click the refresh icon to re-run the probe.',\n readonlyField: true,\n default: '',\n actions: [\n { action: 'reprobe-audio-engine', icon: 'refresh-cw', tooltip: 'Re-probe audio engine' },\n ],\n },\n {\n type: 'select' as const,\n key: 'audioBackend',\n label: 'Audio backend',\n options: AUDIO_BACKEND_CHOICES.map(o => ({ value: o.value, label: o.label })),\n default: DEFAULT_AUDIO_ANALYZER_CONFIG.audioBackend,\n immediate: true,\n requiresRestart: true,\n },\n {\n type: 'select' as const,\n key: 'selectedAudioModel',\n label: 'Classification model',\n description:\n 'Empty = auto (matches backend). Device-level settings can only inherit / enable / disable this step; model + class filters live here at the node level.',\n options: AUDIO_MODEL_OPTIONS.map(o => ({ value: o.value, label: o.label })),\n default: DEFAULT_AUDIO_ANALYZER_CONFIG.selectedAudioModel,\n immediate: true,\n requiresRestart: true,\n },\n ],\n },\n ],\n }\n }\n\n /**\n * Cascade override — narrow the `selectedAudioModel` options to the\n * subset compatible with the currently-selected `audioBackend`.\n *\n * Same pattern as detection-pipeline's `engineRuntime → engineBackend\n * → engineDevice` cascade: the base schema ships every option\n * (Auto + YAMNet + Apple SA); this override drops the rows that\n * belong to a backend the operator didn't pick. With `immediate:\n * true` on the `audioBackend` select, the UI refetches schema after\n * every flip and the model dropdown updates instantly.\n *\n * `overlay` carries the operator's tentative choices for benchmark/\n * preview mode (operator typed but didn't save yet) — same\n * semantics detection-pipeline relies on.\n */\n override async getGlobalSettings(overlay?: Record<string, unknown>): Promise<ConfigUISchemaWithValues> {\n const ctx = this.ctxIfReady\n const stored = ctx?.settings ? ((await ctx.settings.readAddonStore()) ?? {}) : {}\n const merged = overlay ? { ...stored, ...overlay } : stored\n\n // Resolve the effective backend the same way the runtime would.\n const operatorChoice = typeof merged.audioBackend === 'string' ? merged.audioBackend : DEFAULT_AUDIO_ANALYZER_CONFIG.audioBackend\n const effectiveBackend: AudioBackend =\n operatorChoice === 'apple-soundanalysis' ? 'apple-soundanalysis'\n : operatorChoice === 'yamnet-onnx' ? 'yamnet-onnx'\n : process.platform === 'darwin' ? 'apple-soundanalysis' : 'yamnet-onnx'\n\n // The \"Auto\" entry always passes through — it just resolves to the\n // effective backend at runtime. The other rows are filtered to\n // match the current backend so the UI doesn't suggest impossible\n // combos (e.g. picking \"Apple SoundAnalysis (built-in)\" while\n // backend=yamnet-onnx).\n const filteredModels = AUDIO_MODEL_OPTIONS.filter(\n (o) => o.value === '' || o.value === effectiveBackend,\n )\n\n // Re-project the persisted `selectedAudioModel` onto the narrowed\n // option list — if the previous backend's model is no longer valid\n // for the new backend, snap to \"Auto\" so the dropdown doesn't\n // render an empty value.\n const storedModel = typeof merged.selectedAudioModel === 'string' ? merged.selectedAudioModel : ''\n const validModel = filteredModels.find((o) => o.value === storedModel)?.value ?? ''\n const raw = { ...merged, selectedAudioModel: validModel }\n\n const schema = this.globalSettingsSchema()\n const patched: ConfigUISchema = {\n ...schema,\n sections: schema.sections.map((section) => ({\n ...section,\n fields: section.fields.map((field) => {\n if (field.type === 'select' && field.key === 'selectedAudioModel') {\n return { ...field, options: filteredModels.map((o) => ({ value: o.value, label: o.label })) }\n }\n return field\n }),\n })),\n }\n return hydrateSchema(patched, raw)\n }\n\n /**\n * Re-run the platform probe and persist the detected backend into\n * `probedBestAudioBackend`. Operator `audioBackend` setting is not\n * touched — only the hint.\n */\n async reprobeAudioEngine(): Promise<{ backend: string }> {\n const backend: AudioBackend = process.platform === 'darwin' ? 'apple-soundanalysis' : 'yamnet-onnx'\n await this.ctx.settings?.writeAddonStore({ probedBestAudioBackend: backend })\n this.ctx.logger.info('reprobeAudioEngine: wrote probedBestAudioBackend', { meta: { backend } })\n return { backend }\n }\n\n /** Resolve the effective backend from the operator choice, falling back to the platform heuristic when 'auto'. */\n private resolveAudioBackend(): AudioBackend {\n const choice: AudioBackendChoice = this.config.audioBackend\n if (choice === 'apple-soundanalysis') return 'apple-soundanalysis'\n if (choice === 'yamnet-onnx') return 'yamnet-onnx'\n return process.platform === 'darwin' ? 'apple-soundanalysis' : 'yamnet-onnx'\n }\n\n protected async onInitialize(): Promise<ProviderRegistration[]> {\n const logger = this.ctx.logger as IScopedLogger\n\n // Enable/disable is driven by the binding system (per-device\n // `audio-analysis` wrapper) + the pipeline tree\n // (`addonDefaults['audio-classifier'].enabled`). The addon itself\n // always boots its pipeline; consumers not bound / not in the tree\n // simply don't invoke `classify`.\n\n // Initialize the audio pipeline (YAMNet ONNX / Apple SoundAnalysis)\n const modelsDir = await this.ctx.api.storage.resolve.query({ location: 'models', relativePath: '' })\n .catch(() => 'camstack-data/models')\n const backend = this.resolveAudioBackend()\n logger.info('audio-analyzer: resolving pipeline', {\n meta: { operatorChoice: this.config.audioBackend, effectiveBackend: backend, selectedModel: this.config.selectedAudioModel || null },\n })\n const p = await createAudioPipeline(modelsDir, logger, { backend })\n await p.initialize()\n this.pipeline = p\n\n // Auto-seed probedBestAudioBackend so the UI shows the effective\n // platform default on first boot (matches what we just booted).\n if (!this.config.probedBestAudioBackend) {\n this.reprobeAudioEngine().catch((err: unknown) => {\n logger.warn('audio: auto-reprobe failed', {\n meta: { error: err instanceof Error ? err.message : String(err) },\n })\n })\n }\n\n // Device settings resolver — pulls the audio-classifier step's\n // `settings` map from the orchestrator's resolved pipeline. The\n // settings live on the audio-classifier step (in\n // `agent.addonDefaults['audio-classifier'].settings` overlaid with\n // any per-device patch). No per-device store on this addon.\n const self = this\n const deviceSettingsResolver = async (deviceId: number): Promise<AudioAnalysisSettings | null> => {\n try {\n const resolved = await self.ctx.api.pipelineOrchestrator.resolvePipeline.query({ deviceId })\n const stepSettings = resolved.audio?.settings ?? {}\n const minConfidence = typeof stepSettings['minConfidence'] === 'number'\n ? (stepSettings['minConfidence'] as number)\n : 0.3\n const allowedClasses = Array.isArray(stepSettings['enabledAudioClasses'])\n ? (stepSettings['enabledAudioClasses'] as string[])\n : []\n return { minConfidence, allowedClasses }\n } catch (err) {\n logger.warn('audio: resolveDeviceSettings via orchestrator failed', {\n tags: { deviceId },\n meta: { error: err instanceof Error ? err.message : String(err) },\n })\n return null\n }\n }\n\n const deviceContributionResolver = async (_deviceId: number): Promise<ConfigUISchemaWithValues | null> => {\n // No device-level surface — settings live on the audio-classifier\n // pipeline step (Orchestrator tab).\n return null\n }\n const deviceSettingsPatcher = async (_deviceId: number, _patch: Record<string, unknown>): Promise<void> => {\n // No-op: per-device audio settings moved to the audio-classifier step.\n }\n\n this.provider = new AudioAnalyzerProvider(\n logger,\n this.pipeline,\n backend,\n deviceSettingsResolver,\n deviceContributionResolver,\n deviceSettingsPatcher,\n () => this.reprobeAudioEngine(),\n )\n // Split registration mirrors stream-broker/camera-streams + snapshot/snapshot-provider:\n // - audio-analyzer (system): compute path (analyseChunk / classify / isReady / dispose)\n // - audio-analysis (device, wrapper defaultActive): per-device surface — resolveDeviceSettings,\n // the three DeviceSettingsContribution methods and the onAudioLevel event.\n // Every camera gets a binding row; operators disable per-device via setWrapperActive.\n return [\n { capability: audioAnalyzerCapability, provider: this.provider },\n {\n capability: audioAnalysisCapability,\n provider: this.provider,\n },\n ]\n }\n\n protected async onShutdown(): Promise<void> {\n if (this.provider) {\n await this.provider.dispose()\n this.provider = null\n }\n this.pipeline = null\n }\n\n // ── Standard ICamstackAddon — three-level settings API ─────\n //\n // Per-device audio settings (audio class filter + minConfidence) moved\n // to the audio-classifier pipeline step's `getConfigSchema()` and the\n // orchestrator owns the audio node assignment (`audioNodeId`). No\n // device-level settings remain on this addon.\n\n buildDeviceSchema(): ConfigUISchema {\n return { sections: [] }\n }\n\n async getDeviceSettings(deviceId: number): Promise<ConfigUISchemaWithValues> {\n const raw = (await this.ctx?.settings?.readDeviceStore(deviceId)) ?? {}\n return hydrateSchema(this.buildDeviceSchema(), raw)\n }\n\n async updateDeviceSettings(deviceId: number, patch: Record<string, unknown>): Promise<void> {\n await this.ctx?.settings?.writeDeviceStore(deviceId, patch)\n }\n}\n"],"names":["HF_BASE_URL","path","fs","downloadFile","errMsg","mapAudioLabelToMacro","BaseAddon","DEFAULT_AUDIO_ANALYZER_CONFIG","AUDIO_BACKEND_CHOICES","hydrateSchema","audioAnalyzerCapability","audioAnalysisCapability"],"mappings":"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"}
|