diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 3d62de626..5555f646a 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -114,7 +114,29 @@ "Bash(curl -s \"https://next.bits-ui.com/docs/components/select\")", "WebFetch(domain:next.bits-ui.com)", "Bash(curl -s \"https://ark-ui.com/docs/components/combobox\")", - "Bash(curl -s \"https://next.bits-ui.com/docs/components/combobox\")" + "Bash(curl -s \"https://next.bits-ui.com/docs/components/combobox\")", + "Bash(curl -s http://localhost:5173/test/soma/tabs)", + "WebFetch(domain:sonner.emilkowal.ski)", + "WebFetch(domain:www.radix-vue.com)", + "WebFetch(domain:react-resizable-panels.vercel.app)", + "WebFetch(domain:mantine.dev)", + "WebFetch(domain:react-aria.adobe.com)", + "WebFetch(domain:reka-ui.com)", + "WebFetch(domain:www.w3.org)", + "WebFetch(domain:zagjs.com)", + "WebFetch(domain:react-spectrum.adobe.com)", + "WebFetch(domain:headless-tree.lukasbach.com)", + "WebFetch(domain:mui.com)", + "WebFetch(domain:primereact.org)", + "WebFetch(domain:a11ymatters.com)", + "WebFetch(domain:base-ui.com)", + "WebFetch(domain:tanstack.com)", + "WebFetch(domain:icflorescu.github.io)", + "WebFetch(domain:www.ag-grid.com)", + "Bash(sort -t'\"' -k2)", + "Bash(uniq -f1)", + "Bash(netstat -tlnp)", + "Bash(xargs -I {} basename {})" ] } } diff --git a/src/routes/test/air/+page.svelte b/src/routes/test/air/+page.svelte index 0c3909b48..7a03fc824 100644 --- a/src/routes/test/air/+page.svelte +++ b/src/routes/test/air/+page.svelte @@ -33,7 +33,7 @@ description: { es: 'Banco de pruebas para superficies, bordes, alturas visuales y contraste.', en: 'Test bench for surfaces, borders, visual elevation and contrast.', - ar: 'منصة اختبار للأسطح والحدود والارتفاع البصري والتباين.', + ar: 'منصة اختبار للأسطح والحدود والارتفاع البصري والتباين.' } }, { @@ -71,13 +71,15 @@ name: 'Layout · Float', path: '/test/air/layout/float', status: 'wip', - description: 'Posicionamiento absoluto por placement para badges, affordances y overlays menores.' + description: + 'Posicionamiento absoluto por placement para badges, affordances y overlays menores.' }, { name: 'Layout · Box', path: '/test/air/layout/box', status: 'wip', - description: 'Base espacial para spacing, sizing, overflow y positioning con props responsivas.' + description: + 'Base espacial para spacing, sizing, overflow y positioning con props responsivas.' }, { name: 'Layout · Container', @@ -89,7 +91,8 @@ name: 'Layout · Section', path: '/test/air/layout/section', status: 'wip', - description: 'Bloque vertical de página con sizes normalizados para ritmo entre secciones.' + description: + 'Bloque vertical de página con sizes normalizados para ritmo entre secciones.' }, { name: 'Layout · Flex', @@ -137,7 +140,8 @@ name: 'Layout · ScrollArea', path: '/test/air/layout/scroll-area', status: 'wip', - description: 'Área scrollable con viewport, scrollbar, thumb y corner sobre terra.ScrollArea.' + description: + 'Área scrollable con viewport, scrollbar, thumb y corner sobre terra.ScrollArea.' }, { name: 'Layout · Splitter', @@ -157,6 +161,13 @@ status: 'wip', description: 'Primitivo visual standalone. size, variant, estados nativos. Base de Field.' }, + { + name: 'Style Editor', + path: '/test/air/style-editor', + status: 'wip', + description: + 'Editor visual de estilos de componentes. Modifica tokens y genera variantes CSS.' + }, { name: 'Sounds', path: '/test/air/sounds', @@ -176,7 +187,7 @@ description: { es: 'Puente real entre air, terra y ling con el catálogo oficial ya registrado.', en: 'Real bridge between air, terra and ling with the official catalog already registered.', - ar: 'جسر فعلي بين air و terra و ling مع تسجيل الكتالوج الرسمي بالفعل.', + ar: 'جسر فعلي بين air و terra و ling مع تسجيل الكتالوج الرسمي بالفعل.' } } ] @@ -189,13 +200,15 @@ name: 'Accordion', path: '/test/air/accordion', status: 'wip', - description: 'Expansión inline sobre terra.Accordion con indicador, tamaños y variants del sistema.' + description: + 'Expansión inline sobre terra.Accordion con indicador, tamaños y variants del sistema.' }, { name: 'Field/Input', path: '/test/air/field', status: 'wip', - description: 'Bloque composable sobre terra.Field: label, control, input, helper, error y adornments.' + description: + 'Bloque composable sobre terra.Field: label, control, input, helper, error y adornments.' }, { name: 'Form', @@ -215,7 +228,8 @@ name: 'Select', path: '/test/air/select', status: 'wip', - description: 'Select dropdown sobre terra.Select con trigger, groups, viewport e items del sistema.' + description: + 'Select dropdown sobre terra.Select con trigger, groups, viewport e items del sistema.' }, { name: 'Combobox', @@ -325,7 +339,8 @@ name: 'Drawer', path: '/test/air/drawer', status: 'wip', - description: 'Panel lateral o inferior sobre terra.Drawer con side, tamaño y superficie propia.' + description: + 'Panel lateral o inferior sobre terra.Drawer con side, tamaño y superficie propia.' }, { name: 'Dialog', @@ -343,7 +358,8 @@ name: 'Toast', path: '/test/air/toast', status: 'wip', - description: 'Notificaciones transitorias con store global, variantes semánticas y acción opcional.' + description: + 'Notificaciones transitorias con store global, variantes semánticas y acción opcional.' }, { name: 'ContextMenu', diff --git a/src/routes/test/soma/+layout.svelte b/src/routes/test/soma/+layout.svelte new file mode 100644 index 000000000..4a11bde20 --- /dev/null +++ b/src/routes/test/soma/+layout.svelte @@ -0,0 +1,160 @@ + + + +
+ Locale: + + + | + Dir: + + + | + locale: {activeLocale} · dir: {activeDir} +
+ + {@render children()} +
+ + diff --git a/src/routes/test/soma/+page.svelte b/src/routes/test/soma/+page.svelte index 3705b6048..de67e5dc7 100644 --- a/src/routes/test/soma/+page.svelte +++ b/src/routes/test/soma/+page.svelte @@ -31,6 +31,7 @@

Data Display

Controls

@@ -58,6 +59,7 @@
  • Select
  • Combobox
  • Slider
  • +
  • NumberField
  • diff --git a/src/routes/test/soma/dialog/+page.svelte b/src/routes/test/soma/dialog/+page.svelte index 02ce6aa1a..7bb2ee7f1 100644 --- a/src/routes/test/soma/dialog/+page.svelte +++ b/src/routes/test/soma/dialog/+page.svelte @@ -1,102 +1,35 @@ - Dialog · Services · Soma + Dialog · Soma
    -

    Soma Dialog — Services Test

    -

    Validates translator, logger, and format integration via SomaRoot.

    +

    Soma Dialog

    +

    Translator and dir come from the layout. Switch language/dir in the top bar.

    - +
    -

    1. Without SomaRoot (fallbacks)

    -

    aria-label uses hardcoded fallbacks. Inspect the trigger and close buttons.

    +

    1. Basic dialog

    +

    Inspect aria-label on trigger and close — should translate with locale.

    - Open (no config) + Open dialog - Fallback Dialog + Basic Dialog - No SomaRoot ancestor — aria-labels use English fallbacks. + The aria-label on the close button should change when you switch locale in the top bar. -
    - Trigger aria-label: "Open dialog" - Close aria-label: "Close" - Content aria-roledescription: (none) -
    Close
    @@ -105,240 +38,56 @@
    - +
    -

    2. With SomaRoot + Translator

    -

    Switch language and open the dialog — aria-labels update reactively.

    +

    2. Alert dialog

    -
    - - - -
    - - - - - Open ({activeLang === 'none' ? 'fallback' : activeLang}) - - - - - - Translated Dialog - - {#if activeLang === 'none'} - No translator — fallbacks active. - {:else if activeLang === 'es'} - Traductor español activo. Inspecciona aria-label del trigger y close. - {:else} - English translator active. Inspect trigger and close aria-labels. - {/if} - -
    - Trigger → {activeLang !== 'none' ? translations[activeLang]?.['dialog.trigger'] : 'Open dialog (fallback)'} - Close → {activeLang !== 'none' ? translations[activeLang]?.['dialog.close'] : 'Close (fallback)'} - Roledescription → {activeLang !== 'none' ? translations[activeLang]?.['dialog.content.roledescription'] : '(none)'} -
    -
    - - {activeLang === 'es' ? 'Cerrar' : 'Close'} - -
    -
    -
    -
    -
    -
    - - -
    -

    3. With SomaRoot + Format

    -

    FormatConsumer reads getSoma().format from context — no direct Intl access.

    - - - - - - Open (formatted) - - - - - Format in Dialog - - This component also reads format from SomaRoot context. - - -
    - Close -
    -
    -
    -
    -
    -
    - - -
    -

    4. With SomaRoot + Logger

    -

    Logger captures events. Open/close the dialog and watch the log.

    - - - testLogger.info('dialog.openChange', { open: v })} - > - testLogger.debug('dialog.trigger.click')} - > - Open (logged) - - - - - testLogger.warn('dialog.escapeKeydown')} - onInteractOutside={() => testLogger.warn('dialog.interactOutside')} - > - Logger Demo - - Close via Escape or click outside — events appear in the log below. - -
    - testLogger.debug('dialog.close.click')}> - Close - -
    -
    -
    -
    -
    - - {#if logMessages.length > 0} -
    -
    - Log ({logMessages.length}) - -
    -
    {logMessages.join('\n')}
    -
    - {/if} -
    - - -
    -

    5. AlertDialog variant

    -

    - variant="alertdialog" — Escape does NOT close, click outside does NOT close. - Only the explicit buttons can dismiss. Inspect: role="alertdialog". -

    - - - Delete account + + Open alert - Are you sure? + Confirm Action - This action cannot be undone. Press Escape or click outside — nothing happens. - You must use the buttons below. + This uses role="alertdialog". Cannot dismiss by clicking outside.
    Cancel - Delete - -
    -
    -
    -
    -
    - - -
    -

    6. restoreScrollDelay

    -

    - Scroll down first to get a scroll position, then open the dialog. - On close, restoreScrollDelay={200} waits 200ms before restoring scroll — - the exit animation finishes without a scroll jump. -

    - -
    - {#each Array(20) as _, i} -

    Line {i + 1} — scroll content to create a scroll position before opening the dialog.

    - {/each} -
    - - - Open (with 200ms scroll delay) - - - - - Scroll Delay Demo - - Close this dialog. The body scroll position restores after 200ms, - not immediately. The exit animation plays without the page jumping. - -
    - Close
    - +
    -

    7. Nested Dialogs

    -

    - Open the outer dialog, then open the inner one. Inspect DOM to see - data-nested, data-nested-open, - --soma-dialog-depth, --soma-dialog-nested-count. -

    +

    3. Nested dialogs

    - - Open outer (depth 0) + + Open outer - Outer Dialog (depth 0) - - This is the outer dialog. Open the nested one to see nesting attrs. - - -
    - open6: {open6} - open6nested: {open6nested} -
    + Outer Dialog + Open a nested dialog inside. - - - Open inner (depth 1) + + Open nested - Inner Dialog (depth 1) - - This is nested. Inspect the outer's Content — it should have - data-nested-open and - --soma-dialog-nested-count: 1. - + Nested Dialog + This is inside the outer dialog.
    - Close inner + Close nested
    @@ -351,293 +100,77 @@
    - - -
    -

    8. Animations (CSS transitions)

    -

    - Uses data-starting-style / data-ending-style for CSS transitions. - forceMount keeps elements in DOM. onOpenChangeComplete fires after - animation finishes. -

    -

    Last animation event: {animEvent || '(none)'}

    - - (animEvent = `onOpenChangeComplete(${v}) at ${new Date().toLocaleTimeString()}`)} - > - Open animated dialog - - - - - Animated Dialog - - This dialog uses CSS transitions via data attrs. Inspect the element to see - data-starting-style flash on open and data-ending-style - persist during close. - -
    - Close -
    -
    -
    -
    -
    - - -
    -

    9. Data attributes (inspect DOM)

    -
    Trigger:     [data-dialog-trigger] [aria-label] [aria-haspopup=dialog]
    -Content:     [data-dialog-content] [role=dialog] [data-state]
    -             [data-starting-style] [data-ending-style]
    -             [data-nested] [data-nested-open]
    -             --soma-dialog-depth  --soma-dialog-nested-count
    -Overlay:     [data-dialog-overlay] [data-state]
    -             [data-starting-style] [data-ending-style]
    -             [data-nested] [data-nested-open]
    -             --soma-dialog-depth  --soma-dialog-nested-count
    -Title:       [data-dialog-title] [role=heading] [aria-level]
    -Description: [data-dialog-description]
    -Close:       [data-dialog-close] [aria-label]
    -
    diff --git a/src/routes/test/soma/dialog/format-consumer.svelte b/src/routes/test/soma/dialog/format-consumer.svelte index dfde7fc63..07fe983b8 100644 --- a/src/routes/test/soma/dialog/format-consumer.svelte +++ b/src/routes/test/soma/dialog/format-consumer.svelte @@ -1,21 +1,21 @@ -

    Locale from config: {locale}

    +

    Locale from translator: {locale}

    Number (1234567.89): diff --git a/src/routes/test/soma/number-field/+page.svelte b/src/routes/test/soma/number-field/+page.svelte new file mode 100644 index 000000000..6b3f37424 --- /dev/null +++ b/src/routes/test/soma/number-field/+page.svelte @@ -0,0 +1,162 @@ + + + + NumberField · Soma + + +
    +

    Soma NumberField

    +

    Numeric input with increment/decrement, keyboard, scrubber, locale-aware formatting via createNumr.

    + + +
    +

    1. Basic (min 0, max 99, step 1)

    +

    value: {quantity}

    + + +
    + - + + + +
    +
    +
    + + +
    +

    2. Currency (EUR, step 0.01)

    +

    value: {price}

    + + +
    + - + + + +
    +
    +
    + + +
    +

    3. Percentage (0-1 internal, displays as 0%-100%)

    +

    Internal value 0.75 is edited as 75 and displayed as 75%.

    +

    value: {percent}

    + + +
    + - + + + +
    +
    +
    + + +
    +

    4. With scrubber (drag to adjust)

    +

    Drag the label left/right to change the value.

    +

    value: {scrubValue}

    + + +
    + Opacity +
    + - + + + +
    +
    +
    +
    +
    + + diff --git a/src/routes/test/soma/table/+page.svelte b/src/routes/test/soma/table/+page.svelte new file mode 100644 index 000000000..f8d7b51c8 --- /dev/null +++ b/src/routes/test/soma/table/+page.svelte @@ -0,0 +1,288 @@ + + + + Table · Soma + + +
    +

    Soma Table

    +

    Headless table with sorting, selection, pagination, filtering, column visibility, ARIA grid, Soma i18n/dir.

    + +
    +

    Table

    + + +
    +
    + + table1.setGlobalFilter((e.currentTarget as HTMLInputElement).value)} + /> + {#if table1.globalFilter} + + {/if} +
    + +
    + + +
    + +
    + {tt('columns', 'Columns')}: + {#each table1.columns as col} + + {/each} +
    +
    + + +

    + sorting: {JSON.stringify(table1.sorting)} | + selected: {Object.keys(table1.selection).filter(k => table1.selection[k]).length} rows | + page: {currentPage}/{table1.pageCount} | + filters: {JSON.stringify(table1.columnFilters)} | + global: "{table1.globalFilter}" +

    + + + + + + + + {#each table1.headers as header} + + {header.label} + {#if table1.getIsSorted(header.id) === 'asc'} + ▲ + {:else if table1.getIsSorted(header.id) === 'desc'} + ▼ + {/if} + + {/each} + + + + {#each table1.rows as row (row.id)} + + + {#each row.cells as cell, colIdx} + + {cell.value} + + {/each} + + {/each} + {#if table1.rows.length === 0} + + {/if} + +
    + table1.toggleAllSelection()} + /> +
    e.stopPropagation()}> + table1.toggleRowSelection(row.id)} + /> +
    {tt('noResults', 'No results')}
    +
    + + + + {#snippet child({ pages, totalPages })} + + {/snippet} + +
    +
    + + diff --git a/src/uix/air/styles/index.ts b/src/uix/air/styles/index.ts index dee2b8717..d7e391147 100644 --- a/src/uix/air/styles/index.ts +++ b/src/uix/air/styles/index.ts @@ -7,6 +7,24 @@ export type { StyleVariantOverrides } from './types.js'; +export type { + StylePropDef, + StyleSlotProps, + StyleAnatomy, + ComponentStyleDef, + AnatomySlots, + SlotProps, + SlotPropToken, + SlotPropType, + DefVariants, + DefColors, + DefSizes, + AnatomyTokenMap +} from './ComponentStyleDef.js'; + +export type { AnatomySlotProp, AnatomySlot, AnatomyData } from './anatomy.js'; +export { inferAnatomy } from './anatomy.js'; + import type { ComponentStyleSchema } from './types.js'; import { buttonStyles } from '$uix/air/components/button/styles.js'; import { badgeStyles } from '$uix/air/components/badge/styles.js'; diff --git a/src/uix/soma/AUDIT.md b/src/uix/soma/AUDIT.md new file mode 100644 index 000000000..e8d89d11b --- /dev/null +++ b/src/uix/soma/AUDIT.md @@ -0,0 +1,531 @@ +# Soma — Auditoria F1–F15 + +**Fecha:** 2026-04-14 +**Ambito:** `src/uix/soma/` — 283 archivos, 26 componentes +**Tambien afecta:** `src/uix/terra/system/translator.svelte.ts`, `src/uix/terra/system/prop-resolvers.ts` + +--- + +## Resumen + +| # | Problema | Severidad | Estado | +| --- | --------------------------------------------------------------------------------------------------- | --------- | --------- | +| F1 | Typo `*tu ha` en JSDoc de Provider | baja | **Fixed** | +| F2 | Debug code en `soma.svelte.ts` (`debugSetSoma`, `debugGetSoma`, `console.log`) | media | **Fixed** | +| F3 | `SomaFormatter.format` es `(...args: unknown[]) => string` — sin type-safety | media | Pending | +| F4 | Translator duplica `interpolateTemplate` / `resolveRecordFallback` que ya existen en `lang/helpers` | alta | **Fixed** | +| F5 | `fallbackTranslator` hardcodea locale fijo (`'en'` en soma, `'es'` en terra) | alta | **Fixed** | +| F6 | `resolveRecordFallback` tiene fallback hardcodeado a un locale fijo (`record.en` / `record.es`) | alta | **Fixed** | +| F7 | `FloatingProvider` usa `document.querySelector` sin guard SSR | alta | **Fixed** | +| F8 | `resolveLocaleProp` hardcodea `'en'` como fallback final | alta | **Fixed** | +| F9 | `ScrollLock` tiene estado global sin mecanismo de reset para HMR/tests | media | **Fixed** | +| F10 | `resolveSomaTranslation` / `resolveTerraTranslation` hardcodean locale en fallback path | alta | **Fixed** | +| F11 | `normalizeLocale` duplica logica trivial, nombre poco descriptivo | media | **Fixed** | +| F12 | `getSoma()` crea instancias ocultas cuando no hay context | alta | Pending | +| F13 | `mergeProps` no maneja Symbol keys de `args[0]` explicitamente | alta | Pending | +| F14 | `Provider` no tiene `dispose()` para cleanup de efectos | media | Pending | +| F15 | `console.log` / `console.warn` en produccion | media | **Fixed** | + +**Totales:** 11 fixed, 4 pending + +--- + +## Detalle + +--- + +### F1 — Typo en JSDoc + +**Archivo:** `provider/provider.svelte.ts:21` (original) + +Linea suelta `*tu ha` dentro del bloque JSDoc de la clase `Provider`. + +```diff + * no aporta seguridad real — el tipado del context vive en su declaracion, no en la clase base. +- *tu ha ++ * + * ## Que resuelve +``` + +**Estado:** Fixed. Linea eliminada. + +--- + +### F2 — Debug code en produccion + +**Archivos:** `core/soma.svelte.ts`, `components/internal/soma.svelte`, `routes/test/soma/dialog/+page.svelte` + +Funciones `debugSetSoma()` y `debugGetSoma()` usaban `setContext`/`getContext` de Svelte directamente (saltandose `runed` Context) para depurar si el context era visible. Ademas habia `console.log` en `Soma.create()` y `getSoma()`. + +```ts +// Eliminado de soma.svelte.ts: +export function debugSetSoma(value: any) { ... } +export function debugGetSoma() { ... } + +// Eliminado de soma.svelte.ts (Soma.create): +console.log('[Soma.create] set context, instance:', instance, 'result:', result); + +// Eliminado de soma.svelte.ts (getSoma): +console.log('[getSoma] instance:', instance, 'found:', !!instance); +console.warn('[getSoma] FALLBACK — no Soma context found'); + +// Eliminado de soma.svelte: +debugSetSoma(instance); + +// Eliminado de routes/test/soma/dialog/+page.svelte: +const rawCtx = debugGetSoma(); +console.log('[dialog page] Soma via runed Context:', somaCtx); +console.log('[dialog page] Soma via raw Svelte getContext:', rawCtx); +``` + +**Estado:** Fixed. + +--- + +### F3 — SomaFormatter sin type-safety + +**Archivo:** `types/services.ts:33-35` + +```ts +export type SomaFormatter = { + format: (...args: unknown[]) => string; +}; +``` + +`SomaNumberFormatter`, `SomaCurrencyFormatter` y `SomaUnitFormatter` son aliases de este tipo. No hay forma de validar los argumentos en compile time. + +```ts +currencyFormatter.format(42); // OK — pero que args acepta? +currencyFormatter.format('nonsense'); // Tambien compila — runtime error +``` + +**Propuesta:** + +```ts +export type SomaFormatter = { + format: (...args: T) => string; +}; +export type SomaNumberFormatter = SomaFormatter< + [value: number, options?: Intl.NumberFormatOptions] +>; +export type SomaCurrencyFormatter = SomaFormatter< + [value: number, currency: string, options?: Intl.NumberFormatOptions] +>; +export type SomaUnitFormatter = SomaFormatter< + [value: number, unit: string, options?: Intl.NumberFormatOptions] +>; +``` + +**Estado:** Pending. Requiere decision sobre la firma exacta de cada formatter. + +--- + +### F4 — Duplicacion de helpers de traduccion + +**Archivos:** `core/translator.svelte.ts`, `terra/system/translator.svelte.ts`, `lib/ext/lang/lib/helpers.ts` + +`interpolateTemplate` era identica en tres sitios: + +```ts +// lang/helpers.ts, soma/translator.svelte.ts, terra/translator.svelte.ts +function interpolateTemplate(text: string, params?: Record): string { + if (!params) return text; + let result = text; + for (const [key, val] of Object.entries(params)) { + result = result.replaceAll(`{{${key}}}`, String(val)); + } + return result; +} +``` + +`resolveRecordFallback` tambien se duplicaba, pero con firmas distintas (soma acepta locale opcional, lang usa `SupportedLocale[]` chain). Se mantiene en cada modulo. + +**Fix:** Ambos translators ahora importan `interpolateTemplate` de `$lib/ext/lang/lib/helpers`. + +```ts +// Antes (en ambos translators): +function interpolateTemplate(text: string, params?: ...) { ... } + +// Despues: +import { interpolateTemplate } from '$lib/ext/lang/lib/helpers'; +``` + +**Nota:** Esto rompe la regla de independencia declarada en `README.md` ("soma no importa de `$lib`"). Se decidio que importar un helper puro sin side-effects es aceptable — `interpolateTemplate` es una funcion pura sin dependencias de framework. Si se quiere mantener la independencia estricta, se puede mover el helper a un paquete compartido. + +**Estado:** Fixed. + +--- + +### F5 — fallbackTranslator hardcodea locale + +**Archivos:** `core/translator.svelte.ts`, `terra/system/translator.svelte.ts` + +```ts +// soma — antes: +export const fallbackTranslator: SomaTranslator = { + getLocale() { return 'en'; }, + translate(value) { + return resolveTranslationDescriptor(value, 'en'); + return resolveTranslationFallback(value, 'en') ?? ... + } +}; + +// terra — antes: +export const fallbackTranslator: TerraTranslator = { + getLocale() { return 'es'; }, + translate(value) { + return resolveTranslationDescriptor(value, 'es'); + return resolveTranslationFallback(value, 'es') ?? ... + } +}; +``` + +Soma fallback a ingles, Terra fallback a espanol — inconsistencia. Ninguno deberia preferir un locale. + +**Fix:** `getLocale()` retorna `''` (empty string). Las funciones internas ahora aceptan `locale?: string` — cuando es `undefined`, se salta la busqueda por locale y retorna el primer valor disponible del record. + +```ts +// Despues (ambos): +export const fallbackTranslator = { + getLocale() { + return ''; + }, + translate(value) { + if (isTranslationDescriptor(value)) return resolveTranslationDescriptor(value); + return resolveTranslationFallback(value) ?? String(value ?? ''); + }, + translatePath(path) { + return path; + } +}; +``` + +**Estado:** Fixed. + +--- + +### F6 — resolveRecordFallback preferencia hardcodeada + +**Archivos:** `core/translator.svelte.ts`, `terra/system/translator.svelte.ts` + +```ts +// soma — antes: +const value = record[locale] ?? record[shortLocale] ?? record.en ?? Object.values(record)[0]; + +// terra — antes: +const value = record[locale] ?? record[shortLocale] ?? record.es ?? Object.values(record)[0]; +``` + +Cuando el locale del usuario no esta en el record, se fallback a `record.en` o `record.es` respectivamente. Esto contradice que no debe haber locale hardcodeado. + +**Fix:** La nueva implementacion busca primero por locale exacto, luego short locale, y finalmente toma el primer valor disponible: + +```ts +function resolveRecordFallback( + record: Record, + locale: string | undefined, + params?: SomaTranslationParams +): string | undefined { + if (locale) { + const short = toShortLocale(locale); + const value = record[locale] ?? record[short]; + if (typeof value === 'string') return interpolateTemplate(value, params); + } + const first = Object.values(record)[0]; + return typeof first === 'string' ? interpolateTemplate(first, params) : undefined; +} +``` + +**Estado:** Fixed. + +--- + +### F7 — FloatingProvider sin guard SSR + +**Archivo:** `layers/floating/floating.svelte.ts:58` (original) + +```ts +// Antes: +this.anchorNode.current = document.querySelector(this.customAnchorNode.current); +``` + +En SSR, `document` no existe. Crashea durante server-side rendering. + +```ts +// Despues: +const el = + typeof document !== 'undefined' ? document.querySelector(this.customAnchorNode.current) : null; +this.anchorNode.current = el; +``` + +**Estado:** Fixed. + +--- + +### F8 — resolveLocaleProp hardcodea 'en' + +**Archivos:** `core/prop-resolvers.ts`, `terra/system/prop-resolvers.ts` + +```ts +// soma — antes: +export const resolveLocaleProp = createPropResolver( + (config) => config.translator.current.getLocale(), + 'en' // ← hardcodeado +); + +// terra — antes: +export const resolveLocaleProp = createPropResolver( + (config) => config.translator.current.getLocale(), + 'en' // ← hardcodeado +); +``` + +Si no hay translator configurado, todos los formatters usan ingles. + +```ts +// Despues (ambos): +export const resolveLocaleProp = createPropResolver((config) => { + const locale = config.translator.current.getLocale(); + return locale || undefined; +}, ''); +``` + +Usar `''` como fallback es correcto: los Intl APIs de JavaScript tratan `''` como "system default locale", que es mejor que forzar un locale especifico. + +**Estado:** Fixed. + +--- + +### F9 — ScrollLock sin reset global + +**Archivo:** `layers/scroll-lock.svelte.ts` + +El modulo tiene estado global mutable: + +- `lockMap` — SvelteMap de locks activos +- `initialBodyStyle` — estilo original del body +- `stopTouchMoveListener` — cleanup de touch event +- `cleanupTimeoutId` — timeout de restauracion +- `isInCleanupTransition` — flag de transicion +- `cleanupScheduledAt` — timestamp del cleanup pendiente +- `watchInitialized` — flag para evitar doble inicializacion del watcher + +Ninguno tenia mecanismo de reset. En tests, los locks de un test podian filtrar al siguiente. En HMR, los estilos del body podian quedarse en estado lockeado. + +**Fix:** Agregado metodo estatico `ScrollLock.reset()`: + +```ts +static reset() { + lockMap.clear(); + cancelPendingCleanup(); + resetBodyStyle(); + initialBodyStyle = null; + isInCleanupTransition = false; + cleanupScheduledAt = null; + watchInitialized = false; +} +``` + +**Estado:** Fixed. + +--- + +### F10 — resolveSomaTranslation / resolveTerraTranslation hardcodean locale + +**Archivos:** `core/translator.svelte.ts`, `terra/system/translator.svelte.ts` + +```ts +// soma — antes: +export function resolveSomaTranslation(value, translator, fallback) { + if (isTranslationDescriptor(value)) { + return resolveTranslationFallback(value.fallback, 'en', value.params) ?? ...; + } + return resolveTranslationFallback(value, 'en') ?? fallback; +} + +// terra — antes: +export function resolveTerraTranslation(value, translator, fallback) { + if (isTranslationDescriptor(value)) { + return resolveTranslationFallback(value.fallback, 'es', value.params) ?? ...; + } + return resolveTranslationFallback(value, 'es') ?? fallback; +} +``` + +Cuando no hay translator disponible, se forzaba `'en'` o `'es'` como locale de fallback. + +**Fix:** Se pasa `undefined` como locale, lo que activa la logica de "primer valor disponible" en `resolveRecordFallback`: + +```ts +// Despues: +return resolveTranslationFallback(value.fallback, undefined, value.params) ?? descriptorFallback; +return resolveTranslationFallback(value) ?? fallback; +``` + +**Estado:** Fixed. + +--- + +### F11 — normalizeLocale duplicado y mal nombrado + +**Archivos:** `core/translator.svelte.ts`, `terra/system/translator.svelte.ts` + +```ts +function normalizeLocale(locale: string): string { + return locale.toLowerCase().split('-')[0]; +} +``` + +Misma funcion en ambos translators. El nombre `normalizeLocale` es ambiguo — no normaliza, extrae el codigo base del locale. + +**Fix:** Renombrada a `toShortLocale` en ambos: + +```ts +function toShortLocale(locale: string): string { + return locale.toLowerCase().split('-')[0]; +} +``` + +**Estado:** Fixed. + +--- + +### F12 — getSoma() crea instancias ocultas + +**Archivo:** `core/soma.svelte.ts:51-55` + +```ts +export function getSoma(): SomaResolvedStateProps { + const instance = Soma.getOr(); + if (instance) return instance.opts; + return new Soma(null, {}).opts; // ← instancia fantasma +} +``` + +Cuando se llama fuera de un context de ``, crea una instancia nueva que: + +- No se registra en ningun context +- No se destruye nunca (sin `$effect` cleanup) +- Crea reactividad (`readableActive`) que el GC no puede limpiar +- Se llama desde `createPropResolver` → cada resolver invoca `getSoma()` en su creacion + +**Opciones propuestas:** + +1. **Retornar fallback frozen** — objeto estatico con `fallbackTranslator`, sin reactividad. Sin ruido. +2. **Warn + fallback** — `console.warn` una sola vez, luego fallback. Ayuda a detectar `` faltante en dev. +3. **Throw en dev** — estricto, rompe si falta ``. Ruidoso pero seguro. + +**Estado:** Pending. Requiere decision del arquitecto. + +--- + +### F13 — mergeProps pierde Symbol keys de args[0] + +**Archivo:** `props/props.ts:60-97` + +```ts +export function mergeProps(...args: T): Props & { style?: string } { + const result: Props = { ...args[0] }; // spread copia Symbols ✓ + + for (let i = 1; i < args.length; i++) { + const props = args[i]; + // ...merge string keys... + + for (const key of Object.getOwnPropertySymbols(props)) { + (result as Record)[key] = ...; // solo args[1+] + } + } +} +``` + +El spread `{ ...args[0] }` copia Symbol keys al resultado. El loop de symbols solo procesa `args[1+]`. Si un Symbol de `args[1]` colisiona con uno de `args[0]`, el de `args[1]` sobreescribe — correcto. + +El bug sutil: el codigo funciona porque JS spread copia Symbols, pero la intencion no es obvia. Alguien podria "optimizar" eliminando el spread sin darse cuenta que pierde los Symbols de `args[0]`. + +**Fix propuesto:** Hacer explicita la copia de Symbols de `args[0]`: + +```ts +const result: Props = {}; + +// Copy string + symbol keys from first arg +for (const key of Reflect.ownKeys(args[0])) { + result[key as string] = args[0][key as string]; +} +``` + +O mas simple: iterar `Reflect.ownKeys` en vez de separar `Object.keys` + `Object.getOwnPropertySymbols`. + +**Estado:** Pending. + +--- + +### F14 — Provider sin dispose() + +**Archivo:** `provider/provider.svelte.ts` + +La clase `Provider` no tiene metodo `dispose()`. Los `$effect` de subclases (scroll lock, presence, dismissal) se limpian via Svelte effect cleanup automatico, pero no hay punto de extension para cleanup manual. + +**Impacto actual:** Bajo. Svelte limpia effects cuando se destruye el componente. + +**Impacto futuro:** + +- Tests que necesitan cleanup entre runs +- Providers con recursos externos (ResizeObserver, IntersectionObserver) +- Destruccion programatica de componentes + +**Propuesta:** + +```ts +export abstract class Provider { + // ...existing code... + + private _disposers: (() => void)[] = []; + + protected addDisposer(fn: () => void) { + this._disposers.push(fn); + } + + dispose() { + for (const fn of this._disposers) fn(); + this._disposers.length = 0; + } +} +``` + +**Estado:** Pending. Requiere decision sobre si vale la pena el overhead ahora. + +--- + +### F15 — console.log / console.warn en produccion + +**Archivo:** `core/soma.svelte.ts` + +Cubierto por F2. Los `console.log` en `Soma.create()` y `console.warn` en `getSoma()` eran debug residual. + +**Estado:** Fixed (junto con F2). + +--- + +## Archivos modificados + +| Archivo | Issues | +| ----------------------------------------- | -------------------- | +| `soma/provider/provider.svelte.ts` | F1 | +| `soma/core/soma.svelte.ts` | F2, F15 | +| `soma/components/internal/soma.svelte` | F2 | +| `routes/test/soma/dialog/+page.svelte` | F2 | +| `soma/core/translator.svelte.ts` | F4, F5, F6, F10, F11 | +| `terra/system/translator.svelte.ts` | F4, F5, F6, F10, F11 | +| `soma/core/prop-resolvers.ts` | F8 | +| `terra/system/prop-resolvers.ts` | F8 | +| `soma/layers/floating/floating.svelte.ts` | F7 | +| `soma/layers/scroll-lock.svelte.ts` | F9 | + +## Archivos pendientes + +| Archivo | Issues | +| ---------------------------------- | ------ | +| `soma/types/services.ts` | F3 | +| `soma/props/props.ts` | F13 | +| `soma/provider/provider.svelte.ts` | F14 | +| `soma/core/soma.svelte.ts` | F12 | diff --git a/src/uix/soma/COMPONENT_GUIDE.md b/src/uix/soma/COMPONENT_GUIDE.md index 172d99bd5..042f193cf 100644 --- a/src/uix/soma/COMPONENT_GUIDE.md +++ b/src/uix/soma/COMPONENT_GUIDE.md @@ -86,11 +86,11 @@ export class {Name}Provider extends Provider<{Name}Opts> { export class {Name}TriggerProvider extends Provider<{Name}TriggerOpts> { static from(opts) { return new {Name}TriggerProvider(opts); } - readonly root: {Name}Provider; + readonly provider: {Name}Provider; private constructor(opts) { super(opts, '{Name}', 'trigger', attrs.trigger); - this.root = {Name}Provider.ctx.get(); // reads parent context + this.provider = {Name}Provider.ctx.get(); // reads parent context } } ``` diff --git a/src/uix/soma/SOMA_ARCHITECTURE.md b/src/uix/soma/SOMA_ARCHITECTURE.md index bf724d90a..4dcf1ab87 100644 --- a/src/uix/soma/SOMA_ARCHITECTURE.md +++ b/src/uix/soma/SOMA_ARCHITECTURE.md @@ -1,4 +1,4 @@ -# Soma Architecture +el # Soma Architecture Documento de referencia arquitectonica para `src/uix/soma`. diff --git a/src/uix/soma/components/accordion/accordion-provider.svelte.ts b/src/uix/soma/components/accordion/accordion-provider.svelte.ts index 5ca6d2f9d..140c11090 100644 --- a/src/uix/soma/components/accordion/accordion-provider.svelte.ts +++ b/src/uix/soma/components/accordion/accordion-provider.svelte.ts @@ -1,10 +1,10 @@ import { Provider, context, type WithRefOpts } from '$soma/provider'; import { createAttrs, boolToEmptyStrOrUndef, getDataOpenClosed } from '$soma/attrs'; import { readableActive, state, type Active, type ActiveProps, type StateProps } from '$soma/reactive'; -import type { OnChangeFn, Orientation, Direction, SomaMouseEvent, SomaKeyboardEvent } from '$soma/types'; +import type { Orientation, Direction, SomaMouseEvent, SomaKeyboardEvent } from '$soma/types'; import { KEYS, getDirectionalKeys } from '$soma/keyboard'; import { useId } from '$soma/id'; -import { Soma } from '$soma/core/soma.svelte'; +import { getSoma } from '$soma/core/soma.svelte'; import { Presence } from '$soma/layers/presence.svelte'; import { ResizeObserver$ } from '$soma/layers/resize-observer.svelte'; @@ -28,7 +28,6 @@ interface AccordionOpts orientation: Orientation; loop: boolean; dir: Direction; - onValueChange: OnChangeFn; }> {} export class AccordionProvider extends Provider { @@ -38,11 +37,11 @@ export class AccordionProvider extends Provider { return new AccordionProvider(opts); } - readonly soma: Soma | undefined; + readonly config = getSoma(); private constructor(opts: AccordionOpts) { super(opts, 'Accordion', 'root', attrs.root, AccordionProvider.ctx); - this.soma = Soma.getOr(); + } isItemOpen(value: string): boolean { @@ -64,7 +63,6 @@ export class AccordionProvider extends Provider { } this.opts.value.current = next; - this.opts.onValueChange.current(next); } /** Get all trigger elements for keyboard navigation. */ @@ -100,7 +98,7 @@ export class AccordionItemProvider extends Provider { return new AccordionItemProvider(opts); } - readonly root: AccordionProvider; + readonly provider: AccordionProvider; readonly contentPresence: Presence; // tracked IDs @@ -114,7 +112,7 @@ export class AccordionItemProvider extends Provider { private constructor(opts: AccordionItemOpts) { super(opts, 'Accordion', 'item', attrs.item, AccordionItemProvider.ctx); - this.root = AccordionProvider.ctx.get(); + this.provider = AccordionProvider.ctx.get(); this.contentPresence = new Presence({ open: readableActive(() => this.isOpen), @@ -134,11 +132,11 @@ export class AccordionItemProvider extends Provider { } readonly isOpen = $derived.by(() => - this.root.isItemOpen(this.opts.value.current), + this.provider.isItemOpen(this.opts.value.current), ); readonly isDisabled = $derived.by(() => - this.opts.disabled.current || this.root.opts.disabled.current, + this.opts.disabled.current || this.provider.opts.disabled.current, ); setContentRef(el: HTMLElement | null) { @@ -150,7 +148,7 @@ export class AccordionItemProvider extends Provider { ...this.baseProps, 'data-state': getDataOpenClosed(this.isOpen), 'data-disabled': boolToEmptyStrOrUndef(this.isDisabled), - 'data-orientation': this.root.opts.orientation.current, + 'data-orientation': this.provider.opts.orientation.current, } as const), ); } @@ -178,7 +176,7 @@ export class AccordionHeaderProvider extends Provider { 'aria-level': this.opts.level.current, 'data-state': getDataOpenClosed(this.item.isOpen), 'data-disabled': boolToEmptyStrOrUndef(this.item.isDisabled), - 'data-orientation': this.item.root.opts.orientation.current, + 'data-orientation': this.item.provider.opts.orientation.current, } as const), ); } @@ -202,13 +200,13 @@ export class AccordionTriggerProvider extends Provider { readonly onclick = (_e: SomaMouseEvent) => { if (this.item.isDisabled) return; - this.item.root.toggleItem(this.item.opts.value.current); + this.item.provider.toggleItem(this.item.opts.value.current); }; readonly onkeydown = (e: SomaKeyboardEvent) => { if (this.item.isDisabled) return; - const root = this.item.root; + const root = this.item.provider; const orientation = root.opts.orientation.current; const dir = root.opts.dir.current; const { nextKey, prevKey } = getDirectionalKeys(dir, orientation); @@ -248,7 +246,7 @@ export class AccordionTriggerProvider extends Provider { 'aria-controls': this.item.contentId.current || undefined, 'data-state': getDataOpenClosed(this.item.isOpen), 'data-disabled': boolToEmptyStrOrUndef(this.item.isDisabled), - 'data-orientation': this.item.root.opts.orientation.current, + 'data-orientation': this.item.provider.opts.orientation.current, disabled: this.item.isDisabled || undefined, onclick: this.onclick, onkeydown: this.onkeydown, @@ -284,7 +282,7 @@ export class AccordionContentProvider extends Provider { 'aria-labelledby': this.item.triggerId.current || undefined, 'data-state': getDataOpenClosed(this.item.isOpen), 'data-disabled': boolToEmptyStrOrUndef(this.item.isDisabled), - 'data-orientation': this.item.root.opts.orientation.current, + 'data-orientation': this.item.provider.opts.orientation.current, style: { '--soma-accordion-content-height': `${this.item.contentHeight}px`, '--soma-accordion-content-width': `${this.item.contentWidth}px`, diff --git a/src/uix/soma/components/accordion/components/accordion.svelte b/src/uix/soma/components/accordion/components/accordion.svelte index 2b355912b..e4e0eced6 100644 --- a/src/uix/soma/components/accordion/components/accordion.svelte +++ b/src/uix/soma/components/accordion/components/accordion.svelte @@ -2,13 +2,13 @@ import { readableActive, writableActive } from '$soma/reactive'; import { mergeProps } from '$soma/props'; import { createId } from '$soma/id'; - import { Soma } from '$soma/core/soma.svelte'; + import { getSoma } from '$soma/core/soma.svelte'; import { AccordionProvider } from '../accordion-provider.svelte'; import type { AccordionProps } from '../types'; import { noop } from '$lib/util/funcs'; const uid = $props.id(); - const soma = Soma.getOr(); + const soma = getSoma(); let { ref = $bindable(null), @@ -20,7 +20,7 @@ disabled = false, orientation = 'vertical', loop = false, - dir = soma?.dir.current ?? 'ltr', + dir = soma.presentation.current?.dir ?? 'ltr', children, child, ...restProps @@ -35,9 +35,11 @@ type: readableActive(() => type), value: writableActive( () => value, - (v) => (value = v), + (v) => { + value = v; + onValueChange(v); + }, ), - onValueChange: readableActive(() => onValueChange), collapsible: readableActive(() => collapsible), disabled: readableActive(() => disabled), orientation: readableActive(() => orientation), diff --git a/src/uix/soma/components/checkbox/checkbox-provider.svelte.ts b/src/uix/soma/components/checkbox/checkbox-provider.svelte.ts index 348d8bc97..1407b62ff 100644 --- a/src/uix/soma/components/checkbox/checkbox-provider.svelte.ts +++ b/src/uix/soma/components/checkbox/checkbox-provider.svelte.ts @@ -1,7 +1,7 @@ import { Provider, context, type WithRefOpts } from '$soma/provider'; import { createAttrs, boolToEmptyStrOrUndef } from '$soma/attrs'; import { readableActive, state, type Active, type ActiveProps, type StateProps } from '$soma/reactive'; -import type { OnChangeFn, SomaMouseEvent, SomaKeyboardEvent } from '$soma/types'; +import type { SomaMouseEvent, SomaKeyboardEvent } from '$soma/types'; import { KEYS } from '$soma/keyboard'; const attrs = createAttrs({ @@ -20,8 +20,6 @@ interface CheckboxOpts readonly: boolean; name: string; value: string; - onCheckedChange: OnChangeFn; - onIndeterminateChange: OnChangeFn; }> {} export class CheckboxProvider extends Provider { @@ -43,11 +41,9 @@ export class CheckboxProvider extends Provider { if (this.opts.disabled.current || this.opts.readonly.current) return; if (this.opts.indeterminate.current) { this.opts.indeterminate.current = false; - this.opts.onIndeterminateChange.current(false); } const next = !this.opts.checked.current; this.opts.checked.current = next; - this.opts.onCheckedChange.current(next); if (this.group) this.group.updateItemChecked(this.opts.value.current, next); } @@ -107,7 +103,6 @@ interface CheckboxGroupOpts disabled: boolean; required: boolean; name: string; - onValueChange: OnChangeFn; }> {} export class CheckboxGroupProvider extends Provider { @@ -133,7 +128,6 @@ export class CheckboxGroupProvider extends Provider { ? [...current, value] : current.filter((v) => v !== value); this.opts.value.current = next; - this.opts.onValueChange.current(next); } readonly props = $derived.by(() => diff --git a/src/uix/soma/components/checkbox/components/checkbox-group.svelte b/src/uix/soma/components/checkbox/components/checkbox-group.svelte index b74784c4b..d31016432 100644 --- a/src/uix/soma/components/checkbox/components/checkbox-group.svelte +++ b/src/uix/soma/components/checkbox/components/checkbox-group.svelte @@ -24,8 +24,13 @@ const state = CheckboxGroupProvider.from({ id: readableActive(() => id), ref: writableActive(() => ref, (v) => (ref = v)), - value: writableActive(() => value, (v) => (value = v)), - onValueChange: readableActive(() => onValueChange), + value: writableActive( + () => value, + (v) => { + value = v; + onValueChange(v); + }, + ), disabled: readableActive(() => disabled), required: readableActive(() => required), name: readableActive(() => name), diff --git a/src/uix/soma/components/checkbox/components/checkbox.svelte b/src/uix/soma/components/checkbox/components/checkbox.svelte index 4b9d1b211..2a0480a40 100644 --- a/src/uix/soma/components/checkbox/components/checkbox.svelte +++ b/src/uix/soma/components/checkbox/components/checkbox.svelte @@ -28,10 +28,20 @@ const state = CheckboxProvider.from({ id: readableActive(() => id), ref: writableActive(() => ref, (v) => (ref = v)), - checked: writableActive(() => checked, (v) => (checked = v)), - indeterminate: writableActive(() => indeterminate, (v) => (indeterminate = v)), - onCheckedChange: readableActive(() => onCheckedChange), - onIndeterminateChange: readableActive(() => onIndeterminateChange), + checked: writableActive( + () => checked, + (v) => { + checked = v; + onCheckedChange(v); + }, + ), + indeterminate: writableActive( + () => indeterminate, + (v) => { + indeterminate = v; + onIndeterminateChange(v); + }, + ), disabled: readableActive(() => disabled), required: readableActive(() => required), readonly: readableActive(() => readonly), diff --git a/src/uix/soma/components/collapsible/collapsible-provider.svelte.ts b/src/uix/soma/components/collapsible/collapsible-provider.svelte.ts index a25899cc7..837274c3c 100644 --- a/src/uix/soma/components/collapsible/collapsible-provider.svelte.ts +++ b/src/uix/soma/components/collapsible/collapsible-provider.svelte.ts @@ -1,7 +1,7 @@ import { Provider, context, type WithRefOpts } from '$soma/provider'; import { createAttrs, boolToEmptyStrOrUndef, getDataOpenClosed } from '$soma/attrs'; import type { ActiveProps, StateProps } from '$soma/reactive'; -import type { SomaMouseEvent, OnChangeFn } from '$soma/types'; +import type { SomaMouseEvent } from '$soma/types'; const attrs = createAttrs({ component: 'collapsible', @@ -12,7 +12,7 @@ const attrs = createAttrs({ interface CollapsibleOpts extends WithRefOpts, StateProps<{ open: boolean }>, - ActiveProps<{ disabled: boolean; onOpenChange: OnChangeFn }> {} + ActiveProps<{ disabled: boolean }> {} export class CollapsibleProvider extends Provider { static readonly ctx = context('Collapsible'); @@ -24,9 +24,7 @@ export class CollapsibleProvider extends Provider { toggle() { if (this.opts.disabled.current) return; - const next = !this.opts.open.current; - this.opts.open.current = next; - this.opts.onOpenChange.current(next); + this.opts.open.current = !this.opts.open.current; } readonly props = $derived.by(() => @@ -45,25 +43,25 @@ interface CollapsibleTriggerOpts extends WithRefOpts {} export class CollapsibleTriggerProvider extends Provider { static from(opts: CollapsibleTriggerOpts) { return new CollapsibleTriggerProvider(opts); } - readonly root: CollapsibleProvider; + readonly provider: CollapsibleProvider; private constructor(opts: CollapsibleTriggerOpts) { super(opts, 'Collapsible', 'trigger', attrs.trigger); - this.root = CollapsibleProvider.ctx.get(); + this.provider = CollapsibleProvider.ctx.get(); } readonly onclick = (_e: SomaMouseEvent) => { - this.root.toggle(); + this.provider.toggle(); }; readonly props = $derived.by(() => this.assertProps({ ...this.baseProps, type: 'button' as const, - 'aria-expanded': this.root.opts.open.current, - 'data-state': getDataOpenClosed(this.root.opts.open.current), - 'data-disabled': boolToEmptyStrOrUndef(this.root.opts.disabled.current), - disabled: this.root.opts.disabled.current || undefined, + 'aria-expanded': this.provider.opts.open.current, + 'data-state': getDataOpenClosed(this.provider.opts.open.current), + 'data-disabled': boolToEmptyStrOrUndef(this.provider.opts.disabled.current), + disabled: this.provider.opts.disabled.current || undefined, onclick: this.onclick, } as const) ); @@ -76,21 +74,21 @@ interface CollapsibleContentOpts extends WithRefOpts {} export class CollapsibleContentProvider extends Provider { static from(opts: CollapsibleContentOpts) { return new CollapsibleContentProvider(opts); } - readonly root: CollapsibleProvider; + readonly provider: CollapsibleProvider; private constructor(opts: CollapsibleContentOpts) { super(opts, 'Collapsible', 'content', attrs.content); - this.root = CollapsibleProvider.ctx.get(); + this.provider = CollapsibleProvider.ctx.get(); } - readonly isOpen = $derived.by(() => this.root.opts.open.current); + readonly isOpen = $derived.by(() => this.provider.opts.open.current); readonly props = $derived.by(() => this.assertProps({ ...this.baseProps, hidden: this.isOpen ? undefined : true, 'data-state': getDataOpenClosed(this.isOpen), - 'data-disabled': boolToEmptyStrOrUndef(this.root.opts.disabled.current), + 'data-disabled': boolToEmptyStrOrUndef(this.provider.opts.disabled.current), } as const) ); } diff --git a/src/uix/soma/components/collapsible/components/collapsible.svelte b/src/uix/soma/components/collapsible/components/collapsible.svelte index 0714c909c..6ee8f6eba 100644 --- a/src/uix/soma/components/collapsible/components/collapsible.svelte +++ b/src/uix/soma/components/collapsible/components/collapsible.svelte @@ -23,8 +23,13 @@ const state = CollapsibleProvider.from({ id: readableActive(() => id), ref: writableActive(() => ref, (v) => (ref = v)), - open: writableActive(() => open, (v) => (open = v)), - onOpenChange: readableActive(() => onOpenChange), + open: writableActive( + () => open, + (v) => { + open = v; + onOpenChange(v); + }, + ), disabled: readableActive(() => disabled), }); diff --git a/src/uix/soma/components/combobox/combobox-provider.svelte.ts b/src/uix/soma/components/combobox/combobox-provider.svelte.ts index 48ca089fd..b120d0704 100644 --- a/src/uix/soma/components/combobox/combobox-provider.svelte.ts +++ b/src/uix/soma/components/combobox/combobox-provider.svelte.ts @@ -3,7 +3,7 @@ import { createAttrs, boolToEmptyStrOrUndef, getDataOpenClosed } from '$soma/att import { readableActive, state, type Active, type ActiveProps, type StateProps } from '$soma/reactive'; import type { OnChangeFn, SomaKeyboardEvent, Direction, Arrayable, StyleProperties } from '$soma/types'; import { KEYS } from '$soma/keyboard'; -import { Soma } from '$soma/core/soma.svelte'; +import { getSoma } from '$soma/core/soma.svelte'; import { Presence } from '$soma/layers/presence.svelte'; import { Dismissal, type DismissalBehavior } from '$soma/layers/dismissal.svelte'; @@ -37,10 +37,7 @@ interface ComboboxOpts loop: boolean; allowDeselect: boolean; dir: Direction; - onValueChange: OnChangeFn; - onOpenChange: OnChangeFn; onOpenChangeComplete: OnChangeFn; - onInputValueChange: OnChangeFn; }> {} export class ComboboxProvider extends Provider { @@ -50,7 +47,7 @@ export class ComboboxProvider extends Provider { return new ComboboxProvider(opts); } - readonly soma: Soma | undefined; + readonly config = getSoma(); readonly floatingProvider: FloatingProvider; readonly contentPresence: Presence; @@ -66,7 +63,7 @@ export class ComboboxProvider extends Provider { private constructor(opts: ComboboxOpts) { super(opts, 'Combobox', 'root', attrs.root, ComboboxProvider.ctx); - this.soma = Soma.getOr(); + this.floatingProvider = FloatingProvider.create(); this.contentPresence = new Presence({ @@ -102,19 +99,16 @@ export class ComboboxProvider extends Provider { } this.opts.value.current = next; - this.opts.onValueChange.current(next); } handleOpen() { if (this.opts.disabled.current) return; this.opts.open.current = true; - this.opts.onOpenChange.current(true); } handleClose() { this.highlightedId = ''; this.opts.open.current = false; - this.opts.onOpenChange.current(false); this.inputRef.current?.focus(); } @@ -136,7 +130,6 @@ export class ComboboxProvider extends Provider { updateInputValue(value: string) { this.opts.inputValue.current = value; - this.opts.onInputValueChange.current(value); } /** Get display text for the current value. */ @@ -163,13 +156,13 @@ export class ComboboxInputProvider extends Provider { return new ComboboxInputProvider(opts); } - readonly root: ComboboxProvider; + readonly provider: ComboboxProvider; private constructor(opts: ComboboxInputOpts) { super(opts, 'Combobox', 'input', attrs.input); - this.root = ComboboxProvider.ctx.get(); - this.root.inputId.current = opts.id.current; - this.root.inputRef = opts.ref; + this.provider = ComboboxProvider.ctx.get(); + this.provider.inputId.current = opts.id.current; + this.provider.inputRef = opts.ref; // Input is the floating anchor FloatingAnchor.create({ @@ -180,56 +173,56 @@ export class ComboboxInputProvider extends Provider { readonly oninput = (e: Event) => { const target = e.target as HTMLInputElement; - this.root.updateInputValue(target.value); - if (!this.root.opts.open.current) { - this.root.handleOpen(); + this.provider.updateInputValue(target.value); + if (!this.provider.opts.open.current) { + this.provider.handleOpen(); } }; readonly onkeydown = (e: SomaKeyboardEvent) => { if (e.key === KEYS.ARROW_DOWN) { e.preventDefault(); - if (!this.root.opts.open.current) { - this.root.handleOpen(); + if (!this.provider.opts.open.current) { + this.provider.handleOpen(); } // Focus first item requestAnimationFrame(() => { - const container = this.root.contentRef.current; + const container = this.provider.contentRef.current; if (!container) return; - const items = this.root.getItems(container); + const items = this.provider.getItems(container); if (items.length > 0) { items[0].focus(); - this.root.highlightedId = items[0].id; + this.provider.highlightedId = items[0].id; } }); } else if (e.key === KEYS.ARROW_UP) { e.preventDefault(); - if (!this.root.opts.open.current) { - this.root.handleOpen(); + if (!this.provider.opts.open.current) { + this.provider.handleOpen(); } // Focus last item requestAnimationFrame(() => { - const container = this.root.contentRef.current; + const container = this.provider.contentRef.current; if (!container) return; - const items = this.root.getItems(container); + const items = this.provider.getItems(container); if (items.length > 0) { const last = items[items.length - 1]; last.focus(); - this.root.highlightedId = last.id; + this.provider.highlightedId = last.id; } }); } else if (e.key === KEYS.ESCAPE) { - if (this.root.opts.open.current) { + if (this.provider.opts.open.current) { e.preventDefault(); - this.root.handleClose(); + this.provider.handleClose(); } } else if (e.key === KEYS.ENTER) { - if (this.root.opts.open.current && this.root.highlightedId) { + if (this.provider.opts.open.current && this.provider.highlightedId) { e.preventDefault(); - const container = this.root.contentRef.current; + const container = this.provider.contentRef.current; if (container) { const highlighted = container.querySelector( - `#${CSS.escape(this.root.highlightedId)}`, + `#${CSS.escape(this.provider.highlightedId)}`, ); if (highlighted) { highlighted.click(); @@ -245,15 +238,15 @@ export class ComboboxInputProvider extends Provider { type: 'text' as const, role: 'combobox' as const, 'aria-haspopup': 'listbox' as const, - 'aria-expanded': this.root.opts.open.current, - 'aria-controls': this.root.contentId.current || undefined, - 'aria-activedescendant': this.root.highlightedId || undefined, - 'aria-required': this.root.opts.required.current || undefined, + 'aria-expanded': this.provider.opts.open.current, + 'aria-controls': this.provider.contentId.current || undefined, + 'aria-activedescendant': this.provider.highlightedId || undefined, + 'aria-required': this.provider.opts.required.current || undefined, 'aria-autocomplete': 'list' as const, - 'data-state': getDataOpenClosed(this.root.opts.open.current), - 'data-disabled': boolToEmptyStrOrUndef(this.root.opts.disabled.current), - disabled: this.root.opts.disabled.current || undefined, - value: this.root.opts.inputValue.current, + 'data-state': getDataOpenClosed(this.provider.opts.open.current), + 'data-disabled': boolToEmptyStrOrUndef(this.provider.opts.disabled.current), + disabled: this.provider.opts.disabled.current || undefined, + value: this.provider.opts.inputValue.current, oninput: this.oninput, onkeydown: this.onkeydown, } as const), @@ -269,17 +262,17 @@ export class ComboboxTriggerProvider extends Provider { return new ComboboxTriggerProvider(opts); } - readonly root: ComboboxProvider; + readonly provider: ComboboxProvider; private constructor(opts: ComboboxTriggerOpts) { super(opts, 'Combobox', 'trigger', attrs.trigger); - this.root = ComboboxProvider.ctx.get(); - this.root.triggerId.current = opts.id.current; - this.root.triggerRef = opts.ref; + this.provider = ComboboxProvider.ctx.get(); + this.provider.triggerId.current = opts.id.current; + this.provider.triggerRef = opts.ref; } readonly onclick = () => { - this.root.toggle(); + this.provider.toggle(); }; readonly props = $derived.by(() => @@ -289,11 +282,11 @@ export class ComboboxTriggerProvider extends Provider { tabindex: -1, 'aria-label': 'Toggle' as const, 'aria-haspopup': 'listbox' as const, - 'aria-expanded': this.root.opts.open.current, - 'aria-controls': this.root.contentId.current || undefined, - 'data-state': getDataOpenClosed(this.root.opts.open.current), - 'data-disabled': boolToEmptyStrOrUndef(this.root.opts.disabled.current), - disabled: this.root.opts.disabled.current || undefined, + 'aria-expanded': this.provider.opts.open.current, + 'aria-controls': this.provider.contentId.current || undefined, + 'data-state': getDataOpenClosed(this.provider.opts.open.current), + 'data-disabled': boolToEmptyStrOrUndef(this.provider.opts.disabled.current), + disabled: this.provider.opts.disabled.current || undefined, onclick: this.onclick, } as const), ); @@ -328,16 +321,16 @@ export class ComboboxContentProvider extends Provider { return new ComboboxContentProvider(opts); } - readonly root: ComboboxProvider; + readonly provider: ComboboxProvider; readonly floating: FloatingContent; readonly dismissal: Dismissal; private constructor(opts: ComboboxContentOpts) { super(opts, 'Combobox', 'content', attrs.content, undefined, (el) => { - this.root.setContentRef(el); + this.provider.setContentRef(el); }); - this.root = ComboboxProvider.ctx.get(); - this.root.contentId.current = opts.id.current; + this.provider = ComboboxProvider.ctx.get(); + this.provider.contentId.current = opts.id.current; // Floating this.floating = FloatingContent.create({ @@ -358,28 +351,28 @@ export class ComboboxContentProvider extends Provider { onPlaced: readableActive(() => () => {}), dir: opts.dir, style: opts.style, - enabled: readableActive(() => this.root.opts.open.current), + enabled: readableActive(() => this.provider.opts.open.current), customAnchor: readableActive(() => null), }); // Dismissal — isValidEvent returns false for clicks on the input element this.dismissal = Dismissal.use({ ref: readableActive(() => opts.ref.current), - enabled: readableActive(() => this.root.opts.open.current), + enabled: readableActive(() => this.provider.opts.open.current), onEscapeKeydown: readableActive(() => (e: KeyboardEvent) => { opts.onEscapeKeydown.current(e); - if (!e.defaultPrevented) this.root.handleClose(); + if (!e.defaultPrevented) this.provider.handleClose(); }), escapeKeydownBehavior: opts.escapeKeydownBehavior, onInteractOutside: readableActive(() => (e: PointerEvent) => { opts.onInteractOutside.current(e); - if (!e.defaultPrevented) this.root.handleClose(); + if (!e.defaultPrevented) this.provider.handleClose(); }), interactOutsideBehavior: opts.interactOutsideBehavior, onFocusOutside: readableActive(() => () => {}), isValidEvent: readableActive(() => (e: PointerEvent | FocusEvent) => { // Clicks on the input element should not close the dropdown - const inputEl = this.root.inputRef.current; + const inputEl = this.provider.inputRef.current; if (inputEl && e.target instanceof Node && inputEl.contains(e.target)) { return false; } @@ -390,7 +383,7 @@ export class ComboboxContentProvider extends Provider { // No ScrollLock for combobox } - readonly isPresent = $derived.by(() => this.root.contentPresence.isPresent); + readonly isPresent = $derived.by(() => this.provider.contentPresence.isPresent); readonly wrapperProps = $derived.by(() => ({ ...this.floating.wrapperProps, @@ -404,10 +397,10 @@ export class ComboboxContentProvider extends Provider { const container = this.opts.ref.current; if (!container) return; - const items = this.root.getItems(container); + const items = this.provider.getItems(container); const active = document.activeElement as HTMLElement; const currentIndex = items.indexOf(active); - const loop = this.root.opts.loop.current; + const loop = this.provider.opts.loop.current; let targetIndex = -1; @@ -420,8 +413,8 @@ export class ComboboxContentProvider extends Provider { e.preventDefault(); // If on the first item, return focus to input if (currentIndex === 0 && !loop) { - this.root.highlightedId = ''; - this.root.inputRef.current?.focus(); + this.provider.highlightedId = ''; + this.provider.inputRef.current?.focus(); return; } targetIndex = loop @@ -435,11 +428,11 @@ export class ComboboxContentProvider extends Provider { targetIndex = items.length - 1; } else if (e.key === KEYS.TAB) { e.preventDefault(); - this.root.handleClose(); + this.provider.handleClose(); return; } else if (e.key === KEYS.ESCAPE) { e.preventDefault(); - this.root.handleClose(); + this.provider.handleClose(); return; } else { return; @@ -449,7 +442,7 @@ export class ComboboxContentProvider extends Provider { const target = items[targetIndex]; target.focus(); target.scrollIntoView({ block: 'nearest' }); - this.root.highlightedId = target.id; + this.provider.highlightedId = target.id; } }; @@ -457,10 +450,10 @@ export class ComboboxContentProvider extends Provider { this.assertProps({ ...this.baseProps, role: 'listbox' as const, - 'aria-multiselectable': this.root.opts.type.current === 'multiple' || undefined, - 'data-state': getDataOpenClosed(this.root.opts.open.current), + 'aria-multiselectable': this.provider.opts.type.current === 'multiple' || undefined, + 'data-state': getDataOpenClosed(this.provider.opts.open.current), ...this.floating.props, - ...this.root.contentPresence.transitionAttrs, + ...this.provider.contentPresence.transitionAttrs, ...this.dismissal.props, tabindex: -1, onkeydown: this.onkeydown, @@ -504,27 +497,27 @@ export class ComboboxItemProvider extends Provider { return new ComboboxItemProvider(opts); } - readonly root: ComboboxProvider; + readonly provider: ComboboxProvider; private constructor(opts: ComboboxItemOpts) { super(opts, 'Combobox', 'item', attrs.item); - this.root = ComboboxProvider.ctx.get(); + this.provider = ComboboxProvider.ctx.get(); } readonly isSelected = $derived.by(() => - this.root.isSelected(this.opts.value.current), + this.provider.isSelected(this.opts.value.current), ); readonly onclick = () => { if (this.opts.disabled.current) return; - this.root.selectItem(this.opts.value.current); + this.provider.selectItem(this.opts.value.current); }; readonly onkeydown = (e: SomaKeyboardEvent) => { if (this.opts.disabled.current) return; if (e.key === KEYS.ENTER || e.key === KEYS.SPACE) { e.preventDefault(); - this.root.selectItem(this.opts.value.current); + this.provider.selectItem(this.opts.value.current); } }; diff --git a/src/uix/soma/components/combobox/components/combobox-content.svelte b/src/uix/soma/components/combobox/components/combobox-content.svelte index f7508582c..25f78a462 100644 --- a/src/uix/soma/components/combobox/components/combobox-content.svelte +++ b/src/uix/soma/components/combobox/components/combobox-content.svelte @@ -3,13 +3,13 @@ import { mergeProps } from '$soma/props'; import { styleToString } from '$soma/css'; import { createId } from '$soma/id'; - import { Soma } from '$soma/core/soma.svelte'; + import { getSoma } from '$soma/core/soma.svelte'; import { ComboboxContentProvider } from '../combobox-provider.svelte'; import type { ComboboxContentProps } from '../types'; import { noop } from '$lib/util/funcs'; const uid = $props.id(); - const soma = Soma.getOr(); + const soma = getSoma(); let { ref = $bindable(null), @@ -30,7 +30,7 @@ escapeKeydownBehavior = 'close', onInteractOutside = noop, interactOutsideBehavior = 'close', - dir = soma?.dir.current ?? 'ltr', + dir = soma.presentation.current?.dir ?? 'ltr', style = null, children, child, @@ -74,10 +74,10 @@ {#if state.isPresent || forceMount}
    {#if child} - {@render child({ open: state.root.opts.open.current, props: mergedProps })} + {@render child({ open: state.provider.opts.open.current, props: mergedProps })} {:else}
    - {@render children?.({ open: state.root.opts.open.current })} + {@render children?.({ open: state.provider.opts.open.current })}
    {/if}
    diff --git a/src/uix/soma/components/combobox/components/combobox.svelte b/src/uix/soma/components/combobox/components/combobox.svelte index ea61468da..508feb12a 100644 --- a/src/uix/soma/components/combobox/components/combobox.svelte +++ b/src/uix/soma/components/combobox/components/combobox.svelte @@ -4,10 +4,10 @@ import { ComboboxProvider } from '../combobox-provider.svelte'; import type { ComboboxProps } from '../types'; import { noop } from '$lib/util/funcs'; - import { Soma } from '$soma/core/soma.svelte'; + import { getSoma } from '$soma/core/soma.svelte'; const uid = $props.id(); - const soma = Soma.getOr(); + const soma = getSoma(); let { id = createId(uid, 'combobox'), @@ -20,7 +20,7 @@ name = '', loop = false, allowDeselect = false, - dir = soma?.dir.current ?? 'ltr', + dir = soma.presentation.current?.dir ?? 'ltr', onValueChange = noop, onOpenChange = noop, onOpenChangeComplete = noop, @@ -32,15 +32,24 @@ id: readableActive(() => id), open: writableActive( () => open, - (v) => (open = v), + (v) => { + open = v; + onOpenChange(v); + }, ), value: writableActive( () => value, - (v) => (value = v), + (v) => { + value = v; + onValueChange(v); + }, ), inputValue: writableActive( () => inputValue, - (v) => (inputValue = v), + (v) => { + inputValue = v; + onInputValueChange(v); + }, ), type: readableActive(() => type), disabled: readableActive(() => disabled), @@ -49,10 +58,7 @@ loop: readableActive(() => loop), allowDeselect: readableActive(() => allowDeselect), dir: readableActive(() => dir), - onValueChange: readableActive(() => onValueChange), - onOpenChange: readableActive(() => onOpenChange), onOpenChangeComplete: readableActive(() => onOpenChangeComplete), - onInputValueChange: readableActive(() => onInputValueChange), }); diff --git a/src/uix/soma/components/dialog/components/dialog-content.svelte b/src/uix/soma/components/dialog/components/dialog-content.svelte index 2c45c3f6f..700543ab3 100644 --- a/src/uix/soma/components/dialog/components/dialog-content.svelte +++ b/src/uix/soma/components/dialog/components/dialog-content.svelte @@ -52,10 +52,10 @@ {#if state.isPresent || forceMount} {#if child} - {@render child({ open: state.root.opts.open.current, props: mergedProps })} + {@render child({ open: state.provider.opts.open.current, props: mergedProps })} {:else}
    - {@render children?.({ open: state.root.opts.open.current })} + {@render children?.({ open: state.provider.opts.open.current })}
    {/if} {/if} diff --git a/src/uix/soma/components/dialog/components/dialog.svelte b/src/uix/soma/components/dialog/components/dialog.svelte index 2807d0a2c..6d2b472b8 100644 --- a/src/uix/soma/components/dialog/components/dialog.svelte +++ b/src/uix/soma/components/dialog/components/dialog.svelte @@ -22,9 +22,11 @@ id: readableActive(() => id), open: writableActive( () => open, - (v) => (open = v), + (v) => { + open = v; + onOpenChange(v); + }, ), - onOpenChange: readableActive(() => onOpenChange), onOpenChangeComplete: readableActive(() => onOpenChangeComplete), variant: readableActive(() => variant), modal: readableActive(() => modal), diff --git a/src/uix/soma/components/dialog/dialog-provider.svelte.ts b/src/uix/soma/components/dialog/dialog-provider.svelte.ts index c39bc5e38..b532501a8 100644 --- a/src/uix/soma/components/dialog/dialog-provider.svelte.ts +++ b/src/uix/soma/components/dialog/dialog-provider.svelte.ts @@ -3,7 +3,8 @@ import { createAttrs, boolToEmptyStrOrUndef, getDataOpenClosed } from '$soma/att import { readableActive, state, type Active, type ActiveProps, type StateProps } from '$soma/reactive'; import type { OnChangeFn, SomaMouseEvent, SomaKeyboardEvent } from '$soma/types'; import { KEYS } from '$soma/keyboard'; -import { Soma } from '$soma/core/soma.svelte'; +import { getSoma } from '$soma/core/soma.svelte'; +import { resolveSomaTranslationPath } from '$soma/core/translator.svelte'; import { watch } from 'runed'; import { untrack } from 'svelte'; @@ -29,7 +30,6 @@ interface DialogOpts disabled: boolean; modal: boolean; variant: DialogVariant; - onOpenChange: OnChangeFn; onOpenChangeComplete: OnChangeFn; }> {} @@ -40,7 +40,7 @@ export class DialogProvider extends Provider { return new DialogProvider(opts); } - readonly soma: Soma | undefined; + readonly config = getSoma(); // tracked IDs for ARIA contentId = state(''); @@ -67,7 +67,7 @@ export class DialogProvider extends Provider { // Read parent BEFORE registering in context (ctx.set happens in super) const parent = DialogProvider.ctx.getOr(undefined) as DialogProvider | undefined; super(opts, 'Dialog', 'provider', attrs.provider, DialogProvider.ctx); - this.soma = Soma.getOr(); + this.parent = parent; this.depth = parent ? parent.depth + 1 : 0; @@ -103,13 +103,11 @@ export class DialogProvider extends Provider { handleOpen() { if (this.opts.disabled.current) return; this.opts.open.current = true; - this.opts.onOpenChange.current(true); } handleClose() { if (this.opts.disabled.current) return; this.opts.open.current = false; - this.opts.onOpenChange.current(false); } setContentRef(el: HTMLElement | null) { @@ -122,7 +120,7 @@ export class DialogProvider extends Provider { /** Translate a dialog key with fallback. */ translate(path: string, fallback: string): string { - return this.soma?.translate(`dialog.${path}`, fallback) ?? fallback; + return resolveSomaTranslationPath(`soma.dialog.${path}`, this.config.translator.current, fallback); } readonly props = $derived.by(() => @@ -143,22 +141,22 @@ export class DialogTriggerProvider extends Provider { return new DialogTriggerProvider(opts); } - readonly root: DialogProvider; + readonly provider: DialogProvider; private constructor(opts: DialogTriggerOpts) { super(opts, 'Dialog', 'trigger', attrs.trigger); - this.root = DialogProvider.ctx.get(); - this.root.triggerId.current = opts.id.current; + this.provider = DialogProvider.ctx.get(); + this.provider.triggerId.current = opts.id.current; } readonly onclick = (_e: SomaMouseEvent) => { - this.root.handleOpen(); + this.provider.handleOpen(); }; readonly onkeydown = (e: SomaKeyboardEvent) => { if (e.key === KEYS.ENTER || e.key === KEYS.SPACE) { e.preventDefault(); - this.root.handleOpen(); + this.provider.handleOpen(); } }; @@ -167,11 +165,11 @@ export class DialogTriggerProvider extends Provider { ...this.baseProps, type: 'button' as const, 'aria-haspopup': 'dialog' as const, - 'aria-expanded': this.root.opts.open.current, - 'aria-controls': this.root.contentId.current || undefined, - 'aria-label': this.root.translate('trigger', 'Open dialog'), - 'data-state': getDataOpenClosed(this.root.opts.open.current), - disabled: this.root.opts.disabled.current || undefined, + 'aria-expanded': this.provider.opts.open.current, + 'aria-controls': this.provider.contentId.current || undefined, + 'aria-label': this.provider.translate('trigger', 'Open dialog'), + 'data-state': getDataOpenClosed(this.provider.opts.open.current), + disabled: this.provider.opts.disabled.current || undefined, onclick: this.onclick, onkeydown: this.onkeydown, ...this.attachment, @@ -202,7 +200,7 @@ export class DialogContentProvider extends Provider { return new DialogContentProvider(opts); } - readonly root: DialogProvider; + readonly provider: DialogProvider; // ── Behavior layers ────────────────────────────────────────────────────── readonly focusScope: ReturnType; @@ -212,10 +210,10 @@ export class DialogContentProvider extends Provider { private constructor(opts: DialogContentOpts) { super(opts, 'Dialog', 'content', attrs.content, undefined, (el) => { - this.root.setContentRef(el); + this.provider.setContentRef(el); }); - this.root = DialogProvider.ctx.get(); - this.root.contentId.current = opts.id.current; + this.provider = DialogProvider.ctx.get(); + this.provider.contentId.current = opts.id.current; // Layers — all integrated as behaviors this.focusScope = FocusScope.use({ @@ -224,13 +222,13 @@ export class DialogContentProvider extends Provider { trap: opts.trapFocus, loop: opts.loop, ref: opts.ref, - enabled: readableActive(() => this.root.contentPresence.isPresent), + enabled: readableActive(() => this.provider.contentPresence.isPresent), }); // Behavior resolution: explicit prop wins → variant/modal defaults → 'close' - const isAlert = () => this.root.opts.variant.current === 'alertdialog'; + const isAlert = () => this.provider.opts.variant.current === 'alertdialog'; const resolvedInteractBehavior = readableActive( - () => opts.interactOutsideBehavior.current ?? (this.root.opts.modal.current || isAlert() ? 'ignore' : 'close'), + () => opts.interactOutsideBehavior.current ?? (this.provider.opts.modal.current || isAlert() ? 'ignore' : 'close'), ); const resolvedEscapeBehavior = readableActive( () => opts.escapeKeydownBehavior.current ?? (isAlert() ? 'ignore' : 'close'), @@ -238,15 +236,15 @@ export class DialogContentProvider extends Provider { this.dismissal = Dismissal.use({ ref: readableActive(() => opts.ref.current), - enabled: readableActive(() => this.root.opts.open.current), + enabled: readableActive(() => this.provider.opts.open.current), onEscapeKeydown: readableActive(() => (e: KeyboardEvent) => { opts.onEscapeKeydown.current(e); - if (!e.defaultPrevented) this.root.handleClose(); + if (!e.defaultPrevented) this.provider.handleClose(); }), escapeKeydownBehavior: resolvedEscapeBehavior, onInteractOutside: readableActive(() => (e: PointerEvent) => { opts.onInteractOutside.current(e); - if (!e.defaultPrevented) this.root.handleClose(); + if (!e.defaultPrevented) this.provider.handleClose(); }), interactOutsideBehavior: resolvedInteractBehavior, onFocusOutside: opts.onFocusOutside, @@ -258,36 +256,36 @@ export class DialogContentProvider extends Provider { () => opts.restoreScrollDelay.current, ); $effect(() => { - this.scrollLock.locked.current = this.root.opts.open.current && opts.preventScroll.current; + this.scrollLock.locked.current = this.provider.opts.open.current && opts.preventScroll.current; }); this.textSelection = TextSelection.use({ ref: readableActive(() => opts.ref.current), - enabled: readableActive(() => this.root.opts.open.current), + enabled: readableActive(() => this.provider.opts.open.current), onPointerDown: readableActive(() => () => {}), onPointerUp: readableActive(() => () => {}), }); } - readonly isPresent = $derived.by(() => this.root.contentPresence.isPresent); + readonly isPresent = $derived.by(() => this.provider.contentPresence.isPresent); readonly props = $derived.by(() => this.assertProps({ ...this.baseProps, - role: this.root.opts.variant.current, + role: this.provider.opts.variant.current, 'aria-modal': true as const, - 'aria-roledescription': this.root.translate('content.roledescription', '') || undefined, - 'aria-describedby': this.root.descriptionId.current || undefined, - 'aria-labelledby': this.root.titleId.current || undefined, - 'data-state': getDataOpenClosed(this.root.opts.open.current), - 'data-nested': this.root.isNested ? '' : undefined, - 'data-nested-open': this.root.hasNestedOpen ? '' : undefined, + 'aria-roledescription': this.provider.translate('content.roledescription', '') || undefined, + 'aria-describedby': this.provider.descriptionId.current || undefined, + 'aria-labelledby': this.provider.titleId.current || undefined, + 'data-state': getDataOpenClosed(this.provider.opts.open.current), + 'data-nested': this.provider.isNested ? '' : undefined, + 'data-nested-open': this.provider.hasNestedOpen ? '' : undefined, style: { 'pointer-events': 'auto', - '--soma-dialog-depth': `${this.root.depth}`, - '--soma-dialog-nested-count': `${this.root.nestedOpenCount}`, + '--soma-dialog-depth': `${this.provider.depth}`, + '--soma-dialog-nested-count': `${this.provider.nestedOpenCount}`, }, - ...this.root.contentPresence.transitionAttrs, + ...this.provider.contentPresence.transitionAttrs, ...this.focusScope.props, ...this.dismissal.props, } as const), @@ -303,30 +301,30 @@ export class DialogOverlayProvider extends Provider { return new DialogOverlayProvider(opts); } - readonly root: DialogProvider; + readonly provider: DialogProvider; private constructor(opts: DialogOverlayOpts) { super(opts, 'Dialog', 'overlay', attrs.overlay, undefined, (el) => { - this.root.setOverlayRef(el); + this.provider.setOverlayRef(el); }); - this.root = DialogProvider.ctx.get(); + this.provider = DialogProvider.ctx.get(); } - readonly isPresent = $derived.by(() => this.root.overlayPresence.isPresent); + readonly isPresent = $derived.by(() => this.provider.overlayPresence.isPresent); readonly props = $derived.by(() => this.assertProps({ ...this.baseProps, - 'data-state': getDataOpenClosed(this.root.opts.open.current), + 'data-state': getDataOpenClosed(this.provider.opts.open.current), 'aria-hidden': true as const, - 'data-nested': this.root.isNested ? '' : undefined, - 'data-nested-open': this.root.hasNestedOpen ? '' : undefined, + 'data-nested': this.provider.isNested ? '' : undefined, + 'data-nested-open': this.provider.hasNestedOpen ? '' : undefined, style: { 'pointer-events': 'auto', - '--soma-dialog-depth': `${this.root.depth}`, - '--soma-dialog-nested-count': `${this.root.nestedOpenCount}`, + '--soma-dialog-depth': `${this.provider.depth}`, + '--soma-dialog-nested-count': `${this.provider.nestedOpenCount}`, }, - ...this.root.overlayPresence.transitionAttrs, + ...this.provider.overlayPresence.transitionAttrs, } as const), ); } @@ -340,12 +338,12 @@ export class DialogTitleProvider extends Provider { return new DialogTitleProvider(opts); } - readonly root: DialogProvider; + readonly provider: DialogProvider; private constructor(opts: DialogTitleOpts) { super(opts, 'Dialog', 'title', attrs.title); - this.root = DialogProvider.ctx.get(); - this.root.titleId.current = opts.id.current; + this.provider = DialogProvider.ctx.get(); + this.provider.titleId.current = opts.id.current; } readonly props = $derived.by(() => @@ -366,12 +364,12 @@ export class DialogDescriptionProvider extends Provider { return new DialogDescriptionProvider(opts); } - readonly root: DialogProvider; + readonly provider: DialogProvider; private constructor(opts: DialogDescriptionOpts) { super(opts, 'Dialog', 'description', attrs.description); - this.root = DialogProvider.ctx.get(); - this.root.descriptionId.current = opts.id.current; + this.provider = DialogProvider.ctx.get(); + this.provider.descriptionId.current = opts.id.current; } readonly props = $derived.by(() => @@ -390,22 +388,22 @@ export class DialogCloseProvider extends Provider { return new DialogCloseProvider(opts); } - readonly root: DialogProvider; + readonly provider: DialogProvider; private constructor(opts: DialogCloseOpts) { super(opts, 'Dialog', 'close', attrs.close); - this.root = DialogProvider.ctx.get(); + this.provider = DialogProvider.ctx.get(); } readonly onclick = (_e: SomaMouseEvent) => { - this.root.handleClose(); + this.provider.handleClose(); }; readonly props = $derived.by(() => this.assertProps({ ...this.baseProps, type: 'button' as const, - 'aria-label': this.root.translate('close', 'Close'), + 'aria-label': this.provider.translate('close', 'Close'), onclick: this.onclick, } as const), ); diff --git a/src/uix/soma/components/dropdown-menu/components/dropdown-menu-checkbox-item.svelte b/src/uix/soma/components/dropdown-menu/components/dropdown-menu-checkbox-item.svelte index eaa0c8bb2..5d172cbef 100644 --- a/src/uix/soma/components/dropdown-menu/components/dropdown-menu-checkbox-item.svelte +++ b/src/uix/soma/components/dropdown-menu/components/dropdown-menu-checkbox-item.svelte @@ -30,12 +30,14 @@ ), checked: writableActive( () => checked, - (v) => (checked = v), + (v) => { + checked = v; + onCheckedChange(v); + }, ), disabled: readableActive(() => disabled), textValue: readableActive(() => textValue), closeOnSelect: readableActive(() => closeOnSelect), - onCheckedChange: readableActive(() => onCheckedChange), onSelect: readableActive(() => onSelect), }); diff --git a/src/uix/soma/components/dropdown-menu/components/dropdown-menu-content.svelte b/src/uix/soma/components/dropdown-menu/components/dropdown-menu-content.svelte index d4d3a40d3..5d0e4a6a5 100644 --- a/src/uix/soma/components/dropdown-menu/components/dropdown-menu-content.svelte +++ b/src/uix/soma/components/dropdown-menu/components/dropdown-menu-content.svelte @@ -3,13 +3,13 @@ import { mergeProps } from '$soma/props'; import { styleToString } from '$soma/css'; import { createId } from '$soma/id'; - import { Soma } from '$soma/core/soma.svelte'; + import { getSoma } from '$soma/core/soma.svelte'; import { MenuContentProvider } from '../dropdown-menu-provider.svelte'; import type { MenuContentProps } from '../types'; import { noop } from '$lib/util/funcs'; const uid = $props.id(); - const soma = Soma.getOr(); + const soma = getSoma(); let { ref = $bindable(null), @@ -37,7 +37,7 @@ onInteractOutside = noop, interactOutsideBehavior = undefined, onFocusOutside = noop, - dir = soma?.dir.current ?? 'ltr', + dir = soma.presentation.current?.dir ?? 'ltr', style = null, children, child, @@ -88,10 +88,10 @@ {#if state.isPresent || forceMount}
    {#if child} - {@render child({ open: state.root.opts.open.current, props: mergedProps })} + {@render child({ open: state.provider.opts.open.current, props: mergedProps })} {:else}
    - {@render children?.({ open: state.root.opts.open.current })} + {@render children?.({ open: state.provider.opts.open.current })}
    {/if}
    diff --git a/src/uix/soma/components/dropdown-menu/components/dropdown-menu-radio-group.svelte b/src/uix/soma/components/dropdown-menu/components/dropdown-menu-radio-group.svelte index 28ebe4b47..e89ce827e 100644 --- a/src/uix/soma/components/dropdown-menu/components/dropdown-menu-radio-group.svelte +++ b/src/uix/soma/components/dropdown-menu/components/dropdown-menu-radio-group.svelte @@ -26,9 +26,11 @@ ), value: writableActive( () => value, - (v) => (value = v), + (v) => { + value = v; + onValueChange(v); + }, ), - onValueChange: readableActive(() => onValueChange), }); const mergedProps = $derived(mergeProps(restProps, state.props)); diff --git a/src/uix/soma/components/dropdown-menu/components/dropdown-menu-sub-content.svelte b/src/uix/soma/components/dropdown-menu/components/dropdown-menu-sub-content.svelte index d7c8da29a..4e9b89564 100644 --- a/src/uix/soma/components/dropdown-menu/components/dropdown-menu-sub-content.svelte +++ b/src/uix/soma/components/dropdown-menu/components/dropdown-menu-sub-content.svelte @@ -3,12 +3,12 @@ import { mergeProps } from '$soma/props'; import { styleToString } from '$soma/css'; import { createId } from '$soma/id'; - import { Soma } from '$soma/core/soma.svelte'; + import { getSoma } from '$soma/core/soma.svelte'; import { MenuSubContentProvider } from '../dropdown-menu-provider.svelte'; import type { MenuSubContentProps } from '../types'; const uid = $props.id(); - const soma = Soma.getOr(); + const soma = getSoma(); let { ref = $bindable(null), @@ -22,7 +22,7 @@ collisionBoundary = [], collisionPadding = 0, loop = false, - dir = soma?.dir.current ?? 'ltr', + dir = soma.presentation.current?.dir ?? 'ltr', style = null, children, child, diff --git a/src/uix/soma/components/dropdown-menu/components/dropdown-menu-sub.svelte b/src/uix/soma/components/dropdown-menu/components/dropdown-menu-sub.svelte index 0c70c3493..3d8494bad 100644 --- a/src/uix/soma/components/dropdown-menu/components/dropdown-menu-sub.svelte +++ b/src/uix/soma/components/dropdown-menu/components/dropdown-menu-sub.svelte @@ -1,5 +1,5 @@ diff --git a/src/uix/soma/components/dropdown-menu/components/dropdown-menu.svelte b/src/uix/soma/components/dropdown-menu/components/dropdown-menu.svelte index eda3330b4..7d212e57e 100644 --- a/src/uix/soma/components/dropdown-menu/components/dropdown-menu.svelte +++ b/src/uix/soma/components/dropdown-menu/components/dropdown-menu.svelte @@ -4,10 +4,10 @@ import { MenuProvider } from '../dropdown-menu-provider.svelte'; import type { MenuProps } from '../types'; import { noop } from '$lib/util/funcs'; - import { Soma } from '$soma/core/soma.svelte'; + import { getSoma } from '$soma/core/soma.svelte'; const uid = $props.id(); - const soma = Soma.getOr(); + const soma = getSoma(); let { id = createId(uid, 'dropdown-menu'), @@ -15,7 +15,7 @@ onOpenChange = noop, onOpenChangeComplete = noop, modal = true, - dir = soma?.dir.current ?? 'ltr', + dir = soma.presentation.current?.dir ?? 'ltr', children, }: MenuProps = $props(); @@ -23,9 +23,11 @@ id: readableActive(() => id), open: writableActive( () => open, - (v) => (open = v), + (v) => { + open = v; + onOpenChange(v); + }, ), - onOpenChange: readableActive(() => onOpenChange), onOpenChangeComplete: readableActive(() => onOpenChangeComplete), modal: readableActive(() => modal), dir: readableActive(() => dir), diff --git a/src/uix/soma/components/dropdown-menu/dropdown-menu-provider.svelte.ts b/src/uix/soma/components/dropdown-menu/dropdown-menu-provider.svelte.ts index ef166bab5..ef7d48f11 100644 --- a/src/uix/soma/components/dropdown-menu/dropdown-menu-provider.svelte.ts +++ b/src/uix/soma/components/dropdown-menu/dropdown-menu-provider.svelte.ts @@ -3,7 +3,7 @@ import { createAttrs, boolToEmptyStrOrUndef, getDataOpenClosed } from '$soma/att import { readableActive, state, type Active, type ActiveProps, type StateProps } from '$soma/reactive'; import type { OnChangeFn, SomaMouseEvent, SomaKeyboardEvent, Direction, Arrayable, StyleProperties } from '$soma/types'; import { KEYS, getDirectionalKeys } from '$soma/keyboard'; -import { Soma } from '$soma/core/soma.svelte'; +import { getSoma } from '$soma/core/soma.svelte'; import { untrack } from 'svelte'; import { Presence } from '$soma/layers/presence.svelte'; @@ -65,7 +65,6 @@ interface MenuOpts ActiveProps<{ modal: boolean; dir: Direction; - onOpenChange: OnChangeFn; onOpenChangeComplete: OnChangeFn; }> {} @@ -76,7 +75,7 @@ export class MenuProvider extends Provider { return new MenuProvider(opts); } - readonly soma: Soma | undefined; + readonly config = getSoma(); readonly floatingProvider: FloatingProvider; readonly contentPresence: Presence; readonly typeahead = new Typeahead(); @@ -87,7 +86,7 @@ export class MenuProvider extends Provider { private constructor(opts: MenuOpts) { super(opts, 'DropdownMenu', 'root', attrs.root, MenuProvider.ctx); - this.soma = Soma.getOr(); + this.floatingProvider = FloatingProvider.create(); this.contentPresence = new Presence({ @@ -99,13 +98,11 @@ export class MenuProvider extends Provider { handleOpen() { this.opts.open.current = true; - this.opts.onOpenChange.current(true); } handleClose() { this.typeahead.reset(); this.opts.open.current = false; - this.opts.onOpenChange.current(false); } setContentRef(el: HTMLElement | null) { @@ -129,12 +126,12 @@ export class MenuTriggerProvider extends Provider { return new MenuTriggerProvider(opts); } - readonly root: MenuProvider; + readonly provider: MenuProvider; private constructor(opts: MenuTriggerOpts) { super(opts, 'DropdownMenu', 'trigger', attrs.trigger); - this.root = MenuProvider.ctx.get(); - this.root.triggerId.current = opts.id.current; + this.provider = MenuProvider.ctx.get(); + this.provider.triggerId.current = opts.id.current; FloatingAnchor.create({ id: opts.id, @@ -143,14 +140,14 @@ export class MenuTriggerProvider extends Provider { } readonly onclick = (_e: SomaMouseEvent) => { - if (this.root.opts.open.current) this.root.handleClose(); - else this.root.handleOpen(); + if (this.provider.opts.open.current) this.provider.handleClose(); + else this.provider.handleOpen(); }; readonly onkeydown = (e: SomaKeyboardEvent) => { if (e.key === KEYS.ARROW_DOWN || e.key === KEYS.ENTER || e.key === KEYS.SPACE) { e.preventDefault(); - this.root.handleOpen(); + this.provider.handleOpen(); } }; @@ -159,9 +156,9 @@ export class MenuTriggerProvider extends Provider { ...this.baseProps, type: 'button' as const, 'aria-haspopup': 'menu' as const, - 'aria-expanded': this.root.opts.open.current, - 'aria-controls': this.root.contentId.current || undefined, - 'data-state': getDataOpenClosed(this.root.opts.open.current), + 'aria-expanded': this.provider.opts.open.current, + 'aria-controls': this.provider.contentId.current || undefined, + 'data-state': getDataOpenClosed(this.provider.opts.open.current), onclick: this.onclick, onkeydown: this.onkeydown, } as const), @@ -204,7 +201,7 @@ export class MenuContentProvider extends Provider { return new MenuContentProvider(opts); } - readonly root: MenuProvider; + readonly provider: MenuProvider; readonly floating: FloatingContent; readonly focusScope: ReturnType; readonly dismissal: Dismissal; @@ -213,10 +210,10 @@ export class MenuContentProvider extends Provider { private constructor(opts: MenuContentOpts) { super(opts, 'DropdownMenu', 'content', attrs.content, undefined, (el) => { - this.root.setContentRef(el); + this.provider.setContentRef(el); }); - this.root = MenuProvider.ctx.get(); - this.root.contentId.current = opts.id.current; + this.provider = MenuProvider.ctx.get(); + this.provider.contentId.current = opts.id.current; // Floating this.floating = FloatingContent.create({ @@ -237,7 +234,7 @@ export class MenuContentProvider extends Provider { onPlaced: readableActive(() => () => {}), dir: opts.dir, style: opts.style, - enabled: readableActive(() => this.root.opts.open.current), + enabled: readableActive(() => this.provider.opts.open.current), customAnchor: readableActive(() => null), }); @@ -248,7 +245,7 @@ export class MenuContentProvider extends Provider { trap: opts.trapFocus, loop: opts.loop, ref: opts.ref, - enabled: readableActive(() => this.root.contentPresence.isPresent), + enabled: readableActive(() => this.provider.contentPresence.isPresent), }); // Dismissal — menus always close on outside click (unlike dialogs where modal=true ignores it) @@ -258,15 +255,15 @@ export class MenuContentProvider extends Provider { this.dismissal = Dismissal.use({ ref: readableActive(() => opts.ref.current), - enabled: readableActive(() => this.root.opts.open.current), + enabled: readableActive(() => this.provider.opts.open.current), onEscapeKeydown: readableActive(() => (e: KeyboardEvent) => { opts.onEscapeKeydown.current(e); - if (!e.defaultPrevented) this.root.handleClose(); + if (!e.defaultPrevented) this.provider.handleClose(); }), escapeKeydownBehavior: opts.escapeKeydownBehavior, onInteractOutside: readableActive(() => (e: PointerEvent) => { opts.onInteractOutside.current(e); - if (!e.defaultPrevented) this.root.handleClose(); + if (!e.defaultPrevented) this.provider.handleClose(); }), interactOutsideBehavior: resolvedInteractBehavior, onFocusOutside: opts.onFocusOutside, @@ -276,19 +273,19 @@ export class MenuContentProvider extends Provider { // Scroll lock this.scrollLock = new ScrollLock(); $effect(() => { - this.scrollLock.locked.current = this.root.opts.open.current && opts.preventScroll.current; + this.scrollLock.locked.current = this.provider.opts.open.current && opts.preventScroll.current; }); // Text selection this.textSelection = TextSelection.use({ ref: readableActive(() => opts.ref.current), - enabled: readableActive(() => this.root.opts.open.current), + enabled: readableActive(() => this.provider.opts.open.current), onPointerDown: readableActive(() => () => {}), onPointerUp: readableActive(() => () => {}), }); } - readonly isPresent = $derived.by(() => this.root.contentPresence.isPresent); + readonly isPresent = $derived.by(() => this.provider.contentPresence.isPresent); readonly wrapperProps = $derived.by(() => ({ ...this.floating.wrapperProps, @@ -302,10 +299,10 @@ export class MenuContentProvider extends Provider { const container = this.opts.ref.current; if (!container) return; - const items = this.root.getItems(container); + const items = this.provider.getItems(container); const active = document.activeElement as HTMLElement; const currentIndex = items.indexOf(active); - const dir = this.root.opts.dir.current; + const dir = this.provider.opts.dir.current; const { nextKey, prevKey } = getDirectionalKeys(dir, 'vertical'); let targetIndex = -1; @@ -328,7 +325,7 @@ export class MenuContentProvider extends Provider { targetIndex = items.length - 1; } else { // Typeahead - const match = this.root.typeahead.handle(e.key, items); + const match = this.provider.typeahead.handle(e.key, items); if (match) match.focus(); return; } @@ -343,9 +340,9 @@ export class MenuContentProvider extends Provider { ...this.baseProps, role: 'menu' as const, 'aria-orientation': 'vertical' as const, - 'data-state': getDataOpenClosed(this.root.opts.open.current), + 'data-state': getDataOpenClosed(this.provider.opts.open.current), ...this.floating.props, - ...this.root.contentPresence.transitionAttrs, + ...this.provider.contentPresence.transitionAttrs, ...this.focusScope.props, ...this.dismissal.props, onkeydown: this.onkeydown, @@ -390,17 +387,17 @@ export class MenuItemProvider extends Provider { return new MenuItemProvider(opts); } - readonly root: MenuProvider; + readonly provider: MenuProvider; private constructor(opts: MenuItemOpts) { super(opts, 'DropdownMenu', 'item', attrs.item); - this.root = MenuProvider.ctx.get(); + this.provider = MenuProvider.ctx.get(); } readonly onclick = (_e: SomaMouseEvent) => { if (this.opts.disabled.current) return; this.opts.onSelect.current(); - if (this.opts.closeOnSelect.current) this.root.handleClose(); + if (this.opts.closeOnSelect.current) this.provider.handleClose(); }; readonly onkeydown = (e: SomaKeyboardEvent) => { @@ -408,7 +405,7 @@ export class MenuItemProvider extends Provider { if (e.key === KEYS.ENTER || e.key === KEYS.SPACE) { e.preventDefault(); this.opts.onSelect.current(); - if (this.opts.closeOnSelect.current) this.root.handleClose(); + if (this.opts.closeOnSelect.current) this.provider.handleClose(); } }; @@ -503,7 +500,6 @@ interface MenuCheckboxItemOpts disabled: boolean; textValue: string; closeOnSelect: boolean; - onCheckedChange: OnChangeFn; onSelect: () => void; }> {} @@ -512,20 +508,19 @@ export class MenuCheckboxItemProvider extends Provider { return new MenuCheckboxItemProvider(opts); } - readonly root: MenuProvider; + readonly provider: MenuProvider; private constructor(opts: MenuCheckboxItemOpts) { super(opts, 'DropdownMenu', 'checkbox-item', attrs['checkbox-item']); - this.root = MenuProvider.ctx.get(); + this.provider = MenuProvider.ctx.get(); } readonly onclick = (_e: SomaMouseEvent) => { if (this.opts.disabled.current) return; const next = !this.opts.checked.current; this.opts.checked.current = next; - this.opts.onCheckedChange.current(next); this.opts.onSelect.current(); - if (this.opts.closeOnSelect.current) this.root.handleClose(); + if (this.opts.closeOnSelect.current) this.provider.handleClose(); }; readonly onkeydown = (e: SomaKeyboardEvent) => { @@ -555,8 +550,7 @@ export class MenuCheckboxItemProvider extends Provider { interface MenuRadioGroupOpts extends WithRefOpts, - StateProps<{ value: string }>, - ActiveProps<{ onValueChange: OnChangeFn }> {} + StateProps<{ value: string }> {} export class MenuRadioGroupProvider extends Provider { static readonly ctx = context('DropdownMenuRadioGroup'); @@ -594,12 +588,12 @@ export class MenuRadioItemProvider extends Provider { return new MenuRadioItemProvider(opts); } - readonly root: MenuProvider; + readonly provider: MenuProvider; readonly radioGroup: MenuRadioGroupProvider; private constructor(opts: MenuRadioItemOpts) { super(opts, 'DropdownMenu', 'radio-item', attrs['radio-item']); - this.root = MenuProvider.ctx.get(); + this.provider = MenuProvider.ctx.get(); this.radioGroup = MenuRadioGroupProvider.ctx.get(); } @@ -610,9 +604,8 @@ export class MenuRadioItemProvider extends Provider { readonly onclick = (_e: SomaMouseEvent) => { if (this.opts.disabled.current) return; this.radioGroup.opts.value.current = this.opts.value.current; - this.radioGroup.opts.onValueChange.current(this.opts.value.current); this.opts.onSelect.current(); - if (this.opts.closeOnSelect.current) this.root.handleClose(); + if (this.opts.closeOnSelect.current) this.provider.handleClose(); }; readonly onkeydown = (e: SomaKeyboardEvent) => { @@ -640,7 +633,7 @@ export class MenuRadioItemProvider extends Provider { // ── Sub ────────────────────────────────────────────────────────────────────── -interface MenuSubOpts extends StateProps<{ open: boolean }>, ActiveProps<{ onOpenChange: OnChangeFn }> {} +interface MenuSubOpts extends StateProps<{ open: boolean }> {} export class MenuSubProvider { static readonly ctx = context('DropdownMenuSub'); @@ -650,7 +643,7 @@ export class MenuSubProvider { } readonly opts: MenuSubOpts; - readonly root: MenuProvider; + readonly provider: MenuProvider; readonly contentPresence: Presence; readonly floatingProvider: FloatingProvider; @@ -659,7 +652,7 @@ export class MenuSubProvider { private constructor(opts: MenuSubOpts) { this.opts = opts; - this.root = MenuProvider.ctx.get(); + this.provider = MenuProvider.ctx.get(); this.floatingProvider = FloatingProvider.create(); this.contentPresence = new Presence({ @@ -670,12 +663,10 @@ export class MenuSubProvider { handleOpen() { this.opts.open.current = true; - this.opts.onOpenChange.current(true); } handleClose() { this.opts.open.current = false; - this.opts.onOpenChange.current(false); } setContentRef(el: HTMLElement | null) { @@ -720,7 +711,7 @@ export class MenuSubTriggerProvider extends Provider { readonly onkeydown = (e: SomaKeyboardEvent) => { if (this.opts.disabled.current) return; - const dir = this.sub.root.opts.dir.current; + const dir = this.sub.provider.opts.dir.current; const openKey = dir === 'rtl' ? KEYS.ARROW_LEFT : KEYS.ARROW_RIGHT; if (e.key === openKey || e.key === KEYS.ENTER || e.key === KEYS.SPACE) { e.preventDefault(); @@ -812,7 +803,7 @@ export class MenuSubContentProvider extends Provider { })); readonly onkeydown = (e: KeyboardEvent) => { - const dir = this.sub.root.opts.dir.current; + const dir = this.sub.provider.opts.dir.current; const closeKey = dir === 'rtl' ? KEYS.ARROW_RIGHT : KEYS.ARROW_LEFT; if (e.key === closeKey || e.key === KEYS.ESCAPE) { e.preventDefault(); @@ -822,7 +813,7 @@ export class MenuSubContentProvider extends Provider { // Arrow nav within sub const container = this.opts.ref.current; if (!container) return; - const items = this.sub.root.getItems(container); + const items = this.sub.provider.getItems(container); const active = document.activeElement as HTMLElement; const currentIndex = items.indexOf(active); diff --git a/src/uix/soma/components/editable/components/editable.svelte b/src/uix/soma/components/editable/components/editable.svelte index 7cefecc78..190a020b5 100644 --- a/src/uix/soma/components/editable/components/editable.svelte +++ b/src/uix/soma/components/editable/components/editable.svelte @@ -38,11 +38,17 @@ ), value: writableActive( () => value, - (v) => (value = v), + (v) => { + value = v; + onValueChange(v); + }, ), editing: writableActive( () => editing, - (v) => (editing = v), + (v) => { + editing = v; + onEditingChange(v); + }, ), placeholder: readableActive(() => placeholder), activationMode: readableActive(() => activationMode), @@ -52,10 +58,8 @@ maxLength: readableActive(() => maxLength), disabled: readableActive(() => disabled), readonly: readableActive(() => readonlyProp), - onValueChange: readableActive(() => onValueChange), onValueCommit: readableActive(() => onValueCommit), onValueRevert: readableActive(() => onValueRevert), - onEditingChange: readableActive(() => onEditingChange), }); const mergedProps = $derived(mergeProps(restProps, state.props)); diff --git a/src/uix/soma/components/editable/editable-provider.svelte.ts b/src/uix/soma/components/editable/editable-provider.svelte.ts index 8c750fa4b..721318b70 100644 --- a/src/uix/soma/components/editable/editable-provider.svelte.ts +++ b/src/uix/soma/components/editable/editable-provider.svelte.ts @@ -3,7 +3,8 @@ import { createAttrs, boolToEmptyStrOrUndef } from '$soma/attrs'; import { state, type Active, type ActiveProps, type StateProps } from '$soma/reactive'; import type { OnChangeFn, SomaKeyboardEvent, SomaMouseEvent } from '$soma/types'; import { KEYS } from '$soma/keyboard'; -import { Soma } from '$soma/core/soma.svelte'; +import { getSoma } from '$soma/core/soma.svelte'; +import { resolveSomaTranslationPath } from '$soma/core/translator.svelte'; const attrs = createAttrs({ component: 'editable', @@ -30,10 +31,8 @@ interface EditableOpts maxLength: number | undefined; disabled: boolean; readonly: boolean; - onValueChange: OnChangeFn; onValueCommit: OnChangeFn; onValueRevert: () => void; - onEditingChange: OnChangeFn; }> {} export class EditableProvider extends Provider { @@ -43,7 +42,7 @@ export class EditableProvider extends Provider { return new EditableProvider(opts); } - readonly soma: Soma | undefined; + readonly config = getSoma(); // Draft value (in-progress edit) draft = $state(''); @@ -51,7 +50,7 @@ export class EditableProvider extends Provider { private constructor(opts: EditableOpts) { super(opts, 'Editable', 'root', attrs.root, EditableProvider.ctx); - this.soma = Soma.getOr(); + this.draft = opts.value.current; } @@ -69,7 +68,6 @@ export class EditableProvider extends Provider { this.draft = this.opts.value.current; this.opts.editing.current = true; - this.opts.onEditingChange.current(true); // Focus input on next tick requestAnimationFrame(() => { @@ -89,9 +87,7 @@ export class EditableProvider extends Provider { this.opts.value.current = this.draft; this.opts.editing.current = false; - this.opts.onValueChange.current(this.draft); this.opts.onValueCommit.current(this.draft); - this.opts.onEditingChange.current(false); } cancel() { @@ -100,7 +96,6 @@ export class EditableProvider extends Provider { this.draft = this.opts.value.current; this.opts.editing.current = false; this.opts.onValueRevert.current(); - this.opts.onEditingChange.current(false); } readonly props = $derived.by(() => @@ -123,19 +118,19 @@ export class EditableAreaProvider extends Provider { return new EditableAreaProvider(opts); } - readonly root: EditableProvider; + readonly provider: EditableProvider; private constructor(opts: EditableAreaOpts) { super(opts, 'Editable', 'area', attrs.area); - this.root = EditableProvider.ctx.get(); + this.provider = EditableProvider.ctx.get(); } readonly props = $derived.by(() => this.assertProps({ ...this.baseProps, - 'data-editing': boolToEmptyStrOrUndef(this.root.isEditing), - 'data-disabled': boolToEmptyStrOrUndef(this.root.opts.disabled.current), - 'data-readonly': boolToEmptyStrOrUndef(this.root.opts.readonly.current), + 'data-editing': boolToEmptyStrOrUndef(this.provider.isEditing), + 'data-disabled': boolToEmptyStrOrUndef(this.provider.opts.disabled.current), + 'data-readonly': boolToEmptyStrOrUndef(this.provider.opts.readonly.current), } as const), ); } @@ -149,46 +144,46 @@ export class EditablePreviewProvider extends Provider { return new EditablePreviewProvider(opts); } - readonly root: EditableProvider; + readonly provider: EditableProvider; private constructor(opts: EditablePreviewOpts) { super(opts, 'Editable', 'preview', attrs.preview); - this.root = EditableProvider.ctx.get(); + this.provider = EditableProvider.ctx.get(); } readonly displayValue = $derived.by(() => - this.root.opts.value.current || this.root.opts.placeholder.current, + this.provider.opts.value.current || this.provider.opts.placeholder.current, ); - readonly isPlaceholder = $derived.by(() => !this.root.opts.value.current); + readonly isPlaceholder = $derived.by(() => !this.provider.opts.value.current); private handleActivation() { - this.root.startEdit(); + this.provider.startEdit(); } readonly onclick = (_e: SomaMouseEvent) => { - const mode = this.root.opts.activationMode.current; + const mode = this.provider.opts.activationMode.current; if (mode === 'click') this.handleActivation(); }; readonly ondblclick = (_e: MouseEvent) => { - const mode = this.root.opts.activationMode.current; + const mode = this.provider.opts.activationMode.current; if (mode === 'dblclick') this.handleActivation(); }; readonly onfocus = () => { - const mode = this.root.opts.activationMode.current; + const mode = this.provider.opts.activationMode.current; if (mode === 'focus') this.handleActivation(); }; readonly props = $derived.by(() => this.assertProps({ ...this.baseProps, - hidden: this.root.isEditing || undefined, - tabindex: this.root.opts.disabled.current ? undefined : 0, + hidden: this.provider.isEditing || undefined, + tabindex: this.provider.opts.disabled.current ? undefined : 0, 'data-placeholder-shown': boolToEmptyStrOrUndef(this.isPlaceholder), - 'data-disabled': boolToEmptyStrOrUndef(this.root.opts.disabled.current), - 'data-readonly': boolToEmptyStrOrUndef(this.root.opts.readonly.current), + 'data-disabled': boolToEmptyStrOrUndef(this.provider.opts.disabled.current), + 'data-readonly': boolToEmptyStrOrUndef(this.provider.opts.readonly.current), onclick: this.onclick, ondblclick: this.ondblclick, onfocus: this.onfocus, @@ -205,31 +200,31 @@ export class EditableInputProvider extends Provider { return new EditableInputProvider(opts); } - readonly root: EditableProvider; + readonly provider: EditableProvider; private constructor(opts: EditableInputOpts) { super(opts, 'Editable', 'input', attrs.input, undefined, (el) => { - this.root.inputRef.current = el; + this.provider.inputRef.current = el; }); - this.root = EditableProvider.ctx.get(); + this.provider = EditableProvider.ctx.get(); } readonly oninput = (e: Event) => { const target = e.currentTarget as HTMLInputElement | HTMLTextAreaElement; - this.root.draft = target.value; + this.provider.draft = target.value; }; readonly onkeydown = (e: SomaKeyboardEvent) => { - const submitMode = this.root.opts.submitMode.current; + const submitMode = this.provider.opts.submitMode.current; if (e.key === KEYS.ENTER && !e.shiftKey) { if (submitMode === 'enter' || submitMode === 'both') { e.preventDefault(); - this.root.submit(); + this.provider.submit(); } } else if (e.key === KEYS.ESCAPE) { e.preventDefault(); - this.root.cancel(); + this.provider.cancel(); } }; @@ -244,27 +239,27 @@ export class EditableInputProvider extends Provider { if (isControl) return; } - const submitMode = this.root.opts.submitMode.current; + const submitMode = this.provider.opts.submitMode.current; if (submitMode === 'blur' || submitMode === 'both') { - this.root.submit(); + this.provider.submit(); } else { - this.root.cancel(); + this.provider.cancel(); } }; readonly props = $derived.by(() => this.assertProps({ ...this.baseProps, - hidden: !this.root.isEditing || undefined, - value: this.root.draft, - placeholder: this.root.opts.placeholder.current || undefined, - maxlength: this.root.opts.maxLength.current ?? undefined, - disabled: this.root.opts.disabled.current || undefined, - readonly: this.root.opts.readonly.current || undefined, - 'aria-disabled': this.root.opts.disabled.current || undefined, - 'data-disabled': boolToEmptyStrOrUndef(this.root.opts.disabled.current), - 'data-readonly': boolToEmptyStrOrUndef(this.root.opts.readonly.current), - style: this.root.opts.autoResize.current + hidden: !this.provider.isEditing || undefined, + value: this.provider.draft, + placeholder: this.provider.opts.placeholder.current || undefined, + maxlength: this.provider.opts.maxLength.current ?? undefined, + disabled: this.provider.opts.disabled.current || undefined, + readonly: this.provider.opts.readonly.current || undefined, + 'aria-disabled': this.provider.opts.disabled.current || undefined, + 'data-disabled': boolToEmptyStrOrUndef(this.provider.opts.disabled.current), + 'data-readonly': boolToEmptyStrOrUndef(this.provider.opts.readonly.current), + style: this.provider.opts.autoResize.current ? { 'field-sizing': 'content', 'min-width': '2ch', @@ -286,25 +281,25 @@ export class EditableEditTriggerProvider extends Provider) => { - this.root.startEdit(); + this.provider.startEdit(); }; readonly props = $derived.by(() => this.assertProps({ ...this.baseProps, type: 'button' as const, - hidden: this.root.isEditing || undefined, + hidden: this.provider.isEditing || undefined, 'aria-label': - this.root.soma?.translate('editable.edit', 'Edit') ?? 'Edit', - disabled: this.root.opts.disabled.current || this.root.opts.readonly.current || undefined, + resolveSomaTranslationPath('soma.editable.edit', this.provider.config.translator.current, 'Edit'), + disabled: this.provider.opts.disabled.current || this.provider.opts.readonly.current || undefined, onclick: this.onclick, } as const), ); @@ -319,24 +314,24 @@ export class EditableSubmitTriggerProvider extends Provider) => { - this.root.submit(); + this.provider.submit(); }; readonly props = $derived.by(() => this.assertProps({ ...this.baseProps, type: 'button' as const, - hidden: !this.root.isEditing || undefined, + hidden: !this.provider.isEditing || undefined, 'aria-label': - this.root.soma?.translate('editable.submit', 'Save') ?? 'Save', + resolveSomaTranslationPath('soma.editable.submit', this.provider.config.translator.current, 'Save'), onclick: this.onclick, } as const), ); @@ -351,24 +346,24 @@ export class EditableCancelTriggerProvider extends Provider) => { - this.root.cancel(); + this.provider.cancel(); }; readonly props = $derived.by(() => this.assertProps({ ...this.baseProps, type: 'button' as const, - hidden: !this.root.isEditing || undefined, + hidden: !this.provider.isEditing || undefined, 'aria-label': - this.root.soma?.translate('editable.cancel', 'Cancel') ?? 'Cancel', + resolveSomaTranslationPath('soma.editable.cancel', this.provider.config.translator.current, 'Cancel'), onclick: this.onclick, } as const), ); diff --git a/src/uix/soma/components/index.ts b/src/uix/soma/components/index.ts index bc5e24462..fa75b3b85 100644 --- a/src/uix/soma/components/index.ts +++ b/src/uix/soma/components/index.ts @@ -5,6 +5,7 @@ export * as Combobox from './combobox'; export * as Dialog from './dialog'; export * as DropdownMenu from './dropdown-menu'; export * as Editable from './editable'; +export * as NumberField from './number-field'; export * as Pagination from './pagination'; export * as Popover from './popover'; export * as RadioGroup from './radio-group'; @@ -14,6 +15,7 @@ export * as Slider from './slider'; export * as Splitter from './splitter'; export * as Stepper from './stepper'; export * as Switch from './switch'; +export * as Table from './table'; export * as Tabs from './tabs'; export * as TagsInput from './tags-input'; export * as Toast from './toast'; diff --git a/src/uix/soma/components/internal/portal.svelte b/src/uix/soma/components/internal/portal.svelte index 653fb960c..134b29e79 100644 --- a/src/uix/soma/components/internal/portal.svelte +++ b/src/uix/soma/components/internal/portal.svelte @@ -3,7 +3,7 @@ import { getAllContexts, mount, unmount } from 'svelte'; import { watch } from 'runed'; import { isBrowser } from '$soma/dom'; - import { Soma } from '$soma/core/soma.svelte'; + import { getSoma } from '$soma/core/soma.svelte'; import PortalConsumer from './portal-consumer.svelte'; export type PortalTarget = Element | string; @@ -16,11 +16,11 @@ let { to: toProp, children, disabled }: PortalProps = $props(); - const soma = Soma.getOr(); + const soma = getSoma(); const context = getAllContexts(); // Resolve portal target: prop → soma → 'body' - const resolvedTo = $derived(toProp ?? soma?.portalTo.current ?? 'body'); + const resolvedTo = $derived(toProp ?? soma.portalTo.current ?? 'body'); let target = $derived(getTarget()); diff --git a/src/uix/soma/components/internal/soma.svelte b/src/uix/soma/components/internal/soma.svelte index a0f5afabb..c983c6a4f 100644 --- a/src/uix/soma/components/internal/soma.svelte +++ b/src/uix/soma/components/internal/soma.svelte @@ -1,11 +1,16 @@ {@render children?.()} diff --git a/src/uix/soma/components/number-field/README.md b/src/uix/soma/components/number-field/README.md new file mode 100644 index 000000000..46f31d2df --- /dev/null +++ b/src/uix/soma/components/number-field/README.md @@ -0,0 +1,184 @@ +# NumberField + +A numeric input with increment/decrement triggers, keyboard shortcuts, optional scrubber for drag-based adjustment, mouse wheel support, and locale-aware formatting via `createNumr` from glob. Implements the WAI-ARIA spinbutton pattern. + +## Anatomy + +```svelte + + - + + + + +``` + +Optional scrubber for pointer-drag adjustment: + +```svelte + + Drag to adjust + + +``` + +## Parts + +| Part | Element | Description | +|------|---------|-------------| +| `Provider` | `
    ` | Root container. Manages value, formatting, constraints. | +| `Input` | `` | Text input with `role="spinbutton"`. Handles keyboard, formatting. | +| `IncrementTrigger` | ` +{/if} diff --git a/src/uix/soma/components/number-field/components/number-field-increment-trigger.svelte b/src/uix/soma/components/number-field/components/number-field-increment-trigger.svelte new file mode 100644 index 000000000..0088cd384 --- /dev/null +++ b/src/uix/soma/components/number-field/components/number-field-increment-trigger.svelte @@ -0,0 +1,30 @@ + + +{#if child} + {@render child({ props: mergedProps })} +{:else} + +{/if} diff --git a/src/uix/soma/components/number-field/components/number-field-input.svelte b/src/uix/soma/components/number-field/components/number-field-input.svelte new file mode 100644 index 000000000..b56572e35 --- /dev/null +++ b/src/uix/soma/components/number-field/components/number-field-input.svelte @@ -0,0 +1,30 @@ + + +{#if child} + {@render child({ props: mergedProps })} +{:else} + +{/if} diff --git a/src/uix/soma/components/number-field/components/number-field-scrubber.svelte b/src/uix/soma/components/number-field/components/number-field-scrubber.svelte new file mode 100644 index 000000000..a825876cd --- /dev/null +++ b/src/uix/soma/components/number-field/components/number-field-scrubber.svelte @@ -0,0 +1,34 @@ + + +{#if child} + {@render child({ props: mergedProps })} +{:else} +
    {@render children?.()}
    +{/if} diff --git a/src/uix/soma/components/number-field/components/number-field.svelte b/src/uix/soma/components/number-field/components/number-field.svelte new file mode 100644 index 000000000..7813aade5 --- /dev/null +++ b/src/uix/soma/components/number-field/components/number-field.svelte @@ -0,0 +1,69 @@ + + +{#if child} + {@render child({ props: mergedProps })} +{:else} +
    {@render children?.()}
    +{/if} diff --git a/src/uix/soma/components/number-field/exports.ts b/src/uix/soma/components/number-field/exports.ts new file mode 100644 index 000000000..b35532613 --- /dev/null +++ b/src/uix/soma/components/number-field/exports.ts @@ -0,0 +1,15 @@ +export { default as Provider } from './components/number-field.svelte'; +export { default as Input } from './components/number-field-input.svelte'; +export { default as IncrementTrigger } from './components/number-field-increment-trigger.svelte'; +export { default as DecrementTrigger } from './components/number-field-decrement-trigger.svelte'; +export { default as Scrubber } from './components/number-field-scrubber.svelte'; + +export type { NumrFormat } from './number-field-provider.svelte'; + +export type { + NumberFieldProps as ProviderProps, + NumberFieldInputProps as InputProps, + NumberFieldIncrementTriggerProps as IncrementTriggerProps, + NumberFieldDecrementTriggerProps as DecrementTriggerProps, + NumberFieldScrubberProps as ScrubberProps, +} from './types'; diff --git a/src/uix/soma/components/number-field/index.ts b/src/uix/soma/components/number-field/index.ts new file mode 100644 index 000000000..8570a426a --- /dev/null +++ b/src/uix/soma/components/number-field/index.ts @@ -0,0 +1 @@ +export * from './exports'; diff --git a/src/uix/soma/components/number-field/number-field-provider.svelte.ts b/src/uix/soma/components/number-field/number-field-provider.svelte.ts new file mode 100644 index 000000000..bf2c9986b --- /dev/null +++ b/src/uix/soma/components/number-field/number-field-provider.svelte.ts @@ -0,0 +1,492 @@ +import { watch } from 'runed'; +import { Provider, context, type WithRefOpts } from '$soma/provider'; +import { createAttrs, boolToEmptyStrOrUndef, boolToStr } from '$soma/attrs'; +import { state, readableActive, type Active, type ActiveProps, type StateProps } from '$soma/reactive'; +import type { OnChangeFn, Direction, SomaKeyboardEvent, SomaFocusEvent, SomaInputEvent } from '$soma/types'; +import { KEYS } from '$soma/keyboard'; +import { getSoma } from '$soma/core/soma.svelte'; +import { resolveSomaTranslationPath } from '$soma/core/translator.svelte'; +import { createNumr, type NumrFormat } from '@/lib'; + +export type { NumrFormat }; + +const attrs = createAttrs({ + component: 'number-field', + parts: ['root', 'input', 'increment-trigger', 'decrement-trigger', 'scrubber'] as const, +}); + +// ── Helpers ────────────────────────────────────────────────────────────────── + +function getDecimalPrecision(n: number): number { + const str = String(n); + const dot = str.indexOf('.'); + return dot >= 0 ? str.length - dot - 1 : 0; +} + +// ── Root ───────────────────────────────────────────────────────────────────── + +interface NumberFieldOpts + extends WithRefOpts, + StateProps<{ value: number | undefined }>, + ActiveProps<{ + min: number | undefined; + max: number | undefined; + step: number; + largeStep: number | undefined; + locale: string | undefined; + dir: Direction | undefined; + formatOptions: NumrFormat | undefined; + clampOnBlur: boolean; + allowMouseWheel: boolean; + disabled: boolean; + readonly: boolean; + required: boolean; + invalid: boolean; + name: string | undefined; + onValueCommit: OnChangeFn | undefined; + }> {} + +export class NumberFieldProvider extends Provider { + static readonly ctx = context('NumberField'); + + static from(opts: NumberFieldOpts) { + return new NumberFieldProvider(opts); + } + + readonly config = getSoma(); + inputRef = state(null); + + // Input display value + inputValue = $state(''); + focused = $state(false); + + // Scrub state + scrubbing = $state(false); + + /** Resolved locale: prop → Soma.format.locale → Soma.translator.getLocale() → 'en'. */ + readonly locale: Active; + /** Resolved direction: prop → Soma.dir → 'ltr'. */ + readonly resolvedDir: Active; + + private constructor(opts: NumberFieldOpts) { + super(opts, 'NumberField', 'root', attrs.root, NumberFieldProvider.ctx); + + this.locale = readableActive(() => + opts.locale.current + ?? this.config.translator.current.getLocale() + ?? 'en', + ); + + this.resolvedDir = readableActive(() => + opts.dir.current + ?? this.config.presentation.current?.dir + ?? 'ltr', + ); + + // Sync inputValue with external value when not focused. + // Must be after locale/resolvedDir assignment since numr depends on locale. + watch.pre( + () => [opts.value.current, this.locale.current, opts.formatOptions.current] as const, + ([value]) => { + this.inputValue = this.focused + ? this.formatEditValue(value) + : this.formatValue(value); + }, + ); + } + + // ── Computed ────────────────────────────────────────────────────────────── + + readonly isDisabled = $derived.by(() => this.opts.disabled.current); + readonly isReadonly = $derived.by(() => this.opts.readonly.current); + readonly isRequired = $derived.by(() => this.opts.required.current); + readonly isInvalid = $derived.by(() => this.opts.invalid.current); + + readonly step = $derived.by(() => this.opts.step.current); + readonly largeStep = $derived.by(() => this.opts.largeStep.current ?? this.step * 10); + readonly min = $derived.by(() => this.opts.min.current); + readonly max = $derived.by(() => this.opts.max.current); + + readonly dir = $derived.by(() => this.resolvedDir.current); + + /** + * Display formatter: uses the full consumer format (style, currency, percent...). + * Recreated when formatOptions or locale change. + */ + readonly numr = $derived.by(() => { + const fmt: NumrFormat = { ...(this.opts.formatOptions.current ?? {}) }; + return createNumr(fmt, this.locale.current); + }); + + /** + * Edit formatter: always decimal, no style decoration. + * Allows the user to edit "75" instead of "75%" or "$1,234.56". + * For `percent`, edit value is `value * 100`. + */ + readonly editNumr = $derived.by(() => { + const fmt = this.opts.formatOptions.current ?? {}; + const editFmt: NumrFormat = { + minDecimals: fmt.minDecimals, + maxDecimals: fmt.maxDecimals, + grouping: fmt.grouping, + }; + return createNumr(editFmt, this.locale.current); + }); + + readonly atMin = $derived.by( + () => this.min !== undefined + && this.opts.value.current !== undefined + && this.opts.value.current <= this.min, + ); + readonly atMax = $derived.by( + () => this.max !== undefined + && this.opts.value.current !== undefined + && this.opts.value.current >= this.max, + ); + + // ── Format / Parse ─────────────────────────────────────────────────────── + + /** For percent, internal 0.75 is edited as 75. */ + toEditValue(value: number): number { + return this.opts.formatOptions.current?.style === 'percent' ? value * 100 : value; + } + + fromEditValue(editValue: number): number { + return this.opts.formatOptions.current?.style === 'percent' ? editValue / 100 : editValue; + } + + /** Format for display: applies style, currency, %, etc. */ + formatValue(value: number | undefined): string { + if (value === undefined || Number.isNaN(value)) return ''; + return this.numr.f(value); + } + + /** Format for editing: pure decimal, value scaled by style. */ + formatEditValue(value: number | undefined): string { + if (value === undefined || Number.isNaN(value)) return ''; + return this.editNumr.f(this.toEditValue(value)); + } + + /** Parse edit string and convert to internal value. */ + parseValue(raw: string): number | undefined { + if (!raw.trim()) return undefined; + const n = this.editNumr.parse(raw); + if (Number.isNaN(n)) return undefined; + return this.fromEditValue(n); + } + + clamp(value: number): number { + let v = value; + if (this.min !== undefined) v = Math.max(this.min, v); + if (this.max !== undefined) v = Math.min(this.max, v); + return v; + } + + round(value: number, step: number): number { + const precision = getDecimalPrecision(step); + const factor = Math.pow(10, precision); + return Math.round(value * factor) / factor; + } + + commit(value: number | undefined): void { + if (value === undefined) { + this.opts.value.current = undefined; + this.inputValue = ''; + return; + } + const clamped = this.clamp(this.round(value, this.step)); + this.opts.value.current = clamped; + this.opts.onValueCommit.current?.(clamped); + this.inputValue = this.focused ? this.formatEditValue(clamped) : this.formatValue(clamped); + } + + // ── Actions ────────────────────────────────────────────────────────────── + + increment(by: number = this.step): void { + if (this.isDisabled || this.isReadonly) return; + const current = this.opts.value.current ?? 0; + this.commit(current + by); + } + + decrement(by: number = this.step): void { + if (this.isDisabled || this.isReadonly) return; + const current = this.opts.value.current ?? 0; + this.commit(current - by); + } + + // ── Event handlers ─────────────────────────────────────────────────────── + + readonly handleFocus = (_e: SomaFocusEvent): void => { + this.focused = true; + const raw = this.opts.value.current; + this.inputValue = raw !== undefined ? this.formatEditValue(raw) : ''; + }; + + readonly handleBlur = (_e: SomaFocusEvent): void => { + this.focused = false; + const parsed = this.parseValue(this.inputValue); + this.commit(parsed); + }; + + readonly handleInput = (e: SomaInputEvent): void => { + this.inputValue = e.currentTarget.value; + }; + + readonly handleKeydown = (e: SomaKeyboardEvent): void => { + if (this.isDisabled || this.isReadonly) return; + + switch (e.key) { + case KEYS.ARROW_UP: + e.preventDefault(); + this.increment(e.shiftKey ? this.largeStep : this.step); + break; + case KEYS.ARROW_DOWN: + e.preventDefault(); + this.decrement(e.shiftKey ? this.largeStep : this.step); + break; + case 'PageUp': + e.preventDefault(); + this.increment(this.largeStep); + break; + case 'PageDown': + e.preventDefault(); + this.decrement(this.largeStep); + break; + case KEYS.HOME: + if (this.min !== undefined) { + e.preventDefault(); + this.commit(this.min); + } + break; + case KEYS.END: + if (this.max !== undefined) { + e.preventDefault(); + this.commit(this.max); + } + break; + } + }; + + readonly props = $derived.by(() => + this.assertProps({ + ...this.baseProps, + 'data-disabled': boolToEmptyStrOrUndef(this.isDisabled), + 'data-readonly': boolToEmptyStrOrUndef(this.isReadonly), + 'data-required': boolToEmptyStrOrUndef(this.isRequired), + 'data-invalid': boolToEmptyStrOrUndef(this.isInvalid), + 'data-focused': boolToEmptyStrOrUndef(this.focused), + 'data-scrubbing': boolToEmptyStrOrUndef(this.scrubbing), + } as const), + ); +} + +// ── Input ──────────────────────────────────────────────────────────────────── + +interface NumberFieldInputOpts extends WithRefOpts {} + +export class NumberFieldInputProvider extends Provider { + static from(opts: NumberFieldInputOpts) { + return new NumberFieldInputProvider(opts); + } + + readonly provider: NumberFieldProvider; + + private constructor(opts: NumberFieldInputOpts) { + super(opts, 'NumberField', 'input', attrs.input); + this.provider = NumberFieldProvider.ctx.get(); + } + + readonly props = $derived.by(() => + this.assertProps({ + ...this.baseProps, + role: 'spinbutton' as const, + inputmode: 'decimal' as const, + autocomplete: 'off' as const, + autocorrect: 'off' as const, + spellcheck: false, + dir: this.provider.dir, + value: this.provider.inputValue, + 'aria-valuenow': this.provider.opts.value.current, + 'aria-valuemin': this.provider.opts.min.current, + 'aria-valuemax': this.provider.opts.max.current, + 'aria-valuetext': this.provider.opts.value.current !== undefined + ? String(this.provider.opts.value.current) + : undefined, + 'aria-required': boolToStr(this.provider.isRequired), + 'aria-disabled': boolToStr(this.provider.isDisabled), + 'aria-readonly': boolToStr(this.provider.isReadonly), + 'aria-invalid': boolToStr(this.provider.isInvalid), + disabled: this.provider.isDisabled || undefined, + readonly: this.provider.isReadonly || undefined, + required: this.provider.isRequired || undefined, + name: this.provider.opts.name.current || undefined, + 'data-disabled': boolToEmptyStrOrUndef(this.provider.isDisabled), + 'data-readonly': boolToEmptyStrOrUndef(this.provider.isReadonly), + 'data-invalid': boolToEmptyStrOrUndef(this.provider.isInvalid), + onfocus: this.provider.handleFocus, + onblur: this.provider.handleBlur, + oninput: this.provider.handleInput, + onkeydown: this.provider.handleKeydown, + } as const), + ); +} + +// ── IncrementTrigger ───────────────────────────────────────────────────────── + +interface NumberFieldIncrementTriggerOpts extends WithRefOpts {} + +export class NumberFieldIncrementTriggerProvider extends Provider { + static from(opts: NumberFieldIncrementTriggerOpts) { + return new NumberFieldIncrementTriggerProvider(opts); + } + + readonly provider: NumberFieldProvider; + + private constructor(opts: NumberFieldIncrementTriggerOpts) { + super(opts, 'NumberField', 'increment-trigger', attrs['increment-trigger']); + this.provider = NumberFieldProvider.ctx.get(); + } + + readonly isDisabled = $derived.by(() => this.provider.isDisabled || this.provider.atMax); + + readonly handleClick = () => { this.provider.increment(); }; + + readonly props = $derived.by(() => + this.assertProps({ + ...this.baseProps, + type: 'button' as const, + tabindex: -1, + disabled: this.isDisabled || undefined, + 'aria-label': + resolveSomaTranslationPath('soma.number-field.increment', this.provider.config.translator.current, 'Increment'), + 'aria-disabled': boolToStr(this.isDisabled), + 'data-disabled': boolToEmptyStrOrUndef(this.isDisabled), + onclick: this.handleClick, + } as const), + ); +} + +// ── DecrementTrigger ───────────────────────────────────────────────────────── + +interface NumberFieldDecrementTriggerOpts extends WithRefOpts {} + +export class NumberFieldDecrementTriggerProvider extends Provider { + static from(opts: NumberFieldDecrementTriggerOpts) { + return new NumberFieldDecrementTriggerProvider(opts); + } + + readonly provider: NumberFieldProvider; + + private constructor(opts: NumberFieldDecrementTriggerOpts) { + super(opts, 'NumberField', 'decrement-trigger', attrs['decrement-trigger']); + this.provider = NumberFieldProvider.ctx.get(); + } + + readonly isDisabled = $derived.by(() => this.provider.isDisabled || this.provider.atMin); + + readonly handleClick = () => { this.provider.decrement(); }; + + readonly props = $derived.by(() => + this.assertProps({ + ...this.baseProps, + type: 'button' as const, + tabindex: -1, + disabled: this.isDisabled || undefined, + 'aria-label': + resolveSomaTranslationPath('soma.number-field.decrement', this.provider.config.translator.current, 'Decrement'), + 'aria-disabled': boolToStr(this.isDisabled), + 'data-disabled': boolToEmptyStrOrUndef(this.isDisabled), + onclick: this.handleClick, + } as const), + ); +} + +// ── Scrubber ───────────────────────────────────────────────────────────────── + +interface NumberFieldScrubberOpts + extends WithRefOpts, + ActiveProps<{ + direction: 'horizontal' | 'vertical'; + sensitivity: number; + }> {} + +export class NumberFieldScrubberProvider extends Provider { + static from(opts: NumberFieldScrubberOpts) { + return new NumberFieldScrubberProvider(opts); + } + + readonly provider: NumberFieldProvider; + private startX = 0; + private startY = 0; + private startValue = 0; + + private constructor(opts: NumberFieldScrubberOpts) { + super(opts, 'NumberField', 'scrubber', attrs.scrubber); + this.provider = NumberFieldProvider.ctx.get(); + } + + private get isDisabled(): boolean { + return this.provider.isDisabled || this.provider.isReadonly; + } + + readonly onpointerdown = (e: PointerEvent) => { + if (this.isDisabled || e.button !== 0) return; + e.preventDefault(); + + this.provider.scrubbing = true; + this.startX = e.clientX; + this.startY = e.clientY; + this.startValue = this.provider.opts.value.current ?? 0; + + (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId); + }; + + readonly onpointermove = (e: PointerEvent) => { + if (!this.provider.scrubbing) return; + e.preventDefault(); + + const sensitivity = this.opts.sensitivity.current; + const step = this.provider.step; + const isHorizontal = this.opts.direction.current === 'horizontal'; + + const delta = isHorizontal + ? e.clientX - this.startX + : -(e.clientY - this.startY); + + const steps = Math.round(delta / sensitivity); + const newValue = this.startValue + steps * step; + this.provider.commit(newValue); + }; + + readonly onpointerup = () => { + if (!this.provider.scrubbing) return; + this.provider.scrubbing = false; + }; + + readonly onlostpointercapture = () => { + if (this.provider.scrubbing) { + this.provider.scrubbing = false; + } + }; + + readonly props = $derived.by(() => + this.assertProps({ + ...this.baseProps, + 'data-scrubbing': boolToEmptyStrOrUndef(this.provider.scrubbing), + 'data-disabled': boolToEmptyStrOrUndef(this.isDisabled), + style: { + cursor: this.isDisabled + ? 'default' + : this.opts.direction.current === 'horizontal' + ? 'ew-resize' + : 'ns-resize', + 'user-select': this.provider.scrubbing ? 'none' : undefined, + 'touch-action': 'none', + }, + onpointerdown: this.onpointerdown, + onpointermove: this.onpointermove, + onpointerup: this.onpointerup, + onlostpointercapture: this.onlostpointercapture, + } as const), + ); +} diff --git a/src/uix/soma/components/number-field/types.ts b/src/uix/soma/components/number-field/types.ts new file mode 100644 index 000000000..a159dc282 --- /dev/null +++ b/src/uix/soma/components/number-field/types.ts @@ -0,0 +1,75 @@ +import type { WithChild, Without, OnChangeFn, Direction } from '$soma/types'; +import type { PrimitiveDivAttributes, PrimitiveButtonAttributes, PrimitiveInputAttributes } from '$soma/types'; +import type { NumrFormat } from './number-field-provider.svelte'; + +export type NumberFieldProps = WithChild<{ + /** Unique identifier. Auto-generated if omitted. */ + id?: string; + /** Current numeric value. Bindable. @default undefined */ + value?: number; + /** + * Number format definition (style, currency, unit, decimals, grouping, etc.). + * Uses NumrFormat from glob. Determines display formatting and edit parsing. + * @see NumrFormat + */ + formatOptions?: NumrFormat; + /** Minimum allowed value. */ + min?: number; + /** Maximum allowed value. */ + max?: number; + /** Increment/decrement amount. @default 1 */ + step?: number; + /** Large step for Shift+Arrow or PageUp/PageDown. @default step * 10 */ + largeStep?: number; + /** BCP 47 locale. Resolved via: prop → Soma.format.locale → 'en'. */ + locale?: string; + /** Text direction. Resolved via: prop → Soma.dir → 'ltr'. */ + dir?: Direction; + /** Allow mouse wheel to increment/decrement when focused. @default false */ + allowMouseWheel?: boolean; + /** Clamp value to min/max on blur. @default true */ + clampOnBlur?: boolean; + /** Disables all interaction. @default false */ + disabled?: boolean; + /** Prevents value changes but keeps focusable. @default false */ + readonly?: boolean; + /** Marks as required for form validation. @default false */ + required?: boolean; + /** Marks as invalid for form validation. @default false */ + invalid?: boolean; + /** Form submission field name. */ + name?: string; + /** Callback fired when value changes. */ + onValueChange?: OnChangeFn; + /** Callback fired when value is committed (on blur or Enter). */ + onValueCommit?: OnChangeFn; +}> & + Without; + +export type NumberFieldInputProps = WithChild<{ + /** Unique identifier. Auto-generated if omitted. */ + id?: string; +}> & + Without; + +export type NumberFieldIncrementTriggerProps = WithChild<{ + /** Unique identifier. Auto-generated if omitted. */ + id?: string; +}> & + Without; + +export type NumberFieldDecrementTriggerProps = WithChild<{ + /** Unique identifier. Auto-generated if omitted. */ + id?: string; +}> & + Without; + +export type NumberFieldScrubberProps = WithChild<{ + /** Unique identifier. Auto-generated if omitted. */ + id?: string; + /** Drag direction. @default 'horizontal' */ + direction?: 'horizontal' | 'vertical'; + /** Pixels per step during scrub. @default 5 */ + sensitivity?: number; +}> & + Without; diff --git a/src/uix/soma/components/pagination/components/pagination.svelte b/src/uix/soma/components/pagination/components/pagination.svelte index 5752ff8c3..bb7ec2efa 100644 --- a/src/uix/soma/components/pagination/components/pagination.svelte +++ b/src/uix/soma/components/pagination/components/pagination.svelte @@ -31,14 +31,16 @@ ), page: writableActive( () => page, - (v) => (page = v), + (v) => { + page = v; + onPageChange(v); + }, ), count: readableActive(() => count), pageSize: readableActive(() => pageSize), siblingCount: readableActive(() => siblingCount), boundaryCount: readableActive(() => boundaryCount), disabled: readableActive(() => disabled), - onPageChange: readableActive(() => onPageChange), }); const mergedProps = $derived(mergeProps(restProps, state.props)); diff --git a/src/uix/soma/components/pagination/pagination-provider.svelte.ts b/src/uix/soma/components/pagination/pagination-provider.svelte.ts index b674c367a..f51f50cba 100644 --- a/src/uix/soma/components/pagination/pagination-provider.svelte.ts +++ b/src/uix/soma/components/pagination/pagination-provider.svelte.ts @@ -1,8 +1,9 @@ import { Provider, context, type WithRefOpts } from '$soma/provider'; import { createAttrs, boolToEmptyStrOrUndef } from '$soma/attrs'; import { type Active, type ActiveProps, type StateProps } from '$soma/reactive'; -import type { OnChangeFn, SomaMouseEvent } from '$soma/types'; -import { Soma } from '$soma/core/soma.svelte'; +import type { SomaMouseEvent } from '$soma/types'; +import { getSoma } from '$soma/core/soma.svelte'; +import { resolveSomaTranslationPath } from '$soma/core/translator.svelte'; const attrs = createAttrs({ component: 'pagination', @@ -102,7 +103,6 @@ interface PaginationOpts siblingCount: number; boundaryCount: number; disabled: boolean; - onPageChange: OnChangeFn; }> {} export class PaginationProvider extends Provider { @@ -112,11 +112,11 @@ export class PaginationProvider extends Provider { return new PaginationProvider(opts); } - readonly soma: Soma | undefined; + readonly config = getSoma(); private constructor(opts: PaginationOpts) { super(opts, 'Pagination', 'root', attrs.root, PaginationProvider.ctx); - this.soma = Soma.getOr(); + } readonly totalPages = $derived.by(() => { @@ -152,7 +152,6 @@ export class PaginationProvider extends Provider { if (page < 1 || page > this.totalPages) return; if (page === this.opts.page.current) return; this.opts.page.current = page; - this.opts.onPageChange.current(page); } goToPrevPage() { @@ -182,7 +181,7 @@ export class PaginationProvider extends Provider { ...this.baseProps, role: 'navigation' as const, 'aria-label': - this.soma?.translate('pagination.label', 'Pagination') ?? 'Pagination', + resolveSomaTranslationPath('soma.pagination.label', this.config.translator.current, 'Pagination'), 'data-disabled': boolToEmptyStrOrUndef(this.opts.disabled.current), } as const), ); @@ -201,20 +200,20 @@ export class PaginationPrevTriggerProvider extends Provider this.opts.disabled.current || this.root.opts.disabled.current || !this.root.hasPrevPage, + () => this.opts.disabled.current || this.provider.opts.disabled.current || !this.provider.hasPrevPage, ); readonly onclick = (_e: SomaMouseEvent) => { if (this.isDisabled) return; - this.root.goToPrevPage(); + this.provider.goToPrevPage(); }; readonly props = $derived.by(() => @@ -222,7 +221,7 @@ export class PaginationPrevTriggerProvider extends Provider this.opts.disabled.current || this.root.opts.disabled.current || !this.root.hasNextPage, + () => this.opts.disabled.current || this.provider.opts.disabled.current || !this.provider.hasNextPage, ); readonly onclick = (_e: SomaMouseEvent) => { if (this.isDisabled) return; - this.root.goToNextPage(); + this.provider.goToNextPage(); }; readonly props = $derived.by(() => @@ -264,7 +263,7 @@ export class PaginationNextTriggerProvider extends Provider { return new PaginationItemProvider(opts); } - readonly root: PaginationProvider; + readonly provider: PaginationProvider; private constructor(opts: PaginationItemOpts) { super(opts, 'Pagination', 'item', attrs.item); - this.root = PaginationProvider.ctx.get(); + this.provider = PaginationProvider.ctx.get(); } readonly isSelected = $derived.by( - () => this.root.opts.page.current === this.opts.value.current, + () => this.provider.opts.page.current === this.opts.value.current, ); - readonly isDisabled = $derived.by(() => this.root.opts.disabled.current); + readonly isDisabled = $derived.by(() => this.provider.opts.disabled.current); readonly onclick = (_e: SomaMouseEvent) => { if (this.isDisabled) return; - this.root.setPage(this.opts.value.current); + this.provider.setPage(this.opts.value.current); }; readonly props = $derived.by(() => diff --git a/src/uix/soma/components/popover/components/popover-content.svelte b/src/uix/soma/components/popover/components/popover-content.svelte index cdccedc9d..42d0e89b4 100644 --- a/src/uix/soma/components/popover/components/popover-content.svelte +++ b/src/uix/soma/components/popover/components/popover-content.svelte @@ -3,13 +3,13 @@ import { mergeProps } from '$soma/props'; import { styleToString } from '$soma/css'; import { createId } from '$soma/id'; - import { Soma } from '$soma/core/soma.svelte'; + import { getSoma } from '$soma/core/soma.svelte'; import { PopoverContentProvider } from '../popover-provider.svelte'; import type { PopoverContentProps } from '../types'; import { noop } from '$lib/util/funcs'; const uid = $props.id(); - const soma = Soma.getOr(); + const soma = getSoma(); let { ref = $bindable(null), @@ -40,7 +40,7 @@ interactOutsideBehavior, onFocusOutside = noop, onPlaced = noop, - dir = soma?.dir.current ?? 'ltr', + dir = soma.presentation.current?.dir ?? 'ltr', style = null, children, child, @@ -94,10 +94,10 @@ {#if state.isPresent || forceMount}
    {#if child} - {@render child({ open: state.root.opts.open.current, props: mergedProps })} + {@render child({ open: state.provider.opts.open.current, props: mergedProps })} {:else}
    - {@render children?.({ open: state.root.opts.open.current })} + {@render children?.({ open: state.provider.opts.open.current })}
    {/if}
    diff --git a/src/uix/soma/components/popover/components/popover.svelte b/src/uix/soma/components/popover/components/popover.svelte index cf2e9f53a..7bb220775 100644 --- a/src/uix/soma/components/popover/components/popover.svelte +++ b/src/uix/soma/components/popover/components/popover.svelte @@ -1,4 +1,4 @@ - diff --git a/src/uix/soma/components/select/select-provider.svelte.ts b/src/uix/soma/components/select/select-provider.svelte.ts index 13fadc0d1..926d051b7 100644 --- a/src/uix/soma/components/select/select-provider.svelte.ts +++ b/src/uix/soma/components/select/select-provider.svelte.ts @@ -3,7 +3,7 @@ import { createAttrs, boolToEmptyStrOrUndef, getDataOpenClosed } from '$soma/att import { readableActive, state, type Active, type ActiveProps, type StateProps } from '$soma/reactive'; import type { OnChangeFn, SomaKeyboardEvent, Direction, Arrayable, StyleProperties } from '$soma/types'; import { KEYS } from '$soma/keyboard'; -import { Soma } from '$soma/core/soma.svelte'; +import { getSoma } from '$soma/core/soma.svelte'; import { Presence } from '$soma/layers/presence.svelte'; import { Dismissal, type DismissalBehavior } from '$soma/layers/dismissal.svelte'; @@ -63,8 +63,6 @@ interface SelectOpts allowDeselect: boolean; scrollAlignment: ScrollAlignment; dir: Direction; - onValueChange: OnChangeFn; - onOpenChange: OnChangeFn; onOpenChangeComplete: OnChangeFn; }> {} @@ -75,7 +73,7 @@ export class SelectProvider extends Provider { return new SelectProvider(opts); } - readonly soma: Soma | undefined; + readonly config = getSoma(); readonly floatingProvider: FloatingProvider; readonly contentPresence: Presence; readonly typeahead = new Typeahead(); @@ -90,7 +88,7 @@ export class SelectProvider extends Provider { private constructor(opts: SelectOpts) { super(opts, 'Select', 'root', attrs.root, SelectProvider.ctx); - this.soma = Soma.getOr(); + this.floatingProvider = FloatingProvider.create(); this.contentPresence = new Presence({ @@ -126,13 +124,11 @@ export class SelectProvider extends Provider { } this.opts.value.current = next; - this.opts.onValueChange.current(next); } handleOpen() { if (this.opts.disabled.current) return; this.opts.open.current = true; - this.opts.onOpenChange.current(true); // Scroll selected item into view after content mounts requestAnimationFrame(() => { @@ -146,7 +142,6 @@ export class SelectProvider extends Provider { this.typeahead.reset(); this.highlightedId = ''; this.opts.open.current = false; - this.opts.onOpenChange.current(false); this.triggerRef.current?.focus(); } @@ -209,13 +204,13 @@ export class SelectTriggerProvider extends Provider { return new SelectTriggerProvider(opts); } - readonly root: SelectProvider; + readonly provider: SelectProvider; private constructor(opts: SelectTriggerOpts) { super(opts, 'Select', 'trigger', attrs.trigger); - this.root = SelectProvider.ctx.get(); - this.root.triggerId.current = opts.id.current; - this.root.triggerRef = opts.ref; + this.provider = SelectProvider.ctx.get(); + this.provider.triggerId.current = opts.id.current; + this.provider.triggerRef = opts.ref; FloatingAnchor.create({ id: opts.id, @@ -224,16 +219,16 @@ export class SelectTriggerProvider extends Provider { } readonly onclick = () => { - this.root.toggle(); + this.provider.toggle(); }; readonly onkeydown = (e: SomaKeyboardEvent) => { if (e.key === KEYS.ARROW_DOWN || e.key === KEYS.ARROW_UP) { e.preventDefault(); - this.root.handleOpen(); + this.provider.handleOpen(); } else if (e.key === KEYS.ENTER || e.key === KEYS.SPACE) { e.preventDefault(); - this.root.toggle(); + this.provider.toggle(); } }; @@ -243,14 +238,14 @@ export class SelectTriggerProvider extends Provider { type: 'button' as const, role: 'combobox' as const, 'aria-haspopup': 'listbox' as const, - 'aria-expanded': this.root.opts.open.current, - 'aria-controls': this.root.contentId.current || undefined, - 'aria-activedescendant': this.root.highlightedId || undefined, - 'aria-required': this.root.opts.required.current || undefined, - 'data-state': getDataOpenClosed(this.root.opts.open.current), - 'data-disabled': boolToEmptyStrOrUndef(this.root.opts.disabled.current), - 'data-placeholder': this.root.opts.value.current.length === 0 ? '' : undefined, - disabled: this.root.opts.disabled.current || undefined, + 'aria-expanded': this.provider.opts.open.current, + 'aria-controls': this.provider.contentId.current || undefined, + 'aria-activedescendant': this.provider.highlightedId || undefined, + 'aria-required': this.provider.opts.required.current || undefined, + 'data-state': getDataOpenClosed(this.provider.opts.open.current), + 'data-disabled': boolToEmptyStrOrUndef(this.provider.opts.disabled.current), + 'data-placeholder': this.provider.opts.value.current.length === 0 ? '' : undefined, + disabled: this.provider.opts.disabled.current || undefined, onclick: this.onclick, onkeydown: this.onkeydown, } as const), @@ -266,23 +261,23 @@ export class SelectValueProvider extends Provider { return new SelectValueProvider(opts); } - readonly root: SelectProvider; + readonly provider: SelectProvider; private constructor(opts: SelectValueOpts) { super(opts, 'Select', 'value', attrs.value); - this.root = SelectProvider.ctx.get(); + this.provider = SelectProvider.ctx.get(); } readonly displayText = $derived.by(() => { - const val = this.root.opts.value.current; + const val = this.provider.opts.value.current; if (val.length === 0) return this.opts.placeholder.current; - return this.root.getDisplayText(); + return this.provider.getDisplayText(); }); readonly props = $derived.by(() => this.assertProps({ ...this.baseProps, - 'data-placeholder': this.root.opts.value.current.length === 0 ? '' : undefined, + 'data-placeholder': this.provider.opts.value.current.length === 0 ? '' : undefined, } as const), ); } @@ -317,17 +312,17 @@ export class SelectContentProvider extends Provider { return new SelectContentProvider(opts); } - readonly root: SelectProvider; + readonly provider: SelectProvider; readonly floating: FloatingContent; readonly dismissal: Dismissal; readonly scrollLock: ScrollLock; private constructor(opts: SelectContentOpts) { super(opts, 'Select', 'content', attrs.content, undefined, (el) => { - this.root.setContentRef(el); + this.provider.setContentRef(el); }); - this.root = SelectProvider.ctx.get(); - this.root.contentId.current = opts.id.current; + this.provider = SelectProvider.ctx.get(); + this.provider.contentId.current = opts.id.current; // Floating this.floating = FloatingContent.create({ @@ -348,22 +343,22 @@ export class SelectContentProvider extends Provider { onPlaced: readableActive(() => () => {}), dir: opts.dir, style: opts.style, - enabled: readableActive(() => this.root.opts.open.current), + enabled: readableActive(() => this.provider.opts.open.current), customAnchor: readableActive(() => null), }); // Dismissal — always close on outside click this.dismissal = Dismissal.use({ ref: readableActive(() => opts.ref.current), - enabled: readableActive(() => this.root.opts.open.current), + enabled: readableActive(() => this.provider.opts.open.current), onEscapeKeydown: readableActive(() => (e: KeyboardEvent) => { opts.onEscapeKeydown.current(e); - if (!e.defaultPrevented) this.root.handleClose(); + if (!e.defaultPrevented) this.provider.handleClose(); }), escapeKeydownBehavior: opts.escapeKeydownBehavior, onInteractOutside: readableActive(() => (e: PointerEvent) => { opts.onInteractOutside.current(e); - if (!e.defaultPrevented) this.root.handleClose(); + if (!e.defaultPrevented) this.provider.handleClose(); }), interactOutsideBehavior: opts.interactOutsideBehavior, onFocusOutside: readableActive(() => () => {}), @@ -373,11 +368,11 @@ export class SelectContentProvider extends Provider { // Scroll lock this.scrollLock = new ScrollLock(); $effect(() => { - this.scrollLock.locked.current = this.root.opts.open.current && opts.preventScroll.current; + this.scrollLock.locked.current = this.provider.opts.open.current && opts.preventScroll.current; }); } - readonly isPresent = $derived.by(() => this.root.contentPresence.isPresent); + readonly isPresent = $derived.by(() => this.provider.contentPresence.isPresent); readonly wrapperProps = $derived.by(() => ({ ...this.floating.wrapperProps, @@ -391,10 +386,10 @@ export class SelectContentProvider extends Provider { const container = this.opts.ref.current; if (!container) return; - const items = this.root.getItems(container); + const items = this.provider.getItems(container); const active = document.activeElement as HTMLElement; const currentIndex = items.indexOf(active); - const loop = this.root.opts.loop.current; + const loop = this.provider.opts.loop.current; let targetIndex = -1; @@ -417,15 +412,15 @@ export class SelectContentProvider extends Provider { } else if (e.key === KEYS.TAB) { // Tab closes select (returns focus to trigger) e.preventDefault(); - this.root.handleClose(); + this.provider.handleClose(); return; } else { // Typeahead - const match = this.root.typeahead.handle(e.key, items); + const match = this.provider.typeahead.handle(e.key, items); if (match) { match.focus(); - match.scrollIntoView({ block: this.root.opts.scrollAlignment.current }); - this.root.highlightedId = match.id; + match.scrollIntoView({ block: this.provider.opts.scrollAlignment.current }); + this.provider.highlightedId = match.id; } return; } @@ -433,8 +428,8 @@ export class SelectContentProvider extends Provider { if (targetIndex >= 0 && items[targetIndex]) { const target = items[targetIndex]; target.focus(); - target.scrollIntoView({ block: this.root.opts.scrollAlignment.current }); - this.root.highlightedId = target.id; + target.scrollIntoView({ block: this.provider.opts.scrollAlignment.current }); + this.provider.highlightedId = target.id; } }; @@ -442,10 +437,10 @@ export class SelectContentProvider extends Provider { this.assertProps({ ...this.baseProps, role: 'listbox' as const, - 'aria-multiselectable': this.root.opts.type.current === 'multiple' || undefined, - 'data-state': getDataOpenClosed(this.root.opts.open.current), + 'aria-multiselectable': this.provider.opts.type.current === 'multiple' || undefined, + 'data-state': getDataOpenClosed(this.provider.opts.open.current), ...this.floating.props, - ...this.root.contentPresence.transitionAttrs, + ...this.provider.contentPresence.transitionAttrs, ...this.dismissal.props, tabindex: -1, onkeydown: this.onkeydown, @@ -489,27 +484,27 @@ export class SelectItemProvider extends Provider { return new SelectItemProvider(opts); } - readonly root: SelectProvider; + readonly provider: SelectProvider; private constructor(opts: SelectItemOpts) { super(opts, 'Select', 'item', attrs.item); - this.root = SelectProvider.ctx.get(); + this.provider = SelectProvider.ctx.get(); } readonly isSelected = $derived.by(() => - this.root.isSelected(this.opts.value.current), + this.provider.isSelected(this.opts.value.current), ); readonly onclick = () => { if (this.opts.disabled.current) return; - this.root.selectItem(this.opts.value.current); + this.provider.selectItem(this.opts.value.current); }; readonly onkeydown = (e: SomaKeyboardEvent) => { if (this.opts.disabled.current) return; if (e.key === KEYS.ENTER || e.key === KEYS.SPACE) { e.preventDefault(); - this.root.selectItem(this.opts.value.current); + this.provider.selectItem(this.opts.value.current); } }; diff --git a/src/uix/soma/components/slider/components/slider-thumb.svelte b/src/uix/soma/components/slider/components/slider-thumb.svelte index 93880d2f9..5db7ecbc5 100644 --- a/src/uix/soma/components/slider/components/slider-thumb.svelte +++ b/src/uix/soma/components/slider/components/slider-thumb.svelte @@ -30,7 +30,7 @@ {:else} {@render children?.()} - {#if state.root.opts.name.current} + {#if state.provider.opts.name.current} {/if} diff --git a/src/uix/soma/components/slider/components/slider.svelte b/src/uix/soma/components/slider/components/slider.svelte index 841331a37..3ebad61ea 100644 --- a/src/uix/soma/components/slider/components/slider.svelte +++ b/src/uix/soma/components/slider/components/slider.svelte @@ -2,13 +2,13 @@ import { readableActive, writableActive } from '$soma/reactive'; import { mergeProps } from '$soma/props'; import { createId } from '$soma/id'; - import { Soma } from '$soma/core/soma.svelte'; + import { getSoma } from '$soma/core/soma.svelte'; import { SliderProvider } from '../slider-provider.svelte'; import type { SliderProps } from '../types'; import { noop } from '$lib/util/funcs'; const uid = $props.id(); - const soma = Soma.getOr(); + const soma = getSoma(); let { ref = $bindable(null), @@ -22,7 +22,7 @@ step = 1, orientation = 'horizontal', disabled = false, - dir = soma?.dir.current ?? 'ltr', + dir = soma.presentation.current?.dir ?? 'ltr', name = '', children, child, @@ -33,8 +33,13 @@ id: readableActive(() => id), ref: writableActive(() => ref, (v) => (ref = v)), type: readableActive(() => type), - value: writableActive(() => value, (v) => (value = v)), - onValueChange: readableActive(() => onValueChange), + value: writableActive( + () => value, + (v) => { + value = v; + onValueChange(v); + }, + ), onValueCommit: readableActive(() => onValueCommit), min: readableActive(() => min), max: readableActive(() => max), diff --git a/src/uix/soma/components/slider/slider-provider.svelte.ts b/src/uix/soma/components/slider/slider-provider.svelte.ts index e5bf29e94..37f4789f1 100644 --- a/src/uix/soma/components/slider/slider-provider.svelte.ts +++ b/src/uix/soma/components/slider/slider-provider.svelte.ts @@ -42,7 +42,6 @@ interface SliderOpts disabled: boolean; dir: Direction; name: string; - onValueChange: OnChangeFn; onValueCommit: OnChangeFn; }> {} @@ -79,7 +78,6 @@ export class SliderProvider extends Provider { } this.opts.value.current = values; - this.opts.onValueChange.current(values); } commitValue() { @@ -174,20 +172,20 @@ export class SliderRangeProvider extends Provider { return new SliderRangeProvider(opts); } - readonly root: SliderProvider; + readonly provider: SliderProvider; private constructor(opts: SliderRangeOpts) { super(opts, 'Slider', 'range', attrs.range); - this.root = SliderProvider.ctx.get(); + this.provider = SliderProvider.ctx.get(); } readonly rangeStyle = $derived.by(() => { - const values = this.root.opts.value.current; - const isHorizontal = this.root.opts.orientation.current === 'horizontal'; + const values = this.provider.opts.value.current; + const isHorizontal = this.provider.opts.orientation.current === 'horizontal'; const min = Math.min(...values); const max = Math.max(...values); - const startPct = this.root.getPercent(values.length > 1 ? min : this.root.opts.min.current); - const endPct = this.root.getPercent(max); + const startPct = this.provider.getPercent(values.length > 1 ? min : this.provider.opts.min.current); + const endPct = this.provider.getPercent(max); if (isHorizontal) { return { left: `${startPct}%`, width: `${endPct - startPct}%` }; @@ -198,8 +196,8 @@ export class SliderRangeProvider extends Provider { readonly props = $derived.by(() => this.assertProps({ ...this.baseProps, - 'data-orientation': this.root.opts.orientation.current, - 'data-disabled': boolToEmptyStrOrUndef(this.root.opts.disabled.current), + 'data-orientation': this.provider.opts.orientation.current, + 'data-disabled': boolToEmptyStrOrUndef(this.provider.opts.disabled.current), style: { position: 'absolute', ...this.rangeStyle, @@ -217,28 +215,28 @@ export class SliderThumbProvider extends Provider { return new SliderThumbProvider(opts); } - readonly root: SliderProvider; + readonly provider: SliderProvider; private constructor(opts: SliderThumbOpts) { super(opts, 'Slider', 'thumb', attrs.thumb); - this.root = SliderProvider.ctx.get(); + this.provider = SliderProvider.ctx.get(); } readonly value = $derived.by(() => - this.root.opts.value.current[this.opts.index.current] ?? this.root.opts.min.current, + this.provider.opts.value.current[this.opts.index.current] ?? this.provider.opts.min.current, ); - readonly percent = $derived.by(() => this.root.getPercent(this.value)); + readonly percent = $derived.by(() => this.provider.getPercent(this.value)); readonly onkeydown = (e: KeyboardEvent) => { - if (this.root.opts.disabled.current) return; - const step = this.root.opts.step.current; + if (this.provider.opts.disabled.current) return; + const step = this.provider.opts.step.current; const bigStep = step * 10; const index = this.opts.index.current; let delta = 0; - const isHorizontal = this.root.opts.orientation.current === 'horizontal'; - const isRtl = this.root.opts.dir.current === 'rtl'; + const isHorizontal = this.provider.opts.orientation.current === 'horizontal'; + const isRtl = this.provider.opts.dir.current === 'rtl'; if (e.key === KEYS.ARROW_RIGHT || e.key === KEYS.ARROW_UP) { delta = (isHorizontal && isRtl) ? -step : step; @@ -249,26 +247,26 @@ export class SliderThumbProvider extends Provider { } else if (e.key === 'PageDown') { delta = -bigStep; } else if (e.key === KEYS.HOME) { - this.root.updateValue(index, this.root.opts.min.current); - this.root.commitValue(); + this.provider.updateValue(index, this.provider.opts.min.current); + this.provider.commitValue(); e.preventDefault(); return; } else if (e.key === KEYS.END) { - this.root.updateValue(index, this.root.opts.max.current); - this.root.commitValue(); + this.provider.updateValue(index, this.provider.opts.max.current); + this.provider.commitValue(); e.preventDefault(); return; } if (delta !== 0) { e.preventDefault(); - this.root.updateValue(index, this.value + delta); - this.root.commitValue(); + this.provider.updateValue(index, this.value + delta); + this.provider.commitValue(); } }; readonly thumbStyle = $derived.by(() => { - const isHorizontal = this.root.opts.orientation.current === 'horizontal'; + const isHorizontal = this.provider.opts.orientation.current === 'horizontal'; if (isHorizontal) return { left: `${this.percent}%`, top: '50%', transform: 'translate(-50%, -50%)' }; return { bottom: `${this.percent}%`, left: '50%', transform: 'translate(-50%, 50%)' }; }); @@ -277,14 +275,14 @@ export class SliderThumbProvider extends Provider { this.assertProps({ ...this.baseProps, role: 'slider' as const, - tabindex: this.root.opts.disabled.current ? undefined : 0, - 'aria-valuemin': this.root.opts.min.current, - 'aria-valuemax': this.root.opts.max.current, + tabindex: this.provider.opts.disabled.current ? undefined : 0, + 'aria-valuemin': this.provider.opts.min.current, + 'aria-valuemax': this.provider.opts.max.current, 'aria-valuenow': this.value, - 'aria-orientation': this.root.opts.orientation.current, - 'aria-disabled': this.root.opts.disabled.current || undefined, - 'data-orientation': this.root.opts.orientation.current, - 'data-disabled': boolToEmptyStrOrUndef(this.root.opts.disabled.current), + 'aria-orientation': this.provider.opts.orientation.current, + 'aria-disabled': this.provider.opts.disabled.current || undefined, + 'data-orientation': this.provider.opts.orientation.current, + 'data-disabled': boolToEmptyStrOrUndef(this.provider.opts.disabled.current), style: { position: 'absolute', ...this.thumbStyle }, onkeydown: this.onkeydown, } as const), @@ -292,11 +290,11 @@ export class SliderThumbProvider extends Provider { readonly inputProps = $derived.by(() => ({ type: 'hidden' as const, - name: this.root.opts.name.current - ? `${this.root.opts.name.current}${this.root.opts.type.current === 'multiple' ? `[${this.opts.index.current}]` : ''}` + name: this.provider.opts.name.current + ? `${this.provider.opts.name.current}${this.provider.opts.type.current === 'multiple' ? `[${this.opts.index.current}]` : ''}` : undefined, value: this.value, - disabled: this.root.opts.disabled.current || undefined, + disabled: this.provider.opts.disabled.current || undefined, })); } @@ -309,29 +307,29 @@ export class SliderTickProvider extends Provider { return new SliderTickProvider(opts); } - readonly root: SliderProvider; + readonly provider: SliderProvider; private constructor(opts: SliderTickOpts) { super(opts, 'Slider', 'tick', attrs.tick); - this.root = SliderProvider.ctx.get(); + this.provider = SliderProvider.ctx.get(); } readonly percent = $derived.by(() => - this.root.getPercent(this.opts.value.current), + this.provider.getPercent(this.opts.value.current), ); readonly isActive = $derived.by(() => { - const values = this.root.opts.value.current; + const values = this.provider.opts.value.current; const min = Math.min(...values); const max = Math.max(...values); return this.opts.value.current >= min && this.opts.value.current <= max; }); readonly props = $derived.by(() => { - const isHorizontal = this.root.opts.orientation.current === 'horizontal'; + const isHorizontal = this.provider.opts.orientation.current === 'horizontal'; return this.assertProps({ ...this.baseProps, - 'data-orientation': this.root.opts.orientation.current, + 'data-orientation': this.provider.opts.orientation.current, 'data-active': this.isActive ? '' : undefined, 'data-value': this.opts.value.current, style: { diff --git a/src/uix/soma/components/splitter/components/splitter.svelte b/src/uix/soma/components/splitter/components/splitter.svelte index 105f3736e..0092ea493 100644 --- a/src/uix/soma/components/splitter/components/splitter.svelte +++ b/src/uix/soma/components/splitter/components/splitter.svelte @@ -2,20 +2,20 @@ import { readableActive, writableActive } from '$soma/reactive'; import { mergeProps } from '$soma/props'; import { createId } from '$soma/id'; - import { Soma } from '$soma/core/soma.svelte'; + import { getSoma } from '$soma/core/soma.svelte'; import { SplitterProvider } from '../splitter-provider.svelte'; import type { SplitterProps } from '../types'; import { noop } from '$lib/util/funcs'; const uid = $props.id(); - const soma = Soma.getOr(); + const soma = getSoma(); let { ref = $bindable(null), id = createId(uid, 'splitter'), orientation = 'horizontal', disabled = false, - dir = soma?.dir.current ?? 'ltr', + dir = soma.presentation.current?.dir ?? 'ltr', keyboardStep = 1, onResize = noop, onResizeEnd = noop, diff --git a/src/uix/soma/components/splitter/splitter-provider.svelte.ts b/src/uix/soma/components/splitter/splitter-provider.svelte.ts index 55a4b7519..48a4cea99 100644 --- a/src/uix/soma/components/splitter/splitter-provider.svelte.ts +++ b/src/uix/soma/components/splitter/splitter-provider.svelte.ts @@ -3,7 +3,7 @@ import { createAttrs, boolToEmptyStrOrUndef } from '$soma/attrs'; import { state, type Active, type ActiveProps, type StateProps } from '$soma/reactive'; import type { OnChangeFn, Orientation, Direction, SomaKeyboardEvent } from '$soma/types'; import { KEYS, getDirectionalKeys } from '$soma/keyboard'; -import { Soma } from '$soma/core/soma.svelte'; +import { getSoma } from '$soma/core/soma.svelte'; const attrs = createAttrs({ component: 'splitter', @@ -60,12 +60,12 @@ export class SplitterProvider extends Provider { return new SplitterProvider(opts); } - readonly soma: Soma | undefined; + readonly config = getSoma(); private panels: PanelState[] = $state([]); private constructor(opts: SplitterOpts) { super(opts, 'Splitter', 'root', attrs.root, SplitterProvider.ctx); - this.soma = Soma.getOr(); + } // ── Panel registration ─────────────────────────────────────────────────── @@ -252,14 +252,14 @@ export class SplitterPanelProvider extends Provider { return new SplitterPanelProvider(opts); } - readonly root: SplitterProvider; + readonly provider: SplitterProvider; private cleanup: (() => void) | undefined; private constructor(opts: SplitterPanelOpts) { super(opts, 'Splitter', 'panel', attrs.panel); - this.root = SplitterProvider.ctx.get(); + this.provider = SplitterProvider.ctx.get(); - this.cleanup = this.root.registerPanel({ + this.cleanup = this.provider.registerPanel({ id: opts.panelId.current, defaultSize: opts.defaultSize.current, minSize: opts.minSize.current, @@ -270,11 +270,11 @@ export class SplitterPanelProvider extends Provider { } readonly size = $derived.by( - () => this.root.getPanelSize(this.opts.panelId.current), + () => this.provider.getPanelSize(this.opts.panelId.current), ); readonly isCollapsed = $derived.by( - () => this.root.isPanelCollapsed(this.opts.panelId.current), + () => this.provider.isPanelCollapsed(this.opts.panelId.current), ); readonly props = $derived.by(() => @@ -285,12 +285,12 @@ export class SplitterPanelProvider extends Provider { 'flex-grow': this.size, 'flex-shrink': 0, overflow: 'hidden', - 'min-width': this.root.opts.orientation.current === 'horizontal' ? '0px' : undefined, - 'min-height': this.root.opts.orientation.current === 'vertical' ? '0px' : undefined, + 'min-width': this.provider.opts.orientation.current === 'horizontal' ? '0px' : undefined, + 'min-height': this.provider.opts.orientation.current === 'vertical' ? '0px' : undefined, }, 'data-panel-id': this.opts.panelId.current, 'data-state': this.isCollapsed ? 'collapsed' : 'expanded', - 'data-orientation': this.root.opts.orientation.current, + 'data-orientation': this.provider.opts.orientation.current, } as const), ); } @@ -310,7 +310,7 @@ export class SplitterResizeTriggerProvider extends Provider { if (!this.dragging) return; this.dragging = false; - this.root.notifyResizeEnd(); + this.provider.notifyResizeEnd(); }; readonly onlostpointercapture = () => { if (this.dragging) { this.dragging = false; - this.root.notifyResizeEnd(); + this.provider.notifyResizeEnd(); } }; @@ -419,9 +419,9 @@ export class SplitterResizeTriggerProvider extends Provider { if (this.isDisabled) return; // Double-click toggles collapse on the panel before the trigger - const panelBefore = this.root.getPanelState(this.panelBeforeId); + const panelBefore = this.provider.getPanelState(this.panelBeforeId); if (panelBefore?.config.collapsible) { - this.root.toggleCollapse(this.panelBeforeId); + this.provider.toggleCollapse(this.panelBeforeId); } }; @@ -430,45 +430,45 @@ export class SplitterResizeTriggerProvider extends Provider) => { if (this.isDisabled) return; - const orientation = this.root.opts.orientation.current; - const dir = this.root.opts.dir.current; + const orientation = this.provider.opts.orientation.current; + const dir = this.provider.opts.dir.current; const { nextKey, prevKey } = getDirectionalKeys(dir, orientation); - const step = this.root.opts.keyboardStep.current; + const step = this.provider.opts.keyboardStep.current; if (e.key === nextKey) { e.preventDefault(); - this.root.resizePanels(this.panelBeforeId, this.panelAfterId, step); - this.root.notifyResizeEnd(); + this.provider.resizePanels(this.panelBeforeId, this.panelAfterId, step); + this.provider.notifyResizeEnd(); } else if (e.key === prevKey) { e.preventDefault(); - this.root.resizePanels(this.panelBeforeId, this.panelAfterId, -step); - this.root.notifyResizeEnd(); + this.provider.resizePanels(this.panelBeforeId, this.panelAfterId, -step); + this.provider.notifyResizeEnd(); } else if (e.key === KEYS.HOME) { e.preventDefault(); // Minimize panel before - const panelA = this.root.getPanelState(this.panelBeforeId); + const panelA = this.provider.getPanelState(this.panelBeforeId); if (panelA) { const min = panelA.config.minSize ?? 0; const delta = min - panelA.size; - this.root.resizePanels(this.panelBeforeId, this.panelAfterId, delta); - this.root.notifyResizeEnd(); + this.provider.resizePanels(this.panelBeforeId, this.panelAfterId, delta); + this.provider.notifyResizeEnd(); } } else if (e.key === KEYS.END) { e.preventDefault(); // Maximize panel before - const panelA = this.root.getPanelState(this.panelBeforeId); + const panelA = this.provider.getPanelState(this.panelBeforeId); if (panelA) { const max = panelA.config.maxSize ?? 100; const delta = max - panelA.size; - this.root.resizePanels(this.panelBeforeId, this.panelAfterId, delta); - this.root.notifyResizeEnd(); + this.provider.resizePanels(this.panelBeforeId, this.panelAfterId, delta); + this.provider.notifyResizeEnd(); } } else if (e.key === KEYS.ENTER) { e.preventDefault(); // Toggle collapse on panel before - const panelBefore = this.root.getPanelState(this.panelBeforeId); + const panelBefore = this.provider.getPanelState(this.panelBeforeId); if (panelBefore?.config.collapsible) { - this.root.toggleCollapse(this.panelBeforeId); + this.provider.toggleCollapse(this.panelBeforeId); } } }; @@ -485,13 +485,13 @@ export class SplitterResizeTriggerProvider extends Provider value, - (v) => (value = v), + (v) => { + value = v; + onValueChange(v); + }, ), - onValueChange: readableActive(() => onValueChange), orientation: readableActive(() => orientation), dir: readableActive(() => dir), linear: readableActive(() => linear), diff --git a/src/uix/soma/components/stepper/stepper-provider.svelte.ts b/src/uix/soma/components/stepper/stepper-provider.svelte.ts index 4c9a274f6..56bd609f7 100644 --- a/src/uix/soma/components/stepper/stepper-provider.svelte.ts +++ b/src/uix/soma/components/stepper/stepper-provider.svelte.ts @@ -1,9 +1,9 @@ import { Provider, context, type WithRefOpts } from '$soma/provider'; import { createAttrs, boolToEmptyStrOrUndef } from '$soma/attrs'; import { state, type Active, type ActiveProps, type StateProps } from '$soma/reactive'; -import type { OnChangeFn, Orientation, Direction, SomaKeyboardEvent, SomaMouseEvent } from '$soma/types'; +import type { Orientation, Direction, SomaKeyboardEvent, SomaMouseEvent } from '$soma/types'; import { KEYS, getDirectionalKeys } from '$soma/keyboard'; -import { Soma } from '$soma/core/soma.svelte'; +import { getSoma } from '$soma/core/soma.svelte'; const attrs = createAttrs({ component: 'stepper', @@ -32,7 +32,6 @@ interface StepperOpts orientation: Orientation; dir: Direction; linear: boolean; - onValueChange: OnChangeFn; }> {} export class StepperProvider extends Provider { @@ -42,12 +41,12 @@ export class StepperProvider extends Provider { return new StepperProvider(opts); } - readonly soma: Soma | undefined; + readonly config = getSoma(); count = $state(0); private constructor(opts: StepperOpts) { super(opts, 'Stepper', 'root', attrs.root, StepperProvider.ctx); - this.soma = Soma.getOr(); + } get step(): number { @@ -67,7 +66,6 @@ export class StepperProvider extends Provider { setStep(step: number) { if (step < 0 || step > this.count) return; this.opts.value.current = step; - this.opts.onValueChange.current(step); } goToNextStep() { @@ -117,19 +115,19 @@ export class StepperListProvider extends Provider { return new StepperListProvider(opts); } - readonly root: StepperProvider; + readonly provider: StepperProvider; private constructor(opts: StepperListOpts) { super(opts, 'Stepper', 'list', attrs.list); - this.root = StepperProvider.ctx.get(); + this.provider = StepperProvider.ctx.get(); } readonly props = $derived.by(() => this.assertProps({ ...this.baseProps, role: 'tablist' as const, - 'aria-orientation': this.root.opts.orientation.current, - 'data-orientation': this.root.opts.orientation.current, + 'aria-orientation': this.provider.opts.orientation.current, + 'data-orientation': this.provider.opts.orientation.current, } as const), ); } @@ -149,23 +147,23 @@ export class StepperItemProvider extends Provider { return new StepperItemProvider(opts); } - readonly root: StepperProvider; + readonly provider: StepperProvider; private constructor(opts: StepperItemOpts) { super(opts, 'Stepper', 'item', attrs.item, StepperItemProvider.ctx); - this.root = StepperProvider.ctx.get(); + this.provider = StepperProvider.ctx.get(); // Track count based on highest index seen $effect(() => { const idx = this.opts.index.current; - if (idx + 1 > this.root.count) { - this.root.count = idx + 1; + if (idx + 1 > this.provider.count) { + this.provider.count = idx + 1; } }); } readonly stepState = $derived.by( - () => this.root.getStepState(this.opts.index.current), + () => this.provider.getStepState(this.opts.index.current), ); readonly isCurrent = $derived.by(() => this.stepState === 'current'); @@ -176,7 +174,7 @@ export class StepperItemProvider extends Provider { this.assertProps({ ...this.baseProps, 'data-state': this.stepState, - 'data-orientation': this.root.opts.orientation.current, + 'data-orientation': this.provider.opts.orientation.current, 'data-current': boolToEmptyStrOrUndef(this.isCurrent), 'data-complete': boolToEmptyStrOrUndef(this.isComplete), 'data-incomplete': boolToEmptyStrOrUndef(this.isIncomplete), @@ -197,12 +195,12 @@ export class StepperTriggerProvider extends Provider { return new StepperTriggerProvider(opts); } - readonly root: StepperProvider; + readonly provider: StepperProvider; readonly item: StepperItemProvider; private constructor(opts: StepperTriggerOpts) { super(opts, 'Stepper', 'trigger', attrs.trigger); - this.root = StepperProvider.ctx.get(); + this.provider = StepperProvider.ctx.get(); this.item = StepperItemProvider.ctx.get(); } @@ -212,21 +210,21 @@ export class StepperTriggerProvider extends Provider { readonly isDisabled = $derived.by(() => { if (this.opts.disabled.current) return true; - return !this.root.canSelectStep(this.index); + return !this.provider.canSelectStep(this.index); }); readonly onclick = (_e: SomaMouseEvent) => { if (this.isDisabled) return; - this.root.setStep(this.index); + this.provider.setStep(this.index); }; readonly onkeydown = (e: SomaKeyboardEvent) => { if (this.isDisabled) return; - const orientation = this.root.opts.orientation.current; - const dir = this.root.opts.dir.current; + const orientation = this.provider.opts.orientation.current; + const dir = this.provider.opts.dir.current; const { nextKey, prevKey } = getDirectionalKeys(dir, orientation); - const triggers = this.root.getTriggers(); + const triggers = this.provider.getTriggers(); const currentIndex = triggers.indexOf(e.currentTarget as HTMLElement); let targetIndex = -1; @@ -262,7 +260,7 @@ export class StepperTriggerProvider extends Provider { 'data-current': boolToEmptyStrOrUndef(this.item.isCurrent), 'data-complete': boolToEmptyStrOrUndef(this.item.isComplete), 'data-incomplete': boolToEmptyStrOrUndef(this.item.isIncomplete), - 'data-orientation': this.root.opts.orientation.current, + 'data-orientation': this.provider.opts.orientation.current, onclick: this.onclick, onkeydown: this.onkeydown, } as const), @@ -307,12 +305,12 @@ export class StepperSeparatorProvider extends Provider { } readonly item: StepperItemProvider; - readonly root: StepperProvider; + readonly provider: StepperProvider; private constructor(opts: StepperSeparatorOpts) { super(opts, 'Stepper', 'separator', attrs.separator); this.item = StepperItemProvider.ctx.get(); - this.root = StepperProvider.ctx.get(); + this.provider = StepperProvider.ctx.get(); } readonly props = $derived.by(() => @@ -321,7 +319,7 @@ export class StepperSeparatorProvider extends Provider { role: 'separator' as const, 'data-state': this.item.stepState, 'data-complete': boolToEmptyStrOrUndef(this.item.isComplete), - 'data-orientation': this.root.opts.orientation.current, + 'data-orientation': this.provider.opts.orientation.current, } as const), ); } @@ -339,19 +337,19 @@ export class StepperContentProvider extends Provider { return new StepperContentProvider(opts); } - readonly root: StepperProvider; + readonly provider: StepperProvider; private constructor(opts: StepperContentOpts) { super(opts, 'Stepper', 'content', attrs.content); - this.root = StepperProvider.ctx.get(); + this.provider = StepperProvider.ctx.get(); } readonly isCurrent = $derived.by( - () => this.root.step === this.opts.index.current, + () => this.provider.step === this.opts.index.current, ); readonly stepState = $derived.by( - () => this.root.getStepState(this.opts.index.current), + () => this.provider.getStepState(this.opts.index.current), ); readonly props = $derived.by(() => @@ -372,11 +370,11 @@ export class StepperCompletedContentProvider extends Provider @@ -399,20 +397,20 @@ export class StepperPrevTriggerProvider extends Provider return new StepperPrevTriggerProvider(opts); } - readonly root: StepperProvider; + readonly provider: StepperProvider; private constructor(opts: StepperPrevTriggerOpts) { super(opts, 'Stepper', 'prev-trigger', attrs['prev-trigger']); - this.root = StepperProvider.ctx.get(); + this.provider = StepperProvider.ctx.get(); } readonly isDisabled = $derived.by( - () => this.opts.disabled.current || !this.root.hasPrevStep, + () => this.opts.disabled.current || !this.provider.hasPrevStep, ); readonly onclick = (_e: SomaMouseEvent) => { if (this.isDisabled) return; - this.root.goToPrevStep(); + this.provider.goToPrevStep(); }; readonly props = $derived.by(() => @@ -439,20 +437,20 @@ export class StepperNextTriggerProvider extends Provider return new StepperNextTriggerProvider(opts); } - readonly root: StepperProvider; + readonly provider: StepperProvider; private constructor(opts: StepperNextTriggerOpts) { super(opts, 'Stepper', 'next-trigger', attrs['next-trigger']); - this.root = StepperProvider.ctx.get(); + this.provider = StepperProvider.ctx.get(); } readonly isDisabled = $derived.by( - () => this.opts.disabled.current || !this.root.hasNextStep, + () => this.opts.disabled.current || !this.provider.hasNextStep, ); readonly onclick = (_e: SomaMouseEvent) => { if (this.isDisabled) return; - this.root.goToNextStep(); + this.provider.goToNextStep(); }; readonly props = $derived.by(() => diff --git a/src/uix/soma/components/switch/components/switch.svelte b/src/uix/soma/components/switch/components/switch.svelte index f3bc71f09..82b04b1e6 100644 --- a/src/uix/soma/components/switch/components/switch.svelte +++ b/src/uix/soma/components/switch/components/switch.svelte @@ -25,8 +25,13 @@ const state = SwitchProvider.from({ id: readableActive(() => id), ref: writableActive(() => ref, (v) => (ref = v)), - checked: writableActive(() => checked, (v) => (checked = v)), - onCheckedChange: readableActive(() => onCheckedChange), + checked: writableActive( + () => checked, + (v) => { + checked = v; + onCheckedChange(v); + }, + ), disabled: readableActive(() => disabled), required: readableActive(() => required), name: readableActive(() => name), diff --git a/src/uix/soma/components/switch/switch-provider.svelte.ts b/src/uix/soma/components/switch/switch-provider.svelte.ts index 6fcb78148..3b77a11d3 100644 --- a/src/uix/soma/components/switch/switch-provider.svelte.ts +++ b/src/uix/soma/components/switch/switch-provider.svelte.ts @@ -1,7 +1,7 @@ import { Provider, context, type WithRefOpts } from '$soma/provider'; import { createAttrs, boolToEmptyStrOrUndef } from '$soma/attrs'; import { type ActiveProps, type StateProps } from '$soma/reactive'; -import type { OnChangeFn, SomaMouseEvent, SomaKeyboardEvent } from '$soma/types'; +import type { SomaMouseEvent, SomaKeyboardEvent } from '$soma/types'; import { KEYS } from '$soma/keyboard'; const attrs = createAttrs({ @@ -19,7 +19,6 @@ interface SwitchOpts required: boolean; name: string; value: string; - onCheckedChange: OnChangeFn; }> {} export class SwitchProvider extends Provider { @@ -35,9 +34,7 @@ export class SwitchProvider extends Provider { toggle() { if (this.opts.disabled.current) return; - const next = !this.opts.checked.current; - this.opts.checked.current = next; - this.opts.onCheckedChange.current(next); + this.opts.checked.current = !this.opts.checked.current; } readonly onclick = (_e: SomaMouseEvent) => { @@ -90,18 +87,18 @@ export class SwitchThumbProvider extends Provider { return new SwitchThumbProvider(opts); } - readonly root: SwitchProvider; + readonly provider: SwitchProvider; private constructor(opts: SwitchThumbOpts) { super(opts, 'Switch', 'thumb', attrs.thumb); - this.root = SwitchProvider.ctx.get(); + this.provider = SwitchProvider.ctx.get(); } readonly props = $derived.by(() => this.assertProps({ ...this.baseProps, - 'data-state': this.root.opts.checked.current ? 'checked' : 'unchecked', - 'data-disabled': boolToEmptyStrOrUndef(this.root.opts.disabled.current), + 'data-state': this.provider.opts.checked.current ? 'checked' : 'unchecked', + 'data-disabled': boolToEmptyStrOrUndef(this.provider.opts.disabled.current), } as const), ); } diff --git a/src/uix/soma/components/table/README.md b/src/uix/soma/components/table/README.md new file mode 100644 index 000000000..b5322cdf7 --- /dev/null +++ b/src/uix/soma/components/table/README.md @@ -0,0 +1,192 @@ +# Table + +Headless table with sorting, row selection, and pagination. Provides a reactive state manager (`createTable`) and Svelte components with ARIA grid pattern, keyboard support, and data-* attributes for styling. + +## Anatomy + +```svelte + + + + + + + {#each table.headers as header} + {header.label} + {/each} + + + + {#each table.rows as row (row.id)} + + {#each row.cells as cell, i} + {cell.value} + {/each} + + {/each} + +
    +
    +``` + +## Parts + +| Part | Element | Description | +|------|---------|-------------| +| `Provider` | none | Root context. Receives the table instance. No DOM. | +| `ColumnHeader` | `` | Column header. Click to sort. ARIA sort indicators. | +| `Row` | `` | Table row. Click to select. ARIA selected/rowindex. | +| `Cell` | `` | Table cell. ARIA colindex. | + +## State Manager (`createTable`) + +```ts +const table = createTable({ + data: () => dataArray, // reactive data source + columns: columnDefs, // column definitions + getRowId?: (row, idx) => id, // custom row ID (default: index) + + sorting?: { + enabled: true, + multi: false, // allow multi-column sort (Shift+click) + manual: false, // server-side sort (skip client sort) + }, + selection?: { + mode: 'none' | 'single' | 'multiple', + }, + pagination?: { + enabled: true, + manual: false, // server-side pagination + pageSize: 10, + }, + rowCount?: number, // total rows for server-side pagination + + // Callbacks + onSortingChange?: (sorting) => void, + onSelectionChange?: (selection) => void, + onPaginationChange?: (pagination) => void, +}); +``` + +## ARIA + +| Part | Attribute | Value | +|------|-----------|-------| +| Root (``) | `role` | `grid` (consumer adds) | +| Root | `aria-label` | Consumer provides | +| Root | `aria-rowcount` | Consumer provides if server-side | +| ColumnHeader | `role` | `columnheader` | +| ColumnHeader | `aria-sort` | `ascending` \| `descending` \| `none` | +| ColumnHeader | `aria-label` | Translated sort state | +| Row | `role` | `row` | +| Row | `aria-rowindex` | Row index (1-based) | +| Row | `aria-selected` | `true` \| `false` (when selection enabled) | +| Cell | `role` | `gridcell` | +| Cell | `aria-colindex` | Column index (1-based) | + +## Data Attributes + +| Part | Attribute | Values | +|------|-----------|--------| +| ColumnHeader | `data-table-column-header` | Always present | +| ColumnHeader | `data-sortable` | Present when sortable | +| ColumnHeader | `data-sorted` | `asc` \| `desc` (when sorted) | +| Row | `data-table-row` | Always present | +| Row | `data-selected` | Present when selected | +| Cell | `data-table-cell` | Always present | + +## Keyboard + +| Key | Action | +|-----|--------| +| `Enter` / `Space` on ColumnHeader | Toggle sort (Shift for multi-sort) | +| `Enter` / `Space` on Row | Toggle row selection | + +## Sorting + +- **Click** a header: replaces current sort with that column (asc → desc → none) +- **Shift+click** a header: adds column to multi-sort (when `multi: true`) +- **Manual mode**: set `manual: true`, handle `onSortingChange`, sort data externally + +## Selection + +- **None**: no row selection +- **Single**: one row at a time, click to select/deselect +- **Multiple**: any number, click to toggle, checkbox integration via `getIsRowSelected` / `toggleAllSelection` + +## Pagination + +- **Client-side**: `createTable` slices data internally +- **Server-side**: set `manual: true` + `rowCount`, load data per page externally + +## Usage + +### Sortable + Selectable + Paginated + +```svelte + +``` + +### Server-side pagination + +```svelte + +``` + +## Comparison with reference libraries + +| Feature | TanStack Table | React Aria | Soma Table | +|---------|---------------|------------|------------| +| Framework | Agnostic | React only | Svelte (soma) | +| Sorting (single) | Yes | Yes | Yes | +| Sorting (multi) | Yes | No | Yes (Shift+click) | +| Custom sort fn | Yes | No | Yes | +| Server-side sort | Yes | Manual | Yes (manual mode) | +| Selection none/single/multi | Yes | Yes | Yes | +| Select all / checkbox | Yes | Yes | Yes | +| Pagination (client) | Yes | No | Yes | +| Pagination (server) | Yes | No | Yes (manual mode) | +| ARIA grid pattern | No (manual) | Yes (auto) | Yes (auto) | +| Keyboard sort | No (manual) | Yes | Yes (Enter/Space) | +| Keyboard select | No (manual) | Yes | Yes (Enter/Space) | +| `aria-sort` on headers | No (manual) | Yes | Yes | +| `data-*` attributes | No | No | Yes | +| Svelte components | Via adapter | No | Native | +| Column filtering | Yes | No | Planned | +| Column visibility | Yes | No | Planned | +| Column resizing | Yes | Partial | Planned | +| Column pinning | Yes | No | Planned | +| Row expansion | Yes | No | Planned | +| Grouping / aggregation | Yes | No | Planned | +| Virtual scrolling | Via TanStack Virtual | No | Planned | diff --git a/src/uix/soma/components/table/components/table-cell.svelte b/src/uix/soma/components/table/components/table-cell.svelte new file mode 100644 index 000000000..4e47c95ea --- /dev/null +++ b/src/uix/soma/components/table/components/table-cell.svelte @@ -0,0 +1,36 @@ + + +{#if child} + {@render child({ props: mergedProps })} +{:else} + +{/if} diff --git a/src/uix/soma/components/table/components/table-column-header.svelte b/src/uix/soma/components/table/components/table-column-header.svelte new file mode 100644 index 000000000..4b55abb6c --- /dev/null +++ b/src/uix/soma/components/table/components/table-column-header.svelte @@ -0,0 +1,34 @@ + + +{#if child} + {@render child({ props: mergedProps })} +{:else} + +{/if} diff --git a/src/uix/soma/components/table/components/table-row.svelte b/src/uix/soma/components/table/components/table-row.svelte new file mode 100644 index 000000000..87038bf9e --- /dev/null +++ b/src/uix/soma/components/table/components/table-row.svelte @@ -0,0 +1,34 @@ + + +{#if child} + {@render child({ props: mergedProps })} +{:else} + + {@render children?.()} + +{/if} diff --git a/src/uix/soma/components/table/components/table.svelte b/src/uix/soma/components/table/components/table.svelte new file mode 100644 index 000000000..6a6def4cb --- /dev/null +++ b/src/uix/soma/components/table/components/table.svelte @@ -0,0 +1,22 @@ + + +{@render children?.()} diff --git a/src/uix/soma/components/table/exports.ts b/src/uix/soma/components/table/exports.ts new file mode 100644 index 000000000..7abc70581 --- /dev/null +++ b/src/uix/soma/components/table/exports.ts @@ -0,0 +1,34 @@ +export { default as Provider } from './components/table.svelte'; +export { default as ColumnHeader } from './components/table-column-header.svelte'; +export { default as Row } from './components/table-row.svelte'; +export { default as Cell } from './components/table-cell.svelte'; + +export { createTable, filterFns } from './table-core.svelte'; +export type { BuiltInFilterFn } from './table-core.svelte'; + +export type { + ColumnDef, + SortingEntry, + SortingState, + PaginationState, + SelectionMode, + RowSelectionState, + ColumnVisibilityState, + ColumnPinningState, + ColumnSizingState, + ExpandedState, + ColumnFilterEntry, + ColumnFiltersState, + TableConfig, + TableInstance, + TableHeader, + TableRow, + TableCell, +} from './table-core.svelte'; + +export type { + TableProviderProps as ProviderProps, + TableColumnHeaderProps as ColumnHeaderProps, + TableRowProps as RowProps, + TableCellProps as CellProps, +} from './types'; diff --git a/src/uix/soma/components/table/index.ts b/src/uix/soma/components/table/index.ts new file mode 100644 index 000000000..8570a426a --- /dev/null +++ b/src/uix/soma/components/table/index.ts @@ -0,0 +1 @@ +export * from './exports'; diff --git a/src/uix/soma/components/table/table-core.svelte.ts b/src/uix/soma/components/table/table-core.svelte.ts new file mode 100644 index 000000000..f0dff6b02 --- /dev/null +++ b/src/uix/soma/components/table/table-core.svelte.ts @@ -0,0 +1,699 @@ + +import { Provider, context, type WithRefOpts, type ProviderOpts } from '$soma/provider'; +import { createAttrs, boolToEmptyStrOrUndef } from '$soma/attrs'; +import { state, readableActive, type Active, type ActiveProps, type StateProps } from '$soma/reactive'; +import type { OnChangeFn, SomaKeyboardEvent } from '$soma/types'; +import { KEYS } from '$soma/keyboard'; +import { Soma } from '$soma/core/soma.svelte'; + +const attrs = createAttrs({ + component: 'table', + parts: ['root', 'header', 'body', 'footer', 'column-header', 'row', 'cell'] as const, +}); + +// ── Column definition ──────────────────────────────────────────────────────── + +export interface ColumnDef { + /** Unique column identifier. Derived from accessorKey if omitted. */ + id?: string; + /** Key in data object to access cell value. */ + accessorKey?: string; + /** Function to access cell value from row data. */ + accessorFn?: (row: TData, index: number) => any; + + /** Header label or render function. */ + header?: string; + /** Footer label. */ + footer?: string; + + /** Enable sorting for this column. @default false */ + enableSorting?: boolean; + /** Custom sort comparator. Receives two cell values. */ + sortingFn?: (a: any, b: any) => number; + /** Sort descending first when toggling. @default false */ + sortDescFirst?: boolean; + + /** Enable filtering for this column. @default false */ + enableFiltering?: boolean; + /** Custom filter function. */ + filterFn?: (row: TData, columnId: string, filterValue: any) => boolean; + + /** Enable hiding for this column. @default true */ + enableHiding?: boolean; + /** Enable resizing for this column. @default false */ + enableResizing?: boolean; + /** Enable pinning for this column. @default false */ + enablePinning?: boolean; + + /** Initial column width in px. */ + size?: number; + /** Minimum column width. @default 40 */ + minSize?: number; + /** Maximum column width. */ + maxSize?: number; +} + +// ── Sort state ─────────────────────────────────────────────────────────────── + +export interface SortingEntry { + /** Column ID. */ + id: string; + /** Sort descending. */ + desc: boolean; +} + +export type SortingState = SortingEntry[]; + +// ── Pagination state ───────────────────────────────────────────────────────── + +export interface PaginationState { + pageIndex: number; + pageSize: number; +} + +// ── Selection state ────────────────────────────────────────────────────────── + +export type SelectionMode = 'none' | 'single' | 'multiple'; +export type RowSelectionState = Record; + +// ── Column visibility ──────────────────────────────────────────────────────── + +export type ColumnVisibilityState = Record; + +// ── Column pinning ─────────────────────────────────────────────────────────── + +export interface ColumnPinningState { + left?: string[]; + right?: string[]; +} + +// ── Column sizing ──────────────────────────────────────────────────────────── + +export type ColumnSizingState = Record; + +// ── Expansion ──────────────────────────────────────────────────────────────── + +export type ExpandedState = Record; + +// ── Filter state ───────────────────────────────────────────────────────────── + +export interface ColumnFilterEntry { + id: string; + value: any; +} + +export type ColumnFiltersState = ColumnFilterEntry[]; + +// ── Resolved column (internal) ─────────────────────────────────────────────── + +export interface ResolvedColumn { + id: string; + def: ColumnDef; + getvalue(row: TData): any; +} + +function resolveColumns(defs: ColumnDef[]): ResolvedColumn[] { + return defs.map((def, idx) => { + const id = def.id ?? def.accessorKey ?? `col_${idx}`; + const getvalue = def.accessorFn + ? (row: TData) => def.accessorFn!(row, 0) + : def.accessorKey + ? (row: TData) => (row as any)[def.accessorKey!] + : () => undefined; + return { id, def, getvalue }; + }); +} + +// ── Sort logic ─────────────────────────────────────────────────────────────── + +function defaultSortFn(a: any, b: any): number { + if (a == null && b == null) return 0; + if (a == null) return -1; + if (b == null) return 1; + if (typeof a === 'string' && typeof b === 'string') return a.localeCompare(b); + if (typeof a === 'number' && typeof b === 'number') return a - b; + return String(a).localeCompare(String(b)); +} + +function applySorting( + rows: TData[], + sorting: SortingState, + columns: ResolvedColumn[], +): TData[] { + if (sorting.length === 0) return rows; + + const sorted = [...rows]; + sorted.sort((a, b) => { + for (const entry of sorting) { + const col = columns.find((c) => c.id === entry.id); + if (!col) continue; + const sortFn = col.def.sortingFn ?? defaultSortFn; + const result = sortFn(col.getvalue(a), col.getvalue(b)); + if (result !== 0) return entry.desc ? -result : result; + } + return 0; + }); + + return sorted; +} + +// ── Built-in filter functions ───────────────────────────────────────────── + +export const filterFns = { + includesString: (cellValue: any, filterValue: string) => + String(cellValue).toLowerCase().includes(String(filterValue).toLowerCase()), + equals: (cellValue: any, filterValue: any) => cellValue === filterValue, + weakEquals: (cellValue: any, filterValue: any) => cellValue == filterValue, + inNumberRange: (cellValue: any, filterValue: [number, number]) => { + const num = Number(cellValue); + return num >= filterValue[0] && num <= filterValue[1]; + }, + arrIncludes: (cellValue: any, filterValue: any) => + Array.isArray(cellValue) && cellValue.includes(filterValue), +} as const; + +export type BuiltInFilterFn = keyof typeof filterFns; + +// ── Filter logic ───────────────────────────────────────────────────────── + +function applyColumnFilters( + rows: TData[], + filters: ColumnFiltersState, + columns: ResolvedColumn[], +): TData[] { + if (filters.length === 0) return rows; + + return rows.filter((row) => + filters.every((filter) => { + const col = columns.find((c) => c.id === filter.id); + if (!col) return true; + const cellValue = col.getvalue(row); + if (col.def.filterFn) return col.def.filterFn(row, col.id, filter.value); + return filterFns.includesString(cellValue, filter.value); + }), + ); +} + +function applyGlobalFilter( + rows: TData[], + globalFilter: string, + columns: ResolvedColumn[], + globalFilterFn?: (row: TData, columnId: string, filterValue: any) => boolean, +): TData[] { + if (!globalFilter) return rows; + + return rows.filter((row) => + columns.some((col) => { + if (col.def.enableFiltering === false) return false; + const cellValue = col.getvalue(row); + if (globalFilterFn) return globalFilterFn(row, col.id, globalFilter); + return filterFns.includesString(cellValue, globalFilter); + }), + ); +} + +// ── Pagination logic ───────────────────────────────────────────────────────── + +function applyPagination( + rows: TData[], + pagination: PaginationState | undefined, +): TData[] { + if (!pagination) return rows; + const start = pagination.pageIndex * pagination.pageSize; + return rows.slice(start, start + pagination.pageSize); +} + +// ── Table row/cell models ──────────────────────────────────────────────────── + +export interface TableHeader { + id: string; + column: ResolvedColumn; + label: string; +} + +export interface TableCell { + id: string; + column: ResolvedColumn; + value: any; +} + +export interface TableRow { + id: string; + index: number; + original: TData; + cells: TableCell[]; +} + +// ── Table instance ─────────────────────────────────────────────────────────── + +export interface TableConfig { + /** Row data. Function for reactivity. */ + data: () => TData[]; + /** Column definitions. */ + columns: ColumnDef[]; + /** Get unique row ID. Default: uses index. */ + getRowId?: (row: TData, index: number) => string; + + // ── Sorting ────────────────────────────────────────────────────────── + sorting?: { + enabled?: boolean; + /** Allow multi-column sort. @default false */ + multi?: boolean; + /** Server-side sort (skip client sort). @default false */ + manual?: boolean; + }; + /** Initial or controlled sorting state. */ + initialSorting?: SortingState; + onSortingChange?: OnChangeFn; + + // ── Filtering ──────────────────────────────────────────────────────── + filtering?: { + enabled?: boolean; + /** Server-side filtering (skip client filter). @default false */ + manual?: boolean; + /** Custom global filter function. Default: includesString across all columns. */ + globalFilterFn?: (row: TData, columnId: string, filterValue: any) => boolean; + }; + initialColumnFilters?: ColumnFiltersState; + initialGlobalFilter?: string; + onColumnFiltersChange?: OnChangeFn; + onGlobalFilterChange?: OnChangeFn; + + // ── Selection ──────────────────────────────────────────────────────── + selection?: { + mode?: SelectionMode; + }; + initialSelection?: RowSelectionState; + onSelectionChange?: OnChangeFn; + + // ── Pagination ─────────────────────────────────────────────────────── + pagination?: { + enabled?: boolean; + /** Server-side pagination (skip client slice). @default false */ + manual?: boolean; + pageSize?: number; + }; + initialPagination?: PaginationState; + onPaginationChange?: OnChangeFn; + + // ── Column visibility ──────────────────────────────────────────────── + initialColumnVisibility?: ColumnVisibilityState; + onColumnVisibilityChange?: OnChangeFn; + + /** Total row count (for server-side pagination). */ + rowCount?: number; +} + +export interface TableInstance { + // ── Computed ────────────────────────────────────────────────────────── + readonly columns: ResolvedColumn[]; + readonly headers: TableHeader[]; + readonly rows: TableRow[]; + readonly allRows: TData[]; + + // ── Sorting ────────────────────────────────────────────────────────── + readonly sorting: SortingState; + toggleSort(columnId: string, multi?: boolean): void; + setSorting(sorting: SortingState): void; + clearSorting(): void; + getIsSorted(columnId: string): false | 'asc' | 'desc'; + getCanSort(columnId: string): boolean; + + // ── Filtering ──────────────────────────────────────────────────────── + readonly columnFilters: ColumnFiltersState; + readonly globalFilter: string; + setColumnFilter(columnId: string, value: any): void; + removeColumnFilter(columnId: string): void; + setGlobalFilter(value: string): void; + clearFilters(): void; + getColumnFilterValue(columnId: string): any; + getCanFilter(columnId: string): boolean; + + // ── Selection ──────────────────────────────────────────────────────── + readonly selection: RowSelectionState; + readonly selectionMode: SelectionMode; + toggleRowSelection(rowId: string): void; + setRowSelection(selection: RowSelectionState): void; + toggleAllSelection(): void; + getIsRowSelected(rowId: string): boolean; + getIsAllSelected(): boolean; + getIsSomeSelected(): boolean; + + // ── Column visibility ──────────────────────────────────────────────── + readonly columnVisibility: ColumnVisibilityState; + toggleColumnVisibility(columnId: string): void; + setColumnVisibility(visibility: ColumnVisibilityState): void; + getIsColumnVisible(columnId: string): boolean; + getVisibleColumns(): ResolvedColumn[]; + + // ── Pagination ─────────────────────────────────────────────────────── + readonly pagination: PaginationState; + readonly pageCount: number; + readonly canPreviousPage: boolean; + readonly canNextPage: boolean; + setPageIndex(index: number): void; + setPageSize(size: number): void; + previousPage(): void; + nextPage(): void; + firstPage(): void; + lastPage(): void; +} + +// ── Factory ────────────────────────────────────────────────────────────────── + +export function createTable(config: TableConfig): TableInstance { + const resolvedColumns = resolveColumns(config.columns); + const getRowId = config.getRowId ?? ((_row: TData, index: number) => String(index)); + + // ── Mutable state ──────────────────────────────────────────────────── + + let sorting = $state(config.initialSorting ?? []); + let columnFilters = $state(config.initialColumnFilters ?? []); + let globalFilter = $state(config.initialGlobalFilter ?? ''); + let columnVisibility = $state(config.initialColumnVisibility ?? {}); + let selection = $state(config.initialSelection ?? {}); + let pagination = $state( + config.initialPagination ?? { + pageIndex: 0, + pageSize: config.pagination?.pageSize ?? 10, + }, + ); + + // ── Derived: sorted + paginated rows ───────────────────────────────── + + const allRows = $derived.by(() => config.data()); + + const filteredRows = $derived.by(() => { + if (!config.filtering?.enabled || config.filtering?.manual) return allRows; + let rows = applyColumnFilters(allRows, columnFilters, resolvedColumns); + rows = applyGlobalFilter(rows, globalFilter, resolvedColumns, config.filtering?.globalFilterFn); + return rows; + }); + + const sortedRows = $derived.by(() => { + if (!config.sorting?.enabled || config.sorting?.manual) return filteredRows; + return applySorting(filteredRows, sorting, resolvedColumns); + }); + + const totalRowCount = $derived.by(() => config.rowCount ?? sortedRows.length); + + const pageCount = $derived.by(() => { + if (!config.pagination?.enabled) return 1; + return Math.max(1, Math.ceil(totalRowCount / pagination.pageSize)); + }); + + const paginatedRows = $derived.by(() => { + if (!config.pagination?.enabled || config.pagination?.manual) return sortedRows; + return applyPagination(sortedRows, pagination); + }); + + // ── Derived: table model ───────────────────────────────────────────── + + const headers = $derived.by(() => + getVisibleColumns().map((col) => ({ + id: col.id, + column: col, + label: col.def.header ?? col.id, + } as TableHeader)), + ); + + const rows = $derived.by(() => + paginatedRows.map((data, idx) => { + const globalIdx = config.pagination?.enabled + ? pagination.pageIndex * pagination.pageSize + idx + : idx; + const id = getRowId(data, globalIdx); + const visibleCols = getVisibleColumns(); + const cells: TableCell[] = visibleCols.map((col) => ({ + id: `${id}_${col.id}`, + column: col, + value: col.getvalue(data), + })); + return { id, index: globalIdx, original: data, cells } as TableRow; + }), + ); + + // ── Column visibility actions ──────────────────────────────────────── + + function getIsColumnVisible(columnId: string): boolean { + return columnVisibility[columnId] !== false; + } + + function getVisibleColumns(): ResolvedColumn[] { + return resolvedColumns.filter((col) => getIsColumnVisible(col.id)); + } + + function toggleColumnVisibility(columnId: string) { + columnVisibility = { ...columnVisibility, [columnId]: !getIsColumnVisible(columnId) }; + config.onColumnVisibilityChange?.(columnVisibility); + } + + function setColumnVisibility(v: ColumnVisibilityState) { + columnVisibility = v; + config.onColumnVisibilityChange?.(v); + } + + // ── Filtering actions ──────────────────────────────────────────────── + + function setColumnFilter(columnId: string, value: any) { + const existing = columnFilters.findIndex((f) => f.id === columnId); + if (existing >= 0) { + columnFilters = columnFilters.map((f) => (f.id === columnId ? { ...f, value } : f)); + } else { + columnFilters = [...columnFilters, { id: columnId, value }]; + } + config.onColumnFiltersChange?.(columnFilters); + // Reset to first page when filters change + if (config.pagination?.enabled) { + pagination = { ...pagination, pageIndex: 0 }; + config.onPaginationChange?.(pagination); + } + } + + function removeColumnFilter(columnId: string) { + columnFilters = columnFilters.filter((f) => f.id !== columnId); + config.onColumnFiltersChange?.(columnFilters); + } + + function setGlobalFilter(value: string) { + globalFilter = value; + config.onGlobalFilterChange?.(value); + if (config.pagination?.enabled) { + pagination = { ...pagination, pageIndex: 0 }; + config.onPaginationChange?.(pagination); + } + } + + function clearFilters() { + columnFilters = []; + globalFilter = ''; + config.onColumnFiltersChange?.([]); + config.onGlobalFilterChange?.(''); + } + + function getColumnFilterValue(columnId: string): any { + return columnFilters.find((f) => f.id === columnId)?.value; + } + + function getCanFilter(columnId: string): boolean { + if (!config.filtering?.enabled) return false; + const col = resolvedColumns.find((c) => c.id === columnId); + return col?.def.enableFiltering !== false; + } + + // ── Sorting actions ────────────────────────────────────────────────── + + /** + * Toggle sort on a column. + * @param columnId Column to sort. + * @param multi If true, adds to multi-sort. If false, replaces. + * Typically bound to Shift key by the component. + */ + function toggleSort(columnId: string, multi: boolean = false) { + if (!config.sorting?.enabled) return; + const col = resolvedColumns.find((c) => c.id === columnId); + if (!col || col.def.enableSorting === false) return; + + const useMulti = multi && config.sorting.multi === true; + const existing = sorting.find((s) => s.id === columnId); + let next: SortingState; + + if (!existing) { + // Add new sort entry + const desc = col.def.sortDescFirst ?? false; + const entry: SortingEntry = { id: columnId, desc }; + next = useMulti ? [...sorting, entry] : [entry]; + } else if (!existing.desc) { + // asc → desc + if (useMulti) { + next = sorting.map((s) => (s.id === columnId ? { ...s, desc: true } : s)); + } else { + next = [{ id: columnId, desc: true }]; + } + } else { + // desc → remove + next = sorting.filter((s) => s.id !== columnId); + } + + sorting = next; + config.onSortingChange?.(next); + } + + function setSorting(s: SortingState) { + sorting = s; + config.onSortingChange?.(s); + } + + function clearSorting() { + sorting = []; + config.onSortingChange?.([]); + } + + function getIsSorted(columnId: string): false | 'asc' | 'desc' { + const entry = sorting.find((s) => s.id === columnId); + if (!entry) return false; + return entry.desc ? 'desc' : 'asc'; + } + + function getCanSort(columnId: string): boolean { + if (!config.sorting?.enabled) return false; + const col = resolvedColumns.find((c) => c.id === columnId); + return col?.def.enableSorting !== false; + } + + // ── Selection actions ──────────────────────────────────────────────── + + const selectionMode = config.selection?.mode ?? 'none'; + + function toggleRowSelection(rowId: string) { + if (selectionMode === 'none') return; + const next = { ...selection }; + if (selectionMode === 'single') { + if (next[rowId]) { + delete next[rowId]; + } else { + for (const key of Object.keys(next)) delete next[key]; + next[rowId] = true; + } + } else { + if (next[rowId]) { + delete next[rowId]; + } else { + next[rowId] = true; + } + } + selection = next; + config.onSelectionChange?.(next); + } + + function setRowSelection(s: RowSelectionState) { + selection = s; + config.onSelectionChange?.(s); + } + + function toggleAllSelection() { + if (selectionMode !== 'multiple') return; + const allSelected = getIsAllSelected(); + if (allSelected) { + selection = {}; + } else { + const next: RowSelectionState = {}; + sortedRows.forEach((row, idx) => { + next[getRowId(row, idx)] = true; + }); + selection = next; + } + config.onSelectionChange?.(selection); + } + + function getIsRowSelected(rowId: string): boolean { + return !!selection[rowId]; + } + + function getIsAllSelected(): boolean { + if (sortedRows.length === 0) return false; + return sortedRows.every((row, idx) => selection[getRowId(row, idx)]); + } + + function getIsSomeSelected(): boolean { + const selectedCount = Object.keys(selection).filter((k) => selection[k]).length; + return selectedCount > 0 && selectedCount < sortedRows.length; + } + + // ── Pagination actions ─────────────────────────────────────────────── + + const canPreviousPage = $derived.by(() => pagination.pageIndex > 0); + const canNextPage = $derived.by(() => pagination.pageIndex < pageCount - 1); + + function setPageIndex(index: number) { + const clamped = Math.max(0, Math.min(index, pageCount - 1)); + pagination = { ...pagination, pageIndex: clamped }; + config.onPaginationChange?.(pagination); + } + + function setPageSize(size: number) { + pagination = { pageIndex: 0, pageSize: size }; + config.onPaginationChange?.(pagination); + } + + function previousPage() { setPageIndex(pagination.pageIndex - 1); } + function nextPage() { setPageIndex(pagination.pageIndex + 1); } + function firstPage() { setPageIndex(0); } + function lastPage() { setPageIndex(pageCount - 1); } + + // ── Instance ───────────────────────────────────────────────────────── + + return { + get columns() { return resolvedColumns; }, + get headers() { return headers; }, + get rows() { return rows; }, + get allRows() { return allRows; }, + + // Column visibility + get columnVisibility() { return columnVisibility; }, + toggleColumnVisibility, + setColumnVisibility, + getIsColumnVisible, + getVisibleColumns, + + // Filtering + get columnFilters() { return columnFilters; }, + get globalFilter() { return globalFilter; }, + setColumnFilter, + removeColumnFilter, + setGlobalFilter, + clearFilters, + getColumnFilterValue, + getCanFilter, + + // Sorting + get sorting() { return sorting; }, + toggleSort, + setSorting, + clearSorting, + getIsSorted, + getCanSort, + + // Selection + get selection() { return selection; }, + selectionMode, + toggleRowSelection, + setRowSelection, + toggleAllSelection, + getIsRowSelected, + getIsAllSelected, + getIsSomeSelected, + + // Pagination + get pagination() { return pagination; }, + get pageCount() { return pageCount; }, + get canPreviousPage() { return canPreviousPage; }, + get canNextPage() { return canNextPage; }, + setPageIndex, + setPageSize, + previousPage, + nextPage, + firstPage, + lastPage, + }; +} diff --git a/src/uix/soma/components/table/table-provider.svelte.ts b/src/uix/soma/components/table/table-provider.svelte.ts new file mode 100644 index 000000000..ed28869cc --- /dev/null +++ b/src/uix/soma/components/table/table-provider.svelte.ts @@ -0,0 +1,206 @@ +import { Provider, context, type ProviderOpts, type WithRefOpts } from '$soma/provider'; +import { createAttrs, boolToEmptyStrOrUndef } from '$soma/attrs'; +import { type ActiveProps } from '$soma/reactive'; +import type { SomaKeyboardEvent } from '$soma/types'; +import { KEYS } from '$soma/keyboard'; +import { getSoma } from '$soma/core/soma.svelte'; +import { resolveSomaTranslationPath } from '$soma/core/translator.svelte'; +import type { TableInstance, TableHeader, TableRow, TableCell } from './table-core.svelte'; + +const attrs = createAttrs({ + component: 'table', + parts: ['root', 'header', 'body', 'footer', 'column-header', 'row', 'cell'] as const, +}); + +// ── Provider (root, no DOM) ───────────────────────────────────────────────── + +interface TableProviderOpts + extends ProviderOpts, + ActiveProps<{ + table: TableInstance; + label: string; + }> {} + +export class TableProvider extends Provider { + static readonly ctx = context('Table'); + + static from(opts: TableProviderOpts) { + return new TableProvider(opts); + } + + readonly config = getSoma(); + + private constructor(opts: TableProviderOpts) { + super(opts, 'Table', 'root', attrs.root, TableProvider.ctx); + } + + get table(): TableInstance { + return this.opts.table.current; + } +} + +// ── ColumnHeader ───────────────────────────────────────────────────────────── + +interface TableColumnHeaderOpts + extends WithRefOpts, + ActiveProps<{ + header: TableHeader; + }> {} + +export class TableColumnHeaderProvider extends Provider { + static from(opts: TableColumnHeaderOpts) { + return new TableColumnHeaderProvider(opts); + } + + readonly provider: TableProvider; + + private constructor(opts: TableColumnHeaderOpts) { + super(opts, 'Table', 'column-header', attrs['column-header']); + this.provider = TableProvider.ctx.get(); + } + + private get header(): TableHeader { + return this.opts.header.current; + } + + private get table(): TableInstance { + return this.provider.table; + } + + readonly onclick = (e: MouseEvent) => { + if (this.table.getCanSort(this.header.id)) { + this.table.toggleSort(this.header.id, e.shiftKey); + } + }; + + readonly onkeydown = (e: SomaKeyboardEvent) => { + if (e.key === KEYS.ENTER || e.key === KEYS.SPACE) { + if (this.table.getCanSort(this.header.id)) { + e.preventDefault(); + this.table.toggleSort(this.header.id, e.shiftKey); + } + } + }; + + private get sortLabel(): string { + const sorted = this.table.getIsSorted(this.header.id); + const translator = this.provider.config.translator.current; + if (!sorted) { + return resolveSomaTranslationPath('soma.table.sort', translator, 'Sort'); + } + return sorted === 'asc' + ? resolveSomaTranslationPath('soma.table.sortAsc', translator, 'Sorted ascending') + : resolveSomaTranslationPath('soma.table.sortDesc', translator, 'Sorted descending'); + } + + readonly props = $derived.by(() => { + const sorted = this.table.getIsSorted(this.header.id); + const canSort = this.table.getCanSort(this.header.id); + const ariaSort: 'ascending' | 'descending' | 'none' = sorted + ? sorted === 'asc' ? 'ascending' : 'descending' + : 'none'; + + return this.assertProps({ + ...this.baseProps, + role: 'columnheader' as const, + 'aria-sort': ariaSort, + 'aria-label': canSort ? this.sortLabel : undefined, + title: canSort ? this.sortLabel : undefined, + tabindex: canSort ? 0 : undefined, + 'data-sortable': boolToEmptyStrOrUndef(canSort), + 'data-sorted': sorted || undefined, + onclick: canSort ? this.onclick : undefined, + onkeydown: canSort ? this.onkeydown : undefined, + } as const); + }); +} + +// ── Row ────────────────────────────────────────────────────────────────────── + +interface TableRowOpts + extends WithRefOpts, + ActiveProps<{ + row: TableRow; + }> {} + +export class TableRowProvider extends Provider { + static readonly ctx = context('TableRow'); + + static from(opts: TableRowOpts) { + return new TableRowProvider(opts); + } + + readonly provider: TableProvider; + + private constructor(opts: TableRowOpts) { + super(opts, 'Table', 'row', attrs.row, TableRowProvider.ctx); + this.provider = TableProvider.ctx.get(); + } + + private get row(): TableRow { + return this.opts.row.current; + } + + private get table(): TableInstance { + return this.provider.table; + } + + readonly isSelected = $derived.by( + () => this.table.getIsRowSelected(this.row.id), + ); + + readonly onclick = () => { + if (this.table.selectionMode !== 'none') { + this.table.toggleRowSelection(this.row.id); + } + }; + + readonly onkeydown = (e: SomaKeyboardEvent) => { + if (e.key === KEYS.SPACE || e.key === KEYS.ENTER) { + if (this.table.selectionMode !== 'none') { + e.preventDefault(); + this.table.toggleRowSelection(this.row.id); + } + } + }; + + readonly props = $derived.by(() => + this.assertProps({ + ...this.baseProps, + role: 'row' as const, + 'aria-rowindex': this.row.index + 1, + 'aria-selected': this.table.selectionMode !== 'none' ? this.isSelected : undefined, + tabindex: this.table.selectionMode !== 'none' ? 0 : undefined, + 'data-selected': boolToEmptyStrOrUndef(this.isSelected), + onclick: this.table.selectionMode !== 'none' ? this.onclick : undefined, + onkeydown: this.table.selectionMode !== 'none' ? this.onkeydown : undefined, + } as const), + ); +} + +// ── Cell ───────────────────────────────────────────────────────────────────── + +interface TableCellOpts + extends WithRefOpts, + ActiveProps<{ + cell: TableCell; + colIndex: number; + }> {} + +export class TableCellProvider extends Provider { + static from(opts: TableCellOpts) { + return new TableCellProvider(opts); + } + + private constructor(opts: TableCellOpts) { + super(opts, 'Table', 'cell', attrs.cell); + } + + readonly props = $derived.by(() => + this.assertProps({ + ...this.baseProps, + role: 'gridcell' as const, + 'aria-colindex': this.opts.colIndex.current + 1, + } as const), + ); +} diff --git a/src/uix/soma/components/table/types.ts b/src/uix/soma/components/table/types.ts new file mode 100644 index 000000000..f348b0611 --- /dev/null +++ b/src/uix/soma/components/table/types.ts @@ -0,0 +1,42 @@ +import type { Snippet } from 'svelte'; +import type { WithChild, Without } from '$soma/types'; +import type { PrimitiveDivAttributes } from '$soma/types'; +import type { TableInstance, TableHeader, TableRow, TableCell } from './table-core.svelte'; + +export type TableProviderProps = { + /** The table instance. Created via `createTable()`. Required. */ + table: TableInstance; + /** + * Accessible label for the table. + * @default 'Data table' + */ + label?: string; + /** Content. */ + children?: Snippet; +}; + +export type TableColumnHeaderProps = WithChild<{ + /** Unique identifier. Auto-generated if omitted. */ + id?: string; + /** The header object from `table.headers`. Required. */ + header: TableHeader; +}> & + Without; + +export type TableRowProps = WithChild<{ + /** Unique identifier. Auto-generated if omitted. */ + id?: string; + /** The row object from `table.rows`. Required. */ + row: TableRow; +}> & + Without; + +export type TableCellProps = WithChild<{ + /** Unique identifier. Auto-generated if omitted. */ + id?: string; + /** The cell object from `row.cells`. Required. */ + cell: TableCell; + /** Column index (0-based). Required. */ + colIndex: number; +}> & + Without; diff --git a/src/uix/soma/components/tabs/components/tabs.svelte b/src/uix/soma/components/tabs/components/tabs.svelte index 3b45f4e0c..e89601468 100644 --- a/src/uix/soma/components/tabs/components/tabs.svelte +++ b/src/uix/soma/components/tabs/components/tabs.svelte @@ -2,13 +2,13 @@ import { readableActive, writableActive } from '$soma/reactive'; import { mergeProps } from '$soma/props'; import { createId } from '$soma/id'; - import { Soma } from '$soma/core/soma.svelte'; + import { getSoma } from '$soma/core/soma.svelte'; import { TabsProvider } from '../tabs-provider.svelte'; import type { TabsProps } from '../types'; import { noop } from '$lib/util/funcs'; const uid = $props.id(); - const soma = Soma.getOr(); + const soma = getSoma(); let { ref = $bindable(null), @@ -20,7 +20,7 @@ activationMode = 'automatic', disabled = false, loop = true, - dir = soma?.dir.current ?? 'ltr', + dir = soma.presentation.current?.dir ?? 'ltr', children, child, ...restProps @@ -34,9 +34,11 @@ ), value: writableActive( () => value, - (v) => (value = v), + (v) => { + value = v; + onValueChange(v); + }, ), - onValueChange: readableActive(() => onValueChange), onFocusChange: readableActive(() => onFocusChange), orientation: readableActive(() => orientation), activationMode: readableActive(() => activationMode), diff --git a/src/uix/soma/components/tabs/tabs-provider.svelte.ts b/src/uix/soma/components/tabs/tabs-provider.svelte.ts index 86d683ffc..7501d7967 100644 --- a/src/uix/soma/components/tabs/tabs-provider.svelte.ts +++ b/src/uix/soma/components/tabs/tabs-provider.svelte.ts @@ -4,7 +4,7 @@ import { createAttrs, boolToEmptyStrOrUndef } from '$soma/attrs'; import { readableActive, state, type Active, type ActiveProps, type StateProps } from '$soma/reactive'; import type { OnChangeFn, Orientation, Direction, SomaMouseEvent, SomaKeyboardEvent } from '$soma/types'; import { KEYS, getDirectionalKeys } from '$soma/keyboard'; -import { Soma } from '$soma/core/soma.svelte'; +import { getSoma } from '$soma/core/soma.svelte'; import { Presence } from '$soma/layers/presence.svelte'; @@ -26,7 +26,6 @@ interface TabsOpts disabled: boolean; loop: boolean; dir: Direction; - onValueChange: OnChangeFn; onFocusChange: OnChangeFn; }> {} @@ -37,7 +36,7 @@ export class TabsProvider extends Provider { return new TabsProvider(opts); } - readonly soma: Soma | undefined; + readonly config = getSoma(); // ID registries for cross-linking trigger ↔ content by value triggerIds: Record = $state({}); @@ -45,14 +44,13 @@ export class TabsProvider extends Provider { private constructor(opts: TabsOpts) { super(opts, 'Tabs', 'root', attrs.root, TabsProvider.ctx); - this.soma = Soma.getOr(); + } selectTab(value: string) { if (this.opts.disabled.current) return; if (this.opts.value.current === value) return; this.opts.value.current = value; - this.opts.onValueChange.current(value); } /** Get all enabled trigger elements for keyboard navigation. */ @@ -81,19 +79,19 @@ export class TabsListProvider extends Provider { return new TabsListProvider(opts); } - readonly root: TabsProvider; + readonly provider: TabsProvider; private constructor(opts: TabsListOpts) { super(opts, 'Tabs', 'list', attrs.list); - this.root = TabsProvider.ctx.get(); + this.provider = TabsProvider.ctx.get(); } readonly props = $derived.by(() => this.assertProps({ ...this.baseProps, role: 'tablist' as const, - 'aria-orientation': this.root.opts.orientation.current, - 'data-orientation': this.root.opts.orientation.current, + 'aria-orientation': this.provider.opts.orientation.current, + 'data-orientation': this.provider.opts.orientation.current, } as const), ); } @@ -112,45 +110,45 @@ export class TabsTriggerProvider extends Provider { return new TabsTriggerProvider(opts); } - readonly root: TabsProvider; + readonly provider: TabsProvider; private constructor(opts: TabsTriggerOpts) { super(opts, 'Tabs', 'trigger', attrs.trigger); - this.root = TabsProvider.ctx.get(); - this.root.triggerIds[opts.value.current] = opts.id.current; + this.provider = TabsProvider.ctx.get(); + this.provider.triggerIds[opts.value.current] = opts.id.current; } readonly isActive = $derived.by( - () => this.root.opts.value.current === this.opts.value.current, + () => this.provider.opts.value.current === this.opts.value.current, ); readonly isDisabled = $derived.by( - () => this.opts.disabled.current || this.root.opts.disabled.current, + () => this.opts.disabled.current || this.provider.opts.disabled.current, ); readonly onclick = (_e: SomaMouseEvent) => { if (this.isDisabled) return; - this.root.selectTab(this.opts.value.current); + this.provider.selectTab(this.opts.value.current); }; readonly onfocus = () => { if (this.isDisabled) return; - this.root.opts.onFocusChange.current(this.opts.value.current); - if (this.root.opts.activationMode.current === 'automatic') { - this.root.selectTab(this.opts.value.current); + this.provider.opts.onFocusChange.current(this.opts.value.current); + if (this.provider.opts.activationMode.current === 'automatic') { + this.provider.selectTab(this.opts.value.current); } }; readonly onkeydown = (e: SomaKeyboardEvent) => { if (this.isDisabled) return; - const root = this.root; - const orientation = root.opts.orientation.current; - const dir = root.opts.dir.current; + const p = this.provider; + const orientation = p.opts.orientation.current; + const dir = p.opts.dir.current; const { nextKey, prevKey } = getDirectionalKeys(dir, orientation); - const triggers = root.getTriggers(); + const triggers = p.getTriggers(); const currentIndex = triggers.indexOf(e.currentTarget as HTMLButtonElement); - const loop = root.opts.loop.current; + const loop = p.opts.loop.current; let targetIndex = -1; @@ -172,10 +170,10 @@ export class TabsTriggerProvider extends Provider { targetIndex = triggers.length - 1; } else if ( (e.key === KEYS.ENTER || e.key === KEYS.SPACE) && - root.opts.activationMode.current === 'manual' + p.opts.activationMode.current === 'manual' ) { e.preventDefault(); - root.selectTab(this.opts.value.current); + p.selectTab(this.opts.value.current); return; } @@ -190,11 +188,11 @@ export class TabsTriggerProvider extends Provider { role: 'tab' as const, type: 'button' as const, 'aria-selected': this.isActive, - 'aria-controls': this.root.contentIds[this.opts.value.current] || undefined, + 'aria-controls': this.provider.contentIds[this.opts.value.current] || undefined, tabindex: this.isActive ? 0 : -1, 'data-state': this.isActive ? 'active' : 'inactive', 'data-disabled': boolToEmptyStrOrUndef(this.isDisabled), - 'data-orientation': this.root.opts.orientation.current, + 'data-orientation': this.provider.opts.orientation.current, 'data-value': this.opts.value.current, disabled: this.isDisabled || undefined, onclick: this.onclick, @@ -217,13 +215,13 @@ export class TabsContentProvider extends Provider { return new TabsContentProvider(opts); } - readonly root: TabsProvider; + readonly provider: TabsProvider; readonly presence: Presence; private constructor(opts: TabsContentOpts) { super(opts, 'Tabs', 'content', attrs.content); - this.root = TabsProvider.ctx.get(); - this.root.contentIds[opts.value.current] = opts.id.current; + this.provider = TabsProvider.ctx.get(); + this.provider.contentIds[opts.value.current] = opts.id.current; this.presence = new Presence({ open: readableActive(() => this.isActive), @@ -232,7 +230,7 @@ export class TabsContentProvider extends Provider { } readonly isActive = $derived.by( - () => this.root.opts.value.current === this.opts.value.current, + () => this.provider.opts.value.current === this.opts.value.current, ); readonly isPresent = $derived.by(() => this.presence.isPresent); @@ -241,10 +239,10 @@ export class TabsContentProvider extends Provider { this.assertProps({ ...this.baseProps, role: 'tabpanel' as const, - 'aria-labelledby': this.root.triggerIds[this.opts.value.current] || undefined, + 'aria-labelledby': this.provider.triggerIds[this.opts.value.current] || undefined, tabindex: 0, 'data-state': this.isActive ? 'active' : 'inactive', - 'data-orientation': this.root.opts.orientation.current, + 'data-orientation': this.provider.opts.orientation.current, ...this.presence.transitionAttrs, } as const), ); diff --git a/src/uix/soma/components/tags-input/components/tags-input.svelte b/src/uix/soma/components/tags-input/components/tags-input.svelte index 7f3e5ca98..39d30cdd4 100644 --- a/src/uix/soma/components/tags-input/components/tags-input.svelte +++ b/src/uix/soma/components/tags-input/components/tags-input.svelte @@ -33,7 +33,13 @@ const state = TagsInputProvider.from({ id: readableActive(() => id), ref: writableActive(() => ref, (v) => (ref = v)), - value: writableActive(() => value, (v) => (value = v)), + value: writableActive( + () => value, + (v) => { + value = v; + onValueChange(v); + }, + ), inputValue: writableActive(() => inputValue, (v) => (inputValue = v)), max: readableActive(() => max), delimiter: readableActive(() => delimiter), @@ -45,7 +51,6 @@ invalid: readableActive(() => invalid), placeholder: readableActive(() => placeholder), validate: readableActive(() => validate), - onValueChange: readableActive(() => onValueChange), onValueInvalid: readableActive(() => onValueInvalid), }); diff --git a/src/uix/soma/components/tags-input/tags-input-provider.svelte.ts b/src/uix/soma/components/tags-input/tags-input-provider.svelte.ts index b4a220b31..f78d2aa58 100644 --- a/src/uix/soma/components/tags-input/tags-input-provider.svelte.ts +++ b/src/uix/soma/components/tags-input/tags-input-provider.svelte.ts @@ -3,7 +3,8 @@ import { createAttrs, boolToEmptyStrOrUndef } from '$soma/attrs'; import { state, type Active, type ActiveProps, type StateProps } from '$soma/reactive'; import type { OnChangeFn, SomaKeyboardEvent, SomaMouseEvent } from '$soma/types'; import { KEYS } from '$soma/keyboard'; -import { Soma } from '$soma/core/soma.svelte'; +import { getSoma } from '$soma/core/soma.svelte'; +import { resolveSomaTranslationPath } from '$soma/core/translator.svelte'; const attrs = createAttrs({ component: 'tags-input', @@ -31,7 +32,6 @@ interface TagsInputOpts invalid: boolean; placeholder: string; validate: (value: string) => boolean; - onValueChange: OnChangeFn; onValueInvalid: OnChangeFn; }> {} @@ -42,7 +42,7 @@ export class TagsInputProvider extends Provider { return new TagsInputProvider(opts); } - readonly soma: Soma | undefined; + readonly config = getSoma(); // Focus tracking highlightedIndex = $state(-1); @@ -50,7 +50,7 @@ export class TagsInputProvider extends Provider { private constructor(opts: TagsInputOpts) { super(opts, 'TagsInput', 'root', attrs.root, TagsInputProvider.ctx); - this.soma = Soma.getOr(); + } readonly isEmpty = $derived.by(() => this.opts.value.current.length === 0); @@ -78,7 +78,6 @@ export class TagsInputProvider extends Provider { const next = [...this.opts.value.current, trimmed]; this.opts.value.current = next; - this.opts.onValueChange.current(next); return true; } @@ -89,7 +88,6 @@ export class TagsInputProvider extends Provider { const next = current.filter((_, i) => i !== index); this.opts.value.current = next; - this.opts.onValueChange.current(next); // Adjust highlight if (this.highlightedIndex >= next.length) { @@ -106,7 +104,6 @@ export class TagsInputProvider extends Provider { clearAll() { if (this.opts.disabled.current || this.opts.readonly.current) return; this.opts.value.current = []; - this.opts.onValueChange.current([]); this.highlightedIndex = -1; } @@ -198,25 +195,25 @@ export class TagsInputControlProvider extends Provider { return new TagsInputControlProvider(opts); } - readonly root: TagsInputProvider; + readonly provider: TagsInputProvider; private constructor(opts: TagsInputControlOpts) { super(opts, 'TagsInput', 'control', attrs.control); - this.root = TagsInputProvider.ctx.get(); + this.provider = TagsInputProvider.ctx.get(); } readonly onclick = () => { // Click on control focuses the input - this.root.inputRef.current?.focus(); + this.provider.inputRef.current?.focus(); }; readonly props = $derived.by(() => this.assertProps({ ...this.baseProps, - 'data-disabled': boolToEmptyStrOrUndef(this.root.opts.disabled.current), - 'data-readonly': boolToEmptyStrOrUndef(this.root.opts.readonly.current), - 'data-invalid': boolToEmptyStrOrUndef(this.root.opts.invalid.current), - 'data-focus': boolToEmptyStrOrUndef(this.root.highlightedIndex === -1), + 'data-disabled': boolToEmptyStrOrUndef(this.provider.opts.disabled.current), + 'data-readonly': boolToEmptyStrOrUndef(this.provider.opts.readonly.current), + 'data-invalid': boolToEmptyStrOrUndef(this.provider.opts.invalid.current), + 'data-focus': boolToEmptyStrOrUndef(this.provider.highlightedIndex === -1), onclick: this.onclick, } as const), ); @@ -231,83 +228,83 @@ export class TagsInputInputProvider extends Provider { return new TagsInputInputProvider(opts); } - readonly root: TagsInputProvider; + readonly provider: TagsInputProvider; private constructor(opts: TagsInputInputOpts) { super(opts, 'TagsInput', 'input', attrs.input, undefined, (el) => { - this.root.inputRef.current = el; + this.provider.inputRef.current = el; }); - this.root = TagsInputProvider.ctx.get(); + this.provider = TagsInputProvider.ctx.get(); } readonly oninput = (e: Event) => { const target = e.currentTarget as HTMLInputElement; const value = target.value; - const delimiter = this.root.opts.delimiter.current; + const delimiter = this.provider.opts.delimiter.current; // Check if delimiter was typed if (value.includes(delimiter)) { - this.root.opts.inputValue.current = value; - this.root.addFromInput(); + this.provider.opts.inputValue.current = value; + this.provider.addFromInput(); } else { - this.root.opts.inputValue.current = value; + this.provider.opts.inputValue.current = value; } }; readonly onkeydown = (e: SomaKeyboardEvent) => { const input = e.currentTarget; const caretAtStart = input.selectionStart === 0 && input.selectionEnd === 0; - const isEmpty = !this.root.opts.inputValue.current; + const isEmpty = !this.provider.opts.inputValue.current; if (e.key === KEYS.ENTER) { e.preventDefault(); - this.root.addFromInput(); + this.provider.addFromInput(); } else if (e.key === KEYS.ESCAPE) { e.preventDefault(); - this.root.opts.inputValue.current = ''; - this.root.clearHighlight(); + this.provider.opts.inputValue.current = ''; + this.provider.clearHighlight(); } else if (e.key === 'Backspace' && isEmpty) { e.preventDefault(); - const count = this.root.opts.value.current.length; + const count = this.provider.opts.value.current.length; if (count > 0) { - this.root.removeTag(count - 1); + this.provider.removeTag(count - 1); } } else if (e.key === KEYS.ARROW_LEFT && caretAtStart) { e.preventDefault(); - this.root.highlightLast(); + this.provider.highlightLast(); } }; readonly onpaste = (e: ClipboardEvent) => { - if (!this.root.opts.addOnPaste.current) return; + if (!this.provider.opts.addOnPaste.current) return; e.preventDefault(); const text = e.clipboardData?.getData('text') ?? ''; - this.root.handlePaste(text); + this.provider.handlePaste(text); }; readonly onblur = () => { - const behavior = this.root.opts.blurBehavior.current; + const behavior = this.provider.opts.blurBehavior.current; if (behavior === 'add') { - this.root.addFromInput(); + this.provider.addFromInput(); } else { - this.root.opts.inputValue.current = ''; + this.provider.opts.inputValue.current = ''; } - this.root.clearHighlight(); + this.provider.clearHighlight(); }; readonly props = $derived.by(() => this.assertProps({ ...this.baseProps, type: 'text' as const, - value: this.root.opts.inputValue.current, + value: this.provider.opts.inputValue.current, placeholder: - this.root.isEmpty ? this.root.opts.placeholder.current || undefined : undefined, - disabled: this.root.opts.disabled.current || undefined, - readonly: this.root.opts.readonly.current || undefined, - 'aria-invalid': this.root.opts.invalid.current || undefined, - 'data-disabled': boolToEmptyStrOrUndef(this.root.opts.disabled.current), - 'data-readonly': boolToEmptyStrOrUndef(this.root.opts.readonly.current), - 'data-invalid': boolToEmptyStrOrUndef(this.root.opts.invalid.current), + this.provider.isEmpty ? this.provider.opts.placeholder.current || undefined : undefined, + disabled: this.provider.opts.disabled.current || undefined, + readonly: this.provider.opts.readonly.current || undefined, + 'aria-invalid': this.provider.opts.invalid.current || undefined, + 'data-disabled': boolToEmptyStrOrUndef(this.provider.opts.disabled.current), + 'data-readonly': boolToEmptyStrOrUndef(this.provider.opts.readonly.current), + 'data-invalid': boolToEmptyStrOrUndef(this.provider.opts.invalid.current), oninput: this.oninput, onkeydown: this.onkeydown, onpaste: this.onpaste, @@ -333,19 +330,19 @@ export class TagsInputItemProvider extends Provider { return new TagsInputItemProvider(opts); } - readonly root: TagsInputProvider; + readonly provider: TagsInputProvider; private constructor(opts: TagsInputItemOpts) { super(opts, 'TagsInput', 'item', attrs.item, TagsInputItemProvider.ctx); - this.root = TagsInputProvider.ctx.get(); + this.provider = TagsInputProvider.ctx.get(); } readonly isHighlighted = $derived.by( - () => this.root.highlightedIndex === this.opts.index.current, + () => this.provider.highlightedIndex === this.opts.index.current, ); readonly isDisabled = $derived.by( - () => this.opts.disabled.current || this.root.opts.disabled.current, + () => this.opts.disabled.current || this.provider.opts.disabled.current, ); readonly onkeydown = (e: SomaKeyboardEvent) => { @@ -353,28 +350,28 @@ export class TagsInputItemProvider extends Provider { if (e.key === KEYS.ARROW_LEFT) { e.preventDefault(); - this.root.highlightPrev(); + this.provider.highlightPrev(); } else if (e.key === KEYS.ARROW_RIGHT) { e.preventDefault(); - this.root.highlightNext(); + this.provider.highlightNext(); } else if (e.key === 'Backspace' || e.key === 'Delete') { e.preventDefault(); - this.root.removeTag(this.opts.index.current); + this.provider.removeTag(this.opts.index.current); } else if (e.key === KEYS.HOME) { e.preventDefault(); - this.root.highlightFirst(); + this.provider.highlightFirst(); } else if (e.key === KEYS.END) { e.preventDefault(); - this.root.highlightLast(); + this.provider.highlightLast(); } else if (e.key === KEYS.ESCAPE) { e.preventDefault(); - this.root.clearHighlight(); - this.root.inputRef.current?.focus(); + this.provider.clearHighlight(); + this.provider.inputRef.current?.focus(); } }; readonly onclick = () => { - this.root.highlightedIndex = this.opts.index.current; + this.provider.highlightedIndex = this.opts.index.current; }; readonly props = $derived.by(() => @@ -426,19 +423,19 @@ export class TagsInputItemDeleteTriggerProvider extends Provider) => { e.stopPropagation(); - if (this.item.isDisabled || this.root.opts.readonly.current) return; - this.root.removeTag(this.item.opts.index.current); - this.root.inputRef.current?.focus(); + if (this.item.isDisabled || this.provider.opts.readonly.current) return; + this.provider.removeTag(this.item.opts.index.current); + this.provider.inputRef.current?.focus(); }; readonly props = $derived.by(() => @@ -447,8 +444,8 @@ export class TagsInputItemDeleteTriggerProvider extends Provider) => { - this.root.clearAll(); - this.root.inputRef.current?.focus(); + this.provider.clearAll(); + this.provider.inputRef.current?.focus(); }; readonly props = $derived.by(() => @@ -481,9 +478,9 @@ export class TagsInputClearTriggerProvider extends Provider { return new ToastProvider(opts); } - readonly soma: Soma | undefined; + readonly config = getSoma(); private constructor(opts: ToastProviderOpts) { super(opts, 'Toast', 'provider', attrs.provider, ToastProvider.ctx); - this.soma = Soma.getOr(); + } get toaster(): Toaster { @@ -48,16 +49,16 @@ export class ToastViewportProvider extends Provider { return new ToastViewportProvider(opts); } - readonly root: ToastProvider; + readonly provider: ToastProvider; private cleanupHotkey: (() => void) | undefined; private constructor(opts: ToastViewportOpts) { super(opts, 'Toast', 'viewport', attrs.viewport); - this.root = ToastProvider.ctx.get(); + this.provider = ToastProvider.ctx.get(); // Register global hotkey to focus viewport if (isBrowser) { - const hotkey = this.root.toaster.hotkey; + const hotkey = this.provider.toaster.hotkey; const handler = (e: KeyboardEvent) => { const matches = hotkey.every( (key) => e.code === key || e.key === key, @@ -79,7 +80,7 @@ export class ToastViewportProvider extends Provider { this.assertProps({ ...this.baseProps, role: 'region' as const, - 'aria-label': this.root.opts.label.current, + 'aria-label': this.provider.opts.label.current, tabindex: -1, } as const), ); @@ -100,7 +101,7 @@ export class ToastRootProvider extends Provider { return new ToastRootProvider(opts); } - readonly root: ToastProvider; + readonly provider: ToastProvider; // tracked IDs for ARIA titleId = state(''); @@ -122,10 +123,10 @@ export class ToastRootProvider extends Provider { private constructor(opts: ToastRootOpts) { super(opts, 'Toast', 'root', attrs.root, ToastRootProvider.ctx); - this.root = ToastProvider.ctx.get(); + this.provider = ToastProvider.ctx.get(); const toast = opts.toast.current; - this.remaining = toast.duration ?? this.root.toaster.duration; + this.remaining = toast.duration ?? this.provider.toaster.duration; // Start auto-dismiss timer if duration > 0 if (this.remaining > 0) { @@ -136,7 +137,7 @@ export class ToastRootProvider extends Provider { private startTimer() { this.startTime = Date.now(); this.timerId = setTimeout(() => { - this.root.toaster.dismiss(this.opts.toast.current.id); + this.provider.toaster.dismiss(this.opts.toast.current.id); }, this.remaining); } @@ -181,11 +182,11 @@ export class ToastRootProvider extends Provider { // ── Swipe ──────────────────────────────────────────────────────────────── private get swipeDirection(): SwipeDirection { - return this.root.toaster.swipeDirection; + return this.provider.toaster.swipeDirection; } private get swipeThreshold(): number { - return this.root.toaster.swipeThreshold; + return this.provider.toaster.swipeThreshold; } private get isHorizontalSwipe(): boolean { @@ -223,7 +224,7 @@ export class ToastRootProvider extends Provider { if (isCorrectDirection && Math.abs(delta) >= this.swipeThreshold) { this.swipeState = 'end'; - this.root.toaster.dismiss(this.opts.toast.current.id); + this.provider.toaster.dismiss(this.opts.toast.current.id); } else { this.swipeState = 'cancel'; this.swipeDeltaX = 0; @@ -248,7 +249,7 @@ export class ToastRootProvider extends Provider { 'aria-describedby': this.descriptionId.current || undefined, 'data-type': this.opts.toast.current.type, 'data-swipe': this.swipeState === 'idle' ? undefined : this.swipeState, - 'data-swipe-direction': this.root.toaster.swipeDirection, + 'data-swipe-direction': this.provider.toaster.swipeDirection, tabindex: 0, style: { '--soma-toast-swipe-move-x': `${this.swipeDeltaX}px`, @@ -362,7 +363,7 @@ export class ToastCloseProvider extends Provider { } readonly onclick = (_e: SomaMouseEvent) => { - this.toastRoot.root.toaster.dismiss(this.toastRoot.opts.toast.current.id); + this.toastRoot.provider.toaster.dismiss(this.toastRoot.opts.toast.current.id); }; readonly props = $derived.by(() => @@ -370,7 +371,7 @@ export class ToastCloseProvider extends Provider { ...this.baseProps, type: 'button' as const, 'aria-label': - this.toastRoot.root.soma?.translate('toast.close', 'Close') ?? 'Close', + resolveSomaTranslationPath('soma.toast.close', this.toastRoot.provider.config.translator.current, 'Close'), onclick: this.onclick, } as const), ); diff --git a/src/uix/soma/components/toggle-group/components/toggle-group.svelte b/src/uix/soma/components/toggle-group/components/toggle-group.svelte index b3aee73b3..53eb2702d 100644 --- a/src/uix/soma/components/toggle-group/components/toggle-group.svelte +++ b/src/uix/soma/components/toggle-group/components/toggle-group.svelte @@ -2,13 +2,13 @@ import { readableActive, writableActive } from '$soma/reactive'; import { mergeProps } from '$soma/props'; import { createId } from '$soma/id'; - import { Soma } from '$soma/core/soma.svelte'; + import { getSoma } from '$soma/core/soma.svelte'; import { ToggleGroupProvider } from '../toggle-group-provider.svelte'; import type { ToggleGroupProps } from '../types'; import { noop } from '$lib/util/funcs'; const uid = $props.id(); - const soma = Soma.getOr(); + const soma = getSoma(); let { ref = $bindable(null), @@ -19,7 +19,7 @@ disabled = false, orientation = 'horizontal', loop = true, - dir = soma?.dir.current ?? 'ltr', + dir = soma.presentation.current?.dir ?? 'ltr', children, child, ...restProps @@ -34,9 +34,11 @@ type: readableActive(() => type), value: writableActive( () => value, - (v) => (value = v), + (v) => { + value = v; + onValueChange(v); + }, ), - onValueChange: readableActive(() => onValueChange), disabled: readableActive(() => disabled), orientation: readableActive(() => orientation), loop: readableActive(() => loop), diff --git a/src/uix/soma/components/toggle-group/toggle-group-provider.svelte.ts b/src/uix/soma/components/toggle-group/toggle-group-provider.svelte.ts index 1c611f98f..eb719387e 100644 --- a/src/uix/soma/components/toggle-group/toggle-group-provider.svelte.ts +++ b/src/uix/soma/components/toggle-group/toggle-group-provider.svelte.ts @@ -1,9 +1,9 @@ import { Provider, context, type WithRefOpts } from '$soma/provider'; import { createAttrs, boolToEmptyStrOrUndef } from '$soma/attrs'; import type { ActiveProps, StateProps } from '$soma/reactive'; -import type { OnChangeFn, Orientation, Direction, SomaMouseEvent, SomaKeyboardEvent } from '$soma/types'; +import type { Orientation, Direction, SomaMouseEvent, SomaKeyboardEvent } from '$soma/types'; import { KEYS, getDirectionalKeys } from '$soma/keyboard'; -import { Soma } from '$soma/core/soma.svelte'; +import { getSoma } from '$soma/core/soma.svelte'; const attrs = createAttrs({ component: 'toggle-group', @@ -23,7 +23,6 @@ interface ToggleGroupOpts orientation: Orientation; loop: boolean; dir: Direction; - onValueChange: OnChangeFn; }> {} export class ToggleGroupProvider extends Provider { @@ -33,11 +32,11 @@ export class ToggleGroupProvider extends Provider { return new ToggleGroupProvider(opts); } - readonly soma: Soma | undefined; + readonly config = getSoma(); private constructor(opts: ToggleGroupOpts) { super(opts, 'ToggleGroup', 'root', attrs.root, ToggleGroupProvider.ctx); - this.soma = Soma.getOr(); + } isItemPressed(value: string): boolean { @@ -58,7 +57,6 @@ export class ToggleGroupProvider extends Provider { } this.opts.value.current = next; - this.opts.onValueChange.current(next); } /** Get all enabled item elements for keyboard navigation. */ @@ -94,35 +92,35 @@ export class ToggleGroupItemProvider extends Provider { return new ToggleGroupItemProvider(opts); } - readonly root: ToggleGroupProvider; + readonly provider: ToggleGroupProvider; private constructor(opts: ToggleGroupItemOpts) { super(opts, 'ToggleGroup', 'item', attrs.item); - this.root = ToggleGroupProvider.ctx.get(); + this.provider = ToggleGroupProvider.ctx.get(); } readonly isPressed = $derived.by(() => - this.root.isItemPressed(this.opts.value.current), + this.provider.isItemPressed(this.opts.value.current), ); readonly isDisabled = $derived.by(() => - this.opts.disabled.current || this.root.opts.disabled.current, + this.opts.disabled.current || this.provider.opts.disabled.current, ); readonly onclick = (_e: SomaMouseEvent) => { if (this.isDisabled) return; - this.root.toggleItem(this.opts.value.current); + this.provider.toggleItem(this.opts.value.current); }; readonly onkeydown = (e: SomaKeyboardEvent) => { if (this.isDisabled) return; - const orientation = this.root.opts.orientation.current; - const dir = this.root.opts.dir.current; + const orientation = this.provider.opts.orientation.current; + const dir = this.provider.opts.dir.current; const { nextKey, prevKey } = getDirectionalKeys(dir, orientation); - const items = this.root.getItems(); + const items = this.provider.getItems(); const currentIndex = items.indexOf(e.currentTarget as HTMLElement); - const loop = this.root.opts.loop.current; + const loop = this.provider.opts.loop.current; let targetIndex = -1; @@ -157,7 +155,7 @@ export class ToggleGroupItemProvider extends Provider { tabindex: this.isPressed ? 0 : -1, 'data-state': this.isPressed ? 'on' : 'off', 'data-disabled': boolToEmptyStrOrUndef(this.isDisabled), - 'data-orientation': this.root.opts.orientation.current, + 'data-orientation': this.provider.opts.orientation.current, 'data-value': this.opts.value.current, disabled: this.isDisabled || undefined, onclick: this.onclick, diff --git a/src/uix/soma/components/toolbar/components/toolbar-group.svelte b/src/uix/soma/components/toolbar/components/toolbar-group.svelte index d0a731176..a09c1e19c 100644 --- a/src/uix/soma/components/toolbar/components/toolbar-group.svelte +++ b/src/uix/soma/components/toolbar/components/toolbar-group.svelte @@ -29,9 +29,11 @@ type: readableActive(() => type), value: writableActive( () => value, - (v) => (value = v), + (v) => { + value = v; + onValueChange(v); + }, ), - onValueChange: readableActive(() => onValueChange), disabled: readableActive(() => disabled), }); diff --git a/src/uix/soma/components/toolbar/components/toolbar.svelte b/src/uix/soma/components/toolbar/components/toolbar.svelte index fde2210ed..2f5f94edb 100644 --- a/src/uix/soma/components/toolbar/components/toolbar.svelte +++ b/src/uix/soma/components/toolbar/components/toolbar.svelte @@ -2,19 +2,19 @@ import { readableActive, writableActive } from '$soma/reactive'; import { mergeProps } from '$soma/props'; import { createId } from '$soma/id'; - import { Soma } from '$soma/core/soma.svelte'; + import { getSoma } from '$soma/core/soma.svelte'; import { ToolbarProvider } from '../toolbar-provider.svelte'; import type { ToolbarProps } from '../types'; const uid = $props.id(); - const soma = Soma.getOr(); + const soma = getSoma(); let { ref = $bindable(null), id = createId(uid, 'toolbar'), orientation = 'horizontal', loop = true, - dir = soma?.dir.current ?? 'ltr', + dir = soma.presentation.current?.dir ?? 'ltr', children, child, ...restProps diff --git a/src/uix/soma/components/toolbar/toolbar-provider.svelte.ts b/src/uix/soma/components/toolbar/toolbar-provider.svelte.ts index 184c49f33..1e65b0bcf 100644 --- a/src/uix/soma/components/toolbar/toolbar-provider.svelte.ts +++ b/src/uix/soma/components/toolbar/toolbar-provider.svelte.ts @@ -1,9 +1,9 @@ import { Provider, context, type WithRefOpts } from '$soma/provider'; import { createAttrs, boolToEmptyStrOrUndef } from '$soma/attrs'; import { type Active, type ActiveProps, type StateProps } from '$soma/reactive'; -import type { OnChangeFn, Orientation, Direction, SomaKeyboardEvent, SomaMouseEvent } from '$soma/types'; +import type { Orientation, Direction, SomaKeyboardEvent, SomaMouseEvent } from '$soma/types'; import { KEYS, getDirectionalKeys } from '$soma/keyboard'; -import { Soma } from '$soma/core/soma.svelte'; +import { getSoma } from '$soma/core/soma.svelte'; const attrs = createAttrs({ component: 'toolbar', @@ -29,14 +29,14 @@ export class ToolbarProvider extends Provider { return new ToolbarProvider(opts); } - readonly soma: Soma | undefined; + readonly config = getSoma(); // Track last focused item for focus restoration lastFocusedIndex = $state(0); private constructor(opts: ToolbarOpts) { super(opts, 'Toolbar', 'root', attrs.root, ToolbarProvider.ctx); - this.soma = Soma.getOr(); + } /** Get all focusable items in the toolbar. */ @@ -119,15 +119,15 @@ export class ToolbarButtonProvider extends Provider { return new ToolbarButtonProvider(opts); } - readonly root: ToolbarProvider; + readonly provider: ToolbarProvider; private constructor(opts: ToolbarButtonOpts) { super(opts, 'Toolbar', 'button', attrs.button); - this.root = ToolbarProvider.ctx.get(); + this.provider = ToolbarProvider.ctx.get(); } private get itemIndex(): number { - const items = this.root.getItems(); + const items = this.provider.getItems(); return items.indexOf(this.opts.ref.current as HTMLElement); } @@ -135,9 +135,9 @@ export class ToolbarButtonProvider extends Provider { this.assertProps({ ...this.baseProps, type: 'button' as const, - tabindex: this.root.lastFocusedIndex === this.itemIndex ? 0 : -1, + tabindex: this.provider.lastFocusedIndex === this.itemIndex ? 0 : -1, disabled: this.opts.disabled.current || undefined, - 'data-orientation': this.root.opts.orientation.current, + 'data-orientation': this.provider.opts.orientation.current, } as const), ); } @@ -151,23 +151,23 @@ export class ToolbarLinkProvider extends Provider { return new ToolbarLinkProvider(opts); } - readonly root: ToolbarProvider; + readonly provider: ToolbarProvider; private constructor(opts: ToolbarLinkOpts) { super(opts, 'Toolbar', 'link', attrs.link); - this.root = ToolbarProvider.ctx.get(); + this.provider = ToolbarProvider.ctx.get(); } private get itemIndex(): number { - const items = this.root.getItems(); + const items = this.provider.getItems(); return items.indexOf(this.opts.ref.current as HTMLElement); } readonly props = $derived.by(() => this.assertProps({ ...this.baseProps, - tabindex: this.root.lastFocusedIndex === this.itemIndex ? 0 : -1, - 'data-orientation': this.root.opts.orientation.current, + tabindex: this.provider.lastFocusedIndex === this.itemIndex ? 0 : -1, + 'data-orientation': this.provider.opts.orientation.current, } as const), ); } @@ -180,7 +180,6 @@ interface ToolbarGroupOpts ActiveProps<{ type: ToolbarGroupType; disabled: boolean; - onValueChange: OnChangeFn; }> {} export class ToolbarGroupProvider extends Provider { @@ -190,11 +189,11 @@ export class ToolbarGroupProvider extends Provider { return new ToolbarGroupProvider(opts); } - readonly root: ToolbarProvider; + readonly provider: ToolbarProvider; private constructor(opts: ToolbarGroupOpts) { super(opts, 'Toolbar', 'group', attrs.group, ToolbarGroupProvider.ctx); - this.root = ToolbarProvider.ctx.get(); + this.provider = ToolbarProvider.ctx.get(); } isItemPressed(value: string): boolean { @@ -215,14 +214,13 @@ export class ToolbarGroupProvider extends Provider { } this.opts.value.current = next; - this.opts.onValueChange.current(next); } readonly props = $derived.by(() => this.assertProps({ ...this.baseProps, role: 'group' as const, - 'data-orientation': this.root.opts.orientation.current, + 'data-orientation': this.provider.opts.orientation.current, 'data-disabled': boolToEmptyStrOrUndef(this.opts.disabled.current), } as const), ); @@ -243,12 +241,12 @@ export class ToolbarGroupItemProvider extends Provider { } readonly group: ToolbarGroupProvider; - readonly root: ToolbarProvider; + readonly provider: ToolbarProvider; private constructor(opts: ToolbarGroupItemOpts) { super(opts, 'Toolbar', 'group-item', attrs['group-item']); this.group = ToolbarGroupProvider.ctx.get(); - this.root = this.group.root; + this.provider = this.group.provider; } readonly isPressed = $derived.by( @@ -265,7 +263,7 @@ export class ToolbarGroupItemProvider extends Provider { }; private get itemIndex(): number { - const items = this.root.getItems(); + const items = this.provider.getItems(); return items.indexOf(this.opts.ref.current as HTMLElement); } @@ -274,10 +272,10 @@ export class ToolbarGroupItemProvider extends Provider { ...this.baseProps, type: 'button' as const, 'aria-pressed': this.isPressed, - tabindex: this.root.lastFocusedIndex === this.itemIndex ? 0 : -1, + tabindex: this.provider.lastFocusedIndex === this.itemIndex ? 0 : -1, 'data-state': this.isPressed ? 'on' : 'off', 'data-disabled': boolToEmptyStrOrUndef(this.isDisabled), - 'data-orientation': this.root.opts.orientation.current, + 'data-orientation': this.provider.opts.orientation.current, 'data-value': this.opts.value.current, disabled: this.isDisabled || undefined, onclick: this.onclick, @@ -294,16 +292,16 @@ export class ToolbarSeparatorProvider extends Provider { return new ToolbarSeparatorProvider(opts); } - readonly root: ToolbarProvider; + readonly provider: ToolbarProvider; private constructor(opts: ToolbarSeparatorOpts) { super(opts, 'Toolbar', 'separator', attrs.separator); - this.root = ToolbarProvider.ctx.get(); + this.provider = ToolbarProvider.ctx.get(); } /** Separator orientation is perpendicular to toolbar orientation. */ private get separatorOrientation(): Orientation { - return this.root.opts.orientation.current === 'horizontal' ? 'vertical' : 'horizontal'; + return this.provider.opts.orientation.current === 'horizontal' ? 'vertical' : 'horizontal'; } readonly props = $derived.by(() => diff --git a/src/uix/soma/components/tooltip/components/tooltip-content.svelte b/src/uix/soma/components/tooltip/components/tooltip-content.svelte index 1b304ac6a..bf8ac257a 100644 --- a/src/uix/soma/components/tooltip/components/tooltip-content.svelte +++ b/src/uix/soma/components/tooltip/components/tooltip-content.svelte @@ -3,13 +3,13 @@ import { mergeProps } from '$soma/props'; import { styleToString } from '$soma/css'; import { createId } from '$soma/id'; - import { Soma } from '$soma/core/soma.svelte'; + import { getSoma } from '$soma/core/soma.svelte'; import { TooltipContentProvider } from '../tooltip-provider.svelte'; import type { TooltipContentProps } from '../types'; import { noop } from '$lib/util/funcs'; const uid = $props.id(); - const soma = Soma.getOr(); + const soma = getSoma(); let { ref = $bindable(null), @@ -28,7 +28,7 @@ hideWhenDetached = true, updatePositionStrategy = 'optimized', strategy = 'fixed', - dir = soma?.dir.current ?? 'ltr', + dir = soma.presentation.current?.dir ?? 'ltr', style = null, onEscapeKeydown = noop, escapeKeydownBehavior = 'close', @@ -74,10 +74,10 @@ {#if state.isPresent || forceMount}
    {#if child} - {@render child({ open: state.root.opts.open.current, props: mergedProps })} + {@render child({ open: state.provider.opts.open.current, props: mergedProps })} {:else}
    - {@render children?.({ open: state.root.opts.open.current })} + {@render children?.({ open: state.provider.opts.open.current })}
    {/if}
    diff --git a/src/uix/soma/components/tooltip/components/tooltip.svelte b/src/uix/soma/components/tooltip/components/tooltip.svelte index a372b9ff9..b01ada41d 100644 --- a/src/uix/soma/components/tooltip/components/tooltip.svelte +++ b/src/uix/soma/components/tooltip/components/tooltip.svelte @@ -23,9 +23,11 @@ id: readableActive(() => id), open: writableActive( () => open, - (v) => (open = v), + (v) => { + open = v; + onOpenChange(v); + }, ), - onOpenChange: readableActive(() => onOpenChange), onOpenChangeComplete: readableActive(() => onOpenChangeComplete), delayDuration: readableActive(() => delayDuration), closeDelay: readableActive(() => closeDelay), diff --git a/src/uix/soma/components/tooltip/tooltip-provider.svelte.ts b/src/uix/soma/components/tooltip/tooltip-provider.svelte.ts index 4af7773e9..7c2d4a73b 100644 --- a/src/uix/soma/components/tooltip/tooltip-provider.svelte.ts +++ b/src/uix/soma/components/tooltip/tooltip-provider.svelte.ts @@ -3,7 +3,7 @@ import { createAttrs, getDataOpenClosed } from '$soma/attrs'; import { readableActive, state, type Active, type ActiveProps, type StateProps } from '$soma/reactive'; import type { OnChangeFn, SomaKeyboardEvent, Direction, Arrayable, StyleProperties } from '$soma/types'; import { KEYS } from '$soma/keyboard'; -import { Soma } from '$soma/core/soma.svelte'; +import { getSoma } from '$soma/core/soma.svelte'; import { on } from 'svelte/events'; import { watch } from 'runed'; @@ -71,7 +71,6 @@ interface TooltipOpts closeDelay: number; disableHoverableContent: boolean | undefined; disabled: boolean | undefined; - onOpenChange: OnChangeFn; onOpenChangeComplete: OnChangeFn; }> {} @@ -82,7 +81,7 @@ export class TooltipProvider extends Provider { return new TooltipProvider(opts); } - readonly soma: Soma | undefined; + readonly config = getSoma(); readonly group: TooltipGroupProvider; readonly floatingProvider: FloatingProvider; readonly contentPresence: Presence; @@ -98,7 +97,7 @@ export class TooltipProvider extends Provider { private constructor(opts: TooltipOpts) { super(opts, 'Tooltip', 'root', attrs.root, TooltipProvider.ctx); - this.soma = Soma.getOr(); + this.group = TooltipGroupProvider.ctx.get(); this.floatingProvider = FloatingProvider.create(); @@ -131,13 +130,11 @@ export class TooltipProvider extends Provider { if (instant || this.group.isWithinSkipDelay()) { this.tooltipState = 'instant-open'; this.opts.open.current = true; - this.opts.onOpenChange.current(true); } else { this.tooltipState = 'delayed-open'; this.openTimeout = setTimeout(() => { this.tooltipState = 'instant-open'; this.opts.open.current = true; - this.opts.onOpenChange.current(true); }, this.delay); } } @@ -158,7 +155,6 @@ export class TooltipProvider extends Provider { private doClose() { this.tooltipState = 'closed'; this.opts.open.current = false; - this.opts.onOpenChange.current(false); this.group.markClosed(); } @@ -195,12 +191,12 @@ export class TooltipTriggerProvider extends Provider { return new TooltipTriggerProvider(opts); } - readonly root: TooltipProvider; + readonly provider: TooltipProvider; private constructor(opts: TooltipTriggerOpts) { super(opts, 'Tooltip', 'trigger', attrs.trigger); - this.root = TooltipProvider.ctx.get(); - this.root.triggerId.current = opts.id.current; + this.provider = TooltipProvider.ctx.get(); + this.provider.triggerId.current = opts.id.current; FloatingAnchor.create({ id: opts.id, @@ -209,34 +205,34 @@ export class TooltipTriggerProvider extends Provider { } readonly onpointerenter = () => { - this.root.handleOpen(); + this.provider.handleOpen(); }; readonly onpointerleave = () => { - this.root.handleClose(); + this.provider.handleClose(); }; readonly onfocus = () => { - this.root.handleOpen(true); + this.provider.handleOpen(true); }; readonly onblur = () => { - this.root.handleClose(); + this.provider.handleClose(); }; readonly onkeydown = (e: SomaKeyboardEvent) => { if (e.key === KEYS.ESCAPE) { - this.root.handleClose(); + this.provider.handleClose(); } }; readonly props = $derived.by(() => this.assertProps({ ...this.baseProps, - 'aria-describedby': this.root.opts.open.current - ? this.root.contentId.current || undefined + 'aria-describedby': this.provider.opts.open.current + ? this.provider.contentId.current || undefined : undefined, - 'data-state': this.root.tooltipState, + 'data-state': this.provider.tooltipState, onpointerenter: this.onpointerenter, onpointerleave: this.onpointerleave, onfocus: this.onfocus, @@ -275,16 +271,16 @@ export class TooltipContentProvider extends Provider { return new TooltipContentProvider(opts); } - readonly root: TooltipProvider; + readonly provider: TooltipProvider; readonly floating: FloatingContent; readonly dismissal: Dismissal; private constructor(opts: TooltipContentOpts) { super(opts, 'Tooltip', 'content', attrs.content, undefined, (el) => { - this.root.setContentRef(el); + this.provider.setContentRef(el); }); - this.root = TooltipProvider.ctx.get(); - this.root.contentId.current = opts.id.current; + this.provider = TooltipProvider.ctx.get(); + this.provider.contentId.current = opts.id.current; // Floating this.floating = FloatingContent.create({ @@ -305,17 +301,17 @@ export class TooltipContentProvider extends Provider { onPlaced: readableActive(() => () => {}), dir: opts.dir, style: opts.style, - enabled: readableActive(() => this.root.opts.open.current), + enabled: readableActive(() => this.provider.opts.open.current), customAnchor: readableActive(() => null), }); // Dismissal (escape only, no interact-outside for tooltip) this.dismissal = Dismissal.use({ ref: readableActive(() => opts.ref.current), - enabled: readableActive(() => this.root.opts.open.current), + enabled: readableActive(() => this.provider.opts.open.current), onEscapeKeydown: readableActive(() => (e: KeyboardEvent) => { opts.onEscapeKeydown.current(e); - if (!e.defaultPrevented) this.root.handleClose(); + if (!e.defaultPrevented) this.provider.handleClose(); }), escapeKeydownBehavior: opts.escapeKeydownBehavior, onInteractOutside: readableActive(() => () => {}), @@ -325,24 +321,24 @@ export class TooltipContentProvider extends Provider { }); } - readonly isPresent = $derived.by(() => this.root.contentPresence.isPresent); + readonly isPresent = $derived.by(() => this.provider.contentPresence.isPresent); readonly wrapperProps = $derived.by(() => ({ ...this.floating.wrapperProps, style: { ...(typeof this.floating.wrapperProps.style === 'object' ? this.floating.wrapperProps.style : {}), - 'pointer-events': this.root.hoverableDisabled ? 'none' : 'auto', + 'pointer-events': this.provider.hoverableDisabled ? 'none' : 'auto', }, })); readonly onpointerenter = () => { - if (!this.root.hoverableDisabled) { - this.root.cancelClose(); + if (!this.provider.hoverableDisabled) { + this.provider.cancelClose(); } }; readonly onpointerleave = () => { - this.root.handleClose(); + this.provider.handleClose(); }; readonly props = $derived.by(() => @@ -350,9 +346,9 @@ export class TooltipContentProvider extends Provider { ...this.baseProps, role: 'tooltip' as const, 'aria-label': this.opts.ariaLabel.current || undefined, - 'data-state': this.root.tooltipState, + 'data-state': this.provider.tooltipState, ...this.floating.props, - ...this.root.contentPresence.transitionAttrs, + ...this.provider.contentPresence.transitionAttrs, ...this.dismissal.props, onpointerenter: this.onpointerenter, onpointerleave: this.onpointerleave, diff --git a/src/uix/soma/components/tree-view/components/tree-view-branch-indicator.svelte b/src/uix/soma/components/tree-view/components/tree-view-branch-indicator.svelte index 3ac75899c..7e864c9cf 100644 --- a/src/uix/soma/components/tree-view/components/tree-view-branch-indicator.svelte +++ b/src/uix/soma/components/tree-view/components/tree-view-branch-indicator.svelte @@ -28,7 +28,7 @@ const onclick = (e: MouseEvent) => { e.stopPropagation(); if (branch.isDisabled) return; - branch.root.toggleExpand(branch.opts.value.current); + branch.provider.toggleExpand(branch.opts.value.current); }; const mergedProps = $derived(mergeProps(restProps, state.props, { onclick })); diff --git a/src/uix/soma/components/tree-view/components/tree-view.svelte b/src/uix/soma/components/tree-view/components/tree-view.svelte index 066832320..15f3146b4 100644 --- a/src/uix/soma/components/tree-view/components/tree-view.svelte +++ b/src/uix/soma/components/tree-view/components/tree-view.svelte @@ -2,13 +2,13 @@ import { readableActive, writableActive } from '$soma/reactive'; import { mergeProps } from '$soma/props'; import { createId } from '$soma/id'; - import { Soma } from '$soma/core/soma.svelte'; + import { getSoma } from '$soma/core/soma.svelte'; import { TreeViewProvider } from '../tree-view-provider.svelte'; import type { TreeViewProps } from '../types'; import { noop } from '$lib/util/funcs'; const uid = $props.id(); - const soma = Soma.getOr(); + const soma = getSoma(); let { ref = $bindable(null), @@ -16,7 +16,7 @@ expandedValue = $bindable([]), selectedValue = $bindable([]), selectionMode = 'single', - dir = soma?.dir.current ?? 'ltr', + dir = soma.presentation.current?.dir ?? 'ltr', expandOnClick = true, typeahead = true, onExpandedChange = noop, @@ -34,18 +34,22 @@ ), expandedValue: writableActive( () => expandedValue, - (v) => (expandedValue = v), + (v) => { + expandedValue = v; + onExpandedChange(v); + }, ), selectedValue: writableActive( () => selectedValue, - (v) => (selectedValue = v), + (v) => { + selectedValue = v; + onSelectionChange(v); + }, ), selectionMode: readableActive(() => selectionMode), dir: readableActive(() => dir), expandOnClick: readableActive(() => expandOnClick), typeahead: readableActive(() => typeahead), - onExpandedChange: readableActive(() => onExpandedChange), - onSelectionChange: readableActive(() => onSelectionChange), }); const mergedProps = $derived(mergeProps(restProps, state.props)); diff --git a/src/uix/soma/components/tree-view/tree-view-provider.svelte.ts b/src/uix/soma/components/tree-view/tree-view-provider.svelte.ts index b0a994683..dc701c005 100644 --- a/src/uix/soma/components/tree-view/tree-view-provider.svelte.ts +++ b/src/uix/soma/components/tree-view/tree-view-provider.svelte.ts @@ -1,9 +1,10 @@ import { Provider, context, type WithRefOpts } from '$soma/provider'; import { createAttrs, boolToEmptyStrOrUndef } from '$soma/attrs'; import { state, type Active, type ActiveProps, type StateProps } from '$soma/reactive'; -import type { OnChangeFn, Direction, SomaKeyboardEvent, SomaMouseEvent } from '$soma/types'; +import type { Direction, SomaKeyboardEvent, SomaMouseEvent } from '$soma/types'; import { KEYS } from '$soma/keyboard'; -import { Soma } from '$soma/core/soma.svelte'; +import { getSoma } from '$soma/core/soma.svelte'; +import { resolveSomaTranslationPath } from '$soma/core/translator.svelte'; const attrs = createAttrs({ component: 'tree-view', @@ -25,8 +26,6 @@ interface TreeViewOpts dir: Direction; expandOnClick: boolean; typeahead: boolean; - onExpandedChange: OnChangeFn; - onSelectionChange: OnChangeFn; }> {} export class TreeViewProvider extends Provider { @@ -36,7 +35,7 @@ export class TreeViewProvider extends Provider { return new TreeViewProvider(opts); } - readonly soma: Soma | undefined; + readonly config = getSoma(); // Focus tracking focusedValue = $state(null); @@ -47,7 +46,7 @@ export class TreeViewProvider extends Provider { private constructor(opts: TreeViewOpts) { super(opts, 'TreeView', 'root', attrs.root, TreeViewProvider.ctx); - this.soma = Soma.getOr(); + } // ── Expand ─────────────────────────────────────────────────────────────── @@ -62,7 +61,6 @@ export class TreeViewProvider extends Provider { ? current.filter((v) => v !== value) : [...current, value]; this.opts.expandedValue.current = next; - this.opts.onExpandedChange.current(next); } expand(value: string) { @@ -90,7 +88,6 @@ export class TreeViewProvider extends Provider { const current = this.opts.expandedValue.current; const next = [...new Set([...current, ...values])]; this.opts.expandedValue.current = next; - this.opts.onExpandedChange.current(next); } // ── Select ─────────────────────────────────────────────────────────────── @@ -109,7 +106,6 @@ export class TreeViewProvider extends Provider { : [...this.opts.selectedValue.current, value]; } this.opts.selectedValue.current = next; - this.opts.onSelectionChange.current(next); } // ── Focus & navigation ─────────────────────────────────────────────────── @@ -239,7 +235,7 @@ export class TreeViewProvider extends Provider { ...this.baseProps, role: 'tree' as const, 'aria-multiselectable': this.opts.selectionMode.current === 'multiple' || undefined, - 'aria-label': this.soma?.translate('tree-view.label', 'Tree') ?? 'Tree', + 'aria-label': resolveSomaTranslationPath('soma.tree-view.label', this.config.translator.current, 'Tree'), onkeydown: this.onkeydown, } as const), ); @@ -262,19 +258,19 @@ export class TreeViewBranchProvider extends Provider { return new TreeViewBranchProvider(opts); } - readonly root: TreeViewProvider; + readonly provider: TreeViewProvider; private constructor(opts: TreeViewBranchOpts) { super(opts, 'TreeView', 'branch', attrs.branch, TreeViewBranchProvider.ctx); - this.root = TreeViewProvider.ctx.get(); + this.provider = TreeViewProvider.ctx.get(); } readonly isExpanded = $derived.by( - () => this.root.isExpanded(this.opts.value.current), + () => this.provider.isExpanded(this.opts.value.current), ); readonly isSelected = $derived.by( - () => this.root.isSelected(this.opts.value.current), + () => this.provider.isSelected(this.opts.value.current), ); readonly isDisabled = $derived.by(() => this.opts.disabled.current); @@ -304,20 +300,20 @@ export class TreeViewBranchControlProvider extends Provider) => { if (this.branch.isDisabled) return; - if (this.root.opts.expandOnClick.current) { - this.root.toggleExpand(this.branch.opts.value.current); + if (this.provider.opts.expandOnClick.current) { + this.provider.toggleExpand(this.branch.opts.value.current); } - this.root.select(this.branch.opts.value.current); + this.provider.select(this.branch.opts.value.current); }; readonly props = $derived.by(() => @@ -328,7 +324,7 @@ export class TreeViewBranchControlProvider extends Provider { return new TreeViewItemProvider(opts); } - readonly root: TreeViewProvider; + readonly provider: TreeViewProvider; private constructor(opts: TreeViewItemOpts) { super(opts, 'TreeView', 'item', attrs.item); - this.root = TreeViewProvider.ctx.get(); + this.provider = TreeViewProvider.ctx.get(); } readonly isSelected = $derived.by( - () => this.root.isSelected(this.opts.value.current), + () => this.provider.isSelected(this.opts.value.current), ); readonly isDisabled = $derived.by(() => this.opts.disabled.current); readonly onclick = (_e: SomaMouseEvent) => { if (this.isDisabled) return; - this.root.select(this.opts.value.current); + this.provider.select(this.opts.value.current); }; readonly props = $derived.by(() => @@ -455,7 +451,7 @@ export class TreeViewItemProvider extends Provider { 'aria-selected': this.isSelected, 'aria-level': this.opts.depth.current + 1, 'aria-disabled': this.isDisabled || undefined, - tabindex: this.root.focusedValue === this.opts.value.current ? 0 : -1, + tabindex: this.provider.focusedValue === this.opts.value.current ? 0 : -1, 'data-value': this.opts.value.current, 'data-selected': boolToEmptyStrOrUndef(this.isSelected), 'data-disabled': boolToEmptyStrOrUndef(this.isDisabled), diff --git a/src/uix/soma/core/currency-formatter.svelte.ts b/src/uix/soma/core/currency-formatter.svelte.ts new file mode 100644 index 000000000..68ea2f972 --- /dev/null +++ b/src/uix/soma/core/currency-formatter.svelte.ts @@ -0,0 +1,10 @@ +import type { SomaCurrencyFormatter } from '$soma/types'; +import { createSomaFormatter, type SomaFormatterSource } from './formatter.svelte'; + +export type SomaCurrencyFormatterSource = SomaFormatterSource; + +export function createSomaCurrencyFormatter( + source: SomaCurrencyFormatterSource, +): SomaCurrencyFormatter { + return createSomaFormatter(source); +} diff --git a/src/uix/soma/core/date-time-formatter.svelte.ts b/src/uix/soma/core/date-time-formatter.svelte.ts new file mode 100644 index 000000000..4c11f0a24 --- /dev/null +++ b/src/uix/soma/core/date-time-formatter.svelte.ts @@ -0,0 +1,21 @@ +import type { Getter } from '$soma/reactive'; +import type { SomaDateTimeFormatter } from '$soma/types'; +import type { DateOrder, HourCycle } from '$soma/external/dates'; + +export type SomaDateTimeFormatterSource = { + dateOrder?: Getter; + hourCycle?: Getter; +}; + +export function createSomaDateTimeFormatter( + source: SomaDateTimeFormatterSource, +): SomaDateTimeFormatter { + return { + getDateOrder() { + return source.dateOrder?.(); + }, + getHourCycle() { + return source.hourCycle?.(); + }, + }; +} diff --git a/src/uix/soma/core/formatter.svelte.ts b/src/uix/soma/core/formatter.svelte.ts new file mode 100644 index 000000000..e0cd1bd76 --- /dev/null +++ b/src/uix/soma/core/formatter.svelte.ts @@ -0,0 +1,14 @@ +import type { Getter } from '$soma/reactive'; +import type { SomaFormatter } from '$soma/types'; + +export type SomaFormatterSource = { + format: Getter<(...args: unknown[]) => string>; +}; + +export function createSomaFormatter(source: SomaFormatterSource): SomaFormatter { + return { + format(...args: unknown[]) { + return source.format()(...args); + }, + }; +} diff --git a/src/uix/soma/core/number-formatter.svelte.ts b/src/uix/soma/core/number-formatter.svelte.ts new file mode 100644 index 000000000..afc64c3ec --- /dev/null +++ b/src/uix/soma/core/number-formatter.svelte.ts @@ -0,0 +1,10 @@ +import type { SomaNumberFormatter } from '$soma/types'; +import { createSomaFormatter, type SomaFormatterSource } from './formatter.svelte'; + +export type SomaNumberFormatterSource = SomaFormatterSource; + +export function createSomaNumberFormatter( + source: SomaNumberFormatterSource, +): SomaNumberFormatter { + return createSomaFormatter(source); +} diff --git a/src/uix/soma/core/prop-resolvers.ts b/src/uix/soma/core/prop-resolvers.ts new file mode 100644 index 000000000..d7075cc20 --- /dev/null +++ b/src/uix/soma/core/prop-resolvers.ts @@ -0,0 +1,65 @@ +import { readableActive, type Active, type Getter } from '$soma/reactive'; +import type { Direction } from '$soma/types'; +import { + DEFAULT_DATE_ORDER, + DEFAULT_TIME_FORMAT, + timeFormatToHourCycle, + type HourCycle +} from '$soma/external/dates'; +import { getSoma } from './soma.svelte'; + +type SomaOpts = ReturnType; + +function createPropResolver(configOption: (config: SomaOpts) => T | undefined, fallback: T) { + return (getProp: Getter): Active => { + const config = getSoma(); + return readableActive(() => { + const propValue = getProp(); + if (propValue !== undefined) return propValue; + + const option = configOption(config); + if (option !== undefined) return option; + + return fallback; + }); + }; +} + +export const resolveLocaleProp = createPropResolver((config) => { + const locale = config.translator.current.getLocale(); + return locale || undefined; +}, ''); + +export const resolveDirectionProp = createPropResolver( + (config) => config.presentation.current?.dir, + 'ltr' as Direction +); + +export const resolvePortalToProp = createPropResolver( + (config) => config.portalTo.current as string | undefined, + 'body' +); + +export const resolveDateOrderProp = createPropResolver( + (config) => config.presentation.current?.dateTimeFormatter?.getDateOrder(), + DEFAULT_DATE_ORDER +); + +export function resolveHourCycleProp( + getTimeFormat: Getter, + getHourCycle: Getter +): Active { + const config = getSoma(); + return readableActive(() => { + const timeFormat = getTimeFormat(); + if (timeFormat !== undefined) return timeFormatToHourCycle(timeFormat); + + const hourCycle = getHourCycle(); + if (hourCycle !== undefined) return hourCycle; + + const configTimeFormat = config.presentation.current?.dateTimeFormatter?.getHourCycle(); + if (configTimeFormat !== undefined) return configTimeFormat; + + return timeFormatToHourCycle(DEFAULT_TIME_FORMAT); + }); +} diff --git a/src/uix/soma/core/soma.svelte.ts b/src/uix/soma/core/soma.svelte.ts index 319a1f8cd..b622a81d3 100644 --- a/src/uix/soma/core/soma.svelte.ts +++ b/src/uix/soma/core/soma.svelte.ts @@ -1,78 +1,84 @@ -import { context } from '$soma/provider'; -import { readableActive, type Active } from '$soma/reactive'; -import type { Direction } from '$soma/types'; -import type { SomaProps, SomaTranslator, SomaLogger, SomaFormat } from '$soma/types'; - -/** - * # Soma — the root instance - * - * Soma is the runtime identity of the framework. It provides services - * (translator, logger, format, dir, portalTo) to all components via context. - * - * ## Setup - * - * ```svelte - * - * - * - * ``` - * - * ## Access in Providers - * - * ```ts - * readonly soma = Soma.getOr(); - * const label = this.soma?.translate('dialog.close', 'Close'); - * const dateOrder = Soma.resolve(opts.dateOrder, () => this.soma?.format.current?.date?.getDateOrder(), 'DMY'); - * ``` - */ -export class Soma { - static readonly ctx = context('Soma'); +import { Context } from 'runed'; +import { readableActive, type Active, type ActiveProps } from '$soma/reactive'; +import type { SomaPropsWithoutChildren, SomaTranslator } from '$soma/types'; +import { fallbackTranslator } from './translator.svelte'; - static create(props: SomaProps): Soma { - return Soma.ctx.set(new Soma(props)); - } +// ── Types ──────────────────────────────────────────────────────────────────── + +type SomaStateProps = ActiveProps; + +type SomaResolvedStateProps = Omit, 'translator'> & { + translator: Active; +}; + +// ── Soma class ─────────────────────────────────────────────────────────────── - static get(): Soma { - return Soma.ctx.get(); +const _ctx = new Context('Soma'); + +export class Soma { + static readonly ctx = { + set: (value: Soma) => _ctx.set(value), + get: () => _ctx.get(), + getOr: (fallback: U) => _ctx.getOr(fallback) + }; + + static create(opts: SomaStateProps): Soma { + const instance = new Soma(Soma.ctx.getOr(null) as Soma | null, opts); + return Soma.ctx.set(instance); } static getOr(): Soma | undefined { return Soma.ctx.getOr(undefined) as Soma | undefined; } - /** - * Generic prop resolver. Priority: explicit prop → config value → fallback. - * - * ```ts - * const dateOrder = Soma.resolve(opts.dateOrder, () => soma?.format.current?.date?.getDateOrder(), 'DMY'); - * ``` - */ - static resolve( - prop: Active, - fromConfig: () => T | undefined, - fallback: T, - ): Active { - return readableActive(() => prop.current ?? fromConfig() ?? fallback); + readonly opts: SomaResolvedStateProps; + + constructor(parent: Soma | null, opts: SomaStateProps) { + const resolveOption = createResolver(parent, opts); + this.opts = { + portalTo: resolveOption((config) => config.portalTo), + translator: readableActive( + () => resolveOption((config) => config.translator).current ?? fallbackTranslator + ), + presentation: resolveOption((config) => config.presentation), + logger: resolveOption((config) => config.logger) + }; } +} - // ── Instance ───────────────────────────────────────────────────────────── +// ── Convenience functions ──────────────────────────────────────────────────── - readonly dir: Active; - readonly translator: Active; - readonly logger: Active; - readonly portalTo: Active; - readonly format: Active; +export function getSoma(): SomaResolvedStateProps { + const instance = Soma.getOr(); + if (instance) return instance.opts; + return new Soma(null, {}).opts; +} - private constructor(props: SomaProps) { - this.dir = readableActive(() => props.dir ?? 'ltr'); - this.translator = readableActive(() => props.translator); - this.logger = readableActive(() => props.logger); - this.portalTo = readableActive(() => props.portalTo); - this.format = readableActive(() => props.format); - } +export function createSoma(opts: SomaStateProps): Soma { + return Soma.create(opts); +} - /** Translate a path with fallback. Returns fallback if no translator configured. */ - translate(path: string, fallback: string): string { - return this.translator.current?.translatePath(path) || fallback; - } +export function useSoma(props: Partial): Soma { + return Soma.create({ + portalTo: readableActive(() => props.portalTo), + translator: readableActive(() => props.translator), + presentation: readableActive(() => props.presentation), + logger: readableActive(() => props.logger) + }); +} + +// ── Resolver ───────────────────────────────────────────────────────────────── + +type OptionGetter = (props: SomaStateProps) => Active | undefined; +type OptionResolver = (getter: OptionGetter) => Active; + +function createResolver(parent: Soma | null, currentOpts: SomaStateProps): OptionResolver { + return (getter: OptionGetter) => { + return readableActive(() => { + const value = getter(currentOpts)?.current; + if (value !== undefined) return value; + if (parent === null) return undefined; + return getter(parent.opts)?.current; + }); + }; } diff --git a/src/uix/soma/core/translator.svelte.ts b/src/uix/soma/core/translator.svelte.ts new file mode 100644 index 000000000..c69f86c29 --- /dev/null +++ b/src/uix/soma/core/translator.svelte.ts @@ -0,0 +1,193 @@ +import type { Getter } from '$soma/reactive'; +import type { + SomaTranslator, + SomaTranslationDescriptor, + SomaTranslationModule, + SomaTranslationValue, + SomaTranslationParams +} from '$soma/types'; +import { interpolateTemplate } from '$lib/ext/lang/lib/helpers'; + +// ── Adapter source ─────────────────────────────────────────────────────────── + +type SomaTranslatorRuntime = { + extend?: (...args: any[]) => void; + onSchemaChange?: (callback: () => void) => (() => void) | void; +}; + +export type SomaTranslatorSource = { + locale: Getter; + translate?: Getter<(value: any) => string>; + translatePath?: Getter<(path: string, ...args: unknown[]) => string>; + runtime?: Getter; +}; + +// ── Constants ──────────────────────────────────────────────────────────────── + +const TRANSLATION_ID_PREFIX = '#?'; +const TRANSLATION_ID_FALLBACK_SEPARATOR = '|'; + +// ── Factory ────────────────────────────────────────────────────────────────── + +export function createSomaTranslator(source: SomaTranslatorSource): SomaTranslator { + let schemaVersion = $state(0); + + const runtime = source.runtime?.(); + const dispose = runtime?.onSchemaChange?.(() => { + schemaVersion += 1; + }); + + if (dispose) { + try { + $effect(() => dispose); + } catch { + // Not in component context — skip cleanup + } + } + + return { + getLocale() { + schemaVersion; + return source.locale(); + }, + translate(value: SomaTranslationValue) { + const locale = source.locale(); + schemaVersion; + if (isTranslationDescriptor(value)) { + const translatePath = source.translatePath?.(); + return resolveTranslationDescriptor(value, locale, translatePath); + } + const translate = source.translate?.(); + if (translate) return translate(value); + return resolveTranslationFallback(value, locale) ?? String(value ?? ''); + }, + translatePath(path: string, ...args: unknown[]) { + source.locale(); + schemaVersion; + const translatePath = source.translatePath?.(); + return translatePath ? translatePath(path, ...args) : path; + }, + extend(namespace: string, module: SomaTranslationModule) { + runtime?.extend?.(namespace, module); + } + }; +} + +// ── Fallback translator ────────────────────────────────────────────────────── + +export const fallbackTranslator: SomaTranslator = { + getLocale() { + return ''; + }, + translate(value: SomaTranslationValue) { + if (isTranslationDescriptor(value)) { + return resolveTranslationDescriptor(value); + } + return resolveTranslationFallback(value) ?? String(value ?? ''); + }, + translatePath(path: string) { + return path; + } +}; + +// ── Helpers ────────────────────────────────────────────────────────────────── + +export function extendSomaTranslationModule( + target: Pick | Pick, + module: SomaTranslationModule, + namespace = 'soma' +) { + target.extend?.(namespace, module); +} + +export function resolveSomaTranslation( + value: SomaTranslationValue, + translator: SomaTranslator | undefined, + fallback = '' +): string { + if (translator) return translator.translate(value); + if (isTranslationDescriptor(value)) { + const descriptorFallback = fallback === '' ? value.path : fallback; + return ( + resolveTranslationFallback(value.fallback, undefined, value.params) ?? descriptorFallback + ); + } + return resolveTranslationFallback(value) ?? fallback; +} + +export function resolveSomaTranslationPath( + path: string, + translator: SomaTranslator | undefined, + fallback = path, + ...args: unknown[] +): string { + if (!translator) return fallback; + return translator.translatePath(path, ...args); +} + +// ── Internal ───────────────────────────────────────────────────────────────── + +function getInlineTranslationFallback(value: unknown): string | undefined { + if (typeof value !== 'string') return undefined; + if (!value.startsWith(TRANSLATION_ID_PREFIX)) return undefined; + + const raw = value.slice(TRANSLATION_ID_PREFIX.length); + const separatorIndex = raw.indexOf(TRANSLATION_ID_FALLBACK_SEPARATOR); + if (separatorIndex === -1) return undefined; + + return raw.slice(separatorIndex + 1); +} + +function isTranslationDescriptor(value: unknown): value is SomaTranslationDescriptor { + return !!value && typeof value === 'object' && 'path' in value && typeof value.path === 'string'; +} + +function toShortLocale(locale: string): string { + return locale.toLowerCase().split('-')[0]; +} + +function resolveRecordFallback( + record: Record, + locale: string | undefined, + params?: SomaTranslationParams +): string | undefined { + if (locale) { + const short = toShortLocale(locale); + const value = record[locale] ?? record[short]; + if (typeof value === 'string') return interpolateTemplate(value, params); + } + const first = Object.values(record)[0]; + return typeof first === 'string' ? interpolateTemplate(first, params) : undefined; +} + +function resolveTranslationFallback( + value: unknown, + locale?: string, + params?: SomaTranslationParams +): string | undefined { + if (value == null) return undefined; + if (typeof value === 'string') { + const inlineFallback = getInlineTranslationFallback(value); + return interpolateTemplate(inlineFallback ?? value, params); + } + if (typeof value === 'object' && !Array.isArray(value)) { + return resolveRecordFallback(value as Record, locale, params); + } + return undefined; +} + +function resolveTranslationDescriptor( + value: SomaTranslationDescriptor, + locale?: string, + translatePath?: (path: string, ...args: unknown[]) => string +): string { + if (translatePath) { + const resolved = value.params + ? translatePath(value.path, value.params) + : translatePath(value.path); + + if (resolved !== value.path) return resolved; + } + + return resolveTranslationFallback(value.fallback, locale, value.params) ?? value.path; +} diff --git a/src/uix/soma/core/unit-formatter.svelte.ts b/src/uix/soma/core/unit-formatter.svelte.ts new file mode 100644 index 000000000..0b39e1689 --- /dev/null +++ b/src/uix/soma/core/unit-formatter.svelte.ts @@ -0,0 +1,10 @@ +import type { SomaUnitFormatter } from '$soma/types'; +import { createSomaFormatter, type SomaFormatterSource } from './formatter.svelte'; + +export type SomaUnitFormatterSource = SomaFormatterSource; + +export function createSomaUnitFormatter( + source: SomaUnitFormatterSource, +): SomaUnitFormatter { + return createSomaFormatter(source); +} diff --git a/src/uix/soma/external/dates/adapter.ts b/src/uix/soma/external/dates/adapter.ts index 1a076712f..4ef3d076a 100644 --- a/src/uix/soma/external/dates/adapter.ts +++ b/src/uix/soma/external/dates/adapter.ts @@ -1,7 +1,7 @@ /** * # Date format adapter * - * Bridges `DatiInstance` (from @/glob/lib) to `SomaDateFormat` (soma contract). + * Bridges `DatiInstance` (from @/glob/lib) to `SomaDateTimeFormatter` (soma contract). * * This is the only file in soma that knows about `DatiInstance`. * If the glob library changes, only this adapter needs updating. @@ -13,14 +13,14 @@ * import { createSomaDateFormat } from '$soma/external/dates/adapter'; * * const dati = createDati({ selectedDateOrder: 'DMY', selectedTimeFormat: '24h' }); - * const somaDateFormat = createSomaDateFormat(dati); + * const dateTimeFormatter = createSomaDateFormat(dati); * * // Pass to Soma - * + * * ``` */ -import type { SomaDateFormat } from '$soma/types'; +import type { SomaDateTimeFormatter } from '$soma/types'; import type { DatiInstance } from '@/glob/lib'; import type { HourCycle, DateOrder } from './index'; @@ -30,12 +30,12 @@ function timeFormatToHourCycle(format: string): HourCycle { } /** - * Creates a `SomaDateFormat` from a `DatiInstance`. + * Creates a `SomaDateTimeFormatter` from a `DatiInstance`. * * The adapter reads dateOrder and timeFormat from the dati instance, * converting them to soma's contract types. */ -export function createSomaDateFormat(dati: DatiInstance): SomaDateFormat { +export function createSomaDateFormat(dati: DatiInstance): SomaDateTimeFormatter { return { getDateOrder(): DateOrder { return dati.getDateOrder(); diff --git a/src/uix/soma/index.ts b/src/uix/soma/index.ts index bfccf0d54..fe0234559 100644 --- a/src/uix/soma/index.ts +++ b/src/uix/soma/index.ts @@ -86,14 +86,25 @@ export type { } from './types'; // ── Soma (root instance) ───────────────────────────────────────────────────── -export { Soma } from './core/soma.svelte'; +export { Soma, getSoma, createSoma, useSoma } from './core/soma.svelte'; +export { resolveLocaleProp, resolveDirectionProp, resolvePortalToProp, resolveDateOrderProp, resolveHourCycleProp } from './core/prop-resolvers'; +export { createSomaTranslator, fallbackTranslator, extendSomaTranslationModule, resolveSomaTranslation, resolveSomaTranslationPath } from './core/translator.svelte'; +export { createSomaNumberFormatter } from './core/number-formatter.svelte'; +export { createSomaCurrencyFormatter } from './core/currency-formatter.svelte'; +export { createSomaUnitFormatter } from './core/unit-formatter.svelte'; +export { createSomaDateTimeFormatter } from './core/date-time-formatter.svelte'; export type { SomaProps, + SomaPropsWithoutChildren, SomaTranslator, + SomaTranslationValue, + SomaTranslationFallback, + SomaTranslationDescriptor, SomaLogger, - SomaFormat, - SomaDateFormat, - SomaNumberFormat, - SomaCurrencyFormat, - SomaUnitFormat, + SomaFormatter, + SomaNumberFormatter, + SomaCurrencyFormatter, + SomaUnitFormatter, + SomaDateTimeFormatter, + SomaPresentationConfig, } from './types'; diff --git a/src/uix/soma/layers/floating/floating.svelte.ts b/src/uix/soma/layers/floating/floating.svelte.ts index 7c8f0b725..4a0190d1c 100644 --- a/src/uix/soma/layers/floating/floating.svelte.ts +++ b/src/uix/soma/layers/floating/floating.svelte.ts @@ -8,7 +8,7 @@ import { limitShift, offset, shift, - size, + size } from '@floating-ui/dom'; import { attachRef, type RefAttachment } from '$soma/provider'; import { cssToStyleObj, styleToString } from '$soma/css'; @@ -31,7 +31,7 @@ const OPPOSITE_SIDE: Record = { top: 'bottom', right: 'left', bottom: 'top', - left: 'right', + left: 'right' }; export type Side = (typeof SIDE_OPTIONS)[number]; export type Align = (typeof ALIGN_OPTIONS)[number]; @@ -55,7 +55,11 @@ export class FloatingProvider { $effect(() => { if (this.customAnchorNode.current) { if (typeof this.customAnchorNode.current === 'string') { - this.anchorNode.current = document.querySelector(this.customAnchorNode.current); + const el = + typeof document !== 'undefined' + ? document.querySelector(this.customAnchorNode.current) + : null; + this.anchorNode.current = el; } else { this.anchorNode.current = this.customAnchorNode.current; } @@ -68,36 +72,33 @@ export class FloatingProvider { // ── FloatingContent ────────────────────────────────────────────────────────── -export interface FloatingContentOpts - extends ActiveProps<{ - id: string; - wrapperId: string; - side: Side; - sideOffset: number; - align: Align; - alignOffset: number; - arrowPadding: number; - avoidCollisions: boolean; - collisionBoundary: Arrayable; - collisionPadding: number | Partial>; - sticky: 'partial' | 'always'; - hideWhenDetached: boolean; - updatePositionStrategy: 'optimized' | 'always'; - strategy: 'fixed' | 'absolute'; - onPlaced: () => void; - dir: Direction; - style: StyleProperties | null | undefined | string; - enabled: boolean; - customAnchor: string | HTMLElement | null | Measurable; - }> {} +export interface FloatingContentOpts extends ActiveProps<{ + id: string; + wrapperId: string; + side: Side; + sideOffset: number; + align: Align; + alignOffset: number; + arrowPadding: number; + avoidCollisions: boolean; + collisionBoundary: Arrayable; + collisionPadding: number | Partial>; + sticky: 'partial' | 'always'; + hideWhenDetached: boolean; + updatePositionStrategy: 'optimized' | 'always'; + strategy: 'fixed' | 'absolute'; + onPlaced: () => void; + dir: Direction; + style: StyleProperties | null | undefined | string; + enabled: boolean; + customAnchor: string | HTMLElement | null | Measurable; +}> {} export class FloatingContent { static readonly ctx = context('FloatingContent'); static create(opts: FloatingContentOpts) { - return FloatingContent.ctx.set( - new FloatingContent(opts, FloatingProvider.ctx.get()), - ); + return FloatingContent.ctx.set(new FloatingContent(opts, FloatingProvider.ctx.get())); } readonly opts: FloatingContentOpts; @@ -119,28 +120,25 @@ export class FloatingContent { if (!this.opts.style) return {}; }); - updatePositionStrategy = - undefined as unknown as FloatingContentOpts['updatePositionStrategy']; + updatePositionStrategy = undefined as unknown as FloatingContentOpts['updatePositionStrategy']; arrowSize = new ElementSize(() => this.arrowRef.current ?? undefined); arrowWidth = $derived(this.arrowSize?.width ?? 0); arrowHeight = $derived(this.arrowSize?.height ?? 0); desiredPlacement = $derived.by( () => (this.opts.side?.current + - (this.opts.align.current !== 'center' - ? `-${this.opts.align.current}` - : '')) as Placement, + (this.opts.align.current !== 'center' ? `-${this.opts.align.current}` : '')) as Placement ); boundary = $derived.by(() => Array.isArray(this.opts.collisionBoundary.current) ? this.opts.collisionBoundary.current - : [this.opts.collisionBoundary.current], + : [this.opts.collisionBoundary.current] ); hasExplicitBoundaries = $derived(this.boundary.length > 0); detectOverflowOptions = $derived.by(() => ({ padding: this.opts.collisionPadding.current, boundary: this.boundary.filter(isNotNull), - altBoundary: this.hasExplicitBoundaries, + altBoundary: this.hasExplicitBoundaries })); availableWidth = $state(undefined); availableHeight = $state(undefined); @@ -151,14 +149,14 @@ export class FloatingContent { [ offset({ mainAxis: this.opts.sideOffset.current + this.arrowHeight, - alignmentAxis: this.opts.alignOffset.current, + alignmentAxis: this.opts.alignOffset.current }), this.opts.avoidCollisions.current && shift({ mainAxis: true, crossAxis: false, limiter: this.opts.sticky.current === 'partial' ? limitShift() : undefined, - ...this.detectOverflowOptions, + ...this.detectOverflowOptions }), this.opts.avoidCollisions.current && flip({ ...this.detectOverflowOptions }), size({ @@ -169,17 +167,17 @@ export class FloatingContent { this.availableHeight = availableHeight; this.anchorWidth = anchorWidth; this.anchorHeight = anchorHeight; - }, + } }), this.arrowRef.current && arrow({ element: this.arrowRef.current, - padding: this.opts.arrowPadding.current, + padding: this.opts.arrowPadding.current }), transformOrigin({ arrowWidth: this.arrowWidth, arrowHeight: this.arrowHeight }), this.opts.hideWhenDetached.current && - hide({ strategy: 'referenceHidden', ...this.detectOverflowOptions }), - ].filter(Boolean) as Middleware[], + hide({ strategy: 'referenceHidden', ...this.detectOverflowOptions }) + ].filter(Boolean) as Middleware[] ); floating: UseFloatingReturn; placedSide = $derived.by(() => getSideFromPlacement(this.floating.placement.current)); @@ -187,7 +185,7 @@ export class FloatingContent { arrowX = $derived.by(() => this.floating.middlewareData.current.arrow?.x ?? 0); arrowY = $derived.by(() => this.floating.middlewareData.current.arrow?.y ?? 0); cannotCenterArrow = $derived.by( - () => this.floating.middlewareData.current.arrow?.centerOffset !== 0, + () => this.floating.middlewareData.current.arrow?.centerOffset !== 0 ); contentZIndex = $state(); arrowBaseSide = $derived(OPPOSITE_SIDE[this.placedSide]); @@ -202,7 +200,8 @@ export class FloatingContent { ? this.floating.floatingStyles.current.transform : 'translate(0, -200%)', minWidth: 'max-content', - zIndex: this.contentZIndex && this.contentZIndex !== 'auto' ? this.contentZIndex : undefined, + zIndex: + this.contentZIndex && this.contentZIndex !== 'auto' ? this.contentZIndex : undefined, '--soma-floating-transform-origin': `${this.floating.middlewareData.current.transformOrigin?.x} ${this.floating.middlewareData.current.transformOrigin?.y}`, '--soma-floating-available-width': `${this.availableWidth}px`, '--soma-floating-available-height': `${this.availableHeight}px`, @@ -210,13 +209,13 @@ export class FloatingContent { '--soma-floating-anchor-height': `${this.anchorHeight}px`, ...(this.floating.middlewareData.current.hide?.referenceHidden && { visibility: 'hidden', - 'pointer-events': 'none', + 'pointer-events': 'none' }), - ...this.transformedStyle, + ...this.transformedStyle }, dir: this.opts.dir.current, - ...this.wrapperAttachment, - }) as const, + ...this.wrapperAttachment + }) as const ); props = $derived.by( () => @@ -224,10 +223,10 @@ export class FloatingContent { 'data-side': this.placedSide, 'data-align': this.placedAlign, style: styleToString({ - ...this.transformedStyle, + ...this.transformedStyle }), - ...this.contentAttachment, - }) as const, + ...this.contentAttachment + }) as const ); arrowStyle = $derived({ @@ -239,15 +238,15 @@ export class FloatingContent { top: '', right: '0 0', bottom: 'center 0', - left: '100% 0', + left: '100% 0' }[this.placedSide], transform: { top: 'translateY(100%)', right: 'translateY(50%) rotate(90deg) translateX(-50%)', bottom: 'rotate(180deg)', - left: 'translateY(50%) rotate(-90deg) translateX(50%)', + left: 'translateY(50%) rotate(-90deg) translateX(50%)' }[this.placedSide], - visibility: this.cannotCenterArrow ? ('hidden' as const) : undefined, + visibility: this.cannotCenterArrow ? ('hidden' as const) : undefined }); private constructor(opts: FloatingContentOpts, provider: FloatingProvider) { @@ -263,7 +262,7 @@ export class FloatingContent { () => opts.customAnchor.current, (customAnchor) => { this.provider.customAnchorNode.current = customAnchor; - }, + } ); this.floating = useFloating({ @@ -273,13 +272,13 @@ export class FloatingContent { reference: this.provider.anchorNode, whileElementsMounted: (...args) => { const cleanup = autoUpdate(...args, { - animationFrame: this.updatePositionStrategy?.current === 'always', + animationFrame: this.updatePositionStrategy?.current === 'always' }); return cleanup; }, open: () => this.opts.enabled.current, sideOffset: () => this.opts.sideOffset.current, - alignOffset: () => this.opts.alignOffset.current, + alignOffset: () => this.opts.alignOffset.current }); $effect(() => { @@ -293,8 +292,7 @@ export class FloatingContent { if (!contentNode || !this.opts.enabled.current) return; const win = getWindow(contentNode); const rafId = win.requestAnimationFrame(() => { - if (this.contentRef.current !== contentNode || !this.opts.enabled.current) - return; + if (this.contentRef.current !== contentNode || !this.opts.enabled.current) return; const zIndex = win.getComputedStyle(contentNode).zIndex; if (zIndex !== this.contentZIndex) { this.contentZIndex = zIndex; @@ -304,7 +302,7 @@ export class FloatingContent { return () => { win.cancelAnimationFrame(rafId); }; - }, + } ); $effect(() => { @@ -336,19 +334,18 @@ export class FloatingArrow { id: this.opts.id.current, style: this.content.arrowStyle, 'data-side': this.content.placedSide, - ...this.content.arrowAttachment, - }) as const, + ...this.content.arrowAttachment + }) as const ); } // ── FloatingAnchor ─────────────────────────────────────────────────────────── -interface FloatingAnchorOpts - extends ActiveProps<{ - id: string; - virtualEl?: Measurable | null; - ref: Measurable | HTMLElement | null; - }> {} +interface FloatingAnchorOpts extends ActiveProps<{ + id: string; + virtualEl?: Measurable | null; + ref: Measurable | HTMLElement | null; +}> {} export class FloatingAnchor { static create(opts: FloatingAnchorOpts) { @@ -407,7 +404,7 @@ function transformOrigin(options: { arrowWidth: number; arrowHeight: number }): y = isArrowHidden ? noArrowAlign : `${arrowYCenter}px`; } return { data: { x, y } }; - }, + } }; } diff --git a/src/uix/soma/layers/scroll-lock.svelte.ts b/src/uix/soma/layers/scroll-lock.svelte.ts index f278fa501..4ccdb6e1a 100644 --- a/src/uix/soma/layers/scroll-lock.svelte.ts +++ b/src/uix/soma/layers/scroll-lock.svelte.ts @@ -130,7 +130,7 @@ function ensureGlobalWatch() { if (e.touches.length > 1) return; e.preventDefault(); }, - { passive: false }, + { passive: false } ); } @@ -138,7 +138,7 @@ function ensureGlobalWatch() { document.body.style.pointerEvents = 'none'; document.body.style.overflow = 'hidden'; }); - }, + } ); } @@ -148,7 +148,7 @@ export class ScrollLock { constructor( initialState?: boolean, - private readonly restoreScrollDelay: () => number | null = () => null, + private readonly restoreScrollDelay: () => number | null = () => null ) { ensureGlobalWatch(); cancelPendingCleanup(); @@ -157,7 +157,7 @@ export class ScrollLock { this.locked = writableActive( () => lockMap.get(this.id) ?? false, - (v: boolean) => lockMap.set(this.id, v), + (v: boolean) => lockMap.set(this.id, v) ); $effect(() => () => { @@ -166,4 +166,14 @@ export class ScrollLock { scheduleCleanupIfNoNewLocks(this.restoreScrollDelay(), resetBodyStyle); }); } + + static reset() { + lockMap.clear(); + cancelPendingCleanup(); + resetBodyStyle(); + initialBodyStyle = null; + isInCleanupTransition = false; + cleanupScheduledAt = null; + watchInitialized = false; + } } diff --git a/src/uix/soma/provider/provider.svelte.ts b/src/uix/soma/provider/provider.svelte.ts index 406c7a18d..f0eed176b 100644 --- a/src/uix/soma/provider/provider.svelte.ts +++ b/src/uix/soma/provider/provider.svelte.ts @@ -18,7 +18,7 @@ * Se descarto "State" porque colisiona con el tipo reactivo `State` del sistema. * Se descarto un generico `` con CRTP porque la redundancia (`class X extends Provider`) * no aporta seguridad real — el tipado del context vive en su declaracion, no en la clase base. - *tu ha + * * ## Que resuelve * * - **opts + ref attachment:** el constructor asigna `this.opts` y crea el attachment de ref. @@ -87,7 +87,7 @@ export type RefAttachment = { export function attachRef( ref: State | RefSetter, - onChange?: (v: T | null) => void, + onChange?: (v: T | null) => void ): RefAttachment { return { [createAttachmentKey()]: (node: T) => { @@ -107,7 +107,7 @@ export function attachRef( ref(null); onChange?.(null); }; - }, + } }; } @@ -136,7 +136,7 @@ export abstract class Provider { part: string, partAttr: string, ctx?: SomaContext, - onRefChange?: (v: HTMLElement | null) => void, + onRefChange?: (v: HTMLElement | null) => void ) { this.opts = opts; this._component = component; @@ -151,7 +151,7 @@ export abstract class Provider { return { id: this.opts.id.current, [this._partAttr]: '', - ...(this.attachment ?? {}), + ...(this.attachment ?? {}) }; } diff --git a/src/uix/soma/types/index.ts b/src/uix/soma/types/index.ts index 6f1e1cce7..64886b448 100644 --- a/src/uix/soma/types/index.ts +++ b/src/uix/soma/types/index.ts @@ -24,13 +24,20 @@ export { isFunction, isNull, isNotNull, isNumberString } from './guards'; export type { SomaTranslator, + SomaTranslationModule, + SomaTranslationValue, + SomaTranslationFallback, + SomaTranslationDescriptor, + SomaTranslationParams, SomaLogger, - SomaFormat, - SomaDateFormat, - SomaNumberFormat, - SomaCurrencyFormat, - SomaUnitFormat, + SomaFormatter, + SomaNumberFormatter, + SomaCurrencyFormatter, + SomaUnitFormatter, + SomaDateTimeFormatter, + SomaPresentationConfig, SomaProps, + SomaPropsWithoutChildren, DateOrder, HourCycle, } from './services'; diff --git a/src/uix/soma/types/services.ts b/src/uix/soma/types/services.ts index be45d23d4..bdf3fda97 100644 --- a/src/uix/soma/types/services.ts +++ b/src/uix/soma/types/services.ts @@ -2,10 +2,21 @@ import type { Direction } from './component'; // ── Translator ─────────────────────────────────────────────────────────────── +export type SomaTranslationModule = unknown; +export type SomaTranslationParams = Record; +export type SomaTranslationFallback = string | Record; +export type SomaTranslationDescriptor = { + path: string; + fallback?: SomaTranslationFallback; + params?: SomaTranslationParams; +}; +export type SomaTranslationValue = SomaTranslationFallback | SomaTranslationDescriptor; + export interface SomaTranslator { getLocale(): string; - translate(value: string | Record): string; + translate(value: SomaTranslationValue): string; translatePath(path: string, ...args: unknown[]): string; + extend?: (...args: any[]) => void; } // ── Logger ─────────────────────────────────────────────────────────────────── @@ -17,41 +28,44 @@ export interface SomaLogger { error(message: string, context?: Record): void; } -// ── Format ─────────────────────────────────────────────────────────────────── +// ── Formatter ──────────────────────────────────────────────────────────────── -export type { DateOrder, HourCycle } from '$soma/external/dates'; +export type SomaFormatter = { + format: (...args: unknown[]) => string; +}; -export interface SomaDateFormat { - getDateOrder(): import('$soma/external/dates').DateOrder; - getHourCycle(): import('$soma/external/dates').HourCycle; -} +export type SomaNumberFormatter = SomaFormatter; +export type SomaCurrencyFormatter = SomaFormatter; +export type SomaUnitFormatter = SomaFormatter; -export interface SomaNumberFormat { - format(value: number, options?: Intl.NumberFormatOptions): string; -} +// ── DateTimeFormatter ──────────────────────────────────────────────────────── -export interface SomaCurrencyFormat { - format(value: number, currency: string, options?: Intl.NumberFormatOptions): string; -} +export type { DateOrder, HourCycle } from '$soma/external/dates'; -export interface SomaUnitFormat { - format(value: number, unit: string, options?: Intl.NumberFormatOptions): string; +export interface SomaDateTimeFormatter { + getDateOrder(): import('$soma/external/dates').DateOrder | undefined; + getHourCycle(): import('$soma/external/dates').HourCycle | undefined; } -export interface SomaFormat { - locale: string; - date?: SomaDateFormat; - number?: SomaNumberFormat; - currency?: SomaCurrencyFormat; - unit?: SomaUnitFormat; +// ── Presentation ───────────────────────────────────────────────────────────── + +export interface SomaPresentationConfig { + dir?: Direction; + dateTimeFormatter?: SomaDateTimeFormatter; + numberFormatter?: SomaNumberFormatter; + currencyFormatter?: SomaCurrencyFormatter; + unitFormatter?: SomaUnitFormatter; } // ── Soma props ─────────────────────────────────────────────────────────────── -export interface SomaProps { - dir?: Direction; +export interface SomaPropsWithoutChildren { + portalTo?: string | HTMLElement; translator?: SomaTranslator; + presentation?: SomaPresentationConfig; logger?: SomaLogger; - portalTo?: string | HTMLElement; - format?: SomaFormat; +} + +export interface SomaProps extends SomaPropsWithoutChildren { + children?: import('svelte').Snippet; } diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo index d21bc7423..989cc66c6 100644 --- a/tsconfig.tsbuildinfo +++ b/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/typescript/lib/lib.es2024.d.ts","./node_modules/typescript/lib/lib.esnext.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2024.collection.d.ts","./node_modules/typescript/lib/lib.es2024.object.d.ts","./node_modules/typescript/lib/lib.es2024.promise.d.ts","./node_modules/typescript/lib/lib.es2024.regexp.d.ts","./node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2024.string.d.ts","./node_modules/typescript/lib/lib.esnext.array.d.ts","./node_modules/typescript/lib/lib.esnext.collection.d.ts","./node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.promise.d.ts","./node_modules/typescript/lib/lib.esnext.decorators.d.ts","./node_modules/typescript/lib/lib.esnext.iterator.d.ts","./node_modules/typescript/lib/lib.esnext.float16.d.ts","./node_modules/typescript/lib/lib.esnext.error.d.ts","./node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/typescript/lib/typescript.d.ts","./node_modules/@typescript-eslint/types/dist/generated/ast-spec.d.ts","./node_modules/@typescript-eslint/types/dist/lib.d.ts","./node_modules/@typescript-eslint/types/dist/parser-options.d.ts","./node_modules/@typescript-eslint/types/dist/ts-estree.d.ts","./node_modules/@typescript-eslint/types/dist/index.d.ts","./node_modules/esrap/types/index.d.ts","./node_modules/magic-string/dist/magic-string.es.d.mts","./node_modules/@types/estree/index.d.ts","./node_modules/locate-character/types/index.d.ts","./node_modules/svelte/types/index.d.ts","./node_modules/vite/types/hmrpayload.d.ts","./node_modules/vite/types/customevent.d.ts","./node_modules/vite/types/hot.d.ts","./node_modules/vite/types/importglob.d.ts","./node_modules/vite/types/importmeta.d.ts","./node_modules/vite/client.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/blob.d.ts","./node_modules/@types/node/web-globals/console.d.ts","./node_modules/@types/node/web-globals/crypto.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/encoding.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/undici-types/utility.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client-stats.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/round-robin-pool.d.ts","./node_modules/undici-types/h2c-client.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-call-history.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/snapshot-agent.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/cache-interceptor.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/web-globals/importmeta.d.ts","./node_modules/@types/node/web-globals/messaging.d.ts","./node_modules/@types/node/web-globals/navigator.d.ts","./node_modules/@types/node/web-globals/performance.d.ts","./node_modules/@types/node/web-globals/storage.d.ts","./node_modules/@types/node/web-globals/streams.d.ts","./node_modules/@types/node/web-globals/timers.d.ts","./node_modules/@types/node/web-globals/url.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/inspector/promises.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/path/posix.d.ts","./node_modules/@types/node/path/win32.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/quic.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/test/reporters.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/util/types.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/vite/dist/node/chunks/modulerunnertransport.d.ts","./node_modules/rollup/dist/rollup.d.ts","./node_modules/rollup/dist/parseast.d.ts","./node_modules/vite/dist/node/module-runner.d.ts","./node_modules/esbuild/lib/main.d.ts","./node_modules/vite/types/internal/terseroptions.d.ts","./node_modules/source-map-js/source-map.d.ts","./node_modules/postcss/lib/previous-map.d.ts","./node_modules/postcss/lib/input.d.ts","./node_modules/postcss/lib/css-syntax-error.d.ts","./node_modules/postcss/lib/declaration.d.ts","./node_modules/postcss/lib/root.d.ts","./node_modules/postcss/lib/warning.d.ts","./node_modules/postcss/lib/lazy-result.d.ts","./node_modules/postcss/lib/no-work-result.d.ts","./node_modules/postcss/lib/processor.d.ts","./node_modules/postcss/lib/result.d.ts","./node_modules/postcss/lib/document.d.ts","./node_modules/postcss/lib/rule.d.ts","./node_modules/postcss/lib/node.d.ts","./node_modules/postcss/lib/comment.d.ts","./node_modules/postcss/lib/container.d.ts","./node_modules/postcss/lib/at-rule.d.ts","./node_modules/postcss/lib/list.d.ts","./node_modules/postcss/lib/postcss.d.ts","./node_modules/postcss/lib/postcss.d.mts","./node_modules/vite/types/internal/csspreprocessoroptions.d.ts","./node_modules/lightningcss/node/ast.d.ts","./node_modules/lightningcss/node/targets.d.ts","./node_modules/lightningcss/node/index.d.ts","./node_modules/vite/types/internal/lightningcssoptions.d.ts","./node_modules/vite/types/metadata.d.ts","./node_modules/vite/dist/node/index.d.ts","./node_modules/@sveltejs/vite-plugin-svelte-inspector/types/index.d.ts","./node_modules/@sveltejs/vite-plugin-svelte/types/index.d.ts","./node_modules/@standard-schema/spec/dist/index.d.ts","./node_modules/@types/cookie/index.d.ts","./node_modules/@sveltejs/kit/types/index.d.ts","./.svelte-kit/ambient.d.ts","./.svelte-kit/non-ambient.d.ts","./.svelte-kit/types/src/routes/$types.d.ts","./.svelte-kit/types/src/routes/test/$types.d.ts","./.svelte-kit/types/src/routes/test/accordion/$types.d.ts","./.svelte-kit/types/src/routes/test/air/$types.d.ts","./.svelte-kit/types/src/routes/test/air/accordion/$types.d.ts","./.svelte-kit/types/src/routes/test/air/alert-dialog/$types.d.ts","./.svelte-kit/types/src/routes/test/air/animations/$types.d.ts","./.svelte-kit/types/src/routes/test/air/avatar/$types.d.ts","./.svelte-kit/types/src/routes/test/air/badge/$types.d.ts","./.svelte-kit/types/src/routes/test/air/button/$types.d.ts","./.svelte-kit/types/src/routes/test/air/calendar/$types.d.ts","./.svelte-kit/types/src/routes/test/air/checkbox/$types.d.ts","./.svelte-kit/types/src/routes/test/air/collapsible/$types.d.ts","./.svelte-kit/types/src/routes/test/air/color-picker/$types.d.ts","./.svelte-kit/types/src/routes/test/air/combobox/$types.d.ts","./.svelte-kit/types/src/routes/test/air/command/$types.d.ts","./.svelte-kit/types/src/routes/test/air/context-menu/$types.d.ts","./.svelte-kit/types/src/routes/test/air/dialog/$types.d.ts","./.svelte-kit/types/src/routes/test/air/drawer/$types.d.ts","./.svelte-kit/types/src/routes/test/air/dropdown-menu/$types.d.ts","./.svelte-kit/types/src/routes/test/air/editable/$types.d.ts","./.svelte-kit/types/src/routes/test/air/field/$types.d.ts","./.svelte-kit/types/src/routes/test/air/file-upload/$types.d.ts","./.svelte-kit/types/src/routes/test/air/form/$types.d.ts","./.svelte-kit/types/src/routes/test/air/icon/$types.d.ts","./.svelte-kit/types/src/routes/test/air/icons/$types.d.ts","./.svelte-kit/types/src/routes/test/air/input/$types.d.ts","./.svelte-kit/types/src/routes/test/air/layout/aspect-ratio/$types.d.ts","./.svelte-kit/types/src/routes/test/air/layout/auto-grid/$types.d.ts","./.svelte-kit/types/src/routes/test/air/layout/box/$types.d.ts","./.svelte-kit/types/src/routes/test/air/layout/container/$types.d.ts","./.svelte-kit/types/src/routes/test/air/layout/flex/$types.d.ts","./.svelte-kit/types/src/routes/test/air/layout/float/$types.d.ts","./.svelte-kit/types/src/routes/test/air/layout/grid/$types.d.ts","./.svelte-kit/types/src/routes/test/air/layout/group/$types.d.ts","./.svelte-kit/types/src/routes/test/air/layout/scroll-area/$types.d.ts","./.svelte-kit/types/src/routes/test/air/layout/section/$types.d.ts","./.svelte-kit/types/src/routes/test/air/layout/separator/$types.d.ts","./.svelte-kit/types/src/routes/test/air/layout/splitter/$types.d.ts","./.svelte-kit/types/src/routes/test/air/layout/stack/$types.d.ts","./.svelte-kit/types/src/routes/test/air/layout/wrap/$types.d.ts","./.svelte-kit/types/src/routes/test/air/ling/$types.d.ts","./.svelte-kit/types/src/routes/test/air/link-preview/$types.d.ts","./.svelte-kit/types/src/routes/test/air/menubar/$types.d.ts","./.svelte-kit/types/src/routes/test/air/meter/$types.d.ts","./.svelte-kit/types/src/routes/test/air/number-field/$types.d.ts","./.svelte-kit/types/src/routes/test/air/pagination/$types.d.ts","./.svelte-kit/types/src/routes/test/air/pin-input/$types.d.ts","./.svelte-kit/types/src/routes/test/air/popover/$types.d.ts","./.svelte-kit/types/src/routes/test/air/progress/$types.d.ts","./.svelte-kit/types/src/routes/test/air/radio-group/$types.d.ts","./.svelte-kit/types/src/routes/test/air/rating-group/$types.d.ts","./.svelte-kit/types/src/routes/test/air/select/$types.d.ts","./.svelte-kit/types/src/routes/test/air/slider/$types.d.ts","./.svelte-kit/types/src/routes/test/air/sounds/$types.d.ts","./.svelte-kit/types/src/routes/test/air/spinner/$types.d.ts","./.svelte-kit/types/src/routes/test/air/stepper/$types.d.ts","./.svelte-kit/types/src/routes/test/air/surfaces/$types.d.ts","./.svelte-kit/types/src/routes/test/air/switch/$types.d.ts","./.svelte-kit/types/src/routes/test/air/tabs/$types.d.ts","./.svelte-kit/types/src/routes/test/air/tags-input/$types.d.ts","./.svelte-kit/types/src/routes/test/air/toast/$types.d.ts","./.svelte-kit/types/src/routes/test/air/toggle/$types.d.ts","./.svelte-kit/types/src/routes/test/air/toggle-group/$types.d.ts","./.svelte-kit/types/src/routes/test/air/toolbar/$types.d.ts","./.svelte-kit/types/src/routes/test/air/tooltip/$types.d.ts","./.svelte-kit/types/src/routes/test/air/typography/$types.d.ts","./.svelte-kit/types/src/routes/test/alert-dialog/$types.d.ts","./.svelte-kit/types/src/routes/test/aspect-ratio/$types.d.ts","./.svelte-kit/types/src/routes/test/avatar/$types.d.ts","./.svelte-kit/types/src/routes/test/button/$types.d.ts","./.svelte-kit/types/src/routes/test/calendar/$types.d.ts","./.svelte-kit/types/src/routes/test/checkbox/$types.d.ts","./.svelte-kit/types/src/routes/test/collapsible/$types.d.ts","./.svelte-kit/types/src/routes/test/color-picker/$types.d.ts","./.svelte-kit/types/src/routes/test/combobox/$types.d.ts","./.svelte-kit/types/src/routes/test/command/$types.d.ts","./.svelte-kit/types/src/routes/test/context-menu/$types.d.ts","./.svelte-kit/types/src/routes/test/date-picker/$types.d.ts","./.svelte-kit/types/src/routes/test/date-range-field/$types.d.ts","./.svelte-kit/types/src/routes/test/date-range-picker/$types.d.ts","./.svelte-kit/types/src/routes/test/dialog/$types.d.ts","./.svelte-kit/types/src/routes/test/drawer/$types.d.ts","./.svelte-kit/types/src/routes/test/dropdown-menu/$types.d.ts","./.svelte-kit/types/src/routes/test/editable/$types.d.ts","./.svelte-kit/types/src/routes/test/field/$types.d.ts","./.svelte-kit/types/src/routes/test/file-upload/$types.d.ts","./.svelte-kit/types/src/routes/test/form/$types.d.ts","./.svelte-kit/types/src/routes/test/icons/proxy+page.ts","./.svelte-kit/types/src/routes/test/icons/$types.d.ts","./.svelte-kit/types/src/routes/test/label/$types.d.ts","./.svelte-kit/types/src/routes/test/link-preview/$types.d.ts","./.svelte-kit/types/src/routes/test/menubar/$types.d.ts","./.svelte-kit/types/src/routes/test/meter/$types.d.ts","./.svelte-kit/types/src/routes/test/modal/$types.d.ts","./.svelte-kit/types/src/routes/test/number-field/$types.d.ts","./.svelte-kit/types/src/routes/test/pagination/$types.d.ts","./.svelte-kit/types/src/routes/test/pin-input/$types.d.ts","./.svelte-kit/types/src/routes/test/popover/$types.d.ts","./.svelte-kit/types/src/routes/test/progress/$types.d.ts","./.svelte-kit/types/src/routes/test/radio-group/$types.d.ts","./.svelte-kit/types/src/routes/test/range-calendar/$types.d.ts","./.svelte-kit/types/src/routes/test/rating-group/$types.d.ts","./.svelte-kit/types/src/routes/test/scroll-area/$types.d.ts","./.svelte-kit/types/src/routes/test/select/$types.d.ts","./.svelte-kit/types/src/routes/test/separator/$types.d.ts","./.svelte-kit/types/src/routes/test/slider/$types.d.ts","./.svelte-kit/types/src/routes/test/soma/$types.d.ts","./.svelte-kit/types/src/routes/test/soma/accordion/$types.d.ts","./.svelte-kit/types/src/routes/test/soma/collapsible/$types.d.ts","./.svelte-kit/types/src/routes/test/soma/combobox/$types.d.ts","./.svelte-kit/types/src/routes/test/soma/dialog/$types.d.ts","./.svelte-kit/types/src/routes/test/soma/dropdown-menu/$types.d.ts","./.svelte-kit/types/src/routes/test/soma/forms/$types.d.ts","./.svelte-kit/types/src/routes/test/soma/popover/$types.d.ts","./.svelte-kit/types/src/routes/test/soma/select/$types.d.ts","./.svelte-kit/types/src/routes/test/soma/slider/$types.d.ts","./.svelte-kit/types/src/routes/test/soma/tooltip/$types.d.ts","./.svelte-kit/types/src/routes/test/splitter/$types.d.ts","./.svelte-kit/types/src/routes/test/stepper/$types.d.ts","./.svelte-kit/types/src/routes/test/switch/$types.d.ts","./.svelte-kit/types/src/routes/test/tabs/$types.d.ts","./.svelte-kit/types/src/routes/test/tags-input/$types.d.ts","./.svelte-kit/types/src/routes/test/terra/$types.d.ts","./.svelte-kit/types/src/routes/test/terra/ling/$types.d.ts","./.svelte-kit/types/src/routes/test/time-field/$types.d.ts","./.svelte-kit/types/src/routes/test/time-range-field/$types.d.ts","./.svelte-kit/types/src/routes/test/toast/$types.d.ts","./.svelte-kit/types/src/routes/test/toggle/$types.d.ts","./.svelte-kit/types/src/routes/test/toggle-group/$types.d.ts","./.svelte-kit/types/src/routes/test/toolbar/$types.d.ts","./.svelte-kit/types/src/routes/test/tooltip/$types.d.ts","./.svelte-kit/types/src/routes/test/virtual-list/$types.d.ts","./node_modules/@tailwindcss/vite/dist/index.d.mts","./node_modules/@vitest/pretty-format/dist/index.d.ts","./node_modules/@vitest/utils/dist/display.d.ts","./node_modules/@vitest/utils/dist/types.d.ts","./node_modules/@vitest/utils/dist/helpers.d.ts","./node_modules/@vitest/utils/dist/timers.d.ts","./node_modules/@vitest/utils/dist/index.d.ts","./node_modules/@vitest/utils/dist/types.d-bcelap-c.d.ts","./node_modules/@vitest/utils/dist/diff.d.ts","./node_modules/@vitest/runner/dist/tasks.d-di5lbrqa.d.ts","./node_modules/@vitest/runner/dist/index.d.ts","./node_modules/@vitest/spy/optional-types.d.ts","./node_modules/@vitest/spy/dist/index.d.ts","./node_modules/tinyrainbow/dist/index.d.ts","./node_modules/@types/deep-eql/index.d.ts","./node_modules/assertion-error/index.d.ts","./node_modules/@types/chai/index.d.ts","./node_modules/@vitest/expect/dist/index.d.ts","./node_modules/@vitest/snapshot/dist/environment.d-dojxxzv9.d.ts","./node_modules/@vitest/snapshot/dist/rawsnapshot.d-u2kjuxdr.d.ts","./node_modules/@vitest/snapshot/dist/index.d.ts","./node_modules/vitest/dist/chunks/traces.d.402v_yfi.d.ts","./node_modules/vitest/dist/chunks/rpc.d.bfmwpdph.d.ts","./node_modules/vitest/dist/chunks/config.d.ejlve3es.d.ts","./node_modules/vitest/dist/chunks/environment.d.crsxczp1.d.ts","./node_modules/vitest/dist/chunks/worker.d.b84svry0.d.ts","./node_modules/vitest/dist/chunks/browser.d.x3sxoocv.d.ts","./node_modules/vitest/optional-types.d.ts","./node_modules/@vitest/runner/dist/utils.d.ts","./node_modules/tinybench/dist/index.d.ts","./node_modules/vitest/dist/chunks/benchmark.d.daahlpsq.d.ts","./node_modules/@vitest/mocker/dist/types.d-bji5eawu.d.ts","./node_modules/@vitest/mocker/dist/index.d-b41z0auw.d.ts","./node_modules/@vitest/mocker/dist/index.d.ts","./node_modules/@vitest/utils/dist/source-map.d.ts","./node_modules/vitest/dist/chunks/global.d.x-ilcfae.d.ts","./node_modules/vitest/optional-runtime-types.d.ts","./node_modules/vitest/dist/chunks/suite.d.udjtyagw.d.ts","./node_modules/vitest/dist/chunks/evaluatedmodules.d.bxj5omdx.d.ts","./node_modules/vitest/dist/runners.d.ts","./node_modules/expect-type/dist/utils.d.ts","./node_modules/expect-type/dist/overloads.d.ts","./node_modules/expect-type/dist/branding.d.ts","./node_modules/expect-type/dist/messages.d.ts","./node_modules/expect-type/dist/index.d.ts","./node_modules/vitest/dist/index.d.ts","./node_modules/vitest/dist/chunks/coverage.d.bztk59wp.d.ts","./node_modules/@vitest/utils/dist/serialize.d.ts","./node_modules/@vitest/utils/dist/error.d.ts","./node_modules/vitest/dist/browser.d.ts","./node_modules/@vitest/browser/aria-role.d.ts","./node_modules/@vitest/browser/jest-dom.d.ts","./node_modules/@vitest/browser/matchers.d.ts","./node_modules/@vitest/browser/context.d.ts","./node_modules/@vitest/browser-playwright/context.d.ts","./node_modules/vitest/browser/context.d.ts","./node_modules/@vitest/snapshot/dist/manager.d.ts","./node_modules/vitest/dist/chunks/reporters.d.cz5e0gct.d.ts","./node_modules/vitest/dist/chunks/plugin.d.dx0ozo6e.d.ts","./node_modules/vitest/dist/config.d.ts","./node_modules/vitest/config.d.ts","./node_modules/vitest/dist/coverage.d.ts","./node_modules/obug/dist/core.d.ts","./node_modules/obug/dist/node.d.ts","./node_modules/vitest/dist/node.d.ts","./node_modules/@vitest/browser/dist/index.d.ts","./node_modules/playwright-core/types/protocol.d.ts","./node_modules/playwright-core/types/structs.d.ts","./node_modules/playwright-core/types/types.d.ts","./node_modules/playwright-core/index.d.ts","./node_modules/playwright/index.d.ts","./node_modules/@vitest/browser-playwright/dist/index.d.ts","./vite.config.ts","./src/app.d.ts","./src/lib/ling/lib/consts.ts","./src/lib/ling/lib/plural_rules.ts","./src/lib/ling/lib/types.ts","./src/lib/ling/lib/errors.ts","./src/lib/ling/lib/guards.ts","./src/lib/ling/lib/helpers.ts","./src/lib/ling/lib/engine.ts","./src/lib/ling/lib/translations.ts","./src/lib/ling/lib/instance.ts","./src/lib/ling/lib/index.ts","./src/lib/logr/lib/types.ts","./src/lib/glob/lib/comn_types.ts","./src/lib/glob/lib/curr_types.ts","./src/lib/glob/lib/unit_types.ts","./src/lib/util/numbers/utilities.ts","./src/lib/util/numbers/index.ts","./src/lib/util/objs/utilities.ts","./src/lib/util/objs/index.ts","./src/lib/util/dates/calendars/gregoriancalendar.ts","./src/lib/util/dates/internal/weekstartdata.ts","./src/lib/util/dates/operations/queries.ts","./src/lib/util/dates/internal/utils.ts","./src/lib/util/dates/operations/conversion.ts","./src/lib/util/dates/operations/manipulation.ts","./src/lib/util/dates/operations/string.ts","./src/lib/util/dates/core/calendardate.ts","./src/lib/util/dates/core/types.ts","./src/lib/glob/lib/dati_types.ts","./src/lib/glob/lib/numr_types.ts","./src/lib/actx/lib/types.ts","./src/lib/glob/lib/comn_utils.ts","./src/lib/glob/lib/comn_engine.ts","./src/lib/glob/lib/numr_engine.ts","./src/lib/glob/lib/numr_engine.svelte.ts","./src/lib/glob/lib/dati_engine.ts","./src/lib/glob/lib/dati_engine.svelte.ts","./src/lib/glob/lib/curr_langs.ts","./src/lib/glob/lib/curr_engine.ts","./src/lib/glob/lib/curr_engine.svelte.ts","./src/lib/glob/lib/unit_data.ts","./src/lib/glob/lib/unit_langs.ts","./src/lib/glob/lib/unit_engine.ts","./src/lib/glob/lib/unit_engine.svelte.ts","./src/lib/logr/lib/transports.ts","./src/lib/logr/lib/engine.ts","./src/lib/logr/lib/index.ts","./src/lib/actx/lib/engine.svelte.ts","./src/lib/actx/lib/index.ts","./src/lib/glob/lib/index.ts","./src/lib/index.ts","./src/lib/actx/lib/engine.ts","./src/lib/actx/lib/instance_actx.svelte.ts","./src/lib/actx/lib/instance_actx.ts","./src/lib/actx/test/actx.test.ts","./src/lib/glob/test/glob.test.ts","./src/lib/ling/lib/json.ts","./src/lib/ling/test/ling.test.ts","./src/lib/logr/test/logr.test.ts","./src/lib/util/arrays/utilities.ts","./src/lib/util/arrays/index.ts","./src/lib/util/colors/types.ts","./src/lib/util/colors/convert.ts","./src/lib/util/colors/parse.ts","./src/lib/util/colors/index.ts","./src/lib/util/dates/calendars/japanesecalendar.ts","./src/lib/util/dates/calendars/buddhistcalendar.ts","./src/lib/util/dates/calendars/taiwancalendar.ts","./src/lib/util/dates/calendars/persiancalendar.ts","./src/lib/util/dates/calendars/indiancalendar.ts","./src/lib/util/dates/calendars/islamiccalendar.ts","./src/lib/util/dates/calendars/hebrewcalendar.ts","./src/lib/util/dates/calendars/ethiopiccalendar.ts","./src/lib/util/dates/core/createcalendar.ts","./src/lib/util/dates/format/dateformatter.ts","./src/lib/util/dates/format/defaults.ts","./src/lib/util/dates/format/placeholders.ts","./src/lib/util/dates/index.ts","./src/lib/util/funcs/noop.ts","./src/lib/util/funcs/index.ts","./src/lib/util/reactive/symbols.ts","./src/lib/util/reactive/types.ts","./src/lib/util/reactive/derived.svelte.ts","./src/lib/util/reactive/guards.ts","./src/lib/util/reactive/state.svelte.ts","./src/lib/util/reactive/readonly.svelte.ts","./src/lib/util/reactive/utils.svelte.ts","./src/lib/util/reactive/index.ts","./src/lib/util/strings/utilities.ts","./src/lib/util/strings/index.ts","./src/lib/util/timers/debounce.ts","./src/lib/util/timers/index.ts","./src/lib/util/times/index.ts","./src/routes/+layout.ts","./src/routes/test/_components/index.ts","./src/routes/test/air/demo-context.ts","./src/uix/terra/external/dates/index.ts","./src/routes/test/air/demo-locale.ts","./src/routes/test/icons/+page.ts","./node_modules/runed/dist/internal/configurable-globals.d.ts","./node_modules/runed/dist/utilities/active-element/active-element.svelte.d.ts","./node_modules/runed/dist/utilities/active-element/index.d.ts","./node_modules/runed/dist/internal/types.d.ts","./node_modules/runed/dist/utilities/animation-frames/animation-frames.svelte.d.ts","./node_modules/runed/dist/utilities/animation-frames/index.d.ts","./node_modules/runed/dist/utilities/context/context.d.ts","./node_modules/runed/dist/utilities/context/index.d.ts","./node_modules/runed/dist/utilities/debounced/debounced.svelte.d.ts","./node_modules/runed/dist/utilities/debounced/index.d.ts","./node_modules/runed/dist/utilities/element-rect/element-rect.svelte.d.ts","./node_modules/runed/dist/utilities/element-rect/index.d.ts","./node_modules/runed/dist/utilities/element-size/element-size.svelte.d.ts","./node_modules/runed/dist/utilities/element-size/index.d.ts","./node_modules/runed/dist/utilities/extract/extract.svelte.d.ts","./node_modules/runed/dist/utilities/extract/index.d.ts","./node_modules/runed/dist/utilities/finite-state-machine/finite-state-machine.svelte.d.ts","./node_modules/runed/dist/utilities/finite-state-machine/index.d.ts","./node_modules/runed/dist/utilities/is-focus-within/is-focus-within.svelte.d.ts","./node_modules/runed/dist/utilities/is-focus-within/index.d.ts","./node_modules/runed/dist/utilities/is-idle/is-idle.svelte.d.ts","./node_modules/runed/dist/utilities/is-idle/index.d.ts","./node_modules/runed/dist/utilities/use-intersection-observer/use-intersection-observer.svelte.d.ts","./node_modules/runed/dist/utilities/is-in-viewport/is-in-viewport.svelte.d.ts","./node_modules/runed/dist/utilities/is-in-viewport/index.d.ts","./node_modules/runed/dist/utilities/is-mounted/is-mounted.svelte.d.ts","./node_modules/runed/dist/utilities/is-mounted/index.d.ts","./node_modules/runed/dist/utilities/is-document-visible/is-document-visible.svelte.d.ts","./node_modules/runed/dist/utilities/is-document-visible/index.d.ts","./node_modules/runed/dist/utilities/on-click-outside/on-click-outside.svelte.d.ts","./node_modules/runed/dist/utilities/on-click-outside/index.d.ts","./node_modules/runed/dist/utilities/persisted-state/persisted-state.svelte.d.ts","./node_modules/runed/dist/utilities/persisted-state/index.d.ts","./node_modules/runed/dist/utilities/pressed-keys/pressed-keys.svelte.d.ts","./node_modules/runed/dist/utilities/pressed-keys/index.d.ts","./node_modules/runed/dist/utilities/previous/previous.svelte.d.ts","./node_modules/runed/dist/utilities/previous/index.d.ts","./node_modules/runed/dist/utilities/resource/resource.svelte.d.ts","./node_modules/runed/dist/utilities/resource/index.d.ts","./node_modules/runed/dist/utilities/scroll-state/scroll-state.svelte.d.ts","./node_modules/runed/dist/utilities/scroll-state/index.d.ts","./node_modules/runed/dist/utilities/state-history/state-history.svelte.d.ts","./node_modules/runed/dist/utilities/state-history/index.d.ts","./node_modules/runed/dist/utilities/textarea-autosize/textarea-autosize.svelte.d.ts","./node_modules/runed/dist/utilities/textarea-autosize/index.d.ts","./node_modules/runed/dist/utilities/throttled/throttled.svelte.d.ts","./node_modules/runed/dist/utilities/throttled/index.d.ts","./node_modules/runed/dist/utilities/use-debounce/use-debounce.svelte.d.ts","./node_modules/runed/dist/utilities/use-debounce/index.d.ts","./node_modules/runed/dist/utilities/use-event-listener/use-event-listener.svelte.d.ts","./node_modules/runed/dist/utilities/use-event-listener/index.d.ts","./node_modules/runed/dist/utilities/use-geolocation/use-geolocation.svelte.d.ts","./node_modules/runed/dist/utilities/use-geolocation/index.d.ts","./node_modules/runed/dist/utilities/use-intersection-observer/index.d.ts","./node_modules/runed/dist/utilities/use-mutation-observer/use-mutation-observer.svelte.d.ts","./node_modules/runed/dist/utilities/use-mutation-observer/index.d.ts","./node_modules/runed/dist/utilities/use-resize-observer/use-resize-observer.svelte.d.ts","./node_modules/runed/dist/utilities/use-resize-observer/index.d.ts","./node_modules/runed/dist/utilities/use-interval/use-interval.svelte.d.ts","./node_modules/runed/dist/utilities/use-interval/index.d.ts","./node_modules/runed/dist/utilities/use-throttle/use-throttle.svelte.d.ts","./node_modules/runed/dist/utilities/use-throttle/index.d.ts","./node_modules/runed/dist/utilities/watch/watch.svelte.d.ts","./node_modules/runed/dist/utilities/watch/index.d.ts","./node_modules/runed/dist/utilities/bool-attr/bool-attr.d.ts","./node_modules/runed/dist/utilities/bool-attr/index.d.ts","./node_modules/runed/dist/utilities/on-cleanup/on-cleanup.svelte.d.ts","./node_modules/runed/dist/utilities/on-cleanup/index.d.ts","./node_modules/runed/dist/utilities/index.d.ts","./node_modules/runed/dist/index.d.ts","./src/uix/terra/errors.ts","./src/uix/terra/utils/context.ts","./src/uix/terra/system/logger.ts","./src/uix/terra/utils/logger.ts","./node_modules/csstype/index.d.ts","./src/uix/terra/utils/state/index.ts","./src/uix/terra/utils/framework/attach-ref.ts","./src/uix/terra/utils/types.ts","./src/uix/terra/utils/images/types.ts","./src/uix/terra/utils/images/index.ts","./src/uix/terra/utils/keyboard/kbd-constants.ts","./src/uix/terra/utils/keyboard/kbd.ts","./src/uix/terra/utils/keyboard/get-directional-keys.ts","./src/uix/terra/utils/keyboard/index.ts","./src/uix/terra/utils/events/events.ts","./src/uix/terra/utils/events/compose-handlers.ts","./src/uix/terra/utils/collections/execute-callbacks.ts","./node_modules/clsx/clsx.d.mts","./src/uix/terra/utils/css/parser.ts","./src/uix/terra/utils/css/transform.ts","./src/uix/terra/utils/css/escape.ts","./src/uix/terra/utils/css/index.ts","./src/uix/terra/utils/is.ts","./src/uix/terra/utils/events/event-list.ts","./src/uix/terra/utils/merge-props.ts","./src/uix/terra/utils/framework/on-destroy-effect.svelte.ts","./src/uix/terra/utils/framework/use-ref-by-id.svelte.ts","./src/uix/terra/utils/framework/on-mount-effect.svelte.ts","./src/uix/terra/utils/after.ts","./src/uix/terra/utils/framework/use-on-change.svelte.ts","./src/uix/terra/dom/core/dom.ts","./src/uix/terra/dom/core/dom-context.svelte.ts","./src/uix/terra/utils/create-id.ts","./src/uix/terra/utils/shared-state.svelte.ts","./src/uix/terra/utils/state-machine.ts","./src/uix/terra/utils/timeout-fn.ts","./src/uix/terra/utils/use-id.ts","./node_modules/svelte/elements.d.ts","./src/uix/terra/utils/attributes.ts","./src/uix/terra/dom/core/dom-internal.ts","./src/uix/terra/dom/core/elements.ts","./src/uix/terra/dom/core/is-browser.ts","./src/uix/terra/dom/core/focus.ts","./src/uix/terra/dom/core/locale.ts","./node_modules/esm-env/index.d.ts","./src/uix/terra/dom/core/body-scroll-lock.svelte.ts","./src/uix/terra/dom/core/svelte-resize-observer.svelte.ts","./src/uix/terra/utils/events/event-dispatcher.ts","./node_modules/@floating-ui/utils/dist/floating-ui.utils.d.mts","./node_modules/@floating-ui/core/dist/floating-ui.core.d.mts","./node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.d.mts","./node_modules/@floating-ui/dom/dist/floating-ui.dom.d.mts","./src/uix/terra/layers/floating/use-floating-layer.svelte.ts","./src/uix/terra/layers/floating/types.ts","./src/uix/terra/layers/floating/components/index.ts","./src/uix/terra/layers/floating/utils.ts","./src/uix/terra/layers/floating/use-floating.svelte.ts","./src/uix/terra/layers/floating/safe-polygon.ts","./src/uix/terra/layers/floating/index.ts","./src/uix/terra/dom/focus/roving-focus-group.ts","./src/uix/terra/dom/focus/should-enable-focus-trap.ts","./node_modules/tabbable/index.d.ts","./src/uix/terra/dom/focus/tabbable.ts","./src/uix/terra/dom/focus/use-arrow-navigation.ts","./src/uix/terra/utils/keyboard/is-using-keyboard.svelte.ts","./src/uix/terra/layers/presence/animations-complete.ts","./src/uix/terra/layers/presence/presence-manager.svelte.ts","./src/uix/terra/utils/collections/data-typeahead.svelte.ts","./src/uix/terra/utils/collections/dom-typeahead.svelte.ts","./src/uix/terra/utils/contracts.ts","./src/uix/terra/utils/index.ts","./src/uix/terra/layers/portal/types.ts","./src/uix/terra/system/formatter.svelte.ts","./src/uix/terra/system/types.ts","./src/uix/terra/button/types.ts","./src/uix/terra/button/exports.ts","./src/uix/terra/button/index.ts","./src/uix/air/dom/responsive.svelte.ts","./src/uix/air/dom/dom.svelte.ts","./src/uix/air/dom/index.ts","./src/uix/air/lib/types.ts","./src/uix/air/components/button/types.ts","./src/uix/air/components/button/index.ts","./src/uix/air/lib/style.ts","./src/uix/air/lib/index.ts","./src/uix/terra/aspect-ratio/types.ts","./src/uix/terra/aspect-ratio/exports.ts","./src/uix/terra/aspect-ratio/index.ts","./src/uix/terra/avatar/types.ts","./src/uix/terra/avatar/exports.ts","./src/uix/terra/avatar/index.ts","./src/uix/terra/utils/attrs.ts","./src/uix/terra/accordion/accordion.svelte.ts","./src/uix/terra/accordion/types.ts","./src/uix/terra/accordion/exports.ts","./src/uix/terra/accordion/index.ts","./src/uix/terra/checkbox/types.ts","./src/uix/terra/checkbox/exports.ts","./src/uix/terra/checkbox/index.ts","./src/uix/terra/collapsible/types.ts","./src/uix/terra/collapsible/exports.ts","./src/uix/terra/collapsible/index.ts","./src/uix/terra/label/types.ts","./src/uix/terra/label/exports.ts","./src/uix/terra/label/index.ts","./src/uix/terra/meter/types.ts","./src/uix/terra/meter/exports.ts","./src/uix/terra/meter/index.ts","./src/uix/terra/system/translator.svelte.ts","./src/uix/terra/system/terra-config.ts","./src/uix/terra/pagination/pagination.svelte.ts","./src/uix/terra/pagination/types.ts","./src/uix/terra/pagination/exports.ts","./src/uix/terra/pagination/index.ts","./src/uix/terra/progress/types.ts","./src/uix/terra/progress/exports.ts","./src/uix/terra/progress/index.ts","./src/uix/terra/radio-group/types.ts","./src/uix/terra/radio-group/exports.ts","./src/uix/terra/radio-group/index.ts","./src/uix/terra/rating-group/rating-group.svelte.ts","./src/uix/terra/rating-group/types.ts","./src/uix/terra/rating-group/exports.ts","./src/uix/terra/rating-group/index.ts","./src/uix/terra/separator/types.ts","./src/uix/terra/separator/exports.ts","./src/uix/terra/separator/index.ts","./src/uix/terra/switch/types.ts","./src/uix/terra/switch/exports.ts","./src/uix/terra/switch/index.ts","./src/uix/terra/spinner/types.ts","./src/uix/terra/spinner/exports.ts","./src/uix/terra/spinner/index.ts","./src/uix/terra/tabs/types.ts","./src/uix/terra/tabs/exports.ts","./src/uix/terra/tabs/index.ts","./src/uix/terra/toggle/types.ts","./src/uix/terra/toggle/exports.ts","./src/uix/terra/toggle/index.ts","./src/uix/terra/toggle-group/types.ts","./src/uix/terra/toggle-group/exports.ts","./src/uix/terra/toggle-group/index.ts","./src/uix/terra/number-field/types.ts","./src/uix/terra/number-field/exports.ts","./src/uix/terra/number-field/index.ts","./src/uix/terra/tags-input/types.ts","./src/uix/terra/tags-input/exports.ts","./src/uix/terra/tags-input/index.ts","./src/uix/terra/editable/types.ts","./src/uix/terra/editable/exports.ts","./src/uix/terra/editable/index.ts","./src/uix/terra/stepper/stepper.svelte.ts","./src/uix/terra/stepper/types.ts","./src/uix/terra/stepper/exports.ts","./src/uix/terra/stepper/index.ts","./src/uix/terra/trans/types.ts","./src/uix/terra/trans/index.ts","./src/uix/terra/splitter/splitter.svelte.ts","./src/uix/terra/splitter/types.ts","./src/uix/terra/splitter/exports.ts","./src/uix/terra/splitter/index.ts","./src/uix/terra/file-upload/file-upload.svelte.ts","./src/uix/terra/file-upload/types.ts","./src/uix/terra/file-upload/exports.ts","./src/uix/terra/file-upload/index.ts","./src/uix/terra/toast/toast.svelte.ts","./src/uix/terra/toast/types.ts","./src/uix/terra/toast/exports.ts","./src/uix/terra/toast/index.ts","./src/uix/terra/pin-input/types.ts","./src/uix/terra/pin-input/usepasswordmanager.svelte.ts","./src/uix/terra/pin-input/pin-input.svelte.ts","./src/uix/terra/pin-input/exports.ts","./src/uix/terra/pin-input/index.ts","./src/uix/terra/scroll-area/types.ts","./src/uix/terra/scroll-area/exports.ts","./src/uix/terra/scroll-area/index.ts","./src/uix/terra/slider/exports.ts","./src/uix/terra/slider/types.ts","./src/uix/terra/slider/index.ts","./src/uix/terra/toolbar/types.ts","./src/uix/terra/toolbar/exports.ts","./src/uix/terra/toolbar/index.ts","./src/uix/terra/virtual-list/types.ts","./src/uix/terra/virtual-list/exports.ts","./src/uix/terra/virtual-list/index.ts","./src/uix/terra/tooltip/tooltip.svelte.ts","./src/uix/terra/tooltip/exports.ts","./src/uix/terra/tooltip/types.ts","./src/uix/terra/tooltip/index.ts","./src/uix/terra/layers/arrow/types.ts","./src/uix/terra/layers/arrow/index.ts","./src/uix/terra/layers/dismissible/types.ts","./src/uix/terra/layers/escape/types.ts","./src/uix/terra/link-preview/types.ts","./src/uix/terra/link-preview/exports.ts","./src/uix/terra/link-preview/index.ts","./src/uix/terra/popover/exports.ts","./src/uix/terra/popover/types.ts","./src/uix/terra/popover/index.ts","./src/uix/terra/menu/types.ts","./src/uix/terra/dropdown-menu/types.ts","./src/uix/terra/dropdown-menu/exports.ts","./src/uix/terra/dropdown-menu/index.ts","./src/uix/terra/context-menu/types.ts","./src/uix/terra/context-menu/exports.ts","./src/uix/terra/context-menu/index.ts","./src/uix/terra/menubar/types.ts","./src/uix/terra/menubar/exports.ts","./src/uix/terra/menubar/index.ts","./src/uix/terra/command/compute-command-score.ts","./src/uix/terra/command/types.ts","./src/uix/terra/command/exports.ts","./src/uix/terra/command/index.ts","./src/uix/terra/dialog/types.ts","./src/uix/terra/alert-dialog/types.ts","./src/uix/terra/alert-dialog/exports.ts","./src/uix/terra/alert-dialog/index.ts","./src/uix/terra/dialog/exports.ts","./src/uix/terra/dialog/index.ts","./src/uix/terra/drawer/types.ts","./src/uix/terra/drawer/exports.ts","./src/uix/terra/drawer/index.ts","./src/uix/terra/field/types.ts","./src/uix/terra/field/exports.ts","./src/uix/terra/field/index.ts","./src/uix/terra/form/types.ts","./src/uix/terra/form/exports.ts","./src/uix/terra/form/index.ts","./src/uix/terra/system/date-time-formatter.svelte.ts","./src/uix/terra/system/number-formatter.svelte.ts","./src/uix/terra/system/currency-formatter.svelte.ts","./src/uix/terra/system/unit-formatter.svelte.ts","./src/uix/terra/system/exports.ts","./src/uix/terra/calendar/types.ts","./src/uix/terra/calendar/exports.ts","./src/uix/terra/calendar/index.ts","./src/uix/terra/range-calendar/types.ts","./src/uix/terra/range-calendar/exports.ts","./src/uix/terra/range-calendar/index.ts","./src/uix/terra/utils/datetime/parts.ts","./src/uix/terra/utils/datetime/types.ts","./src/uix/terra/date-field/types.ts","./src/uix/terra/date-field/exports.ts","./src/uix/terra/date-field/index.ts","./src/uix/terra/date-picker/types.ts","./src/uix/terra/date-picker/exports.ts","./src/uix/terra/date-picker/index.ts","./src/uix/terra/select/select.svelte.ts","./src/uix/terra/layers/text-selection/types.ts","./src/uix/terra/layers/presence/types.ts","./src/uix/terra/layers/focus-scope/types.ts","./src/uix/terra/layers/scroll/index.ts","./src/uix/terra/layers/popper/types.ts","./src/uix/terra/select/types.ts","./src/uix/terra/select/exports.ts","./src/uix/terra/select/index.ts","./src/uix/terra/combobox/types.ts","./src/uix/terra/combobox/exports.ts","./src/uix/terra/combobox/index.ts","./src/uix/terra/time-field/types.ts","./src/uix/terra/time-field/exports.ts","./src/uix/terra/time-field/index.ts","./src/uix/terra/time-range-field/types.ts","./src/uix/terra/time-range-field/exports.ts","./src/uix/terra/time-range-field/index.ts","./src/uix/terra/date-range-field/types.ts","./src/uix/terra/date-range-field/exports.ts","./src/uix/terra/date-range-field/index.ts","./src/uix/terra/date-range-picker/types.ts","./src/uix/terra/date-range-picker/exports.ts","./src/uix/terra/date-range-picker/index.ts","./src/uix/terra/index.ts","./src/uix/air/components/accordion/types.ts","./src/uix/air/components/accordion/index.ts","./src/uix/air/components/layout/shared.ts","./src/uix/air/components/layout/box/types.ts","./src/uix/air/components/layout/box/index.ts","./src/uix/air/components/layout/container/types.ts","./src/uix/air/components/layout/container/index.ts","./src/uix/air/components/layout/section/types.ts","./src/uix/air/components/layout/section/index.ts","./src/uix/air/components/layout/aspect-ratio/types.ts","./src/uix/air/components/layout/aspect-ratio/index.ts","./src/uix/air/components/layout/grid/types.ts","./src/uix/air/components/layout/grid/index.ts","./src/uix/air/components/layout/auto-grid/types.ts","./src/uix/air/components/layout/auto-grid/index.ts","./src/uix/air/components/layout/flex/types.ts","./src/uix/air/components/layout/flex/index.ts","./src/uix/air/components/layout/float/types.ts","./src/uix/air/components/layout/float/index.ts","./src/uix/air/components/layout/group/types.ts","./src/uix/air/components/layout/group/index.ts","./src/uix/air/components/layout/scroll-area/types.ts","./src/uix/air/components/layout/scroll-area/index.ts","./src/uix/air/components/layout/separator/types.ts","./src/uix/air/components/layout/separator/index.ts","./src/uix/air/components/layout/stack/types.ts","./src/uix/air/components/layout/stack/index.ts","./src/uix/air/components/layout/splitter/types.ts","./src/uix/air/components/layout/splitter/index.ts","./src/uix/air/components/layout/wrap/types.ts","./src/uix/air/components/layout/wrap/index.ts","./src/uix/air/components/layout/index.ts","./src/uix/air/components/drawer/types.ts","./src/uix/air/components/drawer/index.ts","./src/uix/air/components/dialog/types.ts","./src/uix/air/components/dialog/index.ts","./src/uix/air/components/field/types.ts","./src/uix/air/components/field/index.ts","./src/uix/air/components/form/types.ts","./src/uix/air/components/form/index.ts","./src/uix/air/components/calendar/types.ts","./src/uix/air/components/calendar/index.ts","./src/uix/air/components/input/types.ts","./src/uix/air/components/input/index.ts","./src/uix/air/components/select/types.ts","./src/uix/air/components/select/index.ts","./src/uix/air/components/combobox/types.ts","./src/uix/air/components/combobox/index.ts","./src/uix/air/components/command/types.ts","./src/uix/air/components/command/index.ts","./src/uix/air/components/color-picker/types.ts","./src/uix/air/components/color-picker/index.ts","./src/uix/air/components/tooltip/types.ts","./src/uix/air/components/tooltip/index.ts","./src/uix/air/components/link-preview/types.ts","./src/uix/air/components/link-preview/index.ts","./src/uix/air/components/popover/types.ts","./src/uix/air/components/popover/index.ts","./src/uix/air/components/switch/types.ts","./src/uix/air/components/switch/index.ts","./src/uix/air/components/checkbox/types.ts","./src/uix/air/components/checkbox/index.ts","./src/uix/air/components/radio-group/types.ts","./src/uix/air/components/radio-group/index.ts","./src/uix/air/components/toggle/types.ts","./src/uix/air/components/toggle/index.ts","./src/uix/air/components/toggle-group/types.ts","./src/uix/air/components/toggle-group/index.ts","./src/uix/air/components/toolbar/types.ts","./src/uix/air/components/toolbar/index.ts","./src/uix/air/components/avatar/types.ts","./src/uix/air/components/avatar/index.ts","./src/uix/air/components/meter/types.ts","./src/uix/air/components/meter/index.ts","./src/uix/air/components/collapsible/types.ts","./src/uix/air/components/collapsible/index.ts","./src/uix/air/components/alert-dialog/types.ts","./src/uix/air/components/alert-dialog/index.ts","./src/uix/air/components/dropdown-menu/types.ts","./src/uix/air/components/dropdown-menu/index.ts","./src/uix/air/components/menubar/types.ts","./src/uix/air/components/menubar/index.ts","./src/uix/air/components/context-menu/types.ts","./src/uix/air/components/context-menu/index.ts","./src/uix/air/components/slider/types.ts","./src/uix/air/components/slider/index.ts","./src/uix/air/components/progress/types.ts","./src/uix/air/components/progress/index.ts","./src/uix/air/components/tags-input/types.ts","./src/uix/air/components/tags-input/index.ts","./src/uix/air/components/number-field/types.ts","./src/uix/air/components/number-field/index.ts","./src/uix/air/components/badge/types.ts","./src/uix/air/components/badge/index.ts","./src/uix/air/components/tabs/types.ts","./src/uix/air/components/tabs/index.ts","./src/uix/air/components/toast/types.ts","./src/uix/air/components/toast/index.ts","./src/uix/terra/system/index.ts","./src/uix/air/ling/air_ling.ts","./src/uix/air/ling/index.ts","./src/uix/air/semantics/types.ts","./src/uix/air/runtime/context.ts","./src/uix/air/runtime/index.ts","./src/uix/air/audio/sound.engine.ts","./src/uix/air/audio/sound.svelte.ts","./src/uix/air/audio/index.ts","./src/uix/air/semantics/audio/play.ts","./src/uix/air/resources/motions/types.ts","./src/uix/air/resources/motions/animation-preset.ts","./src/uix/air/resources/motions/soft-reveal.ts","./src/uix/air/resources/motions/spring-context.ts","./src/uix/air/resources/motions/smooth-expansion.ts","./src/uix/air/resources/motions/defaults.ts","./src/uix/air/resources/motions/genie.ts","./src/uix/air/resources/motions/mac-dialog.ts","./src/uix/air/resources/motions/index.ts","./src/uix/air/motion/transitions.ts","./src/uix/air/motion/index.ts","./src/uix/air/semantics/facade.svelte.ts","./src/uix/air/semantics/motion/revelation.ts","./src/uix/air/semantics/motion/context.ts","./src/uix/air/semantics/motion/expansion.ts","./src/uix/air/semantics/motion/destruction.ts","./src/uix/air/semantics/motion/action.svelte.ts","./src/uix/air/semantics/motion/index.ts","./src/uix/air/semantics/audio/feedback.ts","./src/uix/air/semantics/audio/selection.ts","./src/uix/air/semantics/audio/attention.ts","./src/uix/air/semantics/audio/emphasis.ts","./src/uix/air/semantics/audio/completion.ts","./src/uix/air/semantics/audio/persistence.ts","./src/uix/air/semantics/audio/index.ts","./src/uix/air/semantics/index.ts","./src/uix/air/resources/audios/types.ts","./src/uix/air/resources/audios/defaults.ts","./src/uix/air/resources/audios/tokens.ts","./src/uix/air/resources/audios/index.ts","./src/uix/air/interaction/runtime.svelte.ts","./src/uix/air/interaction/index.ts","./src/uix/air/system/types.ts","./src/uix/air/system/air.svelte.ts","./src/uix/air/system/index.ts","./src/uix/air/components/pagination/types.ts","./src/uix/air/components/pagination/index.ts","./src/uix/air/components/editable/types.ts","./src/uix/air/components/editable/index.ts","./src/uix/air/components/pin-input/types.ts","./src/uix/air/components/pin-input/pin-input.svelte.ts","./src/uix/air/components/pin-input/index.ts","./src/uix/air/components/rating-group/types.ts","./src/uix/air/components/rating-group/rating-group.svelte.ts","./src/uix/air/components/rating-group/index.ts","./src/uix/air/components/stepper/types.ts","./src/uix/air/components/stepper/index.ts","./src/uix/air/components/file-upload/types.ts","./src/uix/air/components/file-upload/index.ts","./src/uix/air/components/spinner/index.ts","./src/uix/air/components/icon/types.ts","./src/uix/air/components/icon/index.ts","./src/uix/air/components/typography/text/types.ts","./src/uix/air/components/typography/text/index.ts","./src/uix/air/components/typography/heading/types.ts","./src/uix/air/components/typography/heading/index.ts","./src/uix/air/components/typography/display/types.ts","./src/uix/air/components/typography/display/index.ts","./src/uix/air/components/typography/code/types.ts","./src/uix/air/components/typography/code/index.ts","./src/uix/air/components/typography/code-block/types.ts","./src/uix/air/components/typography/code-block/index.ts","./src/uix/air/components/typography/kbd/types.ts","./src/uix/air/components/typography/kbd/index.ts","./src/uix/air/components/typography/mark/types.ts","./src/uix/air/components/typography/mark/index.ts","./src/uix/air/components/typography/highlight/types.ts","./src/uix/air/components/typography/highlight/index.ts","./src/uix/air/components/typography/text-virtual-list/index.ts","./src/uix/air/components/typography/index.ts","./src/uix/air/themes/types.ts","./src/uix/air/themes/base/index.ts","./src/uix/air/themes/earth/sound.ts","./src/uix/air/themes/earth/index.ts","./src/uix/air/themes/chakra/index.ts","./src/uix/air/themes/pretty/index.ts","./src/uix/air/themes/index.ts","./src/uix/air/index.ts","./src/uix/air/components/avatar/avatar.svelte.ts","./src/uix/air/styles/types.ts","./src/uix/air/components/badge/styles.ts","./src/uix/air/components/button/styles.ts","./src/uix/air/components/calendar/calendar.context.ts","./src/uix/air/components/color-picker/color-picker-attrs.ts","./src/uix/air/components/color-picker/color-picker.svelte.ts","./src/uix/air/components/dialog/styles.ts","./src/uix/air/components/form/form.context.ts","./src/uix/air/components/icon/categories.ts","./src/uix/air/components/icon/create-icon.ts","./src/uix/air/components/icon/lib/index.ts","./src/uix/air/components/input/styles.ts","./src/uix/air/components/menubar/menubar.context.ts","./src/uix/terra/spinner/spinner.svelte.ts","./src/uix/air/components/spinner/shared.ts","./src/uix/air/components/switch/styles.ts","./src/uix/air/components/tabs/styles.ts","./src/uix/air/internal/canvas/analysis.ts","./src/uix/air/internal/canvas/bidi.ts","./src/uix/air/internal/canvas/measurement.ts","./src/uix/air/internal/canvas/line-break.ts","./src/uix/air/internal/canvas/layout.ts","./src/uix/air/internal/canvas/layout.test.ts","./src/uix/air/internal/canvas/use-canvas.svelte.ts","./src/uix/air/resources/index.ts","./src/uix/air/styles/index.ts","./src/uix/air/themes/base/motion.ts","./src/uix/air/themes/base/sound.ts","./src/uix/soma/reactive/reactive.svelte.ts","./src/uix/soma/reactive/index.ts","./src/uix/soma/attrs/create-attrs.ts","./src/uix/soma/attrs/contracts.ts","./src/uix/soma/attrs/helpers.ts","./src/uix/soma/attrs/index.ts","./src/uix/soma/provider/context.ts","./src/uix/soma/provider/provider.svelte.ts","./src/uix/soma/provider/index.ts","./src/uix/soma/props/props.ts","./src/uix/soma/props/index.ts","./src/uix/soma/keyboard/keys.ts","./src/uix/soma/types/component.ts","./src/uix/soma/types/events.ts","./src/uix/soma/types/guards.ts","./src/uix/soma/external/dates/index.ts","./src/uix/soma/types/services.ts","./src/uix/soma/css/css.ts","./src/uix/soma/css/index.ts","./src/uix/soma/dom/dom.ts","./src/uix/soma/dom/focus/guards.ts","./src/uix/soma/dom/focus/focus.ts","./src/uix/soma/dom/index.ts","./src/uix/soma/id/create-id.ts","./src/uix/soma/id/index.ts","./src/uix/soma/layers/floating/utils.ts","./src/uix/soma/layers/floating/types.ts","./src/uix/soma/layers/floating/use-floating.svelte.ts","./src/uix/soma/layers/floating/floating.svelte.ts","./src/uix/soma/layers/floating/safe-polygon.ts","./src/uix/soma/layers/floating/index.ts","./src/uix/soma/types/html.ts","./src/uix/soma/types/index.ts","./src/uix/soma/keyboard/directional.ts","./src/uix/soma/keyboard/index.ts","./src/uix/soma/events/types.ts","./src/uix/soma/events/add-event-listener.ts","./src/uix/soma/events/index.ts","./src/uix/soma/core/soma.svelte.ts","./src/uix/soma/index.ts","./src/uix/soma/layers/presence.svelte.ts","./src/uix/soma/layers/resize-observer.svelte.ts","./src/uix/soma/components/accordion/accordion-provider.svelte.ts","./src/uix/soma/components/accordion/types.ts","./src/uix/soma/components/accordion/exports.ts","./src/uix/soma/components/accordion/index.ts","./src/uix/soma/components/checkbox/types.ts","./src/uix/soma/components/checkbox/exports.ts","./src/uix/soma/components/checkbox/index.ts","./src/uix/soma/components/collapsible/types.ts","./src/uix/soma/components/collapsible/exports.ts","./src/uix/soma/components/collapsible/index.ts","./src/uix/soma/layers/dismissal.svelte.ts","./src/uix/soma/components/combobox/combobox-provider.svelte.ts","./src/uix/soma/components/combobox/types.ts","./src/uix/soma/components/combobox/exports.ts","./src/uix/soma/components/combobox/index.ts","./src/uix/soma/layers/focus-scope.svelte.ts","./src/uix/soma/layers/scroll-lock.svelte.ts","./src/uix/soma/layers/text-selection.svelte.ts","./src/uix/soma/components/dialog/dialog-provider.svelte.ts","./src/uix/soma/components/dialog/types.ts","./src/uix/soma/components/dialog/exports.ts","./src/uix/soma/components/dialog/index.ts","./src/uix/soma/components/dropdown-menu/types.ts","./src/uix/soma/components/dropdown-menu/exports.ts","./src/uix/soma/components/dropdown-menu/index.ts","./src/uix/soma/components/popover/types.ts","./src/uix/soma/components/popover/exports.ts","./src/uix/soma/components/popover/index.ts","./src/uix/soma/components/radio-group/types.ts","./src/uix/soma/components/radio-group/exports.ts","./src/uix/soma/components/radio-group/index.ts","./src/uix/soma/components/select/select-provider.svelte.ts","./src/uix/soma/components/select/types.ts","./src/uix/soma/components/select/exports.ts","./src/uix/soma/components/select/index.ts","./src/uix/soma/components/slider/slider-provider.svelte.ts","./src/uix/soma/components/slider/types.ts","./src/uix/soma/components/slider/exports.ts","./src/uix/soma/components/slider/index.ts","./src/uix/soma/components/switch/types.ts","./src/uix/soma/components/switch/exports.ts","./src/uix/soma/components/switch/index.ts","./src/uix/soma/components/tooltip/tooltip-provider.svelte.ts","./src/uix/soma/components/tooltip/types.ts","./src/uix/soma/components/tooltip/exports.ts","./src/uix/soma/components/tooltip/index.ts","./src/uix/soma/components/index.ts","./src/uix/soma/components/checkbox/checkbox-provider.svelte.ts","./src/uix/soma/components/collapsible/collapsible-provider.svelte.ts","./src/uix/soma/components/dropdown-menu/dropdown-menu-provider.svelte.ts","./src/uix/soma/components/internal/index.ts","./src/uix/soma/components/popover/popover-provider.svelte.ts","./src/uix/soma/components/radio-group/radio-group-provider.svelte.ts","./src/uix/soma/components/switch/switch-provider.svelte.ts","./src/uix/soma/external/dates/adapter.ts","./src/uix/soma/layers/index.ts","./src/uix/terra/app.d.ts","./src/uix/terra/aspect-ratio/aspect-ratio.svelte.ts","./src/uix/terra/avatar/avatar.svelte.ts","./src/uix/terra/utils/datetime/announcer.ts","./src/uix/terra/utils/datetime/formatter.ts","./src/uix/terra/utils/datetime/segments.ts","./src/uix/terra/utils/datetime/helpers.ts","./src/uix/terra/utils/datetime/index.ts","./src/uix/terra/utils/datetime/calendar-attrs.ts","./src/uix/terra/utils/datetime/calendar-helpers.svelte.ts","./src/uix/terra/calendar/calendar.svelte.ts","./src/uix/terra/checkbox/checkbox.svelte.ts","./src/uix/terra/collapsible/collapsible.svelte.ts","./src/uix/terra/command/utils.ts","./src/uix/terra/command/command.svelte.ts","./src/uix/terra/date-range-field/date-range-field.svelte.ts","./src/uix/terra/date-field/date-field.svelte.ts","./src/uix/terra/date-picker/date-picker.svelte.ts","./src/uix/terra/date-range-picker/date-range-picker.svelte.ts","./src/uix/terra/dialog/dialog.svelte.ts","./src/uix/terra/editable/editable.svelte.ts","./src/uix/terra/form/form.svelte.ts","./src/uix/terra/field/field-state.svelte.ts","./src/uix/terra/field/field.svelte.ts","./src/uix/terra/label/label.svelte.ts","./src/uix/terra/layers/index.ts","./src/uix/terra/layers/direction/direction.svelte.ts","./src/uix/terra/layers/direction/exports.ts","./src/uix/terra/layers/direction/index.ts","./src/uix/terra/layers/dismissible/index.ts","./src/uix/terra/menu/utils.ts","./src/uix/terra/menu/menu.svelte.ts","./src/uix/terra/layers/dismissible/use-dismissable-layer.svelte.ts","./src/uix/terra/layers/escape/index.ts","./src/uix/terra/layers/escape/use-escape-layer.svelte.ts","./src/uix/terra/layers/focus-scope/use-focus-scope.svelte.ts","./src/uix/terra/layers/focus-scope/focus-scope-manager.ts","./src/uix/terra/layers/focus-scope/index.ts","./src/uix/terra/layers/popper/index.ts","./src/uix/terra/layers/portal/index.ts","./src/uix/terra/layers/presence/index.ts","./src/uix/terra/layers/presence/use-presence.svelte.ts","./src/uix/terra/layers/text-selection/index.ts","./src/uix/terra/layers/text-selection/use-text-selection-layer.svelte.ts","./src/uix/terra/layers/visually-hidden/types.ts","./src/uix/terra/layers/visually-hidden/index.ts","./src/uix/terra/link-preview/link-preview.svelte.ts","./src/uix/terra/menu/exports.ts","./src/uix/terra/menu/index.ts","./src/uix/terra/menubar/menubar.svelte.ts","./src/uix/terra/meter/meter.svelte.ts","./src/uix/terra/system/prop-resolvers.ts","./src/uix/terra/number-field/number-field.svelte.ts","./src/uix/terra/popover/popover.svelte.ts","./src/uix/terra/progress/progress.svelte.ts","./src/uix/terra/radio-group/radio-group.svelte.ts","./src/uix/terra/range-calendar/range-calendar.svelte.ts","./src/uix/terra/scroll-area/scroll-area.svelte.ts","./src/uix/terra/separator/separator.svelte.ts","./src/uix/terra/slider/helpers.ts","./src/uix/terra/slider/slider.svelte.ts","./src/uix/terra/switch/switch.svelte.ts","./src/uix/terra/tabs/tabs.svelte.ts","./src/uix/terra/tags-input/tags-input.svelte.ts","./src/uix/terra/utils/datetime/time-helpers.ts","./src/uix/terra/time-field/time-field.svelte.ts","./src/uix/terra/time-range-field/time-range-field.svelte.ts","./src/uix/terra/toggle/toggle.svelte.ts","./src/uix/terra/toggle-group/toggle-group.svelte.ts","./src/uix/terra/toolbar/toolbar.svelte.ts","./src/uix/terra/trans/exports.ts","./src/uix/terra/trans/trans.svelte.ts","./src/uix/terra/utils/csstype.d.ts","./src/uix/terra/utils/warn.ts","./src/uix/terra/utils/framework/watch.svelte.ts","./src/uix/terra/utils/state/symbols.ts","./src/uix/terra/utils/state/types.ts","./src/uix/terra/utils/state/derived.svelte.ts","./src/uix/terra/utils/state/guards.ts","./src/uix/terra/utils/state/readonly.svelte.ts","./src/uix/terra/utils/state/state.svelte.ts","./src/uix/terra/utils/state/utils.svelte.ts","./src/uix/terra/virtual-list/virtual-list.svelte.ts"],"fileIdsList":[[102,165,173,177,180,182,183,184,196,259],[102,165,173,177,180,182,183,184,196,259,674],[93,102,165,173,177,180,182,183,184,196,259],[102,165,173,177,180,182,183,184,196,259,262],[93,102,165,173,177,180,182,183,184,196,259,262],[102,165,173,177,180,182,183,184,196,259,262,265],[102,165,173,177,180,182,183,184,196,259,262,350],[102,165,173,177,180,182,183,184,196,259,351],[102,165,173,177,180,182,183,184,196,685],[102,165,173,177,180,182,183,184,196,686,687],[102,165,173,177,180,182,183,184,196],[93,99,102,165,173,177,179,180,182,183,184,196,254,256,257,258,259,261,454],[102,165,173,177,180,182,183,184,196,254,454],[93,102,165,173,177,180,182,183,184,196,254,255,454],[102,165,173,177,180,182,183,184,196,409,410],[102,162,163,165,173,177,180,182,183,184,196],[102,164,165,173,177,180,182,183,184,196],[165,173,177,180,182,183,184,196],[102,165,173,177,180,182,183,184,196,204],[102,165,166,171,173,176,177,180,182,183,184,186,196,201,213],[102,165,166,167,173,176,177,180,182,183,184,196],[102,165,168,173,177,180,182,183,184,196,214],[102,165,169,170,173,177,180,182,183,184,187,196],[102,165,170,173,177,180,182,183,184,196,201,210],[102,165,171,173,176,177,180,182,183,184,186,196],[102,164,165,172,173,177,180,182,183,184,196],[102,165,173,174,177,180,182,183,184,196],[102,165,173,175,176,177,180,182,183,184,196],[102,164,165,173,176,177,180,182,183,184,196],[102,165,173,176,177,178,180,182,183,184,196,201,213],[102,165,173,176,177,178,180,182,183,184,196,201,204],[102,152,165,173,176,177,179,180,182,183,184,186,196,201,213],[102,165,173,176,177,179,180,182,183,184,186,196,201,210,213],[102,165,173,177,179,180,181,182,183,184,196,201,210,213],[100,101,102,103,104,105,106,107,108,109,110,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220],[102,165,173,176,177,180,182,183,184,196],[102,165,173,177,180,182,184,196],[102,165,173,177,180,182,183,184,185,196,213],[102,165,173,176,177,180,182,183,184,186,196,201],[102,165,173,177,180,182,183,184,187,196],[102,165,173,177,180,182,183,184,188,196],[102,165,173,176,177,180,182,183,184,191,196],[102,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220],[102,165,173,177,180,182,183,184,193,196],[102,165,173,177,180,182,183,184,194,196],[102,165,170,173,177,180,182,183,184,186,196,204],[102,165,173,176,177,180,182,183,184,196,197],[102,165,173,177,180,182,183,184,196,198,214,217],[102,165,173,176,177,180,182,183,184,196,201,203,204],[102,165,173,177,180,182,183,184,196,202,204],[102,165,173,177,180,182,183,184,196,204,214],[102,165,173,177,180,182,183,184,196,205],[102,162,165,173,177,180,182,183,184,196,201,207,213],[102,165,173,177,180,182,183,184,196,201,206],[102,165,173,176,177,180,182,183,184,196,208,209],[102,165,173,177,180,182,183,184,196,208,209],[102,165,170,173,177,180,182,183,184,186,196,201,210],[102,165,173,177,180,182,183,184,196,211],[102,165,173,177,180,182,183,184,186,196,212],[102,165,173,177,179,180,182,183,184,194,196,213],[102,165,173,177,180,182,183,184,196,214,215],[102,165,170,173,177,180,182,183,184,196,215],[102,165,173,177,180,182,183,184,196,201,216],[102,165,173,177,180,182,183,184,185,196,217],[102,165,173,177,180,182,183,184,196,218],[102,165,168,173,177,180,182,183,184,196],[102,165,170,173,177,180,182,183,184,196],[102,165,173,177,180,182,183,184,196,214],[102,152,165,173,177,180,182,183,184,196],[102,165,173,177,180,182,183,184,196,213],[102,165,173,177,180,182,183,184,196,219],[102,165,173,177,180,182,183,184,191,196],[102,165,173,177,180,182,183,184,196,209],[102,152,165,173,176,177,178,180,182,183,184,191,196,201,204,213,216,217,219],[102,165,173,177,180,182,183,184,196,201,220],[83,102,165,173,177,180,182,183,184,196],[84,85,86,87,102,165,173,177,180,182,183,184,196],[83,85,102,165,173,177,180,182,183,184,196],[84,87,102,165,173,177,180,182,183,184,196],[102,165,173,177,180,182,183,184,196,448],[102,165,173,177,180,182,183,184,196,450,459,460,465,466],[102,165,173,177,180,182,183,184,196,440,444,445,447],[102,165,173,177,180,182,183,184,196,448,459,460,466],[102,165,173,177,180,182,183,184,196,445,448],[102,165,173,177,180,182,183,184,196,440,446,447,448],[102,165,173,177,180,182,183,184,196,257,397,403,405,407,408,411,430],[102,165,173,177,180,182,183,184,196,426],[102,165,173,177,180,182,183,184,196,426,427],[102,165,173,177,180,182,183,184,196,401,403,404],[102,165,173,177,180,182,183,184,196,401,403],[102,165,173,177,180,182,183,184,196,401],[102,165,173,177,180,182,183,184,196,396,401,413,414],[102,165,173,177,180,182,183,184,196,396,413],[102,165,173,177,180,182,183,184,196,406],[102,165,173,177,180,182,183,184,196,396,402],[102,165,173,177,180,182,183,184,196,396],[102,165,173,177,180,182,183,184,196,396,398,402,442],[102,165,173,177,180,182,183,184,196,398],[102,165,173,177,180,182,183,184,196,396,397,398,399,400],[88,89,102,165,173,177,180,182,183,184,196],[102,165,173,177,180,182,183,184,196,435,436],[102,165,173,177,180,182,183,184,196,435,436,437,438],[102,165,173,177,180,182,183,184,196,435,437],[102,165,173,177,180,182,183,184,196,435],[102,165,173,177,180,182,183,184,196,249,250],[102,165,173,177,180,182,183,184,196,457],[102,165,173,177,180,182,183,184,196,463],[102,165,166,173,177,180,182,183,184,196,201,461,462],[102,165,173,177,180,182,183,184,196,464],[102,165,173,177,180,182,183,184,196,243],[102,165,173,177,180,182,183,184,196,241,243],[102,165,173,177,180,182,183,184,196,232,240,241,242,244,246],[102,165,173,177,180,182,183,184,196,230],[102,165,173,177,180,182,183,184,196,233,238,243,246],[102,165,173,177,180,182,183,184,196,229,246],[102,165,173,177,180,182,183,184,196,233,234,237,238,239,246],[102,165,173,177,180,182,183,184,196,233,234,235,237,238,246],[102,165,173,177,180,182,183,184,196,230,231,232,233,234,238,239,240,242,243,244,246],[102,165,173,177,180,182,183,184,196,246],[102,165,173,177,180,182,183,184,196,228,230,231,232,233,234,235,237,238,239,240,241,242,243,244,245],[102,165,173,177,180,182,183,184,196,228,246],[102,165,173,177,180,182,183,184,196,233,235,236,238,239,246],[102,165,173,177,180,182,183,184,196,237,246],[102,165,173,177,180,182,183,184,196,238,239,243,246],[102,165,173,177,180,182,183,184,196,231,241],[102,165,173,177,180,182,183,184,196,223,253,254],[91,102,165,173,177,180,182,183,184,196,223],[102,165,173,177,180,182,183,184,196,570,635],[102,165,173,177,180,182,183,184,196,567],[102,165,173,177,180,182,183,184,196,568],[102,165,173,177,180,182,183,184,196,567,570],[102,165,173,177,180,182,183,184,196,571],[102,165,173,177,180,182,183,184,196,631],[102,165,173,177,180,182,183,184,196,573],[102,165,173,177,180,182,183,184,196,570],[102,165,173,177,180,182,183,184,196,575],[102,165,173,177,180,182,183,184,196,577],[102,165,173,177,180,182,183,184,196,579],[102,165,173,177,180,182,183,184,196,581],[102,165,173,177,180,182,183,184,196,583],[102,165,173,177,180,182,183,184,196,569,572,574,576,578,580,582,584,586,588,591,593,595,597,599,601,603,605,607,609,611,613,615,617,619,620,622,624,626,628,630,632,634],[102,165,173,177,180,182,183,184,196,594],[102,165,173,177,180,182,183,184,196,585],[102,165,173,177,180,182,183,184,196,568,570],[102,165,173,177,180,182,183,184,196,587],[102,165,173,177,180,182,183,184,196,590],[102,165,173,177,180,182,183,184,196,567,570,589],[102,165,173,177,180,182,183,184,196,592],[102,165,173,177,180,182,183,184,196,633],[102,165,173,177,180,182,183,184,196,596],[102,165,173,177,180,182,183,184,196,598],[102,165,173,177,180,182,183,184,196,600],[102,165,173,177,180,182,183,184,196,602],[102,165,173,177,180,182,183,184,196,604],[102,165,173,177,180,182,183,184,196,606],[102,165,173,177,180,182,183,184,196,608],[102,165,173,177,180,182,183,184,196,610],[102,165,173,177,180,182,183,184,196,612],[102,165,173,177,180,182,183,184,196,614],[102,165,173,177,180,182,183,184,196,616],[102,165,173,177,180,182,183,184,196,618],[102,165,173,177,180,182,183,184,196,589],[102,165,173,177,180,182,183,184,196,625],[102,165,173,177,180,182,183,184,196,621],[102,165,173,177,180,182,183,184,196,623],[102,165,173,177,180,182,183,184,196,627],[102,165,173,177,180,182,183,184,196,629],[93,102,165,173,177,180,182,183,184,196,654],[89,90,91,92,93,102,165,173,177,180,182,183,184,196,223],[102,117,120,123,124,165,173,177,180,182,183,184,196,213],[102,120,165,173,177,180,182,183,184,196,201,213],[102,120,124,165,173,177,180,182,183,184,196,213],[102,165,173,177,180,182,183,184,196,201],[102,114,165,173,177,180,182,183,184,196],[102,118,165,173,177,180,182,183,184,196],[102,116,117,120,165,173,177,180,182,183,184,196,213],[102,165,173,177,180,182,183,184,186,196,210],[102,165,173,177,180,182,183,184,196,221],[102,114,165,173,177,180,182,183,184,196,221],[102,116,120,165,173,177,180,182,183,184,186,196,213],[102,111,112,113,115,119,165,173,176,177,180,182,183,184,196,201,213],[102,120,129,137,165,173,177,180,182,183,184,196],[102,112,118,165,173,177,180,182,183,184,196],[102,120,146,147,165,173,177,180,182,183,184,196],[102,112,115,120,165,173,177,180,182,183,184,196,204,213,221],[102,120,165,173,177,180,182,183,184,196],[102,116,120,165,173,177,180,182,183,184,196,213],[102,111,165,173,177,180,182,183,184,196],[102,114,115,116,118,119,120,121,122,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,147,148,149,150,151,165,173,177,180,182,183,184,196],[102,120,139,142,165,173,177,180,182,183,184,196],[102,120,129,130,131,165,173,177,180,182,183,184,196],[102,118,120,130,132,165,173,177,180,182,183,184,196],[102,119,165,173,177,180,182,183,184,196],[102,112,114,120,165,173,177,180,182,183,184,196],[102,120,124,130,132,165,173,177,180,182,183,184,196],[102,124,165,173,177,180,182,183,184,196],[102,118,120,123,165,173,177,180,182,183,184,196,213],[102,112,116,120,129,165,173,177,180,182,183,184,196],[102,120,139,165,173,177,180,182,183,184,196],[102,132,165,173,177,180,182,183,184,196],[102,114,120,146,165,173,177,180,182,183,184,196,204,219,221],[98,102,165,173,177,180,182,183,184,196],[94,102,165,173,177,180,182,183,184,196],[94,95,97,102,165,173,176,177,179,180,181,182,183,184,186,196,201,210,213,220,221,222,223,224,225,226,227,247,248,252,253,254],[94,95,96,102,165,173,177,180,182,183,184,196,222],[95,102,165,173,177,180,182,183,184,196],[96,97,102,165,173,177,180,182,183,184,196],[102,165,173,177,180,182,183,184,196,251],[102,165,173,177,180,182,183,184,196,223,254],[102,165,173,177,180,182,183,184,196,444,449],[102,165,173,177,180,182,183,184,196,412,430,454],[102,165,173,177,180,182,183,184,196,396,397,399,400,401,403,405,407,415,416,418,429,430,441,443],[102,165,173,177,180,182,183,184,196,405,423,424,430],[102,165,173,177,180,182,183,184,196,405,416,420,430],[102,165,173,177,180,182,183,184,196,396,403,405,415,430],[102,165,173,177,180,182,183,184,196,225],[102,165,173,177,180,182,183,184,196,396,405,412,415,417,425,430],[102,165,173,177,180,182,183,184,196,254,452,454],[102,165,168,173,177,180,182,183,184,196,201,254,396,401,403,405,412,415,416,417,418,420,421,422,425,428,429,430,441,450,451,454,466],[102,165,173,177,180,182,183,184,196,225,405,415,416,430],[102,165,173,177,180,182,183,184,196,405,423,424,425,430],[102,165,173,177,180,182,183,184,196,225,405,417,418,419,430],[102,165,168,173,177,180,182,183,184,196,201,225,254,396,401,403,405,412,415,416,417,418,419,420,421,422,423,424,425,428,429,430,441,450,451,452,453,454,466],[102,165,168,173,177,180,182,183,184,196,201,225,254,396,401,403,405,412,415,416,417,418,419,420,421,422,423,424,425,428,429,430,441,450,451,452,454,466],[102,165,173,177,180,182,183,184,196,225,396,401,403,405,407,412,415,416,417,418,419,420,421,423,424,425,428,430,431,432,433,434,439],[102,165,168,173,177,179,180,182,183,184,196,201,225,254,396,401,403,405,412,415,416,417,418,419,420,421,422,423,424,425,428,429,430,441,450,451,452,453,454,456,458,466],[102,165,173,177,180,182,183,184,196,396,403,405,415,416,418,423,424,425,430,432],[102,165,173,177,180,182,183,184,196,471,480,498,502,504,507,511,514],[102,165,173,177,180,182,183,184,196,471,480,498,501,503,506,510,513],[102,165,173,177,180,182,183,184,196,498,515],[102,165,173,177,180,182,183,184,196,476,478,514,515],[102,165,173,177,180,182,183,184,196,478,514,519],[102,165,173,177,180,182,183,184,196,471,479,480,481,482,496,497],[102,165,173,177,180,182,183,184,196,440,447,478,514,517,519],[102,165,173,177,180,182,183,184,196,480,499],[102,165,173,177,180,182,183,184,196,478],[102,165,173,177,180,182,183,184,196,469,471,480,481,506],[102,165,173,177,180,182,183,184,196,471,478,480,481,500,505],[102,165,173,177,180,182,183,184,196,471,478],[102,165,173,177,180,182,183,184,196,478,480],[102,165,173,177,180,182,183,184,196,469,480,495,496,503],[102,165,173,177,180,182,183,184,196,469,480,495,496,500],[102,165,173,177,180,182,183,184,196,480,495],[102,165,173,177,180,182,183,184,196,480,481,482,496,497,500,501,503,506,510],[102,165,173,177,180,182,183,184,196,469,480,497,501],[102,165,173,177,180,182,183,184,196,478,480,497,500],[102,165,173,177,180,182,183,184,196,518],[102,165,173,177,180,182,183,184,196,482],[102,165,173,177,180,182,183,184,196,469,471,480,482,510],[102,165,173,177,180,182,183,184,196,469,478,480,482,500,508,509],[102,165,173,177,180,182,183,184,196,471,475],[102,165,173,177,180,182,183,184,196,480],[102,165,173,177,180,182,183,184,196,440,447,478,481,482,496,497,500,501,503,506,509,510],[102,165,173,177,180,182,183,184,196,478,514,516,517],[102,165,173,177,180,182,183,184,196,469,470,471,472,473,474],[102,165,173,177,180,182,183,184,196,471],[102,165,173,177,180,182,183,184,196,469,471],[102,165,173,177,180,182,183,184,196,469,471,473],[102,165,173,177,180,182,183,184,196,469,471,473,474,475,476,477],[102,165,173,177,180,182,183,184,196,475,476],[102,165,173,177,180,182,183,184,196,471,473,475],[102,165,173,177,180,182,183,184,196,469,470],[102,165,173,177,180,182,183,184,196,440,447,470,473,474,475,524],[102,165,173,177,180,182,183,184,196,478,479,512],[102,165,173,177,180,182,183,184,196,479,512,513],[102,165,173,177,180,182,183,184,196,479],[102,165,173,177,180,182,183,184,196,440,447,475,479,512,513],[102,165,173,177,180,182,183,184,196,527],[102,165,173,177,180,182,183,184,196,529],[102,165,173,177,180,182,183,184,196,529,530,531],[102,165,173,177,180,182,183,184,196,529,530],[102,165,173,177,180,182,183,184,196,487,494,495],[102,165,173,177,180,182,183,184,196,486,494,495],[102,165,173,177,180,182,183,184,196,484,486,494,495],[102,165,173,177,180,182,183,184,196,494,495],[102,165,173,177,180,182,183,184,196,486,487,494,495],[102,165,173,177,180,182,183,184,196,484,494,495],[102,165,173,177,180,182,183,184,196,487,489,491,492,493,495],[102,165,173,177,180,182,183,184,196,487,495,533,534,535,536,537,538,539,540],[102,165,173,177,180,182,183,184,196,494],[102,165,173,177,180,182,183,184,196,495],[102,165,173,177,180,182,183,184,196,489,494,495],[102,165,173,177,180,182,183,184,196,487,489,490,491,493,494,495,533,534,535,536,537,538,539,540,541,542,543,544],[102,165,173,177,180,182,183,184,196,487,489,490,492,494,495],[102,165,173,177,180,182,183,184,196,487,490,491,494,495],[102,165,173,177,180,182,183,184,196,488,491,494,495],[102,165,173,177,180,182,183,184,196,487,489,490,491,494,495],[102,165,173,177,180,182,183,184,196,546],[102,165,173,177,180,182,183,184,196,483],[102,165,173,177,180,182,183,184,196,485],[102,165,173,177,180,182,183,184,196,548,549],[102,165,173,177,180,182,183,184,196,548,549,550,551,552,553,554],[102,165,173,177,180,182,183,184,196,548,549,551],[102,165,173,177,180,182,183,184,196,548],[102,165,173,177,180,182,183,184,196,548,549,550,551,552,553],[102,165,173,177,180,182,183,184,196,556],[102,165,173,177,180,182,183,184,196,558],[99,102,165,173,177,180,182,183,184,196],[93,102,165,173,177,180,182,183,184,196],[102,165,173,177,180,182,183,184,196,471,564],[102,165,173,177,180,182,183,184,196,1014,1015],[102,165,173,177,180,182,183,184,196,1047],[102,165,173,177,180,182,183,184,196,1013,1017,1047],[93,102,165,173,177,180,182,183,184,196,910],[102,165,173,177,180,182,183,184,196,707,717,721,909],[93,102,165,173,177,180,182,183,184,196,854,986],[102,165,173,177,180,182,183,184,196,261,674,707,717,909],[102,165,173,177,180,182,183,184,196,636],[93,102,165,173,177,180,182,183,184,196,980],[93,102,165,173,177,180,182,183,184,196,261,674,717],[93,102,165,173,177,180,182,183,184,196,1002],[102,165,173,177,180,182,183,184,196,1097],[93,102,165,173,177,180,182,183,184,196,261,674],[93,102,165,173,177,180,182,183,184,196,718],[102,165,173,177,180,182,183,184,196,710,713,717],[93,102,165,173,177,180,182,183,184,196,950],[102,165,173,177,180,182,183,184,196,717,909],[93,102,165,173,177,180,182,183,184,196,970],[102,165,173,177,180,182,183,184,196,261,674,717,909],[93,102,165,173,177,180,182,183,184,196,984],[102,165,173,177,180,182,183,184,196,909],[102,165,173,177,180,182,183,184,196,728],[102,165,173,177,180,182,183,184,196,484,532,638,707,1052],[93,102,165,173,177,180,182,183,184,196,960],[93,102,165,173,177,180,182,183,184,196,261,532,674,717],[93,102,165,173,177,180,182,183,184,196,956],[93,102,165,173,177,180,182,183,184,196,261,674,717,909,954],[93,102,165,173,177,180,182,183,184,196,850,958],[93,102,165,173,177,180,182,183,184,196,843,992],[93,102,165,173,177,180,182,183,184,196,856,944],[93,102,165,173,177,180,182,183,184,196,859,942],[93,102,165,173,177,180,182,183,184,196,840,988],[93,102,165,173,177,180,182,183,184,196,1055],[93,102,165,173,177,180,182,183,184,196,946],[93,102,165,173,177,180,182,183,184,196,801,1065],[102,165,173,177,180,182,183,184,196,948],[93,102,165,173,177,180,182,183,184,196,948],[102,165,173,177,180,182,183,184,196,717,719,909],[102,165,173,177,180,182,183,184,196,1068],[93,102,165,173,177,180,182,183,184,196,1068],[93,102,165,173,177,180,182,183,184,196,952],[93,102,165,173,177,180,182,183,184,196,919],[93,102,165,173,177,180,182,183,184,196,923],[102,165,173,177,180,182,183,184,196,721,912,922],[93,102,165,173,177,180,182,183,184,196,913],[93,102,165,173,177,180,182,183,184,196,261,674,707,721,912],[93,102,165,173,177,180,182,183,184,196,915],[102,165,173,177,180,182,183,184,196,717,721,914],[93,102,165,173,177,180,182,183,184,196,925],[102,165,173,177,180,182,183,184,196,721,912,914],[93,102,165,173,177,180,182,183,184,196,927],[93,102,165,173,177,180,182,183,184,196,921],[93,102,165,173,177,180,182,183,184,196,929],[102,165,173,177,180,182,183,184,196,721,926],[102,165,173,177,180,182,183,184,196,912,914,916,918,920,922,924,926,928,930,932,934,936,938,940],[93,102,165,173,177,180,182,183,184,196,931],[93,102,165,173,177,180,182,183,184,196,917],[93,102,165,173,177,180,182,183,184,196,933],[102,165,173,177,180,182,183,184,196,261,674,721],[93,102,165,173,177,180,182,183,184,196,937],[93,102,165,173,177,180,182,183,184,196,935],[102,165,173,177,180,182,183,184,196,721,912,926],[93,102,165,173,177,180,182,183,184,196,939],[93,102,165,173,177,180,182,183,184,196,833,964],[102,165,173,177,180,182,183,184,196,717,831],[93,102,165,173,177,180,182,183,184,196,846,990],[102,165,173,177,180,182,183,184,196,990],[102,165,173,177,180,182,183,184,196,717,844,909],[93,102,165,173,177,180,182,183,184,196,982],[93,102,165,173,177,180,182,183,184,196,1000],[102,165,173,177,180,182,183,184,196,261,674,717,909,952],[93,102,165,173,177,180,182,183,184,196,1053],[93,102,165,173,177,180,182,183,184,196,1057,1058],[93,102,165,173,177,180,182,183,184,196,1057],[93,102,165,173,177,180,182,183,184,196,836,966],[102,165,173,177,180,182,183,184,196,717,836],[93,102,165,173,177,180,182,183,184,196,996],[93,102,165,173,177,180,182,183,184,196,972],[93,102,165,173,177,180,182,183,184,196,1060,1061],[102,165,173,177,180,182,183,184,196,1060],[93,102,165,173,177,180,182,183,184,196,954],[93,102,165,173,177,180,182,183,184,196,717,909],[93,102,165,173,177,180,182,183,184,196,994],[93,102,165,173,177,180,182,183,184,196,767],[102,165,173,177,180,182,183,184,196,767,1110],[93,102,165,173,177,180,182,183,184,196,1063],[93,102,165,173,177,180,182,183,184,196,968],[93,102,165,173,177,180,182,183,184,196,1004],[93,102,165,173,177,180,182,183,184,196,998],[102,165,173,177,180,182,183,184,196,717,909,952],[93,102,165,173,177,180,182,183,184,196,805,1006],[93,102,165,173,177,180,182,183,184,196,261,674,707,909],[93,102,165,173,177,180,182,183,184,196,976],[93,102,165,173,177,180,182,183,184,196,974],[102,165,173,177,180,182,183,184,196,717,775],[93,102,165,173,177,180,182,183,184,196,978],[93,102,165,173,177,180,182,183,184,196,962],[102,165,173,177,180,182,183,184,196,717,826],[93,102,165,173,177,180,182,183,184,196,1078],[93,102,165,173,177,180,182,183,184,196,261,674,1076],[93,102,165,173,177,180,182,183,184,196,1076],[93,102,165,173,177,180,182,183,184,196,1074],[93,102,165,173,177,180,182,183,184,196,1072],[93,102,165,173,177,180,182,183,184,196,1084],[102,165,173,177,180,182,183,184,196,1082],[102,165,173,177,180,182,183,184,196,1071,1073,1075,1077,1079,1081,1083,1085,1086],[93,102,165,173,177,180,182,183,184,196,1080],[93,102,165,173,177,180,182,183,184,196,1082],[93,102,165,173,177,180,182,183,184,196,1070],[102,165,173,177,180,182,183,184,196,555,714],[102,165,173,177,180,182,183,184,196,714,715],[102,165,173,177,180,182,183,184,196,719,721,911,941,943,945,947,949,951,953,955,957,959,961,963,965,967,969,971,973,975,977,979,981,983,985,987,989,991,993,995,997,999,1001,1003,1005,1007,1010,1043,1052,1054,1056,1059,1062,1064,1066,1067,1068,1069,1071,1073,1075,1077,1079,1081,1083,1085,1087,1094],[102,165,173,177,180,182,183,184,196,1048],[102,165,173,177,180,182,183,184,196,555,1017,1026,1047],[102,165,173,177,180,182,183,184,196,1117,1118],[102,165,173,177,180,182,183,184,196,1114,1115,1116,1117],[102,165,173,177,180,182,183,184,196,1114,1116],[102,165,173,177,180,182,183,184,196,1114],[102,165,173,177,180,182,183,184,196,1118],[102,165,173,177,180,182,183,184,196,717,720],[102,165,173,177,180,182,183,184,196,716],[102,165,173,177,180,182,183,184,196,1008,1009],[102,165,173,177,180,182,183,184,196,1027],[93,102,165,173,177,180,182,183,184,196,1013,1026,1043],[102,165,173,177,180,182,183,184,196,1044],[102,165,173,177,180,182,183,184,196,1044,1045,1046],[102,165,173,177,180,182,183,184,196,1043,1044],[102,165,173,177,180,182,183,184,196,1043],[102,165,173,177,180,182,183,184,196,1026,1047],[102,165,173,177,180,182,183,184,196,1018],[102,165,173,177,180,182,183,184,196,1018,1020,1021,1022],[102,165,173,177,180,182,183,184,196,1018,1019,1020,1021,1022,1023,1024,1025],[93,102,165,173,177,180,182,183,184,196,1018,1019],[93,102,165,173,177,180,182,183,184,196,1043],[102,165,173,177,180,182,183,184,196,555,638,716,1049],[102,165,173,177,180,182,183,184,196,1012],[102,165,173,177,180,182,183,184,196,1029],[102,165,173,177,180,182,183,184,196,1017,1036,1037,1038,1039,1040,1041],[102,165,173,177,180,182,183,184,196,1016,1047],[93,102,165,173,177,180,182,183,184,196,1013,1017,1026,1028,1043],[102,165,173,177,180,182,183,184,196,1011,1029,1035,1042],[102,165,173,177,180,182,183,184,196,1013,1026,1043],[102,165,173,177,180,182,183,184,196,1030,1031,1032,1033,1034],[102,165,173,177,180,182,183,184,196,1097,1098,1099,1103,1108,1112,1113],[102,165,173,177,180,182,183,184,196,555,707,716,746,1008,1013,1043,1049,1050],[93,102,165,173,177,180,182,183,184,196,1050,1051],[102,165,173,177,180,182,183,184,196,707,710,716,1026,1047],[102,165,173,177,180,182,183,184,196,1088],[102,165,173,177,180,182,183,184,196,1026],[102,165,173,177,180,182,183,184,196,1026,1088,1090],[102,165,173,177,180,182,183,184,196,1088,1089,1091,1092,1093],[102,165,173,177,180,182,183,184,196,1127,1128,1129],[102,165,173,177,180,182,183,184,196,1126,1130,1133,1149,1157,1159,1163,1165,1166],[93,102,165,173,177,180,182,183,184,196,1167,1168],[102,165,173,177,180,182,183,184,196,1169],[93,102,165,173,177,180,182,183,184,196,1157,1167],[102,165,173,177,180,182,183,184,196,1126,1130,1133,1157,1159],[93,102,165,173,177,180,182,183,184,196,1171],[102,165,173,177,180,182,183,184,196,1172],[102,165,173,177,180,182,183,184,196,1157],[102,165,173,177,180,182,183,184,196,1126,1130,1133,1157],[93,102,165,173,177,180,182,183,184,196,1174],[102,165,173,177,180,182,183,184,196,1175],[102,165,173,177,180,182,183,184,196,1126,1130,1133,1155,1157,1159,1163,1165,1177],[93,102,165,173,177,180,182,183,184,196,1178,1179],[102,165,173,177,180,182,183,184,196,1180],[93,102,165,173,177,180,182,183,184,196,1157,1177,1178],[93,102,165,173,177,180,182,183,184,196,636,1126,1130,1133,1157,1159,1163,1165,1177,1182,1183,1184],[93,102,165,173,177,180,182,183,184,196,1185,1186],[102,165,173,177,180,182,183,184,196,1187],[93,102,165,173,177,180,182,183,184,196,1157,1177,1185],[93,102,165,173,177,180,182,183,184,196,1126,1130,1133,1155,1157,1159,1163,1165,1177,1182,1183,1184],[93,102,165,173,177,180,182,183,184,196,1189],[102,165,173,177,180,182,183,184,196,1190],[93,102,165,173,177,180,182,183,184,196,1157,1177],[102,165,173,177,180,182,183,184,196,1170,1173,1176,1181,1188,1191,1194,1197,1201,1205,1208,1212],[93,102,165,173,177,180,182,183,184,196,1192],[102,165,173,177,180,182,183,184,196,1193],[93,102,165,173,177,180,182,183,184,196,636,1126,1130,1133,1155,1157,1159,1163,1165,1177,1182,1183,1184],[93,102,165,173,177,180,182,183,184,196,1155,1157,1177],[93,102,165,173,177,180,182,183,184,196,1195],[102,165,173,177,180,182,183,184,196,1196],[102,165,173,177,180,182,183,184,196,1126,1130,1133,1157,1159,1163],[93,102,165,173,177,180,182,183,184,196,1198,1199],[102,165,173,177,180,182,183,184,196,1200],[102,165,173,177,180,182,183,184,196,1126,1130,1133,1155,1157,1159,1163,1165,1177,1183],[93,102,165,173,177,180,182,183,184,196,1157,1177,1198],[93,102,165,173,177,180,182,183,184,196,1202,1203],[102,165,173,177,180,182,183,184,196,1204],[102,165,173,177,180,182,183,184,196,1157,1202],[93,102,165,173,177,180,182,183,184,196,1206],[102,165,173,177,180,182,183,184,196,1207],[93,102,165,173,177,180,182,183,184,196,1209,1210],[102,165,173,177,180,182,183,184,196,1211],[93,102,165,173,177,180,182,183,184,196,636,1126,1130,1133,1155,1157,1159,1163,1165,1177],[102,165,173,177,180,182,183,184,196,1126,1133,1157],[102,165,173,177,180,182,183,184,196,1142],[102,165,173,177,180,182,183,184,196,1145],[102,165,173,177,180,182,183,184,196,1144,1145,1146],[102,165,173,177,180,182,183,184,196,1160,1161],[102,165,173,177,180,182,183,184,196,517,1140,1157],[102,165,173,177,180,182,183,184,196,544,545],[102,165,173,177,180,182,183,184,196,1148],[102,165,173,177,180,182,183,184,196,1126,1130,1133,1135,1143,1147,1149,1157,1159,1162,1163],[102,165,173,177,180,182,183,184,196,1136,1157],[102,165,173,177,180,182,183,184,196,1136,1158],[93,102,165,173,177,180,182,183,184,196,636,1126,1147,1159],[102,165,173,177,180,182,183,184,196,636,688,1126,1133,1143,1147,1149,1151,1152,1157],[102,165,173,177,180,182,183,184,196,1150,1151,1152,1153,1154],[93,102,165,173,177,180,182,183,184,196,636,688,1147],[93,102,165,173,177,180,182,183,184,196,688,1126,1153,1157],[102,165,173,177,180,182,183,184,196,688,1126,1150,1151],[93,102,165,173,177,180,182,183,184,196,636,698,1126],[102,165,173,177,180,182,183,184,196,1165,1166,1177,1182,1183,1184],[102,165,173,177,180,182,183,184,196,636,1126],[93,102,165,173,177,180,182,183,184,196,636,1126,1147,1149],[93,102,165,173,177,180,182,183,184,196,636,1126,1147],[102,165,173,177,180,182,183,184,196,1134],[102,165,173,177,180,182,183,184,196,654],[102,165,173,177,180,182,183,184,196,1131,1132],[93,102,165,173,177,180,182,183,184,196,1126,1130,1131],[102,165,173,177,180,182,183,184,196,1125],[93,102,165,173,177,180,182,183,184,196,1126],[102,165,173,177,180,182,183,184,196,261,674],[102,165,173,177,180,182,183,184,196,1137,1138,1139,1141,1155,1156],[102,165,173,177,180,182,183,184,196,1137,1140],[93,102,165,173,177,180,182,183,184,196,636,638,648,706,707,728],[93,102,165,173,177,180,182,183,184,196,729,730],[102,165,173,177,180,182,183,184,196,731],[102,165,173,177,180,182,183,184,196,707],[93,102,165,173,177,180,182,183,184,196,852],[102,165,173,177,180,182,183,184,196,853],[102,165,173,177,180,182,183,184,196,707,851],[102,165,173,177,180,182,183,184,196,706,707,728],[93,102,165,173,177,180,182,183,184,196,722],[102,165,173,177,180,182,183,184,196,723],[102,165,173,177,180,182,183,184,196,261,636,638,674,706,707,728],[93,102,165,173,177,180,182,183,184,196,725],[102,165,173,177,180,182,183,184,196,726],[93,102,165,173,177,180,182,183,184,196,711],[102,165,173,177,180,182,183,184,196,712],[102,165,173,177,180,182,183,184,196,261,674,707],[93,102,165,173,177,180,182,183,184,196,564,636,638,681,706,707,728,745,746,1226,1230,1231,1232],[93,102,165,173,177,180,182,183,184,196,871],[102,165,173,177,180,182,183,184,196,872],[102,165,173,177,180,182,183,184,196,564,707,710],[102,165,173,177,180,182,183,184,196,636,638,706,707,728],[93,102,165,173,177,180,182,183,184,196,733],[102,165,173,177,180,182,183,184,196,734],[93,102,165,173,177,180,182,183,184,196,636,638,648,703,706,707,728],[93,102,165,173,177,180,182,183,184,196,736],[102,165,173,177,180,182,183,184,196,737],[93,102,165,173,177,180,182,183,184,196,894],[102,165,173,177,180,182,183,184,196,895],[102,165,173,177,180,182,183,184,196,707,891],[102,165,173,177,180,182,183,184,196,636,638,648,676,706,707,710,728,745,746,847,848,1236],[93,102,165,173,177,180,182,183,184,196,847,848],[102,165,173,177,180,182,183,184,196,849],[93,102,165,173,177,180,182,183,184,196,841],[102,165,173,177,180,182,183,184,196,842],[102,165,173,177,180,182,183,184,196,707,837],[93,102,165,173,177,180,182,183,184,196,564,636,638,648,706,707,728,745,746,1226,1230,1238],[93,102,165,173,177,180,182,183,184,196,879],[102,165,173,177,180,182,183,184,196,880],[102,165,173,177,180,182,183,184,196,564,707,710,878],[102,165,173,177,180,182,183,184,196,564,638,707,878],[93,102,165,173,177,180,182,183,184,196,882],[102,165,173,177,180,182,183,184,196,883],[102,165,173,177,180,182,183,184,196,564,644,707,710,835,871,878,879],[102,165,173,177,180,182,183,184,196,564,636,638,706,707,728,878,1228,1229,1230,1239],[93,102,165,173,177,180,182,183,184,196,903],[102,165,173,177,180,182,183,184,196,904],[102,165,173,177,180,182,183,184,196,564,707,710,878,879],[93,102,165,173,177,180,182,183,184,196,906],[102,165,173,177,180,182,183,184,196,907],[102,165,173,177,180,182,183,184,196,564,644,707,710,835,871,874,878,903],[102,165,173,177,180,182,183,184,196,636,638,648,703,706,707,728,745,746],[93,102,165,173,177,180,182,183,184,196,851],[102,165,173,177,180,182,183,184,196,855],[102,165,173,177,180,182,183,184,196,261,674,707,708],[93,102,165,173,177,180,182,183,184,196,636,678,681,707],[102,165,173,177,180,182,183,184,196,667,707],[102,165,173,177,180,182,183,184,196,678,707],[102,165,173,177,180,182,183,184,196,679],[102,165,173,177,180,182,183,184,196,681,707],[102,165,173,177,180,182,183,184,196,698,707],[93,102,165,173,177,180,182,183,184,196,857],[102,165,173,177,180,182,183,184,196,858],[102,165,173,177,180,182,183,184,196,644,675,851],[93,102,165,173,177,180,182,183,184,196,838],[102,165,173,177,180,182,183,184,196,839],[102,165,173,177,180,182,183,184,196,837],[102,165,173,177,180,182,183,184,196,638,706,707,728],[93,102,165,173,177,180,182,183,184,196,785],[102,165,173,177,180,182,183,184,196,786],[93,102,165,173,177,180,182,183,184,196,860],[102,165,173,177,180,182,183,184,196,638,706,707,728,860,1244],[102,165,173,177,180,182,183,184,196,638,706,707,728,860],[102,165,173,177,180,182,183,184,196,861],[93,102,165,173,177,180,182,183,184,196,798,799],[102,165,173,177,180,182,183,184,196,638,706,707,728,745,746],[102,165,173,177,180,182,183,184,196,800],[102,165,173,177,180,182,183,184,196,707,798],[93,102,165,173,177,180,182,183,184,196,863],[102,165,173,177,180,182,183,184,196,864],[102,165,173,177,180,182,183,184,196,707,713,724,727,732,735,738,741,744,750,753,756,760,763,766,769,772,775,778,781,784,787,791,793,797,801,805,810,813,816,819,822,826,833,836,840,843,846,850,854,856,859,862,865,870,873,876,881,884,893,896,899,902,905,908],[93,102,165,173,177,180,182,183,184,196,739],[102,165,173,177,180,182,183,184,196,740],[93,102,165,173,177,180,182,183,184,196,827],[102,165,173,177,180,182,183,184,196,707,746],[102,165,173,177,180,182,183,184,196,1249],[102,165,173,177,180,182,183,184,196,1250],[93,102,165,173,177,180,182,183,184,196,829],[93,102,165,173,177,180,182,183,184,196,707],[93,102,165,173,177,180,182,183,184,196,547,559,636,707,829,1254],[93,102,165,173,177,180,182,183,184,196,830],[93,102,165,173,177,180,182,183,184,196,547,636,707,830],[93,102,165,173,177,180,182,183,184,196,690],[102,165,173,177,180,182,183,184,196,690,691,692,693,694],[93,102,165,173,177,180,182,183,184,196,636,688,707],[93,102,165,173,177,180,182,183,184,196,688,689,707],[102,165,173,177,180,182,183,184,196,636,638,688,707],[102,165,173,177,180,182,183,184,196,688,690,692,707],[102,165,173,177,180,182,183,184,196,707,1258],[93,102,165,173,177,180,182,183,184,196,888],[93,102,165,173,177,180,182,183,184,196,636,698,707,1259],[93,102,165,173,177,180,182,183,184,196,890],[93,102,165,173,177,180,182,183,184,196,690,707,829,830,886,887,888,889],[93,102,165,173,177,180,182,183,184,196,708],[93,102,165,173,177,180,182,183,184,196,887],[102,165,173,177,180,182,183,184,196,636,702,707],[93,102,165,173,177,180,182,183,184,196,636,707],[93,102,165,173,177,180,182,183,184,196,886],[93,102,165,173,177,180,182,183,184,196,547,636,707,886],[93,102,165,173,177,180,182,183,184,196,1267],[93,102,165,173,177,180,182,183,184,196,831],[102,165,173,177,180,182,183,184,196,832],[93,102,165,173,177,180,182,183,184,196,636,638,706,707,728],[93,102,165,173,177,180,182,183,184,196,675,690,707,708,828,829,830],[93,102,165,173,177,180,182,183,184,196,837],[102,165,173,177,180,182,183,184,196,1270],[102,165,173,177,180,182,183,184,196,261,528,636,638,648,674,678,679,684,696,698,699,701,703,705,706,707,728,1253],[102,165,173,177,180,182,183,184,196,689,707],[102,165,173,177,180,182,183,184,196,648,707],[93,102,165,173,177,180,182,183,184,196,844],[102,165,173,177,180,182,183,184,196,845],[93,102,165,173,177,180,182,183,184,196,261,528,636,638,648,674,696,706,707,728],[93,102,165,173,177,180,182,183,184,196,742],[102,165,173,177,180,182,183,184,196,743],[93,102,165,173,177,180,182,183,184,196,779],[102,165,173,177,180,182,183,184,196,780],[102,165,173,177,180,182,183,184,196,518,636,638,706,707,728,745,746,1274],[102,165,173,177,180,182,183,184,196,517,707],[93,102,165,173,177,180,182,183,184,196,748],[102,165,173,177,180,182,183,184,196,749],[102,165,173,177,180,182,183,184,196,638,648,649,680,706,707,710,728,745,746],[102,165,173,177,180,182,183,184,196,707,747],[93,102,165,173,177,180,182,183,184,196,808],[102,165,173,177,180,182,183,184,196,806,809],[93,102,165,173,177,180,182,183,184,196,636,706,707,728,806,807],[93,102,165,173,177,180,182,183,184,196,261,674,707],[102,165,173,177,180,182,183,184,196,707,806],[102,165,173,177,180,182,183,184,196,834,835],[102,165,173,177,180,182,183,184,196,636,638,648,698,706,707,728],[93,102,165,173,177,180,182,183,184,196,689,707,827],[93,102,165,173,177,180,182,183,184,196,751],[102,165,173,177,180,182,183,184,196,752],[93,102,165,173,177,180,182,183,184,196,754],[102,165,173,177,180,182,183,184,196,755],[102,165,173,177,180,182,183,184,196,547,636,638,648,696,706,707,728],[93,102,165,173,177,180,182,183,184,196,874],[102,165,173,177,180,182,183,184,196,875],[93,102,165,173,177,180,182,183,184,196,564,636,638,673,706,707,728,745,746,1226,1227,1231,1232,1233],[102,165,173,177,180,182,183,184,196,564,707,710,871],[93,102,165,173,177,180,182,183,184,196,758],[102,165,173,177,180,182,183,184,196,759],[102,165,173,177,180,182,183,184,196,547,638,648,706,707,710,728,745,746],[102,165,173,177,180,182,183,184,196,707,757],[93,102,165,173,177,180,182,183,184,196,811],[102,165,173,177,180,182,183,184,196,811,812],[93,102,165,173,177,180,182,183,184,196,484,636,638,671,683,706,707,728,811],[93,102,165,173,177,180,182,183,184,196,885,891],[102,165,173,177,180,182,183,184,196,892],[93,102,165,173,177,180,182,183,184,196,528,547,636,638,644,706,707,728],[102,165,173,177,180,182,183,184,196,261,644,674,675,708,827,890],[93,102,165,173,177,180,182,183,184,196,761],[102,165,173,177,180,182,183,184,196,762],[102,165,173,177,180,182,183,184,196,814,815],[93,102,165,173,177,180,182,183,184,196,484,528,636,638,648,678,706,707,728,815,1282],[102,165,173,177,180,182,183,184,196,768],[102,165,173,177,180,182,183,184,196,638,644,706,707,728,767],[93,102,165,173,177,180,182,183,184,196,795],[102,165,173,177,180,182,183,184,196,796],[102,165,173,177,180,182,183,184,196,638,706,707,710,728,745,746],[102,165,173,177,180,182,183,184,196,707,794],[93,102,165,173,177,180,182,183,184,196,788,789],[102,165,173,177,180,182,183,184,196,790],[102,165,173,177,180,182,183,184,196,707,788],[93,102,165,173,177,180,182,183,184,196,764],[102,165,173,177,180,182,183,184,196,765],[102,165,173,177,180,182,183,184,196,638,648,706,707,728],[102,165,173,177,180,182,183,184,196,709,710],[93,102,165,173,177,180,182,183,184,196,639,710,745,746,866,867,868,869],[102,165,173,177,180,182,183,184,196,870],[102,165,173,177,180,182,183,184,196,564,707,746],[102,165,173,177,180,182,183,184,196,638,707,710,745],[102,165,173,177,180,182,183,184,196,707,710],[102,165,173,177,180,182,183,184,196,564,639,707,708,709],[93,102,165,173,177,180,182,183,184,196,770],[102,165,173,177,180,182,183,184,196,771],[93,102,165,173,177,180,182,183,184,196,636,638,706,707,728,770],[93,102,165,173,177,180,182,183,184,196,782],[102,165,173,177,180,182,183,184,196,783],[102,165,173,177,180,182,183,184,196,636,638,706,707,728,745,746],[93,102,165,173,177,180,182,183,184,196,897],[102,165,173,177,180,182,183,184,196,898],[93,102,165,173,177,180,182,183,184,196,564,636,638,706,707,728,745,746,878,1226,1228,1230,1287],[93,102,165,173,177,180,182,183,184,196,900],[102,165,173,177,180,182,183,184,196,901],[102,165,173,177,180,182,183,184,196,564,636,638,706,707,728,878,1228,1230,1287,1288],[102,165,173,177,180,182,183,184,196,564,707,710,878,897],[93,102,165,173,177,180,182,183,184,196,802,803],[102,165,173,177,180,182,183,184,196,804],[102,165,173,177,180,182,183,184,196,707,802],[93,102,165,173,177,180,182,183,184,196,776],[102,165,173,177,180,182,183,184,196,777],[102,165,173,177,180,182,183,184,196,547,638,648,696,706,707,728],[93,102,165,173,177,180,182,183,184,196,773],[102,165,173,177,180,182,183,184,196,774],[102,165,173,177,180,182,183,184,196,547,706,707,728],[93,102,165,173,177,180,182,183,184,196,817],[102,165,173,177,180,182,183,184,196,818],[102,165,173,177,180,182,183,184,196,638,648,696,706,707,728],[93,102,165,173,177,180,182,183,184,196,823],[102,165,173,177,180,182,183,184,196,824,825],[93,102,165,173,177,180,182,183,184,196,636,638,672,678,703,706,707,728],[93,102,165,173,177,180,182,183,184,196,689,707,823],[93,102,165,173,177,180,182,183,184,196,792],[102,165,173,177,180,182,183,184,196,707,710,745,746],[93,102,165,173,177,180,182,183,184,196,644],[102,165,173,177,180,182,183,184,196,528,642,707],[102,165,173,177,180,182,183,184,196,636,637],[102,165,173,177,180,182,183,184,196,655,656,657],[102,165,173,177,180,182,183,184,196,556,644,655],[102,165,173,177,180,182,183,184,196,641,1295],[93,102,165,173,177,180,182,183,184,196,528,564,636,648,678,707,728,1227,1231],[102,165,173,177,180,182,183,184,196,564,642],[102,165,173,177,180,182,183,184,196,564,648,673,678,707,877,878,1227,1228],[102,165,173,177,180,182,183,184,196,877,878,1227,1228,1229],[102,165,173,177,180,182,183,184,196,648,678,1229],[102,165,173,177,180,182,183,184,196,564,673,678,707,877,878,1227,1228],[102,165,173,177,180,182,183,184,196,877],[102,165,173,177,180,182,183,184,196,642,651],[93,102,165,173,177,180,182,183,184,196,642],[102,165,173,177,180,182,183,184,196,636,644],[102,165,173,177,180,182,183,184,196,636,642,644,662],[102,165,173,177,180,182,183,184,196,645],[102,165,173,177,180,182,183,184,196,556,638,640,642,643,644,646,648,649,650,651,652,653,658,659,661,662,663,664,665,666,667,668,669,670,671,672,673,675,676,677,678,679,680,682,683,684,695,696,697,699,700,701,702,703,704,705,706],[102,165,173,177,180,182,183,184,196,644,648],[102,165,173,177,180,182,183,184,196,647,648,649],[93,102,165,173,177,180,182,183,184,196,644,707],[102,165,173,177,180,182,183,184,196,647],[102,165,173,177,180,182,183,184,196,639],[102,165,173,177,180,182,183,184,196,644,651,652,653,654,658,659,660],[102,165,173,177,180,182,183,184,196,644],[102,165,173,177,180,182,183,184,196,642],[102,165,173,177,180,182,183,184,196,1298,1299],[102,165,173,177,180,182,183,184,196,555],[102,165,173,177,180,182,183,184,196,1298,1299,1301],[102,165,173,177,180,182,183,184,196,1298],[102,165,173,177,180,182,183,184,196,1298,1299,1300,1301,1302,1303],[102,165,173,177,180,182,183,184,196,644,707],[93,102,165,173,177,180,182,183,184,196,641,642,643,1295],[102,165,173,177,180,182,183,184,196,681],[93,102,165,173,177,180,182,183,184,196,820],[102,165,173,177,180,182,183,184,196,821],[102,165,173,177,180,182,183,184,196,638,706,707,728,820],[102,165,173,177,180,182,183,184,188,196,213,259,395,455,466]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"2ab096661c711e4a81cc464fa1e6feb929a54f5340b46b0a07ac6bbf857471f0","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"73f78680d4c08509933daf80947902f6ff41b6230f94dd002ae372620adb0f60","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5239f5c01bcfa9cd32f37c496cf19c61d69d37e48be9de612b541aac915805b","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"e134052a6b1ded61693b4037f615dc72f14e2881e79c1ddbff6c514c8a516b05","impliedFormat":1},{"version":"33a1caf57a6f7318c7ce2c8a8a35137bd7c064d140f324e8f47b94cd129305b5","impliedFormat":1},{"version":"cc512139c85c41ba2dc95076b1ce05786c98129bcfe875017946ba2c82607ef1","impliedFormat":1},{"version":"12bffdbf179bfe787334d1aa31393bac5b79a84d2285ad94bcf36c1cce9eed57","impliedFormat":1},{"version":"e81484fc62d5e6add90882339bb2cdba0c87b85ca4002add438d0771ce2fdfa7","impliedFormat":1},{"version":"92ebc3261b20037c4e078cd3d26bccedb719b3eec653925e103b6ced4a936c0d","impliedFormat":1},{"version":"d8f8d36a0350f1b4e25f0d6c8cab7fb484a770cb02c4c92b8215ad421615d248","impliedFormat":99},{"version":"2be2227c3810dfd84e46674fd33b8d09a4a28ad9cb633ed536effd411665ea1e","impliedFormat":99},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"ecd7b4429a2b12f50ef619043fca298eb99a9b7f9e8edabd60c9bbb7fa8f036b","impliedFormat":99},{"version":"327a4d13326928f96dd7f2adff6f0a81b78f24213881ab524102f0d495093426","affectsGlobalScope":true,"impliedFormat":99},{"version":"a7ca8df4f2931bef2aa4118078584d84a0b16539598eaadf7dce9104dfaa381c","impliedFormat":1},{"version":"72950913f4900b680f44d8cab6dd1ea0311698fc1eefb014eb9cdfc37ac4a734","impliedFormat":1},{"version":"36977c14a7f7bfc8c0426ae4343875689949fb699f3f84ecbe5b300ebf9a2c55","impliedFormat":1},{"version":"59f8dc89b9e724a6a667f52cdf4b90b6816ae6c9842ce176d38fcc973669009e","affectsGlobalScope":true,"impliedFormat":1},{"version":"474eba6689e97bf58edd28c90524e70f4fb11820df66752182a1ad1ff9970bb2","affectsGlobalScope":true,"impliedFormat":1},{"version":"1eef826bc4a19de22155487984e345a34c9cd511dd1170edc7a447cb8231dd4a","affectsGlobalScope":true,"impliedFormat":99},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ccdaa19852d25ecd84eec365c3bfa16e7859cadecf6e9ca6d0dbbbee439743f","affectsGlobalScope":true,"impliedFormat":1},{"version":"438b41419b1df9f1fbe33b5e1b18f5853432be205991d1b19f5b7f351675541e","affectsGlobalScope":true,"impliedFormat":1},{"version":"096116f8fedc1765d5bd6ef360c257b4a9048e5415054b3bf3c41b07f8951b0b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5e01375c9e124a83b52ee4b3244ed1a4d214a6cfb54ac73e164a823a4a7860a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f90ae2bbce1505e67f2f6502392e318f5714bae82d2d969185c4a6cecc8af2fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b58e207b93a8f1c88bbf2a95ddc686ac83962b13830fe8ad3f404ffc7051fb4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1fefabcb2b06736a66d2904074d56268753654805e829989a46a0161cd8412c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"c18a99f01eb788d849ad032b31cafd49de0b19e083fe775370834c5675d7df8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"5247874c2a23b9a62d178ae84f2db6a1d54e6c9a2e7e057e178cc5eea13757fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"156a859e21ef3244d13afeeba4e49760a6afa035c149dda52f0c45ea8903b338","impliedFormat":1},{"version":"10ec5e82144dfac6f04fa5d1d6c11763b3e4dbbac6d99101427219ab3e2ae887","impliedFormat":1},{"version":"615754924717c0b1e293e083b83503c0a872717ad5aa60ed7f1a699eb1b4ea5c","impliedFormat":1},{"version":"074de5b2fdead0165a2757e3aaef20f27a6347b1c36adea27d51456795b37682","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"24371e69a38fc33e268d4a8716dbcda430d6c2c414a99ff9669239c4b8f40dea","impliedFormat":1},{"version":"ccab02f3920fc75c01174c47fcf67882a11daf16baf9e81701d0a94636e94556","impliedFormat":1},{"version":"3e11fce78ad8c0e1d1db4ba5f0652285509be3acdd519529bc8fcef85f7dafd9","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"9c32412007b5662fd34a8eb04292fb5314ec370d7016d1c2fb8aa193c807fe22","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"4d327f7d72ad0918275cea3eee49a6a8dc8114ae1d5b7f3f5d0774de75f7439a","impliedFormat":1},{"version":"6ebe8ebb8659aaa9d1acbf3710d7dae3e923e97610238b9511c25dc39023a166","impliedFormat":1},{"version":"e85d7f8068f6a26710bff0cc8c0fc5e47f71089c3780fbede05857331d2ddec9","impliedFormat":1},{"version":"7befaf0e76b5671be1d47b77fcc65f2b0aad91cc26529df1904f4a7c46d216e9","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"8aee8b6d4f9f62cf3776cda1305fb18763e2aade7e13cea5bbe699112df85214","impliedFormat":1},{"version":"c63b9ada8c72f95aac5db92aea07e5e87ec810353cdf63b2d78f49a58662cf6c","impliedFormat":1},{"version":"1cc2a09e1a61a5222d4174ab358a9f9de5e906afe79dbf7363d871a7edda3955","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"b64d4d1c5f877f9c666e98e833f0205edb9384acc46e98a1fef344f64d6aba44","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"12950411eeab8563b349cb7959543d92d8d02c289ed893d78499a19becb5a8cc","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"c9381908473a1c92cb8c516b184e75f4d226dad95c3a85a5af35f670064d9a2f","impliedFormat":1},{"version":"c3f5289820990ab66b70c7fb5b63cb674001009ff84b13de40619619a9c8175f","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3275d55fac10b799c9546804126239baf020d220136163f763b55a74e50e750","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa68a0a3b7cb32c00e39ee3cd31f8f15b80cac97dce51b6ee7fc14a1e8deb30b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c36e755bced82df7fb6ce8169265d0a7bb046ab4e2cb6d0da0cb72b22033e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a93de4ff8a63bafe62ba86b89af1df0ccb5e40bb85b0c67d6bbcfdcf96bf3d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"90e85f9bc549dfe2b5749b45fe734144e96cd5d04b38eae244028794e142a77e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0a5deeb610b2a50a6350bd23df6490036a1773a8a71d70f2f9549ab009e67ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"3fad5618174d74a34ee006406d4eb37e8d07dd62eb1315dbf52f48d31a337547","impliedFormat":1},{"version":"7e49f52a159435fc8df4de9dc377ef5860732ca2dc9efec1640531d3cf5da7a3","impliedFormat":1},{"version":"dd4bde4bdc2e5394aed6855e98cf135dfdf5dd6468cad842e03116d31bbcc9bc","impliedFormat":1},{"version":"4d4e879009a84a47c05350b8dca823036ba3a29a3038efed1be76c9f81e45edf","affectsGlobalScope":true,"impliedFormat":1},{"version":"8b50a819485ffe0d237bf0d131e92178d14d11e2aa873d73615a9ec578b341f5","impliedFormat":1},{"version":"9ba13b47cb450a438e3076c4a3f6afb9dc85e17eae50f26d4b2d72c0688c9251","impliedFormat":1},{"version":"b64cd4401633ea4ecadfd700ddc8323a13b63b106ac7127c1d2726f32424622c","impliedFormat":1},{"version":"37c6e5fe5715814412b43cc9b50b24c67a63c4e04e753e0d1305970d65417a60","impliedFormat":1},{"version":"1d024184fb57c58c5c91823f9d10b4915a4867b7934e89115fd0d861a9df27c8","impliedFormat":1},{"version":"ee0e4946247f842c6dd483cbb60a5e6b484fee07996e3a7bc7343dfb68a04c5d","impliedFormat":1},{"version":"ef051f42b7e0ef5ca04552f54c4552eac84099d64b6c5ad0ef4033574b6035b8","impliedFormat":1},{"version":"853a43154f1d01b0173d9cbd74063507ece57170bad7a3b68f3fa1229ad0a92f","impliedFormat":1},{"version":"56231e3c39a031bfb0afb797690b20ed4537670c93c0318b72d5180833d98b72","impliedFormat":1},{"version":"5cc7c39031bfd8b00ad58f32143d59eb6ffc24f5d41a20931269011dccd36c5e","impliedFormat":1},{"version":"12d602a8fe4c2f2ba4f7804f5eda8ba07e0c83bf5cf0cda8baffa2e9967bfb77","affectsGlobalScope":true,"impliedFormat":1},{"version":"a856ab781967b62b288dfd85b860bef0e62f005ed4b1b8fa25c53ce17856acaf","impliedFormat":1},{"version":"cc25940cfb27aa538e60d465f98bb5068d4d7d33131861ace43f04fe6947d68f","impliedFormat":1},{"version":"8db46b61a690f15b245cf16270db044dc047dce9f93b103a59f50262f677ea1f","impliedFormat":1},{"version":"01ff95aa1443e3f7248974e5a771f513cb2ac158c8898f470a1792f817bee497","impliedFormat":1},{"version":"757227c8b345c57d76f7f0e3bbad7a91ffca23f1b2547cbed9e10025816c9cb7","impliedFormat":1},{"version":"959d0327c96dd9bb5521f3ed6af0c435996504cc8dd46baa8e12cb3b3518cef1","impliedFormat":1},{"version":"e1c1a0b4d1ead0de9eca52203aeb1f771f21e6238d6fcd15aa56ac2a02f1b7bf","impliedFormat":1},{"version":"101f482fd48cb4c7c0468dcc6d62c843d842977aea6235644b1edd05e81fbf22","impliedFormat":1},{"version":"266bee0a41e9c3ba335583e21e9277ae03822402cf5e8e1d99f5196853613b98","affectsGlobalScope":true,"impliedFormat":1},{"version":"386606f8a297988535cb1401959041cfa7f59d54b8a9ed09738e65c98684c976","impliedFormat":1},{"version":"3ef397f12387eff17f550bc484ea7c27d21d43816bbe609d495107f44b97e933","impliedFormat":1},{"version":"1023282e2ba810bc07905d3668349fbd37a26411f0c8f94a70ef3c05fe523fcf","impliedFormat":1},{"version":"b214ebcf76c51b115453f69729ee8aa7b7f8eccdae2a922b568a45c2d7ff52f7","impliedFormat":1},{"version":"429c9cdfa7d126255779efd7e6d9057ced2d69c81859bbab32073bad52e9ba76","impliedFormat":1},{"version":"e236b5eba291f51bdf32c231673e6cab81b5410850e61f51a7a524dddadc0f95","impliedFormat":1},{"version":"ce8653341224f8b45ff46d2a06f2cacb96f841f768a886c9d8dd8ec0878b11bd","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f2c62938251b45715fd2a9887060ec4fbc8724727029d1cbce373747252bdd7","impliedFormat":1},{"version":"e3ace08b6bbd84655d41e244677b474fd995923ffef7149ddb68af8848b60b05","impliedFormat":1},{"version":"132580b0e86c48fab152bab850fc57a4b74fe915c8958d2ccb052b809a44b61c","impliedFormat":1},{"version":"90a278f5fab7557e69e97056c0841adf269c42697194f0bd5c5e69152637d4b3","impliedFormat":1},{"version":"69c9a5a9392e8564bd81116e1ed93b13205201fb44cb35a7fde8c9f9e21c4b23","impliedFormat":1},{"version":"5f8fc37f8434691ffac1bfd8fc2634647da2c0e84253ab5d2dd19a7718915b35","impliedFormat":1},{"version":"5981c2340fd8b076cae8efbae818d42c11ffc615994cb060b1cd390795f1be2b","impliedFormat":1},{"version":"f263485c9ca90df9fe7bb3a906db9701997dc6cae86ace1f8106ac8d2f7f677b","impliedFormat":1},{"version":"1edcf2f36fc332615846bde6dcc71a8fe526065505bc5e3dcfd65a14becdf698","affectsGlobalScope":true,"impliedFormat":1},{"version":"0250da3eb85c99624f974e77ef355cdf86f43980251bc371475c2b397ba55bcd","impliedFormat":1},{"version":"f1c93e046fb3d9b7f8249629f4b63dc068dd839b824dd0aa39a5e68476dc9420","impliedFormat":1},{"version":"3d3a5f27ffbc06c885dd4d5f9ee20de61faf877fe2c3a7051c4825903d9a7fdc","impliedFormat":1},{"version":"12806f9f085598ef930edaf2467a5fa1789a878fba077cd27e85dc5851e11834","impliedFormat":1},{"version":"1dbca38aa4b0db1f4f9e6edacc2780af7e028b733d2a98dd3598cd235ca0c97d","impliedFormat":1},{"version":"a43fe41c33d0a192a0ecaf9b92e87bef3709c9972e6d53c42c49251ccb962d69","impliedFormat":1},{"version":"a177959203c017fad3ecc4f3d96c8757a840957a4959a3ae00dab9d35961ca6c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc727ccf9b36e257ff982ea0badeffbfc2c151802f741bddff00c6af3b784cf","impliedFormat":1},{"version":"19143c930aef7ccf248549f3e78992f2f1049118ec5d4622e95025057d8e392b","impliedFormat":1},{"version":"4844a4c9b4b1e812b257676ed8a80b3f3be0e29bf05e742cc2ea9c3c6865e6c6","impliedFormat":1},{"version":"064878a60367e0407c42fb7ba02a2ea4d83257357dc20088e549bd4d89433e9c","impliedFormat":1},{"version":"cca8917838a876e2d7016c9b6af57cbf11fdf903c5fdd8e613fa31840b2957bf","impliedFormat":1},{"version":"d91ae55e4282c22b9c21bc26bd3ef637d3fe132507b10529ae68bf76f5de785b","impliedFormat":1},{"version":"b484ec11ba00e3a2235562a41898d55372ccabe607986c6fa4f4aba72093749f","impliedFormat":1},{"version":"7e8a671604329e178bb479c8f387715ebd40a091fc4a7552a0a75c2f3a21c65c","impliedFormat":1},{"version":"41ef7992c555671a8fe54db302788adefa191ded810a50329b79d20a6772d14c","impliedFormat":1},{"version":"041a7781b9127ab568d2cdcce62c58fdea7c7407f40b8c50045d7866a2727130","impliedFormat":1},{"version":"4c5e90ddbcd177ad3f2ffc909ae217c87820f1e968f6959e4b6ba38a8cec935e","impliedFormat":1},{"version":"b70dd9a44e1ac42f030bb12e7d79117eac7cb74170d72d381a1e7913320af23a","impliedFormat":1},{"version":"55cdbeebe76a1fa18bbd7e7bf73350a2173926bd3085bb050cf5a5397025ee4e","impliedFormat":1},{"version":"10073cdcf56982064c5337787cc59b79586131e1b28c106ede5bff362f912b70","impliedFormat":99},{"version":"ee70b8037ecdf0de6c04f35277f253663a536d7e38f1539d270e4e916d225a3f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a660aa95476042d3fdcc1343cf6bb8fdf24772d31712b1db321c5a4dcc325434","impliedFormat":1},{"version":"ff0a83c9a0489a627e264ffcb63f2264b935b20a502afa3a018848139e3d8575","impliedFormat":99},{"version":"161c8e0690c46021506e32fda85956d785b70f309ae97011fd27374c065cac9b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f582b0fcbf1eea9b318ab92fb89ea9ab2ebb84f9b60af89328a91155e1afce72","impliedFormat":1},{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"7965dc3c7648e2a7a586d11781cabb43d4859920716bc2fdc523da912b06570d","impliedFormat":1},{"version":"90c2bd9a3e72fe08b8fa5982e78cb8dc855a1157b26e11e37a793283c52bf64b","impliedFormat":1},{"version":"a8122fe390a2a987079e06c573b1471296114677923c1c094c24a53ddd7344a2","impliedFormat":1},{"version":"70c2cb19c0c42061a39351156653aa0cf5ba1ecdc8a07424dd38e3a1f1e3c7f4","impliedFormat":1},{"version":"a8fb10fd8c7bc7d9b8f546d4d186d1027f8a9002a639bec689b5000dab68e35c","impliedFormat":1},{"version":"c9b467ea59b86bd27714a879b9ad43c16f186012a26d0f7110b1322025ceaa83","impliedFormat":1},{"version":"57ea19c2e6ba094d8087c721bac30ff1c681081dbd8b167ac068590ef633e7a5","impliedFormat":1},{"version":"cba81ec9ae7bc31a4dc56f33c054131e037649d6b9a2cfa245124c67e23e4721","impliedFormat":1},{"version":"ad193f61ba708e01218496f093c23626aa3808c296844a99189be7108a9c8343","impliedFormat":1},{"version":"a0544b3c8b70b2f319a99ea380b55ab5394ede9188cdee452a5d0ce264f258b2","impliedFormat":1},{"version":"8c654c17c334c7c168c1c36e5336896dc2c892de940886c1639bebd9fc7b9be4","impliedFormat":1},{"version":"6a4da742485d5c2eb6bcb322ae96993999ffecbd5660b0219a5f5678d8225bb0","impliedFormat":1},{"version":"c65ca21d7002bdb431f9ab3c7a6e765a489aa5196e7e0ef00aed55b1294df599","impliedFormat":1},{"version":"c8fc655c2c4bafc155ceee01c84ab3d6c03192ced5d3f2de82e20f3d1bd7f9fa","impliedFormat":1},{"version":"be5a7ff3b47f7e553565e9483bdcadb0ca2040ac9e5ec7b81c7e115a81059882","impliedFormat":1},{"version":"1a93f36ecdb60a95e3a3621b561763e2952da81962fae217ab5441ac1d77ffc5","impliedFormat":1},{"version":"2a771d907aebf9391ac1f50e4ad37952943515eeea0dcc7e78aa08f508294668","impliedFormat":1},{"version":"0146fd6262c3fd3da51cb0254bb6b9a4e42931eb2f56329edd4c199cb9aaf804","impliedFormat":1},{"version":"183f480885db5caa5a8acb833c2be04f98056bdcc5fb29e969ff86e07efe57ab","impliedFormat":99},{"version":"960bd764c62ac43edc24eaa2af958a4b4f1fa5d27df5237e176d0143b36a39c6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3fd8a5aefd8c3feb3936ca66f5aa89dff7bf6e6537b4158dbd0f6e0d65ed3b9e","impliedFormat":1},{"version":"a18642ddf216f162052a16cba0944892c4c4c977d3306a87cb673d46abbb0cbf","impliedFormat":1},{"version":"41c41c6e90133bb2a14f7561f29944771886e5535945b2b372e2f6ed6987746e","impliedFormat":1},{"version":"4ec16d7a4e366c06a4573d299e15fe6207fc080f41beac5da06f4af33ea9761e","impliedFormat":1},{"version":"e4af494f7a14b226bbe732e9c130d8811f8c7025911d7c58dd97121a85519715","impliedFormat":1},{"version":"47416e41b1af81e53e8c3cc5bf909d47ff632a7b6eddfe7ff43d187b4dcca047","impliedFormat":99},{"version":"439433b94f71b1e569fb4058ecaa7fde97bdd8aadf1c865298cd2c981b5fb691","impliedFormat":99},{"version":"e63d1bebae16b67829e3c956c33c82e5af7746dccabb149f7d261294d8f0286c","impliedFormat":99},{"version":"bdd14f07b4eca0b4b5203b85b8dbc4d084c749fa590bee5ea613e1641dcd3b29","impliedFormat":99},{"version":"1748c03e7a7d118f7f6648c709507971eb0d416f489958492c5ae625de445184","impliedFormat":1},{"version":"51de05ca7c541d0c316db220c2b81d0013b0fe14eb6eae68012158f1683ca262","affectsGlobalScope":true,"impliedFormat":99},"a35473a025f207ce016112c3a669e08ccaee9cfb1849702ca1de98c239315641","f0df47414d0b8285f212fcb741659dd0a4385182ea0c26c5e06e3a499a251270","9cb2a3e2dcf71fc3d552aa9848a6a2eaf541a42dc912dc8d5aa0e3ac6d1ef132","d998f544b609e4c40dc0d145255029e20dd69987c1b84640ed3df272ae8e788e","0cb5ad9de64a96946f4b78ac9c6d5604b0266b79e11ec09ef4a9d555a69148ed","b8463ced1c34fc2ae798bc10de4d36aa3ff69b1226655b1992aee94678aba6f3","18f82b9e292b8fee6e169109f15c3ec4c71de67645848375e92bc6ae26af5600","1b7903039d65b281a8be1d536be87c7928ccbdceb8b3f2b627022c299076efa3","3a2f12638bafc2300e9af56010275522e4335251973890b7150e89759b129b6b","41f18afe416b1356edf172237589e9a4c5429b11a269d7201ed6e5cf349b9e70","560c79f290d53a6b85299d85887af197c2925d9d198723d47293662230a2f258","0afba313a311c3e18b02c13e9e2861cc076cfe5b08bbf7a67960129a4c84bcb4","3e9927c44b6f682af9f822e28c8303dce0b48abdbe08e95b885f93c8479ec8a3","61bc23d7641b8579f29df4a9ce4cb1e22d5dbe37838b6763b1aee6a6674b4931","37bbb9d7293ea426f63da5be350520429e6e048ee1d8e02654866c7672de2c55","c1fd77a73ff95ea556ed8dbaee220adc8d781dac19710844421067008bc5aa36","15c469b901a87a1c4fa6347dfab8d5e9c283f3866d5408b0e94ebef7f27e3ebf","ead293a107e1008403af2c5a21922b976d469abdb3048f09e7c04f2e9d0a8317","83d67277bc07ff835c18f059e3e74c7e639c02f80fe4f796e3f04ee5e9c96d19","3e2481ea64fcebec754cd92dc4817f7935451972ccb737e88bcc1f2c91a941f1","781755e727cd054fc715a8acf47357fa77b9ef78a90e665ce1abb48b5ae8ec63","e3782d855fe309e2e12bcaa85d322b37ae82843d12c7193ad7441746766226ed","1ce4fab3394b4e9c15017729ecd3ca58c0edc90c8b9c951b63e56d29f07a79db","737c2d84a54ffaaf06033a40ecf256b75b6a321d1a039d6ec1dd705fd60b1a48","6bae94dcef7a6100087b1ab28a298c8575ebfd2ad2bb295a9f50e440725f150e","edb3d31747b8ba2a032f9837d2defb44775d5de987e149bcf06820d17e734e81","2d973ebea1ddd1ed03db880bc67e7e93004c5a726573a34ca0e9d512ce47e2ab","9398f73d8aac9013755a17984eb877c1c1f5457d634d24314c91f0121338b61f","93611c033064404d515b76c938471a992032d937689f120776a7caaddb095151","b2c6fd5770d797359b5c2d8c4f45166af8067fc25d288d5f3f9015365af58777","fdcefd1c881d555169a9b6e5d528304283d971cbbbf9e7c64137b4076edb536c","5aafb3c9d84312b2f968db26923774d705f560ee6671d0fd4fb1094806ba2dae","6dbce838d12ae9cec778ad7b0d888ec9e2928eb93df77c6b080b3f34656fe865","b09c064b425f4c904101cfa898900e33b14c5c337801b383e6cfd63b2d23b7ba","38d095b3189ebcd5d28eb93daa33034788be2c3b3e746414d0fcc56018fa0ffa","036b28caa59b724465eb92d7fc3a8e6da3801457f6fad265ffb9761aaf99d496","42a22698360a6d32a511b4224a0175136c1e162726b717f3abc8cff337d36356","70e8e6f9e22cc162e298693451b99bb13892bab15d282ea97842a1558f922901","6450e5f1bb8647e5543da73619f2eab3bb68201888f1c46664d32a0a06f98951","ff0a7c9de540ea83ff0a2ba99f53fd376fc6b0a0485a5b765df9b47781276f95","86799e5f3bd38d70a371a14f244a2198fa4bdd8604c26062be009299a5c9867c","f23a000e7014f1d2d4f780a8c23e31bb149f74b35c5deef1952f38e0a11f4523","7c3b582b34253137200e60b543ce4708d10ba0ed4ffb84bc6663a3d55bcafccc","73c466372ce611b108384e53d78594e92fee0bd8f63b3bd50cc6809d9a5f14f7","9434cb9507c2e7d1047ed6751d6b2d0b4b82ed822962a08b37876080fe9ffb1c","36f835b4be823d9d97873676821dff21dddb1e15de1727615ce114c2cf0c1d18","b341e9f81aa70f0bacd06bbacd1422a14628f4d098e2655ae3d5ed006ccf147f","dc94e2220efc9e22be48b88bc13a900d320ed5098ce532d5413c824f17e9e41e","63f536526f71a3a6dac3fcbc6ee660bed539b442c31889e23e6e059ce98c8d95","72d72fa74d1e284f8a5010e73e07d95164b67c9b7afcd525e5861c78bd2ab522","666a6730c31e8cd864d2ba300f88c4c8642b7ba3255db03a3c29875bd6e7627b","ef2f17c7fc85bcd69a5812c5eac62a15ff5c264c5b4904ae5926935ec3b6a6da","5cf689c8a2afcc4a8fb8b3a354c8c61f5dbea5188bdaafb261af46f916603175","ed05dd14240b1d6655f02bc615e7af3d9a805170fd45e32bb3c97b348ec198bd","bd095fcdd5ee62b35349599150f571a388647f5fd306e48236f8b5eefcc72331","a87e32877336e537527ea2db05845c5328a9121527dffc0134256b2c0b1cd35a","ad9d67ba66b122b4ca35f4f394b3d7f19c58bcef31b7235306e8ab77a896ca30","3229e8bcb6f16a4652c305d2a1cfacdafe653077c024b945ad681957c75020c1","93382c8979f205d918617a3ded6a4b17db06b169296877cef1a5e6ae4957c16d","9bddc99e6a28a4707f5aab28a22e805ca0938b2b11a9de4697f2c000c19e578f","8dfcfa3cc0022d472064d252756ebdce077166e8612b26c725adcf3aa18ed497","dd4bad73c85ac200726e309b8576ec74f8fdb81f2b5e01c7a13a6af62d0c0905","f430e650e9c2d8517bb2a0aaec133a1b76c699b32298a06723d74cb1ed0e0ad5","265ef90fdc5fe78d6fbd05e444161902112fc269853fe982e38e431814c39e76","8e335ff8e3c6772cf00d62aeb563172b124bf618b018b155468844c51828a7b8","25b68ddb193a453a03bab52ba1ce28ce684b72846efb817301671bbb00e2dd1f","5637cf097394a3679c73cbce7f79fe3a2756941cc3e1f0a28d24d0b59783abff","70e6e6c30885709f956299664b489a9788819dce5516f95503dd02a9d48a00a9","4a7eab8794f0fe1d00f6caca77bdd9341ee4c1fe670ba22a1fda217d96029909","efdc427ecfabfa6abb39a3bdd252c7588d07174e6e30c19af7defe6193a92ded","82e6dae3131b40b1a425c0c7d37dec3f5dcad0d8cfefc9f5324d7d436b34ef53","2544f7bc1cc72fea8758bc990b3963b77372f9285c9fce92946ca98571d4a9c2","08e0c8a1e22cfba6fb236604cf25609d9678593bdd6904f70aa63b9111731d04","49a4b685c88e793c147328aff7db0fa437d3446616c4ef96654e8b6993b77969","bfaf40fb914c32e12dda1978214f35866fe5d72da431eebd16fdd9eed79631a7","276e637ca7b823e2b3bd249240b231217ffed9c77aa722c4f5cb4d9ee092aefa","47aa14d08398f5c3ef71dcc11e8d8a695d63da1b6886ca989d751472ec1d1346","5c0cb52477aee6419c53bd9b478f66c5733aa5b66860476a3772f1c21e7550b7","9c2bdca05e416418cfbbf6f32d06e9bb0a08a5b82c2613cedb199853d56faa3c","a3d7b893843955a38a545b2f8298bc7dd34b56ddacdcf712b1af7c5a23f77f20","3ececa5d88fa951b1f5ac11039e70519b2cf36f44359387103f6a9d89180b4ad","f7077758ea2253decc1bf742b258a9a275752ae3b790c4a101e82ca3f79d2f10","b0fefd37bf46d4a6846822e7dddaa396fecd5c4c3a2fce0ac11e088eadca9cdb","89d1b65516e5db7326362ea793e6767b14a6330d0331fbd89f41a3e0c3e7973a","25fba5a4f7e766daf13fe22b2da6a5ac46968b7ca47b89cb213522db5e24d62b","a9b039d897765635c2bbd590c9c478d21debeb969b0a6790bfdb9da822b55f5a","b1c00b3c965df0a0a30c4ce807b0c9ecda7b401eb145cc50cf7b14e480fc3f8c","1510d366ee20f599b3ac46d2cd1243ba6b2848954017e913215c03fa6a6d9556","c2a3b7628b9d1cf7c117beec4cb4333e30bb759f40fb47d4aad67bb8017063ae","c96dec63632d26dca0470e1d0caa04a149535e7fd9ed9dd482c68f33ae170003","e77a53aafc4a00cbad69ba36d7071ccf4b2a910c3658ef13db80826f17241f07","7b88ad963c6c643c5e37fcf9cb729718e57ab233e74b1e8c404540391fcdf8c0","23fc55eaab6e25b48ca9eb29f413fbc9eb06ed4e28497c4ace255ed0355ab835","f43e82413b8126db1bf9f632df9f1d2feba9902daa589b6674337f96d30c062e","eb9d7a7818188cf4e8663c805f3bc02b06ad2736ab53917bc42b04594344ea67","f1983a53c5a1b199ebfc45b0b1ababde4721f0ac32ad44308378b80b03315378","5e6663965c4f915a984c7469f5124c3dc7092ad7988dc6a1e5b31cc63da2d7ba","0a86f77e97d4d33480cd20642faa9ac576170802afc549fece4821caa5f9eb31","354eb9ac97dacc504e8dc5f479367f70cb0d65c6603f5cb290c026ed0b8deca5","de1c394ce0d3415f125e6f2f5efcf315845b53e72a0888a44bc8aa4ed74e632c","c84ab7c15f79bc27cd9f40fa9ca84d6dcaf284fb2fad006577ac36ca38093fd4","05a667c5a081aabd1fa93b7149c11f19dcbedba8687fc7a684e8240968905b8b","4a46c3d0b778b6fa5c45b83100de8f5ac9e1cfb40b9c16ae04db45a8e8a378a1","c90edd4c24bc6cf9a2ff7264d5b6f0cb4eed1207de753df097c5f0b4747e7d79","dc4306e6b73ca7d6f1717b788a84afe32504b307f6fc468a266c986d544f842a","3c821b1506c0337fff1dc4aaf5e5ca1f49e450e731179fe625ff64afee9526f2","a76897931efd101ad1ec506593debd4c2a97f0491ac954406f86b236164253ad","4486f55cbd8de88c4792d553494688cab79c4939a9a722114aebf600a5a3dedf","4fecb5bb072825f41938be215f50606a4690d98c6e937556d091d920df517b46","e61bb8da5ce6be9eb0a47baca5cbf32bc255f08d87084f954a6843f3a3194129","959b4eb84600bb5d5964a123c76133cc5aab817589c1a9073155dfc0c403a2df","a3c44b96dd3bcb153f58ac41b1f682ddd0ab04434536fb53420525d057ac37c7","c1dd18fe00858f1db0246475fc689068e9eedf9c94a2958b306360c83990169f","df250931a5d45cfc6d818742b033d87adb0f7bcf1d8b45ee3cb790215beacb3e","a3a7cc33743fd910d16fc2afc2886b7766a31d2a04e2fca60a80deed7640e806","1643357cf66e052a15c13468f1aac2c26860b7290618dfa2eca7da738af05068","a8ad9a3960d5097cad8a6aae408b64c534723ff6867e8716e16697d67052c75a","87b86d7515527a926ecb286d839ab65e9a4f80af8070efbb24f4912ce0107ac5","e8bb845e84b9a1dab33965c58b9343a2ca25b0013c47c00e64892b70f441c556","5b4cddcce0624d6e353bc6bc16f846b364c17c09835f4403e7b9cc5cc76335d4","5f008a264f906e6ff3229e0b851055170f36cb74085248893307a20b35c8e030","3fbfb6aa3217277b810cb1771d2773452a2627d414ca390339d9aa6eb812591e","ae0085430f05c3383f96ef5670fef3cdb1263b8a5bcbd58b31cdbb5ceef5a655","970ff52a6812e3fb17789b4fd6daa6fbba0dc8b737915aa722a4d325978f5cfe","baaaf6140c2d865fd6f73484a9182e2983aba3d4c4c57a9559d4467c72e6b1a6","e53cb04c660336dd42e5a0b52e55958d9a74c3bc24ef8d123e624c1e77f60e78","e96b1f45b3c457cc4f0c8be6c5221fb19671a676cbf554c3458d282e38a88fe2","376a889f5361f4aa32770524bdd87acdd6185dcf8ada828d5ce7ae8552e21c38","d67beb7bdca7bea8dc7ca4d1541a067da684d0e307e636fb2aed350d147b070b","8db96affe96c725feeeee84ff9e5234f414174c85b4d3a1242545291d23c2caf","8494fb3d56e72aab30bc8f1a760ff5ab06b2215f93f37b271bd5dd955d31c026","29d12ccf886222d4593ddea3d50ade97e32c296f8bfdc8bf55dc2560660b177d","82c630576a5c621ead7ded699419be45386289fcf9fcf2a4cc6cf3672e0d6611","35a0ddb50c565bde5948a374cec6618f671f259c2a78bafacaeee38631b889b6","7c4f510d3df29981af471cc16de084a059224c37bb8ae00a8c6edbd0852d4dec",{"version":"7757c6ca7a8ad1992401c6aff33633d6a088515be5a39d7ee188b35bfc8e5f8e","impliedFormat":99},{"version":"333947325e15dd42973e611203f6caf32016b0ec25d0f9c83cd5c54d1a8b1d49","impliedFormat":99},{"version":"0528f6d21f7a02d4092895090d2dd86104bd5a3e79eced96d5a1a7dd90943d17","impliedFormat":99},{"version":"b5ce343886d23392be9c8280e9f24a87f1d7d3667f6672c2fe4aa61fa4ece7d4","impliedFormat":99},{"version":"eb64a68249f1ee45e496a23cd0be8fe8c84aecb4c038b86d4abcc765c5ba115e","impliedFormat":99},{"version":"b0857bb28fd5236ace84280f79a25093f919fd0eff13e47cc26ea03de60a7294","impliedFormat":99},{"version":"5e43e0824f10cd8c48e7a8c5c673638488925a12c31f0f9e0957965c290eb14c","impliedFormat":99},{"version":"ef13c73d6157a32933c612d476c1524dd674cf5b9a88571d7d6a0d147544d529","impliedFormat":99},{"version":"3b0a56d056d81a011e484b9c05d5e430711aaecd561a788bad1d0498aad782c7","impliedFormat":99},{"version":"8467f4c442988b9b0e68fd2c2c12fae1d1516c42bb3a593a63d711ea05969332","impliedFormat":99},{"version":"5225e4dadc4ca5be23f80c75245a57e37938b87c9f5c266e203b3db77c9095e5","impliedFormat":99},{"version":"c76c02846ba7d40b9b3488f0e8d75d02cbdee2f0bc5fcd55dd3bd2e1457646ea","impliedFormat":99},{"version":"4ead13a482c539b77394b2a97e3b877b809eac596390371cea490286f53b996a","impliedFormat":99},{"version":"06db2f8ba1d1dfacf04529cb731081ab23f133f29c7608ebdfbcab356996827c","impliedFormat":99},{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d","impliedFormat":99},{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true,"impliedFormat":99},{"version":"968faa90c8ee361d90cb79cf2b0d95904d3e113161e9e07dba1ae6dce32f732a","affectsGlobalScope":true,"impliedFormat":99},{"version":"42a12f2faa483c9b48195ed794d22698162274e755f6e07219c2351c4f08d732","impliedFormat":99},{"version":"727858fb893b87791876dee5e3cd4c187a721d2de516fd19d3d00dc6e8a894b3","impliedFormat":99},{"version":"5bfaa2ee33e63a1b17b08dbefd7a3c42d1e0f914e52aca5bef679b420bd7a07c","impliedFormat":99},{"version":"ac3d263474022e9a14c43f588f485d549641d839b159ecc971978b90f34bdf6b","impliedFormat":99},{"version":"a86701e56b10a6d1ef9b2ecaeedbab94ed7b957a646cd71fd09d02b323c6d3d7","impliedFormat":99},{"version":"7d5c6cc5d537c47c7723a1fe76411b99373eb55c487045dfd076c1956e87389a","impliedFormat":99},{"version":"bcbd3becd08b4515225880abea0dbfbbf0d1181ce3af8f18f72f61edbe4febfb","impliedFormat":99},{"version":"b3f0791a73b6521da68107c5ba1bfed4bc21ff7099b892700fd65670e88ef6ee","impliedFormat":99},{"version":"d0411dddbef50f9ad568ee9d24b108153bcb8f0db1094de6dfbadf02feb3aa70","impliedFormat":99},{"version":"8124828a11be7db984fcdab052fd4ff756b18edcfa8d71118b55388176210923","impliedFormat":99},{"version":"1c88b51b966e2791c4a8d96f52fe857c282615d77a128d3239829981d4ddfb27","impliedFormat":99},{"version":"69bf2422313487956e4dacf049f30cb91b34968912058d244cb19e4baa24da97","impliedFormat":99},{"version":"6987dfb4b0c4e02112cc4e548e7a77b3d9ddfeffa8c8a2db13ceac361a4567d9","impliedFormat":99},{"version":"5e2ba3d18d78aebbde1f34bde356e41e9c76eeaeaeee56a37036596a9eff4211","impliedFormat":99},{"version":"8280ae8ccc0493b32d1742d585357ab9f0a508ea050af25a5a20d64010d0a5cf","impliedFormat":99},{"version":"7adfd9f9056ecd4ae6c65fde2a98654960c662714c73f048478959d04c09e144","impliedFormat":99},{"version":"437b7613a30a2fcde463f7b707c6d5567a8823fbc51de50b8641bf5b1d126fad","impliedFormat":99},{"version":"72a863bc6c0fc7a6263d8e07279167d86467a3869b5f002b1df6eaf5000ccc7b","impliedFormat":99},{"version":"c76c02846ba7d40b9b3488f0e8d75d02cbdee2f0bc5fcd55dd3bd2e1457646ea","impliedFormat":99},{"version":"32b35cf0dc3a1b1a7118b61c34ce2ad1a29695851679f9ec34e0776f2ece2a69","impliedFormat":99},{"version":"b413fbc6658fe2774f8bf9a15cf4c53e586fc38a2d5256b3b9647da242c14389","impliedFormat":99},{"version":"37c93220e879dc7e87c10f34f039ecb6505b78970d11ceefa0231dbcc36f5365","impliedFormat":99},{"version":"c30a41267fc04c6518b17e55dcb2b810f267af4314b0b6d7df1c33a76ce1b330","impliedFormat":1},{"version":"72422d0bac4076912385d0c10911b82e4694fc106e2d70added091f88f0824ba","impliedFormat":1},{"version":"da251b82c25bee1d93f9fd80c5a61d945da4f708ca21285541d7aff83ecb8200","impliedFormat":1},{"version":"64db14db2bf37ac089766fdb3c7e1160fabc10e9929bc2deeede7237e4419fc8","impliedFormat":1},{"version":"98b94085c9f78eba36d3d2314affe973e8994f99864b8708122750788825c771","impliedFormat":1},{"version":"0d7b337b785f1b8f42ec89bfe8e71e9c1bbd0624f02578aa26c8e6223ed1208d","impliedFormat":99},{"version":"63ea959e28c110923f495576e614fb8b36c09b6828b467b2c7cd7f03b03ccf9f","impliedFormat":99},{"version":"1601a95dbb33059fc3d12638ed2a9aecff899e339c5c0f3a0b28768866d385b4","impliedFormat":99},{"version":"56fc978580577d30f4c2cdb5b1eb9217b66ed66537dd27141256f426e4b8dd68","impliedFormat":99},{"version":"1cae084ce42adc42e534aabbf7e717a3ff86479dadc8d71ed6202a11f97e31c1","impliedFormat":99},{"version":"7cd92bc6808967f175063fce65f8d1d60a07d752b79ed20aa2eba9a2b8ed0820","impliedFormat":99},{"version":"6308e8e434fc631f436e512399dfcab54c37684bc51ddd2c85a2e9d05dd1e77b","impliedFormat":99},{"version":"84e977ab810a75dc103b38cad1e019d3ab8f4ec9042b8f09f117b7d18c4076f0","impliedFormat":99},{"version":"355a0c5302c2a232dcc2f1f53128c4e300ce8b86ccd713343ac35612e5c5662e","impliedFormat":99},{"version":"2b1795d67cf9aa20167c72d795d4db6badea9cea646d9181869b5ca08c778479","impliedFormat":99},{"version":"860bedc71ead192ea4a0ea5ef4686e65724d14b391ebd1a6671a7044e6bd8e15","impliedFormat":99},{"version":"34462eb085d501b36ed0d9ed002b3d514957a0f5d2b3d19bc8e9a07952bae8d9","impliedFormat":99},{"version":"c6cae8eefb49ecfc05db524b9150e2d43802baea2ecfe158893be0be49379e33","impliedFormat":99},{"version":"aa23d840b8b5651a89d9ba6bd66f3788c1942dfd9adbbb76a57d8928b035a3ba","impliedFormat":99},{"version":"bc2ccab91693a06e13d379e0c21464be1ee13861bd92e59882b55488b5dd84d4","impliedFormat":99},{"version":"7bbff6783e96c691a41a7cf12dd5486b8166a01b0c57d071dbcfca55c9525ec4","impliedFormat":99},{"version":"06a33bf80f0591e5ac8cedbb2c77bf0d772fe6843baef2fdaf19fc538c4e0bac","impliedFormat":99},{"version":"632711a108accd4533a327ac3b60d0518fa536dfdc2d9e146222c16aa348506e","impliedFormat":99},{"version":"81b5530dfc39e1946dd771dd5526b84710e11d6a371812b1dc2e8eef9e12aa61","impliedFormat":99},{"version":"be484fd6767e6ee4819ef703de97d27d8a35b04803fa32f2fbd554c2e9909309","impliedFormat":99},{"version":"ed6f179f3c068c285e4eff22216682ef3a5e986d9579c3a203d5bef7322f6d9c","impliedFormat":99},{"version":"99a323dc5a6e506c78b69913b32beba93453bcd87aae8b507520234f387a4c30","impliedFormat":1},{"version":"32727845ab5bd8a9ef3e4844c567c09f6d418fcf0f90d381c00652a6f23e7f6e","impliedFormat":1},{"version":"af3c4dcb64b945e01285bc0494e1cfa384fac43b08713a56fc3043c8f861553a","impliedFormat":1},{"version":"7a8ec10b0834eb7183e4bfcd929838ac77583828e343211bb73676d1e47f6f01","impliedFormat":1},{"version":"b07f64ff6ec710998a62b07377fbda0ab4c313ba1f0055bfe9faa22cffedd47c","impliedFormat":1},{"version":"72ef861333c7870a29fc0e248129c4afc0741c0716a74c3da409d05e41ff1322","impliedFormat":99},"44f014b297723476bf46f9d0bde85130e524b30f213ec548f3d46fabb1967bf6",{"version":"3d450fc2fc7b0f10b6a9493a682769aac34f8b612f0f5d1bc4845a7b0bfe9f0a","affectsGlobalScope":true},"f873953284350e530f10bc2e840656349ae1f65eabd729247c39b7611627ccb7","2ae5b1957f3f2de229c08fabb523eb9d41780ca9df9778499b09b295c1b170cd","2275a1fcf1f74efd5008bdfc003feffe0186df5b151792e9aa5c6454852983bc","66fdea704eaa4c7d688df4832f034f43a4acf60f549fa0ff035497ef992a9af5","8a9c10cf4b9a273804befd55361b84eda2a0e7ee38abc1895bc79d7a47b1c864","436bdbff6b03be2dfb5d5c2cdbf9869368a6c97b91072774181ae900670e4c52","3b4aaff5f920756edee3e80d196ccadc164bb821b58c79e399fe6ef35242a949","d998da6bdd2054ddbea76840721444fbb87a1f10730ff6ac4b07b1056c0f3104","de016ac115596d3a7671678907b873e191f765121eeb3171807a9d75edbb47bc","c2d5790ed3ce7316a9656084f4514641e19aafdfffb7c583861744575e230538","f836366b229d8b0969e942dcd45ca149a5d759a1a6703186e90c950ba1195120","bc4b14ef328417a307a72927f9a95e10ef54cbcb8cf7e6cdb918bb4b2b0e3e5b","52c6dfacdf9819d32c555866ab9fca19a4535ec34a2489563910f14479803c93","415ea996e742a5173dcf2cf686ceafdbbc3d8157bec3597a93179eba1c3e083c","647ec94760b39adab4c03664db38162e78ccb1724d8ed801f0a629759bcd0549","18f16eb11fde803bb6341e06edd3c1a3f7f72b62a137debabce328756d856e29","a51d654b9857a7fcecb432f2e526b53db48668a316072d2dfcc3707a2dd30ef6","18f16eb11fde803bb6341e06edd3c1a3f7f72b62a137debabce328756d856e29","5ae688734d6b5eb6b253b74a7923c63a5ee417d3954ab0b97ed9380a9e5d1bd5","f4c4f9de3151cb1c6a7678c6d6ec99d719396186b8391fbbec4a0370e74566fb","4d59ac4eb1f59d3e81d4f03a2efd02b88988291acb32a089eb20e05a6b6f6ef5","5ef68efe2378585fec64263c8dfa4fa8b0864b6801ed013e43de4b52061845cd","cbfdfecdd0a0aa973238b8c3b25aab66e86678f7b85ee2372b5e8e7f76caa3ba","fa6de6508fd0539144f8818cb985163289770b57330847861955d85526a29211","6619ee4bfe291a048b0177cc688e21448ab24ff363f1ec6d403f965497afe57b","0fa90528254ee589c30619e2c5c97592f36f4ee698ac4f5161ae180d57b9f242","3b6d6418f3cefc67af122d9261f10ec22275b573a386f472049fffd37b55c2d2","453a30b95714db768e13836c6460a69b09507d82f7b3f280f680ee44fea9b55f","e1de5c21177c45e036145a6ce8c61953c7684b4830b6db3fc869265908d8cf75","fd46d4ca279240183c759c00b828e4f37a85839ffc75ce4ed9911e67e9672046","1ac6f749c35735be917eb6db0521f9ca4fe4f41d4a429d5ed926ba344e2a404a","b4449e505554762731408b2dbbae5edd0aa8ade9306b10b433dd6fcd038756d7","a2a95b9c6e5bb8059cedec70c4f9f24f68fc08be66b4f18c9d13325e47564766","027df5a77b91e332ba185bdfe870d7108493ad92d3c9989843466f4abaa311dd","374d160899cadc33acca98173bee5e3b9ae05aad54b8732b7b16de80b634e7a7","cb9656ea04c3158da93eb0a4f3b0066f36d0a84bdbefc3c7ce43f770c9817557","26739f3e34432f09b55bf0992fa43a19ad4fc63e0b19a40c8de2bc68728d36df","d7203e36210467be8b5314a0be0d8bf40e52f24c0c19455988b57d0a0dd9e7d5","9dd3ff484f72e08e4b18c3dde97c4ff5fb6c8042d0e1ebc7875a98b3c2f9905c","6f0d8618e4a3ccd8675ffac8b733772a1d8f18e8b7e6e186d8902d41be7bcef5","39804c9917164363e94b60ecf27aea447eeb92aab8602a881ccd123a932a7c60","c886ce843d660529447121941f2bec8a25a3da757315beb9ac498df628850429","04aab16121c4e5e2a1ddd1586cc43b703d41278c0539d15e35d2a14068495a5e","12f64e888bfb7708c89ab0c728c62d086d50ae7a3dc1857c331ffa167bd0e2c4","b14c4cc04c0fb97bd96e665e595c3c01aba411c114d1eb8f1059e7e5cef73825","33d6131368e2deed098d1bb2334979fece532028f64a5da6c12b59b2dd57b24c","c25c0ba1841e631975177a12a3862c4fed227b197ce34d27c32f5da6653917c9","378afa224c6d7c6f9da55ab64a53f233a236b163c589c2f4e970c1a715a770e0","171a833026c3a54729b34d76c413f4fd419f5500cd363f704144437bd74a8f03","4e30992af15276de8da6d8ab5259b87150ac935c9d193c881b13514a6554d267","1b2cf9d03dc934d9c25cbf8157de364ffb1b90df592498a1ca4092d6dccc7f28","9f04c936c92815038706263e769d5704f382f5587d7fac29b409944ef09572b5","738c6a77d6a0792276b90edfbcfeb0da691738957c9fdfbdc79a10d6706cabea","1bbf37408ca9802e4762efd180a2310a4a8133861198ce53f3f9d456431163ec","8fd56d15a96b615e50e4033ee0aff559c62060f1efc4f7d7f018233afaf0c5e3","f5a512b2e826595f640022020a19dca89add7148ab537993cc317f94ff17ed62","fa301a6cf6051049d45f3b1e407bba1df723f3782bb5b8e9d3bb1a12e6b276b9","e16382f41bdece17018b25326eb300b0b768dc03bc22ca52cdbc3a5fa64e9863","68545ce50695b0e29bb8bf2d84c1a8242f40c204f56e14e228ccdaa541a8404d","12a9ecd9936392bd9db1f4cd49561c8b2865a1ce97233e232a913b0789ee0be0","80a4639593caf18885f0bcc06eadbf7a8f736f393280765f37bc1927eb1ce6cb","4452a2b984d13eaf0416f04d11869623d49a6a9589f1f295ef0af239247696bf","94d9641cb15caf66bc07953b716efeeefe26379215bff3b9930fa948c6e7e73d","af351a793f74c23f316fbdbde35fac142a1d1472c2945c857a160185c410875f","394beedd3c1d34917c3ba52db5f12f53f73757992c1b5466b78a7a38d1dc00d9","2ce8c7577c6621b7556768c10d2cdc56b8cd2e7f6d724e866a8eb5849e3895e8","082ed8e1025f29ff643348b42928a72d352469f2c4e575f357208df0c1c3f652","e1caa15b42cec3b982f874d8681cdc527c9a813abedce9f3426679b7b6d171c3","dbfadaa51693747ed16daadecca9ac56e7adaf57d2836400cfdddc94577c46e9","c55b05449a8301a2a8861000bf8726f46cda3c169b80797fc8630382b8472352","dbe9c5bd17e14ce0008917f5ba1a9fc39afb2ef8b0cf867c760378c80f3b7604","e6e8f3ce2e36825b772ed98e439cc381fb8b4584d66e664d63bf335b9b7e421c","488e23ac17e247fb31b3664b9b0849727b949cfc1966cad5b939bea84cad06fc","31f4cdb7bbcaa86688d6b96135b99250644afcd0aee7adb489da523f0f12d19c","ffb675c5efb9b4c020edf9f7cc967a8ffaa22db2fc8fb9c8cc3e3b1a1ad9483c","faf0ab6b5a67be42c151268deda8ecf42d4badfe8e91058d95647406670f3997","e577ea01dfc281eeec19e056a483c64b3230482ee31d387f787bb3e4b2f4c5a3","ddfd123dfa68daaf9dc718bf4a9d0019a2d4b768599e7faebd231d08c2083fdd","5019b201c2e69337d00f7c0b09d938aaedfec284ed95d1f1f4bb74252fc76179","3d8db202f4586242bf0be4711f69ff2eb5f254912700163bd73fc04403244ae8","48a0aece42db4f1670ea5c6e0eb7068f2b856f39dc84c663b4888ca34eb8a8cf","72b5924cb5b5a492a0296f239a3386855494aea6f7e81ade18f8583890a2f485","7fdeec60276e682a6ec86c7dd60ca102f684c684afe4c046ea1d95254ec756b7","9aa404bcae5efbe42a5c3b58b956bb7e2158efe77a638afcaec0bfd236c03174","79314fd79adece7b55dea13c0f98b053d98d1dc7ffe509ef8249520a6ccc5ee8","6544b7eb21a5bb95d6b996add33df5cc181007eb33bcbf7c6087c08cf2abf3a7","448dc35605362508cedd5e39c5f098135b130450b6bf5a302830ff0e5f9a34f6","242d42948fbf920f7a8c9ccee7c115334a349fd80caa79b410da35b2c66c441f","99848d3839fb7645494d52dd801ddd8304235ee05f597d63973465b717bfa2ad","12add725434716e12d9a633e2a10e4e4968de719dfdbed7387e5e0ed206bb2ae","58e6444d268ae873bace7cfd07f9c63e63b301132cdbd4ce85489e6deb6eff91","dba5166ad9db9ba648c1032ebbd34dcd0d085b50023b839ef5c68ca1db93a563","8befeaf0252bda9225c637036d4566dc6329e0ef874e0832057990d8270da38f","c2b040de67addb08f347ea3f9634e5154d574f97db77bd2da6760bc2184db12c","27183dfed025d05d2ab2fc40e3b16d69674e27b728b81d94dfb9242b8032eb09","c57e1e6879d59450936edd1fe0bc72c4fae32dd7f6456fce6f458c917e670a5e","670e06fbde4b4e4b273a8cba8ab4548bb76973918aa528c68df934b630e729a6","7b15a1e3c20d85d98ece8886d2f6a7a75471eb704cc79a83c4559239641135d9",{"version":"a8062bae4d5055f04ad18553191afe3012605cbcf0819e18367f5f87fa8bd689","impliedFormat":99},{"version":"af4f1953fa7ef8d18d60ab3d4e83cae9d1a1b581908ca9fee68cb6cab6f81098","impliedFormat":99},{"version":"c0750c3bf53ffc4ae6dd795ea2f538eab9137063b5ced7a95995518055be9e57","impliedFormat":99},{"version":"99aef09e2ec1a14cbadc9febc48cc330356c3fa60146679b1d631281692faf8b","impliedFormat":99},{"version":"3801aa8f80f83aeb352e32cb5ad9810f9bb5f2cce564b4aa9a283432e40b7c7e","impliedFormat":99},{"version":"106e7b5bc0b64083428dbeffe3ea564987f1ebc8d9cd562f495073c4a2af16b9","impliedFormat":99},{"version":"67ac20d31b61852ac9b758e43e806b2b300bbaaa5dc54ed278bd21162c2d5d82","impliedFormat":99},{"version":"e0f9e38f3e0b7bcd916a748e349811598b273d47acb618cbf75ba10def200a95","impliedFormat":99},{"version":"2937b4ed8de8cfb7a5f371653f151e9b5bd0177f04881b9a777b3b62d6544471","impliedFormat":99},{"version":"997e9cacc283d4d572e889dc29aba217f23ac18cfda6e0cb5b4688f29c3b8e19","impliedFormat":99},{"version":"5f2dece17b17049d196f694b9814923cc005342657b2f8cc30d61bf6c64aa3f0","impliedFormat":99},{"version":"34251191dd05d4a45d74149770c311fdf708b49d458217820ec297b8e2a4d25e","impliedFormat":99},{"version":"77c4d3b780fc11884b04fcb82350fafcfc4439bc6bd499835ae8263cf15c9cfc","impliedFormat":99},{"version":"357be26c7e0056ca23fe2ad7f432e0dfbce1d5316558d9fd23de9dbe4c1e0ed1","impliedFormat":99},{"version":"9ed7085f99ad089297ca6dbc5482c70e6dca04b5762222f330e54ca4247904d7","impliedFormat":99},{"version":"1d9fcb591b6e03d72a17ecb147f2f6b7dcd6db076b4a555e056a53febc1c9025","impliedFormat":99},{"version":"58163e21b823b008d00a0b51542ec5a0d73681b827158d2d3aea1a19ed607232","impliedFormat":99},{"version":"3484a2dd7c0b92c963d23ff2935753c049f5c323c4bab4cf36a21c79b6dce90b","impliedFormat":99},{"version":"75f4276967c87d458fa30adbca3bfad253ed4a32af74cba75c270ac274e36328","impliedFormat":99},{"version":"bc7c24166fc2a6633f3fd7a1e6654e5d381ed8ae8be209d33442eab418d9bec1","impliedFormat":99},{"version":"ea0bc330a6d4c3b6063adefa4cbbf162fc782d1c0e99d6e56c48bf7e66c6b74f","impliedFormat":99},{"version":"b4bd925dd308aaa44e28abeeed6143f090c94cb0c1ba875788c213b43033a9b1","impliedFormat":99},{"version":"e67fa1bcc5d34dfc7cdef4d8fef9d3364b7addb7119f9b46d28b4a038bbc6ffb","impliedFormat":99},{"version":"2a1ab3357d918132c86e55e715792288dc7c0377fba1007306a93860216de8f3","impliedFormat":99},{"version":"be4448d73b19fe9712cf8c237b93b6982896a61237d6b125ec91f7810dca73b8","impliedFormat":99},{"version":"dec25493df67e012b28f2726cc7ccf9d96a1e5b3d9c1a5198bbe89e2d2af3744","impliedFormat":99},{"version":"971f953223ffcaa914c6536f28602064ba8c4657471033d6c7909389fefc8262","impliedFormat":99},{"version":"263b1e360e9e36af2f370eace9fd4238bdc659bc7a9eecd807c83e72ee6b8281","impliedFormat":99},{"version":"dc484c17106998437f34f037724865ca569b4beec54f5216dd9f393a53593e11","impliedFormat":99},{"version":"6a95902bb98aacd82b1d46b5c7f9d8b9f136a06d086288b0c7d7576e2e1dd2d1","impliedFormat":99},{"version":"9b11e35e514bc6e0f8e9da1e507292839dbd3006de7342a38de7f41b8762c9c1","impliedFormat":99},{"version":"18d752c3b1ebb79840325bb97061664f412909f2bf42e87694bb6a41c74ebb7c","impliedFormat":99},{"version":"3fc2c45e911dbcc32ec303f6389d7b485e0bababca72150d36828221b0775ecc","impliedFormat":99},{"version":"27b977b97941a24c1a0152689270552519d92001713c778f83591c2d3d3c4617","impliedFormat":99},{"version":"1ea7e97c0652b9614f9863d66595c6e9a55e90324f05186f9c7aa5c02ea672bf","impliedFormat":99},{"version":"519dd178b976d3973be6187c19e8668d3e882355915eebc184a51f0bd4871682","impliedFormat":99},{"version":"1729dee34d2b48b1291ba31e5c6b4ed7c7677e9098fd8717f06fe06fc73d2bcc","impliedFormat":99},{"version":"37e67b161fa10ceb26e1828e4943c1b400def793dbc09fc03dcc397dc03d4cac","impliedFormat":99},{"version":"75f3dd1d95f5e3acc2224fe7c8f02dfd9c14ed1f0a6ce1bc33b289f2a5d60fb7","impliedFormat":99},{"version":"74dfc7fc0d6c06afab1081fd899ea5cf4929336db3128c1c9543cdd34dd8029c","impliedFormat":99},{"version":"03ecbb96dfbead5cc20f4fe47a8979c9028e15769e67f8306f6b47f6cad3e01c","impliedFormat":99},{"version":"6a9893a3988e568723edcdff450813f0c0928ab7b33e48c8b9fe10afcf46724b","impliedFormat":99},{"version":"ee1e4c622d5667169ed63c6ecebe278ae87f2f62304a60fc041692dbc33b7e56","impliedFormat":99},{"version":"7b50413ece7ce91be5427b2dcfd47b0225d5a1ba8f245ff63e00a4feae151d56","impliedFormat":99},{"version":"4810840b9240f11ce1791286c6c65699b4d413ab897387c022be97d8ea088e2a","impliedFormat":99},{"version":"4ea8fe15ff7c4f475f0d79dbb5330e1f81cac1b09c344d5fc77c9a035ef29c1f","impliedFormat":99},{"version":"4006955d236be699ed8d2e8891ca0fa2b101b2b4743617e5ff2a3c4256112e92","impliedFormat":99},{"version":"44a42b8964970fa260328f36d126d8630be1e92dd581bfa6a2e62c8e2b51e387","impliedFormat":99},{"version":"af0940ef932c8dddbf769deb4731def46d2254a89864ccfd073764ce974366e5","impliedFormat":99},{"version":"de52d325d731ce4b8a88fd8ec2efcf04365f2e8e567f5920458162a3a8373210","impliedFormat":99},{"version":"9985390b580ba0cfb41f7a92341c6e8d66c42bdfa138ef2374dae5efe13b3fe2","impliedFormat":99},{"version":"9fc0e756ee8cdc297561af6daececa03044c256f409db1ec3d1f426779075d58","impliedFormat":99},{"version":"23214854e47335bc9770780014b08d37908a7824ab986a72d4fdb24f79c1e108","impliedFormat":99},{"version":"ec84238e782e400c66938fb1ec7565116029cdb7b6bf9f48060e41106959621d","impliedFormat":99},{"version":"315d8ee79b3dd8475d1aeb8814663c29e0f9601511f948693b8ea3379a7e36db","impliedFormat":99},{"version":"a0eda64ce377d750732ebffdd457003e3871a30c154b390e6d2f925da211b5ef","impliedFormat":99},{"version":"fd5a9008c168320f8ebe8375ac8c58ac342afd782f69b3fe53ec2c54a6bbef77","impliedFormat":99},{"version":"c1f59b65f824b5d53621d0049323b766fed0e7f5e30b74b34d655dada6b77b1b","impliedFormat":99},{"version":"da414aad17865fd9114995654120cf454a89e0872c81827ff11c0e3c3dba90c4","impliedFormat":99},{"version":"23ca1f2b58bb662559b66fb3d34f92b719ba970a9c0c83d65aab531a0388bf1f","impliedFormat":99},{"version":"033341ed8c787f156d5fa53bfc7f0d48d37741592e6cd3dbe0c619ebb70d1924","impliedFormat":99},{"version":"de810890bcd2bd331369db2a282dcc57cc043211ce4d84644fbe5f02cb57ea5a","impliedFormat":99},{"version":"c6d462753edc613499432d2fd8b9ec55184444b892b6234041c59b5f827381c3","impliedFormat":99},{"version":"d62fb1a9638da594ba1ffc9070b5cf2b30325f4a17bf3c363070f56de2b5b152","impliedFormat":99},{"version":"e8c6def890f17055f0512d27ba8618c957dcd8f21ccbc220cf40eee36a56116f","impliedFormat":99},{"version":"f89c9be1350bc788ee52a4601e857070842f7bd052c3afb70cd952536b6120ba","impliedFormat":99},{"version":"b0b4fc9a84fae5ce2eaa30f17c7fa7b15e8c8fe0e9c39eda417fde4375f2269c","impliedFormat":99},{"version":"26c29b56f51ca2180ef8dce18b0a877866e3f17261a0d07cad32c40443459f2f","impliedFormat":99},{"version":"38b120c275af6b44446fb39d2585f14153feb839fa5fcc84b2f1bfef81745bdf","impliedFormat":99},{"version":"84b787abc4f0eec35086dcdb046ac82e76de89e423ebd7cd5c557ccededf6ee1","impliedFormat":99},"00fd2677cfe5e7fa304d14802c75817e7e593697fa4334a7407a86644c86af43","675077ee8ad61265a314781e035e870fa93baf00fdf458adff97548430aec9a0","5049e6f856c620ca50e7ee5537b78fc126657763ea427012f1f86d16790dcfa3","6ff731debc01f943954378e3850a94943c23a2153123cc46a49e5f31a438e2b9",{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},"e7ee33b3fd44f550c5b00dc62030266a1f8e5ab75a8f02ecc378693fc642a593","17e89b1e61d22a57958915c77c25a68da8675e05d8a31c15fb11a142aa2412f4","7441617e2efce53e99e59cb38fec6610d69bd02054189379278b7b9558f5079e","5a2571f1a807b8d2527a6e1cc22ff9fca6c1aa5b14ca2f768108460f3143d152","2b9b30ff74df583d760ffbe996d4e609b1d3f6d3d6930a8ea01c17a1c67e0daa","c30069b0da3bed85a1bfc6f3fefe10186b2a77ec5350173ba56623a249d10b7f","9ce081f36e7c160167d5fec5d77f5c8e37d43505e1299d45e1d7c0a54652ef78","af73d27b47f738a865f6acabd6c812a8551c68111cac49a98c8293c89ca8dbd3","975dd4d5be0be7ca5183e904004ff61fe50c67a9cdf36cfa80f0eb6c593575ca","3f54dd46dd7d2abc7386d32343740c158a1899e0e1a4885bf26db7068294657e","7a3ea15b719a3efa1f510214e22e3d41d81683780af898ac5e9b32977ef28403","4c8dc6643282d5ad828fd33a282c149c4e2002f3dfc514d68f9198edaf9c4f2e",{"version":"c57b441e0c0a9cbdfa7d850dae1f8a387d6f81cbffbc3cd0465d530084c2417d","impliedFormat":99},"c9cc4b052afa2bc6fcea8a059d6e2510efc9339b48cf1246b64e5a1851f5f36d","8154d176fd5cce1e764be58ae1fa36edde81ec994f8548e2f8e50d2c7094d117","6d851c4bb7eafd61b0114e080b8cdfbc2fe21ce94c7a5ae3b948a1009e306831","5c8a9116b2e98e9661a58a7d76761e93388f0c6a4482f2b01b82077edc7647a5","f67cd0a7b53da162883d9735c83a43fd9ee2fe9dd47f0235b76eb39560f31892","c396bf26b5b06cbb6bd56ba62922ed517beef2afee82c113620b9828f5e19586","da5ceca24a20b3f2bbbef2a00980b88d5123e6bc300c74c282c7596bd793194a","32953637ace2edecd11331272b87dffd0a08da5523a3d1e29e445c92c5ac4229","fb1d108f78dd4466c1a0503e16eb3eccb6b95f555721d38d11f23c05f13b5cae","99370e9af2fa5541cf61da668499dd855e2d50a0a64f820b531ccad07faee0cc","5766f9d9b84d6aa73b39b39d8bb93b4e0c9a0934aaa3479c2682d5c6e047230d","885fe8bee0b170e764686e935af100977695d222888250a740ad011d5e47178a","7002171e319207b1ff3e29b1cf5c43a98d7b6020752cbfec1d6f3ee41e798fb2","6ae93e541971d32692877bb52c10167f5ef8362d80107011ed7c8a87c7dc8268","0e60c3ea30a06d56e916dcfe0877b2821edba8221362acdd301b0c21ba48fbc0","c79b49168a7008b61834f2f13bab7300261342f2e5432c33c5888fa7f65773cb","7aefe2deabf627ba989187fe092c260b349cebcd072be8f90768378cc17cf362","fa8d9178c6a5df8e2742e043487877102915f2da81b6d9522139682e58a4cf0b","d5cd2f19cce74557a250763b592ac1b9d6ab5339cb726a3e3d2d9fb9e33f8b0f",{"version":"52870c04b789c477d8d128292f908abe808ef6fd7fad72ed05fc141bd09314e9","impliedFormat":99},"a3924634c4586f9fb0adb1a609b634986a1ced2fc6b570ba3e43447a75751788","f384843925e3eaee2bf467a915737ad5b7d0da27332b401247e9d5fa67dbf878","0dad2ed1d890baec66e1dd5777931ccd8845925f6c4c2a55b5d24249579a01ee","ae85b239097bcf7733aaad52c6e51dfab14da2b710eae9ccfbc9014068aec2d4","c15759d73184b4e3f0ca97b23b3a5723c7f6ada5b882328cebcf54b90a8917df","813057580a32ebf3d8068d38fd62b50672fce8680140f8724968ab4ce0124c79",{"version":"acb9e11c784faa64a3fc5db6ea3db5062c26e845bfcae233846e54ca219c905b","impliedFormat":99},"ffdf2fe56c5f9499ee7bb4d0bee9c747f726c1f33f859ef7ae2419bb74432ae8","6bafe179d238dcbf3c94f5055ceafe9c96f0734570835334faa7dfc4eab92edf","5c1c8ce8740030965afd5dc933eb7164b32a7d18b6b00b3b17a447ae19613877",{"version":"2b4276dde46aa2faf0dd86119999c76b81e6488cd6b0d0fcf9fb985769cd11c0","impliedFormat":99},{"version":"38d4cff03e87dc58bfd50ffe5a3fb25e6e6d4136a1282883285baf71d35967c5","impliedFormat":99},{"version":"5ecea63968444d55f7c3cf677cbec9525db9229953b34f06be0386a24b0fffd2","impliedFormat":99},{"version":"6ea9c8bf2ae4d47a0dbc2a1f9ac1e36c639b2ac9225c4d271c2f63a2faf24831","impliedFormat":99},"ecd6aaa7a2ae4f932caf3045f1a0c48f545f9c8d727a1bbfa6d768c83a612d91","7161816e210ab74afe25e650ed66d936db4d6be5c760dee0238caf54e6ae6063","3c40636b357aef8c9c2cacca35f08e5c0b4af0d3f866157fad3b5f8632610872","4fdc8c5d3cba27c96e9c19ba2c3b5bb8306e9f3f76a0d79c7463b6b21158db31","ef9c5e18ee2220f84029d5c7aff020617bbbe6fa2bfa0f82ceea244ffc0bfe2f","5b355c67aefb7f23b1b527a5eb9038102a4632b5fd3a5708104742153735fafe","4d4318acdddd6a33b4b7ef26af1a693ee6b392a07ac079b70806086fb0694c00","f419c03a9ba33da60304e0295b12def08c03d2eb87d36034c4abba4b3c9ecaae","c73fa53e2098a44622530ee76153624bcf09025596a92f4adc77c5196cc41667",{"version":"3eff07d5a1f2ea546f6e1184c101827005cb505dd13e3c443f30451f51931d96","impliedFormat":1},"fb9252e71887c23938ab86713032d514d45111be93bcf215f69c3fc2c3a99810","7125ca18a1f030b5ad16f45ac20fd625e7c69694ab0d92a8d544a6e9bd11c9e9","b307bd3d4f31ac47209992811a48351c25854d9e0bed41f6ca028b07a44b815e","17d07bad8b6a831c9147d85ae27cb39dab3ced9a65009626f1fa00a9bb8ef940","95b954916442a71c0653e592c72b983199114615577831dd36748fb29a1f74c5","e27cec4614aaa70c274051b9c7ab25b98faadc42971148ad30ed40f1a3214ca6","f3622ad476d756051c06b9f6b5b909fa3e44db42eb7c5daafcff020bafd85c68","e0131f6218654b59a64ad72790dd8bc693a4a54028839df52c8411932eed06f0","7322338c03bd225838f7a75a1676903eb6177c54f54ee682779802f2c8dcecf8","afc478d77ae545b4fdaa7e0bff245bcc8860cb2bd76bafdb763b39217c25a78c","9821bc43d6f73448ebd60ab2c9e91905be23837b6fd60e33d269ff5622c8bdb9","917edae75be0a4e7f941c8a99a7476302006855ada1280854723b49bb353bdd0","764b125632b153282eec867a2e759198509594d11029d14296b4e91034b2f60f","eeadb48179f0db02f5bc92ab45a94a603cafe182a94df17f3131c708c0272598","b8ce65200bf45f4e19ed8d480791c4c3d7b94ec7df72ca12e42e1930ca6452dc","f6475db6c9f1c87804cc40539df2885ca196df76b608f7942b27d38fc0e2c749","f80aee0e2bb9aa4d54decbc921e07409bff77db61cb627098602a5fc60a595a1","00dcb2faf40d52425850290c07c1dbaa93997f5f9a230b4cc93984535941a21e","56bca659b2a1f69fcea0a7cf7803b92c7a589149930b1348e4b85bde15f4be5b","d0792264e4632cdf929ad8558d0f06c7c4403df57321e61862db8c541b56c3b5","3d3c91e76ca0c3de37880f756b0f554813f90160b705df83a19b8303b25bb865","7e7bb1e13dc174033e83d9f608edcdf55c34e743fa6576c21ee6f12eac9ce1b7","1291a454a6f5109764e327e0bab02ded76b5d7880f4bf67999256fadace6a521","d287bebf93e593a6d2c511787ff6385e67825bca5a611d031eeef27b2bebaf88","bc9ead1d055120ef049b9631848ad211dedeb0904845b2a2d79063d038a8190c","b5a8a1a583e3989c4bb5aeac8ec43c05d6e12515769c8eb8c858f2e0ca665020","24229d25c34f475d66a1bdc3cab1a8e1bae58fcadba45015d4afe46fa044e75f","cafc7b466eb9c23d7ef94ead068562d59b6bfc41d2e1bf0e76ad283ab27a0c19","aa7ec623dcedb6fe9fdb9b673c78b04753f4bad383f33f51777bd6b19d1f2417","bdca146a954975e304f25d9b3def2702b5c53a1ea1945f6a50497eb755909e5d","8409ea7d985efa7f2e2f2b15149170bb1fa989aefa1b439719e057b65b96de7d","12fb3328523f441eaa5ab113012e3621beed96f1d3b02c6b9b821eee0bb0c7f2","8f5e66442c2ef91c25b28f03b9dd2b99452302f226104210c03499d10be718e3","b7939cfe749555aa0c0620408dfd487bcfa791945244e5bb58ee042480f4b835","bb970daa097592c109beeeeebbd6051a4b5b310d16d9dbd93ca396b9b3a3129e","67402fbacd6214e70fc59054bc06dec75a49112da353ae4c7d9d0ddb0802b497","1b70309e3da59a370e507a2e735f9cae1e7dc8b122f0569f0502485829b6d4f6","a836fc15c677bd3ecc4d0095096c6bfda0b7d0e84514adf127eb8e6886799f11","2706db59b854531bbf6e2ed3d7e6895aa9acc1f8939e3e321455fa1d0d2ad3c5","e6c7486c7a8470f7e5fee4e22e46d686f3844db8a9f0f74949e801e73e99a229","641a4c2a9583fc45fb6a4d8f0cd25fb463a104149607fb279f24f38ede61f9b1","a391f27e0da6763ed68d26bd1d2d32e6169d834d19b07ed25e95ed0f2bb0a6bf","8124f65b3fc0f3b7be6d98d5ffeba289c4133aab8410f0c070fc1e25a96c9f9b","8741659725c57d69f797eba9281c609d9ea47fd59e70cd029c645282864e4025","1878ff379f347947a3290c29f7c7817faedef15daa80bc0c3ada934102c4049b","21f66a8d2ccecac24bf34dcb387d279383a60315bec520be87e3a850d5d9bc7c","292c59b6ec6f0fbf9feef7bb23e3b4732bac9ebdab47db3c3a49c03432a962fb","5d4e8610359044ddc5084ab178922b162fb9f182bacadb4ab641a3393f805263","6827a21ae330fabdefed08a977df2ff08e9d72b4f8ab09c5095867b335df2de2","daac0a1107c8c395d94c5ba1aa54c78ca9471f8295c4806ab668a7acaa5464db","0f7f5efb42da1318f93b562042a0b49619396634c123906ca0e057076fb7accb","bf6dde46caa5022c97a5dcd1e042830b31d725dfd2dc782be9e3a83a9eed559f","833e0ba22c231d9e1b26996b399a373681a72005be2d2294592fd3fc010b4074","a286fc074bd31594e998c2f3becf1caff355fcc0d57c8a6e2f1d30c8559075d5","637d4bca22b1a293c4efa59aa5b9995c8949f37e9b0c982739513d970d6d9ce6","cfae8540fb65d16391f02f404960b1d9527ad54f7367bfd0ccb8574afb1135f2","6d89c2166c08ef1b8a97aee8135bfdcd69c9ca8ff8f8a633a7151509317e2408","f0cef439b89ecd5da87aaac0e03d5e747af2394c2dd86af10ec19e9e63d2980c","8281651e3879acda6ebb1b769df78a537eeb4171027341dfa6968d0be48f4438","87478264be4d3330d9f3c01341e3eecf1c4efa3055c06a9034a238f96c3e885f","faa21d9e0ec21386974b1adf4c6d596fd48a52b62a3db4e120bc3716a5ef75b0","325acbd0e4f276f2fc14f3fe1c79f83d4084303e2fd4c445f20e31f68f29b0f3","3e201963cff73fa00e55b561fe3992fb0eb20296a92e9fa4eb615cf1fdca3777","12e05ea5b8fe8eb08af52c35b84d282d30d3f10140f3bfa6ee51bdef85b28a62","43fabbf4a0cb9eda551335b1d5402d0cba33f43c09f40de09857dac60530fd20","d7e7dd5b221d636125683b1707a908f6efbfd6bc16ba886c72b4115767f75d33","1082320f03d289ce6f5e63e4a548d41537de195be7e309525613900132d7ee9c","35da3502ac6f58527c6044a4a178e192a5a3d5914f2ee8c5b3e0d4c43184c257","a215ead2800bf15775edab898a6c33723d52045bbcc30f4b89d4edd4d6539083","93d56ae8204a19e391c6336af6d665b4862edea8495ad771c3104b9b40f12691","9b9414ff3612b6e67e6c66ce472017473816c0e9bdbbd5f68a2aa24d1d86a0e8","d07c3ed24eebf4a8caef0a0ecfd4240fa2107c0de6149c8e2e78a8622518dd1b","e05ecf8e05377f732133d187e455caa7fbfdd7531c3a34b4108340b98571d691","b7939cfe749555aa0c0620408dfd487bcfa791945244e5bb58ee042480f4b835","c478589fe4c8695fb2891e47ad6d363b27d8de1cc46df79478c46e052a554ea4","b44f322b3a4c924762f4214f13796db9db2cdff865942a7396d09d3e04b6a61e","b64a02321deec3f84eb080b328f7201edaf050ee066f157ab736024c1e4c7fe3","aa652c287f0abd81a1d3a5d5e69fbc405f782a5a6fd4f7e38b8a0cd3413f821e","818715462e66998f3d9f82a8b2e6140a0d2366f79b9bcad1ca7df2e5bee184d8","32d32745a442f1e324500f7357669f02d6bc3d35bd11d6dd63636e37a24ece85","c71170d85915152edc499ea4ab126865e5825cc0be75eadd31a08539a9dd4a03","5fc75619cff687209ed20e9a1a3a2f534cda8201d6defc7a103c5160fc40b833","04033cb40070997fda88a0c03e5584b59066fda5e97920490df386e45f643f31","aed98601b13c447393d8a5eac539038a44b75a098d737419521b505f7919dbc6","5e32fc798f45e406960c452b3f2c7fd3d98abe12cee9b8a80b4892681032e022","9a75ea5dfb1288986ef417419b3f08886c55fc18033ce1083efff34f67e0dd43","5d752224f51c6878eb1816a62c8d77ced4b4274ebdaf52ccca9e6d7e14936b1b","b2c7397fd41aad71b8b22b84a67eabd2e6825ea316abeedfdefdba2013b8ef8f","bb04ceb5f42b27b2c2398f28ed9818a08f67c8480177b929b0a1cd222d74a31d","759c4dd25f7f8796060c3ec5946d8e3d1f44a1fa8a86554ddc9d88a4dbb40964","4f6de1fc5acb8b1d04a87e5ed2c81c9a0aca3198329f320f464d98e75d704a66","29f2be60a95bc19574718d5928293f4efd82d1fc406daa3e4337d77990911cb9","f8823a2715888df840523aad117f89c4c5810f2b3ace1dc17dd62fe1aec88b49","114e67acdd0ff3bb876aba9bd9ec127653f435b9a41f347a4f64527f68597399","5d15224738ba1707d477bde943a6fa61f1bb2473158c99422c2918a96747cb23","f11e8a0b39720caf7e5e0ce5f74b26e8218c153b1b532c7eee01ffb773fdbde2","9a023fc4e5d185fd4ed7295e1ddcf0d32291509db6e2652a1bfecaa77b14c39f","db32e55a56bfaf2d98368309833d35b00a311218d5781b00dffae8caaaa4fcfa","c8a3423479cec1686b1c66722c472ac51c3076bb8eeea2381e94b9685ad2b1f1","1f84ee2718efcbed0acae7e8bb5ec7d95399a403fbc7502e4989b4a0cc9a710a","44f8fc719e3c14af02ebeb0c3e18df1d57170386dcba1ba69fe44da344e66554","d76192ddb8f10b9ba68969c13fb275425f97e6d76af23568f54d24014590f6a5","d21c74059383c84fc13adcbee2dbe3656d6405c7407130a2b7da9b82253bef3b","b6130a7ba3335ea06ddf4f57990bfb29f657f63367ffdc4ce8b413fcac4a5a5d","d357619dc2d095487056415dfd9151ef45a35d4e49452aaa2a832b5338be8912","aa26e072c3ebd2404833cf7d6195e701022a13830f7eacde24c926a08e9b6e88","52a2999222e333eaf3f10427b060c008601df482932dd571d4cc3cd9e3c3bea7","09b9ad1eb10545c0d299bb848712d2b4f339fc69347373a9fe0ebcaa29881410","bd7c64c91b0c90878acc4d7bc10e09b529f028fe206aec804ed6c325c4056144","6b9b716c6fe28b1c574d9c6426abc668d617b9dd8d0ab34ec48a118a9c3d4714","841509b0ac385e5a0cc7d0edfdc17c94018010cac97139a8dabf86b9e0262cca","c2d1bfa8a396fb30f7645644897f38d619f602c8d8f3c6f0b15ecb3926c8b28b","782f7cded9b4d9c2591c289d9b8ed79eedf2d23b70c12abc34829829aa8a990c","09f8a2fe055b428e724e7f34cc2a11b1741385e2d1db683ae1f1598e874d8a55","c2d1bfa8a396fb30f7645644897f38d619f602c8d8f3c6f0b15ecb3926c8b28b","a463860b28a0feb643cb5c406ca3be027dd533f1dd5751a7b070bec49d5f779b","3fd68197419a8bf96acc7c54078f655930fd6e31860bd135d62ff5b701b38740","c2d1bfa8a396fb30f7645644897f38d619f602c8d8f3c6f0b15ecb3926c8b28b","7fededc80414511dc314d3be0e8be77ebc5036d13196fd962fbacf4d3113a765","5ba047b357ab62692fd59b06ba4afba29f62b4a2828db51c5f1dcadc16265cbf","5417d9ce6cf3fac04aaaa9204ff3c4e80ade7c99bd81334be5f0580a4a6dadd0","f2a179becb4f04e37a6410d74cd89f1f1f70721600f16e7452be289c3697d908","f9cc10fb7a0bb42f938d574633296483c9d0ae69422c6094bc664f323cc7e4bf","1b4ebf50b5390dfb50c5d2656d59c6c683a845379f4c2ad35ab75fae98dd792a","57e7f09025e9647ed867bb7b7cce5bbda7b22ef781a36510b45a7104039b0692","b923dc66ac53b22d6c0905d5b5fc740d7e5962337490174494e55a8606031b10","c5360e97de21b576a06cc4244eb6823406712a50094ba16a8ebbb63bb089df6b","c2d1bfa8a396fb30f7645644897f38d619f602c8d8f3c6f0b15ecb3926c8b28b","7319e29023d09c4b96abff4837fc261331c3c9533960a3fd0a95f388245e4d3b","bf0f5099994f0456e038a402b9c9a831fc2275d661199e5659905dc5927433d2","062dff63e732f11b11633e2fe4be73736493189893a4ca7131946ad97d157eb2","3d875098c89ec33c999a92e0b4d710ef25d6f4e2352a015ddd052905dc4555de","a31a4add509d096fca1b208fa69a5f12588bc2dad28e121f9b4d8943573e190c","ecfc3a82c788d97e085abfd5985af868718b7054fdc708487cca17b37b1fd5d6","14af773fa1eb27286789881ba3dcb3449e417cfea76fb4734ac705cb34b77956","b755882dc7d1688d3c3f013c4156024ac61dc89f6fda53c3840d8fd42f99b933","7f4d42f9012595a07c661126cf4076a8e19e6eb0569dcd712452dc65026b23e3","c2d1bfa8a396fb30f7645644897f38d619f602c8d8f3c6f0b15ecb3926c8b28b","5ac0eb6a89f96d231bf9435ee12a47570cf5fc4a05f77ba68f286a070fadfda7","494d82eb20e2e0286f667d3200fdd0523fdd751f86d4013f836658ffc06a45f4","f1099baeaa6afec5ee52cd0d94a2143a297dcec18beda58d5ed6ac2a859eb896","b7939cfe749555aa0c0620408dfd487bcfa791945244e5bb58ee042480f4b835","13f4cbe2b973cf06ccc031443ffe1dd51af3f0f1b3721dfcdd5cf814234707c1","96119f24c3e77b0c1f4863339c1b0f068003f28130ba19272bfb177c98487cad","b7939cfe749555aa0c0620408dfd487bcfa791945244e5bb58ee042480f4b835","d78f97ae1c2a7471803c1ad4d19e5872a6586433ca5c0f2e571fc06cd6b80e0e","a1da893a0e7cfe47b7f41e0fe081f3b3fbc09b3a1e86baa28744603d3c0c07b5","b7939cfe749555aa0c0620408dfd487bcfa791945244e5bb58ee042480f4b835","79ce3843b323dc103eda134259880101e7df5decf189dc333ff7e54d5c3b430b","c11f58ad6f422549ba9775e5870365c7d2cf8fbc159feaaaf5f351868bd6aa2f","23fe1b33f7bec790decb97fedc7e627769c13105e825732b4b9fd4dfb06a938e","b7939cfe749555aa0c0620408dfd487bcfa791945244e5bb58ee042480f4b835","4b4f00ac376e5d76a7f902074810dcfe07462b3fe4ade96436be8afbd0e76c92","16c415ff994314dcef759f947c751877f2805ce087386c6290754056bda228bb","15b8f285d2cb2c36807668aa59ff77af55e6a4ed47130a357296459c36fbfbf0","d6f7383fa66525cdf13dbd060bc8ec1a38b21fb5fa6183a384567fbd3969f2e5","372f8474ad34f57fa4e63958f2d267854935a8544440ab4e1d4342bf94d97b62","c439c3b97ba2a14794dcd65d88c772eaef043d577883cbaf03474fac2adcd9f0","db55d104118f69b6d4b8a78cedfa7bc6686cb2fe10831c198360f1d90b7b13a1","4b5774d701859751208a1dde4480871ff3677b3cf18229977c74b7d2446a2a6c","43abc3151a142270e33c19a7267f3959f540cfa21a2ec5bdc4372aff7e0bf916","9afdba9c3c5324240e87dd04233ed566320d76c8e9ffc09ce1ba36cf41d72ccf","1d190267dc94028491976a95a63c1f8810579c66ab2efb09aed1e66c68a1410f","62c3eee3aacfe349276811739095a4f29d8b013f1b646dffd10a0de4269e2eea","8aa6309b4c5ff3ad1d4a4de29260fe489857f3cf54479d759c7d317678fd1f38","bb856a7c8df10bf6b255b8085bf68f135200081b82c58c12ba2baf345e12c07d","9e6bcd856fd5797acea15047b0d9a72a989f9c0d06e60c5b2e4a7bd7a098229c","1d68d1530948f42f37a74b64865735da3e46567661de392f93836b3f25185ef6","9e3c5f0f27b15482fedb5e42b04f0242d4d783364108195a1ed787ddc10b24fc","55f7a73e0c9fe444c72eddab647a779f920c0aac70d9ea08ea33f103b31892ae","a1e251e5cfec3e2fa5f33f508c713c0dd256b13a188a764d2b027db5f4ee0e43","98e60df5db4164da7a1df6ccba7b78364150a156e561d89dc5a0c834cfd82d4b","870e690e66b56b7849dea66dc7161f090099827044ab2675ff360d26bffaf509","47f8ca26f76d0bc743c77917afaf4bee01b314b9bdf1e04ec481982de6349200","92eab1c6b8026c9892f7040e55ddf830a1cf14405cc196233516fbebe75c20ef","9a9cd08e69af9f345501fac6755093671d4d139392cec5dc78de5f72e4348499","dac1dde916e09b641716ee48d57947cae5eab4ef68c82484b755c5eba748dc73","c9eb49df1d1993451ca1d4c49d43d6ad97db6f97e8d19574a66141df3ebb65a7","6cf314fadcd8fc92af32acf15a6d6aec2175b7b3f4513b6411699a14ebdc79a1","39c4bb2a00e30b0fd87a4baa5e12bc6b03011d3f127b605483fed865afa75faf","119447f0a08e9b3d6d2c04990b0c369443cf96c0eeba92c937e3d8687bc1e60c","648693d8428444f5d19b159dfbeb40a032b38d1156e2fab96127aae47048f4c7","71054e6f60fe50e9a01969820156ef7a8df9895034aa28c01772758bd49e17a1","7e187d38780bcfb529b4964f9b44e9d560210eb2537202a9811932df5a766f0b","f97c19a863c2431949ed0311e09fa79bef5ef537a47f944c4bed494332675da3","525fbb87d8148392399067099b6ca10fec0cfebc2f75c822fb537b995ca724a5","c01eb24ce42f02568bdc72df413d3a4a87228f75fe2343cfac7ee0cbb65df1ef","f503d0818c6bdd371264d64de1be545d67307150d62258f6e6b285262eeeaec3","617e6e19aae8e400540b4d516a5fac042c763563b8e77f8754ce983a673dd51b","a2cb3bf486ebb271012ff9beeedbb37008602a073c6e0a50966b471d03241c26","b9dafd3b383c78dfb742a8b5c27e7131a85eb800eeff84af4a53eb85f40e0f2c","d1a1999d26aacac3d7e49db664eedc74bf724742bdbcc9f4da88e0de4378892b","75ebebeca37ca1fa45d2805f6fe638f9416b2135ffbc7a90fe185450d3ba879a","4a06a2463609fdda11f32953e3d53ad3c176eb958d7896a70bc966e407a31f58","69c5e188711040a078d7423c846e44244850ce56cbff115a694b1322c6fbea2b","cc134eef7fe16ab64f9ee3d50af8c2b1aaaa410a46b23c1a66234ea14dd5f98e","a8f2886be9c540ad7951688a7227bd78da21b8b101c6b9f0f92dd7dace97fae9","78570099d008d1a61a95aafb754b016a264d3d9d2d6cf4e52e115d7e23dfb4e4","7ace5746211296c6633345a773f2c55f8ac7310dfea93596580320ad56e4f92f","fc05acc1b3b3bbbc593da807ed8954b8e27101f6b040c402fe02599b086ff7fd","88f86d9887f4f161f38b8e058f1dba0b3e813108cb13cf015f1e7c8e62370567","ecd72cb0f6f1cb7a5623c86c3f69ed69d1662be4238ec6333e0ec75476d7ded8","355e27a6ffa54483457f9a1e8ffe4d2e8721a4c6f7a679952d4aa83be38ac992","595fbb91d18ba0b86404d30483f68f8ef6eaa29625f08785083402a864ed99b2","7ddc301d119cf251aca2ec1c10be827304a80812ae6e186f4f1cbf8798a9ec2e","45b086d87931e8d04e4a652a608d902ff0debc7341014482e16543893fe2d046","5954a94299a4c7e757465b36b90278318a4824cc9fee9f180491f429fdb10342","16c9b6593922d4b74c222c311e0d1fe2453b5a0a894b0f6bd609a986c9c8400f","b8304ac50e4fd275b54a129db0991184e7e127939f4bc843e54344a3333e7aa7","3ad90989bdc576e2c6ad6feb90e35159c783ee2288c0621608c9f81ad9af8aba","2bdd617f27c522fa24eba2cf0bdb3c011a92e01d25dc5436f9adc985dddea5cb","38411f3d871078abc82e0154a7d692990b2d972d0d693816cac7f9daea2a1139","980c0f6c1328a7ff26302e2b368e0e6273b43a0ac1cd7c5fcf3575d658dd4c48","dc7ad16240cf6464317e323e4dbf08938130df12f51ccb6693efaa2703fd905d","ae740955e99e553154dadab8148fbbc55e902b22e186dcf4eacbd0b8bf1b9a76","7968ab7ee777127852e5c0cd4385a19fae67704f44aafec315c31bbedfbbf6ed","098b505094f86c798a176fbff44d752e61186f2217f8dfd9392b6d2222d47037","67b1a60a15085aae9874e3a866babe085464592329097973887d605b0eacc139","2a7095b665f22d735e59a30e46c3af8b6480dd5f6adf30f99ef2284ab7d074e6","bedea54224864ab42ee6648a47a34eefa8a24c227efc619385582cd884f4b08a","024c435f76651e71017003c35778ae59ddacf7d87bf66f82ee0d88a9bc56fd86","0c208fc64d5261db21db7f5b3b01008711c56ca217a9d47dfb2e5aaa1a44e5af","9b14e221c42b5b9c7ddbbb104460c0af9adb947b660083dc829ce4d7e1a97cbd","ee542d7215ec1f04ea018e508709c7cf725ab97f91a358d42cf4f270dfea5180","ef6ce0751179709cd06aadbfde98b5e41b2ffd70d18502e4dc22495713677e46","dfdf0296506d9f79e7a849504c37aa99b7907cfdd36abbf6ad06426f1b251e8b","668fe2283136bfb14824cf2122ae5d477423b948eeb3de4b064528e0620aa9bd","3d1c1bca348bb2c67651dd48d5bccebe71ee4b71595e96df462e233c2fc665f1","901c803e4f99ea38f12373b3829c730352dae463869d9f1c6645afd37c030025","2f77ba322875066b6379e785cf34572f538b9f464dcc06aa129e07dca8bf5c00","3146abec48f5e4ae89008c25a91e96dd776178fd9391de211b7ad706c3b1e0dc","e289b31cd8f34899373f52c9a8052834cea1be0c198efc8535cf28ea61ecb23f","cf2003fdb8d80d24ff745476142d046ded5433c24b3c1c53e612eda81d2cba74","7f45e2a7f1108dc4b356f1a8e20bf1ae4493598366ce33b151435b9fdf120edf","6daecba188ac9fdce6250a01485782336cb0e7810b23485d5b7260e61eb46add","1156545ed80a110362a9edd25745c03bb73be313a89a34d0355757053304cb99","f7a2917e068d2779d1cf8fc32107da3e1feb82a185a33d7b70312779aaefc7cb","7065bdfcb642705f79901444c876335005f60a2650e7ec10189556f893acb640","02559da3738b7758dc446de557d52b0f356fc28cdb4059cad5404f1fa7ab9410","68f6bd468cee48526789c34471958d5e2841b17628f53daa99b3959da01b731e","2ceb29af6815d085ec2e39e46e82f170ac67fae7c57a805e303834cb7b19a198","437ac031b02df8a6b68cbd0de10f8d7845aba725efa61923748a21ada8dfd168","fc665a4b10fd80ce187c6f25eca6abe654100331af64cfc92d202015434f0b18","f49687db851529b8ba6e4b6f890cf8840de148c11283746fc22ae1834c874eb6","a353f8f88dc114e955cca5d31779d2c8ac62371ac34f235d57b9266eb30840e0","c588dd116f303646061f26563a076de13626ec3d779f7354a9699a325d653425","cc9cdda31c72f94cb37f0553f46d0f22c18355e7ef8c13d8c401c424ce16f478","98d1089cd223ffec1af68e83714b074e61ee4767c3724d925e392d594ca0fbff","71ab86d6b78045d2a10a310ef9cec0eef4928fa7192a2931698881de4f5731d2","2acaaff663334c949566c986ee5c4cac6f2f9bca16b1d8e0d3ed826d07726bc1","fea02ea37e96ff2089e85468280219310b84909a5e2c73eaded84aced12903d0","3df8b5c2212a7b9806bb0e24882bd9403aecf64021aa0676cb4e5c04a3e17e4b","f605e59d0f68335b1b570923b6494eafc15cff26695b7037c1f1a6ede6d9ba91","ad54e6cdddce23b880a640d8f8527e8ffb0a6cd63bd3704ee90f506312be4197","886708801be144620277d5a606e8d86d5ac205ec5db2074814dfb2babfc257c2","196ad520d2d1f8ec4367a4b0b7cbd90a0d161603e986dc9bbb72a0d1475c9e94","c0fb6a4760702d0a01ffb156455977754c5d93653e8bce5ddbd876771f6a217e","4b1f658289367450e66d0f51f3df967f56fa01a560a6e0533c1c93adc28067be","3d17fde615660066a2f573861ab0f40a11da7db27e257b273d7c8397605af550","f6b3d7bf3fc2cf4a0a6a92c01b88e2f17ecfae49eac0fb95a3cdca9457aa11ed","14487160fb2cc96d9153e5136d5e1ba899df1edd90318bc96560214ac565c26a","9b2935375f87a5b5095de9a07d58e5d014138f36b3af4f6426375ecfd506e811","bd7a894131e16f5fe8af310b6df6e07852b0a6430031532f58bfba9b908fa2cb","edf4e58a0d115c450cde2832b71cb8a406c2193b7033bb447fb5a3a514e373b6","85acf7ac56782069ec5ebe93dc1347351ccff5b1eb5ac5f7441f6f4b5789db85","32fcd0c6f47b0a9d1d8ac2612d54887ffd4299e2eaa6f1c6de3f24fd3b4f1447","c7fe0b355f0f5621d2e53405ed7f07928c82ff357a92035dc539ee2a4f3b03a1","b82a7a11119d487b02254181c412ee461bfcbffb2510c4a303ca04d515017577","1eb23c6385aed4360cc30f2cb3c5f97dbadad61e37dfce42d21510aeffe2d2dd","55e9f4c1a9e486cacce3c70390a4671f01b2802aba9185b46eb06b73b3a8eb2d","32ebbc7a9710d2953d8c691579452b7308cda527537e0595490cf570921f29d1","eb89fc0a31eae4f172848ed64c43af7aca3a8ea2358003899cd8abd1c7574963","334567ba68bdf1b6982a8215f9383ac378efbc03387bcde7aebcadf4aa942a6f","70356e515f6236a7fa603d287ece1926c7b6eab0f4faaf700bc1f630eebacede","e020a71e1309df00d78962d46ef09a0f27e708345bb3fe402afbe4d28a287af2","9d2d76d5b39d6bfdf923a0de38a14ee19c622fb134d715dba43a3b9241901fb0","e9739e5ee5c5db4c2f4a3de20127ad74abe444d1f3222f5c74b8f91979e92831","7efa607d0c57b2dc8af7524a8473c2dbfe73183f6390a58b832967a79166bde6","afd4490931dbaac09cf62ee13698e5d28558c50e7f41d610a9570aa03bc869d4","7e4075055301740bb64745c14f62bb635c917b4c4842428e71a598809bcc10e5","3cc2698325363597f93f8eefe7e2746bceaf080649fac83ae72fd326de0942ef","8a4ecff9214a7efe2a3d4a20bd2b4c6370f1e7b8622e894a8e5a4badd82f03ec","acca19a1a8d11ee929fd7410f35d3c33719c4338a2110d5fa70146039569a6a5","5926fe5ba96158ee452df61208eb2596e6d4100018bace1f5851865007d47244","56dcbf1f7dfc46cc2262334e98012c03fba097962a091205c008916c2e24e585","d891cdc7cd9fa733914357ffa010347ee532d3d1a4a5e0a970ef21c1251794da","4e0f19fbef75fc32462447b04f2e6f42fee9982a1d210a368b9fa4ac194ba392","987e67f553c79357866deed0eaec37afdd378f10d2cb747eef9aa5d539c20eaf","1448b79500a8b5b68e6a02ae0282e340ce37cd9d0eeda8fe5c957686f8ccc891","90dbcd7e5406a0c495efbae0377fb97404b1050de88283987babb722124003d2","9fa27032e844ee94c363ec1dd51de0c8ea926528f95e438c1abe182089a25ea0","5c8650d82c191e666672a14846914c7d8d69cd81dee40ae397f8e4ae077aedb1","bb96f5e34f3be5332750e18b2fee26a50048d4a8211c04dddfd8190af4a6fbbb","2f2246762a571d9eb77a7992cdee50694b978b5778e589aab8aa770a651a0d1f","976cec05857b66457f1f57c4b9f4161f6a6da38f48a090c26a0be6ac09603d0d","e50d99ea5d69cb172d10a7a1d66c0f1e7b79777feaf4acc1c3e2ab58a80701c7","feb7fa5f85fd208af0b58f317d72d50aba4f5cbc90a6f82df4155958a44d8d61","ea6f24d8f2f15d6a97395eb8e194c765d8dd9463400641921ab517be7eac42eb","d3979bcc97da188ae417e1b5d60484b2b646a0376970f9155e16a4da899cab81","919a515c829d64d7fe4bbfbad8173990c6d6cb7a1350c2c5955dcfae996cb75f","5e538f4a56b83039aa243fbefbc1338a99699a66840fe49cd134ef8e690a5530","baa2bff085e4c97b30575c4b52868e7b4920a3b8a10b1cfd49e5df3881c22e3d","5af366f655dedf87b3a26e8189720c4933a165c985f71cd68d90b30e41597daf","fa3da14e99e04fad20b32b70d318bdcb8ceebd3cb882602d76d08a3acc184a4c","8e365c3cfd96d031d9f67bb1e7d0b24993f62ff67c94c63845521ebca8797c51","702537601e969311a0a92cc5eaef1896cf4e1d608c59dbd018f26f6ea999d6cc","e95363ad25b73d07d443d37cd4b45ff05cfeb9a83d8df0c4b1ea979816bf12d1","fa3a0eb521abd13c4337dd39f576886eb6a5af1ef4bb5d6b2a387f3cfae7bc11","18a44c09381a69f352ed12c96e073f3169c6ddd044520fa441c0ea28f202f560","e57e833b5ed415431c4ab4ee7edd1ec9c2d77b35ded6704d7d5cebe5de765dc4","bebd6ec7b1431eb6b2220bb82224dcca70b2e9e25a0516fb9c172375db585712","6150a747f688db72a48cc327f4117370ca1204dd18abbef4a479b0fc5fd17c49","b52250d6db0ca8b862a48b44b397450774d6fdd79b8c2aa5c8aec4a799d3e395","a8d8d534fe0056e6576699d43eb37b42496b5ae4381779641caf52036b62c056","f57f8b199bb95373161d63e7aaad0f2dbf0fb259e9dcf20bdc915fa5b107cbf9","8b745d67aa446c6b60191e28838a832611ada12a1c2318233dd55e8a89155bf0","ce989b112142711a37a809e00163204c872d0b00948986ccc01755c819b07d90","38a05056f66a80af6489eb1116820e43ca6eb37ae12cf9396f90880cb15012f0","857608561e469e2a67bd5f414fa410054112c313d698f67f46f9f6b8ca796193","8bc9f1c88e1c80772169953c6c9b3a4eeb21c18aedaf3dd8964a97719306117d","50352581ac49b4f49c033b384053967812f547166a7013d0f70584144baffb3e","d02133598dc510cd742622f0136a0aa890e5e6b3c5fa328613905fd1722bc61b","05140ddf27d3a315b442518601c383e78286e800ca957e3c87d3ad170320818c","b13ffbadcf90dc1301c130feace446b85b119e796facda0cfa6c939f50820bd3","2b9cdad5dc0dcd8dc163e0442a567bb5ac68bb01910e2a329502f0c1f61da024","b7a642886a616fa81fb1d51eedd9d7d36c06e8ef0f4adea2d8ea9ba3e918ac75","5e40c616899b2e98b51af6d9ad6d44b837717575a9cba329f8142e5e24bc8a4d","000a1889f956869002ed7a940bfa64b0f074287760748b0a36de74022ba1b123","ee52ae49322f5c54e861bb03d16ae1c827361d2c44aa866744d604f30a1fecc3","d0885f097ec3c90bcb5b2e7c5261df36b92ddcb96c1053ce3124ce1a8c3ad343","b2043ad5f37453fbbec5a0137add6b6f89e5ba1ce0b410381bcc53c7d2ccda20","7fc7524a2f1d6a8715cdb5a387666cb805e320bb915c857cf749307ab6a1a157","4464400d3db30927b7cbbca4e6e433d79680ca43da743dc8b52270ca16a2b5e1","a35507efc83db1ad53443b3e9bf9b2ed39a1155c3b4d73ec6cf40a38814687f2","1ec4e9ab22e6373c5615f066098c0bbc553e88b3e8c1099b569ef538e0888443","0b53e6e1e2305f904aba8c40aa94c244e0a8d420e3d068549cb2946501475e89","4a1dc3aa74be7352ae99c0042df3c9df8ce53ee87a6f00b2a0fe5b8993b66858","8ee842e043dae4524a7afc169759842f41000450746914cf68535a05745bab57","bf7e6ed3499e732fe707fe2ab383be0b5784d13e52a39032a762af4cf56c40e4","067a7c5e3e94dc199f0893f47008879fdff325fd11cb0ad5c74556f22bcdc28d","699870a7fbf690aea811e65ec73641064e9c53df58eba9af215accedd13dec62","f304ce77b5aa874e3034ba14fc89ae16a083b377cb8da70e14eca0e59a34a71f","90cc362700c19b71195b3307fead8a6accdc00556b487f2207f62ba7573a1afd","3d7e9cbdbaddf07f8c108da6ff9a2957daafff2a1d41aa60c86109931c524bd8","13de96542e1884097daf0b3d6fc658c4b017fdd1957886ffed63e765b30b48a5","d5f7054076fca6e8e6395b94eddc65c834c12b6f66591e79b7fd7653b6268f4a","bc131803b9f57e8e92b4f805a5dc25946551f71e3de0424ab945ddcc8599969d","ac87d2bead70e1aed6bceab71357496095fadf60d78ef9fdc22d17a287bed898","4bb78e6f92a73ec046b5b19dbc1d00fae41ee71fdca2a10371787b1b4245180e","5252a8f93277a3455e880f2e84d9689e70eb534b7c774a677e3a61e50abfa446","583de484c6da32cbfe4d2f148b0fc02f03a3cde9cc076d35855e6a195ac30fad","86d46ede739bc8fb6d111eb6f413469a3052a8d23263efa0ca827fde96329593","6ca7825bcd4c95e621e004a0cdb95dff1192fc182f373e781f4752a5ae568f3f","fa04a29ce9fd217fd92516919bcccc5055f377fb8914cb5543948001915db50d","3aee6eb35865a6592516ce66486ca2af73cb61e92a07b04ae5d26795d075d9e2","1d1f621b800723c264beb8de77b1a85ea0ffc119ea3cc349fe30e3ba624eab5c","37542e663c69b47724f3c452558f0194768b7b7b05b681a5464c302c4b7ed008","aa2053a5f5bbfdbf8f1e11a5223ae0b908167dd2f9c90c2ae12869ba7fa1d76e","29788a4fb8c755b1f75577062d5d29a07e0b3c888e5fb0b6eee8d4fd4a9fac4c","71cb0ab5ee223a8f53f3f18c527047755e943db10ed00baab494302109b6dfeb","660ea7193a2af244d588ec227dd74d08206b8a2b756ebf491974a0208ac2f8bd","6c27c1c616135da52fd33882c17720b51541b7d914f7b4c56ab987c6c978e488","5c5ad66bad13678913aa25b41c4d4a0757d89c741511fcda4fab48ca7852f834","eb6e6f152039899b1c5c1d096ea3631fec9139463528df7eab8b7fab6a0ae469","4c1d17a1f747c49e35fc4e557c4dc4eb5a8163e06906d3eb5f7398a48f18249c","1f4459db6813d0187deacc624d75e69f6a777ace779b20098b5c46a7c4efe6c7","400842355473a9afcb779844a7917b88501f92b60e1ec44a062069c015c66802","77108ff027828e606466624f61731de43f421ae91d22337981bf0844b5dc7324","402cccee4c9ea4fbfb6a966fbb0ba5e36b473fd8e1c9bf82b91e7952606d4e6f","df67c19814eff080abf17f44952861a3fc1d78807701c873752bf9a518f4a5a8","1c0e20b34b06988c7c99f389a5102d83dbea8adff8ae28958223cbf99dd5d49a","8e38a885c70149ae8a7b275fc990c12b75919d19c4e4ea3036873bacbb5f7bf6","61f6c6c103e9c1e34a6c5c281f9b8776689cd7bd5dd0a3e1a40d0344b5cbfbfc","18fdfb09a93535321735418e88d5ac40b46ada7d8485bc5ddcc6337fffc31aa8","c6f172091731495224b384ff5ee37ac45e9b8099e7dd8499bfd6f1c88027f42b","d754438516d26af6c6e506c123b78cab8d0162f835f5dc1ac8e9e27b1b6655f8","4246bc4daa49bdcee83707b726f8c2460e014cf3114eb2915f87eb7e802a553d","77743a9874e8684990fab7fbd496d669461460dd33919e79a405b0cb23a3db67","2b262e5306f904c0a9fe6afbffb3910c6124e466c417ab3ee9cbec2217b0f7ec","c5fcdba006183fb8362acb31f24788c97f860c7019d6592406221c8d5f131adc","c23dfcb88a6e3f6c5137226885425e0c8520ca164b0911aca345fe7fb7dc5a9f","7305f465182610ffd6803ebe10ffee692c0341a2ab9c389631b67b56ca04564d","5366328d977f37c7f9cc695c2c9cbbd2020ebe12b07a5e7b89958c9517761893","ba32ffab81bb128290065e47cd065b46cf7952ec5938e692ca785bd8be8e14ee","da9b4072fba0a5538b6c28e25cdff9a05f4d72307b3795ba30cce3bf8f1e038e","af1430513ca2bf4bf54434d712df48fb4bce3055d946546e89b9e361e6a754af","d52840cb174f890291abe568ba95f99c52188cc94ad4a809ca02444254ad33af","841d003dae085ea9d4375ca28f0b2a07bcd73b22e806987d0f303fa3e2bcd4a5","08ff4095470743c8acfd1a7cb3ce9a8ebc0c197f0211b59fa3e620d10c4d22c8","5e30d188af5f84440d8f76d553a7168c2392f8db5febc1657c3c4448a99cfebb","911c9f0fca708663e69e7dc4ed97f20eaf4b38b4a22282ceb7705b6f325684dd","1de8e264c534bb291da1fa48994325d722efd3bb07c17cfb192c7bc133c2cad4","77f6c7e4f7d4e630da068dea3a81a633535f5d03cc32f3f7ca996fbf2972ba42","05ec0e691a0cfb1978353c066cb3023171edf577749aed108d4e7e8db9c51fa1","f41a872e62b091c6c142082b2ae552387d656ed9049c507d759bf1f478a3cc88","ca8b67cf4a12b6dd41c45929e98e033489287c11bc23869c81e8f04938870885","b5459cb9cc5840d41f0652cc8cc46eebf1558e54c925385287a90c84993135c9","0bac62d3f185a2c963f59d1a797230935fbafd9ed50fbbb275735e10600acee6","e5f9c3cfd92562555a356b89d03d421d34ddb65c79d0dc324d90fad5b629eab3",{"version":"2ea74690adda4758fc3802568d555aabe3a6ee041bb974e3205bdb8fe52b4c2e","signature":"3d0eab85a6321d5af7359ac76532c598cfda72d442f3e1c30ad4119813fc2e17"},{"version":"e8b57a38fe6f2154a18752a62dde268f81796bb57688b03166e8b9e45cd7a8df","signature":"890f28a1a41bfc3a28d1db9270a581fb0bc792cf2e669a159f3fecc7593b2c69"},"3c4cb6fe312d4269236b18da6fbf7a3e1e92aa36a01b9dc2ed8bf90a34bc15f4","302c711c2e1905a36ada8c3288ecb0c87c25de5f06e70b5e13f7c05552d99b87","2a67708e0559c5df871a802c737b242aa4588e11998ad0759f00c48c76e62b5d",{"version":"5d1863121f46240f0bcdf1e26f47d9af150f8a52944c95e206c7c7f41ccc50f3","signature":"4803d1f6adb424d2e9cb6b58f1427030333e096489e5c8dad1350cecd712abd6"},"de3f6b5b978c89cd9e531d2df745d38fe3a86ba2d14eaf26dfc287282f29ad8a","f51c570f279a41ec04391a5c1c3458e3e0e7d8415f5c55915f981cbebd3b669d","edee3d8841e56ef5b8d096e2bd8a3781facd861c0157c3b30f8b06c1676d4049","dc9413f6e8344ddbb059d0d092492fb13666e83615b288ae1f66c0d5dd37b278",{"version":"4ae4a21c54897eb53e4b14141685a82bea0a58a07fa040535d7a93f2b1180ee8","signature":"e5de8a51d57208d0bbdf9d777c90efe3258ab3c31003207a4d78a552ca183825"},"1e92f3ad7605b23ede4792d0973788551e2873ff897aa7dd8da53bdea02d5621","8732fdb040fcc1f70a2884af44072fec1f169a8b835edc646d865b3ca644fce8","a5a8ef945c065f906a6c6d490c7bdba16e5cc52a39f96c922c59948f3f8990a5",{"version":"254d71a6aec46d1bf4a3a4e501ac690471c3c58a26434ada8e17129f28391944","signature":"9f6e3a7d31c27c016b162a25967e60980c63d763b6b1d54b18fd6edcfdea054f"},{"version":"415d129b9cd70d43617dc601e609fbfaedca89e55a716c7c320e6f3d3f942b04","signature":"8df723a56c769ffba94aa9d6d6e77ea303bb163eda1ac88f4294dd605dcc7b8b"},"ddda336e7a3ba0fcaa1a88804ed4bf3a549272bc397842f22c3a902a4efa5399","34c56201d5229ad4deddcb7f29f34d5be2583ad12318bc1f16275b6f85471c5c","62ae0d1f1e680e576de44fea2c3e91784b992dc6b90de19288fc56dc63c5d8e9","13fc256c70e56a025ea00d40bb6505bc0c0fc507dc7068cace481cb2ee85f215","9b2977c3eed2b19d0838ccb497a3f99b3a07c1aa0d822a7c5aa2769699a70728","85a75ca1167a6aa804b7cb997e1b9fd0e310b1aef0f20f062378df3aca7f16b2","01431797f0a365f9d127a1f1219e1d6e556d10e6d558f2a6d064ee30194edba5","c0d9800f5f6f129b96650aa47734a6195af882b87e1ed535350468abea8bee64","b8fa2b4f5327ca07ce6250e9048d85da806a18591068d76989f9ed7690043977","640df710716412c2e29f9721fb84817e3e600e5092fee17284d5fcae78060837","43eaba1a39dc3c5c775c1e4dbfa50a46ad9364fc64ab4808c522742dddfeb001","14dd1462d8a61a597356eb2e35af0b56cc39dbf8b8426c0f1f9e3efee7e8977b","35998e925c6426f6b0be714f1db9452a317d0c4fc5904b590c920e2cb35e3dbc","b0b612e649a8c47c2da15906993980c8b2413d1984c60e9456e269e725028f6b","806508e9c830d4594bf3419b4b5bd2d38c749b0c9a6e08991888d95c99f258ce","33bbb9c06432cd92a4f8cb7fae3e7ec2dbc5f8cf485ea1f4153bb74985b12ad2","7e9122dfb19a5526dee1b3100208ec3da80320c4474d94bfa434a6661338aa42","0956dcaeb88b9de41888cfca9f246cb44397055600e29d935e9064b1873489b5","d11b5e5f570d0035ae75f05c72faa3536b5120b2d4801b8f2c0b89534f0513b3","421b2bfc65048138e1ddba23bb8bb4ac72dcd051933625e99a6cd341eb5898ea","9e491187be6a65b498053ef84fe49e66866f6bac8deccad25bad6455dc32da94","cf8d6069669c19a9fbcf97e9105a34cf0f9692a99126b354f821742186a222c0","7744ccffdc237e4ad06c5bb80d6f2e4e985d95f04fb02d3ca6b08dab8baa55ea","939a7dd3365cf02fec5f5c19669654fe55380fbe9f6420e08ed07f22866b62cc","5ecd07b5cee6a400a5df3f0859898a99d258b0ab83429619ea84584b837406a1","66f2eb73ae065081f9a8d262aaa000182745b067621145622df38893eccf008d","d16a520395acb4994c436f4a5e8253d67e1e2b6203bc7b26eea0e5044ac3bc02","fba64ec435630602bc210a9e6e502d4397400e55e0d5add84e70a0ced22c9f97","fd3862358b9bb439fdc24f0217c9a1d99740799956e8eba532e5d7e8c163b3b4","14f7cf72847b94981761d124524bc008323d22df2aa888f43d9f1ce6b2454c4a","5af71de944fe8cda5e707453bf78d6880bcabd041afb1dfd725af429805eabdc","e85fedbe7a3ea2da3489b56dbab01bd32285623a0958d7175903a495f42f7b96","9286036a22693479285a952c343de3277cd0326af3d9c11115b75bf1a37a32ac","f55b1858a97cde403781f854566d18ee2fa34ca04883a8f126484e3a05878952","b325b81d4a6af3dbb556556178f14402ed05bdc50a4f8940167622c66e8999d7","8783ba69a3feae6792efbfbf1ca1c957f22ceaf845fab28aae4848918edd5f0b","5c71041c09efb7026e78a303a11a62723cd2e39fe3955a65025ae003012b0a83","42a01f3cad62633ba0b48fa40fb6ac993298f09d7fbb188be3df97f00fca6b1a","9aa6a4c8331c1038e8865c8ff5b5d4c6e33bb2feab537b3920091330095c6f54","724ec80dc4052db4d57016233098981f25163eb0258b215c502bab6279ed4879","494772f76606134a2c93ca0ee38b18c26bf7b395c682be417f440561449ab216","84b6bd9483efea51191ad1a73f9dc7cbb496dad648b2234179a103b2bd06cb78","efac84e5b39c8d0c4ca7480a9d1ae0469ca363ddaa06cabd6a88c49341749149","161c3b6fd80af3bf68b168240fe64c48545bed894afb91868438e0b4439be618","91330dbd72927bcf7a08d11f1a4123228eef506e0b705fef3cdafe362c450109","921f11aa820f78cab773e3c69a76856ae5b56d19bd219ba8f072766dbe6c5210","127059fefc2233c0a915710ee458e715843afa0c358f8818c49d4f8b77c744da","15842dace826767d06c96596cee73416f6b5981ff454da297df2c2fe9e94f673","dd5869ad41edfce8851db05dae23945210850976e91b7fb8faaa9ea59c69995d","ad09c3e2bbb48d6c6a38865f8013c03275630955c3ecbbfbbe2d51e74a84afb2","c14b2825ede264a0fa60b2880ed283e65879531169601ba6ab3aa40d98ec9861","38bd2a2a1ecb4cd150b9b447fe424064b6423e8bde938e90f806fe7f4968347e","b4cd92f37fd75c22fb47f02bc833540fd1540e9398562f0f6a2344ad54e05ffc","e9a2db2bcc5081a7d57be8e2decccf33b99595750fba2847ca0d51079620564a","d0a643b12291747f50e7fd5d296bada3272e27bd52bed483fe2face252a3854e","ab990009799ff4ed02419ce714f4c144e8db808e94d64a9ef92f34629a333b7b","9e6bcd856fd5797acea15047b0d9a72a989f9c0d06e60c5b2e4a7bd7a098229c","44ec69d15ff3a6afdb9d5346d4e8551e6b37537600b498b5ba60dec1496870d8","7263df29f047b4cc4d4e0c0cd3b00d10ec3a5e1fbc0b61d56a8d5649773a90bd","9e6bcd856fd5797acea15047b0d9a72a989f9c0d06e60c5b2e4a7bd7a098229c","452bb209f92227234e12119193c75724bccdb348204aeb88dfcd3d11868a766e","6f09a7b209b29e27b192d4d70fde979915961217f166f22d12eb1e1bbb50085e","9e6bcd856fd5797acea15047b0d9a72a989f9c0d06e60c5b2e4a7bd7a098229c","6420641d5f9bae7484ae29b1dd14c853c8ede7de9e24922b56938c221508702d","1fe0ea7cac16d2268a87e070dc2830d68c7d598d7a59d908bf8fb5432a9b5f4d","dcb2f3c6c441fa61814092cd2b4c87619d0557e5cf39acd425e3ede1b21867f2","5e5ed7797b8ed51a110f16e101079a080b0746310793a181cbf37c1bb4eb4a76","9e6bcd856fd5797acea15047b0d9a72a989f9c0d06e60c5b2e4a7bd7a098229c","0d37b264587c5833ae3510a826118bbbe86285b6fcbe43aed958865cab16834f","eb73b1e2b9239b9f514dd43434d4acf07ac396a51fb38e21cc7bcd832c1e722b","e0c7d8c4c158993a6266cce069d7c8448c4295fd6b9222a8269fe9212fbe9a66","fcf585ce9a1cabfd288b9908fedc0ce104326abf31cdf0ab1c428f262a802b88","dbfc1e693ff4117d8d9ab588bf059cef78ce76646290e636d209bef1e5e5e1f0","f2e0936f56db81de42cd08437db5307c1417ddd8acf3197d9e6deec9bfd35780","9e6bcd856fd5797acea15047b0d9a72a989f9c0d06e60c5b2e4a7bd7a098229c","d2e145bf002d13e82407b5a113d3e145e31ca74d7a4296ceef283642c7efe350","bad7f4dd8a1257fa106dc9646e7b5f34d49248dd42fe8d17e9b7b62964bb494c","9e6bcd856fd5797acea15047b0d9a72a989f9c0d06e60c5b2e4a7bd7a098229c","011c8ca4ddb13dfd8fb2702c929923dc557bf96d6feb6c30530e4690be03172e","683bace06b5c1a128b169157fed918a5478cb78fe529ce1a5d87f770a744f7c5","9e6bcd856fd5797acea15047b0d9a72a989f9c0d06e60c5b2e4a7bd7a098229c","f7b78270dd424e4d9f8829fbb9ee0d7f60d2d696cb0ee15ea719c860eb687d10","75e3be6be7312cc55a0303472a511442541bfa73e9e6da8914a82b450d1b7cee","9e6bcd856fd5797acea15047b0d9a72a989f9c0d06e60c5b2e4a7bd7a098229c","d71b28733a85f5b558d513ac9f808831143fc50be052eeeb1d904d6d6bb0f9f5","e51ac4f59541cfbe6c0044ce680765d0dda95c7419f50ac130d5c2b0be129105","56c194cb495b778f61e3a50a5bfaf2eb48ebfe18ae0539a2306d64b44bfa0d36","9e6bcd856fd5797acea15047b0d9a72a989f9c0d06e60c5b2e4a7bd7a098229c","4d1da9f27dfd309d7be7193efa6a15c0d61d59ffd89a3dacb06c6a424ce60a41","a6b67384ccf8b558ef85c51651dbb61f3c2548a050371f18e7d98f36736c61a6","f84f8999a356279ab81f17471f0440ed91115e9c5cf6613bd9878830a156f2d4","9e6bcd856fd5797acea15047b0d9a72a989f9c0d06e60c5b2e4a7bd7a098229c","cdc730170a7001df1adaef65fec2a17ab000687ad5ee07fc074b30ece947d47b","21d393055908d4574f00f25f78ee5eaa2a85a020cbb24f050ebdbeacf81338e8","9e6bcd856fd5797acea15047b0d9a72a989f9c0d06e60c5b2e4a7bd7a098229c","97ad7f5464a4f9e11ddb2348ccf5b8ecff5d9c1ed03a2bc3330c1b9eda3c2caf","b00e79b90a1925f46f8a5fe7de0f6c77d14caa1b1577ee07ff6bd1bce6951083","8af5f1741b61b1d59b06b6de5eaa49db1678d38cb02c0171c40757e56f6d5a96","9e6bcd856fd5797acea15047b0d9a72a989f9c0d06e60c5b2e4a7bd7a098229c","e08758a14bd97f112cb0455841f84797ded0add402ffab99d6a7d832c645d993","3243cb239f3a0e7f9d44248e1c20147e3f90200dab3856d7bed82cd02cef45cb","224c52a63dfd0eebe4e5820ac8f59e0685b3f0aa7cde8cb7e2f71df29f372b45","4417cbc31883a42d88777e0796a7f4a6eee56588bfd836766c45ede9c677cc0f","e03b0acfc42097fa0d785378e35a9de86d430caaaa89991b4a395e6b6babdab8","81819e58f8cd795c1ca0725971dbc0d90f7d4a20b7da6b1952535949a681781e","8e6e2a350f637bb40850d006a32964428efa79dc31affadd089b45fe082f5d71","166aa7e82c8dbb7d532719231a01bb79de331dc46d737d32f043b7c3d8cf4277","39cbfe9e6dc7d694a1ae17ebe9e1fbc4e53ba4bf2c3ad0d3c5cf932cbb749236","4c0c65c69bd95c78216bf6600bbdd6e9d44d6c12f45cf294b528c2a42e1ba7f4",{"version":"b9589dff9ec7e911f12ad0ded58c8f8ba3d5dda2d4f8daa22123eeadea97d151","affectsGlobalScope":true},"dd6ebc2528383e04dc80f5a85eb6344c563ecfa0f06da8369283444705f46a53","a9292a2bb7680060831088d354546ed7d7fa3894d3fbe9a6abe1c93b2779735f","ef4308f7dd4437d9d43a498aa79020b38ccaf9e9ffb52b94dbdba311daf6fd86","7e503a29dd0babdba8863a7212dfd7b24b96279662299d017c9340230956e6c0","56178976c6d1cbd984e93693e2ae471476b19ea350182e2a64e1caa0ad1534b3","5ca612e87fdc7e084892577e962c0a5c09f438e65f0aa1fa26d7b63c67c09f7e","4dd2fefb9af58c77cd0b4e89526005ab74812961d362e369005d0ac925a1000a","b7f8d5d0fd065435c6c9e86fe762a398eb7b687fa03d36f5ca2ec63a085809cb","42a70f18777f68428fcdb9bff0e3792578487e1ffdffe34cf5b5cd2222acbd43","43296c0300ab123d12c6e3641b8b3e9fbfe815faafb0972f90b818a48acf8ea5","a138a37f7692d261d1709810811579bf44a0f9253e38d5ed6939b591e97209be","7f2f20edfb1973fd6ce5cb618067f778999000d1f5b1e81983aa5ae6e4a86c65","6356150d3eb94cb07cbb8b026e1c13fcc95e512a2f0059b3ce3da9977f5709c6","299415611c8cd2e532f223747469e1fd00d6a02fbd1527aa6f3187e7a77b8190","a2667994edf8ced38ae3125f8fa4a723ab0a0a7b6afb784f404d5f812a4e4049","7b77196523adc7af2fa8e67223ce5d4806bde13c1971ea6e97ef9457123c9884","3aed1cf692cd84c954feb24fc5e75e86e49885c03a0b7d988f2d72fbb5736849","0a97b56c5f07e1244f9b888b4f4804df79def8bfbdc4f7fd984f1d1ce24f4e83","34d0efad1164c28c48199cfa95d95f3f68ccf810e07078cc9bbd2677daf228c5","f4e88c3d9552887334591534de9387e60479f7a8768d5ada11b11ea0db55ef1b","62495be6e4ba16ba6c5404764d476fbcfd1fb69a0221e4e194be2d531ac6275a","acd8389cc4ed7d81483933e5507bb2a0d6ee40487d6632075c3b4445f76f7de6","eef83a8cb5785d48b99b2923b1edd36306a6d764e7838ac0e8c3676d0d383571","588373916fb9aa65269ed93990d366de5b569f08b5f528f8a26c79661d4fd973","6c7370157af73faca61013c2f8abd3b6636ec79161ab302ee474b71903d32671","1eca9232dc029acfb303e7e26186edb9c9977b8eb1eef155aafe8ce50ddaf937","26721ae1885f07baf44381e1b3b929dbc10e3b7546d8ee976d1c3a33b4e65385","aeaeaf2f2869463230c22fe3cbf1f449b03178fe17318019b985738f503cfd16","18d2dea5851d482dbdbd604e79157232448eecce9911e24612918a7bb85a6950","bdfd1cc9a92bf8741e9efd952d0d97fb8e673e9033867ba18d26ce0e760d1ca1","4aeedd1e4d62d60f64759857deb8ccdf93cdf3cccdad9439eed3e4a6d4da5c84","1343617fc15b8105ec9f9f54c355b1da33332e4fa87a0d4f9282f818e39c6cb5","95656aff81e3b95fac8b06bb240221f3f3f813c2641bc6f1879f8930ada00cbe","156978acc389517c03a91100cdabebc7f6af6b400afec4e4161b04ad50136716","6ddb20a382c6f63bb7e230c2ea60ff9cd14f4bba1d82fedbcdebbdb1eba76767","144b5e758146b14b7df63cd2ee075a05e6ff1e54189d29b7c70d10c9f4dde2e9","31f86828fc424522351747efa494e101a0091fb9cc10f95ff842ef6ef0dbb433","e951f3578f142259c7aeb5dcc45525788697c7b58a08b59b10ac8c5590f30abd","9cc2b7dc6bc0f35746819546d10959337b237463cbb11d36446d998e0ff4cf13","8dc36202e0aa90c8a34e94fc926a8325ae98a6c2bc04a8a8699b51cbf580d57e","4ff39a59f7b9af314b8ae51e33a6e28ebabd12da437f565bb005860d671d8e4b","ca746ebcf3bdc1022d57c20bfcec7a22f3198ce233ee202dae43e2f68a5d3b3f","aaed3e5dac6e09d75466e65e559f915fdad20be1a05315e78e4f2db4b916e3e2","d89fa604fff0bf30175c27d7e34b839c46fcd78e084ccf8d484950c519aab797","c61117ad6ddbd6451fe6e927cd9a1103b8d4b78e796473e3bc442a22a69c5219","6f1cbb58c880b7d5f93a26cbb255e3a5c63f82fe31a448c482197f1c898d1b32","3859a0ae7e6f7f1d0973396bb081054c9111eea736ec49780f3fb0eef1729e26","b7939cfe749555aa0c0620408dfd487bcfa791945244e5bb58ee042480f4b835","92292fa6a3d2190158460697c89597c2c9cd865863a99d0728db32ff01d394cb","10436b6c5d43bae55fec8348661a4d718bbf2b1530727bf2afe0c3ad58333351","2933325a0e5d3eec71a1866c2f229d0bb19980f39f0c1bbcaacc21297a08ee47","a1548d823ebfccd15f6c747f1249f5ea51ab70cdac878d44c331d4d91d547621","b194f710a73118ca929f5a30de4b9dd7eccf979d6278c5171ff5535697a99262","b792bc83e2f9bce0589c559c676ed4f08926c2d51cf20784aff52b80b47d9d59","fdf6afc18599112aba977cca67d26594bc4bb3f3e2525b2336b9212d0cf1dcc0","878d52dc9774dc1ed6d19e9eb3e1be5884f2c2f68d8bc5faf64598015934b54d","8a806520622a14786ca17572adec9b7bf8d25f36b5f998a40f24677ca8aedb82","6f19c8395acfb6f99e8aadef701994842ba9c79e72e1e455c6b7334defcf0eef","ed3d603c95fcf4acb6c969526227f9daac9ab48cf7f724494231e89f959afaf6","e275649fe5546f3689eb9215f40f10345e1254bbf581f012fb84ac3e5e4fc679","433d39d7c678aab3bde612dd79bd46c649c7529d74d9b5911f8c1f3068ea3744","dc453da327c8cb8e764d4f8d36d2d51556ec1392ecbe11e660abe0c8d1f9fcea","3c6a4dd0ffccf4bc42f552de58f4fc020be982bafc7a8aeb7ea0e0ba033693f9","81194b14265ea42c7b090f57944017275a73259d3188fa60523694350e0d71f5","3c31507f4a69d307d2147c03708635b64d9d0ca84ac01dd04b913f0367693781","3d7763057037aa465adcf6f24e1c232e876c0eae6d5afc245219eb2cf34b092a","6f69b329cadbe2bbba0245a832323228010082d5ef4455f5543ef2dcb351e6b4","5f47fd7249f73f93660493bc9c4b45ca552cf890e9ea62fea2afe9fb2efb7d9f","4847590e88b6da170b3a1d2fdfb45e3a2d4bf75bfc26d08eb97240723e5c984d","3a3b8f6149ff6d789527e7aa8dcceb42933f21c2863f0a16c657212e1a00f9a4","f7e6efce8ef5c056875213ddeda719c422608be1b182d0885bdc593e0db50621","f89af9f9d7515310ae98522999fc5c4a1a179cf00b9f1b0a8f594562fbd0a74e","bbecb483f28fcca4397a954f8f73cad81f787227dee302abf1e9d7b3e5b289ea","6ac75205f6d14499adeaa88b910bdeb2bbb7763c330dd70583f1e5059415e977","3d8db202f4586242bf0be4711f69ff2eb5f254912700163bd73fc04403244ae8","48a0aece42db4f1670ea5c6e0eb7068f2b856f39dc84c663b4888ca34eb8a8cf","72b5924cb5b5a492a0296f239a3386855494aea6f7e81ade18f8583890a2f485","7fdeec60276e682a6ec86c7dd60ca102f684c684afe4c046ea1d95254ec756b7","79314fd79adece7b55dea13c0f98b053d98d1dc7ffe509ef8249520a6ccc5ee8","9aa404bcae5efbe42a5c3b58b956bb7e2158efe77a638afcaec0bfd236c03174","6544b7eb21a5bb95d6b996add33df5cc181007eb33bcbf7c6087c08cf2abf3a7","d14b13a9f62c3c6176820b354576c98983a80f1bb4ed4399ceac90c958914277"],"root":[[260,349],[351,394],[467,566],[637,640],[642,653],[655,673],[675,680],[682,684],[689,697],[699,1305]],"options":{"allowJs":true,"checkJs":true,"esModuleInterop":true,"module":99,"rewriteRelativeImportExtensions":true,"skipLibCheck":true,"sourceMap":true,"strict":true,"target":99,"verbatimModuleSyntax":true},"referencedMap":[[260,1],[261,2],[262,3],[263,4],[264,4],[265,5],[266,6],[267,6],[268,6],[269,6],[270,6],[271,6],[272,6],[273,6],[274,6],[275,6],[276,6],[277,6],[278,6],[279,6],[280,6],[281,6],[282,6],[283,6],[284,6],[285,6],[286,6],[287,6],[288,6],[289,6],[290,6],[291,6],[292,6],[293,6],[294,6],[295,6],[296,6],[297,6],[298,6],[299,6],[300,6],[301,6],[302,6],[303,6],[304,6],[305,6],[306,6],[307,6],[308,6],[309,6],[310,6],[311,6],[312,6],[313,6],[314,6],[315,6],[316,6],[317,6],[318,6],[319,6],[320,6],[321,6],[322,6],[323,6],[325,6],[324,6],[326,6],[327,6],[328,6],[329,4],[330,4],[331,4],[332,4],[333,4],[334,4],[335,4],[336,4],[337,4],[338,4],[339,4],[340,4],[341,4],[342,4],[343,4],[344,4],[345,4],[346,4],[347,4],[348,4],[349,4],[351,7],[350,8],[352,4],[353,4],[354,4],[355,4],[356,4],[357,4],[358,4],[359,4],[360,4],[361,4],[362,4],[363,4],[364,4],[365,4],[366,4],[367,4],[368,4],[369,4],[370,4],[371,4],[372,4],[373,4],[374,4],[375,4],[376,4],[377,4],[378,4],[379,4],[380,4],[381,4],[382,4],[383,4],[384,4],[385,4],[386,4],[387,4],[388,4],[389,4],[391,4],[390,4],[392,4],[393,4],[394,4],[686,9],[688,10],[685,11],[687,11],[257,11],[259,12],[255,13],[256,14],[395,13],[411,15],[258,11],[409,11],[91,11],[162,16],[163,16],[164,17],[102,18],[165,19],[166,20],[167,21],[100,11],[168,22],[169,23],[170,24],[171,25],[172,26],[173,27],[174,27],[175,28],[176,29],[177,30],[178,31],[103,11],[101,11],[179,32],[180,33],[181,34],[221,35],[182,36],[183,37],[184,36],[185,38],[186,39],[187,40],[188,41],[189,41],[190,41],[191,42],[192,43],[193,44],[194,45],[195,46],[196,47],[197,47],[198,48],[199,11],[200,11],[201,49],[202,50],[203,49],[204,51],[205,52],[206,53],[207,54],[208,55],[209,56],[210,57],[211,58],[212,59],[213,60],[214,61],[215,62],[216,63],[217,64],[218,65],[104,36],[105,11],[106,66],[107,67],[108,11],[109,68],[110,11],[153,69],[154,70],[155,71],[156,71],[157,72],[158,11],[159,19],[160,73],[161,70],[219,74],[220,75],[84,76],[88,77],[85,11],[86,78],[87,79],[449,80],[466,81],[445,11],[448,82],[460,83],[446,84],[447,85],[412,86],[427,87],[428,88],[426,11],[396,11],[405,89],[404,90],[423,89],[413,91],[415,92],[451,92],[414,93],[407,94],[406,11],[403,95],[397,96],[443,97],[399,98],[401,99],[442,11],[429,98],[400,11],[402,96],[398,11],[410,11],[654,11],[641,11],[226,11],[681,11],[89,100],[437,101],[439,102],[438,103],[436,104],[435,11],[249,11],[251,105],[250,11],[92,11],[90,11],[457,68],[458,106],[464,107],[461,11],[462,107],[463,108],[465,109],[244,110],[242,111],[243,112],[231,113],[232,111],[239,114],[230,115],[235,116],[245,11],[236,117],[241,118],[247,119],[246,120],[229,121],[237,122],[238,123],[233,124],[240,110],[234,125],[224,126],[223,127],[636,128],[567,11],[570,11],[568,129],[569,130],[571,131],[572,132],[631,11],[632,133],[573,11],[574,134],[575,135],[576,136],[577,131],[578,137],[579,131],[580,138],[581,135],[582,139],[583,11],[584,140],[635,141],[595,142],[594,129],[586,143],[585,144],[588,145],[587,131],[591,146],[590,147],[593,148],[592,11],[634,149],[633,11],[597,150],[596,131],[599,151],[598,129],[601,152],[600,129],[603,153],[602,135],[605,154],[604,135],[607,155],[606,135],[609,156],[608,135],[611,157],[610,135],[613,158],[612,135],[615,159],[614,135],[617,160],[616,135],[619,161],[618,129],[620,162],[589,131],[626,163],[625,135],[622,164],[621,131],[624,165],[623,131],[628,166],[627,135],[630,167],[629,135],[228,11],[674,168],[93,169],[698,11],[424,11],[408,11],[81,11],[82,11],[13,11],[14,11],[16,11],[15,11],[2,11],[17,11],[18,11],[19,11],[20,11],[21,11],[22,11],[23,11],[24,11],[3,11],[25,11],[26,11],[4,11],[27,11],[31,11],[28,11],[29,11],[30,11],[32,11],[33,11],[34,11],[5,11],[35,11],[36,11],[37,11],[38,11],[6,11],[42,11],[39,11],[40,11],[41,11],[43,11],[7,11],[44,11],[49,11],[50,11],[45,11],[46,11],[47,11],[48,11],[8,11],[54,11],[51,11],[52,11],[53,11],[55,11],[9,11],[56,11],[57,11],[58,11],[60,11],[59,11],[61,11],[62,11],[10,11],[63,11],[64,11],[65,11],[11,11],[66,11],[67,11],[68,11],[69,11],[70,11],[1,11],[71,11],[72,11],[12,11],[76,11],[74,11],[79,11],[78,11],[73,11],[77,11],[75,11],[80,11],[83,11],[129,170],[141,171],[126,172],[142,173],[151,174],[117,175],[118,176],[116,177],[150,178],[145,179],[149,180],[120,181],[138,182],[119,183],[148,184],[114,185],[115,179],[121,186],[122,11],[128,187],[125,186],[112,188],[152,189],[143,190],[132,191],[131,186],[133,192],[136,193],[130,194],[134,195],[146,178],[123,196],[124,197],[137,198],[113,173],[140,199],[139,186],[127,197],[135,200],[144,11],[111,11],[147,201],[99,202],[222,203],[254,204],[225,205],[95,203],[94,11],[96,206],[97,11],[98,207],[248,11],[252,208],[227,11],[253,209],[450,210],[455,211],[444,212],[425,213],[421,214],[418,215],[441,11],[419,91],[433,216],[430,217],[453,218],[452,219],[417,220],[432,221],[416,11],[420,222],[454,223],[456,224],[440,225],[459,226],[434,227],[431,11],[422,11],[468,11],[515,228],[519,229],[516,230],[520,231],[521,232],[498,233],[522,234],[500,235],[480,236],[499,11],[507,237],[506,238],[505,239],[481,240],[504,241],[503,242],[496,243],[517,244],[502,245],[501,246],[497,247],[508,248],[511,249],[510,250],[509,251],[482,252],[523,253],[518,254],[469,11],[475,255],[472,256],[473,257],[474,258],[478,259],[477,260],[524,261],[470,11],[476,251],[471,262],[525,263],[513,264],[514,265],[512,266],[479,236],[526,267],[528,268],[527,11],[530,269],[532,270],[531,271],[529,11],[534,272],[540,273],[487,274],[539,274],[537,272],[538,275],[533,276],[536,277],[535,276],[494,278],[541,279],[495,280],[542,281],[543,282],[544,11],[545,283],[490,281],[488,11],[491,284],[492,285],[489,286],[493,287],[547,288],[546,11],[484,289],[483,11],[486,290],[485,281],[550,291],[551,291],[555,292],[553,293],[552,291],[548,11],[549,294],[554,295],[557,296],[556,11],[558,11],[559,297],[560,11],[561,298],[562,299],[563,256],[565,300],[566,8],[1016,301],[1014,302],[1015,303],[911,304],[910,305],[987,306],[986,307],[1096,308],[981,309],[980,310],[1003,311],[1098,312],[1002,313],[719,314],[1099,312],[718,315],[1100,316],[951,316],[950,317],[971,318],[970,319],[985,320],[984,321],[1101,322],[1102,323],[961,324],[960,325],[957,326],[956,327],[959,328],[958,317],[993,329],[992,317],[945,330],[1103,312],[944,307],[943,331],[942,307],[989,332],[988,317],[1056,333],[1055,317],[947,334],[946,317],[1066,335],[1065,317],[1104,336],[949,337],[948,338],[1105,11],[1106,339],[1069,340],[1107,299],[1068,310],[953,341],[1108,312],[952,310],[920,342],[919,321],[924,343],[923,344],[914,345],[913,346],[916,347],[915,348],[926,349],[925,350],[928,351],[927,350],[922,352],[921,350],[930,353],[929,354],[941,355],[932,356],[931,321],[918,357],[917,348],[934,358],[933,359],[912,11],[938,360],[937,321],[936,361],[935,362],[940,363],[939,362],[965,364],[964,365],[991,366],[1109,367],[990,368],[983,369],[982,310],[1001,370],[1000,371],[1054,372],[1053,319],[1059,373],[1058,374],[1057,310],[967,375],[966,376],[997,377],[996,310],[973,378],[972,319],[1062,379],[1061,380],[1060,310],[955,381],[954,382],[995,383],[994,317],[1067,384],[1111,385],[1064,386],[1063,317],[969,387],[1112,312],[968,317],[1005,388],[1113,312],[1004,317],[999,389],[998,390],[1007,391],[1006,392],[977,393],[976,317],[975,394],[974,395],[979,396],[978,317],[963,397],[962,398],[1079,399],[1078,400],[1077,401],[1076,313],[1075,402],[1074,313],[1073,403],[1072,313],[1085,404],[1084,405],[1087,406],[1081,407],[1080,313],[1083,408],[1082,313],[1086,299],[1071,409],[1070,313],[715,410],[716,411],[714,1],[1095,412],[1049,413],[1048,414],[1114,11],[1115,11],[1119,415],[1118,416],[1117,417],[1116,418],[1120,419],[721,420],[720,11],[717,421],[1009,239],[1010,422],[1028,423],[1027,424],[1045,425],[1047,426],[1046,427],[1044,428],[1121,429],[1019,430],[1023,431],[1024,11],[1026,432],[1025,433],[1022,433],[1020,433],[1021,433],[1018,434],[1012,435],[1013,436],[1038,437],[1040,437],[1039,437],[1036,437],[1042,438],[1041,437],[1017,439],[1037,437],[1029,440],[1043,441],[1034,442],[1031,437],[1033,437],[1032,437],[1035,443],[1030,437],[1011,11],[1122,444],[1097,11],[1051,445],[1052,446],[1050,447],[1089,448],[1123,449],[1124,302],[1092,448],[1091,450],[1090,448],[1094,451],[1093,448],[1088,429],[1128,11],[1127,11],[1129,11],[1130,452],[1167,453],[1169,454],[1170,455],[1168,456],[1214,457],[1172,458],[1173,459],[1171,460],[1215,461],[1175,462],[1176,463],[1174,460],[1178,464],[1180,465],[1181,466],[1179,467],[1185,468],[1187,469],[1188,470],[1186,471],[1216,472],[1190,473],[1191,474],[1189,475],[1213,476],[1217,299],[1193,477],[1194,478],[1218,479],[1192,480],[1196,481],[1197,482],[1219,483],[1195,460],[1200,484],[1201,485],[1198,486],[1199,487],[1204,488],[1205,489],[1202,483],[1203,490],[1207,491],[1208,492],[1220,457],[1206,460],[1211,493],[1212,494],[1209,495],[1210,480],[1163,496],[1142,11],[1143,497],[1144,11],[1146,498],[1145,11],[1147,499],[1161,11],[1162,500],[1160,11],[1221,501],[1140,502],[1148,11],[1149,503],[1164,504],[1158,505],[1159,506],[1136,11],[1177,507],[1153,508],[1155,509],[1154,510],[1151,511],[1152,512],[1150,11],[1182,513],[1222,514],[1165,515],[1166,11],[1183,516],[1184,517],[1135,518],[1134,519],[1131,308],[1133,520],[1132,521],[1126,522],[1125,11],[1137,523],[1138,11],[1139,11],[1156,524],[1157,525],[1141,526],[729,527],[731,528],[732,529],[730,530],[853,531],[854,532],[852,533],[1223,11],[1224,534],[723,535],[724,536],[722,530],[1225,537],[726,538],[727,539],[725,530],[712,540],[713,541],[711,542],[1233,543],[872,544],[873,545],[871,546],[1234,547],[734,548],[735,549],[733,530],[1235,550],[737,551],[738,552],[736,530],[895,553],[896,554],[894,555],[1237,556],[847,11],[849,557],[850,558],[848,530],[1236,11],[842,559],[843,560],[841,561],[1239,562],[880,563],[881,564],[879,565],[1240,566],[883,567],[884,568],[882,569],[1238,570],[904,571],[905,572],[903,573],[1241,566],[907,574],[908,575],[906,576],[1242,577],[855,578],[856,579],[851,580],[682,581],[668,582],[676,11],[667,530],[677,11],[679,583],[678,584],[680,530],[683,530],[696,585],[697,11],[699,586],[700,530],[858,587],[859,588],[857,589],[839,590],[840,591],[838,592],[1243,593],[786,594],[787,595],[785,530],[637,11],[564,502],[861,596],[1245,597],[1246,598],[862,599],[860,530],[800,600],[798,601],[801,602],[799,603],[864,604],[1244,593],[865,605],[863,530],[909,606],[740,607],[741,608],[1247,534],[739,530],[828,609],[827,530],[1249,610],[1250,611],[1251,612],[1252,613],[829,614],[1255,615],[1256,616],[830,614],[1257,617],[691,618],[695,619],[694,620],[690,621],[689,622],[693,623],[692,11],[1259,624],[1260,625],[888,614],[1258,626],[1248,299],[1261,627],[890,628],[1262,629],[708,299],[702,530],[1263,630],[703,631],[887,614],[1264,632],[889,11],[1265,633],[886,614],[1266,634],[1268,635],[1267,530],[832,636],[833,637],[1269,638],[831,639],[1270,640],[1271,641],[1254,642],[837,643],[1253,644],[845,645],[846,646],[1272,647],[844,561],[743,648],[744,649],[1273,534],[742,530],[780,650],[781,651],[1275,652],[779,653],[749,654],[750,655],[747,656],[748,657],[809,658],[810,659],[808,660],[806,661],[807,662],[834,299],[836,663],[1276,664],[835,665],[752,666],[753,667],[1277,534],[751,530],[755,668],[756,669],[1278,670],[754,530],[875,671],[876,672],[1279,673],[874,674],[759,675],[760,676],[757,677],[758,678],[812,679],[813,680],[1280,681],[811,530],[892,682],[893,683],[885,684],[891,685],[762,686],[763,687],[1281,534],[761,530],[814,299],[1282,530],[816,688],[1283,689],[815,530],[768,384],[769,690],[1110,691],[767,530],[796,692],[797,693],[794,694],[795,695],[790,696],[791,697],[788,638],[789,698],[765,699],[766,700],[1284,701],[764,530],[868,702],[866,546],[870,703],[709,530],[1008,704],[639,11],[867,702],[1274,705],[746,706],[745,707],[710,708],[869,702],[771,709],[772,710],[1285,711],[770,530],[783,712],[784,713],[1286,714],[782,530],[898,715],[899,716],[1288,717],[897,565],[901,718],[902,719],[1289,720],[900,721],[804,722],[805,723],[802,601],[803,724],[777,725],[778,726],[1291,727],[776,530],[774,728],[775,729],[1290,730],[773,530],[818,731],[819,732],[1292,733],[817,530],[824,734],[826,735],[823,736],[825,737],[1293,299],[793,738],[1294,739],[792,707],[665,740],[675,524],[728,11],[704,741],[705,741],[653,11],[638,742],[706,11],[669,11],[657,11],[658,743],[655,11],[656,744],[1295,745],[1226,583],[1231,322],[1232,746],[1227,747],[1229,748],[1230,749],[877,11],[1228,750],[1287,751],[878,752],[652,753],[684,299],[660,11],[651,11],[643,754],[662,11],[664,299],[666,755],[663,756],[1297,754],[646,757],[645,11],[707,758],[659,519],[649,759],[650,760],[701,761],[647,11],[648,762],[640,763],[661,764],[670,765],[671,766],[1300,767],[1301,767],[642,768],[1302,769],[1303,767],[1298,11],[1299,770],[1304,771],[672,772],[644,773],[673,11],[1296,774],[821,775],[822,776],[820,614],[1305,777],[467,778]],"semanticDiagnosticsPerFile":[[1059,[{"start":9,"length":7,"messageText":"Module '\"./pin-input.svelte\"' has no exported member 'default'.","category":1,"code":2305}]],[1062,[{"start":9,"length":7,"messageText":"Module '\"./rating-group.svelte\"' has no exported member 'default'.","category":1,"code":2305}]],[1217,[{"start":188,"length":11,"messageText":"Module '\"*.svelte\"' has no exported member 'PortalProps'. Did you mean to use 'import PortalProps from \"*.svelte\"' instead?","category":1,"code":2614},{"start":201,"length":12,"messageText":"Module '\"*.svelte\"' has no exported member 'PortalTarget'. Did you mean to use 'import PortalTarget from \"*.svelte\"' instead?","category":1,"code":2614}]]],"affectedFilesPendingEmit":[350,515,519,516,520,521,498,522,500,480,499,507,506,505,481,504,503,496,517,502,501,497,508,511,510,509,482,523,518,469,475,472,473,474,478,477,524,470,476,471,525,513,514,512,479,526,528,527,530,532,531,529,534,540,487,539,537,538,533,536,535,494,541,495,542,543,544,545,490,488,491,492,489,493,547,546,484,483,486,485,550,551,555,553,552,548,549,554,557,556,558,559,560,561,562,563,565,566,1016,1014,1015,911,910,987,986,1096,981,980,1003,1098,1002,719,1099,718,1100,951,950,971,970,985,984,1101,1102,961,960,957,956,959,958,993,992,945,1103,944,943,942,989,988,1056,1055,947,946,1066,1065,1104,949,948,1105,1106,1069,1107,1068,953,1108,952,920,919,924,923,914,913,916,915,926,925,928,927,922,921,930,929,941,932,931,918,917,934,933,912,938,937,936,935,940,939,965,964,991,1109,990,983,982,1001,1000,1054,1053,1059,1058,1057,967,966,997,996,973,972,1062,1061,1060,955,954,995,994,1067,1111,1064,1063,969,1112,968,1005,1113,1004,999,998,1007,1006,977,976,975,974,979,978,963,962,1079,1078,1077,1076,1075,1074,1073,1072,1085,1084,1087,1081,1080,1083,1082,1086,1071,1070,715,716,714,1095,1049,1048,1114,1115,1119,1118,1117,1116,1120,721,720,717,1009,1010,1028,1027,1045,1047,1046,1044,1121,1019,1023,1024,1026,1025,1022,1020,1021,1018,1012,1013,1038,1040,1039,1036,1042,1041,1017,1037,1029,1043,1034,1031,1033,1032,1035,1030,1011,1122,1097,1051,1052,1050,1089,1123,1124,1092,1091,1090,1094,1093,1088,1128,1127,1129,1130,1167,1169,1170,1168,1214,1172,1173,1171,1215,1175,1176,1174,1178,1180,1181,1179,1185,1187,1188,1186,1216,1190,1191,1189,1213,1217,1193,1194,1218,1192,1196,1197,1219,1195,1200,1201,1198,1199,1204,1205,1202,1203,1207,1208,1220,1206,1211,1212,1209,1210,1163,1142,1143,1144,1146,1145,1147,1161,1162,1160,1221,1140,1148,1149,1164,1158,1159,1136,1177,1153,1155,1154,1151,1152,1150,1182,1222,1165,1166,1183,1184,1135,1134,1131,1133,1132,1126,1125,1137,1138,1139,1156,1157,1141,729,731,732,730,853,854,852,1224,723,724,722,1225,726,727,725,712,713,711,1233,872,873,871,1234,734,735,733,1235,737,738,736,895,896,894,1237,847,849,850,848,1236,842,843,841,1239,880,881,879,1240,883,884,882,1238,904,905,903,1241,907,908,906,1242,855,856,851,682,668,676,667,677,679,678,680,683,696,697,699,700,858,859,857,839,840,838,1243,786,787,785,637,564,861,1245,1246,862,860,800,798,801,799,864,1244,865,863,909,740,741,1247,739,828,827,1249,1250,1251,1252,829,1255,1256,830,1257,691,695,694,690,689,693,692,1259,1260,888,1258,1248,1261,890,1262,708,702,1263,703,887,1264,889,1265,886,1266,1268,1267,832,833,1269,831,1270,1271,1254,837,1253,845,846,1272,844,743,744,1273,742,780,781,1275,779,749,750,747,748,809,810,808,806,807,834,836,1276,835,752,753,1277,751,755,756,1278,754,875,876,1279,874,759,760,757,758,812,813,1280,811,892,893,885,891,762,763,1281,761,814,1282,816,1283,815,768,769,1110,767,796,797,794,795,790,791,788,789,765,766,1284,764,868,866,870,709,1008,639,867,1274,746,745,710,869,771,772,1285,770,783,784,1286,782,898,899,1288,897,901,902,1289,900,804,805,802,803,777,778,1291,776,774,775,1290,773,818,819,1292,817,824,826,823,825,1293,793,1294,792,665,675,728,704,705,653,638,706,669,657,658,655,656,1226,1231,1232,1227,1229,1230,877,1228,1287,878,652,684,660,651,643,662,664,666,663,1297,646,645,707,659,649,650,701,647,648,640,661,670,671,1300,1301,642,1302,1303,1298,1299,1304,672,644,673,1296,821,822,820,1305,467],"version":"5.9.3"} \ No newline at end of file +{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/typescript/lib/lib.es2024.d.ts","./node_modules/typescript/lib/lib.esnext.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2024.collection.d.ts","./node_modules/typescript/lib/lib.es2024.object.d.ts","./node_modules/typescript/lib/lib.es2024.promise.d.ts","./node_modules/typescript/lib/lib.es2024.regexp.d.ts","./node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2024.string.d.ts","./node_modules/typescript/lib/lib.esnext.array.d.ts","./node_modules/typescript/lib/lib.esnext.collection.d.ts","./node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.promise.d.ts","./node_modules/typescript/lib/lib.esnext.decorators.d.ts","./node_modules/typescript/lib/lib.esnext.iterator.d.ts","./node_modules/typescript/lib/lib.esnext.float16.d.ts","./node_modules/typescript/lib/lib.esnext.error.d.ts","./node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/typescript/lib/typescript.d.ts","./node_modules/@typescript-eslint/types/dist/generated/ast-spec.d.ts","./node_modules/@typescript-eslint/types/dist/lib.d.ts","./node_modules/@typescript-eslint/types/dist/parser-options.d.ts","./node_modules/@typescript-eslint/types/dist/ts-estree.d.ts","./node_modules/@typescript-eslint/types/dist/index.d.ts","./node_modules/esrap/types/index.d.ts","./node_modules/magic-string/dist/magic-string.es.d.mts","./node_modules/@types/estree/index.d.ts","./node_modules/locate-character/types/index.d.ts","./node_modules/svelte/types/index.d.ts","./node_modules/vite/types/hmrpayload.d.ts","./node_modules/vite/types/customevent.d.ts","./node_modules/vite/types/hot.d.ts","./node_modules/vite/types/importglob.d.ts","./node_modules/vite/types/importmeta.d.ts","./node_modules/vite/client.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/blob.d.ts","./node_modules/@types/node/web-globals/console.d.ts","./node_modules/@types/node/web-globals/crypto.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/encoding.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/undici-types/utility.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client-stats.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/round-robin-pool.d.ts","./node_modules/undici-types/h2c-client.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-call-history.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/snapshot-agent.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/cache-interceptor.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/web-globals/importmeta.d.ts","./node_modules/@types/node/web-globals/messaging.d.ts","./node_modules/@types/node/web-globals/navigator.d.ts","./node_modules/@types/node/web-globals/performance.d.ts","./node_modules/@types/node/web-globals/storage.d.ts","./node_modules/@types/node/web-globals/streams.d.ts","./node_modules/@types/node/web-globals/timers.d.ts","./node_modules/@types/node/web-globals/url.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/inspector/promises.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/path/posix.d.ts","./node_modules/@types/node/path/win32.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/quic.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/test/reporters.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/util/types.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/vite/dist/node/chunks/modulerunnertransport.d.ts","./node_modules/rollup/dist/rollup.d.ts","./node_modules/rollup/dist/parseast.d.ts","./node_modules/vite/dist/node/module-runner.d.ts","./node_modules/esbuild/lib/main.d.ts","./node_modules/vite/types/internal/terseroptions.d.ts","./node_modules/source-map-js/source-map.d.ts","./node_modules/postcss/lib/previous-map.d.ts","./node_modules/postcss/lib/input.d.ts","./node_modules/postcss/lib/css-syntax-error.d.ts","./node_modules/postcss/lib/declaration.d.ts","./node_modules/postcss/lib/root.d.ts","./node_modules/postcss/lib/warning.d.ts","./node_modules/postcss/lib/lazy-result.d.ts","./node_modules/postcss/lib/no-work-result.d.ts","./node_modules/postcss/lib/processor.d.ts","./node_modules/postcss/lib/result.d.ts","./node_modules/postcss/lib/document.d.ts","./node_modules/postcss/lib/rule.d.ts","./node_modules/postcss/lib/node.d.ts","./node_modules/postcss/lib/comment.d.ts","./node_modules/postcss/lib/container.d.ts","./node_modules/postcss/lib/at-rule.d.ts","./node_modules/postcss/lib/list.d.ts","./node_modules/postcss/lib/postcss.d.ts","./node_modules/postcss/lib/postcss.d.mts","./node_modules/vite/types/internal/csspreprocessoroptions.d.ts","./node_modules/lightningcss/node/ast.d.ts","./node_modules/lightningcss/node/targets.d.ts","./node_modules/lightningcss/node/index.d.ts","./node_modules/vite/types/internal/lightningcssoptions.d.ts","./node_modules/vite/types/metadata.d.ts","./node_modules/vite/dist/node/index.d.ts","./node_modules/@sveltejs/vite-plugin-svelte-inspector/types/index.d.ts","./node_modules/@sveltejs/vite-plugin-svelte/types/index.d.ts","./node_modules/@standard-schema/spec/dist/index.d.ts","./node_modules/@types/cookie/index.d.ts","./node_modules/@sveltejs/kit/types/index.d.ts","./.svelte-kit/ambient.d.ts","./.svelte-kit/non-ambient.d.ts","./.svelte-kit/types/src/routes/$types.d.ts","./.svelte-kit/types/src/routes/test/$types.d.ts","./.svelte-kit/types/src/routes/test/accordion/$types.d.ts","./.svelte-kit/types/src/routes/test/air/$types.d.ts","./.svelte-kit/types/src/routes/test/air/accordion/$types.d.ts","./.svelte-kit/types/src/routes/test/air/alert-dialog/$types.d.ts","./.svelte-kit/types/src/routes/test/air/animations/$types.d.ts","./.svelte-kit/types/src/routes/test/air/avatar/$types.d.ts","./.svelte-kit/types/src/routes/test/air/badge/$types.d.ts","./.svelte-kit/types/src/routes/test/air/button/$types.d.ts","./.svelte-kit/types/src/routes/test/air/calendar/$types.d.ts","./.svelte-kit/types/src/routes/test/air/checkbox/$types.d.ts","./.svelte-kit/types/src/routes/test/air/collapsible/$types.d.ts","./.svelte-kit/types/src/routes/test/air/color-picker/$types.d.ts","./.svelte-kit/types/src/routes/test/air/combobox/$types.d.ts","./.svelte-kit/types/src/routes/test/air/command/$types.d.ts","./.svelte-kit/types/src/routes/test/air/context-menu/$types.d.ts","./.svelte-kit/types/src/routes/test/air/dialog/$types.d.ts","./.svelte-kit/types/src/routes/test/air/drawer/$types.d.ts","./.svelte-kit/types/src/routes/test/air/dropdown-menu/$types.d.ts","./.svelte-kit/types/src/routes/test/air/editable/$types.d.ts","./.svelte-kit/types/src/routes/test/air/field/$types.d.ts","./.svelte-kit/types/src/routes/test/air/file-upload/$types.d.ts","./.svelte-kit/types/src/routes/test/air/form/$types.d.ts","./.svelte-kit/types/src/routes/test/air/icon/$types.d.ts","./.svelte-kit/types/src/routes/test/air/icons/$types.d.ts","./.svelte-kit/types/src/routes/test/air/input/$types.d.ts","./.svelte-kit/types/src/routes/test/air/layout/aspect-ratio/$types.d.ts","./.svelte-kit/types/src/routes/test/air/layout/auto-grid/$types.d.ts","./.svelte-kit/types/src/routes/test/air/layout/box/$types.d.ts","./.svelte-kit/types/src/routes/test/air/layout/container/$types.d.ts","./.svelte-kit/types/src/routes/test/air/layout/flex/$types.d.ts","./.svelte-kit/types/src/routes/test/air/layout/float/$types.d.ts","./.svelte-kit/types/src/routes/test/air/layout/grid/$types.d.ts","./.svelte-kit/types/src/routes/test/air/layout/group/$types.d.ts","./.svelte-kit/types/src/routes/test/air/layout/scroll-area/$types.d.ts","./.svelte-kit/types/src/routes/test/air/layout/section/$types.d.ts","./.svelte-kit/types/src/routes/test/air/layout/separator/$types.d.ts","./.svelte-kit/types/src/routes/test/air/layout/splitter/$types.d.ts","./.svelte-kit/types/src/routes/test/air/layout/stack/$types.d.ts","./.svelte-kit/types/src/routes/test/air/layout/wrap/$types.d.ts","./.svelte-kit/types/src/routes/test/air/ling/$types.d.ts","./.svelte-kit/types/src/routes/test/air/link-preview/$types.d.ts","./.svelte-kit/types/src/routes/test/air/menubar/$types.d.ts","./.svelte-kit/types/src/routes/test/air/meter/$types.d.ts","./.svelte-kit/types/src/routes/test/air/number-field/$types.d.ts","./.svelte-kit/types/src/routes/test/air/pagination/$types.d.ts","./.svelte-kit/types/src/routes/test/air/pin-input/$types.d.ts","./.svelte-kit/types/src/routes/test/air/popover/$types.d.ts","./.svelte-kit/types/src/routes/test/air/progress/$types.d.ts","./.svelte-kit/types/src/routes/test/air/radio-group/$types.d.ts","./.svelte-kit/types/src/routes/test/air/rating-group/$types.d.ts","./.svelte-kit/types/src/routes/test/air/select/$types.d.ts","./.svelte-kit/types/src/routes/test/air/slider/$types.d.ts","./.svelte-kit/types/src/routes/test/air/sounds/$types.d.ts","./.svelte-kit/types/src/routes/test/air/spinner/$types.d.ts","./.svelte-kit/types/src/routes/test/air/stepper/$types.d.ts","./.svelte-kit/types/src/routes/test/air/style-editor/$types.d.ts","./.svelte-kit/types/src/routes/test/air/surfaces/$types.d.ts","./.svelte-kit/types/src/routes/test/air/switch/$types.d.ts","./.svelte-kit/types/src/routes/test/air/tabs/$types.d.ts","./.svelte-kit/types/src/routes/test/air/tags-input/$types.d.ts","./.svelte-kit/types/src/routes/test/air/toast/$types.d.ts","./.svelte-kit/types/src/routes/test/air/toggle/$types.d.ts","./.svelte-kit/types/src/routes/test/air/toggle-group/$types.d.ts","./.svelte-kit/types/src/routes/test/air/toolbar/$types.d.ts","./.svelte-kit/types/src/routes/test/air/tooltip/$types.d.ts","./.svelte-kit/types/src/routes/test/air/typography/$types.d.ts","./.svelte-kit/types/src/routes/test/alert-dialog/$types.d.ts","./.svelte-kit/types/src/routes/test/aspect-ratio/$types.d.ts","./.svelte-kit/types/src/routes/test/avatar/$types.d.ts","./.svelte-kit/types/src/routes/test/button/$types.d.ts","./.svelte-kit/types/src/routes/test/calendar/$types.d.ts","./.svelte-kit/types/src/routes/test/checkbox/$types.d.ts","./.svelte-kit/types/src/routes/test/collapsible/$types.d.ts","./.svelte-kit/types/src/routes/test/color-picker/$types.d.ts","./.svelte-kit/types/src/routes/test/combobox/$types.d.ts","./.svelte-kit/types/src/routes/test/command/$types.d.ts","./.svelte-kit/types/src/routes/test/context-menu/$types.d.ts","./.svelte-kit/types/src/routes/test/date-picker/$types.d.ts","./.svelte-kit/types/src/routes/test/date-range-field/$types.d.ts","./.svelte-kit/types/src/routes/test/date-range-picker/$types.d.ts","./.svelte-kit/types/src/routes/test/dialog/$types.d.ts","./.svelte-kit/types/src/routes/test/drawer/$types.d.ts","./.svelte-kit/types/src/routes/test/dropdown-menu/$types.d.ts","./.svelte-kit/types/src/routes/test/editable/$types.d.ts","./.svelte-kit/types/src/routes/test/field/$types.d.ts","./.svelte-kit/types/src/routes/test/file-upload/$types.d.ts","./.svelte-kit/types/src/routes/test/form/$types.d.ts","./.svelte-kit/types/src/routes/test/icons/proxy+page.ts","./.svelte-kit/types/src/routes/test/icons/$types.d.ts","./.svelte-kit/types/src/routes/test/label/$types.d.ts","./.svelte-kit/types/src/routes/test/link-preview/$types.d.ts","./.svelte-kit/types/src/routes/test/menubar/$types.d.ts","./.svelte-kit/types/src/routes/test/meter/$types.d.ts","./.svelte-kit/types/src/routes/test/modal/$types.d.ts","./.svelte-kit/types/src/routes/test/number-field/$types.d.ts","./.svelte-kit/types/src/routes/test/pagination/$types.d.ts","./.svelte-kit/types/src/routes/test/pin-input/$types.d.ts","./.svelte-kit/types/src/routes/test/popover/$types.d.ts","./.svelte-kit/types/src/routes/test/progress/$types.d.ts","./.svelte-kit/types/src/routes/test/radio-group/$types.d.ts","./.svelte-kit/types/src/routes/test/range-calendar/$types.d.ts","./.svelte-kit/types/src/routes/test/rating-group/$types.d.ts","./.svelte-kit/types/src/routes/test/scroll-area/$types.d.ts","./.svelte-kit/types/src/routes/test/select/$types.d.ts","./.svelte-kit/types/src/routes/test/separator/$types.d.ts","./.svelte-kit/types/src/routes/test/slider/$types.d.ts","./.svelte-kit/types/src/routes/test/soma/$types.d.ts","./.svelte-kit/types/src/routes/test/soma/accordion/$types.d.ts","./.svelte-kit/types/src/routes/test/soma/collapsible/$types.d.ts","./.svelte-kit/types/src/routes/test/soma/combobox/$types.d.ts","./.svelte-kit/types/src/routes/test/soma/dialog/$types.d.ts","./.svelte-kit/types/src/routes/test/soma/dropdown-menu/$types.d.ts","./.svelte-kit/types/src/routes/test/soma/forms/$types.d.ts","./.svelte-kit/types/src/routes/test/soma/popover/$types.d.ts","./.svelte-kit/types/src/routes/test/soma/select/$types.d.ts","./.svelte-kit/types/src/routes/test/soma/slider/$types.d.ts","./.svelte-kit/types/src/routes/test/soma/tooltip/$types.d.ts","./.svelte-kit/types/src/routes/test/splitter/$types.d.ts","./.svelte-kit/types/src/routes/test/stepper/$types.d.ts","./.svelte-kit/types/src/routes/test/switch/$types.d.ts","./.svelte-kit/types/src/routes/test/tabs/$types.d.ts","./.svelte-kit/types/src/routes/test/tags-input/$types.d.ts","./.svelte-kit/types/src/routes/test/terra/$types.d.ts","./.svelte-kit/types/src/routes/test/terra/ling/$types.d.ts","./.svelte-kit/types/src/routes/test/time-field/$types.d.ts","./.svelte-kit/types/src/routes/test/time-range-field/$types.d.ts","./.svelte-kit/types/src/routes/test/toast/$types.d.ts","./.svelte-kit/types/src/routes/test/toggle/$types.d.ts","./.svelte-kit/types/src/routes/test/toggle-group/$types.d.ts","./.svelte-kit/types/src/routes/test/toolbar/$types.d.ts","./.svelte-kit/types/src/routes/test/tooltip/$types.d.ts","./.svelte-kit/types/src/routes/test/virtual-list/$types.d.ts","./node_modules/@tailwindcss/vite/dist/index.d.mts","./node_modules/@vitest/pretty-format/dist/index.d.ts","./node_modules/@vitest/utils/dist/display.d.ts","./node_modules/@vitest/utils/dist/types.d.ts","./node_modules/@vitest/utils/dist/helpers.d.ts","./node_modules/@vitest/utils/dist/timers.d.ts","./node_modules/@vitest/utils/dist/index.d.ts","./node_modules/@vitest/utils/dist/types.d-bcelap-c.d.ts","./node_modules/@vitest/utils/dist/diff.d.ts","./node_modules/@vitest/runner/dist/tasks.d-di5lbrqa.d.ts","./node_modules/@vitest/runner/dist/index.d.ts","./node_modules/@vitest/spy/optional-types.d.ts","./node_modules/@vitest/spy/dist/index.d.ts","./node_modules/tinyrainbow/dist/index.d.ts","./node_modules/@types/deep-eql/index.d.ts","./node_modules/assertion-error/index.d.ts","./node_modules/@types/chai/index.d.ts","./node_modules/@vitest/expect/dist/index.d.ts","./node_modules/@vitest/snapshot/dist/environment.d-dojxxzv9.d.ts","./node_modules/@vitest/snapshot/dist/rawsnapshot.d-u2kjuxdr.d.ts","./node_modules/@vitest/snapshot/dist/index.d.ts","./node_modules/vitest/dist/chunks/traces.d.402v_yfi.d.ts","./node_modules/vitest/dist/chunks/rpc.d.bfmwpdph.d.ts","./node_modules/vitest/dist/chunks/config.d.ejlve3es.d.ts","./node_modules/vitest/dist/chunks/environment.d.crsxczp1.d.ts","./node_modules/vitest/dist/chunks/worker.d.b84svry0.d.ts","./node_modules/vitest/dist/chunks/browser.d.x3sxoocv.d.ts","./node_modules/vitest/optional-types.d.ts","./node_modules/@vitest/runner/dist/utils.d.ts","./node_modules/tinybench/dist/index.d.ts","./node_modules/vitest/dist/chunks/benchmark.d.daahlpsq.d.ts","./node_modules/@vitest/mocker/dist/types.d-bji5eawu.d.ts","./node_modules/@vitest/mocker/dist/index.d-b41z0auw.d.ts","./node_modules/@vitest/mocker/dist/index.d.ts","./node_modules/@vitest/utils/dist/source-map.d.ts","./node_modules/vitest/dist/chunks/global.d.x-ilcfae.d.ts","./node_modules/vitest/optional-runtime-types.d.ts","./node_modules/vitest/dist/chunks/suite.d.udjtyagw.d.ts","./node_modules/vitest/dist/chunks/evaluatedmodules.d.bxj5omdx.d.ts","./node_modules/vitest/dist/runners.d.ts","./node_modules/expect-type/dist/utils.d.ts","./node_modules/expect-type/dist/overloads.d.ts","./node_modules/expect-type/dist/branding.d.ts","./node_modules/expect-type/dist/messages.d.ts","./node_modules/expect-type/dist/index.d.ts","./node_modules/vitest/dist/index.d.ts","./node_modules/vitest/dist/chunks/coverage.d.bztk59wp.d.ts","./node_modules/@vitest/utils/dist/serialize.d.ts","./node_modules/@vitest/utils/dist/error.d.ts","./node_modules/vitest/dist/browser.d.ts","./node_modules/@vitest/browser/aria-role.d.ts","./node_modules/@vitest/browser/jest-dom.d.ts","./node_modules/@vitest/browser/matchers.d.ts","./node_modules/@vitest/browser/context.d.ts","./node_modules/@vitest/browser-playwright/context.d.ts","./node_modules/vitest/browser/context.d.ts","./node_modules/@vitest/snapshot/dist/manager.d.ts","./node_modules/vitest/dist/chunks/reporters.d.cz5e0gct.d.ts","./node_modules/vitest/dist/chunks/plugin.d.dx0ozo6e.d.ts","./node_modules/vitest/dist/config.d.ts","./node_modules/vitest/config.d.ts","./node_modules/vitest/dist/coverage.d.ts","./node_modules/obug/dist/core.d.ts","./node_modules/obug/dist/node.d.ts","./node_modules/vitest/dist/node.d.ts","./node_modules/@vitest/browser/dist/index.d.ts","./node_modules/playwright-core/types/protocol.d.ts","./node_modules/playwright-core/types/structs.d.ts","./node_modules/playwright-core/types/types.d.ts","./node_modules/playwright-core/index.d.ts","./node_modules/playwright/index.d.ts","./node_modules/@vitest/browser-playwright/dist/index.d.ts","./vite.config.ts","./src/app.d.ts","./src/lib/ling/lib/consts.ts","./src/lib/ling/lib/plural_rules.ts","./src/lib/ling/lib/types.ts","./src/lib/ling/lib/errors.ts","./src/lib/ling/lib/guards.ts","./src/lib/ling/lib/helpers.ts","./src/lib/ling/lib/engine.ts","./src/lib/ling/lib/translations.ts","./src/lib/ling/lib/instance.ts","./src/lib/ling/lib/index.ts","./src/lib/logr/lib/types.ts","./src/lib/glob/lib/comn_types.ts","./src/lib/glob/lib/curr_types.ts","./src/lib/glob/lib/unit_types.ts","./src/lib/util/numbers/utilities.ts","./src/lib/util/numbers/index.ts","./src/lib/util/objs/utilities.ts","./src/lib/util/objs/index.ts","./src/lib/util/dates/calendars/gregoriancalendar.ts","./src/lib/util/dates/internal/weekstartdata.ts","./src/lib/util/dates/operations/queries.ts","./src/lib/util/dates/internal/utils.ts","./src/lib/util/dates/operations/conversion.ts","./src/lib/util/dates/operations/manipulation.ts","./src/lib/util/dates/operations/string.ts","./src/lib/util/dates/core/calendardate.ts","./src/lib/util/dates/core/types.ts","./src/lib/glob/lib/dati_types.ts","./src/lib/glob/lib/numr_types.ts","./src/lib/actx/lib/types.ts","./src/lib/glob/lib/comn_utils.ts","./src/lib/glob/lib/comn_engine.ts","./src/lib/glob/lib/numr_engine.ts","./src/lib/glob/lib/numr_engine.svelte.ts","./src/lib/glob/lib/dati_engine.ts","./src/lib/glob/lib/dati_engine.svelte.ts","./src/lib/glob/lib/curr_langs.ts","./src/lib/glob/lib/curr_engine.ts","./src/lib/glob/lib/curr_engine.svelte.ts","./src/lib/glob/lib/unit_data.ts","./src/lib/glob/lib/unit_langs.ts","./src/lib/glob/lib/unit_engine.ts","./src/lib/glob/lib/unit_engine.svelte.ts","./src/lib/logr/lib/transports.ts","./src/lib/logr/lib/engine.ts","./src/lib/logr/lib/index.ts","./src/lib/actx/lib/engine.svelte.ts","./src/lib/actx/lib/index.ts","./src/lib/glob/lib/index.ts","./src/lib/index.ts","./src/lib/actx/lib/engine.ts","./src/lib/actx/lib/instance_actx.svelte.ts","./src/lib/actx/lib/instance_actx.ts","./src/lib/actx/test/actx.test.ts","./src/lib/glob/test/glob.test.ts","./src/lib/ling/lib/json.ts","./src/lib/ling/test/ling.test.ts","./src/lib/logr/test/logr.test.ts","./src/lib/util/arrays/utilities.ts","./src/lib/util/arrays/index.ts","./src/lib/util/colors/types.ts","./src/lib/util/colors/convert.ts","./src/lib/util/colors/parse.ts","./src/lib/util/colors/index.ts","./src/lib/util/dates/calendars/japanesecalendar.ts","./src/lib/util/dates/calendars/buddhistcalendar.ts","./src/lib/util/dates/calendars/taiwancalendar.ts","./src/lib/util/dates/calendars/persiancalendar.ts","./src/lib/util/dates/calendars/indiancalendar.ts","./src/lib/util/dates/calendars/islamiccalendar.ts","./src/lib/util/dates/calendars/hebrewcalendar.ts","./src/lib/util/dates/calendars/ethiopiccalendar.ts","./src/lib/util/dates/core/createcalendar.ts","./src/lib/util/dates/format/dateformatter.ts","./src/lib/util/dates/format/defaults.ts","./src/lib/util/dates/format/placeholders.ts","./src/lib/util/dates/index.ts","./src/lib/util/funcs/noop.ts","./src/lib/util/funcs/index.ts","./src/lib/util/reactive/symbols.ts","./src/lib/util/reactive/types.ts","./src/lib/util/reactive/derived.svelte.ts","./src/lib/util/reactive/guards.ts","./src/lib/util/reactive/state.svelte.ts","./src/lib/util/reactive/readonly.svelte.ts","./src/lib/util/reactive/utils.svelte.ts","./src/lib/util/reactive/index.ts","./src/lib/util/strings/utilities.ts","./src/lib/util/strings/index.ts","./src/lib/util/timers/debounce.ts","./src/lib/util/timers/index.ts","./src/lib/util/times/index.ts","./src/routes/+layout.ts","./src/routes/test/_components/index.ts","./src/routes/test/air/demo-context.ts","./src/uix/terra/external/dates/index.ts","./src/routes/test/air/demo-locale.ts","./src/routes/test/icons/+page.ts","./node_modules/runed/dist/internal/configurable-globals.d.ts","./node_modules/runed/dist/utilities/active-element/active-element.svelte.d.ts","./node_modules/runed/dist/utilities/active-element/index.d.ts","./node_modules/runed/dist/internal/types.d.ts","./node_modules/runed/dist/utilities/animation-frames/animation-frames.svelte.d.ts","./node_modules/runed/dist/utilities/animation-frames/index.d.ts","./node_modules/runed/dist/utilities/context/context.d.ts","./node_modules/runed/dist/utilities/context/index.d.ts","./node_modules/runed/dist/utilities/debounced/debounced.svelte.d.ts","./node_modules/runed/dist/utilities/debounced/index.d.ts","./node_modules/runed/dist/utilities/element-rect/element-rect.svelte.d.ts","./node_modules/runed/dist/utilities/element-rect/index.d.ts","./node_modules/runed/dist/utilities/element-size/element-size.svelte.d.ts","./node_modules/runed/dist/utilities/element-size/index.d.ts","./node_modules/runed/dist/utilities/extract/extract.svelte.d.ts","./node_modules/runed/dist/utilities/extract/index.d.ts","./node_modules/runed/dist/utilities/finite-state-machine/finite-state-machine.svelte.d.ts","./node_modules/runed/dist/utilities/finite-state-machine/index.d.ts","./node_modules/runed/dist/utilities/is-focus-within/is-focus-within.svelte.d.ts","./node_modules/runed/dist/utilities/is-focus-within/index.d.ts","./node_modules/runed/dist/utilities/is-idle/is-idle.svelte.d.ts","./node_modules/runed/dist/utilities/is-idle/index.d.ts","./node_modules/runed/dist/utilities/use-intersection-observer/use-intersection-observer.svelte.d.ts","./node_modules/runed/dist/utilities/is-in-viewport/is-in-viewport.svelte.d.ts","./node_modules/runed/dist/utilities/is-in-viewport/index.d.ts","./node_modules/runed/dist/utilities/is-mounted/is-mounted.svelte.d.ts","./node_modules/runed/dist/utilities/is-mounted/index.d.ts","./node_modules/runed/dist/utilities/is-document-visible/is-document-visible.svelte.d.ts","./node_modules/runed/dist/utilities/is-document-visible/index.d.ts","./node_modules/runed/dist/utilities/on-click-outside/on-click-outside.svelte.d.ts","./node_modules/runed/dist/utilities/on-click-outside/index.d.ts","./node_modules/runed/dist/utilities/persisted-state/persisted-state.svelte.d.ts","./node_modules/runed/dist/utilities/persisted-state/index.d.ts","./node_modules/runed/dist/utilities/pressed-keys/pressed-keys.svelte.d.ts","./node_modules/runed/dist/utilities/pressed-keys/index.d.ts","./node_modules/runed/dist/utilities/previous/previous.svelte.d.ts","./node_modules/runed/dist/utilities/previous/index.d.ts","./node_modules/runed/dist/utilities/resource/resource.svelte.d.ts","./node_modules/runed/dist/utilities/resource/index.d.ts","./node_modules/runed/dist/utilities/scroll-state/scroll-state.svelte.d.ts","./node_modules/runed/dist/utilities/scroll-state/index.d.ts","./node_modules/runed/dist/utilities/state-history/state-history.svelte.d.ts","./node_modules/runed/dist/utilities/state-history/index.d.ts","./node_modules/runed/dist/utilities/textarea-autosize/textarea-autosize.svelte.d.ts","./node_modules/runed/dist/utilities/textarea-autosize/index.d.ts","./node_modules/runed/dist/utilities/throttled/throttled.svelte.d.ts","./node_modules/runed/dist/utilities/throttled/index.d.ts","./node_modules/runed/dist/utilities/use-debounce/use-debounce.svelte.d.ts","./node_modules/runed/dist/utilities/use-debounce/index.d.ts","./node_modules/runed/dist/utilities/use-event-listener/use-event-listener.svelte.d.ts","./node_modules/runed/dist/utilities/use-event-listener/index.d.ts","./node_modules/runed/dist/utilities/use-geolocation/use-geolocation.svelte.d.ts","./node_modules/runed/dist/utilities/use-geolocation/index.d.ts","./node_modules/runed/dist/utilities/use-intersection-observer/index.d.ts","./node_modules/runed/dist/utilities/use-mutation-observer/use-mutation-observer.svelte.d.ts","./node_modules/runed/dist/utilities/use-mutation-observer/index.d.ts","./node_modules/runed/dist/utilities/use-resize-observer/use-resize-observer.svelte.d.ts","./node_modules/runed/dist/utilities/use-resize-observer/index.d.ts","./node_modules/runed/dist/utilities/use-interval/use-interval.svelte.d.ts","./node_modules/runed/dist/utilities/use-interval/index.d.ts","./node_modules/runed/dist/utilities/use-throttle/use-throttle.svelte.d.ts","./node_modules/runed/dist/utilities/use-throttle/index.d.ts","./node_modules/runed/dist/utilities/watch/watch.svelte.d.ts","./node_modules/runed/dist/utilities/watch/index.d.ts","./node_modules/runed/dist/utilities/bool-attr/bool-attr.d.ts","./node_modules/runed/dist/utilities/bool-attr/index.d.ts","./node_modules/runed/dist/utilities/on-cleanup/on-cleanup.svelte.d.ts","./node_modules/runed/dist/utilities/on-cleanup/index.d.ts","./node_modules/runed/dist/utilities/index.d.ts","./node_modules/runed/dist/index.d.ts","./src/uix/terra/errors.ts","./src/uix/terra/utils/context.ts","./src/uix/terra/system/logger.ts","./src/uix/terra/utils/logger.ts","./node_modules/csstype/index.d.ts","./src/uix/terra/utils/state/index.ts","./src/uix/terra/utils/framework/attach-ref.ts","./src/uix/terra/utils/types.ts","./src/uix/terra/utils/images/types.ts","./src/uix/terra/utils/images/index.ts","./src/uix/terra/utils/keyboard/kbd-constants.ts","./src/uix/terra/utils/keyboard/kbd.ts","./src/uix/terra/utils/keyboard/get-directional-keys.ts","./src/uix/terra/utils/keyboard/index.ts","./src/uix/terra/utils/events/events.ts","./src/uix/terra/utils/events/compose-handlers.ts","./src/uix/terra/utils/collections/execute-callbacks.ts","./node_modules/clsx/clsx.d.mts","./src/uix/terra/utils/css/parser.ts","./src/uix/terra/utils/css/transform.ts","./src/uix/terra/utils/css/escape.ts","./src/uix/terra/utils/css/index.ts","./src/uix/terra/utils/is.ts","./src/uix/terra/utils/events/event-list.ts","./src/uix/terra/utils/merge-props.ts","./src/uix/terra/utils/framework/on-destroy-effect.svelte.ts","./src/uix/terra/utils/framework/use-ref-by-id.svelte.ts","./src/uix/terra/utils/framework/on-mount-effect.svelte.ts","./src/uix/terra/utils/after.ts","./src/uix/terra/utils/framework/use-on-change.svelte.ts","./src/uix/terra/dom/core/dom.ts","./src/uix/terra/dom/core/dom-context.svelte.ts","./src/uix/terra/utils/create-id.ts","./src/uix/terra/utils/shared-state.svelte.ts","./src/uix/terra/utils/state-machine.ts","./src/uix/terra/utils/timeout-fn.ts","./src/uix/terra/utils/use-id.ts","./node_modules/svelte/elements.d.ts","./src/uix/terra/utils/attributes.ts","./src/uix/terra/dom/core/dom-internal.ts","./src/uix/terra/dom/core/elements.ts","./src/uix/terra/dom/core/is-browser.ts","./src/uix/terra/dom/core/focus.ts","./src/uix/terra/dom/core/locale.ts","./node_modules/esm-env/index.d.ts","./src/uix/terra/dom/core/body-scroll-lock.svelte.ts","./src/uix/terra/dom/core/svelte-resize-observer.svelte.ts","./src/uix/terra/utils/events/event-dispatcher.ts","./node_modules/@floating-ui/utils/dist/floating-ui.utils.d.mts","./node_modules/@floating-ui/core/dist/floating-ui.core.d.mts","./node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.d.mts","./node_modules/@floating-ui/dom/dist/floating-ui.dom.d.mts","./src/uix/terra/layers/floating/use-floating-layer.svelte.ts","./src/uix/terra/layers/floating/types.ts","./src/uix/terra/layers/floating/components/index.ts","./src/uix/terra/layers/floating/utils.ts","./src/uix/terra/layers/floating/use-floating.svelte.ts","./src/uix/terra/layers/floating/safe-polygon.ts","./src/uix/terra/layers/floating/index.ts","./src/uix/terra/dom/focus/roving-focus-group.ts","./src/uix/terra/dom/focus/should-enable-focus-trap.ts","./node_modules/tabbable/index.d.ts","./src/uix/terra/dom/focus/tabbable.ts","./src/uix/terra/dom/focus/use-arrow-navigation.ts","./src/uix/terra/utils/keyboard/is-using-keyboard.svelte.ts","./src/uix/terra/layers/presence/animations-complete.ts","./src/uix/terra/layers/presence/presence-manager.svelte.ts","./src/uix/terra/utils/collections/data-typeahead.svelte.ts","./src/uix/terra/utils/collections/dom-typeahead.svelte.ts","./src/uix/terra/utils/contracts.ts","./src/uix/terra/utils/index.ts","./src/uix/terra/layers/portal/types.ts","./src/uix/terra/system/formatter.svelte.ts","./src/uix/terra/system/types.ts","./src/uix/terra/button/types.ts","./src/uix/terra/button/exports.ts","./src/uix/terra/button/index.ts","./src/uix/air/dom/responsive.svelte.ts","./src/uix/air/dom/dom.svelte.ts","./src/uix/air/dom/index.ts","./src/uix/air/lib/types.ts","./src/uix/air/components/button/types.ts","./src/uix/air/components/button/index.ts","./src/uix/air/lib/style.ts","./src/uix/air/lib/index.ts","./src/uix/terra/aspect-ratio/types.ts","./src/uix/terra/aspect-ratio/exports.ts","./src/uix/terra/aspect-ratio/index.ts","./src/uix/terra/avatar/types.ts","./src/uix/terra/avatar/exports.ts","./src/uix/terra/avatar/index.ts","./src/uix/terra/utils/attrs.ts","./src/uix/terra/accordion/accordion.svelte.ts","./src/uix/terra/accordion/types.ts","./src/uix/terra/accordion/exports.ts","./src/uix/terra/accordion/index.ts","./src/uix/terra/checkbox/types.ts","./src/uix/terra/checkbox/exports.ts","./src/uix/terra/checkbox/index.ts","./src/uix/terra/collapsible/types.ts","./src/uix/terra/collapsible/exports.ts","./src/uix/terra/collapsible/index.ts","./src/uix/terra/label/types.ts","./src/uix/terra/label/exports.ts","./src/uix/terra/label/index.ts","./src/uix/terra/meter/types.ts","./src/uix/terra/meter/exports.ts","./src/uix/terra/meter/index.ts","./src/uix/terra/system/translator.svelte.ts","./src/uix/terra/system/terra-config.ts","./src/uix/terra/pagination/pagination.svelte.ts","./src/uix/terra/pagination/types.ts","./src/uix/terra/pagination/exports.ts","./src/uix/terra/pagination/index.ts","./src/uix/terra/progress/types.ts","./src/uix/terra/progress/exports.ts","./src/uix/terra/progress/index.ts","./src/uix/terra/radio-group/types.ts","./src/uix/terra/radio-group/exports.ts","./src/uix/terra/radio-group/index.ts","./src/uix/terra/rating-group/rating-group.svelte.ts","./src/uix/terra/rating-group/types.ts","./src/uix/terra/rating-group/exports.ts","./src/uix/terra/rating-group/index.ts","./src/uix/terra/separator/types.ts","./src/uix/terra/separator/exports.ts","./src/uix/terra/separator/index.ts","./src/uix/terra/switch/types.ts","./src/uix/terra/switch/exports.ts","./src/uix/terra/switch/index.ts","./src/uix/terra/spinner/types.ts","./src/uix/terra/spinner/exports.ts","./src/uix/terra/spinner/index.ts","./src/uix/terra/tabs/types.ts","./src/uix/terra/tabs/exports.ts","./src/uix/terra/tabs/index.ts","./src/uix/terra/toggle/types.ts","./src/uix/terra/toggle/exports.ts","./src/uix/terra/toggle/index.ts","./src/uix/terra/toggle-group/types.ts","./src/uix/terra/toggle-group/exports.ts","./src/uix/terra/toggle-group/index.ts","./src/uix/terra/number-field/types.ts","./src/uix/terra/number-field/exports.ts","./src/uix/terra/number-field/index.ts","./src/uix/terra/tags-input/types.ts","./src/uix/terra/tags-input/exports.ts","./src/uix/terra/tags-input/index.ts","./src/uix/terra/editable/types.ts","./src/uix/terra/editable/exports.ts","./src/uix/terra/editable/index.ts","./src/uix/terra/stepper/stepper.svelte.ts","./src/uix/terra/stepper/types.ts","./src/uix/terra/stepper/exports.ts","./src/uix/terra/stepper/index.ts","./src/uix/terra/trans/types.ts","./src/uix/terra/trans/index.ts","./src/uix/terra/splitter/splitter.svelte.ts","./src/uix/terra/splitter/types.ts","./src/uix/terra/splitter/exports.ts","./src/uix/terra/splitter/index.ts","./src/uix/terra/file-upload/file-upload.svelte.ts","./src/uix/terra/file-upload/types.ts","./src/uix/terra/file-upload/exports.ts","./src/uix/terra/file-upload/index.ts","./src/uix/terra/toast/toast.svelte.ts","./src/uix/terra/toast/types.ts","./src/uix/terra/toast/exports.ts","./src/uix/terra/toast/index.ts","./src/uix/terra/pin-input/types.ts","./src/uix/terra/pin-input/usepasswordmanager.svelte.ts","./src/uix/terra/pin-input/pin-input.svelte.ts","./src/uix/terra/pin-input/exports.ts","./src/uix/terra/pin-input/index.ts","./src/uix/terra/scroll-area/types.ts","./src/uix/terra/scroll-area/exports.ts","./src/uix/terra/scroll-area/index.ts","./src/uix/terra/slider/exports.ts","./src/uix/terra/slider/types.ts","./src/uix/terra/slider/index.ts","./src/uix/terra/toolbar/types.ts","./src/uix/terra/toolbar/exports.ts","./src/uix/terra/toolbar/index.ts","./src/uix/terra/virtual-list/types.ts","./src/uix/terra/virtual-list/exports.ts","./src/uix/terra/virtual-list/index.ts","./src/uix/terra/tooltip/tooltip.svelte.ts","./src/uix/terra/tooltip/exports.ts","./src/uix/terra/tooltip/types.ts","./src/uix/terra/tooltip/index.ts","./src/uix/terra/layers/arrow/types.ts","./src/uix/terra/layers/arrow/index.ts","./src/uix/terra/layers/dismissible/types.ts","./src/uix/terra/layers/escape/types.ts","./src/uix/terra/link-preview/types.ts","./src/uix/terra/link-preview/exports.ts","./src/uix/terra/link-preview/index.ts","./src/uix/terra/popover/exports.ts","./src/uix/terra/popover/types.ts","./src/uix/terra/popover/index.ts","./src/uix/terra/menu/types.ts","./src/uix/terra/dropdown-menu/types.ts","./src/uix/terra/dropdown-menu/exports.ts","./src/uix/terra/dropdown-menu/index.ts","./src/uix/terra/context-menu/types.ts","./src/uix/terra/context-menu/exports.ts","./src/uix/terra/context-menu/index.ts","./src/uix/terra/menubar/types.ts","./src/uix/terra/menubar/exports.ts","./src/uix/terra/menubar/index.ts","./src/uix/terra/command/compute-command-score.ts","./src/uix/terra/command/types.ts","./src/uix/terra/command/exports.ts","./src/uix/terra/command/index.ts","./src/uix/terra/dialog/types.ts","./src/uix/terra/alert-dialog/types.ts","./src/uix/terra/alert-dialog/exports.ts","./src/uix/terra/alert-dialog/index.ts","./src/uix/terra/dialog/exports.ts","./src/uix/terra/dialog/index.ts","./src/uix/terra/drawer/types.ts","./src/uix/terra/drawer/exports.ts","./src/uix/terra/drawer/index.ts","./src/uix/terra/field/types.ts","./src/uix/terra/field/exports.ts","./src/uix/terra/field/index.ts","./src/uix/terra/form/types.ts","./src/uix/terra/form/exports.ts","./src/uix/terra/form/index.ts","./src/uix/terra/system/date-time-formatter.svelte.ts","./src/uix/terra/system/number-formatter.svelte.ts","./src/uix/terra/system/currency-formatter.svelte.ts","./src/uix/terra/system/unit-formatter.svelte.ts","./src/uix/terra/system/exports.ts","./src/uix/terra/calendar/types.ts","./src/uix/terra/calendar/exports.ts","./src/uix/terra/calendar/index.ts","./src/uix/terra/range-calendar/types.ts","./src/uix/terra/range-calendar/exports.ts","./src/uix/terra/range-calendar/index.ts","./src/uix/terra/utils/datetime/parts.ts","./src/uix/terra/utils/datetime/types.ts","./src/uix/terra/date-field/types.ts","./src/uix/terra/date-field/exports.ts","./src/uix/terra/date-field/index.ts","./src/uix/terra/date-picker/types.ts","./src/uix/terra/date-picker/exports.ts","./src/uix/terra/date-picker/index.ts","./src/uix/terra/select/select.svelte.ts","./src/uix/terra/layers/text-selection/types.ts","./src/uix/terra/layers/presence/types.ts","./src/uix/terra/layers/focus-scope/types.ts","./src/uix/terra/layers/scroll/index.ts","./src/uix/terra/layers/popper/types.ts","./src/uix/terra/select/types.ts","./src/uix/terra/select/exports.ts","./src/uix/terra/select/index.ts","./src/uix/terra/combobox/types.ts","./src/uix/terra/combobox/exports.ts","./src/uix/terra/combobox/index.ts","./src/uix/terra/time-field/types.ts","./src/uix/terra/time-field/exports.ts","./src/uix/terra/time-field/index.ts","./src/uix/terra/time-range-field/types.ts","./src/uix/terra/time-range-field/exports.ts","./src/uix/terra/time-range-field/index.ts","./src/uix/terra/date-range-field/types.ts","./src/uix/terra/date-range-field/exports.ts","./src/uix/terra/date-range-field/index.ts","./src/uix/terra/date-range-picker/types.ts","./src/uix/terra/date-range-picker/exports.ts","./src/uix/terra/date-range-picker/index.ts","./src/uix/terra/index.ts","./src/uix/air/components/accordion/types.ts","./src/uix/air/components/accordion/index.ts","./src/uix/air/components/layout/shared.ts","./src/uix/air/components/layout/box/types.ts","./src/uix/air/components/layout/box/index.ts","./src/uix/air/components/layout/container/types.ts","./src/uix/air/components/layout/container/index.ts","./src/uix/air/components/layout/section/types.ts","./src/uix/air/components/layout/section/index.ts","./src/uix/air/components/layout/aspect-ratio/types.ts","./src/uix/air/components/layout/aspect-ratio/index.ts","./src/uix/air/components/layout/grid/types.ts","./src/uix/air/components/layout/grid/index.ts","./src/uix/air/components/layout/auto-grid/types.ts","./src/uix/air/components/layout/auto-grid/index.ts","./src/uix/air/components/layout/flex/types.ts","./src/uix/air/components/layout/flex/index.ts","./src/uix/air/components/layout/float/types.ts","./src/uix/air/components/layout/float/index.ts","./src/uix/air/components/layout/group/types.ts","./src/uix/air/components/layout/group/index.ts","./src/uix/air/components/layout/scroll-area/types.ts","./src/uix/air/components/layout/scroll-area/index.ts","./src/uix/air/components/layout/separator/types.ts","./src/uix/air/components/layout/separator/index.ts","./src/uix/air/components/layout/stack/types.ts","./src/uix/air/components/layout/stack/index.ts","./src/uix/air/components/layout/splitter/types.ts","./src/uix/air/components/layout/splitter/index.ts","./src/uix/air/components/layout/wrap/types.ts","./src/uix/air/components/layout/wrap/index.ts","./src/uix/air/components/layout/index.ts","./src/uix/air/components/drawer/types.ts","./src/uix/air/components/drawer/index.ts","./src/uix/air/components/dialog/types.ts","./src/uix/air/components/dialog/index.ts","./src/uix/air/components/field/types.ts","./src/uix/air/components/field/index.ts","./src/uix/air/components/form/types.ts","./src/uix/air/components/form/index.ts","./src/uix/air/components/calendar/types.ts","./src/uix/air/components/calendar/index.ts","./src/uix/air/components/input/types.ts","./src/uix/air/components/input/index.ts","./src/uix/air/components/select/types.ts","./src/uix/air/components/select/index.ts","./src/uix/air/components/combobox/types.ts","./src/uix/air/components/combobox/index.ts","./src/uix/air/components/command/types.ts","./src/uix/air/components/command/index.ts","./src/uix/air/components/color-picker/types.ts","./src/uix/air/components/color-picker/index.ts","./src/uix/air/components/tooltip/types.ts","./src/uix/air/components/tooltip/index.ts","./src/uix/air/components/link-preview/types.ts","./src/uix/air/components/link-preview/index.ts","./src/uix/air/components/popover/types.ts","./src/uix/air/components/popover/index.ts","./src/uix/air/components/switch/types.ts","./src/uix/air/components/switch/index.ts","./src/uix/air/components/checkbox/types.ts","./src/uix/air/components/checkbox/index.ts","./src/uix/air/components/radio-group/types.ts","./src/uix/air/components/radio-group/index.ts","./src/uix/air/components/toggle/types.ts","./src/uix/air/components/toggle/index.ts","./src/uix/air/components/toggle-group/types.ts","./src/uix/air/components/toggle-group/index.ts","./src/uix/air/components/toolbar/types.ts","./src/uix/air/components/toolbar/index.ts","./src/uix/air/components/avatar/types.ts","./src/uix/air/components/avatar/index.ts","./src/uix/air/components/meter/types.ts","./src/uix/air/components/meter/index.ts","./src/uix/air/components/collapsible/types.ts","./src/uix/air/components/collapsible/index.ts","./src/uix/air/components/alert-dialog/types.ts","./src/uix/air/components/alert-dialog/index.ts","./src/uix/air/components/dropdown-menu/types.ts","./src/uix/air/components/dropdown-menu/index.ts","./src/uix/air/components/menubar/types.ts","./src/uix/air/components/menubar/index.ts","./src/uix/air/components/context-menu/types.ts","./src/uix/air/components/context-menu/index.ts","./src/uix/air/components/slider/types.ts","./src/uix/air/components/slider/index.ts","./src/uix/air/components/progress/types.ts","./src/uix/air/components/progress/index.ts","./src/uix/air/components/tags-input/types.ts","./src/uix/air/components/tags-input/index.ts","./src/uix/air/components/number-field/types.ts","./src/uix/air/components/number-field/index.ts","./src/uix/air/components/badge/types.ts","./src/uix/air/components/badge/index.ts","./src/uix/air/components/tabs/types.ts","./src/uix/air/components/tabs/index.ts","./src/uix/air/components/toast/types.ts","./src/uix/air/components/toast/index.ts","./src/uix/terra/system/index.ts","./src/uix/air/ling/air_ling.ts","./src/uix/air/ling/index.ts","./src/uix/air/semantics/types.ts","./src/uix/air/runtime/context.ts","./src/uix/air/runtime/index.ts","./src/uix/air/audio/sound.engine.ts","./src/uix/air/audio/sound.svelte.ts","./src/uix/air/audio/index.ts","./src/uix/air/semantics/audio/play.ts","./src/uix/air/resources/motions/types.ts","./src/uix/air/resources/motions/animation-preset.ts","./src/uix/air/resources/motions/soft-reveal.ts","./src/uix/air/resources/motions/spring-context.ts","./src/uix/air/resources/motions/smooth-expansion.ts","./src/uix/air/resources/motions/defaults.ts","./src/uix/air/resources/motions/genie.ts","./src/uix/air/resources/motions/mac-dialog.ts","./src/uix/air/resources/motions/index.ts","./src/uix/air/motion/transitions.ts","./src/uix/air/motion/index.ts","./src/uix/air/semantics/facade.svelte.ts","./src/uix/air/semantics/motion/revelation.ts","./src/uix/air/semantics/motion/context.ts","./src/uix/air/semantics/motion/expansion.ts","./src/uix/air/semantics/motion/destruction.ts","./src/uix/air/semantics/motion/action.svelte.ts","./src/uix/air/semantics/motion/index.ts","./src/uix/air/semantics/audio/feedback.ts","./src/uix/air/semantics/audio/selection.ts","./src/uix/air/semantics/audio/attention.ts","./src/uix/air/semantics/audio/emphasis.ts","./src/uix/air/semantics/audio/completion.ts","./src/uix/air/semantics/audio/persistence.ts","./src/uix/air/semantics/audio/index.ts","./src/uix/air/semantics/index.ts","./src/uix/air/resources/audios/types.ts","./src/uix/air/resources/audios/defaults.ts","./src/uix/air/resources/audios/tokens.ts","./src/uix/air/resources/audios/index.ts","./src/uix/air/interaction/runtime.svelte.ts","./src/uix/air/interaction/index.ts","./src/uix/air/system/types.ts","./src/uix/air/system/air.svelte.ts","./src/uix/air/system/index.ts","./src/uix/air/components/pagination/types.ts","./src/uix/air/components/pagination/index.ts","./src/uix/air/components/editable/types.ts","./src/uix/air/components/editable/index.ts","./src/uix/air/components/pin-input/types.ts","./src/uix/air/components/pin-input/pin-input.svelte.ts","./src/uix/air/components/pin-input/index.ts","./src/uix/air/components/rating-group/types.ts","./src/uix/air/components/rating-group/rating-group.svelte.ts","./src/uix/air/components/rating-group/index.ts","./src/uix/air/components/stepper/types.ts","./src/uix/air/components/stepper/index.ts","./src/uix/air/components/file-upload/types.ts","./src/uix/air/components/file-upload/index.ts","./src/uix/air/components/spinner/index.ts","./src/uix/air/components/icon/types.ts","./src/uix/air/components/icon/index.ts","./src/uix/air/components/typography/text/types.ts","./src/uix/air/components/typography/text/index.ts","./src/uix/air/components/typography/heading/types.ts","./src/uix/air/components/typography/heading/index.ts","./src/uix/air/components/typography/display/types.ts","./src/uix/air/components/typography/display/index.ts","./src/uix/air/components/typography/code/types.ts","./src/uix/air/components/typography/code/index.ts","./src/uix/air/components/typography/code-block/types.ts","./src/uix/air/components/typography/code-block/index.ts","./src/uix/air/components/typography/kbd/types.ts","./src/uix/air/components/typography/kbd/index.ts","./src/uix/air/components/typography/mark/types.ts","./src/uix/air/components/typography/mark/index.ts","./src/uix/air/components/typography/highlight/types.ts","./src/uix/air/components/typography/highlight/index.ts","./src/uix/air/components/typography/text-virtual-list/index.ts","./src/uix/air/components/typography/index.ts","./src/uix/air/themes/types.ts","./src/uix/air/themes/base/index.ts","./src/uix/air/themes/earth/sound.ts","./src/uix/air/themes/earth/index.ts","./src/uix/air/themes/chakra/index.ts","./src/uix/air/themes/pretty/index.ts","./src/uix/air/themes/index.ts","./src/uix/air/index.ts","./src/uix/air/components/avatar/avatar.svelte.ts","./src/uix/air/styles/types.ts","./src/uix/air/components/badge/styles.ts","./src/uix/air/components/button/styles.ts","./src/uix/air/components/calendar/calendar.context.ts","./src/uix/air/components/color-picker/color-picker-attrs.ts","./src/uix/air/components/color-picker/color-picker.svelte.ts","./src/uix/air/components/dialog/styles.ts","./src/uix/air/components/form/form.context.ts","./src/uix/air/components/icon/categories.ts","./src/uix/air/components/icon/create-icon.ts","./src/uix/air/components/icon/lib/index.ts","./src/uix/air/components/input/styles.ts","./src/uix/air/components/menubar/menubar.context.ts","./src/uix/terra/spinner/spinner.svelte.ts","./src/uix/air/components/spinner/shared.ts","./src/uix/air/components/switch/styles.ts","./src/uix/air/components/tabs/styles.ts","./src/uix/air/internal/canvas/analysis.ts","./src/uix/air/internal/canvas/bidi.ts","./src/uix/air/internal/canvas/measurement.ts","./src/uix/air/internal/canvas/line-break.ts","./src/uix/air/internal/canvas/layout.ts","./src/uix/air/internal/canvas/layout.test.ts","./src/uix/air/internal/canvas/use-canvas.svelte.ts","./src/uix/air/resources/index.ts","./src/uix/air/styles/index.ts","./src/uix/air/styles/resolver.ts","./src/uix/air/themes/base/motion.ts","./src/uix/air/themes/base/sound.ts","./src/uix/soma/reactive/reactive.svelte.ts","./src/uix/soma/reactive/index.ts","./src/uix/soma/attrs/create-attrs.ts","./src/uix/soma/attrs/contracts.ts","./src/uix/soma/attrs/helpers.ts","./src/uix/soma/attrs/index.ts","./src/uix/soma/provider/context.ts","./src/uix/soma/provider/provider.svelte.ts","./src/uix/soma/provider/index.ts","./src/uix/soma/props/props.ts","./src/uix/soma/props/index.ts","./src/uix/soma/keyboard/keys.ts","./src/uix/soma/types/component.ts","./src/uix/soma/types/events.ts","./src/uix/soma/types/guards.ts","./src/uix/soma/external/dates/index.ts","./src/uix/soma/types/services.ts","./src/uix/soma/css/css.ts","./src/uix/soma/css/index.ts","./src/uix/soma/dom/dom.ts","./src/uix/soma/dom/focus/guards.ts","./src/uix/soma/dom/focus/focus.ts","./src/uix/soma/dom/index.ts","./src/uix/soma/id/create-id.ts","./src/uix/soma/id/index.ts","./src/uix/soma/layers/floating/utils.ts","./src/uix/soma/layers/floating/types.ts","./src/uix/soma/layers/floating/use-floating.svelte.ts","./src/uix/soma/layers/floating/floating.svelte.ts","./src/uix/soma/layers/floating/safe-polygon.ts","./src/uix/soma/layers/floating/index.ts","./src/uix/soma/types/html.ts","./src/uix/soma/types/index.ts","./src/uix/soma/keyboard/directional.ts","./src/uix/soma/keyboard/index.ts","./src/uix/soma/events/types.ts","./src/uix/soma/events/add-event-listener.ts","./src/uix/soma/events/index.ts","./src/uix/soma/core/soma.svelte.ts","./src/uix/soma/index.ts","./src/uix/soma/layers/presence.svelte.ts","./src/uix/soma/layers/resize-observer.svelte.ts","./src/uix/soma/components/accordion/accordion-provider.svelte.ts","./src/uix/soma/components/accordion/types.ts","./src/uix/soma/components/accordion/exports.ts","./src/uix/soma/components/accordion/index.ts","./src/uix/soma/components/checkbox/types.ts","./src/uix/soma/components/checkbox/exports.ts","./src/uix/soma/components/checkbox/index.ts","./src/uix/soma/components/collapsible/types.ts","./src/uix/soma/components/collapsible/exports.ts","./src/uix/soma/components/collapsible/index.ts","./src/uix/soma/layers/dismissal.svelte.ts","./src/uix/soma/components/combobox/combobox-provider.svelte.ts","./src/uix/soma/components/combobox/types.ts","./src/uix/soma/components/combobox/exports.ts","./src/uix/soma/components/combobox/index.ts","./src/uix/soma/layers/focus-scope.svelte.ts","./src/uix/soma/layers/scroll-lock.svelte.ts","./src/uix/soma/layers/text-selection.svelte.ts","./src/uix/soma/components/dialog/dialog-provider.svelte.ts","./src/uix/soma/components/dialog/types.ts","./src/uix/soma/components/dialog/exports.ts","./src/uix/soma/components/dialog/index.ts","./src/uix/soma/components/dropdown-menu/types.ts","./src/uix/soma/components/dropdown-menu/exports.ts","./src/uix/soma/components/dropdown-menu/index.ts","./src/uix/soma/components/popover/types.ts","./src/uix/soma/components/popover/exports.ts","./src/uix/soma/components/popover/index.ts","./src/uix/soma/components/radio-group/types.ts","./src/uix/soma/components/radio-group/exports.ts","./src/uix/soma/components/radio-group/index.ts","./src/uix/soma/components/select/select-provider.svelte.ts","./src/uix/soma/components/select/types.ts","./src/uix/soma/components/select/exports.ts","./src/uix/soma/components/select/index.ts","./src/uix/soma/components/slider/slider-provider.svelte.ts","./src/uix/soma/components/slider/types.ts","./src/uix/soma/components/slider/exports.ts","./src/uix/soma/components/slider/index.ts","./src/uix/soma/components/switch/types.ts","./src/uix/soma/components/switch/exports.ts","./src/uix/soma/components/switch/index.ts","./src/uix/soma/components/tooltip/tooltip-provider.svelte.ts","./src/uix/soma/components/tooltip/types.ts","./src/uix/soma/components/tooltip/exports.ts","./src/uix/soma/components/tooltip/index.ts","./src/uix/soma/components/index.ts","./src/uix/soma/components/checkbox/checkbox-provider.svelte.ts","./src/uix/soma/components/collapsible/collapsible-provider.svelte.ts","./src/uix/soma/components/dropdown-menu/dropdown-menu-provider.svelte.ts","./src/uix/soma/components/internal/index.ts","./src/uix/soma/components/popover/popover-provider.svelte.ts","./src/uix/soma/components/radio-group/radio-group-provider.svelte.ts","./src/uix/soma/components/switch/switch-provider.svelte.ts","./src/uix/soma/external/dates/adapter.ts","./src/uix/soma/layers/index.ts","./src/uix/terra/app.d.ts","./src/uix/terra/aspect-ratio/aspect-ratio.svelte.ts","./src/uix/terra/avatar/avatar.svelte.ts","./src/uix/terra/utils/datetime/announcer.ts","./src/uix/terra/utils/datetime/formatter.ts","./src/uix/terra/utils/datetime/segments.ts","./src/uix/terra/utils/datetime/helpers.ts","./src/uix/terra/utils/datetime/index.ts","./src/uix/terra/utils/datetime/calendar-attrs.ts","./src/uix/terra/utils/datetime/calendar-helpers.svelte.ts","./src/uix/terra/calendar/calendar.svelte.ts","./src/uix/terra/checkbox/checkbox.svelte.ts","./src/uix/terra/collapsible/collapsible.svelte.ts","./src/uix/terra/command/utils.ts","./src/uix/terra/command/command.svelte.ts","./src/uix/terra/date-range-field/date-range-field.svelte.ts","./src/uix/terra/date-field/date-field.svelte.ts","./src/uix/terra/date-picker/date-picker.svelte.ts","./src/uix/terra/date-range-picker/date-range-picker.svelte.ts","./src/uix/terra/dialog/dialog.svelte.ts","./src/uix/terra/editable/editable.svelte.ts","./src/uix/terra/form/form.svelte.ts","./src/uix/terra/field/field-state.svelte.ts","./src/uix/terra/field/field.svelte.ts","./src/uix/terra/label/label.svelte.ts","./src/uix/terra/layers/index.ts","./src/uix/terra/layers/direction/direction.svelte.ts","./src/uix/terra/layers/direction/exports.ts","./src/uix/terra/layers/direction/index.ts","./src/uix/terra/layers/dismissible/index.ts","./src/uix/terra/menu/utils.ts","./src/uix/terra/menu/menu.svelte.ts","./src/uix/terra/layers/dismissible/use-dismissable-layer.svelte.ts","./src/uix/terra/layers/escape/index.ts","./src/uix/terra/layers/escape/use-escape-layer.svelte.ts","./src/uix/terra/layers/focus-scope/use-focus-scope.svelte.ts","./src/uix/terra/layers/focus-scope/focus-scope-manager.ts","./src/uix/terra/layers/focus-scope/index.ts","./src/uix/terra/layers/popper/index.ts","./src/uix/terra/layers/portal/index.ts","./src/uix/terra/layers/presence/index.ts","./src/uix/terra/layers/presence/use-presence.svelte.ts","./src/uix/terra/layers/text-selection/index.ts","./src/uix/terra/layers/text-selection/use-text-selection-layer.svelte.ts","./src/uix/terra/layers/visually-hidden/types.ts","./src/uix/terra/layers/visually-hidden/index.ts","./src/uix/terra/link-preview/link-preview.svelte.ts","./src/uix/terra/menu/exports.ts","./src/uix/terra/menu/index.ts","./src/uix/terra/menubar/menubar.svelte.ts","./src/uix/terra/meter/meter.svelte.ts","./src/uix/terra/system/prop-resolvers.ts","./src/uix/terra/number-field/number-field.svelte.ts","./src/uix/terra/popover/popover.svelte.ts","./src/uix/terra/progress/progress.svelte.ts","./src/uix/terra/radio-group/radio-group.svelte.ts","./src/uix/terra/range-calendar/range-calendar.svelte.ts","./src/uix/terra/scroll-area/scroll-area.svelte.ts","./src/uix/terra/separator/separator.svelte.ts","./src/uix/terra/slider/helpers.ts","./src/uix/terra/slider/slider.svelte.ts","./src/uix/terra/switch/switch.svelte.ts","./src/uix/terra/tabs/tabs.svelte.ts","./src/uix/terra/tags-input/tags-input.svelte.ts","./src/uix/terra/utils/datetime/time-helpers.ts","./src/uix/terra/time-field/time-field.svelte.ts","./src/uix/terra/time-range-field/time-range-field.svelte.ts","./src/uix/terra/toggle/toggle.svelte.ts","./src/uix/terra/toggle-group/toggle-group.svelte.ts","./src/uix/terra/toolbar/toolbar.svelte.ts","./src/uix/terra/trans/exports.ts","./src/uix/terra/trans/trans.svelte.ts","./src/uix/terra/utils/csstype.d.ts","./src/uix/terra/utils/warn.ts","./src/uix/terra/utils/framework/watch.svelte.ts","./src/uix/terra/utils/state/symbols.ts","./src/uix/terra/utils/state/types.ts","./src/uix/terra/utils/state/derived.svelte.ts","./src/uix/terra/utils/state/guards.ts","./src/uix/terra/utils/state/readonly.svelte.ts","./src/uix/terra/utils/state/state.svelte.ts","./src/uix/terra/utils/state/utils.svelte.ts","./src/uix/terra/virtual-list/virtual-list.svelte.ts"],"fileIdsList":[[102,165,173,177,180,182,183,184,196,259],[102,165,173,177,180,182,183,184,196,259,675],[93,102,165,173,177,180,182,183,184,196,259],[102,165,173,177,180,182,183,184,196,259,262],[93,102,165,173,177,180,182,183,184,196,259,262],[102,165,173,177,180,182,183,184,196,259,262,265],[102,165,173,177,180,182,183,184,196,259,262,351],[102,165,173,177,180,182,183,184,196,259,352],[102,165,173,177,180,182,183,184,196,686],[102,165,173,177,180,182,183,184,196,687,688],[102,165,173,177,180,182,183,184,196],[93,99,102,165,173,177,179,180,182,183,184,196,254,256,257,258,259,261,455],[102,165,173,177,180,182,183,184,196,254,455],[93,102,165,173,177,180,182,183,184,196,254,255,455],[102,165,173,177,180,182,183,184,196,410,411],[102,162,163,165,173,177,180,182,183,184,196],[102,164,165,173,177,180,182,183,184,196],[165,173,177,180,182,183,184,196],[102,165,173,177,180,182,183,184,196,204],[102,165,166,171,173,176,177,180,182,183,184,186,196,201,213],[102,165,166,167,173,176,177,180,182,183,184,196],[102,165,168,173,177,180,182,183,184,196,214],[102,165,169,170,173,177,180,182,183,184,187,196],[102,165,170,173,177,180,182,183,184,196,201,210],[102,165,171,173,176,177,180,182,183,184,186,196],[102,164,165,172,173,177,180,182,183,184,196],[102,165,173,174,177,180,182,183,184,196],[102,165,173,175,176,177,180,182,183,184,196],[102,164,165,173,176,177,180,182,183,184,196],[102,165,173,176,177,178,180,182,183,184,196,201,213],[102,165,173,176,177,178,180,182,183,184,196,201,204],[102,152,165,173,176,177,179,180,182,183,184,186,196,201,213],[102,165,173,176,177,179,180,182,183,184,186,196,201,210,213],[102,165,173,177,179,180,181,182,183,184,196,201,210,213],[100,101,102,103,104,105,106,107,108,109,110,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220],[102,165,173,176,177,180,182,183,184,196],[102,165,173,177,180,182,184,196],[102,165,173,177,180,182,183,184,185,196,213],[102,165,173,176,177,180,182,183,184,186,196,201],[102,165,173,177,180,182,183,184,187,196],[102,165,173,177,180,182,183,184,188,196],[102,165,173,176,177,180,182,183,184,191,196],[102,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220],[102,165,173,177,180,182,183,184,193,196],[102,165,173,177,180,182,183,184,194,196],[102,165,170,173,177,180,182,183,184,186,196,204],[102,165,173,176,177,180,182,183,184,196,197],[102,165,173,177,180,182,183,184,196,198,214,217],[102,165,173,176,177,180,182,183,184,196,201,203,204],[102,165,173,177,180,182,183,184,196,202,204],[102,165,173,177,180,182,183,184,196,204,214],[102,165,173,177,180,182,183,184,196,205],[102,162,165,173,177,180,182,183,184,196,201,207,213],[102,165,173,177,180,182,183,184,196,201,206],[102,165,173,176,177,180,182,183,184,196,208,209],[102,165,173,177,180,182,183,184,196,208,209],[102,165,170,173,177,180,182,183,184,186,196,201,210],[102,165,173,177,180,182,183,184,196,211],[102,165,173,177,180,182,183,184,186,196,212],[102,165,173,177,179,180,182,183,184,194,196,213],[102,165,173,177,180,182,183,184,196,214,215],[102,165,170,173,177,180,182,183,184,196,215],[102,165,173,177,180,182,183,184,196,201,216],[102,165,173,177,180,182,183,184,185,196,217],[102,165,173,177,180,182,183,184,196,218],[102,165,168,173,177,180,182,183,184,196],[102,165,170,173,177,180,182,183,184,196],[102,165,173,177,180,182,183,184,196,214],[102,152,165,173,177,180,182,183,184,196],[102,165,173,177,180,182,183,184,196,213],[102,165,173,177,180,182,183,184,196,219],[102,165,173,177,180,182,183,184,191,196],[102,165,173,177,180,182,183,184,196,209],[102,152,165,173,176,177,178,180,182,183,184,191,196,201,204,213,216,217,219],[102,165,173,177,180,182,183,184,196,201,220],[83,102,165,173,177,180,182,183,184,196],[84,85,86,87,102,165,173,177,180,182,183,184,196],[83,85,102,165,173,177,180,182,183,184,196],[84,87,102,165,173,177,180,182,183,184,196],[102,165,173,177,180,182,183,184,196,449],[102,165,173,177,180,182,183,184,196,451,460,461,466,467],[102,165,173,177,180,182,183,184,196,441,445,446,448],[102,165,173,177,180,182,183,184,196,449,460,461,467],[102,165,173,177,180,182,183,184,196,446,449],[102,165,173,177,180,182,183,184,196,441,447,448,449],[102,165,173,177,180,182,183,184,196,257,398,404,406,408,409,412,431],[102,165,173,177,180,182,183,184,196,427],[102,165,173,177,180,182,183,184,196,427,428],[102,165,173,177,180,182,183,184,196,402,404,405],[102,165,173,177,180,182,183,184,196,402,404],[102,165,173,177,180,182,183,184,196,402],[102,165,173,177,180,182,183,184,196,397,402,414,415],[102,165,173,177,180,182,183,184,196,397,414],[102,165,173,177,180,182,183,184,196,407],[102,165,173,177,180,182,183,184,196,397,403],[102,165,173,177,180,182,183,184,196,397],[102,165,173,177,180,182,183,184,196,397,399,403,443],[102,165,173,177,180,182,183,184,196,399],[102,165,173,177,180,182,183,184,196,397,398,399,400,401],[88,89,102,165,173,177,180,182,183,184,196],[102,165,173,177,180,182,183,184,196,436,437],[102,165,173,177,180,182,183,184,196,436,437,438,439],[102,165,173,177,180,182,183,184,196,436,438],[102,165,173,177,180,182,183,184,196,436],[102,165,173,177,180,182,183,184,196,249,250],[102,165,173,177,180,182,183,184,196,458],[102,165,173,177,180,182,183,184,196,464],[102,165,166,173,177,180,182,183,184,196,201,462,463],[102,165,173,177,180,182,183,184,196,465],[102,165,173,177,180,182,183,184,196,243],[102,165,173,177,180,182,183,184,196,241,243],[102,165,173,177,180,182,183,184,196,232,240,241,242,244,246],[102,165,173,177,180,182,183,184,196,230],[102,165,173,177,180,182,183,184,196,233,238,243,246],[102,165,173,177,180,182,183,184,196,229,246],[102,165,173,177,180,182,183,184,196,233,234,237,238,239,246],[102,165,173,177,180,182,183,184,196,233,234,235,237,238,246],[102,165,173,177,180,182,183,184,196,230,231,232,233,234,238,239,240,242,243,244,246],[102,165,173,177,180,182,183,184,196,246],[102,165,173,177,180,182,183,184,196,228,230,231,232,233,234,235,237,238,239,240,241,242,243,244,245],[102,165,173,177,180,182,183,184,196,228,246],[102,165,173,177,180,182,183,184,196,233,235,236,238,239,246],[102,165,173,177,180,182,183,184,196,237,246],[102,165,173,177,180,182,183,184,196,238,239,243,246],[102,165,173,177,180,182,183,184,196,231,241],[102,165,173,177,180,182,183,184,196,223,253,254],[91,102,165,173,177,180,182,183,184,196,223],[102,165,173,177,180,182,183,184,196,571,636],[102,165,173,177,180,182,183,184,196,568],[102,165,173,177,180,182,183,184,196,569],[102,165,173,177,180,182,183,184,196,568,571],[102,165,173,177,180,182,183,184,196,572],[102,165,173,177,180,182,183,184,196,632],[102,165,173,177,180,182,183,184,196,574],[102,165,173,177,180,182,183,184,196,571],[102,165,173,177,180,182,183,184,196,576],[102,165,173,177,180,182,183,184,196,578],[102,165,173,177,180,182,183,184,196,580],[102,165,173,177,180,182,183,184,196,582],[102,165,173,177,180,182,183,184,196,584],[102,165,173,177,180,182,183,184,196,570,573,575,577,579,581,583,585,587,589,592,594,596,598,600,602,604,606,608,610,612,614,616,618,620,621,623,625,627,629,631,633,635],[102,165,173,177,180,182,183,184,196,595],[102,165,173,177,180,182,183,184,196,586],[102,165,173,177,180,182,183,184,196,569,571],[102,165,173,177,180,182,183,184,196,588],[102,165,173,177,180,182,183,184,196,591],[102,165,173,177,180,182,183,184,196,568,571,590],[102,165,173,177,180,182,183,184,196,593],[102,165,173,177,180,182,183,184,196,634],[102,165,173,177,180,182,183,184,196,597],[102,165,173,177,180,182,183,184,196,599],[102,165,173,177,180,182,183,184,196,601],[102,165,173,177,180,182,183,184,196,603],[102,165,173,177,180,182,183,184,196,605],[102,165,173,177,180,182,183,184,196,607],[102,165,173,177,180,182,183,184,196,609],[102,165,173,177,180,182,183,184,196,611],[102,165,173,177,180,182,183,184,196,613],[102,165,173,177,180,182,183,184,196,615],[102,165,173,177,180,182,183,184,196,617],[102,165,173,177,180,182,183,184,196,619],[102,165,173,177,180,182,183,184,196,590],[102,165,173,177,180,182,183,184,196,626],[102,165,173,177,180,182,183,184,196,622],[102,165,173,177,180,182,183,184,196,624],[102,165,173,177,180,182,183,184,196,628],[102,165,173,177,180,182,183,184,196,630],[93,102,165,173,177,180,182,183,184,196,655],[89,90,91,92,93,102,165,173,177,180,182,183,184,196,223],[102,117,120,123,124,165,173,177,180,182,183,184,196,213],[102,120,165,173,177,180,182,183,184,196,201,213],[102,120,124,165,173,177,180,182,183,184,196,213],[102,165,173,177,180,182,183,184,196,201],[102,114,165,173,177,180,182,183,184,196],[102,118,165,173,177,180,182,183,184,196],[102,116,117,120,165,173,177,180,182,183,184,196,213],[102,165,173,177,180,182,183,184,186,196,210],[102,165,173,177,180,182,183,184,196,221],[102,114,165,173,177,180,182,183,184,196,221],[102,116,120,165,173,177,180,182,183,184,186,196,213],[102,111,112,113,115,119,165,173,176,177,180,182,183,184,196,201,213],[102,120,129,137,165,173,177,180,182,183,184,196],[102,112,118,165,173,177,180,182,183,184,196],[102,120,146,147,165,173,177,180,182,183,184,196],[102,112,115,120,165,173,177,180,182,183,184,196,204,213,221],[102,120,165,173,177,180,182,183,184,196],[102,116,120,165,173,177,180,182,183,184,196,213],[102,111,165,173,177,180,182,183,184,196],[102,114,115,116,118,119,120,121,122,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,147,148,149,150,151,165,173,177,180,182,183,184,196],[102,120,139,142,165,173,177,180,182,183,184,196],[102,120,129,130,131,165,173,177,180,182,183,184,196],[102,118,120,130,132,165,173,177,180,182,183,184,196],[102,119,165,173,177,180,182,183,184,196],[102,112,114,120,165,173,177,180,182,183,184,196],[102,120,124,130,132,165,173,177,180,182,183,184,196],[102,124,165,173,177,180,182,183,184,196],[102,118,120,123,165,173,177,180,182,183,184,196,213],[102,112,116,120,129,165,173,177,180,182,183,184,196],[102,120,139,165,173,177,180,182,183,184,196],[102,132,165,173,177,180,182,183,184,196],[102,114,120,146,165,173,177,180,182,183,184,196,204,219,221],[98,102,165,173,177,180,182,183,184,196],[94,102,165,173,177,180,182,183,184,196],[94,95,97,102,165,173,176,177,179,180,181,182,183,184,186,196,201,210,213,220,221,222,223,224,225,226,227,247,248,252,253,254],[94,95,96,102,165,173,177,180,182,183,184,196,222],[95,102,165,173,177,180,182,183,184,196],[96,97,102,165,173,177,180,182,183,184,196],[102,165,173,177,180,182,183,184,196,251],[102,165,173,177,180,182,183,184,196,223,254],[102,165,173,177,180,182,183,184,196,445,450],[102,165,173,177,180,182,183,184,196,413,431,455],[102,165,173,177,180,182,183,184,196,397,398,400,401,402,404,406,408,416,417,419,430,431,442,444],[102,165,173,177,180,182,183,184,196,406,424,425,431],[102,165,173,177,180,182,183,184,196,406,417,421,431],[102,165,173,177,180,182,183,184,196,397,404,406,416,431],[102,165,173,177,180,182,183,184,196,225],[102,165,173,177,180,182,183,184,196,397,406,413,416,418,426,431],[102,165,173,177,180,182,183,184,196,254,453,455],[102,165,168,173,177,180,182,183,184,196,201,254,397,402,404,406,413,416,417,418,419,421,422,423,426,429,430,431,442,451,452,455,467],[102,165,173,177,180,182,183,184,196,225,406,416,417,431],[102,165,173,177,180,182,183,184,196,406,424,425,426,431],[102,165,173,177,180,182,183,184,196,225,406,418,419,420,431],[102,165,168,173,177,180,182,183,184,196,201,225,254,397,402,404,406,413,416,417,418,419,420,421,422,423,424,425,426,429,430,431,442,451,452,453,454,455,467],[102,165,168,173,177,180,182,183,184,196,201,225,254,397,402,404,406,413,416,417,418,419,420,421,422,423,424,425,426,429,430,431,442,451,452,453,455,467],[102,165,173,177,180,182,183,184,196,225,397,402,404,406,408,413,416,417,418,419,420,421,422,424,425,426,429,431,432,433,434,435,440],[102,165,168,173,177,179,180,182,183,184,196,201,225,254,397,402,404,406,413,416,417,418,419,420,421,422,423,424,425,426,429,430,431,442,451,452,453,454,455,457,459,467],[102,165,173,177,180,182,183,184,196,397,404,406,416,417,419,424,425,426,431,433],[102,165,173,177,180,182,183,184,196,472,481,499,503,505,508,512,515],[102,165,173,177,180,182,183,184,196,472,481,499,502,504,507,511,514],[102,165,173,177,180,182,183,184,196,499,516],[102,165,173,177,180,182,183,184,196,477,479,515,516],[102,165,173,177,180,182,183,184,196,479,515,520],[102,165,173,177,180,182,183,184,196,472,480,481,482,483,497,498],[102,165,173,177,180,182,183,184,196,441,448,479,515,518,520],[102,165,173,177,180,182,183,184,196,481,500],[102,165,173,177,180,182,183,184,196,479],[102,165,173,177,180,182,183,184,196,470,472,481,482,507],[102,165,173,177,180,182,183,184,196,472,479,481,482,501,506],[102,165,173,177,180,182,183,184,196,472,479],[102,165,173,177,180,182,183,184,196,479,481],[102,165,173,177,180,182,183,184,196,470,481,496,497,504],[102,165,173,177,180,182,183,184,196,470,481,496,497,501],[102,165,173,177,180,182,183,184,196,481,496],[102,165,173,177,180,182,183,184,196,481,482,483,497,498,501,502,504,507,511],[102,165,173,177,180,182,183,184,196,470,481,498,502],[102,165,173,177,180,182,183,184,196,479,481,498,501],[102,165,173,177,180,182,183,184,196,519],[102,165,173,177,180,182,183,184,196,483],[102,165,173,177,180,182,183,184,196,470,472,481,483,511],[102,165,173,177,180,182,183,184,196,470,479,481,483,501,509,510],[102,165,173,177,180,182,183,184,196,472,476],[102,165,173,177,180,182,183,184,196,481],[102,165,173,177,180,182,183,184,196,441,448,479,482,483,497,498,501,502,504,507,510,511],[102,165,173,177,180,182,183,184,196,479,515,517,518],[102,165,173,177,180,182,183,184,196,470,471,472,473,474,475],[102,165,173,177,180,182,183,184,196,472],[102,165,173,177,180,182,183,184,196,470,472],[102,165,173,177,180,182,183,184,196,470,472,474],[102,165,173,177,180,182,183,184,196,470,472,474,475,476,477,478],[102,165,173,177,180,182,183,184,196,476,477],[102,165,173,177,180,182,183,184,196,472,474,476],[102,165,173,177,180,182,183,184,196,470,471],[102,165,173,177,180,182,183,184,196,441,448,471,474,475,476,525],[102,165,173,177,180,182,183,184,196,479,480,513],[102,165,173,177,180,182,183,184,196,480,513,514],[102,165,173,177,180,182,183,184,196,480],[102,165,173,177,180,182,183,184,196,441,448,476,480,513,514],[102,165,173,177,180,182,183,184,196,528],[102,165,173,177,180,182,183,184,196,530],[102,165,173,177,180,182,183,184,196,530,531,532],[102,165,173,177,180,182,183,184,196,530,531],[102,165,173,177,180,182,183,184,196,488,495,496],[102,165,173,177,180,182,183,184,196,487,495,496],[102,165,173,177,180,182,183,184,196,485,487,495,496],[102,165,173,177,180,182,183,184,196,495,496],[102,165,173,177,180,182,183,184,196,487,488,495,496],[102,165,173,177,180,182,183,184,196,485,495,496],[102,165,173,177,180,182,183,184,196,488,490,492,493,494,496],[102,165,173,177,180,182,183,184,196,488,496,534,535,536,537,538,539,540,541],[102,165,173,177,180,182,183,184,196,495],[102,165,173,177,180,182,183,184,196,496],[102,165,173,177,180,182,183,184,196,490,495,496],[102,165,173,177,180,182,183,184,196,488,490,491,492,494,495,496,534,535,536,537,538,539,540,541,542,543,544,545],[102,165,173,177,180,182,183,184,196,488,490,491,493,495,496],[102,165,173,177,180,182,183,184,196,488,491,492,495,496],[102,165,173,177,180,182,183,184,196,489,492,495,496],[102,165,173,177,180,182,183,184,196,488,490,491,492,495,496],[102,165,173,177,180,182,183,184,196,547],[102,165,173,177,180,182,183,184,196,484],[102,165,173,177,180,182,183,184,196,486],[102,165,173,177,180,182,183,184,196,549,550],[102,165,173,177,180,182,183,184,196,549,550,551,552,553,554,555],[102,165,173,177,180,182,183,184,196,549,550,552],[102,165,173,177,180,182,183,184,196,549],[102,165,173,177,180,182,183,184,196,549,550,551,552,553,554],[102,165,173,177,180,182,183,184,196,557],[102,165,173,177,180,182,183,184,196,559],[99,102,165,173,177,180,182,183,184,196],[93,102,165,173,177,180,182,183,184,196],[102,165,173,177,180,182,183,184,196,472,565],[102,165,173,177,180,182,183,184,196,1015,1016],[102,165,173,177,180,182,183,184,196,1048],[102,165,173,177,180,182,183,184,196,1014,1018,1048],[93,102,165,173,177,180,182,183,184,196,911],[102,165,173,177,180,182,183,184,196,708,718,722,910],[93,102,165,173,177,180,182,183,184,196,855,987],[102,165,173,177,180,182,183,184,196,261,675,708,718,910],[102,165,173,177,180,182,183,184,196,637],[93,102,165,173,177,180,182,183,184,196,981],[93,102,165,173,177,180,182,183,184,196,261,675,718],[93,102,165,173,177,180,182,183,184,196,1003],[102,165,173,177,180,182,183,184,196,1098],[93,102,165,173,177,180,182,183,184,196,261,675],[93,102,165,173,177,180,182,183,184,196,719],[102,165,173,177,180,182,183,184,196,711,714,718],[93,102,165,173,177,180,182,183,184,196,951],[102,165,173,177,180,182,183,184,196,718,910],[93,102,165,173,177,180,182,183,184,196,971],[102,165,173,177,180,182,183,184,196,261,675,718,910],[93,102,165,173,177,180,182,183,184,196,985],[102,165,173,177,180,182,183,184,196,910],[102,165,173,177,180,182,183,184,196,729],[102,165,173,177,180,182,183,184,196,485,533,639,708,1053],[93,102,165,173,177,180,182,183,184,196,961],[93,102,165,173,177,180,182,183,184,196,261,533,675,718],[93,102,165,173,177,180,182,183,184,196,957],[93,102,165,173,177,180,182,183,184,196,261,675,718,910,955],[93,102,165,173,177,180,182,183,184,196,851,959],[93,102,165,173,177,180,182,183,184,196,844,993],[93,102,165,173,177,180,182,183,184,196,857,945],[93,102,165,173,177,180,182,183,184,196,860,943],[93,102,165,173,177,180,182,183,184,196,841,989],[93,102,165,173,177,180,182,183,184,196,1056],[93,102,165,173,177,180,182,183,184,196,947],[93,102,165,173,177,180,182,183,184,196,802,1066],[102,165,173,177,180,182,183,184,196,949],[93,102,165,173,177,180,182,183,184,196,949],[102,165,173,177,180,182,183,184,196,718,720,910],[102,165,173,177,180,182,183,184,196,1069],[93,102,165,173,177,180,182,183,184,196,1069],[93,102,165,173,177,180,182,183,184,196,953],[93,102,165,173,177,180,182,183,184,196,920],[93,102,165,173,177,180,182,183,184,196,924],[102,165,173,177,180,182,183,184,196,722,913,923],[93,102,165,173,177,180,182,183,184,196,914],[93,102,165,173,177,180,182,183,184,196,261,675,708,722,913],[93,102,165,173,177,180,182,183,184,196,916],[102,165,173,177,180,182,183,184,196,718,722,915],[93,102,165,173,177,180,182,183,184,196,926],[102,165,173,177,180,182,183,184,196,722,913,915],[93,102,165,173,177,180,182,183,184,196,928],[93,102,165,173,177,180,182,183,184,196,922],[93,102,165,173,177,180,182,183,184,196,930],[102,165,173,177,180,182,183,184,196,722,927],[102,165,173,177,180,182,183,184,196,913,915,917,919,921,923,925,927,929,931,933,935,937,939,941],[93,102,165,173,177,180,182,183,184,196,932],[93,102,165,173,177,180,182,183,184,196,918],[93,102,165,173,177,180,182,183,184,196,934],[102,165,173,177,180,182,183,184,196,261,675,722],[93,102,165,173,177,180,182,183,184,196,938],[93,102,165,173,177,180,182,183,184,196,936],[102,165,173,177,180,182,183,184,196,722,913,927],[93,102,165,173,177,180,182,183,184,196,940],[93,102,165,173,177,180,182,183,184,196,834,965],[102,165,173,177,180,182,183,184,196,718,832],[93,102,165,173,177,180,182,183,184,196,847,991],[102,165,173,177,180,182,183,184,196,991],[102,165,173,177,180,182,183,184,196,718,845,910],[93,102,165,173,177,180,182,183,184,196,983],[93,102,165,173,177,180,182,183,184,196,1001],[102,165,173,177,180,182,183,184,196,261,675,718,910,953],[93,102,165,173,177,180,182,183,184,196,1054],[93,102,165,173,177,180,182,183,184,196,1058,1059],[93,102,165,173,177,180,182,183,184,196,1058],[93,102,165,173,177,180,182,183,184,196,837,967],[102,165,173,177,180,182,183,184,196,718,837],[93,102,165,173,177,180,182,183,184,196,997],[93,102,165,173,177,180,182,183,184,196,973],[93,102,165,173,177,180,182,183,184,196,1061,1062],[102,165,173,177,180,182,183,184,196,1061],[93,102,165,173,177,180,182,183,184,196,955],[93,102,165,173,177,180,182,183,184,196,718,910],[93,102,165,173,177,180,182,183,184,196,995],[93,102,165,173,177,180,182,183,184,196,768],[102,165,173,177,180,182,183,184,196,768,1111],[93,102,165,173,177,180,182,183,184,196,1064],[93,102,165,173,177,180,182,183,184,196,969],[93,102,165,173,177,180,182,183,184,196,1005],[93,102,165,173,177,180,182,183,184,196,999],[102,165,173,177,180,182,183,184,196,718,910,953],[93,102,165,173,177,180,182,183,184,196,806,1007],[93,102,165,173,177,180,182,183,184,196,261,675,708,910],[93,102,165,173,177,180,182,183,184,196,977],[93,102,165,173,177,180,182,183,184,196,975],[102,165,173,177,180,182,183,184,196,718,776],[93,102,165,173,177,180,182,183,184,196,979],[93,102,165,173,177,180,182,183,184,196,963],[102,165,173,177,180,182,183,184,196,718,827],[93,102,165,173,177,180,182,183,184,196,1079],[93,102,165,173,177,180,182,183,184,196,261,675,1077],[93,102,165,173,177,180,182,183,184,196,1077],[93,102,165,173,177,180,182,183,184,196,1075],[93,102,165,173,177,180,182,183,184,196,1073],[93,102,165,173,177,180,182,183,184,196,1085],[102,165,173,177,180,182,183,184,196,1083],[102,165,173,177,180,182,183,184,196,1072,1074,1076,1078,1080,1082,1084,1086,1087],[93,102,165,173,177,180,182,183,184,196,1081],[93,102,165,173,177,180,182,183,184,196,1083],[93,102,165,173,177,180,182,183,184,196,1071],[102,165,173,177,180,182,183,184,196,556,715],[102,165,173,177,180,182,183,184,196,715,716],[102,165,173,177,180,182,183,184,196,720,722,912,942,944,946,948,950,952,954,956,958,960,962,964,966,968,970,972,974,976,978,980,982,984,986,988,990,992,994,996,998,1000,1002,1004,1006,1008,1011,1044,1053,1055,1057,1060,1063,1065,1067,1068,1069,1070,1072,1074,1076,1078,1080,1082,1084,1086,1088,1095],[102,165,173,177,180,182,183,184,196,1049],[102,165,173,177,180,182,183,184,196,556,1018,1027,1048],[102,165,173,177,180,182,183,184,196,1118,1119],[102,165,173,177,180,182,183,184,196,1115,1116,1117,1118],[102,165,173,177,180,182,183,184,196,1115,1117],[102,165,173,177,180,182,183,184,196,1115],[102,165,173,177,180,182,183,184,196,1119],[102,165,173,177,180,182,183,184,196,718,721],[102,165,173,177,180,182,183,184,196,717],[102,165,173,177,180,182,183,184,196,1009,1010],[102,165,173,177,180,182,183,184,196,1028],[93,102,165,173,177,180,182,183,184,196,1014,1027,1044],[102,165,173,177,180,182,183,184,196,1045],[102,165,173,177,180,182,183,184,196,1045,1046,1047],[102,165,173,177,180,182,183,184,196,1044,1045],[102,165,173,177,180,182,183,184,196,1044],[102,165,173,177,180,182,183,184,196,1027,1048],[102,165,173,177,180,182,183,184,196,1019],[102,165,173,177,180,182,183,184,196,1019,1021,1022,1023],[102,165,173,177,180,182,183,184,196,1019,1020,1021,1022,1023,1024,1025,1026],[93,102,165,173,177,180,182,183,184,196,1019,1020],[93,102,165,173,177,180,182,183,184,196,1044],[102,165,173,177,180,182,183,184,196,556,639,717,1050],[102,165,173,177,180,182,183,184,196,1013],[102,165,173,177,180,182,183,184,196,1030],[102,165,173,177,180,182,183,184,196,1018,1037,1038,1039,1040,1041,1042],[102,165,173,177,180,182,183,184,196,1017,1048],[93,102,165,173,177,180,182,183,184,196,1014,1018,1027,1029,1044],[102,165,173,177,180,182,183,184,196,1012,1030,1036,1043],[102,165,173,177,180,182,183,184,196,1014,1027,1044],[102,165,173,177,180,182,183,184,196,1031,1032,1033,1034,1035],[102,165,173,177,180,182,183,184,196,1098,1099,1100,1104,1109,1113,1114],[102,165,173,177,180,182,183,184,196,556,708,717,747,1009,1014,1044,1050,1051],[93,102,165,173,177,180,182,183,184,196,1051,1052],[102,165,173,177,180,182,183,184,196,708,711,717,1027,1048],[102,165,173,177,180,182,183,184,196,1089],[102,165,173,177,180,182,183,184,196,1027],[102,165,173,177,180,182,183,184,196,1027,1089,1091],[102,165,173,177,180,182,183,184,196,1089,1090,1092,1093,1094],[102,165,173,177,180,182,183,184,196,1129,1130,1131],[102,165,173,177,180,182,183,184,196,1128,1132,1135,1151,1159,1161,1165,1167,1168],[93,102,165,173,177,180,182,183,184,196,1169,1170],[102,165,173,177,180,182,183,184,196,1171],[93,102,165,173,177,180,182,183,184,196,1159,1169],[102,165,173,177,180,182,183,184,196,1128,1132,1135,1159,1161],[93,102,165,173,177,180,182,183,184,196,1173],[102,165,173,177,180,182,183,184,196,1174],[102,165,173,177,180,182,183,184,196,1159],[102,165,173,177,180,182,183,184,196,1128,1132,1135,1159],[93,102,165,173,177,180,182,183,184,196,1176],[102,165,173,177,180,182,183,184,196,1177],[102,165,173,177,180,182,183,184,196,1128,1132,1135,1157,1159,1161,1165,1167,1179],[93,102,165,173,177,180,182,183,184,196,1180,1181],[102,165,173,177,180,182,183,184,196,1182],[93,102,165,173,177,180,182,183,184,196,1159,1179,1180],[93,102,165,173,177,180,182,183,184,196,637,1128,1132,1135,1159,1161,1165,1167,1179,1184,1185,1186],[93,102,165,173,177,180,182,183,184,196,1187,1188],[102,165,173,177,180,182,183,184,196,1189],[93,102,165,173,177,180,182,183,184,196,1159,1179,1187],[93,102,165,173,177,180,182,183,184,196,1128,1132,1135,1157,1159,1161,1165,1167,1179,1184,1185,1186],[93,102,165,173,177,180,182,183,184,196,1191],[102,165,173,177,180,182,183,184,196,1192],[93,102,165,173,177,180,182,183,184,196,1159,1179],[102,165,173,177,180,182,183,184,196,1172,1175,1178,1183,1190,1193,1196,1199,1203,1207,1210,1214],[93,102,165,173,177,180,182,183,184,196,1194],[102,165,173,177,180,182,183,184,196,1195],[93,102,165,173,177,180,182,183,184,196,637,1128,1132,1135,1157,1159,1161,1165,1167,1179,1184,1185,1186],[93,102,165,173,177,180,182,183,184,196,1157,1159,1179],[93,102,165,173,177,180,182,183,184,196,1197],[102,165,173,177,180,182,183,184,196,1198],[102,165,173,177,180,182,183,184,196,1128,1132,1135,1159,1161,1165],[93,102,165,173,177,180,182,183,184,196,1200,1201],[102,165,173,177,180,182,183,184,196,1202],[102,165,173,177,180,182,183,184,196,1128,1132,1135,1157,1159,1161,1165,1167,1179,1185],[93,102,165,173,177,180,182,183,184,196,1159,1179,1200],[93,102,165,173,177,180,182,183,184,196,1204,1205],[102,165,173,177,180,182,183,184,196,1206],[102,165,173,177,180,182,183,184,196,1159,1204],[93,102,165,173,177,180,182,183,184,196,1208],[102,165,173,177,180,182,183,184,196,1209],[93,102,165,173,177,180,182,183,184,196,1211,1212],[102,165,173,177,180,182,183,184,196,1213],[93,102,165,173,177,180,182,183,184,196,637,1128,1132,1135,1157,1159,1161,1165,1167,1179],[102,165,173,177,180,182,183,184,196,1128,1135,1159],[102,165,173,177,180,182,183,184,196,1144],[102,165,173,177,180,182,183,184,196,1147],[102,165,173,177,180,182,183,184,196,1146,1147,1148],[102,165,173,177,180,182,183,184,196,1162,1163],[102,165,173,177,180,182,183,184,196,518,1142,1159],[102,165,173,177,180,182,183,184,196,545,546],[102,165,173,177,180,182,183,184,196,1150],[102,165,173,177,180,182,183,184,196,1128,1132,1135,1137,1145,1149,1151,1159,1161,1164,1165],[102,165,173,177,180,182,183,184,196,1138,1159],[102,165,173,177,180,182,183,184,196,1138,1160],[93,102,165,173,177,180,182,183,184,196,637,1128,1149,1161],[102,165,173,177,180,182,183,184,196,637,689,1128,1135,1145,1149,1151,1153,1154,1159],[102,165,173,177,180,182,183,184,196,1152,1153,1154,1155,1156],[93,102,165,173,177,180,182,183,184,196,637,689,1149],[93,102,165,173,177,180,182,183,184,196,689,1128,1155,1159],[102,165,173,177,180,182,183,184,196,689,1128,1152,1153],[93,102,165,173,177,180,182,183,184,196,637,699,1128],[102,165,173,177,180,182,183,184,196,1167,1168,1179,1184,1185,1186],[102,165,173,177,180,182,183,184,196,637,1128],[93,102,165,173,177,180,182,183,184,196,637,1128,1149,1151],[93,102,165,173,177,180,182,183,184,196,637,1128,1149],[102,165,173,177,180,182,183,184,196,1136],[102,165,173,177,180,182,183,184,196,655],[102,165,173,177,180,182,183,184,196,1133,1134],[93,102,165,173,177,180,182,183,184,196,1128,1132,1133],[102,165,173,177,180,182,183,184,196,1127],[93,102,165,173,177,180,182,183,184,196,1128],[102,165,173,177,180,182,183,184,196,261,675],[102,165,173,177,180,182,183,184,196,1139,1140,1141,1143,1157,1158],[102,165,173,177,180,182,183,184,196,1139,1142],[93,102,165,173,177,180,182,183,184,196,637,639,649,707,708,729],[93,102,165,173,177,180,182,183,184,196,730,731],[102,165,173,177,180,182,183,184,196,732],[102,165,173,177,180,182,183,184,196,708],[93,102,165,173,177,180,182,183,184,196,853],[102,165,173,177,180,182,183,184,196,854],[102,165,173,177,180,182,183,184,196,708,852],[102,165,173,177,180,182,183,184,196,707,708,729],[93,102,165,173,177,180,182,183,184,196,723],[102,165,173,177,180,182,183,184,196,724],[102,165,173,177,180,182,183,184,196,261,637,639,675,707,708,729],[93,102,165,173,177,180,182,183,184,196,726],[102,165,173,177,180,182,183,184,196,727],[93,102,165,173,177,180,182,183,184,196,712],[102,165,173,177,180,182,183,184,196,713],[102,165,173,177,180,182,183,184,196,261,675,708],[93,102,165,173,177,180,182,183,184,196,565,637,639,682,707,708,729,746,747,1228,1232,1233,1234],[93,102,165,173,177,180,182,183,184,196,872],[102,165,173,177,180,182,183,184,196,873],[102,165,173,177,180,182,183,184,196,565,708,711],[102,165,173,177,180,182,183,184,196,637,639,707,708,729],[93,102,165,173,177,180,182,183,184,196,734],[102,165,173,177,180,182,183,184,196,735],[93,102,165,173,177,180,182,183,184,196,637,639,649,704,707,708,729],[93,102,165,173,177,180,182,183,184,196,737],[102,165,173,177,180,182,183,184,196,738],[93,102,165,173,177,180,182,183,184,196,895],[102,165,173,177,180,182,183,184,196,896],[102,165,173,177,180,182,183,184,196,708,892],[102,165,173,177,180,182,183,184,196,637,639,649,677,707,708,711,729,746,747,848,849,1238],[93,102,165,173,177,180,182,183,184,196,848,849],[102,165,173,177,180,182,183,184,196,850],[93,102,165,173,177,180,182,183,184,196,842],[102,165,173,177,180,182,183,184,196,843],[102,165,173,177,180,182,183,184,196,708,838],[93,102,165,173,177,180,182,183,184,196,565,637,639,649,707,708,729,746,747,1228,1232,1240],[93,102,165,173,177,180,182,183,184,196,880],[102,165,173,177,180,182,183,184,196,881],[102,165,173,177,180,182,183,184,196,565,708,711,879],[102,165,173,177,180,182,183,184,196,565,639,708,879],[93,102,165,173,177,180,182,183,184,196,883],[102,165,173,177,180,182,183,184,196,884],[102,165,173,177,180,182,183,184,196,565,645,708,711,836,872,879,880],[102,165,173,177,180,182,183,184,196,565,637,639,707,708,729,879,1230,1231,1232,1241],[93,102,165,173,177,180,182,183,184,196,904],[102,165,173,177,180,182,183,184,196,905],[102,165,173,177,180,182,183,184,196,565,708,711,879,880],[93,102,165,173,177,180,182,183,184,196,907],[102,165,173,177,180,182,183,184,196,908],[102,165,173,177,180,182,183,184,196,565,645,708,711,836,872,875,879,904],[102,165,173,177,180,182,183,184,196,637,639,649,704,707,708,729,746,747],[93,102,165,173,177,180,182,183,184,196,852],[102,165,173,177,180,182,183,184,196,856],[102,165,173,177,180,182,183,184,196,261,675,708,709],[93,102,165,173,177,180,182,183,184,196,637,679,682,708],[102,165,173,177,180,182,183,184,196,668,708],[102,165,173,177,180,182,183,184,196,679,708],[102,165,173,177,180,182,183,184,196,680],[102,165,173,177,180,182,183,184,196,682,708],[102,165,173,177,180,182,183,184,196,699,708],[93,102,165,173,177,180,182,183,184,196,858],[102,165,173,177,180,182,183,184,196,859],[102,165,173,177,180,182,183,184,196,645,676,852],[93,102,165,173,177,180,182,183,184,196,839],[102,165,173,177,180,182,183,184,196,840],[102,165,173,177,180,182,183,184,196,838],[102,165,173,177,180,182,183,184,196,639,707,708,729],[93,102,165,173,177,180,182,183,184,196,786],[102,165,173,177,180,182,183,184,196,787],[93,102,165,173,177,180,182,183,184,196,861],[102,165,173,177,180,182,183,184,196,639,707,708,729,861,1246],[102,165,173,177,180,182,183,184,196,639,707,708,729,861],[102,165,173,177,180,182,183,184,196,862],[93,102,165,173,177,180,182,183,184,196,799,800],[102,165,173,177,180,182,183,184,196,639,707,708,729,746,747],[102,165,173,177,180,182,183,184,196,801],[102,165,173,177,180,182,183,184,196,708,799],[93,102,165,173,177,180,182,183,184,196,864],[102,165,173,177,180,182,183,184,196,865],[102,165,173,177,180,182,183,184,196,708,714,725,728,733,736,739,742,745,751,754,757,761,764,767,770,773,776,779,782,785,788,792,794,798,802,806,811,814,817,820,823,827,834,837,841,844,847,851,855,857,860,863,866,871,874,877,882,885,894,897,900,903,906,909],[93,102,165,173,177,180,182,183,184,196,740],[102,165,173,177,180,182,183,184,196,741],[93,102,165,173,177,180,182,183,184,196,828],[102,165,173,177,180,182,183,184,196,708,747],[102,165,173,177,180,182,183,184,196,1251],[102,165,173,177,180,182,183,184,196,1252],[93,102,165,173,177,180,182,183,184,196,830],[93,102,165,173,177,180,182,183,184,196,708],[93,102,165,173,177,180,182,183,184,196,548,560,637,708,830,1256],[93,102,165,173,177,180,182,183,184,196,831],[93,102,165,173,177,180,182,183,184,196,548,637,708,831],[93,102,165,173,177,180,182,183,184,196,691],[102,165,173,177,180,182,183,184,196,691,692,693,694,695],[93,102,165,173,177,180,182,183,184,196,637,689,708],[93,102,165,173,177,180,182,183,184,196,689,690,708],[102,165,173,177,180,182,183,184,196,637,639,689,708],[102,165,173,177,180,182,183,184,196,689,691,693,708],[102,165,173,177,180,182,183,184,196,708,1260],[93,102,165,173,177,180,182,183,184,196,889],[93,102,165,173,177,180,182,183,184,196,637,699,708,1261],[93,102,165,173,177,180,182,183,184,196,891],[93,102,165,173,177,180,182,183,184,196,691,708,830,831,887,888,889,890],[93,102,165,173,177,180,182,183,184,196,709],[93,102,165,173,177,180,182,183,184,196,888],[102,165,173,177,180,182,183,184,196,637,703,708],[93,102,165,173,177,180,182,183,184,196,637,708],[93,102,165,173,177,180,182,183,184,196,887],[93,102,165,173,177,180,182,183,184,196,548,637,708,887],[93,102,165,173,177,180,182,183,184,196,1269],[93,102,165,173,177,180,182,183,184,196,832],[102,165,173,177,180,182,183,184,196,833],[93,102,165,173,177,180,182,183,184,196,637,639,707,708,729],[93,102,165,173,177,180,182,183,184,196,676,691,708,709,829,830,831],[93,102,165,173,177,180,182,183,184,196,838],[102,165,173,177,180,182,183,184,196,1272],[102,165,173,177,180,182,183,184,196,261,529,637,639,649,675,679,680,685,697,699,700,702,704,706,707,708,729,1255],[102,165,173,177,180,182,183,184,196,690,708],[102,165,173,177,180,182,183,184,196,649,708],[93,102,165,173,177,180,182,183,184,196,845],[102,165,173,177,180,182,183,184,196,846],[93,102,165,173,177,180,182,183,184,196,261,529,637,639,649,675,697,707,708,729],[93,102,165,173,177,180,182,183,184,196,743],[102,165,173,177,180,182,183,184,196,744],[93,102,165,173,177,180,182,183,184,196,780],[102,165,173,177,180,182,183,184,196,781],[102,165,173,177,180,182,183,184,196,519,637,639,707,708,729,746,747,1276],[102,165,173,177,180,182,183,184,196,518,708],[93,102,165,173,177,180,182,183,184,196,749],[102,165,173,177,180,182,183,184,196,750],[102,165,173,177,180,182,183,184,196,639,649,650,681,707,708,711,729,746,747],[102,165,173,177,180,182,183,184,196,708,748],[93,102,165,173,177,180,182,183,184,196,809],[102,165,173,177,180,182,183,184,196,807,810],[93,102,165,173,177,180,182,183,184,196,637,707,708,729,807,808],[93,102,165,173,177,180,182,183,184,196,261,675,708],[102,165,173,177,180,182,183,184,196,708,807],[102,165,173,177,180,182,183,184,196,835,836],[102,165,173,177,180,182,183,184,196,637,639,649,699,707,708,729],[93,102,165,173,177,180,182,183,184,196,690,708,828],[93,102,165,173,177,180,182,183,184,196,752],[102,165,173,177,180,182,183,184,196,753],[93,102,165,173,177,180,182,183,184,196,755],[102,165,173,177,180,182,183,184,196,756],[102,165,173,177,180,182,183,184,196,548,637,639,649,697,707,708,729],[93,102,165,173,177,180,182,183,184,196,875],[102,165,173,177,180,182,183,184,196,876],[93,102,165,173,177,180,182,183,184,196,565,637,639,674,707,708,729,746,747,1228,1229,1233,1234,1235],[102,165,173,177,180,182,183,184,196,565,708,711,872],[93,102,165,173,177,180,182,183,184,196,759],[102,165,173,177,180,182,183,184,196,760],[102,165,173,177,180,182,183,184,196,548,639,649,707,708,711,729,746,747],[102,165,173,177,180,182,183,184,196,708,758],[93,102,165,173,177,180,182,183,184,196,812],[102,165,173,177,180,182,183,184,196,812,813],[93,102,165,173,177,180,182,183,184,196,485,637,639,672,684,707,708,729,812],[93,102,165,173,177,180,182,183,184,196,886,892],[102,165,173,177,180,182,183,184,196,893],[93,102,165,173,177,180,182,183,184,196,529,548,637,639,645,707,708,729],[102,165,173,177,180,182,183,184,196,261,645,675,676,709,828,891],[93,102,165,173,177,180,182,183,184,196,762],[102,165,173,177,180,182,183,184,196,763],[102,165,173,177,180,182,183,184,196,815,816],[93,102,165,173,177,180,182,183,184,196,485,529,637,639,649,679,707,708,729,816,1284],[102,165,173,177,180,182,183,184,196,769],[102,165,173,177,180,182,183,184,196,639,645,707,708,729,768],[93,102,165,173,177,180,182,183,184,196,796],[102,165,173,177,180,182,183,184,196,797],[102,165,173,177,180,182,183,184,196,639,707,708,711,729,746,747],[102,165,173,177,180,182,183,184,196,708,795],[93,102,165,173,177,180,182,183,184,196,789,790],[102,165,173,177,180,182,183,184,196,791],[102,165,173,177,180,182,183,184,196,708,789],[93,102,165,173,177,180,182,183,184,196,765],[102,165,173,177,180,182,183,184,196,766],[102,165,173,177,180,182,183,184,196,639,649,707,708,729],[102,165,173,177,180,182,183,184,196,710,711],[93,102,165,173,177,180,182,183,184,196,640,711,746,747,867,868,869,870],[102,165,173,177,180,182,183,184,196,871],[102,165,173,177,180,182,183,184,196,565,708,747],[102,165,173,177,180,182,183,184,196,639,708,711,746],[102,165,173,177,180,182,183,184,196,708,711],[102,165,173,177,180,182,183,184,196,565,640,708,709,710],[93,102,165,173,177,180,182,183,184,196,771],[102,165,173,177,180,182,183,184,196,772],[93,102,165,173,177,180,182,183,184,196,637,639,707,708,729,771],[93,102,165,173,177,180,182,183,184,196,783],[102,165,173,177,180,182,183,184,196,784],[102,165,173,177,180,182,183,184,196,637,639,707,708,729,746,747],[93,102,165,173,177,180,182,183,184,196,898],[102,165,173,177,180,182,183,184,196,899],[93,102,165,173,177,180,182,183,184,196,565,637,639,707,708,729,746,747,879,1228,1230,1232,1289],[93,102,165,173,177,180,182,183,184,196,901],[102,165,173,177,180,182,183,184,196,902],[102,165,173,177,180,182,183,184,196,565,637,639,707,708,729,879,1230,1232,1289,1290],[102,165,173,177,180,182,183,184,196,565,708,711,879,898],[93,102,165,173,177,180,182,183,184,196,803,804],[102,165,173,177,180,182,183,184,196,805],[102,165,173,177,180,182,183,184,196,708,803],[93,102,165,173,177,180,182,183,184,196,777],[102,165,173,177,180,182,183,184,196,778],[102,165,173,177,180,182,183,184,196,548,639,649,697,707,708,729],[93,102,165,173,177,180,182,183,184,196,774],[102,165,173,177,180,182,183,184,196,775],[102,165,173,177,180,182,183,184,196,548,707,708,729],[93,102,165,173,177,180,182,183,184,196,818],[102,165,173,177,180,182,183,184,196,819],[102,165,173,177,180,182,183,184,196,639,649,697,707,708,729],[93,102,165,173,177,180,182,183,184,196,824],[102,165,173,177,180,182,183,184,196,825,826],[93,102,165,173,177,180,182,183,184,196,637,639,673,679,704,707,708,729],[93,102,165,173,177,180,182,183,184,196,690,708,824],[93,102,165,173,177,180,182,183,184,196,793],[102,165,173,177,180,182,183,184,196,708,711,746,747],[93,102,165,173,177,180,182,183,184,196,645],[102,165,173,177,180,182,183,184,196,529,643,708],[102,165,173,177,180,182,183,184,196,637,638],[102,165,173,177,180,182,183,184,196,656,657,658],[102,165,173,177,180,182,183,184,196,557,645,656],[102,165,173,177,180,182,183,184,196,642,1297],[93,102,165,173,177,180,182,183,184,196,529,565,637,649,679,708,729,1229,1233],[102,165,173,177,180,182,183,184,196,565,643],[102,165,173,177,180,182,183,184,196,565,649,674,679,708,878,879,1229,1230],[102,165,173,177,180,182,183,184,196,878,879,1229,1230,1231],[102,165,173,177,180,182,183,184,196,649,679,1231],[102,165,173,177,180,182,183,184,196,565,674,679,708,878,879,1229,1230],[102,165,173,177,180,182,183,184,196,878],[102,165,173,177,180,182,183,184,196,643,652],[93,102,165,173,177,180,182,183,184,196,643],[102,165,173,177,180,182,183,184,196,637,645],[102,165,173,177,180,182,183,184,196,637,643,645,663],[102,165,173,177,180,182,183,184,196,646],[102,165,173,177,180,182,183,184,196,557,639,641,643,644,645,647,649,650,651,652,653,654,659,660,662,663,664,665,666,667,668,669,670,671,672,673,674,676,677,678,679,680,681,683,684,685,696,697,698,700,701,702,703,704,705,706,707],[102,165,173,177,180,182,183,184,196,645,649],[102,165,173,177,180,182,183,184,196,648,649,650],[93,102,165,173,177,180,182,183,184,196,645,708],[102,165,173,177,180,182,183,184,196,648],[102,165,173,177,180,182,183,184,196,640],[102,165,173,177,180,182,183,184,196,645,652,653,654,655,659,660,661],[102,165,173,177,180,182,183,184,196,645],[102,165,173,177,180,182,183,184,196,643],[102,165,173,177,180,182,183,184,196,1300,1301],[102,165,173,177,180,182,183,184,196,556],[102,165,173,177,180,182,183,184,196,1300,1301,1303],[102,165,173,177,180,182,183,184,196,1300],[102,165,173,177,180,182,183,184,196,1300,1301,1302,1303,1304,1305],[102,165,173,177,180,182,183,184,196,645,708],[93,102,165,173,177,180,182,183,184,196,642,643,644,1297],[102,165,173,177,180,182,183,184,196,682],[93,102,165,173,177,180,182,183,184,196,821],[102,165,173,177,180,182,183,184,196,822],[102,165,173,177,180,182,183,184,196,639,707,708,729,821],[102,165,173,177,180,182,183,184,188,196,213,259,396,456,467]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"2ab096661c711e4a81cc464fa1e6feb929a54f5340b46b0a07ac6bbf857471f0","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"73f78680d4c08509933daf80947902f6ff41b6230f94dd002ae372620adb0f60","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5239f5c01bcfa9cd32f37c496cf19c61d69d37e48be9de612b541aac915805b","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"e134052a6b1ded61693b4037f615dc72f14e2881e79c1ddbff6c514c8a516b05","impliedFormat":1},{"version":"33a1caf57a6f7318c7ce2c8a8a35137bd7c064d140f324e8f47b94cd129305b5","impliedFormat":1},{"version":"cc512139c85c41ba2dc95076b1ce05786c98129bcfe875017946ba2c82607ef1","impliedFormat":1},{"version":"12bffdbf179bfe787334d1aa31393bac5b79a84d2285ad94bcf36c1cce9eed57","impliedFormat":1},{"version":"e81484fc62d5e6add90882339bb2cdba0c87b85ca4002add438d0771ce2fdfa7","impliedFormat":1},{"version":"92ebc3261b20037c4e078cd3d26bccedb719b3eec653925e103b6ced4a936c0d","impliedFormat":1},{"version":"d8f8d36a0350f1b4e25f0d6c8cab7fb484a770cb02c4c92b8215ad421615d248","impliedFormat":99},{"version":"2be2227c3810dfd84e46674fd33b8d09a4a28ad9cb633ed536effd411665ea1e","impliedFormat":99},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"ecd7b4429a2b12f50ef619043fca298eb99a9b7f9e8edabd60c9bbb7fa8f036b","impliedFormat":99},{"version":"327a4d13326928f96dd7f2adff6f0a81b78f24213881ab524102f0d495093426","affectsGlobalScope":true,"impliedFormat":99},{"version":"a7ca8df4f2931bef2aa4118078584d84a0b16539598eaadf7dce9104dfaa381c","impliedFormat":1},{"version":"72950913f4900b680f44d8cab6dd1ea0311698fc1eefb014eb9cdfc37ac4a734","impliedFormat":1},{"version":"36977c14a7f7bfc8c0426ae4343875689949fb699f3f84ecbe5b300ebf9a2c55","impliedFormat":1},{"version":"59f8dc89b9e724a6a667f52cdf4b90b6816ae6c9842ce176d38fcc973669009e","affectsGlobalScope":true,"impliedFormat":1},{"version":"474eba6689e97bf58edd28c90524e70f4fb11820df66752182a1ad1ff9970bb2","affectsGlobalScope":true,"impliedFormat":1},{"version":"1eef826bc4a19de22155487984e345a34c9cd511dd1170edc7a447cb8231dd4a","affectsGlobalScope":true,"impliedFormat":99},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ccdaa19852d25ecd84eec365c3bfa16e7859cadecf6e9ca6d0dbbbee439743f","affectsGlobalScope":true,"impliedFormat":1},{"version":"438b41419b1df9f1fbe33b5e1b18f5853432be205991d1b19f5b7f351675541e","affectsGlobalScope":true,"impliedFormat":1},{"version":"096116f8fedc1765d5bd6ef360c257b4a9048e5415054b3bf3c41b07f8951b0b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5e01375c9e124a83b52ee4b3244ed1a4d214a6cfb54ac73e164a823a4a7860a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f90ae2bbce1505e67f2f6502392e318f5714bae82d2d969185c4a6cecc8af2fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b58e207b93a8f1c88bbf2a95ddc686ac83962b13830fe8ad3f404ffc7051fb4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1fefabcb2b06736a66d2904074d56268753654805e829989a46a0161cd8412c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"c18a99f01eb788d849ad032b31cafd49de0b19e083fe775370834c5675d7df8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"5247874c2a23b9a62d178ae84f2db6a1d54e6c9a2e7e057e178cc5eea13757fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"156a859e21ef3244d13afeeba4e49760a6afa035c149dda52f0c45ea8903b338","impliedFormat":1},{"version":"10ec5e82144dfac6f04fa5d1d6c11763b3e4dbbac6d99101427219ab3e2ae887","impliedFormat":1},{"version":"615754924717c0b1e293e083b83503c0a872717ad5aa60ed7f1a699eb1b4ea5c","impliedFormat":1},{"version":"074de5b2fdead0165a2757e3aaef20f27a6347b1c36adea27d51456795b37682","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"24371e69a38fc33e268d4a8716dbcda430d6c2c414a99ff9669239c4b8f40dea","impliedFormat":1},{"version":"ccab02f3920fc75c01174c47fcf67882a11daf16baf9e81701d0a94636e94556","impliedFormat":1},{"version":"3e11fce78ad8c0e1d1db4ba5f0652285509be3acdd519529bc8fcef85f7dafd9","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"9c32412007b5662fd34a8eb04292fb5314ec370d7016d1c2fb8aa193c807fe22","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"4d327f7d72ad0918275cea3eee49a6a8dc8114ae1d5b7f3f5d0774de75f7439a","impliedFormat":1},{"version":"6ebe8ebb8659aaa9d1acbf3710d7dae3e923e97610238b9511c25dc39023a166","impliedFormat":1},{"version":"e85d7f8068f6a26710bff0cc8c0fc5e47f71089c3780fbede05857331d2ddec9","impliedFormat":1},{"version":"7befaf0e76b5671be1d47b77fcc65f2b0aad91cc26529df1904f4a7c46d216e9","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"8aee8b6d4f9f62cf3776cda1305fb18763e2aade7e13cea5bbe699112df85214","impliedFormat":1},{"version":"c63b9ada8c72f95aac5db92aea07e5e87ec810353cdf63b2d78f49a58662cf6c","impliedFormat":1},{"version":"1cc2a09e1a61a5222d4174ab358a9f9de5e906afe79dbf7363d871a7edda3955","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"b64d4d1c5f877f9c666e98e833f0205edb9384acc46e98a1fef344f64d6aba44","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"12950411eeab8563b349cb7959543d92d8d02c289ed893d78499a19becb5a8cc","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"c9381908473a1c92cb8c516b184e75f4d226dad95c3a85a5af35f670064d9a2f","impliedFormat":1},{"version":"c3f5289820990ab66b70c7fb5b63cb674001009ff84b13de40619619a9c8175f","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3275d55fac10b799c9546804126239baf020d220136163f763b55a74e50e750","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa68a0a3b7cb32c00e39ee3cd31f8f15b80cac97dce51b6ee7fc14a1e8deb30b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c36e755bced82df7fb6ce8169265d0a7bb046ab4e2cb6d0da0cb72b22033e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a93de4ff8a63bafe62ba86b89af1df0ccb5e40bb85b0c67d6bbcfdcf96bf3d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"90e85f9bc549dfe2b5749b45fe734144e96cd5d04b38eae244028794e142a77e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0a5deeb610b2a50a6350bd23df6490036a1773a8a71d70f2f9549ab009e67ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"3fad5618174d74a34ee006406d4eb37e8d07dd62eb1315dbf52f48d31a337547","impliedFormat":1},{"version":"7e49f52a159435fc8df4de9dc377ef5860732ca2dc9efec1640531d3cf5da7a3","impliedFormat":1},{"version":"dd4bde4bdc2e5394aed6855e98cf135dfdf5dd6468cad842e03116d31bbcc9bc","impliedFormat":1},{"version":"4d4e879009a84a47c05350b8dca823036ba3a29a3038efed1be76c9f81e45edf","affectsGlobalScope":true,"impliedFormat":1},{"version":"8b50a819485ffe0d237bf0d131e92178d14d11e2aa873d73615a9ec578b341f5","impliedFormat":1},{"version":"9ba13b47cb450a438e3076c4a3f6afb9dc85e17eae50f26d4b2d72c0688c9251","impliedFormat":1},{"version":"b64cd4401633ea4ecadfd700ddc8323a13b63b106ac7127c1d2726f32424622c","impliedFormat":1},{"version":"37c6e5fe5715814412b43cc9b50b24c67a63c4e04e753e0d1305970d65417a60","impliedFormat":1},{"version":"1d024184fb57c58c5c91823f9d10b4915a4867b7934e89115fd0d861a9df27c8","impliedFormat":1},{"version":"ee0e4946247f842c6dd483cbb60a5e6b484fee07996e3a7bc7343dfb68a04c5d","impliedFormat":1},{"version":"ef051f42b7e0ef5ca04552f54c4552eac84099d64b6c5ad0ef4033574b6035b8","impliedFormat":1},{"version":"853a43154f1d01b0173d9cbd74063507ece57170bad7a3b68f3fa1229ad0a92f","impliedFormat":1},{"version":"56231e3c39a031bfb0afb797690b20ed4537670c93c0318b72d5180833d98b72","impliedFormat":1},{"version":"5cc7c39031bfd8b00ad58f32143d59eb6ffc24f5d41a20931269011dccd36c5e","impliedFormat":1},{"version":"12d602a8fe4c2f2ba4f7804f5eda8ba07e0c83bf5cf0cda8baffa2e9967bfb77","affectsGlobalScope":true,"impliedFormat":1},{"version":"a856ab781967b62b288dfd85b860bef0e62f005ed4b1b8fa25c53ce17856acaf","impliedFormat":1},{"version":"cc25940cfb27aa538e60d465f98bb5068d4d7d33131861ace43f04fe6947d68f","impliedFormat":1},{"version":"8db46b61a690f15b245cf16270db044dc047dce9f93b103a59f50262f677ea1f","impliedFormat":1},{"version":"01ff95aa1443e3f7248974e5a771f513cb2ac158c8898f470a1792f817bee497","impliedFormat":1},{"version":"757227c8b345c57d76f7f0e3bbad7a91ffca23f1b2547cbed9e10025816c9cb7","impliedFormat":1},{"version":"959d0327c96dd9bb5521f3ed6af0c435996504cc8dd46baa8e12cb3b3518cef1","impliedFormat":1},{"version":"e1c1a0b4d1ead0de9eca52203aeb1f771f21e6238d6fcd15aa56ac2a02f1b7bf","impliedFormat":1},{"version":"101f482fd48cb4c7c0468dcc6d62c843d842977aea6235644b1edd05e81fbf22","impliedFormat":1},{"version":"266bee0a41e9c3ba335583e21e9277ae03822402cf5e8e1d99f5196853613b98","affectsGlobalScope":true,"impliedFormat":1},{"version":"386606f8a297988535cb1401959041cfa7f59d54b8a9ed09738e65c98684c976","impliedFormat":1},{"version":"3ef397f12387eff17f550bc484ea7c27d21d43816bbe609d495107f44b97e933","impliedFormat":1},{"version":"1023282e2ba810bc07905d3668349fbd37a26411f0c8f94a70ef3c05fe523fcf","impliedFormat":1},{"version":"b214ebcf76c51b115453f69729ee8aa7b7f8eccdae2a922b568a45c2d7ff52f7","impliedFormat":1},{"version":"429c9cdfa7d126255779efd7e6d9057ced2d69c81859bbab32073bad52e9ba76","impliedFormat":1},{"version":"e236b5eba291f51bdf32c231673e6cab81b5410850e61f51a7a524dddadc0f95","impliedFormat":1},{"version":"ce8653341224f8b45ff46d2a06f2cacb96f841f768a886c9d8dd8ec0878b11bd","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f2c62938251b45715fd2a9887060ec4fbc8724727029d1cbce373747252bdd7","impliedFormat":1},{"version":"e3ace08b6bbd84655d41e244677b474fd995923ffef7149ddb68af8848b60b05","impliedFormat":1},{"version":"132580b0e86c48fab152bab850fc57a4b74fe915c8958d2ccb052b809a44b61c","impliedFormat":1},{"version":"90a278f5fab7557e69e97056c0841adf269c42697194f0bd5c5e69152637d4b3","impliedFormat":1},{"version":"69c9a5a9392e8564bd81116e1ed93b13205201fb44cb35a7fde8c9f9e21c4b23","impliedFormat":1},{"version":"5f8fc37f8434691ffac1bfd8fc2634647da2c0e84253ab5d2dd19a7718915b35","impliedFormat":1},{"version":"5981c2340fd8b076cae8efbae818d42c11ffc615994cb060b1cd390795f1be2b","impliedFormat":1},{"version":"f263485c9ca90df9fe7bb3a906db9701997dc6cae86ace1f8106ac8d2f7f677b","impliedFormat":1},{"version":"1edcf2f36fc332615846bde6dcc71a8fe526065505bc5e3dcfd65a14becdf698","affectsGlobalScope":true,"impliedFormat":1},{"version":"0250da3eb85c99624f974e77ef355cdf86f43980251bc371475c2b397ba55bcd","impliedFormat":1},{"version":"f1c93e046fb3d9b7f8249629f4b63dc068dd839b824dd0aa39a5e68476dc9420","impliedFormat":1},{"version":"3d3a5f27ffbc06c885dd4d5f9ee20de61faf877fe2c3a7051c4825903d9a7fdc","impliedFormat":1},{"version":"12806f9f085598ef930edaf2467a5fa1789a878fba077cd27e85dc5851e11834","impliedFormat":1},{"version":"1dbca38aa4b0db1f4f9e6edacc2780af7e028b733d2a98dd3598cd235ca0c97d","impliedFormat":1},{"version":"a43fe41c33d0a192a0ecaf9b92e87bef3709c9972e6d53c42c49251ccb962d69","impliedFormat":1},{"version":"a177959203c017fad3ecc4f3d96c8757a840957a4959a3ae00dab9d35961ca6c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc727ccf9b36e257ff982ea0badeffbfc2c151802f741bddff00c6af3b784cf","impliedFormat":1},{"version":"19143c930aef7ccf248549f3e78992f2f1049118ec5d4622e95025057d8e392b","impliedFormat":1},{"version":"4844a4c9b4b1e812b257676ed8a80b3f3be0e29bf05e742cc2ea9c3c6865e6c6","impliedFormat":1},{"version":"064878a60367e0407c42fb7ba02a2ea4d83257357dc20088e549bd4d89433e9c","impliedFormat":1},{"version":"cca8917838a876e2d7016c9b6af57cbf11fdf903c5fdd8e613fa31840b2957bf","impliedFormat":1},{"version":"d91ae55e4282c22b9c21bc26bd3ef637d3fe132507b10529ae68bf76f5de785b","impliedFormat":1},{"version":"b484ec11ba00e3a2235562a41898d55372ccabe607986c6fa4f4aba72093749f","impliedFormat":1},{"version":"7e8a671604329e178bb479c8f387715ebd40a091fc4a7552a0a75c2f3a21c65c","impliedFormat":1},{"version":"41ef7992c555671a8fe54db302788adefa191ded810a50329b79d20a6772d14c","impliedFormat":1},{"version":"041a7781b9127ab568d2cdcce62c58fdea7c7407f40b8c50045d7866a2727130","impliedFormat":1},{"version":"4c5e90ddbcd177ad3f2ffc909ae217c87820f1e968f6959e4b6ba38a8cec935e","impliedFormat":1},{"version":"b70dd9a44e1ac42f030bb12e7d79117eac7cb74170d72d381a1e7913320af23a","impliedFormat":1},{"version":"55cdbeebe76a1fa18bbd7e7bf73350a2173926bd3085bb050cf5a5397025ee4e","impliedFormat":1},{"version":"10073cdcf56982064c5337787cc59b79586131e1b28c106ede5bff362f912b70","impliedFormat":99},{"version":"ee70b8037ecdf0de6c04f35277f253663a536d7e38f1539d270e4e916d225a3f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a660aa95476042d3fdcc1343cf6bb8fdf24772d31712b1db321c5a4dcc325434","impliedFormat":1},{"version":"ff0a83c9a0489a627e264ffcb63f2264b935b20a502afa3a018848139e3d8575","impliedFormat":99},{"version":"161c8e0690c46021506e32fda85956d785b70f309ae97011fd27374c065cac9b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f582b0fcbf1eea9b318ab92fb89ea9ab2ebb84f9b60af89328a91155e1afce72","impliedFormat":1},{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"7965dc3c7648e2a7a586d11781cabb43d4859920716bc2fdc523da912b06570d","impliedFormat":1},{"version":"90c2bd9a3e72fe08b8fa5982e78cb8dc855a1157b26e11e37a793283c52bf64b","impliedFormat":1},{"version":"a8122fe390a2a987079e06c573b1471296114677923c1c094c24a53ddd7344a2","impliedFormat":1},{"version":"70c2cb19c0c42061a39351156653aa0cf5ba1ecdc8a07424dd38e3a1f1e3c7f4","impliedFormat":1},{"version":"a8fb10fd8c7bc7d9b8f546d4d186d1027f8a9002a639bec689b5000dab68e35c","impliedFormat":1},{"version":"c9b467ea59b86bd27714a879b9ad43c16f186012a26d0f7110b1322025ceaa83","impliedFormat":1},{"version":"57ea19c2e6ba094d8087c721bac30ff1c681081dbd8b167ac068590ef633e7a5","impliedFormat":1},{"version":"cba81ec9ae7bc31a4dc56f33c054131e037649d6b9a2cfa245124c67e23e4721","impliedFormat":1},{"version":"ad193f61ba708e01218496f093c23626aa3808c296844a99189be7108a9c8343","impliedFormat":1},{"version":"a0544b3c8b70b2f319a99ea380b55ab5394ede9188cdee452a5d0ce264f258b2","impliedFormat":1},{"version":"8c654c17c334c7c168c1c36e5336896dc2c892de940886c1639bebd9fc7b9be4","impliedFormat":1},{"version":"6a4da742485d5c2eb6bcb322ae96993999ffecbd5660b0219a5f5678d8225bb0","impliedFormat":1},{"version":"c65ca21d7002bdb431f9ab3c7a6e765a489aa5196e7e0ef00aed55b1294df599","impliedFormat":1},{"version":"c8fc655c2c4bafc155ceee01c84ab3d6c03192ced5d3f2de82e20f3d1bd7f9fa","impliedFormat":1},{"version":"be5a7ff3b47f7e553565e9483bdcadb0ca2040ac9e5ec7b81c7e115a81059882","impliedFormat":1},{"version":"1a93f36ecdb60a95e3a3621b561763e2952da81962fae217ab5441ac1d77ffc5","impliedFormat":1},{"version":"2a771d907aebf9391ac1f50e4ad37952943515eeea0dcc7e78aa08f508294668","impliedFormat":1},{"version":"0146fd6262c3fd3da51cb0254bb6b9a4e42931eb2f56329edd4c199cb9aaf804","impliedFormat":1},{"version":"183f480885db5caa5a8acb833c2be04f98056bdcc5fb29e969ff86e07efe57ab","impliedFormat":99},{"version":"960bd764c62ac43edc24eaa2af958a4b4f1fa5d27df5237e176d0143b36a39c6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3fd8a5aefd8c3feb3936ca66f5aa89dff7bf6e6537b4158dbd0f6e0d65ed3b9e","impliedFormat":1},{"version":"a18642ddf216f162052a16cba0944892c4c4c977d3306a87cb673d46abbb0cbf","impliedFormat":1},{"version":"41c41c6e90133bb2a14f7561f29944771886e5535945b2b372e2f6ed6987746e","impliedFormat":1},{"version":"4ec16d7a4e366c06a4573d299e15fe6207fc080f41beac5da06f4af33ea9761e","impliedFormat":1},{"version":"e4af494f7a14b226bbe732e9c130d8811f8c7025911d7c58dd97121a85519715","impliedFormat":1},{"version":"47416e41b1af81e53e8c3cc5bf909d47ff632a7b6eddfe7ff43d187b4dcca047","impliedFormat":99},{"version":"439433b94f71b1e569fb4058ecaa7fde97bdd8aadf1c865298cd2c981b5fb691","impliedFormat":99},{"version":"e63d1bebae16b67829e3c956c33c82e5af7746dccabb149f7d261294d8f0286c","impliedFormat":99},{"version":"bdd14f07b4eca0b4b5203b85b8dbc4d084c749fa590bee5ea613e1641dcd3b29","impliedFormat":99},{"version":"1748c03e7a7d118f7f6648c709507971eb0d416f489958492c5ae625de445184","impliedFormat":1},{"version":"51de05ca7c541d0c316db220c2b81d0013b0fe14eb6eae68012158f1683ca262","affectsGlobalScope":true,"impliedFormat":99},"8c1fb37f6e3eb9ceacaed17f1ae8e7c1710092c7a3164f0443d1e00b3a74b459","c800e37bc3f60f11478bdd6652b083b17457bb19e7f4fdbbd8bd007603f9bcb1","b3de7960d84baa9265c316e515b7fa574ee342fc56407becb9b4200cc0a3eeda","d998f544b609e4c40dc0d145255029e20dd69987c1b84640ed3df272ae8e788e","0cb5ad9de64a96946f4b78ac9c6d5604b0266b79e11ec09ef4a9d555a69148ed","49a5d99c2c315e9b8a2be872b9bbdb5a0a1ddac913309f3e8cd5f643afd9db5b","18f82b9e292b8fee6e169109f15c3ec4c71de67645848375e92bc6ae26af5600","1b7903039d65b281a8be1d536be87c7928ccbdceb8b3f2b627022c299076efa3","3a2f12638bafc2300e9af56010275522e4335251973890b7150e89759b129b6b","41f18afe416b1356edf172237589e9a4c5429b11a269d7201ed6e5cf349b9e70","560c79f290d53a6b85299d85887af197c2925d9d198723d47293662230a2f258","0afba313a311c3e18b02c13e9e2861cc076cfe5b08bbf7a67960129a4c84bcb4","3e9927c44b6f682af9f822e28c8303dce0b48abdbe08e95b885f93c8479ec8a3","61bc23d7641b8579f29df4a9ce4cb1e22d5dbe37838b6763b1aee6a6674b4931","37bbb9d7293ea426f63da5be350520429e6e048ee1d8e02654866c7672de2c55","c1fd77a73ff95ea556ed8dbaee220adc8d781dac19710844421067008bc5aa36","15c469b901a87a1c4fa6347dfab8d5e9c283f3866d5408b0e94ebef7f27e3ebf","ead293a107e1008403af2c5a21922b976d469abdb3048f09e7c04f2e9d0a8317","83d67277bc07ff835c18f059e3e74c7e639c02f80fe4f796e3f04ee5e9c96d19","3e2481ea64fcebec754cd92dc4817f7935451972ccb737e88bcc1f2c91a941f1","781755e727cd054fc715a8acf47357fa77b9ef78a90e665ce1abb48b5ae8ec63","e3782d855fe309e2e12bcaa85d322b37ae82843d12c7193ad7441746766226ed","1ce4fab3394b4e9c15017729ecd3ca58c0edc90c8b9c951b63e56d29f07a79db","737c2d84a54ffaaf06033a40ecf256b75b6a321d1a039d6ec1dd705fd60b1a48","6bae94dcef7a6100087b1ab28a298c8575ebfd2ad2bb295a9f50e440725f150e","edb3d31747b8ba2a032f9837d2defb44775d5de987e149bcf06820d17e734e81","2d973ebea1ddd1ed03db880bc67e7e93004c5a726573a34ca0e9d512ce47e2ab","9398f73d8aac9013755a17984eb877c1c1f5457d634d24314c91f0121338b61f","93611c033064404d515b76c938471a992032d937689f120776a7caaddb095151","b2c6fd5770d797359b5c2d8c4f45166af8067fc25d288d5f3f9015365af58777","fdcefd1c881d555169a9b6e5d528304283d971cbbbf9e7c64137b4076edb536c","5aafb3c9d84312b2f968db26923774d705f560ee6671d0fd4fb1094806ba2dae","6dbce838d12ae9cec778ad7b0d888ec9e2928eb93df77c6b080b3f34656fe865","b09c064b425f4c904101cfa898900e33b14c5c337801b383e6cfd63b2d23b7ba","38d095b3189ebcd5d28eb93daa33034788be2c3b3e746414d0fcc56018fa0ffa","036b28caa59b724465eb92d7fc3a8e6da3801457f6fad265ffb9761aaf99d496","42a22698360a6d32a511b4224a0175136c1e162726b717f3abc8cff337d36356","70e8e6f9e22cc162e298693451b99bb13892bab15d282ea97842a1558f922901","6450e5f1bb8647e5543da73619f2eab3bb68201888f1c46664d32a0a06f98951","ff0a7c9de540ea83ff0a2ba99f53fd376fc6b0a0485a5b765df9b47781276f95","86799e5f3bd38d70a371a14f244a2198fa4bdd8604c26062be009299a5c9867c","f23a000e7014f1d2d4f780a8c23e31bb149f74b35c5deef1952f38e0a11f4523","7c3b582b34253137200e60b543ce4708d10ba0ed4ffb84bc6663a3d55bcafccc","73c466372ce611b108384e53d78594e92fee0bd8f63b3bd50cc6809d9a5f14f7","9434cb9507c2e7d1047ed6751d6b2d0b4b82ed822962a08b37876080fe9ffb1c","36f835b4be823d9d97873676821dff21dddb1e15de1727615ce114c2cf0c1d18","b341e9f81aa70f0bacd06bbacd1422a14628f4d098e2655ae3d5ed006ccf147f","dc94e2220efc9e22be48b88bc13a900d320ed5098ce532d5413c824f17e9e41e","63f536526f71a3a6dac3fcbc6ee660bed539b442c31889e23e6e059ce98c8d95","72d72fa74d1e284f8a5010e73e07d95164b67c9b7afcd525e5861c78bd2ab522","666a6730c31e8cd864d2ba300f88c4c8642b7ba3255db03a3c29875bd6e7627b","ef2f17c7fc85bcd69a5812c5eac62a15ff5c264c5b4904ae5926935ec3b6a6da","5cf689c8a2afcc4a8fb8b3a354c8c61f5dbea5188bdaafb261af46f916603175","ed05dd14240b1d6655f02bc615e7af3d9a805170fd45e32bb3c97b348ec198bd","bd095fcdd5ee62b35349599150f571a388647f5fd306e48236f8b5eefcc72331","a87e32877336e537527ea2db05845c5328a9121527dffc0134256b2c0b1cd35a","ad9d67ba66b122b4ca35f4f394b3d7f19c58bcef31b7235306e8ab77a896ca30","3229e8bcb6f16a4652c305d2a1cfacdafe653077c024b945ad681957c75020c1","93382c8979f205d918617a3ded6a4b17db06b169296877cef1a5e6ae4957c16d","305f51b4330c85eaefaf1cdb4d12c185720bd145d0cdbed58832c395c099dcf6","9bddc99e6a28a4707f5aab28a22e805ca0938b2b11a9de4697f2c000c19e578f","8dfcfa3cc0022d472064d252756ebdce077166e8612b26c725adcf3aa18ed497","dd4bad73c85ac200726e309b8576ec74f8fdb81f2b5e01c7a13a6af62d0c0905","f430e650e9c2d8517bb2a0aaec133a1b76c699b32298a06723d74cb1ed0e0ad5","265ef90fdc5fe78d6fbd05e444161902112fc269853fe982e38e431814c39e76","8e335ff8e3c6772cf00d62aeb563172b124bf618b018b155468844c51828a7b8","25b68ddb193a453a03bab52ba1ce28ce684b72846efb817301671bbb00e2dd1f","5637cf097394a3679c73cbce7f79fe3a2756941cc3e1f0a28d24d0b59783abff","70e6e6c30885709f956299664b489a9788819dce5516f95503dd02a9d48a00a9","4a7eab8794f0fe1d00f6caca77bdd9341ee4c1fe670ba22a1fda217d96029909","efdc427ecfabfa6abb39a3bdd252c7588d07174e6e30c19af7defe6193a92ded","82e6dae3131b40b1a425c0c7d37dec3f5dcad0d8cfefc9f5324d7d436b34ef53","2544f7bc1cc72fea8758bc990b3963b77372f9285c9fce92946ca98571d4a9c2","08e0c8a1e22cfba6fb236604cf25609d9678593bdd6904f70aa63b9111731d04","49a4b685c88e793c147328aff7db0fa437d3446616c4ef96654e8b6993b77969","bfaf40fb914c32e12dda1978214f35866fe5d72da431eebd16fdd9eed79631a7","276e637ca7b823e2b3bd249240b231217ffed9c77aa722c4f5cb4d9ee092aefa","47aa14d08398f5c3ef71dcc11e8d8a695d63da1b6886ca989d751472ec1d1346","5c0cb52477aee6419c53bd9b478f66c5733aa5b66860476a3772f1c21e7550b7","9c2bdca05e416418cfbbf6f32d06e9bb0a08a5b82c2613cedb199853d56faa3c","a3d7b893843955a38a545b2f8298bc7dd34b56ddacdcf712b1af7c5a23f77f20","3ececa5d88fa951b1f5ac11039e70519b2cf36f44359387103f6a9d89180b4ad","f7077758ea2253decc1bf742b258a9a275752ae3b790c4a101e82ca3f79d2f10","b0fefd37bf46d4a6846822e7dddaa396fecd5c4c3a2fce0ac11e088eadca9cdb","89d1b65516e5db7326362ea793e6767b14a6330d0331fbd89f41a3e0c3e7973a","25fba5a4f7e766daf13fe22b2da6a5ac46968b7ca47b89cb213522db5e24d62b","a9b039d897765635c2bbd590c9c478d21debeb969b0a6790bfdb9da822b55f5a","b1c00b3c965df0a0a30c4ce807b0c9ecda7b401eb145cc50cf7b14e480fc3f8c","1510d366ee20f599b3ac46d2cd1243ba6b2848954017e913215c03fa6a6d9556","c2a3b7628b9d1cf7c117beec4cb4333e30bb759f40fb47d4aad67bb8017063ae","c96dec63632d26dca0470e1d0caa04a149535e7fd9ed9dd482c68f33ae170003","e77a53aafc4a00cbad69ba36d7071ccf4b2a910c3658ef13db80826f17241f07","7b88ad963c6c643c5e37fcf9cb729718e57ab233e74b1e8c404540391fcdf8c0","23fc55eaab6e25b48ca9eb29f413fbc9eb06ed4e28497c4ace255ed0355ab835","f43e82413b8126db1bf9f632df9f1d2feba9902daa589b6674337f96d30c062e","eb9d7a7818188cf4e8663c805f3bc02b06ad2736ab53917bc42b04594344ea67","f1983a53c5a1b199ebfc45b0b1ababde4721f0ac32ad44308378b80b03315378","5e6663965c4f915a984c7469f5124c3dc7092ad7988dc6a1e5b31cc63da2d7ba","0a86f77e97d4d33480cd20642faa9ac576170802afc549fece4821caa5f9eb31","354eb9ac97dacc504e8dc5f479367f70cb0d65c6603f5cb290c026ed0b8deca5","de1c394ce0d3415f125e6f2f5efcf315845b53e72a0888a44bc8aa4ed74e632c","c84ab7c15f79bc27cd9f40fa9ca84d6dcaf284fb2fad006577ac36ca38093fd4","05a667c5a081aabd1fa93b7149c11f19dcbedba8687fc7a684e8240968905b8b","4a46c3d0b778b6fa5c45b83100de8f5ac9e1cfb40b9c16ae04db45a8e8a378a1","c90edd4c24bc6cf9a2ff7264d5b6f0cb4eed1207de753df097c5f0b4747e7d79","dc4306e6b73ca7d6f1717b788a84afe32504b307f6fc468a266c986d544f842a","3c821b1506c0337fff1dc4aaf5e5ca1f49e450e731179fe625ff64afee9526f2","a76897931efd101ad1ec506593debd4c2a97f0491ac954406f86b236164253ad","4486f55cbd8de88c4792d553494688cab79c4939a9a722114aebf600a5a3dedf","4fecb5bb072825f41938be215f50606a4690d98c6e937556d091d920df517b46","e61bb8da5ce6be9eb0a47baca5cbf32bc255f08d87084f954a6843f3a3194129","959b4eb84600bb5d5964a123c76133cc5aab817589c1a9073155dfc0c403a2df","a3c44b96dd3bcb153f58ac41b1f682ddd0ab04434536fb53420525d057ac37c7","c1dd18fe00858f1db0246475fc689068e9eedf9c94a2958b306360c83990169f","df250931a5d45cfc6d818742b033d87adb0f7bcf1d8b45ee3cb790215beacb3e","a3a7cc33743fd910d16fc2afc2886b7766a31d2a04e2fca60a80deed7640e806","1643357cf66e052a15c13468f1aac2c26860b7290618dfa2eca7da738af05068","a8ad9a3960d5097cad8a6aae408b64c534723ff6867e8716e16697d67052c75a","87b86d7515527a926ecb286d839ab65e9a4f80af8070efbb24f4912ce0107ac5","e8bb845e84b9a1dab33965c58b9343a2ca25b0013c47c00e64892b70f441c556","5b4cddcce0624d6e353bc6bc16f846b364c17c09835f4403e7b9cc5cc76335d4","5f008a264f906e6ff3229e0b851055170f36cb74085248893307a20b35c8e030","3fbfb6aa3217277b810cb1771d2773452a2627d414ca390339d9aa6eb812591e","ae0085430f05c3383f96ef5670fef3cdb1263b8a5bcbd58b31cdbb5ceef5a655","970ff52a6812e3fb17789b4fd6daa6fbba0dc8b737915aa722a4d325978f5cfe","baaaf6140c2d865fd6f73484a9182e2983aba3d4c4c57a9559d4467c72e6b1a6","e53cb04c660336dd42e5a0b52e55958d9a74c3bc24ef8d123e624c1e77f60e78","e96b1f45b3c457cc4f0c8be6c5221fb19671a676cbf554c3458d282e38a88fe2","376a889f5361f4aa32770524bdd87acdd6185dcf8ada828d5ce7ae8552e21c38","d67beb7bdca7bea8dc7ca4d1541a067da684d0e307e636fb2aed350d147b070b","8db96affe96c725feeeee84ff9e5234f414174c85b4d3a1242545291d23c2caf","8494fb3d56e72aab30bc8f1a760ff5ab06b2215f93f37b271bd5dd955d31c026","29d12ccf886222d4593ddea3d50ade97e32c296f8bfdc8bf55dc2560660b177d","82c630576a5c621ead7ded699419be45386289fcf9fcf2a4cc6cf3672e0d6611","35a0ddb50c565bde5948a374cec6618f671f259c2a78bafacaeee38631b889b6","7c4f510d3df29981af471cc16de084a059224c37bb8ae00a8c6edbd0852d4dec",{"version":"7757c6ca7a8ad1992401c6aff33633d6a088515be5a39d7ee188b35bfc8e5f8e","impliedFormat":99},{"version":"333947325e15dd42973e611203f6caf32016b0ec25d0f9c83cd5c54d1a8b1d49","impliedFormat":99},{"version":"0528f6d21f7a02d4092895090d2dd86104bd5a3e79eced96d5a1a7dd90943d17","impliedFormat":99},{"version":"b5ce343886d23392be9c8280e9f24a87f1d7d3667f6672c2fe4aa61fa4ece7d4","impliedFormat":99},{"version":"eb64a68249f1ee45e496a23cd0be8fe8c84aecb4c038b86d4abcc765c5ba115e","impliedFormat":99},{"version":"b0857bb28fd5236ace84280f79a25093f919fd0eff13e47cc26ea03de60a7294","impliedFormat":99},{"version":"5e43e0824f10cd8c48e7a8c5c673638488925a12c31f0f9e0957965c290eb14c","impliedFormat":99},{"version":"ef13c73d6157a32933c612d476c1524dd674cf5b9a88571d7d6a0d147544d529","impliedFormat":99},{"version":"3b0a56d056d81a011e484b9c05d5e430711aaecd561a788bad1d0498aad782c7","impliedFormat":99},{"version":"8467f4c442988b9b0e68fd2c2c12fae1d1516c42bb3a593a63d711ea05969332","impliedFormat":99},{"version":"5225e4dadc4ca5be23f80c75245a57e37938b87c9f5c266e203b3db77c9095e5","impliedFormat":99},{"version":"c76c02846ba7d40b9b3488f0e8d75d02cbdee2f0bc5fcd55dd3bd2e1457646ea","impliedFormat":99},{"version":"4ead13a482c539b77394b2a97e3b877b809eac596390371cea490286f53b996a","impliedFormat":99},{"version":"06db2f8ba1d1dfacf04529cb731081ab23f133f29c7608ebdfbcab356996827c","impliedFormat":99},{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d","impliedFormat":99},{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true,"impliedFormat":99},{"version":"968faa90c8ee361d90cb79cf2b0d95904d3e113161e9e07dba1ae6dce32f732a","affectsGlobalScope":true,"impliedFormat":99},{"version":"42a12f2faa483c9b48195ed794d22698162274e755f6e07219c2351c4f08d732","impliedFormat":99},{"version":"727858fb893b87791876dee5e3cd4c187a721d2de516fd19d3d00dc6e8a894b3","impliedFormat":99},{"version":"5bfaa2ee33e63a1b17b08dbefd7a3c42d1e0f914e52aca5bef679b420bd7a07c","impliedFormat":99},{"version":"ac3d263474022e9a14c43f588f485d549641d839b159ecc971978b90f34bdf6b","impliedFormat":99},{"version":"a86701e56b10a6d1ef9b2ecaeedbab94ed7b957a646cd71fd09d02b323c6d3d7","impliedFormat":99},{"version":"7d5c6cc5d537c47c7723a1fe76411b99373eb55c487045dfd076c1956e87389a","impliedFormat":99},{"version":"bcbd3becd08b4515225880abea0dbfbbf0d1181ce3af8f18f72f61edbe4febfb","impliedFormat":99},{"version":"b3f0791a73b6521da68107c5ba1bfed4bc21ff7099b892700fd65670e88ef6ee","impliedFormat":99},{"version":"d0411dddbef50f9ad568ee9d24b108153bcb8f0db1094de6dfbadf02feb3aa70","impliedFormat":99},{"version":"8124828a11be7db984fcdab052fd4ff756b18edcfa8d71118b55388176210923","impliedFormat":99},{"version":"1c88b51b966e2791c4a8d96f52fe857c282615d77a128d3239829981d4ddfb27","impliedFormat":99},{"version":"69bf2422313487956e4dacf049f30cb91b34968912058d244cb19e4baa24da97","impliedFormat":99},{"version":"6987dfb4b0c4e02112cc4e548e7a77b3d9ddfeffa8c8a2db13ceac361a4567d9","impliedFormat":99},{"version":"5e2ba3d18d78aebbde1f34bde356e41e9c76eeaeaeee56a37036596a9eff4211","impliedFormat":99},{"version":"8280ae8ccc0493b32d1742d585357ab9f0a508ea050af25a5a20d64010d0a5cf","impliedFormat":99},{"version":"7adfd9f9056ecd4ae6c65fde2a98654960c662714c73f048478959d04c09e144","impliedFormat":99},{"version":"437b7613a30a2fcde463f7b707c6d5567a8823fbc51de50b8641bf5b1d126fad","impliedFormat":99},{"version":"72a863bc6c0fc7a6263d8e07279167d86467a3869b5f002b1df6eaf5000ccc7b","impliedFormat":99},{"version":"c76c02846ba7d40b9b3488f0e8d75d02cbdee2f0bc5fcd55dd3bd2e1457646ea","impliedFormat":99},{"version":"32b35cf0dc3a1b1a7118b61c34ce2ad1a29695851679f9ec34e0776f2ece2a69","impliedFormat":99},{"version":"b413fbc6658fe2774f8bf9a15cf4c53e586fc38a2d5256b3b9647da242c14389","impliedFormat":99},{"version":"37c93220e879dc7e87c10f34f039ecb6505b78970d11ceefa0231dbcc36f5365","impliedFormat":99},{"version":"c30a41267fc04c6518b17e55dcb2b810f267af4314b0b6d7df1c33a76ce1b330","impliedFormat":1},{"version":"72422d0bac4076912385d0c10911b82e4694fc106e2d70added091f88f0824ba","impliedFormat":1},{"version":"da251b82c25bee1d93f9fd80c5a61d945da4f708ca21285541d7aff83ecb8200","impliedFormat":1},{"version":"64db14db2bf37ac089766fdb3c7e1160fabc10e9929bc2deeede7237e4419fc8","impliedFormat":1},{"version":"98b94085c9f78eba36d3d2314affe973e8994f99864b8708122750788825c771","impliedFormat":1},{"version":"0d7b337b785f1b8f42ec89bfe8e71e9c1bbd0624f02578aa26c8e6223ed1208d","impliedFormat":99},{"version":"63ea959e28c110923f495576e614fb8b36c09b6828b467b2c7cd7f03b03ccf9f","impliedFormat":99},{"version":"1601a95dbb33059fc3d12638ed2a9aecff899e339c5c0f3a0b28768866d385b4","impliedFormat":99},{"version":"56fc978580577d30f4c2cdb5b1eb9217b66ed66537dd27141256f426e4b8dd68","impliedFormat":99},{"version":"1cae084ce42adc42e534aabbf7e717a3ff86479dadc8d71ed6202a11f97e31c1","impliedFormat":99},{"version":"7cd92bc6808967f175063fce65f8d1d60a07d752b79ed20aa2eba9a2b8ed0820","impliedFormat":99},{"version":"6308e8e434fc631f436e512399dfcab54c37684bc51ddd2c85a2e9d05dd1e77b","impliedFormat":99},{"version":"84e977ab810a75dc103b38cad1e019d3ab8f4ec9042b8f09f117b7d18c4076f0","impliedFormat":99},{"version":"355a0c5302c2a232dcc2f1f53128c4e300ce8b86ccd713343ac35612e5c5662e","impliedFormat":99},{"version":"2b1795d67cf9aa20167c72d795d4db6badea9cea646d9181869b5ca08c778479","impliedFormat":99},{"version":"860bedc71ead192ea4a0ea5ef4686e65724d14b391ebd1a6671a7044e6bd8e15","impliedFormat":99},{"version":"34462eb085d501b36ed0d9ed002b3d514957a0f5d2b3d19bc8e9a07952bae8d9","impliedFormat":99},{"version":"c6cae8eefb49ecfc05db524b9150e2d43802baea2ecfe158893be0be49379e33","impliedFormat":99},{"version":"aa23d840b8b5651a89d9ba6bd66f3788c1942dfd9adbbb76a57d8928b035a3ba","impliedFormat":99},{"version":"bc2ccab91693a06e13d379e0c21464be1ee13861bd92e59882b55488b5dd84d4","impliedFormat":99},{"version":"7bbff6783e96c691a41a7cf12dd5486b8166a01b0c57d071dbcfca55c9525ec4","impliedFormat":99},{"version":"06a33bf80f0591e5ac8cedbb2c77bf0d772fe6843baef2fdaf19fc538c4e0bac","impliedFormat":99},{"version":"632711a108accd4533a327ac3b60d0518fa536dfdc2d9e146222c16aa348506e","impliedFormat":99},{"version":"81b5530dfc39e1946dd771dd5526b84710e11d6a371812b1dc2e8eef9e12aa61","impliedFormat":99},{"version":"be484fd6767e6ee4819ef703de97d27d8a35b04803fa32f2fbd554c2e9909309","impliedFormat":99},{"version":"ed6f179f3c068c285e4eff22216682ef3a5e986d9579c3a203d5bef7322f6d9c","impliedFormat":99},{"version":"99a323dc5a6e506c78b69913b32beba93453bcd87aae8b507520234f387a4c30","impliedFormat":1},{"version":"32727845ab5bd8a9ef3e4844c567c09f6d418fcf0f90d381c00652a6f23e7f6e","impliedFormat":1},{"version":"af3c4dcb64b945e01285bc0494e1cfa384fac43b08713a56fc3043c8f861553a","impliedFormat":1},{"version":"7a8ec10b0834eb7183e4bfcd929838ac77583828e343211bb73676d1e47f6f01","impliedFormat":1},{"version":"b07f64ff6ec710998a62b07377fbda0ab4c313ba1f0055bfe9faa22cffedd47c","impliedFormat":1},{"version":"72ef861333c7870a29fc0e248129c4afc0741c0716a74c3da409d05e41ff1322","impliedFormat":99},"44f014b297723476bf46f9d0bde85130e524b30f213ec548f3d46fabb1967bf6",{"version":"3d450fc2fc7b0f10b6a9493a682769aac34f8b612f0f5d1bc4845a7b0bfe9f0a","affectsGlobalScope":true},"f873953284350e530f10bc2e840656349ae1f65eabd729247c39b7611627ccb7","2ae5b1957f3f2de229c08fabb523eb9d41780ca9df9778499b09b295c1b170cd","2275a1fcf1f74efd5008bdfc003feffe0186df5b151792e9aa5c6454852983bc","66fdea704eaa4c7d688df4832f034f43a4acf60f549fa0ff035497ef992a9af5","8a9c10cf4b9a273804befd55361b84eda2a0e7ee38abc1895bc79d7a47b1c864","436bdbff6b03be2dfb5d5c2cdbf9869368a6c97b91072774181ae900670e4c52","3b4aaff5f920756edee3e80d196ccadc164bb821b58c79e399fe6ef35242a949","d998da6bdd2054ddbea76840721444fbb87a1f10730ff6ac4b07b1056c0f3104","de016ac115596d3a7671678907b873e191f765121eeb3171807a9d75edbb47bc","c2d5790ed3ce7316a9656084f4514641e19aafdfffb7c583861744575e230538","f836366b229d8b0969e942dcd45ca149a5d759a1a6703186e90c950ba1195120","bc4b14ef328417a307a72927f9a95e10ef54cbcb8cf7e6cdb918bb4b2b0e3e5b","52c6dfacdf9819d32c555866ab9fca19a4535ec34a2489563910f14479803c93","415ea996e742a5173dcf2cf686ceafdbbc3d8157bec3597a93179eba1c3e083c","647ec94760b39adab4c03664db38162e78ccb1724d8ed801f0a629759bcd0549","18f16eb11fde803bb6341e06edd3c1a3f7f72b62a137debabce328756d856e29","a51d654b9857a7fcecb432f2e526b53db48668a316072d2dfcc3707a2dd30ef6","18f16eb11fde803bb6341e06edd3c1a3f7f72b62a137debabce328756d856e29","5ae688734d6b5eb6b253b74a7923c63a5ee417d3954ab0b97ed9380a9e5d1bd5","f4c4f9de3151cb1c6a7678c6d6ec99d719396186b8391fbbec4a0370e74566fb","4d59ac4eb1f59d3e81d4f03a2efd02b88988291acb32a089eb20e05a6b6f6ef5","5ef68efe2378585fec64263c8dfa4fa8b0864b6801ed013e43de4b52061845cd","cbfdfecdd0a0aa973238b8c3b25aab66e86678f7b85ee2372b5e8e7f76caa3ba","fa6de6508fd0539144f8818cb985163289770b57330847861955d85526a29211","6619ee4bfe291a048b0177cc688e21448ab24ff363f1ec6d403f965497afe57b","0fa90528254ee589c30619e2c5c97592f36f4ee698ac4f5161ae180d57b9f242","3b6d6418f3cefc67af122d9261f10ec22275b573a386f472049fffd37b55c2d2","453a30b95714db768e13836c6460a69b09507d82f7b3f280f680ee44fea9b55f","e1de5c21177c45e036145a6ce8c61953c7684b4830b6db3fc869265908d8cf75","fd46d4ca279240183c759c00b828e4f37a85839ffc75ce4ed9911e67e9672046","1ac6f749c35735be917eb6db0521f9ca4fe4f41d4a429d5ed926ba344e2a404a","b4449e505554762731408b2dbbae5edd0aa8ade9306b10b433dd6fcd038756d7","a2a95b9c6e5bb8059cedec70c4f9f24f68fc08be66b4f18c9d13325e47564766","027df5a77b91e332ba185bdfe870d7108493ad92d3c9989843466f4abaa311dd","374d160899cadc33acca98173bee5e3b9ae05aad54b8732b7b16de80b634e7a7","cb9656ea04c3158da93eb0a4f3b0066f36d0a84bdbefc3c7ce43f770c9817557","26739f3e34432f09b55bf0992fa43a19ad4fc63e0b19a40c8de2bc68728d36df","d7203e36210467be8b5314a0be0d8bf40e52f24c0c19455988b57d0a0dd9e7d5","9dd3ff484f72e08e4b18c3dde97c4ff5fb6c8042d0e1ebc7875a98b3c2f9905c","6f0d8618e4a3ccd8675ffac8b733772a1d8f18e8b7e6e186d8902d41be7bcef5","39804c9917164363e94b60ecf27aea447eeb92aab8602a881ccd123a932a7c60","c886ce843d660529447121941f2bec8a25a3da757315beb9ac498df628850429","04aab16121c4e5e2a1ddd1586cc43b703d41278c0539d15e35d2a14068495a5e","12f64e888bfb7708c89ab0c728c62d086d50ae7a3dc1857c331ffa167bd0e2c4","b14c4cc04c0fb97bd96e665e595c3c01aba411c114d1eb8f1059e7e5cef73825","33d6131368e2deed098d1bb2334979fece532028f64a5da6c12b59b2dd57b24c","c25c0ba1841e631975177a12a3862c4fed227b197ce34d27c32f5da6653917c9","378afa224c6d7c6f9da55ab64a53f233a236b163c589c2f4e970c1a715a770e0","171a833026c3a54729b34d76c413f4fd419f5500cd363f704144437bd74a8f03","4e30992af15276de8da6d8ab5259b87150ac935c9d193c881b13514a6554d267","1b2cf9d03dc934d9c25cbf8157de364ffb1b90df592498a1ca4092d6dccc7f28","9f04c936c92815038706263e769d5704f382f5587d7fac29b409944ef09572b5","738c6a77d6a0792276b90edfbcfeb0da691738957c9fdfbdc79a10d6706cabea","1bbf37408ca9802e4762efd180a2310a4a8133861198ce53f3f9d456431163ec","8fd56d15a96b615e50e4033ee0aff559c62060f1efc4f7d7f018233afaf0c5e3","f5a512b2e826595f640022020a19dca89add7148ab537993cc317f94ff17ed62","fa301a6cf6051049d45f3b1e407bba1df723f3782bb5b8e9d3bb1a12e6b276b9","e16382f41bdece17018b25326eb300b0b768dc03bc22ca52cdbc3a5fa64e9863","68545ce50695b0e29bb8bf2d84c1a8242f40c204f56e14e228ccdaa541a8404d","12a9ecd9936392bd9db1f4cd49561c8b2865a1ce97233e232a913b0789ee0be0","80a4639593caf18885f0bcc06eadbf7a8f736f393280765f37bc1927eb1ce6cb","4452a2b984d13eaf0416f04d11869623d49a6a9589f1f295ef0af239247696bf","94d9641cb15caf66bc07953b716efeeefe26379215bff3b9930fa948c6e7e73d","af351a793f74c23f316fbdbde35fac142a1d1472c2945c857a160185c410875f","394beedd3c1d34917c3ba52db5f12f53f73757992c1b5466b78a7a38d1dc00d9","2ce8c7577c6621b7556768c10d2cdc56b8cd2e7f6d724e866a8eb5849e3895e8","082ed8e1025f29ff643348b42928a72d352469f2c4e575f357208df0c1c3f652","e1caa15b42cec3b982f874d8681cdc527c9a813abedce9f3426679b7b6d171c3","dbfadaa51693747ed16daadecca9ac56e7adaf57d2836400cfdddc94577c46e9","c55b05449a8301a2a8861000bf8726f46cda3c169b80797fc8630382b8472352","dbe9c5bd17e14ce0008917f5ba1a9fc39afb2ef8b0cf867c760378c80f3b7604","e6e8f3ce2e36825b772ed98e439cc381fb8b4584d66e664d63bf335b9b7e421c","488e23ac17e247fb31b3664b9b0849727b949cfc1966cad5b939bea84cad06fc","31f4cdb7bbcaa86688d6b96135b99250644afcd0aee7adb489da523f0f12d19c","ffb675c5efb9b4c020edf9f7cc967a8ffaa22db2fc8fb9c8cc3e3b1a1ad9483c","faf0ab6b5a67be42c151268deda8ecf42d4badfe8e91058d95647406670f3997","e577ea01dfc281eeec19e056a483c64b3230482ee31d387f787bb3e4b2f4c5a3","ddfd123dfa68daaf9dc718bf4a9d0019a2d4b768599e7faebd231d08c2083fdd","5019b201c2e69337d00f7c0b09d938aaedfec284ed95d1f1f4bb74252fc76179","3d8db202f4586242bf0be4711f69ff2eb5f254912700163bd73fc04403244ae8","48a0aece42db4f1670ea5c6e0eb7068f2b856f39dc84c663b4888ca34eb8a8cf","72b5924cb5b5a492a0296f239a3386855494aea6f7e81ade18f8583890a2f485","7fdeec60276e682a6ec86c7dd60ca102f684c684afe4c046ea1d95254ec756b7","9aa404bcae5efbe42a5c3b58b956bb7e2158efe77a638afcaec0bfd236c03174","79314fd79adece7b55dea13c0f98b053d98d1dc7ffe509ef8249520a6ccc5ee8","6544b7eb21a5bb95d6b996add33df5cc181007eb33bcbf7c6087c08cf2abf3a7","448dc35605362508cedd5e39c5f098135b130450b6bf5a302830ff0e5f9a34f6","242d42948fbf920f7a8c9ccee7c115334a349fd80caa79b410da35b2c66c441f","99848d3839fb7645494d52dd801ddd8304235ee05f597d63973465b717bfa2ad","12add725434716e12d9a633e2a10e4e4968de719dfdbed7387e5e0ed206bb2ae","58e6444d268ae873bace7cfd07f9c63e63b301132cdbd4ce85489e6deb6eff91","dba5166ad9db9ba648c1032ebbd34dcd0d085b50023b839ef5c68ca1db93a563","8befeaf0252bda9225c637036d4566dc6329e0ef874e0832057990d8270da38f","c2b040de67addb08f347ea3f9634e5154d574f97db77bd2da6760bc2184db12c","27183dfed025d05d2ab2fc40e3b16d69674e27b728b81d94dfb9242b8032eb09","c57e1e6879d59450936edd1fe0bc72c4fae32dd7f6456fce6f458c917e670a5e","670e06fbde4b4e4b273a8cba8ab4548bb76973918aa528c68df934b630e729a6","7b15a1e3c20d85d98ece8886d2f6a7a75471eb704cc79a83c4559239641135d9",{"version":"a8062bae4d5055f04ad18553191afe3012605cbcf0819e18367f5f87fa8bd689","impliedFormat":99},{"version":"af4f1953fa7ef8d18d60ab3d4e83cae9d1a1b581908ca9fee68cb6cab6f81098","impliedFormat":99},{"version":"c0750c3bf53ffc4ae6dd795ea2f538eab9137063b5ced7a95995518055be9e57","impliedFormat":99},{"version":"99aef09e2ec1a14cbadc9febc48cc330356c3fa60146679b1d631281692faf8b","impliedFormat":99},{"version":"3801aa8f80f83aeb352e32cb5ad9810f9bb5f2cce564b4aa9a283432e40b7c7e","impliedFormat":99},{"version":"106e7b5bc0b64083428dbeffe3ea564987f1ebc8d9cd562f495073c4a2af16b9","impliedFormat":99},{"version":"67ac20d31b61852ac9b758e43e806b2b300bbaaa5dc54ed278bd21162c2d5d82","impliedFormat":99},{"version":"e0f9e38f3e0b7bcd916a748e349811598b273d47acb618cbf75ba10def200a95","impliedFormat":99},{"version":"2937b4ed8de8cfb7a5f371653f151e9b5bd0177f04881b9a777b3b62d6544471","impliedFormat":99},{"version":"997e9cacc283d4d572e889dc29aba217f23ac18cfda6e0cb5b4688f29c3b8e19","impliedFormat":99},{"version":"5f2dece17b17049d196f694b9814923cc005342657b2f8cc30d61bf6c64aa3f0","impliedFormat":99},{"version":"34251191dd05d4a45d74149770c311fdf708b49d458217820ec297b8e2a4d25e","impliedFormat":99},{"version":"77c4d3b780fc11884b04fcb82350fafcfc4439bc6bd499835ae8263cf15c9cfc","impliedFormat":99},{"version":"357be26c7e0056ca23fe2ad7f432e0dfbce1d5316558d9fd23de9dbe4c1e0ed1","impliedFormat":99},{"version":"9ed7085f99ad089297ca6dbc5482c70e6dca04b5762222f330e54ca4247904d7","impliedFormat":99},{"version":"1d9fcb591b6e03d72a17ecb147f2f6b7dcd6db076b4a555e056a53febc1c9025","impliedFormat":99},{"version":"58163e21b823b008d00a0b51542ec5a0d73681b827158d2d3aea1a19ed607232","impliedFormat":99},{"version":"3484a2dd7c0b92c963d23ff2935753c049f5c323c4bab4cf36a21c79b6dce90b","impliedFormat":99},{"version":"75f4276967c87d458fa30adbca3bfad253ed4a32af74cba75c270ac274e36328","impliedFormat":99},{"version":"bc7c24166fc2a6633f3fd7a1e6654e5d381ed8ae8be209d33442eab418d9bec1","impliedFormat":99},{"version":"ea0bc330a6d4c3b6063adefa4cbbf162fc782d1c0e99d6e56c48bf7e66c6b74f","impliedFormat":99},{"version":"b4bd925dd308aaa44e28abeeed6143f090c94cb0c1ba875788c213b43033a9b1","impliedFormat":99},{"version":"e67fa1bcc5d34dfc7cdef4d8fef9d3364b7addb7119f9b46d28b4a038bbc6ffb","impliedFormat":99},{"version":"2a1ab3357d918132c86e55e715792288dc7c0377fba1007306a93860216de8f3","impliedFormat":99},{"version":"be4448d73b19fe9712cf8c237b93b6982896a61237d6b125ec91f7810dca73b8","impliedFormat":99},{"version":"dec25493df67e012b28f2726cc7ccf9d96a1e5b3d9c1a5198bbe89e2d2af3744","impliedFormat":99},{"version":"971f953223ffcaa914c6536f28602064ba8c4657471033d6c7909389fefc8262","impliedFormat":99},{"version":"263b1e360e9e36af2f370eace9fd4238bdc659bc7a9eecd807c83e72ee6b8281","impliedFormat":99},{"version":"dc484c17106998437f34f037724865ca569b4beec54f5216dd9f393a53593e11","impliedFormat":99},{"version":"6a95902bb98aacd82b1d46b5c7f9d8b9f136a06d086288b0c7d7576e2e1dd2d1","impliedFormat":99},{"version":"9b11e35e514bc6e0f8e9da1e507292839dbd3006de7342a38de7f41b8762c9c1","impliedFormat":99},{"version":"18d752c3b1ebb79840325bb97061664f412909f2bf42e87694bb6a41c74ebb7c","impliedFormat":99},{"version":"3fc2c45e911dbcc32ec303f6389d7b485e0bababca72150d36828221b0775ecc","impliedFormat":99},{"version":"27b977b97941a24c1a0152689270552519d92001713c778f83591c2d3d3c4617","impliedFormat":99},{"version":"1ea7e97c0652b9614f9863d66595c6e9a55e90324f05186f9c7aa5c02ea672bf","impliedFormat":99},{"version":"519dd178b976d3973be6187c19e8668d3e882355915eebc184a51f0bd4871682","impliedFormat":99},{"version":"1729dee34d2b48b1291ba31e5c6b4ed7c7677e9098fd8717f06fe06fc73d2bcc","impliedFormat":99},{"version":"37e67b161fa10ceb26e1828e4943c1b400def793dbc09fc03dcc397dc03d4cac","impliedFormat":99},{"version":"75f3dd1d95f5e3acc2224fe7c8f02dfd9c14ed1f0a6ce1bc33b289f2a5d60fb7","impliedFormat":99},{"version":"74dfc7fc0d6c06afab1081fd899ea5cf4929336db3128c1c9543cdd34dd8029c","impliedFormat":99},{"version":"03ecbb96dfbead5cc20f4fe47a8979c9028e15769e67f8306f6b47f6cad3e01c","impliedFormat":99},{"version":"6a9893a3988e568723edcdff450813f0c0928ab7b33e48c8b9fe10afcf46724b","impliedFormat":99},{"version":"ee1e4c622d5667169ed63c6ecebe278ae87f2f62304a60fc041692dbc33b7e56","impliedFormat":99},{"version":"7b50413ece7ce91be5427b2dcfd47b0225d5a1ba8f245ff63e00a4feae151d56","impliedFormat":99},{"version":"4810840b9240f11ce1791286c6c65699b4d413ab897387c022be97d8ea088e2a","impliedFormat":99},{"version":"4ea8fe15ff7c4f475f0d79dbb5330e1f81cac1b09c344d5fc77c9a035ef29c1f","impliedFormat":99},{"version":"4006955d236be699ed8d2e8891ca0fa2b101b2b4743617e5ff2a3c4256112e92","impliedFormat":99},{"version":"44a42b8964970fa260328f36d126d8630be1e92dd581bfa6a2e62c8e2b51e387","impliedFormat":99},{"version":"af0940ef932c8dddbf769deb4731def46d2254a89864ccfd073764ce974366e5","impliedFormat":99},{"version":"de52d325d731ce4b8a88fd8ec2efcf04365f2e8e567f5920458162a3a8373210","impliedFormat":99},{"version":"9985390b580ba0cfb41f7a92341c6e8d66c42bdfa138ef2374dae5efe13b3fe2","impliedFormat":99},{"version":"9fc0e756ee8cdc297561af6daececa03044c256f409db1ec3d1f426779075d58","impliedFormat":99},{"version":"23214854e47335bc9770780014b08d37908a7824ab986a72d4fdb24f79c1e108","impliedFormat":99},{"version":"ec84238e782e400c66938fb1ec7565116029cdb7b6bf9f48060e41106959621d","impliedFormat":99},{"version":"315d8ee79b3dd8475d1aeb8814663c29e0f9601511f948693b8ea3379a7e36db","impliedFormat":99},{"version":"a0eda64ce377d750732ebffdd457003e3871a30c154b390e6d2f925da211b5ef","impliedFormat":99},{"version":"fd5a9008c168320f8ebe8375ac8c58ac342afd782f69b3fe53ec2c54a6bbef77","impliedFormat":99},{"version":"c1f59b65f824b5d53621d0049323b766fed0e7f5e30b74b34d655dada6b77b1b","impliedFormat":99},{"version":"da414aad17865fd9114995654120cf454a89e0872c81827ff11c0e3c3dba90c4","impliedFormat":99},{"version":"23ca1f2b58bb662559b66fb3d34f92b719ba970a9c0c83d65aab531a0388bf1f","impliedFormat":99},{"version":"033341ed8c787f156d5fa53bfc7f0d48d37741592e6cd3dbe0c619ebb70d1924","impliedFormat":99},{"version":"de810890bcd2bd331369db2a282dcc57cc043211ce4d84644fbe5f02cb57ea5a","impliedFormat":99},{"version":"c6d462753edc613499432d2fd8b9ec55184444b892b6234041c59b5f827381c3","impliedFormat":99},{"version":"d62fb1a9638da594ba1ffc9070b5cf2b30325f4a17bf3c363070f56de2b5b152","impliedFormat":99},{"version":"e8c6def890f17055f0512d27ba8618c957dcd8f21ccbc220cf40eee36a56116f","impliedFormat":99},{"version":"f89c9be1350bc788ee52a4601e857070842f7bd052c3afb70cd952536b6120ba","impliedFormat":99},{"version":"b0b4fc9a84fae5ce2eaa30f17c7fa7b15e8c8fe0e9c39eda417fde4375f2269c","impliedFormat":99},{"version":"26c29b56f51ca2180ef8dce18b0a877866e3f17261a0d07cad32c40443459f2f","impliedFormat":99},{"version":"38b120c275af6b44446fb39d2585f14153feb839fa5fcc84b2f1bfef81745bdf","impliedFormat":99},{"version":"84b787abc4f0eec35086dcdb046ac82e76de89e423ebd7cd5c557ccededf6ee1","impliedFormat":99},"00fd2677cfe5e7fa304d14802c75817e7e593697fa4334a7407a86644c86af43","675077ee8ad61265a314781e035e870fa93baf00fdf458adff97548430aec9a0","5049e6f856c620ca50e7ee5537b78fc126657763ea427012f1f86d16790dcfa3","6ff731debc01f943954378e3850a94943c23a2153123cc46a49e5f31a438e2b9",{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},"e7ee33b3fd44f550c5b00dc62030266a1f8e5ab75a8f02ecc378693fc642a593","17e89b1e61d22a57958915c77c25a68da8675e05d8a31c15fb11a142aa2412f4","7441617e2efce53e99e59cb38fec6610d69bd02054189379278b7b9558f5079e","5a2571f1a807b8d2527a6e1cc22ff9fca6c1aa5b14ca2f768108460f3143d152","2b9b30ff74df583d760ffbe996d4e609b1d3f6d3d6930a8ea01c17a1c67e0daa","c30069b0da3bed85a1bfc6f3fefe10186b2a77ec5350173ba56623a249d10b7f","9ce081f36e7c160167d5fec5d77f5c8e37d43505e1299d45e1d7c0a54652ef78","af73d27b47f738a865f6acabd6c812a8551c68111cac49a98c8293c89ca8dbd3","975dd4d5be0be7ca5183e904004ff61fe50c67a9cdf36cfa80f0eb6c593575ca","3f54dd46dd7d2abc7386d32343740c158a1899e0e1a4885bf26db7068294657e","7a3ea15b719a3efa1f510214e22e3d41d81683780af898ac5e9b32977ef28403","4c8dc6643282d5ad828fd33a282c149c4e2002f3dfc514d68f9198edaf9c4f2e",{"version":"c57b441e0c0a9cbdfa7d850dae1f8a387d6f81cbffbc3cd0465d530084c2417d","impliedFormat":99},"c9cc4b052afa2bc6fcea8a059d6e2510efc9339b48cf1246b64e5a1851f5f36d","8154d176fd5cce1e764be58ae1fa36edde81ec994f8548e2f8e50d2c7094d117","6d851c4bb7eafd61b0114e080b8cdfbc2fe21ce94c7a5ae3b948a1009e306831","5c8a9116b2e98e9661a58a7d76761e93388f0c6a4482f2b01b82077edc7647a5","f67cd0a7b53da162883d9735c83a43fd9ee2fe9dd47f0235b76eb39560f31892","c396bf26b5b06cbb6bd56ba62922ed517beef2afee82c113620b9828f5e19586","da5ceca24a20b3f2bbbef2a00980b88d5123e6bc300c74c282c7596bd793194a","32953637ace2edecd11331272b87dffd0a08da5523a3d1e29e445c92c5ac4229","fb1d108f78dd4466c1a0503e16eb3eccb6b95f555721d38d11f23c05f13b5cae","99370e9af2fa5541cf61da668499dd855e2d50a0a64f820b531ccad07faee0cc","5766f9d9b84d6aa73b39b39d8bb93b4e0c9a0934aaa3479c2682d5c6e047230d","885fe8bee0b170e764686e935af100977695d222888250a740ad011d5e47178a","7002171e319207b1ff3e29b1cf5c43a98d7b6020752cbfec1d6f3ee41e798fb2","6ae93e541971d32692877bb52c10167f5ef8362d80107011ed7c8a87c7dc8268","0e60c3ea30a06d56e916dcfe0877b2821edba8221362acdd301b0c21ba48fbc0","c79b49168a7008b61834f2f13bab7300261342f2e5432c33c5888fa7f65773cb","7aefe2deabf627ba989187fe092c260b349cebcd072be8f90768378cc17cf362","fa8d9178c6a5df8e2742e043487877102915f2da81b6d9522139682e58a4cf0b","d5cd2f19cce74557a250763b592ac1b9d6ab5339cb726a3e3d2d9fb9e33f8b0f",{"version":"52870c04b789c477d8d128292f908abe808ef6fd7fad72ed05fc141bd09314e9","impliedFormat":99},"a3924634c4586f9fb0adb1a609b634986a1ced2fc6b570ba3e43447a75751788","f384843925e3eaee2bf467a915737ad5b7d0da27332b401247e9d5fa67dbf878","0dad2ed1d890baec66e1dd5777931ccd8845925f6c4c2a55b5d24249579a01ee","ae85b239097bcf7733aaad52c6e51dfab14da2b710eae9ccfbc9014068aec2d4","c15759d73184b4e3f0ca97b23b3a5723c7f6ada5b882328cebcf54b90a8917df","813057580a32ebf3d8068d38fd62b50672fce8680140f8724968ab4ce0124c79",{"version":"acb9e11c784faa64a3fc5db6ea3db5062c26e845bfcae233846e54ca219c905b","impliedFormat":99},"ffdf2fe56c5f9499ee7bb4d0bee9c747f726c1f33f859ef7ae2419bb74432ae8","6bafe179d238dcbf3c94f5055ceafe9c96f0734570835334faa7dfc4eab92edf","5c1c8ce8740030965afd5dc933eb7164b32a7d18b6b00b3b17a447ae19613877",{"version":"2b4276dde46aa2faf0dd86119999c76b81e6488cd6b0d0fcf9fb985769cd11c0","impliedFormat":99},{"version":"38d4cff03e87dc58bfd50ffe5a3fb25e6e6d4136a1282883285baf71d35967c5","impliedFormat":99},{"version":"5ecea63968444d55f7c3cf677cbec9525db9229953b34f06be0386a24b0fffd2","impliedFormat":99},{"version":"6ea9c8bf2ae4d47a0dbc2a1f9ac1e36c639b2ac9225c4d271c2f63a2faf24831","impliedFormat":99},"ecd6aaa7a2ae4f932caf3045f1a0c48f545f9c8d727a1bbfa6d768c83a612d91","7161816e210ab74afe25e650ed66d936db4d6be5c760dee0238caf54e6ae6063","3c40636b357aef8c9c2cacca35f08e5c0b4af0d3f866157fad3b5f8632610872","4fdc8c5d3cba27c96e9c19ba2c3b5bb8306e9f3f76a0d79c7463b6b21158db31","ef9c5e18ee2220f84029d5c7aff020617bbbe6fa2bfa0f82ceea244ffc0bfe2f","5b355c67aefb7f23b1b527a5eb9038102a4632b5fd3a5708104742153735fafe","4d4318acdddd6a33b4b7ef26af1a693ee6b392a07ac079b70806086fb0694c00","f419c03a9ba33da60304e0295b12def08c03d2eb87d36034c4abba4b3c9ecaae","c73fa53e2098a44622530ee76153624bcf09025596a92f4adc77c5196cc41667",{"version":"3eff07d5a1f2ea546f6e1184c101827005cb505dd13e3c443f30451f51931d96","impliedFormat":1},"fb9252e71887c23938ab86713032d514d45111be93bcf215f69c3fc2c3a99810","7125ca18a1f030b5ad16f45ac20fd625e7c69694ab0d92a8d544a6e9bd11c9e9","b307bd3d4f31ac47209992811a48351c25854d9e0bed41f6ca028b07a44b815e","17d07bad8b6a831c9147d85ae27cb39dab3ced9a65009626f1fa00a9bb8ef940","95b954916442a71c0653e592c72b983199114615577831dd36748fb29a1f74c5","e27cec4614aaa70c274051b9c7ab25b98faadc42971148ad30ed40f1a3214ca6","f3622ad476d756051c06b9f6b5b909fa3e44db42eb7c5daafcff020bafd85c68","e0131f6218654b59a64ad72790dd8bc693a4a54028839df52c8411932eed06f0","7322338c03bd225838f7a75a1676903eb6177c54f54ee682779802f2c8dcecf8","afc478d77ae545b4fdaa7e0bff245bcc8860cb2bd76bafdb763b39217c25a78c","9821bc43d6f73448ebd60ab2c9e91905be23837b6fd60e33d269ff5622c8bdb9","917edae75be0a4e7f941c8a99a7476302006855ada1280854723b49bb353bdd0","764b125632b153282eec867a2e759198509594d11029d14296b4e91034b2f60f","eeadb48179f0db02f5bc92ab45a94a603cafe182a94df17f3131c708c0272598","b8ce65200bf45f4e19ed8d480791c4c3d7b94ec7df72ca12e42e1930ca6452dc","f6475db6c9f1c87804cc40539df2885ca196df76b608f7942b27d38fc0e2c749","f80aee0e2bb9aa4d54decbc921e07409bff77db61cb627098602a5fc60a595a1","00dcb2faf40d52425850290c07c1dbaa93997f5f9a230b4cc93984535941a21e","56bca659b2a1f69fcea0a7cf7803b92c7a589149930b1348e4b85bde15f4be5b","d0792264e4632cdf929ad8558d0f06c7c4403df57321e61862db8c541b56c3b5","3d3c91e76ca0c3de37880f756b0f554813f90160b705df83a19b8303b25bb865","7e7bb1e13dc174033e83d9f608edcdf55c34e743fa6576c21ee6f12eac9ce1b7","1291a454a6f5109764e327e0bab02ded76b5d7880f4bf67999256fadace6a521","d287bebf93e593a6d2c511787ff6385e67825bca5a611d031eeef27b2bebaf88","bc9ead1d055120ef049b9631848ad211dedeb0904845b2a2d79063d038a8190c","b5a8a1a583e3989c4bb5aeac8ec43c05d6e12515769c8eb8c858f2e0ca665020","24229d25c34f475d66a1bdc3cab1a8e1bae58fcadba45015d4afe46fa044e75f","cafc7b466eb9c23d7ef94ead068562d59b6bfc41d2e1bf0e76ad283ab27a0c19","aa7ec623dcedb6fe9fdb9b673c78b04753f4bad383f33f51777bd6b19d1f2417","bdca146a954975e304f25d9b3def2702b5c53a1ea1945f6a50497eb755909e5d","8409ea7d985efa7f2e2f2b15149170bb1fa989aefa1b439719e057b65b96de7d","12fb3328523f441eaa5ab113012e3621beed96f1d3b02c6b9b821eee0bb0c7f2","8f5e66442c2ef91c25b28f03b9dd2b99452302f226104210c03499d10be718e3","b7939cfe749555aa0c0620408dfd487bcfa791945244e5bb58ee042480f4b835","bb970daa097592c109beeeeebbd6051a4b5b310d16d9dbd93ca396b9b3a3129e","67402fbacd6214e70fc59054bc06dec75a49112da353ae4c7d9d0ddb0802b497","1b70309e3da59a370e507a2e735f9cae1e7dc8b122f0569f0502485829b6d4f6","a836fc15c677bd3ecc4d0095096c6bfda0b7d0e84514adf127eb8e6886799f11","2706db59b854531bbf6e2ed3d7e6895aa9acc1f8939e3e321455fa1d0d2ad3c5","e6c7486c7a8470f7e5fee4e22e46d686f3844db8a9f0f74949e801e73e99a229","641a4c2a9583fc45fb6a4d8f0cd25fb463a104149607fb279f24f38ede61f9b1","a391f27e0da6763ed68d26bd1d2d32e6169d834d19b07ed25e95ed0f2bb0a6bf","8124f65b3fc0f3b7be6d98d5ffeba289c4133aab8410f0c070fc1e25a96c9f9b","8741659725c57d69f797eba9281c609d9ea47fd59e70cd029c645282864e4025","1878ff379f347947a3290c29f7c7817faedef15daa80bc0c3ada934102c4049b","21f66a8d2ccecac24bf34dcb387d279383a60315bec520be87e3a850d5d9bc7c","292c59b6ec6f0fbf9feef7bb23e3b4732bac9ebdab47db3c3a49c03432a962fb","5d4e8610359044ddc5084ab178922b162fb9f182bacadb4ab641a3393f805263","6827a21ae330fabdefed08a977df2ff08e9d72b4f8ab09c5095867b335df2de2","daac0a1107c8c395d94c5ba1aa54c78ca9471f8295c4806ab668a7acaa5464db","0f7f5efb42da1318f93b562042a0b49619396634c123906ca0e057076fb7accb","bf6dde46caa5022c97a5dcd1e042830b31d725dfd2dc782be9e3a83a9eed559f","833e0ba22c231d9e1b26996b399a373681a72005be2d2294592fd3fc010b4074","a286fc074bd31594e998c2f3becf1caff355fcc0d57c8a6e2f1d30c8559075d5","637d4bca22b1a293c4efa59aa5b9995c8949f37e9b0c982739513d970d6d9ce6","cfae8540fb65d16391f02f404960b1d9527ad54f7367bfd0ccb8574afb1135f2","6d89c2166c08ef1b8a97aee8135bfdcd69c9ca8ff8f8a633a7151509317e2408","f0cef439b89ecd5da87aaac0e03d5e747af2394c2dd86af10ec19e9e63d2980c","8281651e3879acda6ebb1b769df78a537eeb4171027341dfa6968d0be48f4438","87478264be4d3330d9f3c01341e3eecf1c4efa3055c06a9034a238f96c3e885f","faa21d9e0ec21386974b1adf4c6d596fd48a52b62a3db4e120bc3716a5ef75b0","325acbd0e4f276f2fc14f3fe1c79f83d4084303e2fd4c445f20e31f68f29b0f3","3e201963cff73fa00e55b561fe3992fb0eb20296a92e9fa4eb615cf1fdca3777","12e05ea5b8fe8eb08af52c35b84d282d30d3f10140f3bfa6ee51bdef85b28a62","43fabbf4a0cb9eda551335b1d5402d0cba33f43c09f40de09857dac60530fd20","d7e7dd5b221d636125683b1707a908f6efbfd6bc16ba886c72b4115767f75d33","1082320f03d289ce6f5e63e4a548d41537de195be7e309525613900132d7ee9c","35da3502ac6f58527c6044a4a178e192a5a3d5914f2ee8c5b3e0d4c43184c257","a215ead2800bf15775edab898a6c33723d52045bbcc30f4b89d4edd4d6539083","93d56ae8204a19e391c6336af6d665b4862edea8495ad771c3104b9b40f12691","9b9414ff3612b6e67e6c66ce472017473816c0e9bdbbd5f68a2aa24d1d86a0e8","d07c3ed24eebf4a8caef0a0ecfd4240fa2107c0de6149c8e2e78a8622518dd1b","e05ecf8e05377f732133d187e455caa7fbfdd7531c3a34b4108340b98571d691","b7939cfe749555aa0c0620408dfd487bcfa791945244e5bb58ee042480f4b835","c478589fe4c8695fb2891e47ad6d363b27d8de1cc46df79478c46e052a554ea4","b44f322b3a4c924762f4214f13796db9db2cdff865942a7396d09d3e04b6a61e","b64a02321deec3f84eb080b328f7201edaf050ee066f157ab736024c1e4c7fe3","aa652c287f0abd81a1d3a5d5e69fbc405f782a5a6fd4f7e38b8a0cd3413f821e","818715462e66998f3d9f82a8b2e6140a0d2366f79b9bcad1ca7df2e5bee184d8","32d32745a442f1e324500f7357669f02d6bc3d35bd11d6dd63636e37a24ece85","c71170d85915152edc499ea4ab126865e5825cc0be75eadd31a08539a9dd4a03","5fc75619cff687209ed20e9a1a3a2f534cda8201d6defc7a103c5160fc40b833","04033cb40070997fda88a0c03e5584b59066fda5e97920490df386e45f643f31","aed98601b13c447393d8a5eac539038a44b75a098d737419521b505f7919dbc6","5e32fc798f45e406960c452b3f2c7fd3d98abe12cee9b8a80b4892681032e022","9a75ea5dfb1288986ef417419b3f08886c55fc18033ce1083efff34f67e0dd43","5d752224f51c6878eb1816a62c8d77ced4b4274ebdaf52ccca9e6d7e14936b1b","b2c7397fd41aad71b8b22b84a67eabd2e6825ea316abeedfdefdba2013b8ef8f","bb04ceb5f42b27b2c2398f28ed9818a08f67c8480177b929b0a1cd222d74a31d","759c4dd25f7f8796060c3ec5946d8e3d1f44a1fa8a86554ddc9d88a4dbb40964","4f6de1fc5acb8b1d04a87e5ed2c81c9a0aca3198329f320f464d98e75d704a66","29f2be60a95bc19574718d5928293f4efd82d1fc406daa3e4337d77990911cb9","f8823a2715888df840523aad117f89c4c5810f2b3ace1dc17dd62fe1aec88b49","114e67acdd0ff3bb876aba9bd9ec127653f435b9a41f347a4f64527f68597399","5d15224738ba1707d477bde943a6fa61f1bb2473158c99422c2918a96747cb23","f11e8a0b39720caf7e5e0ce5f74b26e8218c153b1b532c7eee01ffb773fdbde2","9a023fc4e5d185fd4ed7295e1ddcf0d32291509db6e2652a1bfecaa77b14c39f","db32e55a56bfaf2d98368309833d35b00a311218d5781b00dffae8caaaa4fcfa","c8a3423479cec1686b1c66722c472ac51c3076bb8eeea2381e94b9685ad2b1f1","1f84ee2718efcbed0acae7e8bb5ec7d95399a403fbc7502e4989b4a0cc9a710a","44f8fc719e3c14af02ebeb0c3e18df1d57170386dcba1ba69fe44da344e66554","d76192ddb8f10b9ba68969c13fb275425f97e6d76af23568f54d24014590f6a5","d21c74059383c84fc13adcbee2dbe3656d6405c7407130a2b7da9b82253bef3b","b6130a7ba3335ea06ddf4f57990bfb29f657f63367ffdc4ce8b413fcac4a5a5d","d357619dc2d095487056415dfd9151ef45a35d4e49452aaa2a832b5338be8912","aa26e072c3ebd2404833cf7d6195e701022a13830f7eacde24c926a08e9b6e88","52a2999222e333eaf3f10427b060c008601df482932dd571d4cc3cd9e3c3bea7","09b9ad1eb10545c0d299bb848712d2b4f339fc69347373a9fe0ebcaa29881410","bd7c64c91b0c90878acc4d7bc10e09b529f028fe206aec804ed6c325c4056144","6b9b716c6fe28b1c574d9c6426abc668d617b9dd8d0ab34ec48a118a9c3d4714","841509b0ac385e5a0cc7d0edfdc17c94018010cac97139a8dabf86b9e0262cca","c2d1bfa8a396fb30f7645644897f38d619f602c8d8f3c6f0b15ecb3926c8b28b","782f7cded9b4d9c2591c289d9b8ed79eedf2d23b70c12abc34829829aa8a990c","09f8a2fe055b428e724e7f34cc2a11b1741385e2d1db683ae1f1598e874d8a55","c2d1bfa8a396fb30f7645644897f38d619f602c8d8f3c6f0b15ecb3926c8b28b","a463860b28a0feb643cb5c406ca3be027dd533f1dd5751a7b070bec49d5f779b","3fd68197419a8bf96acc7c54078f655930fd6e31860bd135d62ff5b701b38740","c2d1bfa8a396fb30f7645644897f38d619f602c8d8f3c6f0b15ecb3926c8b28b","7fededc80414511dc314d3be0e8be77ebc5036d13196fd962fbacf4d3113a765","5ba047b357ab62692fd59b06ba4afba29f62b4a2828db51c5f1dcadc16265cbf","5417d9ce6cf3fac04aaaa9204ff3c4e80ade7c99bd81334be5f0580a4a6dadd0","f2a179becb4f04e37a6410d74cd89f1f1f70721600f16e7452be289c3697d908","f9cc10fb7a0bb42f938d574633296483c9d0ae69422c6094bc664f323cc7e4bf","1b4ebf50b5390dfb50c5d2656d59c6c683a845379f4c2ad35ab75fae98dd792a","57e7f09025e9647ed867bb7b7cce5bbda7b22ef781a36510b45a7104039b0692","b923dc66ac53b22d6c0905d5b5fc740d7e5962337490174494e55a8606031b10","c5360e97de21b576a06cc4244eb6823406712a50094ba16a8ebbb63bb089df6b","c2d1bfa8a396fb30f7645644897f38d619f602c8d8f3c6f0b15ecb3926c8b28b","7319e29023d09c4b96abff4837fc261331c3c9533960a3fd0a95f388245e4d3b","bf0f5099994f0456e038a402b9c9a831fc2275d661199e5659905dc5927433d2","062dff63e732f11b11633e2fe4be73736493189893a4ca7131946ad97d157eb2","3d875098c89ec33c999a92e0b4d710ef25d6f4e2352a015ddd052905dc4555de","a31a4add509d096fca1b208fa69a5f12588bc2dad28e121f9b4d8943573e190c","ecfc3a82c788d97e085abfd5985af868718b7054fdc708487cca17b37b1fd5d6","14af773fa1eb27286789881ba3dcb3449e417cfea76fb4734ac705cb34b77956","b755882dc7d1688d3c3f013c4156024ac61dc89f6fda53c3840d8fd42f99b933","7f4d42f9012595a07c661126cf4076a8e19e6eb0569dcd712452dc65026b23e3","c2d1bfa8a396fb30f7645644897f38d619f602c8d8f3c6f0b15ecb3926c8b28b","5ac0eb6a89f96d231bf9435ee12a47570cf5fc4a05f77ba68f286a070fadfda7","494d82eb20e2e0286f667d3200fdd0523fdd751f86d4013f836658ffc06a45f4","f1099baeaa6afec5ee52cd0d94a2143a297dcec18beda58d5ed6ac2a859eb896","b7939cfe749555aa0c0620408dfd487bcfa791945244e5bb58ee042480f4b835","13f4cbe2b973cf06ccc031443ffe1dd51af3f0f1b3721dfcdd5cf814234707c1","96119f24c3e77b0c1f4863339c1b0f068003f28130ba19272bfb177c98487cad","b7939cfe749555aa0c0620408dfd487bcfa791945244e5bb58ee042480f4b835","d78f97ae1c2a7471803c1ad4d19e5872a6586433ca5c0f2e571fc06cd6b80e0e","a1da893a0e7cfe47b7f41e0fe081f3b3fbc09b3a1e86baa28744603d3c0c07b5","b7939cfe749555aa0c0620408dfd487bcfa791945244e5bb58ee042480f4b835","79ce3843b323dc103eda134259880101e7df5decf189dc333ff7e54d5c3b430b","c11f58ad6f422549ba9775e5870365c7d2cf8fbc159feaaaf5f351868bd6aa2f","23fe1b33f7bec790decb97fedc7e627769c13105e825732b4b9fd4dfb06a938e","b7939cfe749555aa0c0620408dfd487bcfa791945244e5bb58ee042480f4b835","4b4f00ac376e5d76a7f902074810dcfe07462b3fe4ade96436be8afbd0e76c92","16c415ff994314dcef759f947c751877f2805ce087386c6290754056bda228bb","15b8f285d2cb2c36807668aa59ff77af55e6a4ed47130a357296459c36fbfbf0","d6f7383fa66525cdf13dbd060bc8ec1a38b21fb5fa6183a384567fbd3969f2e5","372f8474ad34f57fa4e63958f2d267854935a8544440ab4e1d4342bf94d97b62","c439c3b97ba2a14794dcd65d88c772eaef043d577883cbaf03474fac2adcd9f0","db55d104118f69b6d4b8a78cedfa7bc6686cb2fe10831c198360f1d90b7b13a1","4b5774d701859751208a1dde4480871ff3677b3cf18229977c74b7d2446a2a6c","43abc3151a142270e33c19a7267f3959f540cfa21a2ec5bdc4372aff7e0bf916","9afdba9c3c5324240e87dd04233ed566320d76c8e9ffc09ce1ba36cf41d72ccf","1d190267dc94028491976a95a63c1f8810579c66ab2efb09aed1e66c68a1410f","62c3eee3aacfe349276811739095a4f29d8b013f1b646dffd10a0de4269e2eea","8aa6309b4c5ff3ad1d4a4de29260fe489857f3cf54479d759c7d317678fd1f38","bb856a7c8df10bf6b255b8085bf68f135200081b82c58c12ba2baf345e12c07d","9e6bcd856fd5797acea15047b0d9a72a989f9c0d06e60c5b2e4a7bd7a098229c","1d68d1530948f42f37a74b64865735da3e46567661de392f93836b3f25185ef6","9e3c5f0f27b15482fedb5e42b04f0242d4d783364108195a1ed787ddc10b24fc","55f7a73e0c9fe444c72eddab647a779f920c0aac70d9ea08ea33f103b31892ae","a1e251e5cfec3e2fa5f33f508c713c0dd256b13a188a764d2b027db5f4ee0e43","98e60df5db4164da7a1df6ccba7b78364150a156e561d89dc5a0c834cfd82d4b","870e690e66b56b7849dea66dc7161f090099827044ab2675ff360d26bffaf509","47f8ca26f76d0bc743c77917afaf4bee01b314b9bdf1e04ec481982de6349200","92eab1c6b8026c9892f7040e55ddf830a1cf14405cc196233516fbebe75c20ef","9a9cd08e69af9f345501fac6755093671d4d139392cec5dc78de5f72e4348499","dac1dde916e09b641716ee48d57947cae5eab4ef68c82484b755c5eba748dc73","c9eb49df1d1993451ca1d4c49d43d6ad97db6f97e8d19574a66141df3ebb65a7","6cf314fadcd8fc92af32acf15a6d6aec2175b7b3f4513b6411699a14ebdc79a1","39c4bb2a00e30b0fd87a4baa5e12bc6b03011d3f127b605483fed865afa75faf","119447f0a08e9b3d6d2c04990b0c369443cf96c0eeba92c937e3d8687bc1e60c","648693d8428444f5d19b159dfbeb40a032b38d1156e2fab96127aae47048f4c7","71054e6f60fe50e9a01969820156ef7a8df9895034aa28c01772758bd49e17a1","7e187d38780bcfb529b4964f9b44e9d560210eb2537202a9811932df5a766f0b","f97c19a863c2431949ed0311e09fa79bef5ef537a47f944c4bed494332675da3","525fbb87d8148392399067099b6ca10fec0cfebc2f75c822fb537b995ca724a5","c01eb24ce42f02568bdc72df413d3a4a87228f75fe2343cfac7ee0cbb65df1ef","f503d0818c6bdd371264d64de1be545d67307150d62258f6e6b285262eeeaec3","617e6e19aae8e400540b4d516a5fac042c763563b8e77f8754ce983a673dd51b","a2cb3bf486ebb271012ff9beeedbb37008602a073c6e0a50966b471d03241c26","b9dafd3b383c78dfb742a8b5c27e7131a85eb800eeff84af4a53eb85f40e0f2c","d1a1999d26aacac3d7e49db664eedc74bf724742bdbcc9f4da88e0de4378892b","75ebebeca37ca1fa45d2805f6fe638f9416b2135ffbc7a90fe185450d3ba879a","4a06a2463609fdda11f32953e3d53ad3c176eb958d7896a70bc966e407a31f58","69c5e188711040a078d7423c846e44244850ce56cbff115a694b1322c6fbea2b","cc134eef7fe16ab64f9ee3d50af8c2b1aaaa410a46b23c1a66234ea14dd5f98e","a8f2886be9c540ad7951688a7227bd78da21b8b101c6b9f0f92dd7dace97fae9","78570099d008d1a61a95aafb754b016a264d3d9d2d6cf4e52e115d7e23dfb4e4","7ace5746211296c6633345a773f2c55f8ac7310dfea93596580320ad56e4f92f","fc05acc1b3b3bbbc593da807ed8954b8e27101f6b040c402fe02599b086ff7fd","88f86d9887f4f161f38b8e058f1dba0b3e813108cb13cf015f1e7c8e62370567","ecd72cb0f6f1cb7a5623c86c3f69ed69d1662be4238ec6333e0ec75476d7ded8","355e27a6ffa54483457f9a1e8ffe4d2e8721a4c6f7a679952d4aa83be38ac992","595fbb91d18ba0b86404d30483f68f8ef6eaa29625f08785083402a864ed99b2","7ddc301d119cf251aca2ec1c10be827304a80812ae6e186f4f1cbf8798a9ec2e","45b086d87931e8d04e4a652a608d902ff0debc7341014482e16543893fe2d046","5954a94299a4c7e757465b36b90278318a4824cc9fee9f180491f429fdb10342","16c9b6593922d4b74c222c311e0d1fe2453b5a0a894b0f6bd609a986c9c8400f","b8304ac50e4fd275b54a129db0991184e7e127939f4bc843e54344a3333e7aa7","3ad90989bdc576e2c6ad6feb90e35159c783ee2288c0621608c9f81ad9af8aba","2bdd617f27c522fa24eba2cf0bdb3c011a92e01d25dc5436f9adc985dddea5cb","38411f3d871078abc82e0154a7d692990b2d972d0d693816cac7f9daea2a1139","980c0f6c1328a7ff26302e2b368e0e6273b43a0ac1cd7c5fcf3575d658dd4c48","dc7ad16240cf6464317e323e4dbf08938130df12f51ccb6693efaa2703fd905d","ae740955e99e553154dadab8148fbbc55e902b22e186dcf4eacbd0b8bf1b9a76","7968ab7ee777127852e5c0cd4385a19fae67704f44aafec315c31bbedfbbf6ed","098b505094f86c798a176fbff44d752e61186f2217f8dfd9392b6d2222d47037","67b1a60a15085aae9874e3a866babe085464592329097973887d605b0eacc139","2a7095b665f22d735e59a30e46c3af8b6480dd5f6adf30f99ef2284ab7d074e6","bedea54224864ab42ee6648a47a34eefa8a24c227efc619385582cd884f4b08a","024c435f76651e71017003c35778ae59ddacf7d87bf66f82ee0d88a9bc56fd86","0c208fc64d5261db21db7f5b3b01008711c56ca217a9d47dfb2e5aaa1a44e5af","9b14e221c42b5b9c7ddbbb104460c0af9adb947b660083dc829ce4d7e1a97cbd","ee542d7215ec1f04ea018e508709c7cf725ab97f91a358d42cf4f270dfea5180","ef6ce0751179709cd06aadbfde98b5e41b2ffd70d18502e4dc22495713677e46","dfdf0296506d9f79e7a849504c37aa99b7907cfdd36abbf6ad06426f1b251e8b","668fe2283136bfb14824cf2122ae5d477423b948eeb3de4b064528e0620aa9bd","3d1c1bca348bb2c67651dd48d5bccebe71ee4b71595e96df462e233c2fc665f1","901c803e4f99ea38f12373b3829c730352dae463869d9f1c6645afd37c030025","2f77ba322875066b6379e785cf34572f538b9f464dcc06aa129e07dca8bf5c00","3146abec48f5e4ae89008c25a91e96dd776178fd9391de211b7ad706c3b1e0dc","e289b31cd8f34899373f52c9a8052834cea1be0c198efc8535cf28ea61ecb23f","cf2003fdb8d80d24ff745476142d046ded5433c24b3c1c53e612eda81d2cba74","7f45e2a7f1108dc4b356f1a8e20bf1ae4493598366ce33b151435b9fdf120edf","6daecba188ac9fdce6250a01485782336cb0e7810b23485d5b7260e61eb46add","1156545ed80a110362a9edd25745c03bb73be313a89a34d0355757053304cb99","f7a2917e068d2779d1cf8fc32107da3e1feb82a185a33d7b70312779aaefc7cb","7065bdfcb642705f79901444c876335005f60a2650e7ec10189556f893acb640","02559da3738b7758dc446de557d52b0f356fc28cdb4059cad5404f1fa7ab9410","68f6bd468cee48526789c34471958d5e2841b17628f53daa99b3959da01b731e","2ceb29af6815d085ec2e39e46e82f170ac67fae7c57a805e303834cb7b19a198","437ac031b02df8a6b68cbd0de10f8d7845aba725efa61923748a21ada8dfd168","fc665a4b10fd80ce187c6f25eca6abe654100331af64cfc92d202015434f0b18","f49687db851529b8ba6e4b6f890cf8840de148c11283746fc22ae1834c874eb6","a353f8f88dc114e955cca5d31779d2c8ac62371ac34f235d57b9266eb30840e0","c588dd116f303646061f26563a076de13626ec3d779f7354a9699a325d653425","cc9cdda31c72f94cb37f0553f46d0f22c18355e7ef8c13d8c401c424ce16f478","98d1089cd223ffec1af68e83714b074e61ee4767c3724d925e392d594ca0fbff","71ab86d6b78045d2a10a310ef9cec0eef4928fa7192a2931698881de4f5731d2","2acaaff663334c949566c986ee5c4cac6f2f9bca16b1d8e0d3ed826d07726bc1","fea02ea37e96ff2089e85468280219310b84909a5e2c73eaded84aced12903d0","3df8b5c2212a7b9806bb0e24882bd9403aecf64021aa0676cb4e5c04a3e17e4b","f605e59d0f68335b1b570923b6494eafc15cff26695b7037c1f1a6ede6d9ba91","ad54e6cdddce23b880a640d8f8527e8ffb0a6cd63bd3704ee90f506312be4197","886708801be144620277d5a606e8d86d5ac205ec5db2074814dfb2babfc257c2","196ad520d2d1f8ec4367a4b0b7cbd90a0d161603e986dc9bbb72a0d1475c9e94","c0fb6a4760702d0a01ffb156455977754c5d93653e8bce5ddbd876771f6a217e","4b1f658289367450e66d0f51f3df967f56fa01a560a6e0533c1c93adc28067be","3d17fde615660066a2f573861ab0f40a11da7db27e257b273d7c8397605af550","f6b3d7bf3fc2cf4a0a6a92c01b88e2f17ecfae49eac0fb95a3cdca9457aa11ed","14487160fb2cc96d9153e5136d5e1ba899df1edd90318bc96560214ac565c26a","9b2935375f87a5b5095de9a07d58e5d014138f36b3af4f6426375ecfd506e811","bd7a894131e16f5fe8af310b6df6e07852b0a6430031532f58bfba9b908fa2cb","edf4e58a0d115c450cde2832b71cb8a406c2193b7033bb447fb5a3a514e373b6","85acf7ac56782069ec5ebe93dc1347351ccff5b1eb5ac5f7441f6f4b5789db85","32fcd0c6f47b0a9d1d8ac2612d54887ffd4299e2eaa6f1c6de3f24fd3b4f1447","c7fe0b355f0f5621d2e53405ed7f07928c82ff357a92035dc539ee2a4f3b03a1","b82a7a11119d487b02254181c412ee461bfcbffb2510c4a303ca04d515017577","1eb23c6385aed4360cc30f2cb3c5f97dbadad61e37dfce42d21510aeffe2d2dd","55e9f4c1a9e486cacce3c70390a4671f01b2802aba9185b46eb06b73b3a8eb2d","32ebbc7a9710d2953d8c691579452b7308cda527537e0595490cf570921f29d1","eb89fc0a31eae4f172848ed64c43af7aca3a8ea2358003899cd8abd1c7574963","334567ba68bdf1b6982a8215f9383ac378efbc03387bcde7aebcadf4aa942a6f","70356e515f6236a7fa603d287ece1926c7b6eab0f4faaf700bc1f630eebacede","e020a71e1309df00d78962d46ef09a0f27e708345bb3fe402afbe4d28a287af2","9d2d76d5b39d6bfdf923a0de38a14ee19c622fb134d715dba43a3b9241901fb0","e9739e5ee5c5db4c2f4a3de20127ad74abe444d1f3222f5c74b8f91979e92831","7efa607d0c57b2dc8af7524a8473c2dbfe73183f6390a58b832967a79166bde6","afd4490931dbaac09cf62ee13698e5d28558c50e7f41d610a9570aa03bc869d4","7e4075055301740bb64745c14f62bb635c917b4c4842428e71a598809bcc10e5","3cc2698325363597f93f8eefe7e2746bceaf080649fac83ae72fd326de0942ef","8a4ecff9214a7efe2a3d4a20bd2b4c6370f1e7b8622e894a8e5a4badd82f03ec","acca19a1a8d11ee929fd7410f35d3c33719c4338a2110d5fa70146039569a6a5","5926fe5ba96158ee452df61208eb2596e6d4100018bace1f5851865007d47244","56dcbf1f7dfc46cc2262334e98012c03fba097962a091205c008916c2e24e585","d891cdc7cd9fa733914357ffa010347ee532d3d1a4a5e0a970ef21c1251794da","4e0f19fbef75fc32462447b04f2e6f42fee9982a1d210a368b9fa4ac194ba392","987e67f553c79357866deed0eaec37afdd378f10d2cb747eef9aa5d539c20eaf","1448b79500a8b5b68e6a02ae0282e340ce37cd9d0eeda8fe5c957686f8ccc891","90dbcd7e5406a0c495efbae0377fb97404b1050de88283987babb722124003d2","9fa27032e844ee94c363ec1dd51de0c8ea926528f95e438c1abe182089a25ea0","5c8650d82c191e666672a14846914c7d8d69cd81dee40ae397f8e4ae077aedb1","bb96f5e34f3be5332750e18b2fee26a50048d4a8211c04dddfd8190af4a6fbbb","2f2246762a571d9eb77a7992cdee50694b978b5778e589aab8aa770a651a0d1f","976cec05857b66457f1f57c4b9f4161f6a6da38f48a090c26a0be6ac09603d0d","e50d99ea5d69cb172d10a7a1d66c0f1e7b79777feaf4acc1c3e2ab58a80701c7","feb7fa5f85fd208af0b58f317d72d50aba4f5cbc90a6f82df4155958a44d8d61","ea6f24d8f2f15d6a97395eb8e194c765d8dd9463400641921ab517be7eac42eb","d3979bcc97da188ae417e1b5d60484b2b646a0376970f9155e16a4da899cab81","919a515c829d64d7fe4bbfbad8173990c6d6cb7a1350c2c5955dcfae996cb75f","5e538f4a56b83039aa243fbefbc1338a99699a66840fe49cd134ef8e690a5530","baa2bff085e4c97b30575c4b52868e7b4920a3b8a10b1cfd49e5df3881c22e3d","5af366f655dedf87b3a26e8189720c4933a165c985f71cd68d90b30e41597daf","fa3da14e99e04fad20b32b70d318bdcb8ceebd3cb882602d76d08a3acc184a4c","8e365c3cfd96d031d9f67bb1e7d0b24993f62ff67c94c63845521ebca8797c51","702537601e969311a0a92cc5eaef1896cf4e1d608c59dbd018f26f6ea999d6cc","e95363ad25b73d07d443d37cd4b45ff05cfeb9a83d8df0c4b1ea979816bf12d1","fa3a0eb521abd13c4337dd39f576886eb6a5af1ef4bb5d6b2a387f3cfae7bc11","18a44c09381a69f352ed12c96e073f3169c6ddd044520fa441c0ea28f202f560","e57e833b5ed415431c4ab4ee7edd1ec9c2d77b35ded6704d7d5cebe5de765dc4","bebd6ec7b1431eb6b2220bb82224dcca70b2e9e25a0516fb9c172375db585712","6150a747f688db72a48cc327f4117370ca1204dd18abbef4a479b0fc5fd17c49","b52250d6db0ca8b862a48b44b397450774d6fdd79b8c2aa5c8aec4a799d3e395","a8d8d534fe0056e6576699d43eb37b42496b5ae4381779641caf52036b62c056","f57f8b199bb95373161d63e7aaad0f2dbf0fb259e9dcf20bdc915fa5b107cbf9","8b745d67aa446c6b60191e28838a832611ada12a1c2318233dd55e8a89155bf0","ce989b112142711a37a809e00163204c872d0b00948986ccc01755c819b07d90","38a05056f66a80af6489eb1116820e43ca6eb37ae12cf9396f90880cb15012f0","857608561e469e2a67bd5f414fa410054112c313d698f67f46f9f6b8ca796193","8bc9f1c88e1c80772169953c6c9b3a4eeb21c18aedaf3dd8964a97719306117d","50352581ac49b4f49c033b384053967812f547166a7013d0f70584144baffb3e","d02133598dc510cd742622f0136a0aa890e5e6b3c5fa328613905fd1722bc61b","05140ddf27d3a315b442518601c383e78286e800ca957e3c87d3ad170320818c","b13ffbadcf90dc1301c130feace446b85b119e796facda0cfa6c939f50820bd3","2b9cdad5dc0dcd8dc163e0442a567bb5ac68bb01910e2a329502f0c1f61da024","b7a642886a616fa81fb1d51eedd9d7d36c06e8ef0f4adea2d8ea9ba3e918ac75","5e40c616899b2e98b51af6d9ad6d44b837717575a9cba329f8142e5e24bc8a4d","000a1889f956869002ed7a940bfa64b0f074287760748b0a36de74022ba1b123","ee52ae49322f5c54e861bb03d16ae1c827361d2c44aa866744d604f30a1fecc3","d0885f097ec3c90bcb5b2e7c5261df36b92ddcb96c1053ce3124ce1a8c3ad343","b2043ad5f37453fbbec5a0137add6b6f89e5ba1ce0b410381bcc53c7d2ccda20","7fc7524a2f1d6a8715cdb5a387666cb805e320bb915c857cf749307ab6a1a157","4464400d3db30927b7cbbca4e6e433d79680ca43da743dc8b52270ca16a2b5e1","a35507efc83db1ad53443b3e9bf9b2ed39a1155c3b4d73ec6cf40a38814687f2","1ec4e9ab22e6373c5615f066098c0bbc553e88b3e8c1099b569ef538e0888443","0b53e6e1e2305f904aba8c40aa94c244e0a8d420e3d068549cb2946501475e89","4a1dc3aa74be7352ae99c0042df3c9df8ce53ee87a6f00b2a0fe5b8993b66858","8ee842e043dae4524a7afc169759842f41000450746914cf68535a05745bab57","bf7e6ed3499e732fe707fe2ab383be0b5784d13e52a39032a762af4cf56c40e4","067a7c5e3e94dc199f0893f47008879fdff325fd11cb0ad5c74556f22bcdc28d","699870a7fbf690aea811e65ec73641064e9c53df58eba9af215accedd13dec62","f304ce77b5aa874e3034ba14fc89ae16a083b377cb8da70e14eca0e59a34a71f","90cc362700c19b71195b3307fead8a6accdc00556b487f2207f62ba7573a1afd","3d7e9cbdbaddf07f8c108da6ff9a2957daafff2a1d41aa60c86109931c524bd8","13de96542e1884097daf0b3d6fc658c4b017fdd1957886ffed63e765b30b48a5","d5f7054076fca6e8e6395b94eddc65c834c12b6f66591e79b7fd7653b6268f4a","bc131803b9f57e8e92b4f805a5dc25946551f71e3de0424ab945ddcc8599969d","ac87d2bead70e1aed6bceab71357496095fadf60d78ef9fdc22d17a287bed898","4bb78e6f92a73ec046b5b19dbc1d00fae41ee71fdca2a10371787b1b4245180e","5252a8f93277a3455e880f2e84d9689e70eb534b7c774a677e3a61e50abfa446","583de484c6da32cbfe4d2f148b0fc02f03a3cde9cc076d35855e6a195ac30fad","86d46ede739bc8fb6d111eb6f413469a3052a8d23263efa0ca827fde96329593","6ca7825bcd4c95e621e004a0cdb95dff1192fc182f373e781f4752a5ae568f3f","fa04a29ce9fd217fd92516919bcccc5055f377fb8914cb5543948001915db50d","3aee6eb35865a6592516ce66486ca2af73cb61e92a07b04ae5d26795d075d9e2","1d1f621b800723c264beb8de77b1a85ea0ffc119ea3cc349fe30e3ba624eab5c","37542e663c69b47724f3c452558f0194768b7b7b05b681a5464c302c4b7ed008","aa2053a5f5bbfdbf8f1e11a5223ae0b908167dd2f9c90c2ae12869ba7fa1d76e","29788a4fb8c755b1f75577062d5d29a07e0b3c888e5fb0b6eee8d4fd4a9fac4c","71cb0ab5ee223a8f53f3f18c527047755e943db10ed00baab494302109b6dfeb","660ea7193a2af244d588ec227dd74d08206b8a2b756ebf491974a0208ac2f8bd","6c27c1c616135da52fd33882c17720b51541b7d914f7b4c56ab987c6c978e488","5c5ad66bad13678913aa25b41c4d4a0757d89c741511fcda4fab48ca7852f834","eb6e6f152039899b1c5c1d096ea3631fec9139463528df7eab8b7fab6a0ae469","4c1d17a1f747c49e35fc4e557c4dc4eb5a8163e06906d3eb5f7398a48f18249c","1f4459db6813d0187deacc624d75e69f6a777ace779b20098b5c46a7c4efe6c7","400842355473a9afcb779844a7917b88501f92b60e1ec44a062069c015c66802","77108ff027828e606466624f61731de43f421ae91d22337981bf0844b5dc7324","402cccee4c9ea4fbfb6a966fbb0ba5e36b473fd8e1c9bf82b91e7952606d4e6f","df67c19814eff080abf17f44952861a3fc1d78807701c873752bf9a518f4a5a8","1c0e20b34b06988c7c99f389a5102d83dbea8adff8ae28958223cbf99dd5d49a","8e38a885c70149ae8a7b275fc990c12b75919d19c4e4ea3036873bacbb5f7bf6","61f6c6c103e9c1e34a6c5c281f9b8776689cd7bd5dd0a3e1a40d0344b5cbfbfc","18fdfb09a93535321735418e88d5ac40b46ada7d8485bc5ddcc6337fffc31aa8","c6f172091731495224b384ff5ee37ac45e9b8099e7dd8499bfd6f1c88027f42b","d754438516d26af6c6e506c123b78cab8d0162f835f5dc1ac8e9e27b1b6655f8","4246bc4daa49bdcee83707b726f8c2460e014cf3114eb2915f87eb7e802a553d","77743a9874e8684990fab7fbd496d669461460dd33919e79a405b0cb23a3db67","2b262e5306f904c0a9fe6afbffb3910c6124e466c417ab3ee9cbec2217b0f7ec","c5fcdba006183fb8362acb31f24788c97f860c7019d6592406221c8d5f131adc","c23dfcb88a6e3f6c5137226885425e0c8520ca164b0911aca345fe7fb7dc5a9f","7305f465182610ffd6803ebe10ffee692c0341a2ab9c389631b67b56ca04564d","5366328d977f37c7f9cc695c2c9cbbd2020ebe12b07a5e7b89958c9517761893","ba32ffab81bb128290065e47cd065b46cf7952ec5938e692ca785bd8be8e14ee","da9b4072fba0a5538b6c28e25cdff9a05f4d72307b3795ba30cce3bf8f1e038e","af1430513ca2bf4bf54434d712df48fb4bce3055d946546e89b9e361e6a754af","d52840cb174f890291abe568ba95f99c52188cc94ad4a809ca02444254ad33af","841d003dae085ea9d4375ca28f0b2a07bcd73b22e806987d0f303fa3e2bcd4a5","08ff4095470743c8acfd1a7cb3ce9a8ebc0c197f0211b59fa3e620d10c4d22c8","5e30d188af5f84440d8f76d553a7168c2392f8db5febc1657c3c4448a99cfebb","911c9f0fca708663e69e7dc4ed97f20eaf4b38b4a22282ceb7705b6f325684dd","1de8e264c534bb291da1fa48994325d722efd3bb07c17cfb192c7bc133c2cad4","77f6c7e4f7d4e630da068dea3a81a633535f5d03cc32f3f7ca996fbf2972ba42","05ec0e691a0cfb1978353c066cb3023171edf577749aed108d4e7e8db9c51fa1","f41a872e62b091c6c142082b2ae552387d656ed9049c507d759bf1f478a3cc88","ca8b67cf4a12b6dd41c45929e98e033489287c11bc23869c81e8f04938870885","b5459cb9cc5840d41f0652cc8cc46eebf1558e54c925385287a90c84993135c9","0bac62d3f185a2c963f59d1a797230935fbafd9ed50fbbb275735e10600acee6","e5f9c3cfd92562555a356b89d03d421d34ddb65c79d0dc324d90fad5b629eab3","2ea74690adda4758fc3802568d555aabe3a6ee041bb974e3205bdb8fe52b4c2e","e8b57a38fe6f2154a18752a62dde268f81796bb57688b03166e8b9e45cd7a8df","3c4cb6fe312d4269236b18da6fbf7a3e1e92aa36a01b9dc2ed8bf90a34bc15f4","302c711c2e1905a36ada8c3288ecb0c87c25de5f06e70b5e13f7c05552d99b87","2a67708e0559c5df871a802c737b242aa4588e11998ad0759f00c48c76e62b5d","5d1863121f46240f0bcdf1e26f47d9af150f8a52944c95e206c7c7f41ccc50f3","de3f6b5b978c89cd9e531d2df745d38fe3a86ba2d14eaf26dfc287282f29ad8a","f51c570f279a41ec04391a5c1c3458e3e0e7d8415f5c55915f981cbebd3b669d","edee3d8841e56ef5b8d096e2bd8a3781facd861c0157c3b30f8b06c1676d4049","dc9413f6e8344ddbb059d0d092492fb13666e83615b288ae1f66c0d5dd37b278","4ae4a21c54897eb53e4b14141685a82bea0a58a07fa040535d7a93f2b1180ee8","1e92f3ad7605b23ede4792d0973788551e2873ff897aa7dd8da53bdea02d5621","8732fdb040fcc1f70a2884af44072fec1f169a8b835edc646d865b3ca644fce8","a5a8ef945c065f906a6c6d490c7bdba16e5cc52a39f96c922c59948f3f8990a5","254d71a6aec46d1bf4a3a4e501ac690471c3c58a26434ada8e17129f28391944","415d129b9cd70d43617dc601e609fbfaedca89e55a716c7c320e6f3d3f942b04","ddda336e7a3ba0fcaa1a88804ed4bf3a549272bc397842f22c3a902a4efa5399","34c56201d5229ad4deddcb7f29f34d5be2583ad12318bc1f16275b6f85471c5c","62ae0d1f1e680e576de44fea2c3e91784b992dc6b90de19288fc56dc63c5d8e9","13fc256c70e56a025ea00d40bb6505bc0c0fc507dc7068cace481cb2ee85f215","9b2977c3eed2b19d0838ccb497a3f99b3a07c1aa0d822a7c5aa2769699a70728","85a75ca1167a6aa804b7cb997e1b9fd0e310b1aef0f20f062378df3aca7f16b2","01431797f0a365f9d127a1f1219e1d6e556d10e6d558f2a6d064ee30194edba5","c0d9800f5f6f129b96650aa47734a6195af882b87e1ed535350468abea8bee64","b8fa2b4f5327ca07ce6250e9048d85da806a18591068d76989f9ed7690043977",{"version":"8e9bb812c5b131253bff3b8978811dd80b82eec0a0e0fb562a5e45149b3698f1","signature":"54ac2c49ed18c8d59a6135ad1fc33de1686f2184e83b91fec326374ab75fd616"},"640df710716412c2e29f9721fb84817e3e600e5092fee17284d5fcae78060837","43eaba1a39dc3c5c775c1e4dbfa50a46ad9364fc64ab4808c522742dddfeb001","14dd1462d8a61a597356eb2e35af0b56cc39dbf8b8426c0f1f9e3efee7e8977b","35998e925c6426f6b0be714f1db9452a317d0c4fc5904b590c920e2cb35e3dbc","b0b612e649a8c47c2da15906993980c8b2413d1984c60e9456e269e725028f6b","806508e9c830d4594bf3419b4b5bd2d38c749b0c9a6e08991888d95c99f258ce","33bbb9c06432cd92a4f8cb7fae3e7ec2dbc5f8cf485ea1f4153bb74985b12ad2","7e9122dfb19a5526dee1b3100208ec3da80320c4474d94bfa434a6661338aa42","0956dcaeb88b9de41888cfca9f246cb44397055600e29d935e9064b1873489b5","d11b5e5f570d0035ae75f05c72faa3536b5120b2d4801b8f2c0b89534f0513b3","421b2bfc65048138e1ddba23bb8bb4ac72dcd051933625e99a6cd341eb5898ea","9e491187be6a65b498053ef84fe49e66866f6bac8deccad25bad6455dc32da94","cf8d6069669c19a9fbcf97e9105a34cf0f9692a99126b354f821742186a222c0","7744ccffdc237e4ad06c5bb80d6f2e4e985d95f04fb02d3ca6b08dab8baa55ea","939a7dd3365cf02fec5f5c19669654fe55380fbe9f6420e08ed07f22866b62cc","5ecd07b5cee6a400a5df3f0859898a99d258b0ab83429619ea84584b837406a1","66f2eb73ae065081f9a8d262aaa000182745b067621145622df38893eccf008d","d16a520395acb4994c436f4a5e8253d67e1e2b6203bc7b26eea0e5044ac3bc02","fba64ec435630602bc210a9e6e502d4397400e55e0d5add84e70a0ced22c9f97","fd3862358b9bb439fdc24f0217c9a1d99740799956e8eba532e5d7e8c163b3b4","14f7cf72847b94981761d124524bc008323d22df2aa888f43d9f1ce6b2454c4a","5af71de944fe8cda5e707453bf78d6880bcabd041afb1dfd725af429805eabdc","e85fedbe7a3ea2da3489b56dbab01bd32285623a0958d7175903a495f42f7b96","9286036a22693479285a952c343de3277cd0326af3d9c11115b75bf1a37a32ac","f55b1858a97cde403781f854566d18ee2fa34ca04883a8f126484e3a05878952","b325b81d4a6af3dbb556556178f14402ed05bdc50a4f8940167622c66e8999d7","8783ba69a3feae6792efbfbf1ca1c957f22ceaf845fab28aae4848918edd5f0b","5c71041c09efb7026e78a303a11a62723cd2e39fe3955a65025ae003012b0a83","42a01f3cad62633ba0b48fa40fb6ac993298f09d7fbb188be3df97f00fca6b1a","9aa6a4c8331c1038e8865c8ff5b5d4c6e33bb2feab537b3920091330095c6f54","724ec80dc4052db4d57016233098981f25163eb0258b215c502bab6279ed4879","494772f76606134a2c93ca0ee38b18c26bf7b395c682be417f440561449ab216","84b6bd9483efea51191ad1a73f9dc7cbb496dad648b2234179a103b2bd06cb78","efac84e5b39c8d0c4ca7480a9d1ae0469ca363ddaa06cabd6a88c49341749149","161c3b6fd80af3bf68b168240fe64c48545bed894afb91868438e0b4439be618","91330dbd72927bcf7a08d11f1a4123228eef506e0b705fef3cdafe362c450109","921f11aa820f78cab773e3c69a76856ae5b56d19bd219ba8f072766dbe6c5210","127059fefc2233c0a915710ee458e715843afa0c358f8818c49d4f8b77c744da","15842dace826767d06c96596cee73416f6b5981ff454da297df2c2fe9e94f673","dd5869ad41edfce8851db05dae23945210850976e91b7fb8faaa9ea59c69995d","ad09c3e2bbb48d6c6a38865f8013c03275630955c3ecbbfbbe2d51e74a84afb2","c14b2825ede264a0fa60b2880ed283e65879531169601ba6ab3aa40d98ec9861","38bd2a2a1ecb4cd150b9b447fe424064b6423e8bde938e90f806fe7f4968347e","b4cd92f37fd75c22fb47f02bc833540fd1540e9398562f0f6a2344ad54e05ffc","e9a2db2bcc5081a7d57be8e2decccf33b99595750fba2847ca0d51079620564a","d0a643b12291747f50e7fd5d296bada3272e27bd52bed483fe2face252a3854e","ab990009799ff4ed02419ce714f4c144e8db808e94d64a9ef92f34629a333b7b","9e6bcd856fd5797acea15047b0d9a72a989f9c0d06e60c5b2e4a7bd7a098229c","44ec69d15ff3a6afdb9d5346d4e8551e6b37537600b498b5ba60dec1496870d8","7263df29f047b4cc4d4e0c0cd3b00d10ec3a5e1fbc0b61d56a8d5649773a90bd","9e6bcd856fd5797acea15047b0d9a72a989f9c0d06e60c5b2e4a7bd7a098229c","452bb209f92227234e12119193c75724bccdb348204aeb88dfcd3d11868a766e","6f09a7b209b29e27b192d4d70fde979915961217f166f22d12eb1e1bbb50085e","9e6bcd856fd5797acea15047b0d9a72a989f9c0d06e60c5b2e4a7bd7a098229c","6420641d5f9bae7484ae29b1dd14c853c8ede7de9e24922b56938c221508702d","1fe0ea7cac16d2268a87e070dc2830d68c7d598d7a59d908bf8fb5432a9b5f4d","dcb2f3c6c441fa61814092cd2b4c87619d0557e5cf39acd425e3ede1b21867f2","5e5ed7797b8ed51a110f16e101079a080b0746310793a181cbf37c1bb4eb4a76","9e6bcd856fd5797acea15047b0d9a72a989f9c0d06e60c5b2e4a7bd7a098229c","0d37b264587c5833ae3510a826118bbbe86285b6fcbe43aed958865cab16834f","eb73b1e2b9239b9f514dd43434d4acf07ac396a51fb38e21cc7bcd832c1e722b","e0c7d8c4c158993a6266cce069d7c8448c4295fd6b9222a8269fe9212fbe9a66","fcf585ce9a1cabfd288b9908fedc0ce104326abf31cdf0ab1c428f262a802b88","dbfc1e693ff4117d8d9ab588bf059cef78ce76646290e636d209bef1e5e5e1f0","f2e0936f56db81de42cd08437db5307c1417ddd8acf3197d9e6deec9bfd35780","9e6bcd856fd5797acea15047b0d9a72a989f9c0d06e60c5b2e4a7bd7a098229c","d2e145bf002d13e82407b5a113d3e145e31ca74d7a4296ceef283642c7efe350","bad7f4dd8a1257fa106dc9646e7b5f34d49248dd42fe8d17e9b7b62964bb494c","9e6bcd856fd5797acea15047b0d9a72a989f9c0d06e60c5b2e4a7bd7a098229c","011c8ca4ddb13dfd8fb2702c929923dc557bf96d6feb6c30530e4690be03172e","683bace06b5c1a128b169157fed918a5478cb78fe529ce1a5d87f770a744f7c5","9e6bcd856fd5797acea15047b0d9a72a989f9c0d06e60c5b2e4a7bd7a098229c","f7b78270dd424e4d9f8829fbb9ee0d7f60d2d696cb0ee15ea719c860eb687d10","75e3be6be7312cc55a0303472a511442541bfa73e9e6da8914a82b450d1b7cee","9e6bcd856fd5797acea15047b0d9a72a989f9c0d06e60c5b2e4a7bd7a098229c","d71b28733a85f5b558d513ac9f808831143fc50be052eeeb1d904d6d6bb0f9f5","e51ac4f59541cfbe6c0044ce680765d0dda95c7419f50ac130d5c2b0be129105","56c194cb495b778f61e3a50a5bfaf2eb48ebfe18ae0539a2306d64b44bfa0d36","9e6bcd856fd5797acea15047b0d9a72a989f9c0d06e60c5b2e4a7bd7a098229c","4d1da9f27dfd309d7be7193efa6a15c0d61d59ffd89a3dacb06c6a424ce60a41","a6b67384ccf8b558ef85c51651dbb61f3c2548a050371f18e7d98f36736c61a6","f84f8999a356279ab81f17471f0440ed91115e9c5cf6613bd9878830a156f2d4","9e6bcd856fd5797acea15047b0d9a72a989f9c0d06e60c5b2e4a7bd7a098229c","cdc730170a7001df1adaef65fec2a17ab000687ad5ee07fc074b30ece947d47b","21d393055908d4574f00f25f78ee5eaa2a85a020cbb24f050ebdbeacf81338e8","9e6bcd856fd5797acea15047b0d9a72a989f9c0d06e60c5b2e4a7bd7a098229c","97ad7f5464a4f9e11ddb2348ccf5b8ecff5d9c1ed03a2bc3330c1b9eda3c2caf","b00e79b90a1925f46f8a5fe7de0f6c77d14caa1b1577ee07ff6bd1bce6951083","8af5f1741b61b1d59b06b6de5eaa49db1678d38cb02c0171c40757e56f6d5a96","9e6bcd856fd5797acea15047b0d9a72a989f9c0d06e60c5b2e4a7bd7a098229c","e08758a14bd97f112cb0455841f84797ded0add402ffab99d6a7d832c645d993","3243cb239f3a0e7f9d44248e1c20147e3f90200dab3856d7bed82cd02cef45cb","224c52a63dfd0eebe4e5820ac8f59e0685b3f0aa7cde8cb7e2f71df29f372b45","4417cbc31883a42d88777e0796a7f4a6eee56588bfd836766c45ede9c677cc0f","e03b0acfc42097fa0d785378e35a9de86d430caaaa89991b4a395e6b6babdab8","81819e58f8cd795c1ca0725971dbc0d90f7d4a20b7da6b1952535949a681781e","8e6e2a350f637bb40850d006a32964428efa79dc31affadd089b45fe082f5d71","166aa7e82c8dbb7d532719231a01bb79de331dc46d737d32f043b7c3d8cf4277","39cbfe9e6dc7d694a1ae17ebe9e1fbc4e53ba4bf2c3ad0d3c5cf932cbb749236","4c0c65c69bd95c78216bf6600bbdd6e9d44d6c12f45cf294b528c2a42e1ba7f4",{"version":"b9589dff9ec7e911f12ad0ded58c8f8ba3d5dda2d4f8daa22123eeadea97d151","affectsGlobalScope":true},"dd6ebc2528383e04dc80f5a85eb6344c563ecfa0f06da8369283444705f46a53","a9292a2bb7680060831088d354546ed7d7fa3894d3fbe9a6abe1c93b2779735f","ef4308f7dd4437d9d43a498aa79020b38ccaf9e9ffb52b94dbdba311daf6fd86","7e503a29dd0babdba8863a7212dfd7b24b96279662299d017c9340230956e6c0","56178976c6d1cbd984e93693e2ae471476b19ea350182e2a64e1caa0ad1534b3","5ca612e87fdc7e084892577e962c0a5c09f438e65f0aa1fa26d7b63c67c09f7e","4dd2fefb9af58c77cd0b4e89526005ab74812961d362e369005d0ac925a1000a","b7f8d5d0fd065435c6c9e86fe762a398eb7b687fa03d36f5ca2ec63a085809cb","42a70f18777f68428fcdb9bff0e3792578487e1ffdffe34cf5b5cd2222acbd43","43296c0300ab123d12c6e3641b8b3e9fbfe815faafb0972f90b818a48acf8ea5","a138a37f7692d261d1709810811579bf44a0f9253e38d5ed6939b591e97209be","7f2f20edfb1973fd6ce5cb618067f778999000d1f5b1e81983aa5ae6e4a86c65","6356150d3eb94cb07cbb8b026e1c13fcc95e512a2f0059b3ce3da9977f5709c6","299415611c8cd2e532f223747469e1fd00d6a02fbd1527aa6f3187e7a77b8190","a2667994edf8ced38ae3125f8fa4a723ab0a0a7b6afb784f404d5f812a4e4049","7b77196523adc7af2fa8e67223ce5d4806bde13c1971ea6e97ef9457123c9884","3aed1cf692cd84c954feb24fc5e75e86e49885c03a0b7d988f2d72fbb5736849","0a97b56c5f07e1244f9b888b4f4804df79def8bfbdc4f7fd984f1d1ce24f4e83","34d0efad1164c28c48199cfa95d95f3f68ccf810e07078cc9bbd2677daf228c5","f4e88c3d9552887334591534de9387e60479f7a8768d5ada11b11ea0db55ef1b","62495be6e4ba16ba6c5404764d476fbcfd1fb69a0221e4e194be2d531ac6275a","acd8389cc4ed7d81483933e5507bb2a0d6ee40487d6632075c3b4445f76f7de6","eef83a8cb5785d48b99b2923b1edd36306a6d764e7838ac0e8c3676d0d383571","588373916fb9aa65269ed93990d366de5b569f08b5f528f8a26c79661d4fd973","6c7370157af73faca61013c2f8abd3b6636ec79161ab302ee474b71903d32671","1eca9232dc029acfb303e7e26186edb9c9977b8eb1eef155aafe8ce50ddaf937","26721ae1885f07baf44381e1b3b929dbc10e3b7546d8ee976d1c3a33b4e65385","aeaeaf2f2869463230c22fe3cbf1f449b03178fe17318019b985738f503cfd16","18d2dea5851d482dbdbd604e79157232448eecce9911e24612918a7bb85a6950","bdfd1cc9a92bf8741e9efd952d0d97fb8e673e9033867ba18d26ce0e760d1ca1","4aeedd1e4d62d60f64759857deb8ccdf93cdf3cccdad9439eed3e4a6d4da5c84","1343617fc15b8105ec9f9f54c355b1da33332e4fa87a0d4f9282f818e39c6cb5","95656aff81e3b95fac8b06bb240221f3f3f813c2641bc6f1879f8930ada00cbe","156978acc389517c03a91100cdabebc7f6af6b400afec4e4161b04ad50136716","6ddb20a382c6f63bb7e230c2ea60ff9cd14f4bba1d82fedbcdebbdb1eba76767","144b5e758146b14b7df63cd2ee075a05e6ff1e54189d29b7c70d10c9f4dde2e9","31f86828fc424522351747efa494e101a0091fb9cc10f95ff842ef6ef0dbb433","e951f3578f142259c7aeb5dcc45525788697c7b58a08b59b10ac8c5590f30abd","9cc2b7dc6bc0f35746819546d10959337b237463cbb11d36446d998e0ff4cf13","8dc36202e0aa90c8a34e94fc926a8325ae98a6c2bc04a8a8699b51cbf580d57e","4ff39a59f7b9af314b8ae51e33a6e28ebabd12da437f565bb005860d671d8e4b","ca746ebcf3bdc1022d57c20bfcec7a22f3198ce233ee202dae43e2f68a5d3b3f","aaed3e5dac6e09d75466e65e559f915fdad20be1a05315e78e4f2db4b916e3e2","d89fa604fff0bf30175c27d7e34b839c46fcd78e084ccf8d484950c519aab797","c61117ad6ddbd6451fe6e927cd9a1103b8d4b78e796473e3bc442a22a69c5219","6f1cbb58c880b7d5f93a26cbb255e3a5c63f82fe31a448c482197f1c898d1b32","3859a0ae7e6f7f1d0973396bb081054c9111eea736ec49780f3fb0eef1729e26","b7939cfe749555aa0c0620408dfd487bcfa791945244e5bb58ee042480f4b835","92292fa6a3d2190158460697c89597c2c9cd865863a99d0728db32ff01d394cb","10436b6c5d43bae55fec8348661a4d718bbf2b1530727bf2afe0c3ad58333351","2933325a0e5d3eec71a1866c2f229d0bb19980f39f0c1bbcaacc21297a08ee47","a1548d823ebfccd15f6c747f1249f5ea51ab70cdac878d44c331d4d91d547621","b194f710a73118ca929f5a30de4b9dd7eccf979d6278c5171ff5535697a99262","b792bc83e2f9bce0589c559c676ed4f08926c2d51cf20784aff52b80b47d9d59","fdf6afc18599112aba977cca67d26594bc4bb3f3e2525b2336b9212d0cf1dcc0","878d52dc9774dc1ed6d19e9eb3e1be5884f2c2f68d8bc5faf64598015934b54d","8a806520622a14786ca17572adec9b7bf8d25f36b5f998a40f24677ca8aedb82","6f19c8395acfb6f99e8aadef701994842ba9c79e72e1e455c6b7334defcf0eef","ed3d603c95fcf4acb6c969526227f9daac9ab48cf7f724494231e89f959afaf6","e275649fe5546f3689eb9215f40f10345e1254bbf581f012fb84ac3e5e4fc679","433d39d7c678aab3bde612dd79bd46c649c7529d74d9b5911f8c1f3068ea3744","dc453da327c8cb8e764d4f8d36d2d51556ec1392ecbe11e660abe0c8d1f9fcea","3c6a4dd0ffccf4bc42f552de58f4fc020be982bafc7a8aeb7ea0e0ba033693f9","81194b14265ea42c7b090f57944017275a73259d3188fa60523694350e0d71f5","3c31507f4a69d307d2147c03708635b64d9d0ca84ac01dd04b913f0367693781","3d7763057037aa465adcf6f24e1c232e876c0eae6d5afc245219eb2cf34b092a","6f69b329cadbe2bbba0245a832323228010082d5ef4455f5543ef2dcb351e6b4","5f47fd7249f73f93660493bc9c4b45ca552cf890e9ea62fea2afe9fb2efb7d9f","4847590e88b6da170b3a1d2fdfb45e3a2d4bf75bfc26d08eb97240723e5c984d","3a3b8f6149ff6d789527e7aa8dcceb42933f21c2863f0a16c657212e1a00f9a4","f7e6efce8ef5c056875213ddeda719c422608be1b182d0885bdc593e0db50621","f89af9f9d7515310ae98522999fc5c4a1a179cf00b9f1b0a8f594562fbd0a74e","bbecb483f28fcca4397a954f8f73cad81f787227dee302abf1e9d7b3e5b289ea","6ac75205f6d14499adeaa88b910bdeb2bbb7763c330dd70583f1e5059415e977","3d8db202f4586242bf0be4711f69ff2eb5f254912700163bd73fc04403244ae8","48a0aece42db4f1670ea5c6e0eb7068f2b856f39dc84c663b4888ca34eb8a8cf","72b5924cb5b5a492a0296f239a3386855494aea6f7e81ade18f8583890a2f485","7fdeec60276e682a6ec86c7dd60ca102f684c684afe4c046ea1d95254ec756b7","79314fd79adece7b55dea13c0f98b053d98d1dc7ffe509ef8249520a6ccc5ee8","9aa404bcae5efbe42a5c3b58b956bb7e2158efe77a638afcaec0bfd236c03174","6544b7eb21a5bb95d6b996add33df5cc181007eb33bcbf7c6087c08cf2abf3a7","d14b13a9f62c3c6176820b354576c98983a80f1bb4ed4399ceac90c958914277"],"root":[[260,350],[352,395],[468,567],[638,641],[643,654],[656,674],[676,681],[683,685],[690,698],[700,1307]],"options":{"allowJs":true,"checkJs":true,"esModuleInterop":true,"module":99,"rewriteRelativeImportExtensions":true,"skipLibCheck":true,"sourceMap":true,"strict":true,"target":99,"verbatimModuleSyntax":true},"referencedMap":[[260,1],[261,2],[262,3],[263,4],[264,4],[265,5],[266,6],[267,6],[268,6],[269,6],[270,6],[271,6],[272,6],[273,6],[274,6],[275,6],[276,6],[277,6],[278,6],[279,6],[280,6],[281,6],[282,6],[283,6],[284,6],[285,6],[286,6],[287,6],[288,6],[289,6],[290,6],[291,6],[292,6],[293,6],[294,6],[295,6],[296,6],[297,6],[298,6],[299,6],[300,6],[301,6],[302,6],[303,6],[304,6],[305,6],[306,6],[307,6],[308,6],[309,6],[310,6],[311,6],[312,6],[313,6],[314,6],[315,6],[316,6],[317,6],[318,6],[319,6],[320,6],[321,6],[322,6],[323,6],[324,6],[326,6],[325,6],[327,6],[328,6],[329,6],[330,4],[331,4],[332,4],[333,4],[334,4],[335,4],[336,4],[337,4],[338,4],[339,4],[340,4],[341,4],[342,4],[343,4],[344,4],[345,4],[346,4],[347,4],[348,4],[349,4],[350,4],[352,7],[351,8],[353,4],[354,4],[355,4],[356,4],[357,4],[358,4],[359,4],[360,4],[361,4],[362,4],[363,4],[364,4],[365,4],[366,4],[367,4],[368,4],[369,4],[370,4],[371,4],[372,4],[373,4],[374,4],[375,4],[376,4],[377,4],[378,4],[379,4],[380,4],[381,4],[382,4],[383,4],[384,4],[385,4],[386,4],[387,4],[388,4],[389,4],[390,4],[392,4],[391,4],[393,4],[394,4],[395,4],[687,9],[689,10],[686,11],[688,11],[257,11],[259,12],[255,13],[256,14],[396,13],[412,15],[258,11],[410,11],[91,11],[162,16],[163,16],[164,17],[102,18],[165,19],[166,20],[167,21],[100,11],[168,22],[169,23],[170,24],[171,25],[172,26],[173,27],[174,27],[175,28],[176,29],[177,30],[178,31],[103,11],[101,11],[179,32],[180,33],[181,34],[221,35],[182,36],[183,37],[184,36],[185,38],[186,39],[187,40],[188,41],[189,41],[190,41],[191,42],[192,43],[193,44],[194,45],[195,46],[196,47],[197,47],[198,48],[199,11],[200,11],[201,49],[202,50],[203,49],[204,51],[205,52],[206,53],[207,54],[208,55],[209,56],[210,57],[211,58],[212,59],[213,60],[214,61],[215,62],[216,63],[217,64],[218,65],[104,36],[105,11],[106,66],[107,67],[108,11],[109,68],[110,11],[153,69],[154,70],[155,71],[156,71],[157,72],[158,11],[159,19],[160,73],[161,70],[219,74],[220,75],[84,76],[88,77],[85,11],[86,78],[87,79],[450,80],[467,81],[446,11],[449,82],[461,83],[447,84],[448,85],[413,86],[428,87],[429,88],[427,11],[397,11],[406,89],[405,90],[424,89],[414,91],[416,92],[452,92],[415,93],[408,94],[407,11],[404,95],[398,96],[444,97],[400,98],[402,99],[443,11],[430,98],[401,11],[403,96],[399,11],[411,11],[655,11],[642,11],[226,11],[682,11],[89,100],[438,101],[440,102],[439,103],[437,104],[436,11],[249,11],[251,105],[250,11],[92,11],[90,11],[458,68],[459,106],[465,107],[462,11],[463,107],[464,108],[466,109],[244,110],[242,111],[243,112],[231,113],[232,111],[239,114],[230,115],[235,116],[245,11],[236,117],[241,118],[247,119],[246,120],[229,121],[237,122],[238,123],[233,124],[240,110],[234,125],[224,126],[223,127],[637,128],[568,11],[571,11],[569,129],[570,130],[572,131],[573,132],[632,11],[633,133],[574,11],[575,134],[576,135],[577,136],[578,131],[579,137],[580,131],[581,138],[582,135],[583,139],[584,11],[585,140],[636,141],[596,142],[595,129],[587,143],[586,144],[589,145],[588,131],[592,146],[591,147],[594,148],[593,11],[635,149],[634,11],[598,150],[597,131],[600,151],[599,129],[602,152],[601,129],[604,153],[603,135],[606,154],[605,135],[608,155],[607,135],[610,156],[609,135],[612,157],[611,135],[614,158],[613,135],[616,159],[615,135],[618,160],[617,135],[620,161],[619,129],[621,162],[590,131],[627,163],[626,135],[623,164],[622,131],[625,165],[624,131],[629,166],[628,135],[631,167],[630,135],[228,11],[675,168],[93,169],[699,11],[425,11],[409,11],[81,11],[82,11],[13,11],[14,11],[16,11],[15,11],[2,11],[17,11],[18,11],[19,11],[20,11],[21,11],[22,11],[23,11],[24,11],[3,11],[25,11],[26,11],[4,11],[27,11],[31,11],[28,11],[29,11],[30,11],[32,11],[33,11],[34,11],[5,11],[35,11],[36,11],[37,11],[38,11],[6,11],[42,11],[39,11],[40,11],[41,11],[43,11],[7,11],[44,11],[49,11],[50,11],[45,11],[46,11],[47,11],[48,11],[8,11],[54,11],[51,11],[52,11],[53,11],[55,11],[9,11],[56,11],[57,11],[58,11],[60,11],[59,11],[61,11],[62,11],[10,11],[63,11],[64,11],[65,11],[11,11],[66,11],[67,11],[68,11],[69,11],[70,11],[1,11],[71,11],[72,11],[12,11],[76,11],[74,11],[79,11],[78,11],[73,11],[77,11],[75,11],[80,11],[83,11],[129,170],[141,171],[126,172],[142,173],[151,174],[117,175],[118,176],[116,177],[150,178],[145,179],[149,180],[120,181],[138,182],[119,183],[148,184],[114,185],[115,179],[121,186],[122,11],[128,187],[125,186],[112,188],[152,189],[143,190],[132,191],[131,186],[133,192],[136,193],[130,194],[134,195],[146,178],[123,196],[124,197],[137,198],[113,173],[140,199],[139,186],[127,197],[135,200],[144,11],[111,11],[147,201],[99,202],[222,203],[254,204],[225,205],[95,203],[94,11],[96,206],[97,11],[98,207],[248,11],[252,208],[227,11],[253,209],[451,210],[456,211],[445,212],[426,213],[422,214],[419,215],[442,11],[420,91],[434,216],[431,217],[454,218],[453,219],[418,220],[433,221],[417,11],[421,222],[455,223],[457,224],[441,225],[460,226],[435,227],[432,11],[423,11],[469,11],[516,228],[520,229],[517,230],[521,231],[522,232],[499,233],[523,234],[501,235],[481,236],[500,11],[508,237],[507,238],[506,239],[482,240],[505,241],[504,242],[497,243],[518,244],[503,245],[502,246],[498,247],[509,248],[512,249],[511,250],[510,251],[483,252],[524,253],[519,254],[470,11],[476,255],[473,256],[474,257],[475,258],[479,259],[478,260],[525,261],[471,11],[477,251],[472,262],[526,263],[514,264],[515,265],[513,266],[480,236],[527,267],[529,268],[528,11],[531,269],[533,270],[532,271],[530,11],[535,272],[541,273],[488,274],[540,274],[538,272],[539,275],[534,276],[537,277],[536,276],[495,278],[542,279],[496,280],[543,281],[544,282],[545,11],[546,283],[491,281],[489,11],[492,284],[493,285],[490,286],[494,287],[548,288],[547,11],[485,289],[484,11],[487,290],[486,281],[551,291],[552,291],[556,292],[554,293],[553,291],[549,11],[550,294],[555,295],[558,296],[557,11],[559,11],[560,297],[561,11],[562,298],[563,299],[564,256],[566,300],[567,8],[1017,301],[1015,302],[1016,303],[912,304],[911,305],[988,306],[987,307],[1097,308],[982,309],[981,310],[1004,311],[1099,312],[1003,313],[720,314],[1100,312],[719,315],[1101,316],[952,316],[951,317],[972,318],[971,319],[986,320],[985,321],[1102,322],[1103,323],[962,324],[961,325],[958,326],[957,327],[960,328],[959,317],[994,329],[993,317],[946,330],[1104,312],[945,307],[944,331],[943,307],[990,332],[989,317],[1057,333],[1056,317],[948,334],[947,317],[1067,335],[1066,317],[1105,336],[950,337],[949,338],[1106,11],[1107,339],[1070,340],[1108,299],[1069,310],[954,341],[1109,312],[953,310],[921,342],[920,321],[925,343],[924,344],[915,345],[914,346],[917,347],[916,348],[927,349],[926,350],[929,351],[928,350],[923,352],[922,350],[931,353],[930,354],[942,355],[933,356],[932,321],[919,357],[918,348],[935,358],[934,359],[913,11],[939,360],[938,321],[937,361],[936,362],[941,363],[940,362],[966,364],[965,365],[992,366],[1110,367],[991,368],[984,369],[983,310],[1002,370],[1001,371],[1055,372],[1054,319],[1060,373],[1059,374],[1058,310],[968,375],[967,376],[998,377],[997,310],[974,378],[973,319],[1063,379],[1062,380],[1061,310],[956,381],[955,382],[996,383],[995,317],[1068,384],[1112,385],[1065,386],[1064,317],[970,387],[1113,312],[969,317],[1006,388],[1114,312],[1005,317],[1000,389],[999,390],[1008,391],[1007,392],[978,393],[977,317],[976,394],[975,395],[980,396],[979,317],[964,397],[963,398],[1080,399],[1079,400],[1078,401],[1077,313],[1076,402],[1075,313],[1074,403],[1073,313],[1086,404],[1085,405],[1088,406],[1082,407],[1081,313],[1084,408],[1083,313],[1087,299],[1072,409],[1071,313],[716,410],[717,411],[715,1],[1096,412],[1050,413],[1049,414],[1115,11],[1116,11],[1120,415],[1119,416],[1118,417],[1117,418],[1121,419],[722,420],[721,11],[718,421],[1010,239],[1011,422],[1029,423],[1028,424],[1046,425],[1048,426],[1047,427],[1045,428],[1122,429],[1020,430],[1024,431],[1025,11],[1027,432],[1026,433],[1023,433],[1021,433],[1022,433],[1019,434],[1013,435],[1014,436],[1039,437],[1041,437],[1040,437],[1037,437],[1043,438],[1042,437],[1018,439],[1038,437],[1030,440],[1044,441],[1035,442],[1032,437],[1034,437],[1033,437],[1036,443],[1031,437],[1012,11],[1123,444],[1124,11],[1098,11],[1052,445],[1053,446],[1051,447],[1090,448],[1125,449],[1126,302],[1093,448],[1092,450],[1091,448],[1095,451],[1094,448],[1089,429],[1130,11],[1129,11],[1131,11],[1132,452],[1169,453],[1171,454],[1172,455],[1170,456],[1216,457],[1174,458],[1175,459],[1173,460],[1217,461],[1177,462],[1178,463],[1176,460],[1180,464],[1182,465],[1183,466],[1181,467],[1187,468],[1189,469],[1190,470],[1188,471],[1218,472],[1192,473],[1193,474],[1191,475],[1215,476],[1219,299],[1195,477],[1196,478],[1220,479],[1194,480],[1198,481],[1199,482],[1221,483],[1197,460],[1202,484],[1203,485],[1200,486],[1201,487],[1206,488],[1207,489],[1204,483],[1205,490],[1209,491],[1210,492],[1222,457],[1208,460],[1213,493],[1214,494],[1211,495],[1212,480],[1165,496],[1144,11],[1145,497],[1146,11],[1148,498],[1147,11],[1149,499],[1163,11],[1164,500],[1162,11],[1223,501],[1142,502],[1150,11],[1151,503],[1166,504],[1160,505],[1161,506],[1138,11],[1179,507],[1155,508],[1157,509],[1156,510],[1153,511],[1154,512],[1152,11],[1184,513],[1224,514],[1167,515],[1168,11],[1185,516],[1186,517],[1137,518],[1136,519],[1133,308],[1135,520],[1134,521],[1128,522],[1127,11],[1139,523],[1140,11],[1141,11],[1158,524],[1159,525],[1143,526],[730,527],[732,528],[733,529],[731,530],[854,531],[855,532],[853,533],[1225,11],[1226,534],[724,535],[725,536],[723,530],[1227,537],[727,538],[728,539],[726,530],[713,540],[714,541],[712,542],[1235,543],[873,544],[874,545],[872,546],[1236,547],[735,548],[736,549],[734,530],[1237,550],[738,551],[739,552],[737,530],[896,553],[897,554],[895,555],[1239,556],[848,11],[850,557],[851,558],[849,530],[1238,11],[843,559],[844,560],[842,561],[1241,562],[881,563],[882,564],[880,565],[1242,566],[884,567],[885,568],[883,569],[1240,570],[905,571],[906,572],[904,573],[1243,566],[908,574],[909,575],[907,576],[1244,577],[856,578],[857,579],[852,580],[683,581],[669,582],[677,11],[668,530],[678,11],[680,583],[679,584],[681,530],[684,530],[697,585],[698,11],[700,586],[701,530],[859,587],[860,588],[858,589],[840,590],[841,591],[839,592],[1245,593],[787,594],[788,595],[786,530],[638,11],[565,502],[862,596],[1247,597],[1248,598],[863,599],[861,530],[801,600],[799,601],[802,602],[800,603],[865,604],[1246,593],[866,605],[864,530],[910,606],[741,607],[742,608],[1249,534],[740,530],[829,609],[828,530],[1251,610],[1252,611],[1253,612],[1254,613],[830,614],[1257,615],[1258,616],[831,614],[1259,617],[692,618],[696,619],[695,620],[691,621],[690,622],[694,623],[693,11],[1261,624],[1262,625],[889,614],[1260,626],[1250,299],[1263,627],[891,628],[1264,629],[709,299],[703,530],[1265,630],[704,631],[888,614],[1266,632],[890,11],[1267,633],[887,614],[1268,634],[1270,635],[1269,530],[833,636],[834,637],[1271,638],[832,639],[1272,640],[1273,641],[1256,642],[838,643],[1255,644],[846,645],[847,646],[1274,647],[845,561],[744,648],[745,649],[1275,534],[743,530],[781,650],[782,651],[1277,652],[780,653],[750,654],[751,655],[748,656],[749,657],[810,658],[811,659],[809,660],[807,661],[808,662],[835,299],[837,663],[1278,664],[836,665],[753,666],[754,667],[1279,534],[752,530],[756,668],[757,669],[1280,670],[755,530],[876,671],[877,672],[1281,673],[875,674],[760,675],[761,676],[758,677],[759,678],[813,679],[814,680],[1282,681],[812,530],[893,682],[894,683],[886,684],[892,685],[763,686],[764,687],[1283,534],[762,530],[815,299],[1284,530],[817,688],[1285,689],[816,530],[769,384],[770,690],[1111,691],[768,530],[797,692],[798,693],[795,694],[796,695],[791,696],[792,697],[789,638],[790,698],[766,699],[767,700],[1286,701],[765,530],[869,702],[867,546],[871,703],[710,530],[1009,704],[640,11],[868,702],[1276,705],[747,706],[746,707],[711,708],[870,702],[772,709],[773,710],[1287,711],[771,530],[784,712],[785,713],[1288,714],[783,530],[899,715],[900,716],[1290,717],[898,565],[902,718],[903,719],[1291,720],[901,721],[805,722],[806,723],[803,601],[804,724],[778,725],[779,726],[1293,727],[777,530],[775,728],[776,729],[1292,730],[774,530],[819,731],[820,732],[1294,733],[818,530],[825,734],[827,735],[824,736],[826,737],[1295,299],[794,738],[1296,739],[793,707],[666,740],[676,524],[729,11],[705,741],[706,741],[654,11],[639,742],[707,11],[670,11],[658,11],[659,743],[656,11],[657,744],[1297,745],[1228,583],[1233,322],[1234,746],[1229,747],[1231,748],[1232,749],[878,11],[1230,750],[1289,751],[879,752],[653,753],[685,299],[661,11],[652,11],[644,754],[663,11],[665,299],[667,755],[664,756],[1299,754],[647,757],[646,11],[708,758],[660,519],[650,759],[651,760],[702,761],[648,11],[649,762],[641,763],[662,764],[671,765],[672,766],[1302,767],[1303,767],[643,768],[1304,769],[1305,767],[1300,11],[1301,770],[1306,771],[673,772],[645,773],[674,11],[1298,774],[822,775],[823,776],[821,614],[1307,777],[468,778]],"semanticDiagnosticsPerFile":[[1060,[{"start":9,"length":7,"messageText":"Module '\"./pin-input.svelte\"' has no exported member 'default'.","category":1,"code":2305}]],[1063,[{"start":9,"length":7,"messageText":"Module '\"./rating-group.svelte\"' has no exported member 'default'.","category":1,"code":2305}]],[1219,[{"start":188,"length":11,"messageText":"Module '\"*.svelte\"' has no exported member 'PortalProps'. Did you mean to use 'import PortalProps from \"*.svelte\"' instead?","category":1,"code":2614},{"start":201,"length":12,"messageText":"Module '\"*.svelte\"' has no exported member 'PortalTarget'. Did you mean to use 'import PortalTarget from \"*.svelte\"' instead?","category":1,"code":2614}]]],"affectedFilesPendingEmit":[351,516,520,517,521,522,499,523,501,481,500,508,507,506,482,505,504,497,518,503,502,498,509,512,511,510,483,524,519,470,476,473,474,475,479,478,525,471,477,472,526,514,515,513,480,527,529,528,531,533,532,530,535,541,488,540,538,539,534,537,536,495,542,496,543,544,545,546,491,489,492,493,490,494,548,547,485,484,487,486,551,552,556,554,553,549,550,555,558,557,559,560,561,562,563,564,566,567,1017,1015,1016,912,911,988,987,1097,982,981,1004,1099,1003,720,1100,719,1101,952,951,972,971,986,985,1102,1103,962,961,958,957,960,959,994,993,946,1104,945,944,943,990,989,1057,1056,948,947,1067,1066,1105,950,949,1106,1107,1070,1108,1069,954,1109,953,921,920,925,924,915,914,917,916,927,926,929,928,923,922,931,930,942,933,932,919,918,935,934,913,939,938,937,936,941,940,966,965,992,1110,991,984,983,1002,1001,1055,1054,1060,1059,1058,968,967,998,997,974,973,1063,1062,1061,956,955,996,995,1068,1112,1065,1064,970,1113,969,1006,1114,1005,1000,999,1008,1007,978,977,976,975,980,979,964,963,1080,1079,1078,1077,1076,1075,1074,1073,1086,1085,1088,1082,1081,1084,1083,1087,1072,1071,716,717,715,1096,1050,1049,1115,1116,1120,1119,1118,1117,1121,722,721,718,1010,1011,1029,1028,1046,1048,1047,1045,1122,1020,1024,1025,1027,1026,1023,1021,1022,1019,1013,1014,1039,1041,1040,1037,1043,1042,1018,1038,1030,1044,1035,1032,1034,1033,1036,1031,1012,1123,1124,1098,1052,1053,1051,1090,1125,1126,1093,1092,1091,1095,1094,1089,1130,1129,1131,1132,1169,1171,1172,1170,1216,1174,1175,1173,1217,1177,1178,1176,1180,1182,1183,1181,1187,1189,1190,1188,1218,1192,1193,1191,1215,1219,1195,1196,1220,1194,1198,1199,1221,1197,1202,1203,1200,1201,1206,1207,1204,1205,1209,1210,1222,1208,1213,1214,1211,1212,1165,1144,1145,1146,1148,1147,1149,1163,1164,1162,1223,1142,1150,1151,1166,1160,1161,1138,1179,1155,1157,1156,1153,1154,1152,1184,1224,1167,1168,1185,1186,1137,1136,1133,1135,1134,1128,1127,1139,1140,1141,1158,1159,1143,730,732,733,731,854,855,853,1226,724,725,723,1227,727,728,726,713,714,712,1235,873,874,872,1236,735,736,734,1237,738,739,737,896,897,895,1239,848,850,851,849,1238,843,844,842,1241,881,882,880,1242,884,885,883,1240,905,906,904,1243,908,909,907,1244,856,857,852,683,669,677,668,678,680,679,681,684,697,698,700,701,859,860,858,840,841,839,1245,787,788,786,638,565,862,1247,1248,863,861,801,799,802,800,865,1246,866,864,910,741,742,1249,740,829,828,1251,1252,1253,1254,830,1257,1258,831,1259,692,696,695,691,690,694,693,1261,1262,889,1260,1250,1263,891,1264,709,703,1265,704,888,1266,890,1267,887,1268,1270,1269,833,834,1271,832,1272,1273,1256,838,1255,846,847,1274,845,744,745,1275,743,781,782,1277,780,750,751,748,749,810,811,809,807,808,835,837,1278,836,753,754,1279,752,756,757,1280,755,876,877,1281,875,760,761,758,759,813,814,1282,812,893,894,886,892,763,764,1283,762,815,1284,817,1285,816,769,770,1111,768,797,798,795,796,791,792,789,790,766,767,1286,765,869,867,871,710,1009,640,868,1276,747,746,711,870,772,773,1287,771,784,785,1288,783,899,900,1290,898,902,903,1291,901,805,806,803,804,778,779,1293,777,775,776,1292,774,819,820,1294,818,825,827,824,826,1295,794,1296,793,666,676,729,705,706,654,639,707,670,658,659,656,657,1228,1233,1234,1229,1231,1232,878,1230,1289,879,653,685,661,652,644,663,665,667,664,1299,647,646,708,660,650,651,702,648,649,641,662,671,672,1302,1303,643,1304,1305,1300,1301,1306,673,645,674,1298,822,823,821,1307,468],"version":"5.9.3"} \ No newline at end of file
    + {@render children?.()} + + {@render children?.()} +