From 375e0ddb399be0f81946c8fa5c18962d6da4c484 Mon Sep 17 00:00:00 2001 From: Nathan Panchout Date: Sun, 25 Jan 2026 20:35:48 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A5(front)=20remove=20open-calendar=20?= =?UTF-8?q?package?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove deprecated open-calendar package. Functionality has been migrated to src/features/calendar/services/dav with improved architecture and TypeScript support. Co-Authored-By: Claude Opus 4.5 --- .../packages/open-calendar/.editorconfig | 25 - .../packages/open-calendar/.gitignore | 26 - src/frontend/packages/open-calendar/LICENSE | 21 - src/frontend/packages/open-calendar/README.md | 97 - .../packages/open-calendar/doc/API.md | 16 - .../Interfacing-with-CalDAV-and-CardDAV.md | 82 - .../open-calendar/doc/User-Interface.md | 30 - .../packages/open-calendar/eslint.config.mjs | 33 - .../open-calendar/images/open-calendar.png | Bin 116262 -> 0 bytes .../packages/open-calendar/index.html | 91 - .../packages/open-calendar/package.json | 69 - .../open-calendar/src/VCardComponent.ts | 43 - .../open-calendar/src/calendarClient.ts | 282 -- .../src/calendarelement/calendarElement.css | 7 - .../src/calendarelement/calendarElement.ts | 535 --- .../calendarSelectDropdown.css | 39 - .../calendarSelectDropdown.ts | 51 - .../packages/open-calendar/src/constants.ts | 7 - .../packages/open-calendar/src/contants.ts | 25 - .../open-calendar/src/eventBody/eventBody.css | 143 - .../open-calendar/src/eventBody/eventBody.ts | 203 - .../src/eventeditpopup/eventEditPopup.css | 30 - .../src/eventeditpopup/eventEditPopup.ts | 464 --- .../src/eventeditpopup/recurringEventPopup.ts | 49 - .../open-calendar/src/helpers/dav-helper.ts | 273 -- .../open-calendar/src/helpers/dom-helper.ts | 11 - .../open-calendar/src/helpers/ics-helper.ts | 56 - .../open-calendar/src/helpers/types-helper.ts | 22 - .../packages/open-calendar/src/index.css | 50 - .../packages/open-calendar/src/index.ts | 23 - .../open-calendar/src/popup/popup.css | 24 - .../packages/open-calendar/src/popup/popup.ts | 35 - .../open-calendar/src/translations.ts | 123 - .../open-calendar/src/types/addressbook.ts | 30 - .../open-calendar/src/types/calendar.ts | 39 - .../open-calendar/src/types/options.ts | 160 - .../packages/open-calendar/src/vite-env.d.ts | 1 - .../packages/open-calendar/tsconfig.json | 36 - .../packages/open-calendar/vite.config.ts | 23 - .../packages/open-calendar/webpack.config.js | 43 - src/frontend/packages/open-calendar/yarn.lock | 3636 ----------------- 41 files changed, 6953 deletions(-) delete mode 100644 src/frontend/packages/open-calendar/.editorconfig delete mode 100644 src/frontend/packages/open-calendar/.gitignore delete mode 100644 src/frontend/packages/open-calendar/LICENSE delete mode 100644 src/frontend/packages/open-calendar/README.md delete mode 100644 src/frontend/packages/open-calendar/doc/API.md delete mode 100644 src/frontend/packages/open-calendar/doc/Interfacing-with-CalDAV-and-CardDAV.md delete mode 100644 src/frontend/packages/open-calendar/doc/User-Interface.md delete mode 100644 src/frontend/packages/open-calendar/eslint.config.mjs delete mode 100644 src/frontend/packages/open-calendar/images/open-calendar.png delete mode 100644 src/frontend/packages/open-calendar/index.html delete mode 100644 src/frontend/packages/open-calendar/package.json delete mode 100644 src/frontend/packages/open-calendar/src/VCardComponent.ts delete mode 100644 src/frontend/packages/open-calendar/src/calendarClient.ts delete mode 100644 src/frontend/packages/open-calendar/src/calendarelement/calendarElement.css delete mode 100644 src/frontend/packages/open-calendar/src/calendarelement/calendarElement.ts delete mode 100644 src/frontend/packages/open-calendar/src/calendarselectdropdown/calendarSelectDropdown.css delete mode 100644 src/frontend/packages/open-calendar/src/calendarselectdropdown/calendarSelectDropdown.ts delete mode 100644 src/frontend/packages/open-calendar/src/constants.ts delete mode 100644 src/frontend/packages/open-calendar/src/contants.ts delete mode 100644 src/frontend/packages/open-calendar/src/eventBody/eventBody.css delete mode 100644 src/frontend/packages/open-calendar/src/eventBody/eventBody.ts delete mode 100644 src/frontend/packages/open-calendar/src/eventeditpopup/eventEditPopup.css delete mode 100644 src/frontend/packages/open-calendar/src/eventeditpopup/eventEditPopup.ts delete mode 100644 src/frontend/packages/open-calendar/src/eventeditpopup/recurringEventPopup.ts delete mode 100644 src/frontend/packages/open-calendar/src/helpers/dav-helper.ts delete mode 100644 src/frontend/packages/open-calendar/src/helpers/dom-helper.ts delete mode 100644 src/frontend/packages/open-calendar/src/helpers/ics-helper.ts delete mode 100644 src/frontend/packages/open-calendar/src/helpers/types-helper.ts delete mode 100644 src/frontend/packages/open-calendar/src/index.css delete mode 100644 src/frontend/packages/open-calendar/src/index.ts delete mode 100644 src/frontend/packages/open-calendar/src/popup/popup.css delete mode 100644 src/frontend/packages/open-calendar/src/popup/popup.ts delete mode 100644 src/frontend/packages/open-calendar/src/translations.ts delete mode 100644 src/frontend/packages/open-calendar/src/types/addressbook.ts delete mode 100644 src/frontend/packages/open-calendar/src/types/calendar.ts delete mode 100644 src/frontend/packages/open-calendar/src/types/options.ts delete mode 100644 src/frontend/packages/open-calendar/src/vite-env.d.ts delete mode 100644 src/frontend/packages/open-calendar/tsconfig.json delete mode 100644 src/frontend/packages/open-calendar/vite.config.ts delete mode 100644 src/frontend/packages/open-calendar/webpack.config.js delete mode 100644 src/frontend/packages/open-calendar/yarn.lock diff --git a/src/frontend/packages/open-calendar/.editorconfig b/src/frontend/packages/open-calendar/.editorconfig deleted file mode 100644 index e572184..0000000 --- a/src/frontend/packages/open-calendar/.editorconfig +++ /dev/null @@ -1,25 +0,0 @@ -# EditorConfig: http://EditorConfig.org - -# top-most EditorConfig file -root = true - -# Unix-style newlines with a newline ending every file -[*] -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true -charset = utf-8 -indent_style = space -indent_size = 2 -tab_width = 2 - -[*.sh] -indent_style = space -indent_size = 4 -tab_width = 4 - -[*.md] -trim_trailing_whitespace = false - -[*.{jsx,js,ts,tsx}] -max_line_length = 120 diff --git a/src/frontend/packages/open-calendar/.gitignore b/src/frontend/packages/open-calendar/.gitignore deleted file mode 100644 index 8933ece..0000000 --- a/src/frontend/packages/open-calendar/.gitignore +++ /dev/null @@ -1,26 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -.yarn -node_modules -build -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/src/frontend/packages/open-calendar/LICENSE b/src/frontend/packages/open-calendar/LICENSE deleted file mode 100644 index 4e166c4..0000000 --- a/src/frontend/packages/open-calendar/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2025 algoo - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/src/frontend/packages/open-calendar/README.md b/src/frontend/packages/open-calendar/README.md deleted file mode 100644 index f96e50a..0000000 --- a/src/frontend/packages/open-calendar/README.md +++ /dev/null @@ -1,97 +0,0 @@ -# Open Calendar - -Open Calendar is a modern web calendar frontend for CalDAV based calendars. - -![Open Calendar](images/open-calendar.png) - -### Key features -- [x] Configure individual calendars or multiple CalDAV servers -- [x] Display multiple calendars at the same time -- [x] Hide or show calendars and copy their URLs -- [x] Use the original calendar name and color -- [x] Show recurring events, alarms and attendees -- [x] Select timezones -- [x] Easily customize and integrate forms, notifications and rendering - -### There are 3 ways to use it -1. [With just a few lines of code](#minimal-setup), you can get a ready-to-use CalDAV client web application -2. [With a bit of development](#customized-forms), you can integrate it into your web application by customizing the forms -3. [With a bit more work](#complete-integration), you can even customize all components like event rendering, notifications, etc - -## Features - -### Supports multiple calendars at the same time -Open Calendar can deal with many CalDAV calendars at once, and also discover calendars directly from CalDAV servers. - -### Functional out of the box -Open Calendar supports all the features you would expect from a calendar client with little to no configuration: hide or show calendars or copy their URLs; drag, drop and resize events; show recurring events, alarms, attendees and more. - -### Easily customizable -Open Calendar is built to be customizable and integrated into larger apps. -Events content, forms, dropdowns and even notifications can be replaced by custom ones with ease - - - - -## Quick start - -First, install Open Calendar with the package manager of your choice (`yarn` in this case): -```bash -yarn add open-dav-calendar -``` - -Once this is done, you can add Open Calendar to your application at different levels: - -> # 🚧 Bellow is a work in progress 🚧 - -### Minimal setup -With just a few lines of code, you can get a ready-to-use CalDAV client web application. All you need to do install `open-dav-calendar` and `tsdav` (for [auth functions](https://tsdav.vercel.app/docs/helpers/authHelpers)) and call `createCalendar`: -```ts -import { createCalendar } from "open-dav-calendar"; -// You can install `tsdav` to access a variety of auth functions (https://tsdav.vercel.app/docs/helpers/authHelpers) -import { getBasicAuthHeaders } from "tsdav"; - -const serverUrl = window.prompt("server url") -const username = window.prompt("username") -const password = window.prompt("password") -createCalendar( - [{ serverUrl: serverUrl, headers: getBasicAuthHeaders({ username, password }) }], - document.getElementById("open-calendar"), -) -``` - - -### Customized forms -With a bit of development, you can integrate it into your web application by customizing the forms - - -### Complete integration -With a bit more work, you can even customize all components like event rendering, notifications, etc - - -## Architecture & development - -Open Calendar is a TypeScript application relying on 3 main components: -- a Calendar rendering component: [EventCalendar](https://github.com/vkurko/calendar) -- a CalDAV client library: [tsdav](https://github.com/natelindev/tsdav) -- an ICS library: [ts-ics](https://github.com/Neuvernetzung/ts-ics) - - -## Need support, maintenance or features development? - -Contact us at contact@algoo.fr diff --git a/src/frontend/packages/open-calendar/doc/API.md b/src/frontend/packages/open-calendar/doc/API.md deleted file mode 100644 index 19b9fe4..0000000 --- a/src/frontend/packages/open-calendar/doc/API.md +++ /dev/null @@ -1,16 +0,0 @@ -# Open Calendar's API - -You can access Open Calendar by importing the function `createCalendar` from the module `open-dav-calendar`: -```ts -import { createCalendar } from 'open-dav-calendar' -``` - -### `createCalendar(calendarSources, addressBookSources, target, options?, translation?)` -- `calendarSources` (list of [ServerSource]() or [CalendarSource]()): The sources to fetch the calendars from -- `addressBookSources` (list of [ServerSource](), [AddressBookSource]() or [VCardProvider]()): The sources to fetch the contacts from -- `target` ([Element](https://developer.mozilla.org/docs/Web/API/Element)): An html element that will be the parent of the calendar -- `options` ([CalendarOptions](), optional): Options for available view, custom components, ... -- `translations` (Recursive partial of [ResourceBundle](), optional): Overrides of the translation values of Open Calendar -- return value ([CalendarElement](./Interface.md#calendarelement)): The calendar object - -Creates a calendar under the node `target` diff --git a/src/frontend/packages/open-calendar/doc/Interfacing-with-CalDAV-and-CardDAV.md b/src/frontend/packages/open-calendar/doc/Interfacing-with-CalDAV-and-CardDAV.md deleted file mode 100644 index f506e83..0000000 --- a/src/frontend/packages/open-calendar/doc/Interfacing-with-CalDAV-and-CardDAV.md +++ /dev/null @@ -1,82 +0,0 @@ -# Interfacing with CalDAV calendars - -CalDAV is a protocole used to exchange scheduling and event informations. It,s a extension to the WebDAV protocole. -The specs for CalDAV, iCalendar (the format of `.ics` files), and vcard (`.vcf`) are defined in [RFC 4791](http://www.webdav.org/specs/rfc4791.html), [RFC 5545](https://www.rfc-editor.org/rfc/rfc5545.html#section-8.3), [RFC 6350](https://datatracker.ietf.org/doc/html/rfc6350) respectively. - -This file does not describe the entire CalDAV or CardDAV details, only what used in Open Calendar - -## The structure of Calendars and AddressBooks - -They are a collection of dav objects, usually represented as of directory on disk. They have common set of properties, such as `D:displayname`, `tag` (`VCALENDAR` or `VADDRESSBOOK`). Calendars may defined additional properties such as `ICAL:calendar-color`. - -DAV requests in XML can be made to request the content of these collections. - -Each item of the collection is identified by its URL and an `etag` or `ctag` indicating the revision. The tag changes every time the object is updated. - -> On its own, a dav object is not associated with a collection (calendar or address book), this link needs to be preserved by the caller. - -## The structure of `.ics` and `.vcf` files. - -ics and vcf files are written in raw text an consists of components. - -A components starts with a `BEGIN:` tag and ends with a `END:` tag. Components can be nested. - -### `VCALENDAR` component - -This components is only present in ics files and contains multiple sub-components: -- `VTIMEZONE`: Represents a timezone (e.g. `Europe/Paris`). This will allow the use of this timezone in the other components -- `VEVENT`: Represents a single calendar event. Contains all the properties of the event (title, description, ...) - -#### Recurring events - -Events with an `RRULE` property or a `RDATE` property are recurring events, and they occur at specific occurrences. - -In this case, the events can be represented in two different ways: -1. If the occurrence has not been modified, by the 'template' `VEVENT` with the `RRULE` property. -2. Otherwise, by a different `VEVENT` component that must have the `RECURRENCE-ID` property, the original date of the occurrence - -> All those components must be listed in the same ics file - -> If the `DSTART` of the original event is modified, all `RECURRENCE-ID`s must be synched to this new date - -#### Expanding recurrent events - -As not all occurrences of a recurring event are saved (only the template one and the modified ones are), they need to be expanded to find all the occurrences to display. - -This can be done by the client or by the server if the property `expand` is set in the request. - -When this is done on the server, it will return a fake ics file containing all the occurrences inside a time range **WITHOUT** the template instance. - -### `VCARD` component - -This components is only present in vcf files and contains multiple various properties - -## DAV in Open Calendar - -As we've seen, this is not as simple task, and as such this not all done at once, but in two step. - -1. Retrieve CalendarObjects / VCardObjects -2. Extract the events and vcards - -The representation of those object evolve as they approach the interface: -- At the beginning of step 1.,we have `DAVObjects` with raw text content -- They are converted to `CalendarObject` or `VCardObject` with the raw content parsed just before step 2. -- From this we extract the `IcsEvent` and `VCardComponent` -- At the end of step 2., we have `CalendarEvent` and `AddressBookVCard` objects - - -## 1. Retrieve CalendarObjects / VCardObjects - -> This is done in `helpers/dav-helper.ts` with [tsdav](https://github.com/natelindev/tsdav/) and [ts-ics](https://github.com/Neuvernetzung/ts-ics) - -This file is used to handle requesting events, calendars, address books and vcard objects from the DAV sources. - -tsdav executes the DAV queries and returns the ics and vcf files. ts-ics parses them into js objects. - -> In `helpers/dav-helper.ts`, all the function starting with `dav`, from tsdav or defined in the file are the one doing the CalDAV requests. The others are a wrapper around them to parse `DAVObjects` to `CalendarObject` - -## 2. Extract the events and vcards - -> This is done in `calendarClient.ts` - -At the end of step one, we have a list of objects containing events and vcards. The role of calendarClient is to store them and allow [CalendarElement](./User-Interface.md#calendarelement) to easily get the event and vcards inside those objects without having to think about WebDAV or storing the events, vcards, calendars itself. \ No newline at end of file diff --git a/src/frontend/packages/open-calendar/doc/User-Interface.md b/src/frontend/packages/open-calendar/doc/User-Interface.md deleted file mode 100644 index 85c3eb0..0000000 --- a/src/frontend/packages/open-calendar/doc/User-Interface.md +++ /dev/null @@ -1,30 +0,0 @@ -# User interface - -Open calendar's interface is centered around [EventCalendar](https://github.com/vkurko/calendar). - - -## Components - -As we want Open Calendar to be as customizable as possible, every component is independent and has its own designated folder. - -A component is composed of a `ts` file and a `css` file. - -Inside the ts file, the component is represent by a class of the same name and chunks of html as string. If it need to received arguments, the custom method `create` is used over the constructor as it can be made async. - -The "management" of the DOM is done with [`Mustache`](https://github.com/janl/mustache.js) in `helpers/dom-helper.ts`. - - -## CalendarElement -This is the main component of Open Calendar and server as a bridge between custom components, EventCalendars and [CalendarClient](./Interfacing-with-CalDAV-and-CardDAV.md#2-extract-the-events-and-vcards). - -The component will add event listeners to EventCalendars (e.g. `eventClick`), gather data from CalendarClient (e.g. `getCalendarEvent`) and call methods on custom components (e.g. `onUpdateEvent`). - -It contains an instance of an EventCalendar, as well as of CalendarClient to get events and calendars. It also stores the callback, or `Handlers`, necessary to handle custom Components. -If no custom Components is specified, it will replace it with a predefined component (e.g `EventEditPopup`). - - -## Generic Components and css - -The generic component `Popup` display as popup on the screen. - -`index.css` contains generic css classes, mostly for forms \ No newline at end of file diff --git a/src/frontend/packages/open-calendar/eslint.config.mjs b/src/frontend/packages/open-calendar/eslint.config.mjs deleted file mode 100644 index d0c2be0..0000000 --- a/src/frontend/packages/open-calendar/eslint.config.mjs +++ /dev/null @@ -1,33 +0,0 @@ -import js from '@eslint/js' -import globals from 'globals' -import tseslint from 'typescript-eslint' -import json from '@eslint/json' -import css from '@eslint/css' -import stylistic from '@stylistic/eslint-plugin' -import { defineConfig, globalIgnores } from 'eslint/config' - -export default defineConfig([ - { - files: ['**/*.{js,mjs,cjs,ts,mts,cts}'], - plugins: { js, '@stylistic': stylistic }, - rules: { - '@stylistic/indent': ['error', 2], - '@stylistic/quotes': ['error', 'single'], - '@stylistic/semi': ['error', 'never'], - '@stylistic/max-len': ['error', { - code: 120, - ignorePattern: '^import\\s.+\\sfrom\\s.+;?$', - ignoreUrls: true, - }], - '@stylistic/no-trailing-spaces': 'error', - '@stylistic/eol-last': ['error', 'always'], - '@stylistic/comma-dangle': ['error', 'always-multiline'], - }, - extends: ['js/recommended'], - }, - { files: ['**/*.{js,mjs,cjs,ts,mts,cts}'], languageOptions: { globals: globals.browser } }, - { files: ['src/**/*.css'], plugins: { css }, language: 'css/css', extends: ['css/recommended'] }, - { files: ['locales/*/*.json'], plugins: { json }, language: 'json/json', extends: ['json/recommended'] }, - tseslint.configs.recommended, - globalIgnores(['dist', 'build', 'webpack.config.js']), -]) diff --git a/src/frontend/packages/open-calendar/images/open-calendar.png b/src/frontend/packages/open-calendar/images/open-calendar.png deleted file mode 100644 index 654e8940106419a6fc31abef80651c5853a2ebf9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116262 zcmc$`WmHvd|24WnQ6vNdP*g%iLQ+YkO97RT?o?@MX;eZ*#UKo%Bn%WJ1*Aa`L|_|$ zfPjj0NH=FLpZ6K#|DN;Zd^qF0jC<(qhP~HX*Y%6}n{!@V*E(~8o`#i%L?Y3vomAE# zkv4~rNE;=oH{q4R&y`B}Yomvvnl3fI0;p}T;orMGRSZ4Px}Nj&v2wQ~op*6{wiEEM zaksN`@wnjXIkBN!7C*#G{E(8not3A(s|$y&y|W$3+0I>%Ls*K#!OPxBkmHE(5it%C z;bUS)jtPsF2C;aPNE{?JWd+?!@uS^7x=eNJ5|i_3C$sh^@u=wTbkyZsuV?Z9Z(eDscTv&N z*`AV;a_7z+t$Y2+M?ST;@6vmzAC{0{ez{=4OV4}KRn1PtDobVm|N2VFNtez~lnq{c zmlvsZ?!lu+vEJLRk$(Sp{hCqnTIO{%HMO^1Bg{_D&Q?}d+M{6yi)dK{lYFQDq?ysh zSlifaV`IDRH#^*a+^~A&g%j^YaAVHOaXxyx#but4`6vJTpt|1z=*BV@x9!?>?ftDi zao!^8-7$v^di(mczt{5QHn{Kc^o=$tDQ@6QdYY2baJp7mrLn4tvY?>g+Kn3x^9Ao- zH!!aWJkR{!KQenY`q~W>m$6~K4Ha9qY{`7UW5UeLOvPGorA@D+x|}P9iK>+O`hOR( zfwdrUyS7^Wb2Br$|J&MLla-|-?f9STzb$6R|G%%qoy8M85V6^G%xie#(W6HVjg3>z zW}JC&^!!%y@*sNBrK#Ur&V7o%{`T!#9YKNr?N*t>thbQl{AQ>vf>*`jwSX_r&t{x#AdyP_W~=J&9*A@bezDV+ zbZLIP`TG&{bx$875vL&L&&10C94n_1i8 zD*MhPNMFZ>#Ge{Ljg+_>?iJ@=V-o*4HSrlv@W0R(F6tt2F!Q+s1#4&T}f8e;VrGLmm?!-%}f3CQkS_= z9#Xo@$^v#{-Kn>3eUFEA8}E|(^2&sz?)JXJV=4VcW8d?&i`?zvW&HK+&CYecd~w_N z{HJ&YEN*1UB`#u3HR1%DyjNEirz6MO*H@+)@WheM>$SZ2mO++zlZU^ji^zSHkIIGy zbvu*t@^U%SvjBTeEMH>KlKl@_^G!SLNs@egG*>s#SCP{+`UVCfn&sB_o;h>oqK{AA z%+P1KVxa+>9qjB;oJ!#&5*{;5%<)_OmAmy5RFq@*NIU|wFHdM2HSh{%PWGMW7c4rq)%sO_un&ANYo z$GMLWwE6n8b93*n-TwO0U^7WK%iK&ox3Ex%SmUGTK8E0ju2vwFbw^X4J{9r!b1Lsb zE9Id>hn{IAQ}P+SzA0!{Y>9m1E4+U5W(_i~^|je?Lqo$P#W0$duV2HiUfoc(GNln3 z8oJYHk&=?KB}0?F{rh*t6DKxr+O+8zqC04zFTyFK{d!bXU7r2tmTW7f!I6>biVD)~ zNE`9WRQF?>uP^j2tt^P#yLWGLB&(d+{*L#+rzdaSer>vU|Ngd}J9Sfp6qtYeQypR5 zQd(MSWp96-hKa9&Oy1sI?A7>YURmMwo68$E|BUxzdvi;cat`S z^aQW(Lvd3dI^Ud7JJwkkIrf&8nV+aSL@0bff6~_0_6_)7@F zJU7Tlf|iu-iO>&NoRpRpmZlN6A6fNS!c}nW=Wiq2<==_&^`AqZGjxnE zUKB>Txs|LG@e^C8a_Q3Byz#02#*-QvS95bcc%ut0d5yMjL#S1|manGgx%_zNyD-=3 zs*$X_e)`EVFU1QNo;k68ua01Nib}Fe#!nPUpSCrcba8FPH#IFS&{OCTl6nF4d0{lS z*}bXod@~!`T18jaUR71q!ItC=f)-`*Bi=6!vQ!asR+g3_Nb3*bo8Ja5i@(r)eg%)7 zq!P(2EG#UKV$ZmDFMsC=>=jziW(^IEFE8{ocz5}&E_uz2b+UZ>_6_N!g23z>89Cf| z_PGw%UKzigGJZ25&!0b^`BRf1*aTjkZwhgZ30$Gea3+OtQa+T@+@^rl~RQ4yu3GN(?R z>Kz)oUg9&Mz8JhbCgC~qjUN3n{OQvJH*el-Nz-5%lB?+~bgjmn%BxO{-%DUm;tBXz z*>l`yJjr9=lkm}_S6{snP`$+()|O?_IE8AGgf1*BF0P6uk?lQZ+_4ltT!nHkpRC10 zKaz8?Pf-+sb4gQhGaV%WkhUATK1c}CKuPgjLL?J!b#A;t;*BF~)`Q-9t ziqX;0q>K#iv@M*%UctV)*oul9M_6A4>ZkK|ACXV3}cUQV`F2kIct;70_WuP^l+@3n!SR8!bLYX1%wIF z(2SM`kO{4sMn?ySht=&Li#sbKL#$j~qs}}z##A8!GeWH1F>W zugprAvEh~F>uV;V=N}yx6B9d?AicXWPAG2nXPNKxA>8cqBczqJRsWBPa_qCiU$5dZ zj0>Eei#mCysmBl-^tPm=`pcJ{C|7k2F^AJ;37CP^?;RM}4A>>^{Jp-Q+`XShT3TAy z#YErs$xF!+LsN5`L&$WkvuE$ia0BY3;E^tLy%j-|zp-KS){`Swu3l|@p?A1r+U|@9 z4~I?Y3j}=?(oJ7qf0vkp?(G8-t4kwUh@QjbpmqcEhm4u^?RW>%#qHWxtlJ=e2h~=&BD)Mk! znz8?qX+*%ExF3SPKrqIIF1I9He^m7JuseRsyjyB^?_oyJ>XKpZIeIK_7@LfrWkm?Z zTlfAO{5=_oK{pVR)opDo=;3v@_DHmp__)&Tm1IOM4$aCETACX(NvWn_V3*yinIQea z?ZJ1{)RP{R=YynWWHd5whKV_R;X!w|9BqHo@u%owA7!!U&=qW6A3oMF$97B5+T!_4 z<9r%Y3$Py+Pkr&})2G{*nZt<;3V$kjv6u9&v@}=dQ;JGtbog>ZrgQ||?kkAT#_-+L zbabJ>sa@UO6r@uBc~wKhUEX8g!?66x?)?o5GoLl@Mn@lX&UNjPy>Q`zC5jpGaTv~8 zvMl6CyO|9C?3o0xR1FA_{$AkxcwizYFA&*Gz%irTbHox*CYqp$vc!bKN!0GN7cSdnGVAO@~VlmtSSLZqO{e_>ALh8SzbF2U1 zKBhQqy7gplB`E|Qyb=p~{rYum$aZ{45T!WkX@u<#;;o({a26Y53L|;3|&3!;t)?9qX)z&uEGahmC z3u6Yk7;S~EIZ^I}vhv2Q`;KjNc6KJoD=I1$9FVe0OHRH_z#{B65qm9*zf)0KcS&E$ zc2ZCNsnasSRDbDEBOSG)gTv37>pKW!gH~eY;I1r41pKA)9`EAq48o!eb`>4v)6X>A-!F!$_*C^)s&B~W z&!4yL-Al*9!a@ouDLH<7uhjm2xxl5o%(#BcQImD-!IpnMK9mevkzAS?x{5gOLx(1X z0Kg^#-##-hJqEy*9klA#RTgOSe1l>7ljA$ck$_NO^9 z3bFTm(2zcjo>DR)-rInTG=3U}WyVlm0UDKQ!Q{t`Nd~ZF(3}5x(gBt6m zV=^-PA{f|J@!S+7V7%(Gz~$5x)ViF$M2|>?(tyS77~hm%8RuUd{=&O5+h*}LX!RI@ zLt_T=e5cQydMr+V`SN9zWy;rDeE{($T~=16XkcJaQ(N1=ypqdTKW{;%(RqI*p$+&X z6a+zD06INd11IVexD{gEk*Un&CDf!FZ*1xs=H6fg=o=m74`tkc@Srk@k%3K`QIYzM z!&kn(u`vPJ<t#s2Y+QvXO|2F8;kf)9TA@}&kPA#K*)-oC27{^VXMcV%kM8Z1rNlP6C`-=Ze% zBq=K@USa&X{`zlrcD8h2+>7YnJx9(0UF|voT8jgNd(GPFGHt$`9*xQS>}+8Q`L1Fw z4f}2YMCIlL89VzpAq!?w4aUzieJj2Q2#d0Aid5Lb z8T!^|BB2GS1S9>TY~s&n26GcVLb%FCk_e_s&^G4JRs-q0*ok&o4uJi}spCk@{3$jz zHp&nZ$H$K!ZAZwTKkJPPiHqxh-xOk)ZK;sl;4|7T;x;#Glr{qvsQz}Yd%rqo=$&zY z3hEs@cHF&pZ-1u?&@tIhNlEGN+*qe+qcG-M`#mx;G9ASq2cCRHct?@v%+1Zoeuobq z?l{KI&fYP{$;nABMx3e-2?`2gMbWOpfFn>7c058TzkjcKbFY*RrsM%XHui>zdA?A_ z^z?Kczbx}o+fF>QhH*xE`XR@|JcDBAtgZLIGAZ`7FZ&dQLa=5+^Oh(zoHbtqoDxoqd?I6_%_k%%B`YipXBhr(7@o*Ct)U%P&N8{(hX zQDqgC>xgawM2d=u)uP%fW9wSbs)1#gFf;!AaG$%XqC(!OJzJqbPC`QBZ?{hm@fH!A z_jKA><}w{i2Tt6k_VV(=(hK4;%0y;hb8A3|g`s_eZa8tdnd|7GyB2aQlUI@FOp4Th zmnX_;9UUEsr5*1n7xMJqCw@$GVT`-Wl}?{N{df55;lF>H_Gl+7Qax`n#~ZXFnFY4rVimjh zsvI*7Is%L9k9XS?saw%c|DvQsVy$Qp0B(ray^W9WkCx5vAE9tMcP<>axu2h(zwMnO z^}^B;x>cF{OZ`_ZfL)|J^p!KoSoU{*vot^s5!i(pDbK+>ItFVD5wZnu-dqj~3ln`l z2b@Ht_DIZ2hi94K%dBwg7di_Bh}j7_l$H~?zw&kx#Mse8fD4iMyaNIP0&Np1 z&rruqo=Z5Ox#czmV<9n+TcUt)>A%OAq_E-U9*M13ZGEY}Rq#vMNRW>FBY?X@#`fRy zcmaV^%`5!pMiqc&TMAt*hyu!}*o&1ThJL`DC(csnHPo9oZ|>ms*d+k~hvuPHy&V&) z)%x1%F3}5jbl=a+cp93RXxNF0i@(RnW83EWjqUftawfeUwP!yR1uPyp<~hir(YTlO zCjy0ZWccyzea9Q7Yy%??7Zzuu2VGj6;sS1>;`l|MPmIsQP4WZ{!Df%HSu#=9=q1X9 z-0X1o{@jZcYK+a@>Kki;M8gPe_j>V2Bg>8*2hut^Iuy>HJsT_J5z4{wbhDE7)+pDxmS*?bj*FPH9Z-7j%rbuDjn#gsFCgmr!<5x(vMP-B5=!{>sH*m| zK!1C-UJOG|G0&5u_hHe)V`G`m#7ka|WDz1pEMVphcSQ20N7}MPE=^hzZ9cKL*AfX% zNkXN*IPy)P!%s*^=w0x-x%kh~rpFQl!FF@s@q#ZWTK68YrPk5W$#(7(CmQEqTNc5C zy@;L|{`&Hn;hU71K-*z}tS_7BpCx>%`S5{PQ)DCZ6{F$K3!P*g-8YgxK0dfXWI15E zMw?y4)_qB@Ufn`o_kMhMRQSjdMFLPbqqU;h{zJmAToH^!gNw8`EA?YS;d^k*i_g@| zjCQe!=P+3+1hd5rboK*WTwHYlcz4wmDp~>^5|R06S|>nQb}r)7>C+VQGz;f~kcWT4 z>-@Qt$*_k4PvS1{7!VlnwDpnhQb@$P8mY`J#o+r~N*Vbk@&g;X64}2rrk(>6^?uGgPm*?cQrO<1y94s$QXi>Z>r8NeMva}$&<*m0QNK87=ly7(>^XMaoAkT z&onO!;5Atjwlt090xUT@t@~1+9!yP6kx!zu?-lTo&s*v~jQf`cub1&#{4uq7_`)Dd z&}3~OG1y&3|4dsu0Dzq{GeISNPCu<(9ux>t!xD%wo;eJy=*CwtB5sJ!Jka3sKdg6S zGK#m1TYCQ*AD9~JLiBS|p+jIIZP-XJ(3A|*n zgnncNUW;_ZyxozUdfjOipS}&5?98xYA>7s6ob~1EW6Zg`g0qy!09Ha6LSYijoo_3tvA znVznm?+K3j^yGLonXFT6m`h9Avujt9{ww450%w!t1_P{8{4p=}A&O^PZHnfH+OxBT@%WQy$!uUKC1dMW&X%5+m`HY)lyxRai zcbAB@@|L*F3z*w~;>vY^*D+Um&GkW| z00un$C7wguchXP+Q-EftK;?oq0K~JYe06S5KtRBav;Y=C(+bdUY5ic+)Lj3bFWX3C zd($N!@Z4TXT6*v249&Q)!y_^_MungclvP!K0(TKn#7`ZtvhY`N?0Ck6*oen!1bsk= zJHy{DR$cd!_p$NFCF)=2Bn0oy9vFNa+ zx%KYArI|`R(>7Mt8<=p2e$DeY2b9ZG=gtDivlR%kXw}o6;N^k4C$apEs&1`qZ3MHm zvbvhv?Slc>4OwaWO9G+Uo^7=ulo8;U8fA^v>rB`z+UEgIP6}}Q&&)~+8l(wg8yzvV zmGdYS6;-nR=k!I{KXtp5>eXD{yzTmAU}m)7ppDl zJ9Usi`WvaJDC#dA_33YjAv6$ZmWa=mn^i08eGic7bVySW)0-fYl8zjz`jKNtn||gA zUuh+9;^VABF$@rt_>oI~em{Wd%6_P$crk`MW5o z0w1sLlr#UccYORdG4Df!%9+8!aS94@^~%n!VMP*AgveyFu=l9p%xK4sW59DTwjB{c2qvI(EWw!TB)qFR z0!Vlb710LS37n|-=2rOq$Dl?mfe4>Lz4$kIb#--3j&>Y{rgGXoI+6Emx+P-efn2aG zWT|Z|ESrOagNN)YFmzY8wr(Q`jx&j}w?acV4pEh60_11gH8P`+SmP44J~_UGB8=Tg z+p5g&(2_(^>^*ja5Yg7w)~M;}YcbeER?Bd={SyD>nf8XdDE2x;-L%+g4YeC!Bf#X? zCBA(tnHEq~`*Ui?Q8(l_X6wlh+=)D=OWHw7O9w9P#0+=Q!{h#|MuAOV!O)3bXd$7h z5~UVx5lJs*Z%k&;%QW0ZWG4a30v09%f?cI}$t2-B+b&5HZLi!3;Yz?d(8)|oOG~69 zlu@j#tb^naa6LfU?->#f>Z&^)xb7Ph}-A})=(O7%Sx9nN#ad0j)n6WfR z>)IREy9-TXK1OtcZm>97bgi6 zWs*gC5J*k_7>OC#nqDCUa!fdwNP^}iyO#&83WIcu@x68PChE&p@MV%xQk6jEAWquz z?00OUXAQ+8s8!FD`Oj~~E;N4TE-9=#aNt1S@Gv1sk#;x7Q&3Pm(@DD#oq^z0rxyjo zU-9th`8)UST_MPt1c_YnYcY2Fj(KXSFJD~CxiXho-#GustGy(%ay7H=lT(xymr$D_ z0L$OWJ|zga~|O5KV>I1IyTn#>(>S(XUEB-X#@u>EGqg@Bq}kH z9UxuArAt!s`0)cgJk(IhwI8uaO4z)=sem!Q@8?fSj20a$^>($W;93M*aK82illr22 zWNkn9xqBVC5{?rV9KXUYV~ypZ38T!$61kR!yTSZJAkBrzzU-VFMQF^qf!cW}zzY}^ zdPhbg!KwC-(Kc=f(-Ik<3ZrF#+%>)bICa0KLfJa_iA?iSRutvXq9UpBAEl8H*DO&g z$$Pdk9oDZwXS@!vSDm+Bce~whFFo;?m~uN%xtJy32w}(m_W@#seYfx}{_*X#StQ~g z;%7>Qhw#qYc?c-E*7R$!8RfeXNldpErw42rqIt>gAZ~~utV6h3%6END25c(#-7- zS$`S#-`AXY3Q!Hu-PIeT*yUoWo(?oUjsOpIcwbg_+paqz$D(6mn0}N6(vnoBq?Hhk z?1edBK6y?2kRcQipNStT2xQv4C_I)Z^xtb5bAOBeBkrh|?6T80Djr|g$XWg|y{4>W z_b4rm3uS;)pzVboEhv{Nu$<~|bd`PMI(F;#>q^ zdTs@?cgl7VfMk1R9*zTpMZk$r$_9MdhlhuE$p%Qq3R&ESf=D8vD(VmBsHm!@VB{y8 z+5quOf^^}Zd=yhyD1i`;AqPV)8R`KtYZhC0Y{Bz5eMk^+6IXO8(daM92UXo;5WNcAZrn0lK zsqS@UhV+ESaj%Kf>=B-;`ClDkDnV#9QhET8)?u=o-uGZb2thA&X+M-XK07+kLd0dd5SwAuF zU}LiZY^41n>?Ap}5I&*>&IcYSphX}^K8g?&!?5P{yELF4itb&gclb>Brgw4bjU za@W{M^Mv}NcH=ClP zqeD^c_CqgGZ`}LoEeA0&LAOyW)qp-ic(K3;9gYz|UF}>2mBB`k_}KH*A8-Hs`9nx{ zmm6bwN8Z^7ug=Cf1$CkN_o1hT$)3^X8=U`+fqke4&0U9a0b;XZk$YO+Yc!thf`Zss zTK8K5hS?-+S{+IO%I<#WJ#g?r7-(onbJ!~K&mnLTnq3!29e^{zu@pw_Ex(BEu|tjj zY%8;a7!De8!Mxdg%QVW#EAkky#w5x&Eo4@_)28lrEy_6|hTLQoqk$a{EUuEeIt@P8 zw(?k*VzN71`#Zv10jRWX_io-aVt7I;;G5pFdpAG?1xfh)r@cVF)#xkW804WQtFHZFXP8@Ct>M8Z-rq%g# z0%J0O{0sLdC;|m8-8ZnoOc#1y@MD?GO1xvPB%yr8+|EJ;hXhwuSC>(L+hAANqB#IP z!QS@a8BSp3LK(r@yy0(7Rl9HNA;eNE2H#saf|Mt%4QLG&Gl#SKKPE@@4I2mt624}% zJE7wfEDScJ4{+hyty?M%4tzjPR_D)ehMqz=$Ik- z?I0Au4V&mfVq^91vNd;i?<2fB0E%wVi4Gn-Sn=^A9aN)#W5ZiF8+69fkMvY#jIdS6 z!y-gzssz?|b8~C?{JEMtF@W&#C21zgs<_8r-@#plw-fpzxK&1Q7G^f|tfKM|G6=2? zOUeA#hoKTbOW;%y5{S#>`J>e$aRx}0d#h7 z9Pa0%-Ne9l6G(@WG&3`U%rk5tc*p%I3^9e?um4w-&5P6?er;Mr$-odr7F2zx_v7_) zl!|vxi7{_9!P5|5G(5b#YDN`xV1pf<&M|J$LHVN+j% zmJk+XLB)qw4i3iORX8Z`_?P$<{5Mhl-39(wdi!iIB_YlJkFWpprrZCMmS5Hv+b6n; z&XW5%{<}v1{!R(F=;^7ees(wMlc0yM50u;W-@ZGv#|`BewY~rQ$6db6J=b`SXR`nI zj}EWlexgMG&#(TC|E&i9ef9s#S9H(mzA|P4(Rn!kS4LV|AAq6)%wM3x>5m^jekxva z8)jmi1aK6D(hZ%qg-pHzZVm7@9K&SHG93-gl}C?Q@z5j^NSSIl90+B9!-fr){QVCc zJ7#QO0;M5f_NxK%)Ic63x?uGcR-dP&B%zX6xr%?E}JiWY-QSS{UWRXCAJ{*b z>tp7OTF%pc+o5b{U_Qv0McXkJlidN0Gcz+U z_Em*#mkKif&Q7vK4JBM7PzfzTF`+Z>hZfT>+p(r4YyUeTY_PoVv1^%vygZ4pED=uL zLYMBUD7m$3z>L-y*hnF;^f3dTS3ybI2;GrD0g%;dG4bgAFm#6NgCI_B-J&NYftp5R z648Hcx&@%+V}cBD1RGpCG+(}cr67ULyzun}6Gqr<+Yj4O6^ZVub@taXt8$uv&}>Zv z;gYqg+6ZyQwnP)p&0Y>Tm*?Ec3>FujMNSBV7YAE7G2~M+@#$6|JSc28hEVk4ZbP8` zs#-kJA?NC)%Y*B>F#mOKy8ZJH zOvC_2zo3p)L$~?6vgkorI*Ho{K+Vg~r}#Y~F)}g1z`2od2apJ>Dq$kv2XNZDb?fBc zzn5VXA*eKj*oOKGna-cn>0$3Ao`+b}iJtNk0QMT=jU4-9rly?UT>5JbCQQ-3ljwbw zl?uG29L>x`#J+ylrAfGJh+&-Qk^o$a=*5TiGeaUGHiKnJpE3D^J#YQo+NuDJ)$+mx z!_m41$7Ln#AslwsG4@zt|EU=m>R_^9WMPTGG9Mm`8)N8?*6ITj{Ni3?>H4s5922}= z)fcBToV9!(9QE$99M+u)tDA zyC6F#iJ`wg$QmC<8FFc6@NP6W7njNfBo?saY5T-?i3^wB1o0e)n}`!JuQ9gZYaa{; zRz5sNx%|y{51a^v3U}@1&FHk;)xKYGW~&ui(lJJ$tob685oNUuaw{AH47-F$paCj@ zGy4VysX;-&t@dp190xZ*0-T$%X&p!&X9l*oU%>u@ zUth9>+)RGJFCakp7I~vkYl-s{S2r_Il7O$na?dwg!^O17cU;?7FW*5Aa)uQsBEa*j zWo5Ep#=;R7gn~^RV?Y7v9UQ!dt2P#t!V*MSYf;wiC8NOx9v+k9;2MFp$&YX3w z9jXvI-c?4$?A| zqhIaRDI(X&7i`}pax|1fVSp`nABa|AI9fnt+If*CgPp07m-hu&@|yNbAfBmdY0o;; zVXz?tLa@{aHO?<9E!L8RV`yPSu0xU${$Ijtjv%Z9*Qoo+=q@`dz||*D_JN5`73JIr z4xe$)o=A|Qmj8=T!NHsZo!(%3CnqQGxYQ856IgQIeNRDKp#V^k(4<*m0lO9%sf4-L z(!t>dP^~o~`yFFQiR$p_35)=WaQg9%aM#wMthV5o(WwW*6h!AnZA3>E!Txpx=%Z*5 zF2#FX8U!gyI6+}6TfiW0x7-8Hk~lB|#>R%=jDwQ2^)v}#6}w1GkOY7qo4k)gO_PBp zNY*+}oUn=&G^06x{`|(xn{6;G5d?pNwC{egi=^G_QH1;i#88P%?wy#30>eX`Ovq8) zK_Yk-LZt$6XANJ)qF@i$Fk;fOU&Q|qDuS0}D#8Fdrjovk-Yk)n@VZwmUFM0pa^*@( zk;i#ahcDD{98}>v2eIbpMoG%IgK;DWCU`g z%E3+!S%@%4ojP);dIF~DchZD8nJFX)7;3fzcOzxsK6N1aBQe%NZXwQ=p!8GLQ-|Yt zzz!IiHo(}13I1P^zde0$M_9VZV&ts|CHyk&Im9P#6l4yCXL>o z%=sOJQ?bN*Y_j8gBEdPLAa5g_513)m0ZtSMOmJVD;>K)+`uY~G8FVsQa7=I*4oD3e z-4Tzx((rxF60Rdu3En4~7=~dqKA84qH95Xf)2DB0yxi}Hoys@PBr{Xf(73ob9oap5 z_K3h(YF`9r5KfO>gH2t-9%FI}p$dTdpc2G#t{fmNS;$a94F)>8ourMVWDs>Iv+ zN8>aaE%8EuYmZQcSA6S)r@yv1|;mCFSE+FD`p4rMB>3-!|@o2_*82Ihm%4a zE|5kq+=k32yUJuWb1crn-mP8eV%Cb|P`m*%cNjT*81+fcgH>pJos<47E^ zIjvO9#jFru^HxN(mRVVjCX zSo}H)=H})I!`0!7zIxr7aDQUH2tyknae%y1fkI21+=wX{SgonMHLLVtdUjUN*L57` zwLO%_a_Rd}e{=e;2SA_%u3VGWFq0=!f5p1rDi zUFFgB8+RcL6IK)f#|sxKzJF(h8IkIH4-8W+n0E+epyt}P94|ZrVYR`_7oo-xBvfT( zr6e|6bfyYG6G9{vL1cH@wQUf_&@jA(aQebmWsRrBxwj1@aQ&PI4{pQ1jsW?om$v@S|fIQ9F```{cJ z?JhBB$n_f0$3)*49wsg#Qi*OIb9){h(&z4NEiEBeuU^%)Kj+YzLInu$c*28|kAaZC z8=>J4Fa~Fjbbc_5L=XomFv@`$2?aI+#QlpSMQP5m0Vf+@jt*Z3kh#e&#|E|TDi{R} zVs{@rpeBK|y1Pc7oxs6I^I|w6li}3E^5&0AoU*cP@TXpetx!}{G_@JG9}^xTcyg5y zM?MHu9<~&nU+#x&Y-}J8uFcZz`mYy&5u&6#P_Kw}4K<#O1x1%EtcK63!~hf>9%8*J zuPX@~WCSB6z(UOG+|dZtk4wwV>R*qZG{3d`=qBK*YLqV9S$(hvCWS6xuU@?x?Uz8F z14V6ub3Dh{qSTLy1Tb(VT=o6(4-BO0%bKw4!g4_qa7LN^0Hy=1Wp#5i1L@-QpVLGh zv93wUp?Vc4*nWpU4p8KZYuTczy_r>l0O{L~nVzpe4v3D5`g&@79>9HBX5a*R$HJe- zu7rl41mHy+tG;+Kn;fJo6Gzfobkb?@zcD(_9S|7!_p_#49~>EkJqT(?DBzVP)O0uz z%A%v@cPKB;0|v*e54==Ao5tbHymL|QxKn#bO^q_a9$=Y>*#zdg>wx_v%jN1| z3V+hshcVqsn%~}xQ2ag?XKqdqC9n%X$bI!iiAMr-Fo`4`u)s)~T=;9V0;*m8{&O58 z-we({@B11Cif3mtwvvcq2YAP*SpP{5Czj9+sAPpwqKp)N93+Mo_+~@Ua4K<*45*8s zkWveWX%1xg?H3ki1jnHWh9|mU58;rDVvhpa{)svTuy;dVVR$plusAv1i^i^R9M>aN zk?S|vOM$7i6@CX4Pf^WIV$w&oBd<1L|0i*#i-_{6uTUn2IQc|Gw&BiTV-hEQV^Eg* zFlr?S{|gQz8rTP7jwk(|*nLpwkY>V7pc>*>y885m{#l6aqw@?TFeOySxB-VlC^q!|`4bL+Vgp$P=q|=@us=V6 zq@F?lzhns{+Esptu8a?tEoBte^%4W7wh%lC7SsxLgE)vu9M2?d8|aT=V3C>m4MSk4 zkcSTsa`4&jC*0;knuda`K`{|WG-0daOT*wsgKt)YXArS#*h#`z!AFfU64OjkR4V=G zx#URry8<~(%>NE7zK`UPf8W(d>SSM|ZQt;qfgiJMT46nePtI=3-v*wZqWDb*PsWyD z!yueNPz!1yl7aTSm$8bt-cCx5fNES&iGypXBkeh`= z*pWm2om$kFft29(5q9NPS4OX+1}2MwcKH+~pI{XM0tpvw*X!(AKt2{U__P@q*6J`F zL?MSO+uI+^Zq(*=0RLwG?$Tv2Bwt<{XwH3b>eA{5a=8R^U%?2wj9(~((-der_+1HR z3G6e37Y9rwA#0J2u+`%rTFjMJkfT+ED{Wrk;jH|h7Il!fITERzW_MPhVFndNz0XyqCbJfwsXmJ2}2@ zOu@zD#WV#fJFijmo!+_gZi?ttoei91M;gxizgO1Yswv)kXiNE!?v#0RoedlJK>TvN z$CJB7@eduxmt%h~pTDyrB(FY=qiQ3!B!0Aj;Q0!7*7oH<-=^0_xvD5rUj+)gbbhzP zT!ha0(sG8R*3i`S^?YKW{$xTjzW>6c@b%hs;`&Z0;$XGI_q^wz_B3v>Q>#Ki(!yLN z20^ds;n5S2q68L#3$lEx444-8)d0$7fSw&JTOL3BW+Fh=S1QN`+sQG)YJ@u800E|t5*w$$nRZ}qlkZr zq#42CVwE)uJ~c3DlOtZMe^-@MRm08whPdc=A4%;kVJHix4w@mor*dpbQdsJ}${-2^ zcMFG107l3-w=w3{-j-u~?%cmCMn$!uB}*3+4W&QM1DPqaJetcEEY%7BDA&P*gRv$q zz~*B+nVHk+_lOUMv6yRNwi3k|8?{4jKRiF5=K4eT?)N zDX{`3!{K{e?i}D70E*-OA|)mD2$eT{ z>%JH0TO*a5+4*NR9^a_nfs#BenV4POr#1bjiPnz=OIbmj`hZ&`6*zyeFM?ekl_4fJ zHXY&b2o%fpXXsuk4w)IlhWtf|K_)fM-0ykK8jK(pdMhrwmvpn@?XpXQPxmjQtYm>Z z8~Witp@$27g>x4c0SD}?-(r89*HBuV13vIrz(O{N?^KYAc{O6hgRocxfS$ZXM)}Ud zRW87=S3FkGNuw&kAxBE{pX)g9Rm)^Bhy`c?_+{F*EgAHu17HP}(!r&r-L~k&=uI)O zAzP$MoGJsnfX=Q~Jdog@he>LGc~aE%>#cBZ1o$-(zZ+o~V`pWQ@|4t*GpFMvwc#h! zF*JODbCoX%^ndCE=R>v|%`)@xYYTO9d?4{rxIV+2HT%uPbqMzO*DV9gZw=eWyt@OY zoBZ&5G4kP|yM==T^+6U>p+bDaxhiGwkm-TuXv0O-;|KnQtkzeV>5oTWn3onG^BK>C z+<|Uj;_K^MJVVxiS|?CsDhRz@9*z{aiXUKxc!8zZ`SAR7fNst5braW8y@_|zx7TJe zd`Ed0lXH7wfl~7ujjRqc8?qg zRr?S3xL%;O2jS3o>0}ixTHhU1S@9 zAcg_=C8iDilP9kc8#{vF&qsVY$V}BApc;d(-ewldSF?x=IM?mfW)^E_r0?xrKuE_U z@AtUQ_ytB(Td7Sgyj@>geucAVBX>`*y}_b8B1DWK0_X#kz1p(lkRfb^h5U^xd+yo3 zGB5r9OAN!BOE>OUAMG#`=ERZVmstgn$n{cBC@r#bQIiZ) zN|rmDX>k`>@1|}bX0%gYRrh88z@A;1J;5IM1@$2xV?risxezn9jK zCqHlk#snld8aHa|jC!HALv;tKQtD-IBhr2=kiZZ!c5RHL-Uxe?C2NG>Ww=o&I!OA3gFFw(0Qx z{Z+#)$yaAT9&I*+%#OSM20Fv#Yo^iXV>n-0H-dveMyQh6D6Hpd-@i8wUTn0;1Ondg zT+hJ5jA!*-iq8&MbazBf>g(!8`KnZr@mN zvNHO8op#G&vU}mo=m`FZYGP}As0XH>sHg<4;}>)|)YjDO{GC-Y zUfigD`m}%~Lyz1>7T3kfb4Fa}jVU>_%g)`sp`#^QAFQbAyw>|+CXxxXSgf| z=P?dUj9{v#_2iM?_InfQ#~pUkC8Z!z@2$d>ioF&1O=F~xr29{vn2k#vry%}Cz3C$b z-M{}~Mf1_}^D8b}{PTGGv_B>Bq85`DX%q238*d>gE}&W$kLEPa)E|i2cx*56I*D%| zl_l}Fe2ZbJpH~v`3(zouBsn2?Y9$VVG2hSp@1=i#ghYY()^M8szM=i>FUz>-XkD&} zJ@Os(45W9Qa-_*aurZ*A-t8RIcX4^m-*_*gr-$;HH89Uk_#p>{NxJ(VHyy%%8J~Ia zUrD#%<0k!-eTf49eZ(`RbQJW&m4fcY#H6Xoh4H!hJRo;pzP+g;jMIEcq(y}E%;~P6 zz3%@}E^ z-~8_}D*4(0%wzT1|5-$= zy}BX=URl`lpR4`*G!pgpogx4B;@>|xPX1@fLulpSo;8*;UUH19a`t+uwmflX_(Zgm zTwv175aS1zm+y8pPF<21x<3AAf^5x@nrnlnz_oTsZP@qkb2gT&`ds=EG#LHGEq!s> zwL2|q?xfIbq2+)BkJP;iBTf zCDW;2=vV|R{8cfPmZOsA8TY;jDj`q4>)Ai;f2 z#lqJAZob!AiC7&HX=Sv{=3K`SnfmrFNgWbD@ zR$VtgKlf~=I>^3C-QFU6=A7JF>3!dn{f;R3dF1-?m#eahYA!YR>y$jwDbzfeaoVpq zcdTQDD*LiO5W#2wP7PB}RIIOXw_>zmijmFUU9J#yaWZ;0h zy~~irYEzkinHW`HM%&3Z6YBTd9*ngnlScy63h$@BEE87ww4;OUvz)4Jp}zV@{cAk= z>XW8BUk=Yd=1iX!yLsnWTkLk9hqD_pQn`box69s5Fh494{9IS)opnOwsOiuX0kYnC zv+~T5Syvvh$a~>J!p)6i&S^DP=_k8jz2`da;i8ujJJZ}#>)rGRK&AYu>U7`^2y@^6ucucn_Lj?ULnG<&WPI`7ziFfgZD`Ww5r$ENdtP96;sD|J14G}ZTmPUoZa z)vhNhv=s*)tIM(9^UioU%f*|1GC)$}QK5!`)quom8n zuW&XJlZ1@_+!xH81PBo@e`g2|?L~bHk?~1nv8dR1Z~L{$D(5pLLl1}5Mp(%^wveB8 z-*CxdaiMweBeToGvs62ErcF?1zBql}^=)q#9Trz1s)y8#pP^RR`!Tjf(U$@@B=fc~i z-^BZ>%iyhffcc;M9bvWh|DH`ynMro@Bv+hi3XZBYobKyK#U z^NHaGFZEA@4d8DRA>McKP4*L`+Yf~75@ZIl`k&|9uP?l)T6CJ;C#$#Qm2;zsd!>?N zC_{;yy_lZl>u+-OU7l@tgn6t3O?jQBhM9v#u&MWnl-9m;%t?HSxR7CKpXH`I8HKf=pUDiMCcjW!0v}%iTOvzdARc)9HGgGyhubIp_Iz za?STf#haI>YC|9PB}|y=w;vD}%(?Km<_S@)PUNQQZBE_r@SK05;m~7U`zD24w()3d z#m3v6249s@OTKF)avOY_E!an-^+T7l3!8|A;n=0yu(twCO`FB~l0o21>j{8et;#vj zO=fPjOvHTX>6r(?Is*sYi!9d>Cw93VnA`4cACUH&d4^NMGl0W!?QJg&gv@;VW7djx z6QBExgF7d!<9OQv{a{Iui0Xy-G|os5%+ z9@ae?W**fh?HsN$Zd{k?lgV|sns zmp$CwXMoF@oIq0F2M|vOKVbpk{2Q!!USs)fd_q~He~Uqdcz)G07{a(Elp`Z0Wd!l# zDb9YH^v(bKIHs{a_S7){)V3w{9eI98XP7MB2X^9AO&xbl=7BLU=&JQC(xdd{5UC(|iB5 z=!n!4;&9m*C}bc;!RdGyzuTZ?5$7I>Y5ATg zXm%Cl|BJi#0BbVc)`sJtGBYa7j4)Uz*Y3oAo3v=*Mc$UTt%nKTQ21BC^!~kZ8B+$eZSjK4fvMXsm3gPOI(D z{!xP z_ve>s)B6RB1`7%V*8Kg)k0DMQ_0yHu&n(B~<-5#VscSeWIf$~k<-7DANQutJ29JKP z358CNJcxotq@-TN@c$DiSvJ0~%?}u1To%N4oX!k{gMfVuI+}(Mp?5(T(&(*Q)n5o@ z660^#(Z&#~A;FzX_p@t*>07U3{=iwzYy%;lC~W)j73>HkjDykvaZJEuK{@1vkFO1~ zhqOXOPzvP&%?ZaI^^t47Mkp;ne#{B7dVsg%pm-x!tnlT-hi{RyAL?<}YlkA7Y4<~S zyf#qQx{1h+FF?GEBlJ+J??4^|HkdYuP&+{JKm`bbiSFl*4#-^jGT+)_@AT>6sS`gd z96M$pPYNpLX45!D+JL<=#K%Gk*Vy2Fo2#9ctskt?g2&}c2vkt0OdS4BKt>`3b%{K{`8VBWwwn3|Yhy*cGm z1^q#p(C#xvVy>6FR#D1+$Gavg`@aCok*gX^KP)V)0iCa(pdYLQme|8;9s;DUU|N4J zWWVx3k%!Y?3E2wn1c*BqY{=Rw2d2-#<3hlyCTdk6MAKvwTUYhZXE*_!gODOI(b12p ztCcao%cD+6pwY*<*+zzs$3#U9dhZ*9BvHfeJ!+vn&T{ankV^QI_S5dY>>0lsU)koj zzPh4XUI3|M)s^AsUx<3ZbjE%e9zzlYG?lK z;=pAnoAc)$m1SxT*vp-Ma1h0@S8{FN*glkT*&7aEH(uM?QNQ>-#zhl&U76cv-aIYs%s-a}T)ENAe_t6?K@s6H|%Nf+lNeNkCU|TOCPe<+AyM7M8(EKf&pG}25cihZ$nh%wsEYYjS4Rw?Uj$RCf zpx+zFhH>E1zK1o05B=@xRo|U8s;pY@53YxZB;)0a0p#tPm+bfgyI2$w+^v_8Uqqo| zUU9vIU#RwDqB0(um#C|49MsL9g+D}X#AYaWw$tS}p8-+tCws>>E|BrlW(4sPbweq8 z@liJ32mECtVfYA%#SRQ2K^bCMuv5Xqtkfr_}X6nnwPax z^Y^cacIFB7m*_VrIVC+aBWfB*jNfl2^UNujdaJ!yIsYI{RsTR+_bP=DZ77Wxa1%Mr zIz20>i^O?hcmS_vzto&|`Q4(eF&=YW^-0MyjA_NGa;pLT3xPAMUsX)BXmLer8fMuJ$=b6|UG|JireU zolojhKhW9tv}NFsO6lnag1A2~rc&CHPGU1`)*laBYr7HKR=az=8Jpv$`1H<#&7TXS zcJt@4_hqi6Eu=SQ`^aXyrfcdZFL>$YX;_H75iC&sO=Tw4rhd1&%CM(Hd(;~ztgIp3 zqkJLqep|xlwq+l~`H8luBjY1`avq3bi~^HA(F-+hEsb}a9l9{{v>g66`}#I6{;WF| z*#lK*|Jn2x1&nMT-|B3kT#F0PRNhC@NmMvFv=J{>Hwm@IbI^9;L>oVsCA zpWCejLf6qZ954TyqLKGEi>$=~kEY$l<5o_n&C^8I5xep7*;ee0y5oWADu2LhCP+Ch zBFG~>Pm6FItyo+3X>&T5-N~xc(jnrMeWTLw`uEda&oFeGF#o4$=Ue&BO;O;!14ub` zn)A5qGFcr)h0@($Lp9`Lv8n zqFw?y$TvxWIY-JSl!{WZS1%9_EcT$#j)ETr}8;(9wC zIEG;`-VDk7Ny_T1E#KpNhGZr7zInz3_+B5<`{Z=O3 z`15>rQ!#n9RJl}+!e@2%c)CmN+uSpF-E+@ZZlL$s+$!afBXP*MxjEg6k87G~Z8X#w zq%Aw-X}OF?HWJ?TbTpYL`#djM%J{)^zS*|lcBQ1?(yfOCcZN?*JMZWjAM%RdvE-7) z8!~p!X`X2fA{sN_JGwY(t{q5H$Wa-$>|#X9BX21~YLmJNMfG?aHq=Y2c;MG+rk04h zn&J<$O^GVgEyV&=&GWTE$1d5uBrC;pF5SL=_eihM)!c=6-L_9h96Gm+tL5|z2!C$! zt{lxUW%oUEEYr4*@?_#rn*}AiC0dLeK#b7Rd6cDHE)v8tP?CSBdB14qkI|!3N7ZrZ z;u3}dIrbMXZ@9;yZ?SXA$2dD+LZ-!aR!{W$8#;13glnf$M0?gL0@BK!bC_|)8W^eY znVJX)KQ?9rNVComF?J!2x4it-$G=hx3*#-{3F{_bimLj2Y@X64r^o%|9> z^?+jh!j$5CbxGv09n-51rGGjo(Y*h%WjszM_~Iwa(Vr#q)bFj#o?6FSAj|r_z}Ayi zV`u)R@>wUKpvaj2WN-2z9pYF8-?I3&0YwlMVUA3B4p#}00 zdzE#`N#891#_y6(`u!QY&?H4kukupn0?jhVH}|dG=xVU@+4mMKTzL1~mFK5wsor;~ zzGMuhu4(dfJNxElc+qpDQFNAN0(6hxLze#cw9x!~+MW#OVb)EaH996HYa1HJ7kaT( z>0Ht=&2SG4kA0GVe&Y)YT?Q!T*lt}{xch;arS)smyePjRada!o2H}Ou;1Hu}nTS82 z%gq!l??Tq-+R077gv!`$7Lm9S=$emBU1LLj2G6y-+qq0F48D?(st!Tv8+>EsPF8-$ zvn^EZwpZ->4v7i?F&rkJH_*EA6z8;SK6dW|DL&i6+2!Byv0=I$}|9*IQ{_saYZAZ6Y6INfX z0%#krb>h#>ce(Ko)b=0#`fd2ePXe1yX!B=k4>JCL@rP=H&wHFV0-=A<+fjvT8gLg9 z0#Opk4ZdQ2+j{pLaeK#pLg*D6AlNsUb!075q&K)Ol-jeTf7w>>?1b8E!|~BoX>pC5 zzmB=XlY6kWo>&-6@K9LEe&Ul~`P|%`jp?}z_3yq2uc%il{+VARTdKQT89pG?)&ZlQ0-g!iJ9oBDQA_MLn*wk)HtvDu;YRJk9=F* zi$pBCD#geC>_ZtJdOr`AHWa-@*P{~`j2^3Y6Y3-~^8bn%IzPyoXaV=k@--2FUJG?VvLR1V5 ze`mb?+a}?>_Z>Tu#ewxB{ry(?*C4?B3i7+ZJxJLy3GSdJZ06CM6;{jcC7?F)f(XQp zq4P@{B`4skMEXR6gR;FS@ogXYx9ysJcr-YJV;tvdet2ZZ#qE7{Rf){FmZ#!Xl*e{$ z?_3Rw^w#*eBwWF)L0tXqER`|j^6GNit~I@JkuQtkrHC#jiKi0wm^*Xb{k1c@UM1_f z)^|KVpt{H@1%fXFg3(y|H*;;#B_I|bvd0B*Nsb=vh`il$B3RBu3qy(ViwSK6iRs z<@km$k|}&{@o5x6+1n33h>JU; zpG7U43&~px$(AV1)~Gx~vCisKcCdW0&@DQD)1%)pCydC4kIPwzIiP_ti#Wq{%Pv{D zvhuZrs4Yo+ebunW-GT7~g35cZ-*lNfGG1ES_A#d|(+J{_>~VZj@YSfc`I>BA?`-qN z-M;=bd58t(cdQKa-lVAph5_d#qEtS`*w=L~ASZYK1y3f=X!Uh+EOR|{4rs0)y*0~^ z#MLh8D{DIldKZe{XI`KSE%p@}T)-|b9ThwT8hx2=-jj2m}+elcMn^)@@S8)q#rEScD zXjeCT4??Z>c!js&kVKxfxX9JV3gmSqZN{&Bn$f?6vsv?TIov9nKHD;!*Co$6DxGm8 zHfrP9#HxI=9Yn8pK?*^>tVTA$8PN-?dWO1bBIg#|uH3raB>y6B;k~PoF{UwYJz8Kf zUF^Q4&C(tx!*00-!L@=akt++yV%c_@l8XxE$LEhgrb6VMPr6_*zG%3@)lskjePl6_ zU&oSPCGj_lf!3+OoZJ$$dZlxOjB{Bz`tZ6 z^44PEe7r@HLicdBs%KW1$r(Mbc)ILy8kzO1mMwC`Lp@JzS}4)io@h*Y*|Er{=Hv4g zc8m#@oGudQRl9zNc*qCd0${SXJ>m(|h#|hs}}1A?l*I zcFQ{+;bxVZ=RFID7rKH`oR9y3d{uLR z>B?&d`J2rJbl16mFlLW8hrCUiGfjP&=RD+)V5WdV&>v~oKg!%MeuCc zP9b|8Q>VF}uDsETrs->YVzOUAsvY&J;^OyLz;vJ84`2?3+a72!4|y7+BrB@9-W) zqbpe7yZap%oiDLT)5c=&XOI2Ve(=*JX>y~Av>Q1h`c&k~V!}A*5scpY;Tk1BOIWv*pzW_4k_F!u+~0dj9V{h;!wY<Y zUSXV_t8@)9oc)?8Cb6Q{B4kKZ2C4#X=fyb(CxcPfT61o76lIDS2DH_<*7M26XgI7~ zvN1A3@eXwCW*1+H%FB2 zYwOhx(L3a8eCEkt7Q711y}xDR!exESnGhdsKg6fpvhc3zcimp^HfJ{uhs%fk{6wVu zFPq|0^`3qI;GArhf_iptV1nhN_wP?7DLiWlD_@=IkuXx8FtZ9T5E9otMif&-PaQW+ z;A^W{s4TM3$=`qBB`=@#=!$qj{Ce5moG_25F6`+`O}PD|{!N#q<0p7rg3*OC{-VL( zuej7@=NK5~RE+Jg_K!vYSV-IC+rC>f$czW7#2_D+zznT zl4c#FF|^QK6}`z4-g)9R!g=Qsyh3tuE*CVke9Pr)VyZgg3Y{eGGkd41@?uL?ZkGu6 z?`D$(pPU2Fg1L8qP0e z>~F8oL^18Gzl#5H`ehc|u^eA#>~vpviDY}z{WaLgooR0@i(*sx1dOuQ@s@T}l4ksZ zzWw<1f^4t{xP{eh!#T`evu1ti_-P_$R6{b?qiJm0r$afvF-Fo}M9!abtOU|*XB`I3 z7Z;H(QOQg;Hkt|E2!f3kT=}d$8k4S%U>)^O?NCHup5Insg9OUc_srf(O*dBw?*0C2 zm&O-$?EJ3yrjfsGYjVb`iP4Of*E&TDV_)m13!E?nhCp z5)cI`ZAL+(r92he9tQ+91GGnRUi%jG{%v&K4fz&|4-{^`KNC^Ua7v|X-$QYezs0EI%EmdFXV9zuN|ddkTtCOP>a6mP+YvBBo*ztY>cwEuCERB>O^Btmxl zcJW)pV|;Wo9{TR)|81c(+~z-`e*M?qQlTjQQ{SG-5A2>h5N75l-qFpV>)Wz~rthZm zazSXl{nZ!hRgdG`8wF=5HO`UUz<|KVPfvMY7Dfv=eCp+}wX0y^-h&F+#qR0gPCKsR zZXsM@esANqemnXtw1Nhkv04L)H*MzgKhZV+w4rVs-7W)v6B?SiNmF2Psi_4Hckn=0 zJ^r0Q-Np?aZb-oX&yUnHwZ`BMiLx6?-b68WaaE9W8~mV^z={xDYHHoz%F>>|j@URM z=S$>HeJh@Wd)We^t2ZvCLzpbx*qlN_UjMsWTN^=b$0j%MoBq~b2^DoYIX!wo)uluc z;GPk~ggRNI@nK=c(-`?Xch_%$F_5_3E^@L@_vR_e=GWU5b2?9d&PmI^sklgIVez7A zX_eU03?l2g@_sJ-#M1lNzKZTa9-jDk$0%uW(M>Ti(ZaMGc|nxzRwT@IEy*C0K6B^N z0Y+22Vp3eTM%~hbx2|0=v~&K>q- zgNrW&Ea?TG#h<&;B{z6UVvSN}d0@VYOK?f{enFwU@NPrOm?KUgzP+%ja3V`AP^L58 z@_d%HL+;wI8(G_!zoOO8S7jFm_r4Xt#0jQ0DHl)zBc15+_$z1IRMQDj*oFeh5bbll zdEw&@$43aNbobe!-WLqbn<+&vv(XfTx%FtQg1o+E^MuA^0p2oGKVDr-E^DH^M#FZ5 zlZvcQWm(}9<;FI~u4v^n>o%VFUpYcrKFgFW(s?*JsmT0EL zEUDt!T)>xGg+E?Z^kO1Yo{c=8yl354_q}k{WYMoGc%F4axHAhF-K&2 z?Qu$!7w&lcs-c=>+E1dJ`Z8H;!1o#;=xLJfBbSp95yMk%%+Sy)m(KF-^V)|uL=SeWB6 ze?;80%1mDo^^>Lutd**yj zSq`_-^!&}^lz_oB^cX`2Kgq0FDLBx1r)}@o0DtG?=;Yj}y?aYXt*pI>B)sUp?*iQa z*jwsgZWO{jU|=+0mVLcWCrW|8u^=*jEvH#2@^DVTzivXO-RisWZmoX!BR^!1rBU&r8}5F#G30jf_^C#_8bBYo!)3g!Wo_^X#w9EfM zM?^c9qNYRoFh}IIl6k9BglZn)rc^);8}zuSHw&l1q#eH8mH(%4$qpEh76I zp9)xv_CA9iIoI$Slp+1kGa_uRd`jxaWzo2V#_8As4%6oB1taR5>JGI$%fwOwxvcY# zROFcl*uNhAGlV#+;}q*}p8PV2?w>q;$_}}W8Lmz5r;k}*Uj4(?mMki&d@|nmetRyVMVVCKWOINqnBmnLf1-Tcu*Y(#CaRI0eCb_Sg7Ows6`hn=uNyZrN& z@;r5(|9THB0)L>q#pgfxBpEvPr!{~q0GIF$Dm@l8WX~2GxtN5*MUF9(i!E6r zY#ohBahAleN^aG3rK0nlBEs@TeY2@PTq-%1+Anidj;fJdH9zgq!xlc_)#;!m8}3>n zI?q*fpIz-EAK-UaP3nyNj21S}40D~zNqGG17sg~)c+;-c7Rm9R6IEA-laMZi!pli1&P0T6n)xwD4BWy6=5~@p6?qulZMU0pz>Qic#1L zV6qCj6TVL;RL#YcVkv~qwJzUI*1Khg<%G;1v6hG|Cah^lcQA3sv$?hBd-wX1qIRFU z8FskPH3qDk!*X_WXBp<+=XD=7oJ`0Fn@)(=ZPzL(OOk8%lZ3}dQ+>#yA}g8-X`C4z zH*Oy18m=-2`+I}Y57ut`ysBEvfqD?+`~5jYK-e?xfde< zFXGr$yEkAsU99A4*!ZB5?}}Wh(=U%qqcsl05;|e~i{5b(wUjKbIr|n;LtGMtBE~cI z()Z_CFm%T%*i9xo84|RBCb9IV?bqeK+Q+sPERLCx{GFp?f=*70Yqt?2cSGHO+Bw&O z+>mDCV}PUrMkQFdnpewXLM3B@pcogIO;){Nk(Rstv5W|7`vTb{ZXz2^Gdh`|WwP#F z7LnE@O7j=$$L5_*N!+`fDk(SF{B92?k0^38DO}06u_@0%qZ9-Bs@HA{XXH-=vm8FS zvMp2|Vt@hYZE@&(f@W3Rje1|=d|v$r%H>6pAU>^q)~8B`MdFSTU8MY+AZ5OnIvHPR zXlz`c+3i35SMLR?dNz)4EBZy{-=pN!m8vW*EAXYq+aso)bKlR%doVr{n6Xvf^Szv0 zvN#}Q_;~#A8!j7eiQSdq2sm&P68?1b8(ao#z6;cUzq<&K?ptC7l@WgVTSUQHI4OX+ z0Dvmdl#0?|c}05j*8D)9iY~i(7e<1MAGr$Z``w$y<%=++%jlD1g#lkGbzdCOinHCJ zD1gFVF7B}@?iqGJ4$X`<<8~;@Wfp*E~&6C`((hjgzWo2cF`jb!%r=dM%&(>o| zgF3H`ewB@H3@9#2Z2-}&*Z7~EQhRuYGZa)r&QG+xIFjD`+@}7;gm^vs5z`k7WddlB zm1`s7R$qazPaJ&9W}G+&<)O$|P*L6JX&!L7cn%+XT+7f92R$-1yc|#eb$cRxJb$?U zW1$B88rje0Z`NvUuFiJp&F8!MuYbxnE;EVj{+1ABZPWtvRMC!#P0m{`lN8(&e!dlL zaP;+wtnIgkGEaZ%&ibJJ=dI<-22Hv;9q(kGe}25DK7we-e#Ok^m%|Rnl#0$SP_TK; zw!ejolok*_9GGo=Am<__8XkoaI4SjDaJT1qM&!u7h_~Ny%iNGnZ}D#SZlM>DJkc#~ zcFi@Pp9ZQpZA0k`$%Jlgn}!=ZH=;ra4-#8ZJ2&6=;k^f5ZGMHa{bMURj>^!!vK85* zVt&|jar5V)Qkk1<6L4$)(HFgQ-4!JX#q7cKf6jiK!@3Dh)fp)pfs)XT@m4wQrPii-3=#Yh*uwg74w6Bpw* z`dYvnoX=NHxX%ZDpXOelPF0L1Il(O3H_GeFUn_>f#iU>e8we6AVV-YG5r8uBE>9>E z_jOYO{p{e;+An|ZnrqXNw1uWW=#h1Y2JCp~tCWZ8Pnyx$v#|n+FvPibF1E-9YAyZA zN~A>S920|f+!l81%ykf&SicyzwYKiv3XgZrfc~j86o?)%e|Z$s1})>De9{MPzx{i@ zfKsnOJ%|TNdklYMX{ds60Lsu-=?_{Vp1lsaf*4)J@ho^jRZzuffnO^Ior@zEN)F5S zxvLjePUH*JgVs?h41chJnPe5vI?HCa*;9Z*g{7+EcX)x+4KGx{H>D^P*DZtCdRs?F z40PQdgZnl&Fo=Tk@c1TgXs3qzKIT7>my6?QIRdIjUcU44mfDT=l2bfdm4I77H(RHn98(nyD+u>8es51t9 zp*02vLk&AvGdLEv`SH{HP@urmNA~O5kB0_m2Wae!f+qc({CrX9WA=g;+H`5caejEA z{R$p7J9qDE?O*M;q83)ORx-OBuUzRSgAP#Ak`n7!`sPa_S6MpkvT-HkDlvwVY~!9R ze$d;3u~gan5-N4gaMb}qGf?2|SuYsxWyKtz)ymtaTs^I;Jo~N>n&MZ6h0zsVeHQ75 zR_T2f{u=O>K<*$5wC?ImUs*8t6+NKM;mZ4U*avtV9DS*7aKeW{cHp2;q`M`@LUk-!+5}+vxAu;DodnKpQ51X9RJVzsytK|2ko$`_G$ihg)mSaHYq>S zm<;9|G3s6|6%+YSJUR?CY~hafOWA0`@#C`rwM&Js_oO`t3SsDa-vb4A~^X7Mv}2T;2$!RzPkT?ogy&+qGfrXQNqJ)u=&v_Y&$J5&Fo zseNiJ6xG{;{6IgbkS9h%OA~U+K?SBB#LZ!@W&@0lUbz^z(dM;b??C14W*57htSpSp z9n|M;In-&@wPz}wj*5AxipqY>{%YXy9yO5(7X5JemSMi?!iw}a$FRKk@ITG6|JS$+ zY$pn)AjQ-6@4ESBTl3yi&zYwdPjI|9Gzk9b)N^BFzLN$VrwlmQk3dEG##irEKh)$M z_EHg>JphN(0p^NV7*tFYP3{CP=-c7D=+?0lIp!NDU*s$wy>tJoZ`)k^zs(c=N7rj8 z8jU{)r#$HG?FCiaW4^G}EXhdkg#w5Ncz|!S2TjA3nJ{#9OEs9y3TP?bI5!~F zk|^tR4u&X@taU-N5OH;&k^`!2!yx$40)60YKA5c~3Cq6jhyr!7w-sX#?;>st#(xZd zb5qm_PYuK ziAmrCQv#_K<6~oEY0{vP6f~}7)xcFdbMxu>=f6YeMhj^6&A-_t$=&o~>-ub3ovg(m z#rwCuG*Knc2WJD_(kmd8kP2d#qwLHXcJ{;5a0}p3BZooAsL3HWHBLZbJS$oXySjYD zs#Y0JJOLz~ieYM9pZnWAh&jOtfN+TqXm8+l?D}=MjOePA@RvvOp$F}B|6jV)7hdCS zyLl94(m|_1YqS#D{Gk&rL3y#m2orAqD@X}dR;?rp)bR#7>ne=IJTeHDk>135@f4ww#a4@_< z6wpXBbYLVv-=Ys08$3`5-pI_%%*f0v8FY^Ksf1NV`JY(-v#A_1kl17y~fJ>5oX}x1ccN4E<>|gGJ>_znX6=Jkm-a@>~#;{ z5tY_8{5f^?x2j#RaZ5-FYRs$+gNGQqXY!7l1`n};F#%UK(@7hRr2pbDxVf_8=&wzOSf-7+WPa4N8bFK%1tdynNc5392TOjeqS)vtZXP?^_4+EdVHi98}x*%AF8}2aDYlgnFfGIo(tU{My2#tI5 zvZ3o);MfH!U~tE5MImxaK;BBQqBaf<(PVdN-0%Zm5bX66^=G4#z zlG#I+-vUNxnO+;17Tj>Sh%;qZo>9XM4@c_}U}&hv?0YVFA!_v&U>tS`{Cj6hlhF3gS5yaa-0qtN__1;~yQ0RPx%0+DM|IvPC-d`5Hmw1QO^LM=m4*(%A}Z0~PK7WB4jx2~WwL9f2)IpMa99Kox3we& zQ=F_CVZNRxptEV&|73p)5g>&^@dp4S4Ir5JD+t+~f!ntXntfm6YI2xkEexq7O<>v)rmbQJ_a@l_iK<6v zy-&+l#5tx1(H@i%6F}`$3it?!Ipfp)M-yvYX$Y9`hpy79mR?E&Xx`j{S<1&SFTj*r z`d4`X_t4(&DJmxBxjI`%ODYCgw<%C~FVfmN@yCxWu83!VJ&G0p1Elf+hBc)L^nf+9 zEN9%sFW+4yOt0$d9v{3xeGU^DMgjFS0mQHJ#H)e>FRX?)n^#bv1Akhi0JaKb(scpS zMouDuWmO?dBFlo_7N`dw7x+jH!TN~nn>oEuv8}JCr=n%Hpcz}WZOrQeT+y%FG*GMM#8U$y4{tQbftMZ{rLN7@suWnfqJ9`%q zPYju14S4`tHh2_t{X7u7Vfht_UI|M6bHl*=jDj4{v}`VjmUa=*TdN#Xr79o#1R`31 zrl3PmRJRP?M*7m58!)6DfK3;EeGvkr)%9s6w#fXOs~q|N7@D@A{HSV=$l7;y+Co6xZ~gbKFb3X?cMBX3T@XQz1}qFBVuB!b)eIA8rQso5 zH{DVhdUYx9Aq-iuM0W$X1X9oHSCzwzLoDQUBOkwX-TfbK{OM;| zmZ7(N!2SrwkE}9!9Pih;I#~@kwEhu(BJrm3GeBpjHzH5QK3dMh*2SmqoIutYLh;Pu z(jsjmd zCQCLW(a#|P5kPkvQ1x5^Bb5XaY7}XN>XWFNdcp18VX$A(>k3$kSZMpFCA9bSB!WI? zHVEKDRG|RIw-|`i>lVLkF2Jix;~58D!RQQkiOR8uz*E_Q3jYdd`fd17+CZQi4b)}g zL+W>MnLm(jQI;mH5PXrOfHLUxC8`Doz*3*tB!NL=4k3X}p?NzgIoT6@=~6dBI`z;^+QglI$}hg+bY z#9SlU!~ETqM*M0cl>!mdTpF!fxJ8xW3`w7W5et~X!RtR9r3`)i3Y3y|2!T?)43VqB za0z=jl|3Nb3!pXTpzF&+CKldjal;_eN`NUZFD}0Rv(Jac4rC5&j}Yc`1a~6nMS|LBK_CIxPeiq8HGu$5-^Z*YVt3dGn^onC}pe1h;jhE`VTv}&?S zU~~WC{x?M}{jt8lIrjj9>?INdQ+D)~G6B~t{xdNUveP{{I2f`s0K1Y9G$agcsDLSm z0!rXl=YRpo4 z#@whMfCLg1z*b>?{uu~Mslc%EenoN|i01XZNDt22T?(C~4Pdq`YVg$4>n?UtN8YD{lKpVsXa3;jKY<8xbM-;U|ujwVri6e0} zvNai$a(lo}2w^5sv(QFWuv#7BGBPoVC%WNP8fmHL;1Cj6JAX7kw>x1qQtz>l>73WY2T;9mGt57rDz zg&@_~*f~GssjJ?H;;qc$!*U^mehmyh1L8){!C4`CK7A&x9-#J_w;SM z-9r`2`#m4CXFf$<81Q!(eKQxG@f1?c+`qXoR!2p>To)A@HePo|s2#QQ%Y#pwKrvK4 z{%>I-Yd^{o%n=ehA+ZE_nF=sQON!)j>}0ti#L1wJG@{2`&;u(}@n1-N_j|&Ouc%#; z)kl#;9r888oe^Nz!<BS zi^~@sBiB7{>8)Z;%T3ik`=Q0A^)?BeQLVu}zj!aj@Z-;J_^LqX?pbDHl+lkWwT=UF zaT7_vSadA{arWs>}DP- z)OfIS2VhTY58%SXU$es0UF73S>to2YlOYodD99eNZx|d5=Rj@>p$>tsh!(I~pNpT* zWDhR%B|h1bMxbU#d1|EN8^wS1PyaZm0)eLD}74QZ>T07t4E1RA@X_q zV)C!m*|&ad$)duO`OJlWu*5@ZPWv1v<=(CF;)(5v$ZD3bV1dB0zW6^bbsb#y-$aRc z#b8yImoS_qQk8xMq5rLefVM|GI1E)v5CH1Ievaykuc}L75BkEg|Jdb|2=gmY4 zZ#dM`9-wz2Jsn3uS1Dpn?YvKS#$`FS4hz&TEv6He;#CtZ@aLBsmSY6!Tj}_g+n9q! zvhJ5bjjN%T`)ZR_ZZSo;X34}a;213BVuMItsSqF*o9h4Hp$sZB7C zTR(lmWGPwTCZT`4dp=0fhj}=#tnlM!Z|N8I^A-w233y%Hl{*!Va( zIrAPr)&#}{q0Km~`n~{FUcDrzZ()%N7!(ZXlxOn9>s$d0t*6?Bxc>aOr8FhBk=^cM z|5MmzcQL2V?qp-0H|*|LDRP{t&wH#W70WW&{@h*%mo@qrt#zt1s;6Rhv?IcDd1Ce~ z8%A`eAg9az3(SkObsrb{ldRU->GzyV)i|3ks<{+r(+7k6%-_yl&&{#!3ds&8<83eY zpXyn>yMn=OQ&&yl@X2-w950S%JbbVXLDj%stv2%rlui}Qo}Rc~$KHy6%pNnOS`lId zbq(~nJ{Hug*GR4fX7gbTO-#D1gCOaH!NHI?K@4odLT;L`82$UuqYb($F7U4zC0|Ew8YUDw_*)et>1HIq+(;wgTq)C7(j` zriNX(Wv@|pBKV|K*qz>df=mS6wot`Y9Wq3<^r3xtCU&&6{2Gga!CILBCiBrq?D?SC zGq#-u7+ilcQ}HZIo&8Kym+h+u>^ZF!{AQM`7ZrWDtX{oXe9xZa_+`1oCGarD&?4~k z&Pcj*8FQ)_LtaW_=@Pw~TkoL)ajaMRDcd<9EyPp2mb zMpxIy-8c1hy5$z|TPzQehCe3geU2x}DneQE;D@z(RkHsoYOUp(DpsG5&PS_XORi&6 z6Je!y52~f%wvb+-RWrVDqia#p6>zBYx!Zqwr?jHkO@U z@*%W%NJw3yGD`t&28o=KkxeguzCL%iY@6xqTy0BS z)~Z+kP6#hOCi5srO+%4_$}WfJwHz;KCgUbu+KsO+y)VWReb+SdopQ35#?Z~5z4^{$ zdOE>*JqjyyKE?dlVGZtL0g4h+yh=V;1y-hw-^8BLGT%s!ki;&zk|TB>SijQ|vGQd1 z0j#Ny^YSAO#qz}jw9QlvCX=5tRwFBz!QWF!RcE;LoiqL{zzkJWJ-N&UYG&6-hx zdSEo^C54R7E38lP^nnk<>!aHM(j31*H8V*C%(X@kD`6^Q3{Aala9Ix>jd5AUU%40c4E0@ZR0vDK5u}(7|(VCqZn7qgP5)Rc#w0toz5ytG~ zzUt$s5t5xyP7xL2#of+fU zE~8cFp>Qv%f9*^B(xL-#y=eb=UxS^y*W7>PNp7oM`?NOd|LDj4QJm=6Kkv#DX>vj= z*r7Y4@@C%iDvYP>yl6FMDZY+de!Bt65Z{B3pFtraTB!4+^I($#QT9{SI*XZNTcVhJN?8%BkjBz-)4U61f8 zQ`$&&d3dOAo3)We;5kv&j$9A5U|Q`HCtbZ$wmLtiDz*1485UVjIx|fbmz2|a(9FxC ztkwM2H7qOAJB_nOUF5S7YimuD?tc_`VY)svQ(D@6Y^A4oJ)nBmHCDq&~BZ zVtvh1jIuSo;rkB6%9f42XvGLz%}`yiqDC_mB6&i8VOywRMTK7f1ch>tHi1NnCn=b= zxX%ifNk}{40jwIuy9)Rhd#LXLT;%C7^}J3911{+W6xC6Y@BCdh_xa%8RZmqP;th&s zVF)|xO}4=)wE6Ok)cEWNbkon)u3EUMfrUkZnC0a?{-?Cg$Wtox z6QUNz;Xl?Uy?|(;=lP&#o&vqaP~i)u|0^dai;==b^XETU_+FZbfYvIFYI$Op)qv-H zv)aUo*Z4%_LMjC`?wOY9`!m9{UuUleH~QgrLP5^OqCN?_%4P_K8gOJ?OjGZ&3JE3v zNoNjY7?2t+q__mic?F=ncRUTIh<#RGXjR|fs{k7Y!Jq`fhx-TTDQ+QEfdrTqn_}i# zAqa~5AA!}1kJeLFfbxuw@42i}V8(_lC`30P6g+6|+rZI(&r(!KfMFK#2i>ZVA*nRT z>wAES$c0=wU?~OQ`KFBQ8I3)auBRRAf@C|dW2I9mlg0B~R)n+yF`NL=itgtak(Rzq zJ;%QFS!B+m0tF>3*1~6Ps1deuDoN{9bBPyqWfn{8e9q8-;~8S8vOH{T%o7`-(qcm! z73?V;FIuXiqtI08x*HHc;5wwB zl7;#_TPuFF*Qux(re!2T8D%j+Q4C4^0OL^!S#xP&pf&6N+_4Kv3UN>pVh1oZQQ3d) z^^v<$v?!A1`s#ws()Id@`(gAe$IVNpmtD)As@N8Fd6(f+D3ZZ1hRe*7Tg3ePsa6B2 z{rKuChDRMWw-{VJck3}1texLLLJ*H?8`_LiVdk;60V20h-49QU3{KR$Dod`$3CJ_60Z#0 z{yaq^Y|p_sq_hO85lreSP=M^Qw%A1mA=eOV*5(rxw3J~hY*G*QFV{tZ`k)>112uW+-4Xt^E~lrc|U z9SzarT`m|3z7q1~`P-tVl1I^jstNa)BzP+qNqrh96h4Bja+^6JLgDwskkfP2PxWaL z!vm%D;v}tJtCj9%Enz`C>A^i7+*4xG5&DT2t2b-N2lNyBye>%1zZ||jF&wp6A7T|- zT|NJ5snd4i@$hInjuc?_qKe;?m=v@^iVpD?QK&8S>#yStn8XT&-Hj&2^;2k^xb?Gd`8sd3r|qMW-8s%!e@ z`<`@J%@Ky#bAM%C^0V{wSle4;b%;JL@}9d$zH(twfbCA5geJj!X<~%W4a4g<`+$cn z?9SR+^L-w}r&sOoNvvOAo6(D|&=V4`T1uO4UQSku8Mvnim0g#er6^@K3#J${)rP{< zt)-Eo{|KC=`&ve6*9z^IlIWrTF=rK$R6SFkJ+HH>J$q-M*BWQFe$;=ixc-B1c-L7r z?SaME;g^vDogf9c<~g^_iLcfBo;^86JLGtt{|Jw!D65cge+oD4)9`DWP!-+hdUuyg zQJLb(keeX+zSim8qH;>Ee)$X0Cm4Z2&+tV5coI*#dEjNKT8Whr>M;HSjyZdBcDAvO zl(?H`W|H|v!tY6qgSRi=k~eAo^fY%MYAq3ufr`SE`-&i^+KGcC(-mqF#ZBJ zZS>FyCOvmC@ zp9%WA=q)vUdLNRaw5z^r{fSpv@EYMm7pK)7<(K)(S;1?qL;DM5JL`4y775;7E_3C4 zni2aRJYBK%Ft?a}&D1LsB(0gwy?$OFKag7DEhOoR(N&gOA+ig#*O~@BTrW*qvz<$v zuHKK%D?k1AwvDz+%X6+W0p@fhTl1{@a(5T0FSKEZ)atfdvNj_l|6zCQ|3lt;M>Y8^ zjlZFZh;#*|Dj-;BO7AEtpcGN*9R#HJ-n)W;fYL&-(4_Ygx-sMgKU=oo>?AmI&Lv+*R5~ z8ct$ir{i;W$T6#Kqzcb$r_p%4GE+K_q^K9NCO*>+neJc|ONFi};p1jWnMThpkBxRW zH+}lRoR;SATE6j_J9_R2z3ju^ypa7!$Lkfso(u~^PRyb^ch=%Xb7g!jo;gosEt3~S zVp$|P#r?I*>Jsv(x=VKb_Re-(=6?C@xp;8lg=Mb`-4#DG>(-f5W)&01m=8C>hpTyY zFgqdE-mIlvvgtUSQNpAL=PSIz-Wh2;mN7C`DgMn*?syjdt4lUaE&MzxlQrDA0n$3| z`U7bJ0lGs?`=h;6{tfsgPjXgCP6vBG&k9yjWP!}(!e{-=uWTXm0q6ox0Gb%o`W$fr z@i$0!eX~pUIn(}mzkbH=V|OPUT|y+@F&*E7j|n&~>8_hol{xFtsRIfz9(s zY%`{Ec_J#x$Vg1w3gLNpqQnu2WqN(MIsRUOzRR#amMTVN2mfMk@m9CIU{r~sf5Eh? z^{%HsGBe>h>$9c#{-MVJx8!6LJW0aLC!o2)C5Bg~#c0oUuk~t2g@NAD75qaP zQ@IDeFZNEO;_-qN$%x>ksHHjYug9EtHd%FFy)V5?k=R<-m-h|vkM}YhZXKP9T^A8Z z@$*HRP0gtLen#6g!+gD;?KMtx%&qiL9pS_?1N5EOCOWwHngZ1K_}3V^nh$msbxdj+ zYdoQ+N3om?DvJI-%6q?%^j$kZ*1BvA`y{s4-(c!GrXCL~L|JCO*1R(CBEb0R?&TVa z%-jAf_rKI4x%qtEu&JAi{+XD@H``s2YQ{~~R=8{rZmrCZJRqV~f4ZQMAnOGuI6V

Hr;__dg#=CCq1{S{>~QpVXGm)o@WcptXhq}1Ib7`c>C ztb8{=9^X6b*Hxo2%AnOtVd8AOjU)OtBO);WS{Zm+ zE@SYzcVD`y@NRejLu*1S)5xFAhyrJ2aS;Q%CUULS&^@RGv7s1+Ju}6e z|D1102Gq94h=0suBjwdX6Bpc%KanYNo@O!0?7;4=(^nd zc}h_|+J|i;H&+i2>q<`|2Qf{%ru3GJ^t*! zJ50GX7I0=L$h#k0-$@*%koAZ^ccM8>Xy0u9*Syp2hP&XYn&VU#u`HJ38!vMB} zvArynXy0E&g0(jXq~>o(zbZuPzbtKzyj0@lJ;^3uMG&(-BRp5vKSFbO z&DdUuXzOI;gZi4GjXgxt2g;NiGjAa5kdl(dd!5;#zMqYBsL|O+xU{~Y9&-yW%QiNG*J%Q)QR zPYmiX+XqqVT|>f~?lb9|foM5dI96W2I@izu=AD6tBcAr!ky>)y$U)>t$)6D41j-OI z>`!xKTiCuzii0?NWy8JA2=sd5+OqcAG&&>U)NLW?_rkCW1lv|&d}zjn@5Tpf#3mcc ziS&neyYw}UNbV8bHlT2by&p7D7AueLu+V97&=n7GzTa^Fn)?}P3|?=`d9(oeV2YN< z3@_Na8cM+rHMtXRFmuu{`7NQCbQki#aGPUKWvL=H5{CLCEGrs zEa!=lad9wR)v_4>P%ZJJc_N8?wXKS+&5Gy|Rp~p|N+PGz8|>`t<;_wa!2sHW<;o5yUxjw)DQ zEZ?7D(i*F3=u=#^6`EPF-EApJYAx>h6|@y2U}-i58@s-2EyF)%SuHm1HXBPN`fx0a zA$2#QW%}df3k&}d)f9)>lAKJZ;ei^NdBc}1O$}<_2byPT8t3b6F!m>4=*X@BNiGm(@umcl)N zSV?NB*E3egCOh$Os=zp1Rf%u=w6SKCJcc02wqXA8kZ*Xi*6{0;Z$P!@{E}Txhwf?L zLKDUrjaxNJ*x7XJhza-wZMUg5NLuv2SX?)-KVH@M|Px#dIFD@4}TTuOM|F+BzY8k&ejgDN^AM0KZFiNf%V{T$vBlD)q*SrH7T5aRU(RV;;7udf zeHL&7y)jBS{LI=xxS^aiJa=c#zc&bOa%fMkD{)kLBn201t{$NpScW3o7?P3=1H!Z0 zXJcclQ(N|Dt&{7!rS$)Jg30WQA4^I_wrw4LwW%#GWJ7D!NO5;btnDDhCsGI^=16{U zm>{MHaka0tJ;TU~6CLgsMb-3&sFbAICuzyr>(Wq(aaXEtSpUMOZ)kcg-7DR=I{d80 zu+`-Sj`uZE#Nb74%mdyey*KxlDAhcNh<_dN3RXlIQ9+GFgBDaulI_3fE$uZ56iFN~ zJm)r$lv^94!uqiIenCWZN2HKGLSorR3=Umv*d20ji9}h=G_>0J4~$VQWDl3QhR4+6 zIlt)H^{`vCK7-%d>B3w{xO4gZM)SVh>YzXRU&9qAd2X zOdp%?UL|V3AMggXPB%ED8r|rL&~L8GiQ>5BAOSLr$frzxlrB!8DtnK@f-%PS-Ud~14`zNnHe)w(zx3udK z87uQZ1T55awH-ID;_&Uxp2j?%F2pW%8eqF%^zW;RI?rke4f%zr=5gln7)pa?NWNd( za7|8zgT9(i!=LN#;{VA7$gz*DfimgQ|3qLq+pbnVG5Kz1drwrfqQW2tXQwhZfxY4o zq8A%laUtbK(x|D7S^ZUC^;yde8HwWA=;Ca~%D%O_+g`#v4(6vXwguszBP?4+ITqUP zpbqX1hnWi{#R|A7ouXKNsJh_bQ+iifllclrw9+um_Ye`MqtXN2W&L$_Qrv4Z7wT$~ zHJdXY9WTFh6pd`yHhdHO=WuB6hD|xym$9hl6iDxhMiE~oY*Tn#>sL-&GRO8t0TiJi zeR+q)Sz*lj)zu#^$~UG>h1XVNn=A>N`Y$I8kS3_W`tYH<0RqT{*;{e@`A5j5uf^pn zLeXwRRYb0ir-KjSt)wvjU+yVLwUc|y@LP7V<)1`S>EC;fyHy8TA&mjXt<7!v>d@To4m9;^oP}00|uuH=_ZGZB* zd6@n*$3=lL3eQ5 zmNR)}W%lV*BnktMC7Axy_N*PN6y5c@;Qd~PLaGtNipx&s8(kJz)U5_h!LQv|t9S9Q;R|FD4F{TV$QgX?#z8XGgCX%-x<|6S>n^r7Ea zFe`*Dao0!RAp?B2;<6hVlN!kC8)J33Dr&ie1VeC>W8uyBKr}SkXACFFsoqXkR zg}OKwy4dRtbTb)-ex{PQQ_9PBG;7Ksjp-v6Cbqz}@}yMtSp5=DBw+5ydC{Estthb<2`(Fgz!j zd#tyyPj67dZZ(H3**>QAgN@t5i(ylzS1Dc(j!HR)PvhDcH~pPDnn369`vEPkwavPI!)olCS-jlQcZdh2Dh)S$KEK;LmJY8p`{c4lfS@eQ8 znQyYXvbuq`Cj+5W1ux-VP=&&jIplzjy*0R=F_@?Yq z0yZM?VP4pyw!L}z{oI4trlPlFiOKiBFiPf&UfEKJ+D>F1?qY`W7m-U}9z3qy8+I1; zXPUNX!cr`S)ssoz%6rwkGe>hb6nseB71?oqlFR_`dX&10x=8memOR9GbnypER~Uc8<7fy3lCSd&SNmBGhNlybPq0;wW@3-Qk|Ptltiu~nMu zMc3Jw*jeS>Qw+F)v#=`kmPssHSk^Ab-oT`m-z#1lK8qoh8mtgz$?#oQfHG57vv~ zV7+KWDq6%w7>eJqaX1C8qdd0|DBPQQI56%eFA5jgEb{6MD&)^< z_n#gKPcwPM5r)5DA#UlnQ?k+JR}rZLxQNWkmGme(y*dmoJS&;$LlTAP)DJcWY`yb- zQ<^w+(*$|8@B+f8!9u^?NF{WNA;s)q=evrrrxTMy7V8I|G0v9?g}FJ$C9k(rXoSY|U`DE8H*eC^#g4jXLnAJ--5GEaplr_X&bn@x0&DZ=m-OHu5&=2ti z139fLPmr`Qx)PQzW{8Lwu+r3#{RDM6%6U++jUJ;SZxV#xX};#L!+TjVoXNRuxH88d zMLG|s>k}~OrmQ_xbSb(uq%-M*R{{nhtKv3fI+%&RSvi2M*YWC7eLn z80IvR>DijGA|o^K9zVx1Il6a5f~u=aKGb0_*cH@47Roo{nBHHAF=pF_a8MMN>t$TZaci=TXw(cF&VO`rv$_4l z`(yV{a;}8~w#xi;Uncb^Ttt4F&4qUM&1kVOMiq8i$_!hv{p9CP)|`;MxA5aL%D=P& z9*k6;tzk9^?!I@FQufBZ%0w~0Ml=N)(41<_`a)aJw0a^@N_T0h5w-lxb4`C==FE~w z3T^k+ceZGSD-VTD_>G`j6B<}*y5%^heGEDmN}nO!hs`ZSnQsZ@AE;+*7ry^gh)`=` znEjj~ZNh#>UN*PbnZ_KddRZ@V5NXn2?of3Nx2-rEIq-XCG(@ftIc?ItYN4T1WMzk6 z?iuv7G}ui?*s`d{5}>+oIZh9M6rUirfuCMaB+<*!-umd4dR?#d+r>+n5i3+-_Wtw% zW`s?*4�v&F?eysc66jTsXWoSYBN9^(~}66UHCh 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 X`MhlwmwLk(QD&IS3YYK~Za(;5*0ySf diff --git a/src/frontend/packages/open-calendar/index.html b/src/frontend/packages/open-calendar/index.html deleted file mode 100644 index 56bd94a..0000000 --- a/src/frontend/packages/open-calendar/index.html +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - Algoo - Calendar - - - -

- - - - diff --git a/src/frontend/packages/open-calendar/package.json b/src/frontend/packages/open-calendar/package.json deleted file mode 100644 index 2118fb9..0000000 --- a/src/frontend/packages/open-calendar/package.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "name": "open-dav-calendar", - "version": "0.9.5", - "description": "A modern web calendar frontend for CalDAV based calendars", - "homepage": "https://github.com/algoo/open-calendar", - "bugs": { - "url": "https://github.com/algoo/open-calendar/issues" - }, - "license": "MIT", - "files": [ - "./dist/*" - ], - "exports": { - ".": "./dist/index.js" - }, - "author": { - "name": "Algoo" - }, - "browser": "./dist/index.js", - "types": "./dist/index.d.ts", - "repository": { - "type": "git", - "url": "git+https://github.com/algoo/open-calendar.git" - }, - "scripts": { - "dev": "vite", - "build": "yarn clean && tsc --emitDeclarationOnly && webpack --progress", - "preview": "vite preview", - "clean": "rimraf build dist", - "lint": "eslint" - }, - "dependencies": { - "@event-calendar/core": "^4.4.0", - "@fortawesome/fontawesome-svg-core": "^6.7.2", - "@fortawesome/free-solid-svg-icons": "^6.7.2", - "@fortawesome/free-regular-svg-icons": "^6.7.2", - "autolinker": "^4.1.5", - "email-addresses": "^5.0.0", - "ical.js": "^2.2.0", - "mustache": "^4.2.0", - "timezones-ical-library": "^1.10.0", - "ts-ics": "^2.1.8", - "tsdav": "^2.1.4" - }, - "devDependencies": { - "@eslint/css": "^0.9.0", - "@eslint/js": "^9.29.0", - "@eslint/json": "^0.12.0", - "@stylistic/eslint-plugin": "^5.0.0", - "@types/event-calendar__core": "^4.4.0", - "@types/mustache": "^4.2.6", - "@types/node": "^24.0.3", - "css-loader": "^7.1.2", - "dts-bundle-webpack": "^1.0.2", - "eslint": "^9.29.0", - "globals": "^16.2.0", - "node-polyfill-webpack-plugin": "^4.1.0", - "rimraf": "^6.0.1", - "style-loader": "^4.0.0", - "ts-loader": "^9.5.2", - "typescript": "^5.8.3", - "typescript-eslint": "^8.35.0", - "vite": "^6.3.5", - "vite-plugin-checker": "^0.9.3", - "vite-plugin-node-polyfills": "^0.23.0", - "webpack": "^5.99.9", - "webpack-cli": "^6.0.1" - } -} diff --git a/src/frontend/packages/open-calendar/src/VCardComponent.ts b/src/frontend/packages/open-calendar/src/VCardComponent.ts deleted file mode 100644 index b57e74a..0000000 --- a/src/frontend/packages/open-calendar/src/VCardComponent.ts +++ /dev/null @@ -1,43 +0,0 @@ -import ICAL from 'ical.js' - -export class VCardComponent { - - public component: ICAL.Component - - public constructor(component: ICAL.Component) { - if (component) this.component = component - else this.component = new ICAL.Component('vcard') - - } - - get version() { return this._getProp('version') as string } - set version(value: string) { this._setProp('version', value) } - - get uid() { return this._getProp('uid') as string } - set uid(value: string) { this._setProp('uid', value) } - - get email() { return this._getProp('email') as (string | null) } - set email(value: string | null) { this._setProp('email', value) } - - get name() { - return this.version.startsWith('2') - ? (this._getProp('n') as string[]).filter(n => !!n).reverse().join(' ') - : this._getProp('fn') as string - } - set name(value: string) { - if (this.version.startsWith('2')) { - const [name, family] = value.split(' ', 1) - this._setProp('n', [family ?? '', name, '', '', '']) - } else { - this._setProp('fn', value) - } - } - - private _setProp(name: string, value: unknown) { - this.component.updatePropertyWithValue(name, value) - } - - private _getProp(name: string): unknown { - return this.component.getFirstPropertyValue(name) - } -} diff --git a/src/frontend/packages/open-calendar/src/calendarClient.ts b/src/frontend/packages/open-calendar/src/calendarClient.ts deleted file mode 100644 index e69be97..0000000 --- a/src/frontend/packages/open-calendar/src/calendarClient.ts +++ /dev/null @@ -1,282 +0,0 @@ -import { type IcsCalendar, type IcsEvent } from 'ts-ics' -import { createCalendarObject, - deleteCalendarObject, - fetchAddressBookObjects, - fetchAddressBooks, - fetchCalendarObjects, - fetchCalendars, - updateCalendarObject, - getEventObjectString, -} from './helpers/dav-helper' -import { isRRuleSourceEvent, isSameEvent, offsetDate } from './helpers/ics-helper' -import type { CalendarSource, ServerSource, AddressBookSource, VCardProvider, CalendarResponse } from './types/options' -import type { Calendar, CalendarEvent, CalendarObject, DisplayedCalendarEvent, EventUid } from './types/calendar' -import type { AddressBook, AddressBookVCard, AddressBookObject, VCard } from './types/addressbook' -import { VCardComponent } from './VCardComponent' -import { isServerSource, isVCardProvider } from './helpers/types-helper' - -export class CalendarClient { - - private _calendars: Calendar[] = [] - - // INFO - CJ - 2025-07-16 - Contains: - // objects from an ics WITHOUT an rrule - // objects with a recurrenceId generated by radicale because of `expand` - private _calendarObjects: CalendarObject[] = [] - // INFO - CJ - 2025-07-16 - Contains objects from an ics WITH an rrule - private _recurringObjects: CalendarObject[] = [] - private _lastFetchNumber = 0 - - private _addressBooks: AddressBook[] = [] - private _addressBookObjects: AddressBookObject[] = [] - private _vCardProviders: VCardProvider[] = [] - private _providedVCards: VCard[] = [] - - public loadCalendars = async (sources: (ServerSource | CalendarSource)[]) => { - const calendarsPerSource = await Promise.all(sources.map(async source => { - try { - return await fetchCalendars(source) - } catch (error) { - const url = isServerSource(source) ? source.serverUrl : source.calendarUrl - console.error(`Could not fetch calendars from ${url}. ${error}`) - return [] - } - })) - this._calendars = calendarsPerSource.flat() - } - - public getCalendars = () => this._calendars - - public getCalendarByUrl = (url: string): Calendar | undefined => { - return this._calendars.find(c => c.url === url) - } - - public fetchAndLoadEvents = async (start: string, end: string): Promise => { - this._lastFetchNumber++ - const currentFetchNumber = this._lastFetchNumber - const allObjects = await Promise.all( - this._calendars.map(async calendar => { - try { - return await fetchCalendarObjects(calendar, { start, end }, true) - } catch (error) { - console.error(`Could not fetch events from ${calendar.url}. ${error}`) - return { calendarObjects: [], recurringObjects: [] } - } - }), - ) - // NOTE - CJ - 2025-07-15 - only update the objects if this is the latest fetch - // This can happen if this fetch took more time than the last one - if (this._lastFetchNumber === currentFetchNumber) { - this._calendarObjects = allObjects.flatMap(objs => objs.calendarObjects) - this._recurringObjects = allObjects.flatMap(objs => objs.recurringObjects) - } - return this.getCalendarEvents() - } - - public getCalendarEvents = (): CalendarEvent[] => { - return this.getCalendarEventsFromCalendarObjects(this._calendarObjects) - } - - private getCalendarEventsFromCalendarObjects = (calendarObjects: CalendarObject[]): CalendarEvent[] => { - return calendarObjects.flatMap(co => { - const events = co.data.events ?? [] - return events.map(event => ({ event, calendarUrl: co.calendarUrl })) - }) - } - - public getCalendarEvent = (uid: EventUid): DisplayedCalendarEvent | undefined => { - for (const calendarObject of this._calendarObjects) { - for (const event of calendarObject.data.events ?? []) { - if (!isSameEvent(event, uid)) continue - const recurringEvent = event.recurrenceId - ? this.getCalendarObject(event)!.data.events!.find(e => isRRuleSourceEvent(event, e)) - : undefined - return { calendarUrl: calendarObject.calendarUrl, event, recurringEvent } - } - } - return undefined - } - - private getCalendarObject = (uid: IcsEvent): CalendarObject | undefined => { - for (const calendarObject of this._calendarObjects) { - for (const event of calendarObject.data.events ?? []) { - // NOTE - CJ - 2025-07-03 - Since we look are just looking for the CalendarObject and not the event, - // we just need to check the uid of any event, and not the recurrenceID - if (event.uid !== uid.uid) continue - if (!event.recurrenceId) return calendarObject - for (const recurringObject of this._recurringObjects) { - for (const event of recurringObject.data.events ?? []) { - if (event.uid === uid.uid) return recurringObject - } - } - return undefined - } - } - return undefined - } - - - public createEvent = async ({ calendarUrl, event }: CalendarEvent): Promise => { - const calendar = this.getCalendarByUrl(calendarUrl) - - if (!calendar) { - return { - response: new Response(null, { status: 404 }), - ical: '', - } as CalendarResponse - } - - const calendarObject: IcsCalendar = { - // INFO - CJ - 2025-07-03 - prodId is a FPI (https://en.wikipedia.org/wiki/Formal_Public_Identifier) - // '+//IDN algoo.fr//NONSGML Open Calendar v0.9//EN' would also be possible - prodId: '-//algoo.fr//NONSGML Open Calendar v0.9//EN', - version: '2.0', - events: [event], - } - const response = await createCalendarObject(calendar, calendarObject) - return response - } - - // FIXME - CJ - 2025/06/03 - changing an object of calendar is not supported; - public updateEvent = async ({ event }: CalendarEvent): Promise => { - const calendarObject = this.getCalendarObject(event) - - if (!calendarObject) { - return { - response: new Response(null, { status: 404 }), - ical: '', - } as CalendarResponse - } - const calendar = this.getCalendarByUrl(calendarObject.calendarUrl)! - - // FIXME - CJ - 2025-07-03 - Doing a deep copy probably be a better idea and avoid further issues - const oldEvents = calendarObject.data.events ? [...calendarObject.data.events] : [] - - const index = calendarObject.data.events!.findIndex(e => isSameEvent(e, event)) - - // NOTE - CJ - 2025-07-03 - When an recurring event instance is modified for the 1st time, - // it's not present in the `events` list and needs to be added - if (event.recurrenceId && index === -1) { - calendarObject.data.events!.push(event) - } else { - event.sequence = (event.sequence ?? 0) + 1 - calendarObject.data.events![index] = event - } - - if (event.recurrenceRule) { - // INFO - CJ - 2025-07-03 - `recurrenceId` of modified events needs to be synced with `start` of the root event - calendarObject.data.events = calendarObject.data.events!.map(element => { - if (element === event || !isRRuleSourceEvent(element, event)) return element - - const recurrenceOffset = element.recurrenceId!.value.date.getTime() - oldEvents[index].start.date.getTime() - - return { - ...element, - recurrenceId: { value: offsetDate(event.start, recurrenceOffset) }, - } as IcsEvent - }) - // INFO - CJ - 2025-07-03 - `exceptionDates` needs to be synced with `start` - event.exceptionDates = event.exceptionDates?.map(value => { - const recurrenceOffset = value.date.getTime() - oldEvents[index].start.date.getTime() - return offsetDate(event.start, recurrenceOffset) - }) - } - const {response, ical } = await updateCalendarObject(calendar, calendarObject) - if (!response.ok) calendarObject.data.events = oldEvents - return { - response, - ical: event.recurrenceId - ? getEventObjectString({...calendarObject!.data, events: [event]}) - : ical, - } - } - - public deleteEvent = async ({ event }: CalendarEvent): Promise => { - const calendarObject = this.getCalendarObject(event) - - if (!calendarObject) { - return { - response: new Response(null, { status: 404 }), - ical: '', - } as CalendarResponse - } - const calendar = this.getCalendarByUrl(calendarObject.calendarUrl)! - - // FIXME - CJ - 2025-07-03 - Doing a deep copy probably be a better idea and avoid further issues - const oldEvents = calendarObject.data.events ? [...calendarObject.data.events] : undefined - // NOTE - CJ - 2025-07-18 - The ical we need when deleting an event is the one before deletion - const ical = event.recurrenceId - ? getEventObjectString({...calendarObject!.data, events: [event]}) - : getEventObjectString(calendarObject!.data) - - // NOTE - CJ - 2025-07-03 - When removing a recurring event instance, add it to exceptionDates - if (event.recurrenceId) { - const rruleEvent = calendarObject.data.events!.find(e => isRRuleSourceEvent(event, e))! - rruleEvent.exceptionDates ??= [] - rruleEvent.exceptionDates?.push(event.recurrenceId.value) - } - - const index = calendarObject.data.events!.findIndex(e => isSameEvent(e, event)) - - if (index !== -1) { - event.sequence = (event.sequence ?? 0) + 1 - calendarObject.data.events!.splice(index, 1) - } - if (event.recurrenceRule) { - calendarObject.data.events = calendarObject.data.events!.filter(e => !isRRuleSourceEvent(e, event)) - } - - const action = calendarObject.data.events!.length === 0 ? deleteCalendarObject : updateCalendarObject - const { response } = await action(calendar, calendarObject) - - if (!response.ok) calendarObject.data.events = oldEvents - return { response, ical } - } - - public loadAddressBooks = async (sources: (ServerSource | AddressBookSource | VCardProvider)[]) => { - this._vCardProviders = sources.filter(s => isVCardProvider(s)) - const davSources = sources.filter(s => !isVCardProvider(s)) as (ServerSource | AddressBookSource)[] - - const addressBooksPerSources = await Promise.all(davSources.map(async source => { - try { - return await fetchAddressBooks(source) - } catch (error) { - const url = isServerSource(source) ? source.serverUrl : source.addressBookUrl - console.error(`Could not fetch address books from ${url}. ${error}`) - return [] - } - })) - this._addressBooks = addressBooksPerSources.flat() - } - - public fetchAndLoadVCards = async (): Promise => { - const vCards = await Promise.all( - this._addressBooks.map(async book => { - try { - return await fetchAddressBookObjects(book) - } catch (error) { - console.error(`Could not fetch vcards objects from ${book.url}. ${error}`) - return [] - } - }), - ) - this._addressBookObjects = vCards.flat() - this._providedVCards = (await Promise.all(this._vCardProviders.flatMap(p => p.fetchContacts()))).flat() - return this.getAddressBookVCards() - } - - public getAddressBookVCards = (): AddressBookVCard[] => { - return [ - ...this.getAddressBookVCardsFromObjects(this._addressBookObjects), - ...this.getAddressBookVCardsFromProvidedContacts(this._providedVCards), - ] - } - - private getAddressBookVCardsFromObjects = (addressBookObjects: AddressBookObject[]): AddressBookVCard[] => { - // NOTE - CJ - 2025-07-16 - radicale does not accepts vcf files with more than one vcard component - return addressBookObjects.map(ao => ({ vCard: new VCardComponent(ao.data), addressBookUrl: ao.addressBookUrl })) - } - private getAddressBookVCardsFromProvidedContacts = (vCards: VCard[]): AddressBookVCard[] => { - return vCards.map(c => ({addressBookUrl: undefined, vCard: c})) - } -} diff --git a/src/frontend/packages/open-calendar/src/calendarelement/calendarElement.css b/src/frontend/packages/open-calendar/src/calendarelement/calendarElement.css deleted file mode 100644 index 048d55d..0000000 --- a/src/frontend/packages/open-calendar/src/calendarelement/calendarElement.css +++ /dev/null @@ -1,7 +0,0 @@ -.open-calendar__overlay { - overflow: auto; - position: fixed; - width: max-content; - z-index : 9999; - box-shadow : 0 2px 8px rgba(0,0,0,0.2); -} diff --git a/src/frontend/packages/open-calendar/src/calendarelement/calendarElement.ts b/src/frontend/packages/open-calendar/src/calendarelement/calendarElement.ts deleted file mode 100644 index d5eca9d..0000000 --- a/src/frontend/packages/open-calendar/src/calendarelement/calendarElement.ts +++ /dev/null @@ -1,535 +0,0 @@ -import { createCalendar as createEventCalendar, - DayGrid, - TimeGrid, - List, - Interaction, - destroyCalendar as destroyEventCalendar, -} from '@event-calendar/core' -import type { Calendar as EventCalendar } from '@event-calendar/core' -import '@event-calendar/core/index.css' -import { - getEventEnd, - type IcsEvent, - type IcsAttendee, - type IcsAttendeePartStatusType, - type IcsDateObject, -} from 'ts-ics' -import { EventEditPopup } from '../eventeditpopup/eventEditPopup' -import { hasCalendarHandlers, hasEventHandlers } from '../helpers/types-helper' -import { isEventAllDay, offsetDate } from '../helpers/ics-helper' -import './calendarElement.css' -import { CalendarSelectDropdown } from '../calendarselectdropdown/calendarSelectDropdown' -import { icon, library } from '@fortawesome/fontawesome-svg-core' -import { faRefresh } from '@fortawesome/free-solid-svg-icons' -import { CalendarClient } from '../calendarClient' -import { getTranslations } from '../translations' -import { EventBody } from '../eventBody/eventBody' -import { TIME_MINUTE, TIME_DAY } from '../constants' -import type { AddressBookSource, - BodyHandlers, - CalendarOptions, - CalendarSource, - VCardProvider, - DefaultComponentsOptions, - DomEvent, - EventBodyInfo, - EventChangeHandlers, - EventEditHandlers, - SelectCalendarHandlers, - SelectedCalendar, - ServerSource, - View, -} from '../types/options' -import type { CalendarEvent, EventUid } from '../types/calendar' -import type { Contact } from '../types/addressbook' - -library.add(faRefresh) - -const THIRTY_MINUTE = 30 * 60 * 1000 - -// HACK - CJ - 2025-07-03 - When an event is the whole day, the date returned by caldav is in UTC (20250627) -// but since we display the local date, it's interpreted in our timezone (20250627T000200) -// and for all day events, EC round up to the nearest day (20250628) -// In the end the event is displayed for one extra day -// Those functions correct this by "un-applying" the timezone offset -function dateToECDate(date: Date, allDay: boolean) { - if (!allDay) return date - return new Date(date.getTime() + date.getTimezoneOffset() * TIME_MINUTE) -} -function ecDateToDate(date: Date, allDay: boolean) { - if (!allDay) return date - return new Date(date.getTime() - date.getTimezoneOffset() * TIME_MINUTE) -} - -export class CalendarElement { - private _client: CalendarClient - private _selectedCalendars: Set - - private _target: Element | null = null - private _calendar: EventCalendar | null = null - private _eventBody: EventBody | null = null - private _eventEdit: EventEditPopup | null = null - private _calendarSelect: CalendarSelectDropdown | null = null - - private _calendarSelectHandlers?: SelectCalendarHandlers - private _eventEditHandlers?: EventEditHandlers - private _eventChangeHandlers?: EventChangeHandlers - private _bodyHandlers?: BodyHandlers - private _userContact?: Contact - - public constructor() { - this._client = new CalendarClient() - this._selectedCalendars = new Set() - } - - public create = async ( - calendarSources: (ServerSource | CalendarSource)[], - addressBookSources: (ServerSource | AddressBookSource | VCardProvider)[], - target: Element, - options?: CalendarOptions, - ) => { - if (this._calendar) return - await Promise.all([ - this._client.loadCalendars(calendarSources), - this._client.loadAddressBooks(addressBookSources), - ]) - this._selectedCalendars = new Set(this._client.getCalendars().map(c => c.url)) - - this._eventEditHandlers = options && hasEventHandlers(options) - ? { - onCreateEvent: options.onCreateEvent, - onSelectEvent: options.onSelectEvent, - onMoveResizeEvent: options.onMoveResizeEvent, - onDeleteEvent: options.onDeleteEvent, - } - : this.createDefaultEventEdit(target, options ?? {}) - - this._calendarSelectHandlers = options && hasCalendarHandlers(options) - ? { - onClickSelectCalendars: options.onClickSelectCalendars, - } - : this.createDefaultCalendarSelectElement() - - this._eventChangeHandlers = { - onEventCreated: options?.onEventCreated, - onEventUpdated: options?.onEventUpdated, - onEventDeleted: options?.onEventDeleted, - } - - this.createCalendar(target, options) - - this._bodyHandlers = { - getEventBody: options?.getEventBody ?? this.createDefaultEventBody(options ?? {}), - } - - this._userContact = options?.userContact - } - - public destroy = () => { - this.destroyCalendar() - this.destroyDefaultEventEdit() - this.destroyDefaultCalendarSelectElement() - this.destroyDefaultEventBody() - } - - private createCalendar = (target: Element, options?: CalendarOptions) => { - if (this._calendar) return - - target.classList.add('open-calendar') - this._target = target - this._calendar = createEventCalendar( - target, - [DayGrid, TimeGrid, List, Interaction], - { - date: options?.date, - view: options?.view ?? 'timeGridWeek', - customButtons: { - refresh: { - text: { domNodes: Array.from(icon({ prefix: 'fas', iconName: 'refresh' }).node) }, - click: this.refreshEvents, - }, - calendars: { - text: getTranslations().calendarElement.calendars, - click: this.onClickCalendars, - }, - newEvent: { - text: getTranslations().calendarElement.newEvent, - click: this.onClickNewEvent, - }, - }, - slotEventOverlap: false, - headerToolbar: { - start: 'calendars,refresh newEvent prev,today,next', - center: 'title', - end: (options?.views ?? ['timeGridDay', 'timeGridWeek', 'dayGridMonth', 'listWeek']).join(','), - }, - buttonText: getTranslations().calendarElement, - allDayContent: getTranslations().calendarElement.allDay, - dayMaxEvents: true, - nowIndicator: true, - - firstDay: 1, - - // INFO - CJ - 2025-07-03 - // This member is not present in "@types/event-calendar__core" - eventResizableFromStart: options?.editable ?? true, - selectable: options?.editable ?? true, - editable: options?.editable ?? true, - - eventContent: this.getEventContent, - eventClick: this.onEventClicked, - select: this.onSelectTimeRange, - eventResize: this.onChangeEventDates, - eventDrop: this.onChangeEventDates, - eventSources: [{ events: this.fetchAndLoadEvents }], - eventFilter: this.isEventVisible, - dateClick: this.onSelectDate, - }, - ) - } - - private destroyCalendar = () => { - if (this._calendar) { - this._target!.classList.remove('open-calendar') - destroyEventCalendar(this._calendar) - } - this._calendar = null - this._target = null - } - - private createDefaultEventEdit = (target: Node, options: DefaultComponentsOptions): EventEditHandlers => { - this._eventEdit ??= new EventEditPopup(target, options) - return { - onCreateEvent: this._eventEdit.onCreate, - onSelectEvent: this._eventEdit.onSelect, - onMoveResizeEvent: this._eventEdit.onMoveResize, - onDeleteEvent: this._eventEdit.onDelete, - } - } - - private destroyDefaultEventEdit = () => { - this._eventEdit?.destroy() - this._eventEdit = null - } - - private createDefaultCalendarSelectElement = (): SelectCalendarHandlers => { - this._calendarSelect ??= new CalendarSelectDropdown() - return { - onClickSelectCalendars: this._calendarSelect.onSelect, - } - } - - private destroyDefaultCalendarSelectElement = () => { - this._calendarSelect?.destroy() - this._calendarSelect = null - } - - private createDefaultEventBody = (options: DefaultComponentsOptions): (info: EventBodyInfo) => Node[] => { - this._eventBody ??= new EventBody(options) - return this._eventBody.getBody - } - - private destroyDefaultEventBody = () => { - this._eventBody = null - } - - private fetchAndLoadEvents = async (info: EventCalendar.FetchInfo): Promise => { - const [calendarEvents] = await Promise.all([ - this._client.fetchAndLoadEvents(info.startStr, info.endStr), - this._client.fetchAndLoadVCards(), // INFO - PG - 2025-09-24 - no return value - ]) - - return calendarEvents.map(({ event, calendarUrl }) => { - const allDay = isEventAllDay(event) - return { - title: event.summary, - allDay: allDay, - start: dateToECDate(event.start.date, allDay), - end: dateToECDate(getEventEnd(event), allDay), - backgroundColor: this._client.getCalendarByUrl(calendarUrl)!.calendarColor, - extendedProps: { uid: event.uid, recurrenceId: event.recurrenceId } as EventUid, - } - }) - } - - private isEventVisible = (info: EventCalendar.EventFilterInfo) => { - const eventData = this._client.getCalendarEvent(info.event.extendedProps as EventUid) - if (!eventData) return false - return this._selectedCalendars.has(eventData.calendarUrl) - } - - private onClickCalendars = (jsEvent: MouseEvent) => { - this._calendarSelectHandlers!.onClickSelectCalendars({ - jsEvent, - selectedCalendars: this._selectedCalendars, - calendars: this._client.getCalendars(), - handleSelect: this.setCalendarVisibility, - }) - } - - private getEventContent = ({ event, view }: EventCalendar.EventContentInfo): EventCalendar.Content => { - const calendarEvent = this._client.getCalendarEvent(event.extendedProps as EventUid) - // NOTE - CJ - 2025-11-07 - calendarEvent can be undefined when creating events - if (calendarEvent === undefined) return {html: ''} - const calendar = this._client.getCalendarByUrl(calendarEvent.calendarUrl)! - const events = this._bodyHandlers!.getEventBody({ - event: calendarEvent.event, - vCards: this._client.getAddressBookVCards(), - calendar, - view: view.type as View, - userContact: this._userContact, - }) - events.forEach(n => { - if (!(n instanceof HTMLElement)) return - const ev = calendarEvent.event - const isShort = Boolean( - ev.start && ev.end && ev.start.date && ev.end.date && - (ev.end.date.getTime() - ev.start.date.getTime()) <= THIRTY_MINUTE) - if (isShort) n.classList.add('open-calendar__event-body--small') - const ro = new ResizeObserver(() => { - if (n.scrollHeight > n.clientHeight) n.classList.add('open-calendar__event-body--small') - else if (!isShort) n.classList.remove('open-calendar__event-body--small') - }) - ro.observe(n) - n.addEventListener('participation-icon-click', async (e: Event) => { - const custom = e as CustomEvent - const email: string | undefined = custom.detail?.email - if (!email || email !== this._userContact?.email) return - const ev = this._client.getCalendarEvent(event.extendedProps as EventUid) - if (!ev) return - const oldEvent = ev.event - const newEvent: IcsEvent = { - ...oldEvent, - attendees: oldEvent.attendees - ? oldEvent.attendees.map(a => { - if (a.email !== email) return a - const current = (a.partstat ?? 'NEEDS-ACTION') as IcsAttendeePartStatusType - const next: IcsAttendeePartStatusType = - current === 'NEEDS-ACTION' ? 'ACCEPTED' - : current === 'ACCEPTED' ? 'DECLINED' - : 'NEEDS-ACTION' - return { ...a, partstat: next } as IcsAttendee - }) - : oldEvent.attendees, - } as IcsEvent - await this.handleUpdateEvent({ calendarUrl: ev.calendarUrl, event: newEvent }) - }) - n.addEventListener('event-edit', (jsEvent: Event) => { - const ev = this._client.getCalendarEvent(event.extendedProps as EventUid) - if (!ev) return - this._eventEditHandlers!.onSelectEvent({ - jsEvent, - userContact: this._userContact, - calendars: this._client.getCalendars(), - vCards: this._client.getAddressBookVCards(), - ...ev, - handleUpdate: this.handleUpdateEvent, - handleDelete: this.handleDeleteEvent, - }) - }) - }) - return { domNodes: events } - } - - private onClickNewEvent = (jsEvent: MouseEvent) => this.createEvent(jsEvent) - - private onSelectDate = ({ allDay, date, jsEvent}: EventCalendar.DateClickInfo) => { - this.createEvent(jsEvent, { - start: { - date: ecDateToDate(date, allDay), - type: allDay ? 'DATE' : 'DATE-TIME', - }, - }) - } - - private onSelectTimeRange = ({ allDay, start, end, jsEvent}: EventCalendar.SelectInfo) => { - const type = allDay ? 'DATE' : 'DATE-TIME' - this.createEvent(jsEvent, { - start: { - date: ecDateToDate(start, allDay), - type, - }, - end: { - date: ecDateToDate(end, allDay), - type, - }, - }) - } - - private createEvent = (jsEvent: DomEvent, event?: Partial) => { - const start = event?.start ?? { - date: new Date(), - type: 'DATE-TIME', - } as IcsDateObject - - const newEvent = { - summary: '', - uid: '', - stamp: { date: new Date() }, - start, - end: offsetDate(start, start.type == 'DATE' ? (1 * TIME_DAY) : (30 * TIME_MINUTE)), - ...event, - - // NOTE - CJ - 2025-07-03 - Since we specify end, duration should be undefined - duration: undefined, - } - this._eventEditHandlers!.onCreateEvent({ - jsEvent, - userContact: this._userContact, - calendars: this._client.getCalendars(), - event: newEvent, - vCards: this._client.getAddressBookVCards(), - handleCreate: this.handleCreateEvent, - }) - } - - private onChangeEventDates = async (info: EventCalendar.EventDropInfo | EventCalendar.EventResizeInfo) => { - const uid = info.oldEvent.extendedProps as EventUid - const calendarEvent = this._client.getCalendarEvent(uid) - if (!calendarEvent) return - - info.revert() - this._eventEditHandlers!.onMoveResizeEvent({ - userContact: this._userContact, - jsEvent: info.jsEvent, - ...calendarEvent, - start: info.event.start, - end: info.event.end, - handleUpdate: this.handleUpdateEvent, - }) - } - - private onEventClicked = ({ event, jsEvent}: EventCalendar.EventClickInfo) => { - const mouse = jsEvent as MouseEvent - const targetEl = jsEvent.target as HTMLElement - // Ignore clicks on status icon (handled separately) - if (targetEl?.closest('.open-calendar__event-body__status-clickable')) return - const container = targetEl?.closest('.ec-event') as HTMLElement | null - const bodyEl = container?.querySelector('.open-calendar__event-body') as HTMLElement | null - const isSmall = !!container?.querySelector('.open-calendar__event-body--small') - // For small events: first click shows overlay, click inside overlay opens edit - if (isSmall) { - const rect = container!.getBoundingClientRect() - const overlay = document.createElement('div') - overlay.className = 'open-calendar__overlay' - overlay.style.left = `${rect.left}px` - overlay.style.top = `${rect.top}px` - overlay.style.minWidth = `${rect.width}px` - const cs = getComputedStyle(container!) - overlay.style.borderRadius = cs.borderRadius - overlay.style.backgroundColor = cs.backgroundColor - overlay.style.color = cs.color - overlay.style.padding = cs.padding - // Clone body for full content - const clone = bodyEl!.cloneNode(true) as HTMLElement - clone.classList.remove('open-calendar__event-body--small') - clone.classList.add('open-calendar__event-body--expanded') - overlay.appendChild(clone) - document.body.appendChild(overlay) - // Reposition if overflowing viewport - const orect = overlay.getBoundingClientRect() - const newLeft = Math.max(8, Math.min(rect.left, window.innerWidth - orect.width - 8)) - const newTop = Math.max(8, Math.min(rect.top, window.innerHeight - orect.height - 8)) - overlay.style.left = `${newLeft}px` - overlay.style.top = `${newTop}px` - const onDocPointer = (ev: Event) => { - const target = ev.target as Node - if (!overlay.contains(target)) { - removeOverlay() - } - } - const removeOverlay = () => { - document.removeEventListener('click', onDocPointer) - document.removeEventListener('touchstart', onDocPointer) - overlay.remove() - } - document.addEventListener('click', onDocPointer, true) - document.addEventListener('touchstart', onDocPointer, true) - overlay.addEventListener('mouseleave', removeOverlay) - // Clicking inside overlay opens edit - overlay.addEventListener('click', () => { - removeOverlay() - const uid = event.extendedProps as EventUid - const calendarEvent = this._client.getCalendarEvent(uid) - if (!calendarEvent) return - this._eventEditHandlers!.onSelectEvent({ - jsEvent, - userContact: this._userContact, - calendars: this._client.getCalendars(), - vCards: this._client.getAddressBookVCards(), - ...calendarEvent, - handleUpdate: this.handleUpdateEvent, - handleDelete: this.handleDeleteEvent, - }) - }) - return - } - // For non-small: open edit on single click - if (mouse && mouse.detail >= 1) { - const uid = event.extendedProps as EventUid - const calendarEvent = this._client.getCalendarEvent(uid) - if (!calendarEvent) return - this._eventEditHandlers!.onSelectEvent({ - jsEvent, - userContact: this._userContact, - calendars: this._client.getCalendars(), - vCards: this._client.getAddressBookVCards(), - ...calendarEvent, - handleUpdate: this.handleUpdateEvent, - handleDelete: this.handleDeleteEvent, - }) - return - } - const uid = event.extendedProps as EventUid - const calendarEvent = this._client.getCalendarEvent(uid) - if (!calendarEvent) return - this._eventEditHandlers!.onSelectEvent({ - jsEvent, - userContact: this._userContact, - calendars: this._client.getCalendars(), - vCards: this._client.getAddressBookVCards(), - ...calendarEvent, - handleUpdate: this.handleUpdateEvent, - handleDelete: this.handleDeleteEvent, - }) - } - - private refreshEvents = () => { - this._calendar!.refetchEvents() - } - - private setCalendarVisibility = ({url: calendarUrl, selected}: SelectedCalendar) => { - const calendar = this._client.getCalendarByUrl(calendarUrl) - if (!calendar) return - if (selected) this._selectedCalendars.add(calendarUrl) - else this._selectedCalendars.delete(calendarUrl) - this.refreshEvents() - } - - private handleCreateEvent = async (calendarEvent: CalendarEvent) => { - const { response, ical } = await this._client.createEvent(calendarEvent) - if (response.ok) { - this._eventChangeHandlers!.onEventCreated?.({...calendarEvent, ical}) - this.refreshEvents() - } - return response - } - - private handleUpdateEvent = async (calendarEvent: CalendarEvent) => { - const { response, ical } = await this._client.updateEvent(calendarEvent) - if (response.ok) { - this._eventChangeHandlers!.onEventUpdated?.({...calendarEvent, ical}) - this.refreshEvents() - } - return response - } - - private handleDeleteEvent = async (calendarEvent: CalendarEvent) => { - const { response, ical } = await this._client.deleteEvent(calendarEvent) - if (response.ok) { - this._eventChangeHandlers!.onEventDeleted?.({...calendarEvent, ical}) - this.refreshEvents() - } - return response - } -} diff --git a/src/frontend/packages/open-calendar/src/calendarselectdropdown/calendarSelectDropdown.css b/src/frontend/packages/open-calendar/src/calendarselectdropdown/calendarSelectDropdown.css deleted file mode 100644 index 865d657..0000000 --- a/src/frontend/packages/open-calendar/src/calendarselectdropdown/calendarSelectDropdown.css +++ /dev/null @@ -1,39 +0,0 @@ -.open-calendar__calendar-select__container { - position: absolute; - top: 100%; - width: max-content; - z-index: 1500; - - background-color: white; - /* CJ - 2025-07-03 - '--ec-button-border-color' is defined by EventCalendar */ - /* FIXME - CJ - 2025-07-03 - I tried set the rule option 'allowUnknownVariables' to in 'eslint.config.mjs' but this made the config fail*/ - /* eslint-disable-next-line css/no-invalid-properties */ - border: 1px solid var(--ec-button-border-color); - padding: 0.375rem 0.75rem; - font-size: 1rem; - border-radius: 0.25rem; -} - -.open-calendar__calendar-select__label { - display: flex; - align-items: baseline; - gap: 5px -} - -.open-calendar__calendar-select__color { - border-radius: 50%; - height: 0.75rem; - width: 0.75rem; -} - -/* HACK - CJ - 2025-07-03 - Added in order to make the `top: 100%` use the heigh of the parent and not of the window */ -.open-calendar__calendar-select__parent { - position: relative; -} - -/* HACK - CJ - 2025-07-03 - Prevents the addition of the popup to affect the style of the button (as it is not the first child anymore */ -.ec-button-group .ec-calendars:not(:first-child) { - margin-left: 0; - border-top-left-radius: 0.25rem; - border-bottom-left-radius: 0.25rem; -} \ No newline at end of file diff --git a/src/frontend/packages/open-calendar/src/calendarselectdropdown/calendarSelectDropdown.ts b/src/frontend/packages/open-calendar/src/calendarselectdropdown/calendarSelectDropdown.ts deleted file mode 100644 index 4a8bab9..0000000 --- a/src/frontend/packages/open-calendar/src/calendarselectdropdown/calendarSelectDropdown.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { parseHtml } from '../helpers/dom-helper' -import './calendarSelectDropdown.css' -import type { SelectCalendarsClickInfo } from '../types/options' - -const html = /* html */` -
-
- {{#calendars}} - - - {{/calendars}} -
-
` - -export class CalendarSelectDropdown { - private _container: HTMLDivElement | null = null - - public constructor() {} - public destroy = () => {} - - public onSelect = ({jsEvent, calendars, handleSelect, selectedCalendars }: SelectCalendarsClickInfo) => { - const target = jsEvent.target as Element - const parent = target.parentElement as Element - - if (this._container) { - parent.removeChild(this._container) - parent.classList.remove('open-calendar__calendar-select__parent') - this._container = null - return - } - this._container = parseHtml(html, { - calendars: calendars.map((calendar, index) => ({ ...calendar, index })), - })[0] - parent.insertBefore(this._container, target) - parent.classList.add('open-calendar__calendar-select__parent') - - const inputs = this._container.querySelectorAll('input') - for (let i = 0; i < inputs.length; i++) { - const input = inputs[i] - const calendar = calendars[i] - input.checked = selectedCalendars.has(calendar.url) - input.addEventListener('change', e => handleSelect({ - url: calendar.url, - selected: (e.target as HTMLInputElement).checked, - })) - } - } -} diff --git a/src/frontend/packages/open-calendar/src/constants.ts b/src/frontend/packages/open-calendar/src/constants.ts deleted file mode 100644 index f5b18be..0000000 --- a/src/frontend/packages/open-calendar/src/constants.ts +++ /dev/null @@ -1,7 +0,0 @@ -export const TIME_MILLISECOND = 1 -export const TIME_SECOND = 1000 * TIME_MILLISECOND -export const TIME_MINUTE = 60 * TIME_SECOND -export const TIME_HOUR = 60 * TIME_MINUTE -export const TIME_DAY = 24 * TIME_HOUR - -export const attendeeUserParticipationStatusTypes = ['NEEDS-ACTION', 'ACCEPTED', 'DECLINED', 'TENTATIVE'] as const diff --git a/src/frontend/packages/open-calendar/src/contants.ts b/src/frontend/packages/open-calendar/src/contants.ts deleted file mode 100644 index d5c27d5..0000000 --- a/src/frontend/packages/open-calendar/src/contants.ts +++ /dev/null @@ -1,25 +0,0 @@ -export const attendeeRoleTypes = [ - 'CHAIR', - 'REQ-PARTICIPANT', - 'OPT-PARTICIPANT', - 'NON-PARTICIPANT', -] as const - -export const namedRRules = [ - 'FREQ=DAILY', - 'FREQ=WEEKLY', - 'BYDAY=MO,TU,WE,TH,FR;FREQ=DAILY', - 'INTERVAL=2;FREQ=WEEKLY', - 'FREQ=MONTHLY', - 'FREQ=YEARLY', -] as const - -export const availableViews = [ - 'timeGridDay', - 'timeGridWeek', - 'dayGridMonth', - 'listDay', - 'listWeek', - 'listMonth', - 'listYear', -] as const diff --git a/src/frontend/packages/open-calendar/src/eventBody/eventBody.css b/src/frontend/packages/open-calendar/src/eventBody/eventBody.css deleted file mode 100644 index ae96394..0000000 --- a/src/frontend/packages/open-calendar/src/eventBody/eventBody.css +++ /dev/null @@ -1,143 +0,0 @@ -.ec-event { - /* NOTE - CJ - 2025-07-03 - Overrides the min heigh of the event to be one line. !important is needed as this is set manually on the element */ - /* eslint-disable-next-line css/no-important */ - min-height: 1.5rem !important; -} - -.open-calendar__event-body { - height: 100%; - width: 100%; - overflow: hidden; - --open-calendar__event-body__gap: 2px; - display: flex; - flex-direction: column; -} - -.open-calendar__event-body__time { - float: left; - display: flex; - margin-right: var(--open-calendar__event-body__gap); -} - -.open-calendar__event-body__icons { - float: right; - display: flex; - gap: var(--open-calendar__event-body__gap); - margin-left: var(--open-calendar__event-body__gap); - align-items: center; - height: 1.5em; -} - -.open-calendar__event-body__organizer { - font-weight: bold; - color: red; -} - -.open-calendar__event-body__attendee--chair { - font-weight: bold; -} - -.open-calendar__event-body__attendee--req-participant { - font-weight: bold; -} - -.open-calendar__event-body__attendee--non-participant { - font-style: italic; -} - -.open-calendar__event-body__attendee--accepted { - color: green; -} - -.open-calendar__event-body__attendee--declined { - color: gray; -} - -.ec-day-grid .open-calendar__event-body__header { - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; -} - -.ec-day-grid :is(.open-calendar__event-body__location) { - display: none; -} - -.open-calendar__event-body__attendees { - font-size: 0.8em; - margin: 0.75em 0; - display: flex; - flex-direction: column; - gap: 2px; -} - -.open-calendar__event-body__attendee-line { - display: flex; - align-items: center; - gap: 0.5em; -} - -.open-calendar__event-body__attendee-status-icon { - display: inline-flex; - align-items: center; -} - -.open-calendar__event-body__attendee-role-icon { - display: inline-flex; - align-items: center; -} - -.open-calendar__event-body__attendee-name.organizer, -.open-calendar__event-body__attendee-name.required { - font-weight: bold; -} - -.open-calendar__event-body__attendee-name.optional { - font-weight: normal; -} - -.open-calendar__event-body__attendee-name.non-participant { - font-style: italic; -} - -.open-calendar__event-body__attendee-line.declined { - color: gray; - text-decoration: line-through; -} - -.open-calendar__event-body__attendee-status-icon__pending { - color: orange; -} -.open-calendar__event-body__attendee-status-icon__tentative { - color: orange; -} -.open-calendar__event-body__attendee-status-icon__confirmed { - color: blue; -} -.open-calendar__event-body__attendee-status-icon__declined { - color: gray; -} - -.open-calendar__event-body__status-clickable { - cursor: pointer; - transition: filter 0.2s; -} -.open-calendar__event-body__status-clickable:hover { - filter: brightness(1.2); -} - -.open-calendar__event-body--expanded { - max-height: none; - max-width: none; - overflow: visible; - cursor: pointer; -} - -.open-calendar__event-body--small { - cursor: zoom-in; -} - -.open-calendar__event-body__description { - margin-top: 0.5em; - font-size: 0.9em; -} diff --git a/src/frontend/packages/open-calendar/src/eventBody/eventBody.ts b/src/frontend/packages/open-calendar/src/eventBody/eventBody.ts deleted file mode 100644 index 2a58324..0000000 --- a/src/frontend/packages/open-calendar/src/eventBody/eventBody.ts +++ /dev/null @@ -1,203 +0,0 @@ -import { escapeHtml, parseHtml } from '../helpers/dom-helper' -import Autolinker from 'autolinker' -import { icon, library } from '@fortawesome/fontawesome-svg-core' -import { faRepeat, faBell, faChalkboardUser, faUserGraduate, faUser, faUserSlash, faCircleQuestion, faSquareCheck, faXmark, faLocationDot } from '@fortawesome/free-solid-svg-icons' -import { far } from '@fortawesome/free-regular-svg-icons' -import './eventBody.css' -import { contactToMailbox, isEventAllDay, isSameContact } from '../helpers/ics-helper' -import type { IcsAttendee, IcsAttendeePartStatusType, IcsOrganizer } from 'ts-ics' -import type { DefaultComponentsOptions, EventBodyInfo, IcsAttendeeRoleType } from '../types/options' -import type { AddressBookVCard } from '../types/addressbook' -import { getTranslations } from '../translations' - -library.add( - faRepeat, - faBell, - faChalkboardUser, - faUserGraduate, - faUser, - faUserSlash, - faCircleQuestion, - faSquareCheck, - faXmark, - far, - faLocationDot, -) - -const addFaFw = (html: string) => html.replace('class="', 'class="fa-fw ') - -const html = /*html*/` -
-
-
- {{time}} -
-
- {{#icons}}{{&.}}{{/icons}} -
- {{summary}} -
- {{#location}} - -
{{&location}}
- {{/location}} -
- {{#organizer}} -
- - {{&organizerStatusIcon}} - - {{&organizerRoleIcon}} - {{name}} -
- {{/organizer}} - {{#attendees}} -
- - {{&statusIcon}} - - {{&roleIcon}} - {{name}} -
- {{/attendees}} -
- {{#description}} -
{{&description}}
- {{/description}} -
` - -export class EventBody { - - private _hideVCardEmails?: boolean - - public constructor(options: DefaultComponentsOptions) { - this._hideVCardEmails = options.hideVCardEmails - } - - public getBody = ({ event, vCards, userContact }: EventBodyInfo) => { - const time = event.start.date.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' }) - const attendees = event.attendees ? event.attendees.map(a => this.mapAttendee(a, vCards, userContact?.email)) : [] - const organizer = event.organizer ? { - mailbox: this.getAttendeeValue(vCards, event.organizer), - name: event.organizer.name ?? event.organizer.email, - organizerStatusIcon: addFaFw(icon({ prefix: 'fas', iconName: 'square-check' }).html.join('')), - organizerRoleIcon: addFaFw(icon({ prefix: 'fas', iconName: 'user-graduate' }).html.join('')), - } : undefined - - const events = Array.from(parseHtml(html, { - time: isEventAllDay(event) ? undefined : time, - summary: event.summary, - icons: [ - event.recurrenceId ? addFaFw(icon({ prefix: 'fas', iconName: 'repeat' }).html.join('')) : undefined, - event.alarms ? addFaFw(icon({ prefix: 'fas', iconName: 'bell' }).html.join('')) : undefined, - ], - location: event.location - ? [ - addFaFw(icon({ prefix: 'fas', iconName: 'location-dot' }).html.join('')), - Autolinker.link(escapeHtml(event.location)), - ].join(' ') - : undefined, - description: event.description || undefined, - attendees: attendees.map(att => ({ - ...att, - statusIcon: att.isCurrentUser - ? ` - ${att.statusIcon} - ` - : att.statusIcon, - })), - organizer, - t: getTranslations().eventBody, - })) - // Add click handler for current user status icon - events.forEach(event => { - if (!(event instanceof HTMLElement)) return - event.querySelectorAll('.open-calendar__event-body__status-clickable').forEach(el => { - el.addEventListener('click', (e) => { - e.stopPropagation() - const email = (el as HTMLElement).getAttribute('data-email') - event.dispatchEvent(new CustomEvent('participation-icon-click', { - bubbles: true, - detail: { email }, - })) - }) - }) - }) - return events - } - - public getAttendeeValue(vCards: AddressBookVCard[], attendee: IcsAttendee | IcsOrganizer) { - const vCard = vCards.find(c => isSameContact(c.vCard, attendee))?.vCard - return (this._hideVCardEmails && vCard?.name) || contactToMailbox(attendee) - } - - public mapAttendee = (a: IcsAttendee, vCards: AddressBookVCard[], userEmail?: string) => { - const role = ((a.role as IcsAttendeeRoleType) ?? 'NON-PARTICIPANT').toUpperCase() - const partstat = ((a.partstat as IcsAttendeePartStatusType) ?? 'NEEDS-ACTION').toUpperCase() - const t = getTranslations().eventBody - let roleIcon = '' - let roleTitle = '' - let roleClass = '' - if (role === 'CHAIR') { - roleIcon = addFaFw(icon({ prefix: 'fas', iconName: 'user-graduate' }).html.join('')) - roleTitle = t.organizer - roleClass = 'organizer' - } else if (role === 'REQ-PARTICIPANT') { - roleIcon = addFaFw(icon({ prefix: 'fas', iconName: 'user' }).html.join('')) - roleTitle = t.participation_require - roleClass = 'required' - } else if (role === 'OPT-PARTICIPANT') { - roleIcon = addFaFw(icon({ prefix: 'far', iconName: 'user' }).html.join('')) - roleTitle = t.participation_optional - roleClass = 'optional' - } else if (role === 'NON-PARTICIPANT') { - roleIcon = addFaFw(icon({ prefix: 'fas', iconName: 'user-slash' }).html.join('')) - roleTitle = t.non_participant - roleClass = 'non-participant' - } - // Status icon, color, and title - let statusIcon = '' - let statusTitle = '' - let statusClass = '' - let declinedClass = '' - const isCurrentUser = Boolean(userEmail && a.email && a.email === userEmail) - if (partstat === 'NEEDS-ACTION') { - statusIcon = addFaFw(icon({ prefix: 'fas', iconName: 'circle-question' }).html.join('')) - statusClass = 'pending' - statusTitle = t.participation_pending - } else if (partstat === 'ACCEPTED') { - statusIcon = addFaFw(icon({ prefix: 'fas', iconName: 'square-check' }).html.join('')) - statusClass = 'confirmed' - statusTitle = t.participation_confirmed - } else if (partstat === 'TENTATIVE') { - statusIcon = addFaFw(icon({ prefix: 'fas', iconName: 'square-check' }).html.join('')) - statusClass = 'tentative' - statusTitle = t.participation_confirmed_tentative - } else if (partstat === 'DECLINED') { - statusIcon = addFaFw(icon({ prefix: 'fas', iconName: 'xmark' }).html.join('')) - statusClass = 'declined' - statusTitle = t.participation_declined - declinedClass = 'declined' - } - return { - mailbox: this.getAttendeeValue(vCards, a), - name: a.name ?? a.email, - role, - partstat, - roleIcon, - roleTitle, - roleClass, - statusIcon, - statusClass, - statusTitle, - declinedClass, - isCurrentUser, - email: a.email, - } - } - -} diff --git a/src/frontend/packages/open-calendar/src/eventeditpopup/eventEditPopup.css b/src/frontend/packages/open-calendar/src/eventeditpopup/eventEditPopup.css deleted file mode 100644 index 3359246..0000000 --- a/src/frontend/packages/open-calendar/src/eventeditpopup/eventEditPopup.css +++ /dev/null @@ -1,30 +0,0 @@ -.open-calendar__event-edit__attendee { - display: flex; - gap: 0.25rem; -} - -.open-calendar__event-edit__attendee>:first-child { - flex-grow: 1; -} - -.open-calendar__event-edit__datetime { - display: flex; - gap: 0.25rem; -} - -.open-calendar__event-edit--is-allday :is([name="start-time"], - [name="start-timezone"], - [name="end-time"], - [name="end-timezone"]) { - visibility: hidden; -} - - -/* NOTE - CJ - 2025-07-03 - Hide the `Delete` button we are creating an event */ -.open-calendar__event-edit--create [name="delete"] { - visibility: hidden; -} - -.open-calendar__event-edit--without-invite .open-calendar__event-edit__invite { - display: none; -} \ No newline at end of file diff --git a/src/frontend/packages/open-calendar/src/eventeditpopup/eventEditPopup.ts b/src/frontend/packages/open-calendar/src/eventeditpopup/eventEditPopup.ts deleted file mode 100644 index 1b7fb43..0000000 --- a/src/frontend/packages/open-calendar/src/eventeditpopup/eventEditPopup.ts +++ /dev/null @@ -1,464 +0,0 @@ -import { - attendeePartStatusTypes, - convertIcsRecurrenceRule, - getEventEndFromDuration, - type IcsAttendee, - type IcsAttendeePartStatusType, - type IcsDateObject, - type IcsEvent, - type IcsOrganizer, -} from 'ts-ics' -import './eventEditPopup.css' -import { Popup } from '../popup/popup' -import { parseHtml } from '../helpers/dom-helper' -import { contactToMailbox, - getRRuleString, - isEventAllDay, - isSameContact, - mailboxToContact, - offsetDate, -} from '../helpers/ics-helper' -import { tzlib_get_ical_block, tzlib_get_offset, tzlib_get_timezones } from 'timezones-ical-library' -import { getTranslations } from '../translations' -import { RecurringEventPopup } from './recurringEventPopup' -import { attendeeUserParticipationStatusTypes, TIME_MINUTE } from '../constants' -import type { AddressBookVCard, Contact, VCard } from '../types/addressbook' -import type { DefaultComponentsOptions, - DomEvent, - EventEditCallback, - EventEditCreateInfo, - EventEditDeleteInfo, - EventEditMoveResizeInfo, - EventEditSelectInfo, -} from '../types/options' -import type {Calendar, CalendarEvent} from '../types/calendar' -import { attendeeRoleTypes, namedRRules } from '../contants' - -const html = /*html*/` -
- - -
- - - - - - - - - -
- - - -
- -
- - - -
- -
- -
- -
-
- -
- - - - -
-
- - -
-
- - - -
-
` - -const calendarsHtml = /*html*/` - -{{#calendars}} - -{{/calendars}}` - -const mailboxesHtml = /*html*/` -{{#mailboxes}} - -{{/mailboxes}}` - -const attendeeHtml = /*html*/` -
- - - - -
` - -export class EventEditPopup { - - private _recurringPopup: RecurringEventPopup - private _popup: Popup - private _form: HTMLFormElement - private _calendar: HTMLSelectElement - private _mailboxes: HTMLDataListElement - private _attendees: HTMLDivElement - private _rruleUnchanged: HTMLOptionElement - - private _hideVCardEmails?: boolean - private _vCardContacts: VCard[] = [] - private _eventContacts: Contact[] = [] - - private _event?: IcsEvent - private _userContact?: Contact - private _calendarUrl?: string - private _handleSave: EventEditCallback | null = null - private _handleDelete: EventEditCallback | null = null - - public constructor(target: Node, options: DefaultComponentsOptions) { - this._hideVCardEmails = options.hideVCardEmails - const timezones = tzlib_get_timezones() as string[] - - this._recurringPopup = new RecurringEventPopup(target) - - this._popup = new Popup(target) - this._form = parseHtml(html, { - t: getTranslations().eventForm, - trrules: getTranslations().rrules, - timezones: timezones, - rrules: namedRRules.map(rule => ({ rule, label: getTranslations().rrules[rule] })), - userParticipationStatuses: attendeeUserParticipationStatusTypes.map(stat => ({ - key: stat, - translation: getTranslations().userParticipationStatus[stat], - })), - })[0] - this._popup.content.appendChild(this._form) - - this._calendar = this._form.querySelector('.open-calendar__form__content [name="calendar"]')! - this._mailboxes = this._form.querySelector('#open-calendar__event-edit__mailboxes')! - this._attendees = this._form.querySelector( - '.open-calendar__event-edit__attendees > .open-calendar__form__list', - )! - const allday = this._form.querySelector('.open-calendar__event-edit [name="allday"]')! - const addAttendee = this._form.querySelector('.open-calendar__event-edit__attendees > button')! - this._rruleUnchanged = this._form.querySelector('.open-calendar__event-edit__rrule__unchanged')! - const cancel = this._form.querySelector('.open-calendar__form__buttons [name="cancel"]')! - const remove = this._form.querySelector('.open-calendar__form__buttons [name="delete"]')! - - this._form.addEventListener('submit', async (e) => { e.preventDefault(); await this.save() }) - allday.addEventListener('click', this.updateAllday) - addAttendee.addEventListener('click', () => this.addAttendee({ email: '' })) - cancel.addEventListener('click', this.cancel) - remove.addEventListener('click', this.delete) - } - - public destroy = () => { - this._form.remove() - } - - private setCalendars = (calendars: Calendar[]) => { - const calendarElements = parseHtml(calendarsHtml, { - calendars, - t: getTranslations().eventForm, - }) - this._calendar.innerHTML = '' - this._calendar.append(...Array.from(calendarElements)) - } - - private setContacts = (vCardContacts: VCard[], eventContacts: Contact[]) => { - this._vCardContacts = [] - for (const contact of vCardContacts) { - if (this._vCardContacts.find(c => isSameContact(c, contact))) continue - this._vCardContacts.push(contact) - } - for (const contact of eventContacts) { - if (this._vCardContacts.find(c => isSameContact(c, contact))) continue - if (this._eventContacts.find(c => isSameContact(c, contact))) continue - this._eventContacts.push(contact) - } - const mailboxesElement = parseHtml(mailboxesHtml, { - mailboxes: [ - ...this._vCardContacts.map(c => this.getValueFromVCard(c)), - ...this._eventContacts.map(c => this.getValueFromContact(c)), - ], - }) - this._mailboxes.innerHTML = '' - this._mailboxes.append(...Array.from(mailboxesElement)) - } - - private updateAllday = (e: DomEvent) => { - this._form.classList.toggle('open-calendar__event-edit--is-allday', (e.target as HTMLInputElement).checked) - } - - private addAttendee = (attendee: IcsAttendee) => { - const element = parseHtml(attendeeHtml, { - mailbox: this.getValueFromAttendee(attendee), - role: attendee.role || 'REQ-PARTICIPANT', - roles: attendeeRoleTypes.map(role => ({ key: role, translation: getTranslations().attendeeRoles[role] })), - participationStatus: attendee.partstat || 'NEEDS-ACTION', - participationStatuses: attendeePartStatusTypes.map(status => ({ - key: status, - translation: getTranslations().participationStatus[status], - })), - t: getTranslations().eventForm, - })[0] - this._attendees.appendChild(element) - - const remove = element.querySelector('button')! - const role = element.querySelector('select[name="attendee-role"]')! - const participationStatus = element.querySelector('select[name="participation-status"]')! - - remove.addEventListener('click', () => element.remove()) - role.value = attendee.role || 'REQ-PARTICIPANT' - participationStatus.value = attendee.partstat || 'NEEDS-ACTION' - } - - public onCreate = ({calendars, vCards, event, handleCreate, userContact}: EventEditCreateInfo) => { - this._form.classList.toggle('open-calendar__event-edit--create', true) - this._handleSave = handleCreate - this._handleDelete = null - this.open('', event, calendars, vCards, userContact) - } - public onSelect = ({ - calendarUrl, - calendars, - vCards, - event, - recurringEvent, - handleDelete, - handleUpdate, - userContact, - }: EventEditSelectInfo) => { - this._form.classList.toggle('open-calendar__event-edit--create', false) - this._handleSave = handleUpdate - this._handleDelete = handleDelete - if (!recurringEvent) this.open(calendarUrl, event, calendars, vCards, userContact) - else this._recurringPopup.open(editAll => { - return this.open( - calendarUrl, editAll ? recurringEvent : event, calendars, vCards, userContact) - }) - } - - public onMoveResize = ({ calendarUrl, event, start, end, handleUpdate }: EventEditMoveResizeInfo) => { - const newEvent = { ...event } - const startDelta = start.getTime() - event.start.date.getTime() - newEvent.start = offsetDate(newEvent.start, startDelta) - if (event.end) { - const endDelta = end.getTime() - event.end.date.getTime() - newEvent.end = offsetDate(event.end, endDelta) - } - handleUpdate( - { calendarUrl, event: newEvent } as CalendarEvent, - ) - } - - public onDelete = ({ calendarUrl, event, handleDelete}: EventEditDeleteInfo) => { - handleDelete({calendarUrl, event}) - } - - public open = ( - calendarUrl: string, - event: IcsEvent, - calendars: Calendar[], - vCards: AddressBookVCard[], - userContact?: Contact, - ) => { - this._userContact = userContact - this.setContacts( - vCards.filter(c => c.vCard.email !== null).map(c => c.vCard), - [...event.attendees ?? [], event.organizer].filter(a => a !== undefined), - ) - this.setCalendars(calendars) - - this._calendarUrl = calendarUrl - this._event = event - const localTzId = Intl.DateTimeFormat().resolvedOptions().timeZone - const localTzOffset = new Date().getTimezoneOffset() * TIME_MINUTE - const localStart = event.start.local ?? { - date: new Date(event.start.date.getTime() - localTzOffset), - timezone: localTzId, - } - const end = event.end ?? - offsetDate( - localStart, - getEventEndFromDuration(event.start.date, event.duration).getTime() - event.start.date.getTime(), - ) - const localEnd = end.local ?? { - date: new Date(end.date.getTime() - localTzOffset), - timezone: localTzId, - } - - const inputs = this._form.elements; - (inputs.namedItem('calendar') as HTMLInputElement).value = calendarUrl; - (inputs.namedItem('calendar') as HTMLInputElement).disabled = event.recurrenceId !== undefined; - // FIXME - CJ - 2025/06/03 - changing an object of calendar is not supported; - (inputs.namedItem('calendar') as HTMLInputElement).disabled ||= - !this._form.classList.contains('open-calendar__event-edit--create'); - (inputs.namedItem('summary') as HTMLInputElement).value = event.summary ?? ''; - (inputs.namedItem('location') as HTMLInputElement).value = event.location ?? ''; - (inputs.namedItem('allday') as HTMLInputElement).checked = isEventAllDay(event) - this._form.classList.toggle('open-calendar__event-edit--is-allday', isEventAllDay(event)) - const startDateTime = localStart.date.toISOString().split('T'); - (inputs.namedItem('start-date') as HTMLInputElement).value = startDateTime[0]; - (inputs.namedItem('start-time') as HTMLInputElement).value = startDateTime[1].slice(0, 5); - (inputs.namedItem('start-timezone') as HTMLInputElement).value = localStart.timezone - const endDateTime = localEnd.date.toISOString().split('T'); - (inputs.namedItem('end-date') as HTMLInputElement).value = endDateTime[0]; - (inputs.namedItem('end-time') as HTMLInputElement).value = endDateTime[1].slice(0, 5); - (inputs.namedItem('end-timezone') as HTMLInputElement).value = localEnd.timezone; - // TODO - CJ - 2025-07-03 - Add rich text support - (inputs.namedItem('description') as HTMLInputElement).value = event.description ?? ''; - - // TODO - CJ - 2025-07-03 - Check if needs to be hidden or done differently, - // as I believe Thunderbird also adds the organizer to the attendee list; - (inputs.namedItem('organizer-mailbox') as HTMLInputElement).value = event.organizer - ? this.getValueFromAttendee(event.organizer) - : '' - - const rrule = getRRuleString(event.recurrenceRule) - this._rruleUnchanged.value = rrule; - (inputs.namedItem('rrule') as HTMLInputElement).value = rrule; - (inputs.namedItem('rrule') as HTMLInputElement).disabled = event.recurrenceId !== undefined - - const userAttendeeInEvent = userContact !== undefined - ? event.attendees?.find(a => a.email === userContact.email) - : undefined - - if (userAttendeeInEvent !== undefined) { - this._form.classList.remove('open-calendar__event-edit--without-invite'); - (inputs.namedItem('user-participation-status') as HTMLSelectElement).value = - userAttendeeInEvent.partstat - ?? attendeeUserParticipationStatusTypes[0] - } else { - this._form.classList.add('open-calendar__event-edit--without-invite') - } - - - this._attendees.innerHTML = '' - for (const attendee of event.attendees ?? []) this.addAttendee(attendee) - - this._popup.setVisible(true) - } - - public save = async () => { - const data = new FormData(this._form) - const allDay = !!data.get('allday') - - const getTimeObject = (name: string): IcsDateObject => { - const date = data.get(`${name}-date`) as string - const time = data.get(`${name}-time`) as string - const timezone = data.get(`${name}-timezone`) as string - const offset = tzlib_get_offset(timezone, date, time) - return { - date: new Date(date + (allDay ? '' : `T${time}${offset}`)), - type: allDay ? 'DATE' : 'DATE-TIME', - local: timezone === 'UTC' ? undefined : { - date: new Date(date + (allDay ? '' : `T${time}Z`)), - timezone: tzlib_get_ical_block(timezone)[1].slice(5), - tzoffset: offset, - }, - } - } - - const mailboxes = data.getAll('attendee-mailbox') as string[] - const roles = data.getAll('attendee-role') as string[] - const participationStatuses = data.getAll('participation-status') as string[] - const rrule = data.get('rrule') as string - const description = data.get('description') as string - - const event: IcsEvent = { - ...this._event!, - summary: data.get('summary') as string, - location: data.get('location') as string || undefined, - start: getTimeObject('start'), - end: getTimeObject('end'), - description: description || undefined, - descriptionAltRep: description === this._event!.description ? this._event!.descriptionAltRep : undefined, - organizer: data.get('organizer-mailbox') - ? { - ...this._event!.organizer, - ...this.getContactFromValue(data.get('organizer-mailbox') as string), - } - : undefined, - attendees: mailboxes.map((mailbox, i) => { - const contact = this.getContactFromValue(mailbox) - return ({ - ...contact, - role: roles[i], - partstat: (contact.email === this._userContact?.email - ? data.get('user-participation-status') - : participationStatuses[i] - ) as IcsAttendeePartStatusType, - }) - }) || undefined, - recurrenceRule: rrule ? convertIcsRecurrenceRule(undefined, {value: rrule}) : undefined, - - // NOTE - CJ - 2025-07-03 - explicitly set `duration` to undefined as we set `end` - duration: undefined, - } - const response = await this._handleSave!({ calendarUrl: data.get('calendar') as string, event }) - if (response.ok) this._popup.setVisible(false) - } - - public cancel = () => { - this._popup.setVisible(false) - } - - public delete = async () => { - await this._handleDelete!({ calendarUrl: this._calendarUrl!, event: this._event!}) - this._popup.setVisible(false) - } - - public getContactFromValue = (value: string) => { - const contact = this._vCardContacts.find(c => this.getValueFromVCard(c) === value) - return contact - // NOTE - CJ - 2025-07-17 - we need to reconstruct an object as the spread syntax does not work for properties - ? { name: contact.name!, email: contact.email!} - : this._eventContacts.find(c => this.getValueFromContact(c) === value) - ?? mailboxToContact(value) - } - - public getValueFromAttendee = (attendee: IcsAttendee | IcsOrganizer): string => { - const vCard = this._vCardContacts.find(c => isSameContact(c, attendee)) - return vCard ? this.getValueFromVCard(vCard) : this.getValueFromContact(attendee) - } - - public getValueFromVCard = (contact: VCard) => (this._hideVCardEmails && contact.name) || contactToMailbox(contact) - public getValueFromContact = (contact: Contact) => contactToMailbox(contact) -} diff --git a/src/frontend/packages/open-calendar/src/eventeditpopup/recurringEventPopup.ts b/src/frontend/packages/open-calendar/src/eventeditpopup/recurringEventPopup.ts deleted file mode 100644 index a780d37..0000000 --- a/src/frontend/packages/open-calendar/src/eventeditpopup/recurringEventPopup.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { Popup } from '../popup/popup' -import { parseHtml } from '../helpers/dom-helper' -import { getTranslations } from '../translations' - -const html = /*html*/` -
- {{t.editRecurring}} -
- - -
-
-` - -export class RecurringEventPopup { - - public _handleSelect?: (editAll: boolean) => void - - private _element: HTMLDivElement - private _popup: Popup - - public constructor(target: Node) { - this._popup = new Popup(target) - this._element = parseHtml(html, { t: getTranslations().recurringForm })[0] - this._popup.content.appendChild(this._element) - - const editAll = this._element.querySelector('.open-calendar__form__buttons [name="edit-all"]')! - const editSingle = this._element.querySelector( - '.open-calendar__form__buttons [name="edit-single"]', - )! - - editAll.addEventListener('click', () => this.close(true)) - editSingle.addEventListener('click', () => this.close(false)) - } - - public destroy = () => { - this._element.remove() - this._popup.destroy() - } - - public open = (handleSelect: (editAll: boolean) => void) => { - this._handleSelect = handleSelect - this._popup.setVisible(true) - } - private close = (editAll: boolean) => { - this._popup.setVisible(false) - this._handleSelect?.(editAll) - } -} diff --git a/src/frontend/packages/open-calendar/src/helpers/dav-helper.ts b/src/frontend/packages/open-calendar/src/helpers/dav-helper.ts deleted file mode 100644 index ff50324..0000000 --- a/src/frontend/packages/open-calendar/src/helpers/dav-helper.ts +++ /dev/null @@ -1,273 +0,0 @@ -import { tzlib_get_ical_block } from 'timezones-ical-library' -import { convertIcsCalendar, convertIcsTimezone, generateIcsCalendar, type IcsCalendar } from 'ts-ics' -import { createAccount, - fetchCalendars as davFetchCalendars, - fetchCalendarObjects as davFetchCalendarObjects, - createCalendarObject as davCreateCalendarObject, - updateCalendarObject as davUpdateCalendarObject, - deleteCalendarObject as davDeleteCalendarObject, - DAVNamespaceShort, - propfind, - type DAVCalendar, - type DAVCalendarObject, - type DAVAddressBook, - fetchAddressBooks as davFetchAddressBooks, - fetchVCards as davFetchVCards, -} from 'tsdav' -import { isServerSource } from './types-helper' -import type { Calendar, CalendarObject } from '../types/calendar' -import type { CalendarSource, ServerSource, CalendarResponse, AddressBookSource } from '../types/options' -import type { AddressBook, AddressBookObject } from '../types/addressbook' -import ICAL from 'ical.js' - -export function getEventObjectString(event: IcsCalendar) { - return generateIcsCalendar(event) -} - -export async function fetchCalendars(source: ServerSource | CalendarSource): Promise { - if (isServerSource(source)) { - const account = await createAccount({ - account: { serverUrl: source.serverUrl, accountType: 'caldav' }, - headers: source.headers, - fetchOptions: source.fetchOptions, - }) - const calendars = await davFetchCalendars({ account, headers: source.headers, fetchOptions: source.fetchOptions }) - return calendars.map(calendar => ({ ...calendar, headers: source.headers, fetchOptions: source.fetchOptions })) - } else { - const calendar = await davFetchCalendar({ - url: source.calendarUrl, - headers: source.headers, - fetchOptions: source.fetchOptions, - }) - return [{ ...calendar, headers: source.headers, fetchOptions: source.fetchOptions, uid: source.calendarUid }] - } -} - -export async function fetchCalendarObjects( - calendar: Calendar, - timeRange?: { start: string; end: string; }, - expand?: boolean, -): Promise<{ calendarObjects: CalendarObject[], recurringObjects: CalendarObject[] }> { - const davCalendarObjects = await davFetchCalendarObjects({ - calendar: calendar, - timeRange, expand, - headers: calendar.headers, - fetchOptions: calendar.fetchOptions, - }) - const calendarObjects = davCalendarObjects.map(o => ({ - url: o.url, - etag: o.etag, - data: convertIcsCalendar(undefined, o.data), - calendarUrl: calendar.url, - })) - const recurringObjectsUrls = new Set( - calendarObjects - .filter(c => c.data.events?.find(e => e.recurrenceId)) - .map(c => c.url), - ) - const davRecurringObjects = recurringObjectsUrls.size == 0 - ? [] - : await davFetchCalendarObjects({ - calendar: calendar, - objectUrls: Array.from(recurringObjectsUrls), - headers: calendar.headers, - fetchOptions: calendar.fetchOptions, - }) - const recurringObjects = davRecurringObjects.map(o => ({ - url: o.url, - etag: o.etag, - data: convertIcsCalendar(undefined, o.data), - calendarUrl: calendar.url, - })) - return { calendarObjects, recurringObjects } -} - -export async function createCalendarObject( - calendar: Calendar, - calendarObjectData: IcsCalendar, -): Promise { - validateTimezones(calendarObjectData) - for (const event of calendarObjectData.events ?? []) event.uid = crypto.randomUUID() - const uid = calendarObjectData.events?.[0].uid ?? crypto.randomUUID() - const iCalString = getEventObjectString(calendarObjectData) - const response = await davCreateCalendarObject({ - calendar, - iCalString, - filename: `${uid}.ics`, - headers: calendar.headers, - fetchOptions: calendar.fetchOptions, - }) - return { response, ical: iCalString } -} - -export async function updateCalendarObject( - calendar: Calendar, - calendarObject: CalendarObject, -): Promise { - validateTimezones(calendarObject.data) - const davCalendarObject: DAVCalendarObject = { - url: calendarObject.url, - etag: calendarObject.etag, - data: getEventObjectString(calendarObject.data), - } - const response = await davUpdateCalendarObject({ - calendarObject: davCalendarObject, - headers: calendar.headers, - fetchOptions: calendar.fetchOptions, - }) - return { response, ical: davCalendarObject.data } -} - -export async function deleteCalendarObject( - calendar: Calendar, - calendarObject: CalendarObject, -): Promise { - validateTimezones(calendarObject.data) - const davCalendarObject: DAVCalendarObject = { - url: calendarObject.url, - etag: calendarObject.etag, - data: getEventObjectString(calendarObject.data), - } - const response = await davDeleteCalendarObject({ - calendarObject: davCalendarObject, - headers: calendar.headers, - fetchOptions: calendar.fetchOptions, - }) - return { response, ical: davCalendarObject.data } - -} - -function validateTimezones(calendarObjectData: IcsCalendar) { - const calendar = calendarObjectData - const usedTimezones = calendar.events?.flatMap(e => [e.start.local?.timezone, e.end?.local?.timezone]) - const wantedTzIds = new Set(usedTimezones?.filter(s => s !== undefined)) - calendar.timezones ??= [] - - // Remove extra timezones - calendar.timezones = calendar.timezones.filter(tz => wantedTzIds.has(tz.id)) - - // Add missing timezones - wantedTzIds.forEach(tzid => { - if (calendar.timezones!.findIndex(t => t.id === tzid) === -1) { - calendar.timezones!.push(convertIcsTimezone(undefined, tzlib_get_ical_block(tzid)[0])) - } - }) -} - -// NOTE - CJ - 2025/07/03 - Inspired from https://github.com/natelindev/tsdav/blob/master/src/calendar.ts, fetchCalendars -async function davFetchCalendar(params: { - url: string, - headers?: Record, - fetchOptions?: RequestInit -}): Promise { - const { url, headers, fetchOptions } = params - const response = await propfind({ - url, - props: { - [`${DAVNamespaceShort.CALDAV}:calendar-description`]: {}, - [`${DAVNamespaceShort.CALDAV}:calendar-timezone`]: {}, - [`${DAVNamespaceShort.DAV}:displayname`]: {}, - [`${DAVNamespaceShort.CALDAV_APPLE}:calendar-color`]: {}, - [`${DAVNamespaceShort.CALENDAR_SERVER}:getctag`]: {}, - [`${DAVNamespaceShort.DAV}:resourcetype`]: {}, - [`${DAVNamespaceShort.CALDAV}:supported-calendar-component-set`]: {}, - [`${DAVNamespaceShort.DAV}:sync-token`]: {}, - }, - headers, - fetchOptions, - }) - const rs = response[0] - if (!rs.ok) { - throw new Error(`Calendar ${url} does not exists. ${rs.status} ${rs.statusText}`) - } - if (Object.keys(rs.props?.resourceType ?? {}).includes('calendar')) { - throw new Error(`${url} is not a ${rs.props?.resourceType} and not a calendar`) - } - const description = rs.props?.calendarDescription - const timezone = rs.props?.calendarTimezone - return { - description: typeof description === 'string' ? description : '', - timezone: typeof timezone === 'string' ? timezone : '', - url: params.url, - ctag: rs.props?.getctag, - calendarColor: rs.props?.calendarColor, - displayName: rs.props?.displayname._cdata ?? rs.props?.displayname, - components: Array.isArray(rs.props?.supportedCalendarComponentSet.comp) - // NOTE - CJ - 2025-07-03 - comp represents an list of XML nodes in the DAVResponse format - // sc could be `` - // eslint-disable-next-line @typescript-eslint/no-explicit-any - ? rs.props?.supportedCalendarComponentSet.comp.map((sc: any) => sc._attributes.name) - : [rs.props?.supportedCalendarComponentSet.comp?._attributes.name], - resourcetype: Object.keys(rs.props?.resourcetype), - syncToken: rs.props?.syncToken, - } -} - -export async function fetchAddressBooks(source: ServerSource | AddressBookSource): Promise { - if (isServerSource(source)) { - const account = await createAccount({ - account: { serverUrl: source.serverUrl, accountType: 'caldav' }, - headers: source.headers, - fetchOptions: source.fetchOptions, - }) - const books = await davFetchAddressBooks({ account, headers: source.headers, fetchOptions: source.fetchOptions }) - return books.map(book => ({ ...book, headers: source.headers, fetchOptions: source.fetchOptions })) - } else { - const book = await davFetchAddressBook({ - url: source.addressBookUrl, - headers: source.headers, - fetchOptions: source.fetchOptions, - }) - return [{ ...book, headers: source.headers, fetchOptions: source.fetchOptions, uid: source.addressBookUid }] - } -} - - -// NOTE - CJ - 2025/07/03 - Inspired from https://github.com/natelindev/tsdav/blob/master/src/addressBook.ts#L73 -async function davFetchAddressBook(params: { - url: string, - headers?: Record, - fetchOptions?: RequestInit -}): Promise { - const { url, headers, fetchOptions } = params - const response = await propfind({ - url, - props: { - [`${DAVNamespaceShort.DAV}:displayname`]: {}, - [`${DAVNamespaceShort.CALENDAR_SERVER}:getctag`]: {}, - [`${DAVNamespaceShort.DAV}:resourcetype`]: {}, - [`${DAVNamespaceShort.DAV}:sync-token`]: {}, - }, - headers, - fetchOptions, - }) - const rs = response[0] - if (!rs.ok) { - throw new Error(`Address book ${url} does not exists. ${rs.status} ${rs.statusText}`) - } - if (Object.keys(rs.props?.resourceType ?? {}).includes('addressbook')) { - throw new Error(`${url} is not a ${rs.props?.resourceType} and not an addressbook`) - } - const displayName = rs.props?.displayname?._cdata ?? rs.props?.displayname - return { - url: url, - ctag: rs.props?.getctag, - displayName: typeof displayName === 'string' ? displayName : '', - resourcetype: Object.keys(rs.props?.resourcetype), - syncToken: rs.props?.syncToken, - } -} - -export async function fetchAddressBookObjects(addressBook: AddressBook): Promise { - const davVCards = await davFetchVCards({ - addressBook: addressBook, - headers: addressBook.headers, - fetchOptions: addressBook.fetchOptions, - }) - return davVCards.map(o => ({ - url: o.url, - etag: o.etag, - data: new ICAL.Component(ICAL.parse(o.data)), - addressBookUrl: addressBook.url, - })) -} diff --git a/src/frontend/packages/open-calendar/src/helpers/dom-helper.ts b/src/frontend/packages/open-calendar/src/helpers/dom-helper.ts deleted file mode 100644 index 82c8c6f..0000000 --- a/src/frontend/packages/open-calendar/src/helpers/dom-helper.ts +++ /dev/null @@ -1,11 +0,0 @@ -import Mustache from 'mustache' - -export function parseHtml(html: string, format?: unknown): NodeListOf { - html = Mustache.render(html, format) - return Document.parseHTMLUnsafe(html).body.childNodes as NodeListOf -} - -export function escapeHtml(html: string): string { - // NOTE - CJ - 2025-07-07 - In Mustache, {{html}} escapes html whereas {{{html}}} and {{&html}} do not - return Mustache.render('{{html}}', { html }) -} diff --git a/src/frontend/packages/open-calendar/src/helpers/ics-helper.ts b/src/frontend/packages/open-calendar/src/helpers/ics-helper.ts deleted file mode 100644 index c3f3930..0000000 --- a/src/frontend/packages/open-calendar/src/helpers/ics-helper.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { generateIcsRecurrenceRule, type IcsDateObject, type IcsEvent, type IcsRecurrenceRule } from 'ts-ics' -import { parseOneAddress } from 'email-addresses' -import type { EventUid } from '../types/calendar' -import type { Contact, VCard } from '../types/addressbook' - -export function isEventAllDay(event: IcsEvent) { - return event.start.type === 'DATE' || event.end?.type === 'DATE' -} - -export function offsetDate(date: IcsDateObject, offset: number): IcsDateObject { - return { - type: date.type, - date: new Date(date.date.getTime() + offset), - local: date.local && { - date: new Date(date.local.date.getTime() + offset), - timezone: date.local.timezone, - tzoffset: date.local.tzoffset, - }, - } -} - -export function isSameEvent(a: EventUid, b: EventUid) { - return a.uid === b.uid && a.recurrenceId?.value.date.getTime() === b.recurrenceId?.value.date.getTime() -} - -export function isRRuleSourceEvent(eventInstance: EventUid, event: EventUid) { - return eventInstance.uid === event.uid && event.recurrenceId === undefined -} - -export function getRRuleString(recurrenceRule?: IcsRecurrenceRule) { - if (!recurrenceRule) return '' - return generateIcsRecurrenceRule(recurrenceRule).trim().slice(6) -} - -// FIXME - CJ - 2025-07-11 - This function should only be used for display purposes -// It does not handle escape characters properly (quotes, comments) -// and parsing the result back to a contact with `mailboxToContact` may fail -// See https://datatracker.ietf.org/doc/html/rfc5322#section-3.4 the specs -export function contactToMailbox(contact: Contact | VCard): string { - return contact.name - ? `${contact.name} <${contact.email}>` - : contact.email! -} - -export function mailboxToContact(mailbox: string): Contact { - const parsed = parseOneAddress(mailbox) - if (parsed?.type !== 'mailbox') throw new Error(`Failed to parse mailbox '${mailbox}' `) - return { - name: parsed.name ?? undefined, - email: parsed.address, - } -} - -export function isSameContact(a: Contact | VCard, b: Contact | VCard) { - return a.name === b.name && a.email === b.email -} diff --git a/src/frontend/packages/open-calendar/src/helpers/types-helper.ts b/src/frontend/packages/open-calendar/src/helpers/types-helper.ts deleted file mode 100644 index 0b84d5f..0000000 --- a/src/frontend/packages/open-calendar/src/helpers/types-helper.ts +++ /dev/null @@ -1,22 +0,0 @@ -import type { CalendarOptions, - SelectCalendarHandlers, - EventEditHandlers, - ServerSource, - VCardProvider, -} from '../types/options' - -export function isServerSource(source: ServerSource | unknown): source is ServerSource { - return (source as ServerSource).serverUrl !== undefined -} - -export function isVCardProvider(source: VCardProvider | unknown): source is VCardProvider { - return (source as VCardProvider).fetchContacts !== undefined -} - -export function hasEventHandlers(options: CalendarOptions): options is EventEditHandlers { - return (options as EventEditHandlers).onCreateEvent !== undefined -} - -export function hasCalendarHandlers(options: CalendarOptions): options is SelectCalendarHandlers { - return (options as SelectCalendarHandlers).onClickSelectCalendars !== undefined -} diff --git a/src/frontend/packages/open-calendar/src/index.css b/src/frontend/packages/open-calendar/src/index.css deleted file mode 100644 index 7df3d19..0000000 --- a/src/frontend/packages/open-calendar/src/index.css +++ /dev/null @@ -1,50 +0,0 @@ -.open-calendar__form { - display: flex; - flex-direction: column; - gap: 1rem; -} - -.open-calendar__form__content { - display: grid; - grid-template-columns: max-content max-content; - grid-gap: 5px; - align-items: baseline; -} - -.open-calendar__form__content label { - text-align: right; -} - -/* FIXME - CJ - 2025-07-03 - replace by something else that supports localization */ -.open-calendar__form__content label::after { - content: ":"; -} - -.open-calendar__form__content input[type=checkbox] { - justify-self: left; -} - -.open-calendar__form__list { - display: flex; - flex-direction: column; - grid-gap: 0.25rem; - margin-bottom: 0.25rem; -} - -.open-calendar__form__buttons { - display: flex; - gap: 1rem; -} - -.open-calendar__form__buttons>* { - flex-grow: 1; -} - -.open-calendar { - font-family: sans-serif; - height: 100%; -} - -.ec { - height: 100%; -} \ No newline at end of file diff --git a/src/frontend/packages/open-calendar/src/index.ts b/src/frontend/packages/open-calendar/src/index.ts deleted file mode 100644 index e9e5f17..0000000 --- a/src/frontend/packages/open-calendar/src/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { CalendarElement } from './calendarelement/calendarElement' -import './index.css' -import { setTranslations, type ResourceBundle} from './translations' -import type { AddressBookSource, - CalendarOptions, - CalendarSource, - VCardProvider, - RecursivePartial, - ServerSource, -} from './types/options' - -export async function createCalendar( - calendarSources: (ServerSource | CalendarSource)[], - addressBookSources: (ServerSource | AddressBookSource | VCardProvider)[], - target: Element, - options?: CalendarOptions, - translations?: RecursivePartial, -) { - if (translations) setTranslations(translations) - const calendar = new CalendarElement() - await calendar.create(calendarSources, addressBookSources, target, options) - return calendar -} diff --git a/src/frontend/packages/open-calendar/src/popup/popup.css b/src/frontend/packages/open-calendar/src/popup/popup.css deleted file mode 100644 index 18bb686..0000000 --- a/src/frontend/packages/open-calendar/src/popup/popup.css +++ /dev/null @@ -1,24 +0,0 @@ -.open-calendar__popup__overlay { - position: fixed; - width: 100vw; - height: 100vh; - left: 0px; - top: 0px; - background-color: rgba(0, 0, 0, 0.5); - display: flex; - align-items: center; - justify-content: center; - z-index: 2000; -} - -.open-calendar__popup--hidden { - display: none; -} - -.open-calendar__popup__frame { - width: fit-content; - height: fit-content; - background-color: white; - padding: 0.5rem; - border-radius: 10px; -} \ No newline at end of file diff --git a/src/frontend/packages/open-calendar/src/popup/popup.ts b/src/frontend/packages/open-calendar/src/popup/popup.ts deleted file mode 100644 index 1d6a48b..0000000 --- a/src/frontend/packages/open-calendar/src/popup/popup.ts +++ /dev/null @@ -1,35 +0,0 @@ -import './popup.css' -import { parseHtml } from '../helpers/dom-helper' - -const html = /*html*/` -
-
-
` - -export class Popup { - - private _node: HTMLDivElement - public content: HTMLDivElement - - constructor(target: Node) { - this._node = parseHtml(html)[0] - target.appendChild(this._node) - - this.content = this._node.firstElementChild as HTMLDivElement - - window.addEventListener('mousedown', e => { - if (this._node.classList.contains('open-calendar__popup--hidden')) return - if (e.target instanceof Element && (e.target === this.content || e.target.contains(this.content))) { - this.setVisible(false) - } - }) - } - - public destroy = () => { - this._node.remove() - } - - setVisible = (visible: boolean) => { - this._node.classList.toggle('open-calendar__popup--hidden', !visible) - } -} diff --git a/src/frontend/packages/open-calendar/src/translations.ts b/src/frontend/packages/open-calendar/src/translations.ts deleted file mode 100644 index 243774f..0000000 --- a/src/frontend/packages/open-calendar/src/translations.ts +++ /dev/null @@ -1,123 +0,0 @@ -import type { RecursivePartial } from './types/options' - -// HACK - CJ - 2025-07-03 - Ideally, this object would have been a json file and imported with: -// `import en from 'locale/en/translation.json'` -// However, the lib used to create the declarations file `index.d.ts` thinks this is ts import -// and looks for the file `locale/en/translation.json.d.ts` which doesn't exists. -const en = { - 'calendarElement': { - 'timeGridDay': 'Day', - 'timeGridWeek': 'Week', - 'dayGridMonth': 'Month', - 'listDay': 'List', - 'listWeek': 'List Week', - 'listMonth': 'List Month', - 'listYear': 'List Year', - 'today': 'Today', - 'allDay': 'Daily', - 'calendars': 'Calendars', - 'newEvent': 'New Event', - }, - 'eventForm': { - 'allDay': 'Daily', - 'calendar': 'Calendar', - 'title': 'Title', - 'location': 'Location', - 'start': 'Start', - 'end': 'End', - 'organizer': 'Organizer', - 'attendees': 'Attendees', - 'addAttendee': 'Add attendee', - 'description': 'Description', - 'delete': 'Delete', - 'cancel': 'Cancel', - 'save': 'Save', - 'chooseACalendar': '-- Choose a calendar --', - 'rrule': 'Frequency', - 'userInvite': 'You were invited to this event', - }, - 'eventBody': { - 'organizer': 'Organizer', - 'participation_require': 'Required participant', - 'participation_optional': 'Optional participant', - 'non_participant': 'Non participant', - 'participation_confirmed': 'Participation confirmed', - 'participation_pending': 'Participation pending', - 'participation_confirmed_tentative': 'Participation confirmed tentative', - 'participation_declined': 'Participation declined', - }, - 'recurringForm': { - 'editRecurring': 'This is a recurring event', - 'editAll': 'Edit all occurrences', - 'editSingle': 'Edit this occurrence only', - }, - 'participationStatus': { - 'NEEDS-ACTION': 'Needs to answer', - 'ACCEPTED': 'Accepted', - 'DECLINED': 'Declined', - 'TENTATIVE': 'Tentatively accepted', - 'DELEGATED': 'Delegated', - }, - 'userParticipationStatus': { - 'NEEDS-ACTION': 'Not answered', - 'ACCEPTED': 'Accept', - 'DECLINED': 'Decline', - 'TENTATIVE': 'Accept tentatively', - }, - 'attendeeRoles': { - 'CHAIR': 'Chair', - 'REQ-PARTICIPANT': 'Required participant', - 'OPT-PARTICIPANT': 'Optional participant', - 'NON-PARTICIPANT': 'Non participant', - }, - 'rrules': { - 'none': 'Never', - 'unchanged': 'Keep existing', - 'FREQ=DAILY': 'Daily', - 'FREQ=WEEKLY': 'Weekly', - 'BYDAY=MO,TU,WE,TH,FR;FREQ=DAILY': 'Workdays', - 'INTERVAL=2;FREQ=WEEKLY': 'Every two week', - 'FREQ=MONTHLY': 'Monthly', - 'FREQ=YEARLY': 'Yearly', - }, -} - -export type ResourceBundle = typeof en - -let translations = en - -export const setTranslations = (bundle: RecursivePartial) => translations = { - calendarElement: { - ...en.calendarElement, - ...bundle.calendarElement, - }, - eventForm: { - ...en.eventForm, - ...bundle.eventForm, - }, - eventBody: { - ...en.eventBody, - ...bundle.eventBody, - }, - recurringForm: { - ...en.recurringForm, - ...bundle.recurringForm, - }, - userParticipationStatus: { - ...en.userParticipationStatus, - ...bundle.userParticipationStatus, - }, - participationStatus: { - ...en.participationStatus, - ...bundle.participationStatus, - }, - attendeeRoles: { - ...en.attendeeRoles, - ...bundle.attendeeRoles, - }, - rrules: { - ...en.rrules, - ...bundle.rrules, - }, -} -export const getTranslations = () => translations diff --git a/src/frontend/packages/open-calendar/src/types/addressbook.ts b/src/frontend/packages/open-calendar/src/types/addressbook.ts deleted file mode 100644 index d98f79c..0000000 --- a/src/frontend/packages/open-calendar/src/types/addressbook.ts +++ /dev/null @@ -1,30 +0,0 @@ -import type { DAVAddressBook } from 'tsdav' -import ICAL from 'ical.js' - -export type AddressBook = DAVAddressBook & { - headers?: Record - uid?: unknown -} - -export type AddressBookObject = { - data: ICAL.Component - etag?: string - url: string - addressBookUrl: string -} - -export type VCard = { - name: string - email: string | null -} - -export type AddressBookVCard = { - // INFO - 2025-07-24 - addressBookUrl is undefined when the contact is from a VCardProvider - addressBookUrl?: string - vCard: VCard -} - -export type Contact = { - name?: string - email: string -} diff --git a/src/frontend/packages/open-calendar/src/types/calendar.ts b/src/frontend/packages/open-calendar/src/types/calendar.ts deleted file mode 100644 index dfecdb9..0000000 --- a/src/frontend/packages/open-calendar/src/types/calendar.ts +++ /dev/null @@ -1,39 +0,0 @@ -import type { IcsCalendar, IcsEvent, IcsRecurrenceId } from 'ts-ics' -import type { DAVCalendar } from 'tsdav' - -// TODO - CJ - 2025-07-03 - add generic -// TODO - CJ - 2025-07-03 - add options to support IcsEvent custom props -export type Calendar = DAVCalendar & { - // INFO - CJ - 2025-07-03 - Useful fields from 'DAVCalendar' - // ctag?: string - // description?: string; - // displayName?: string | Record; - // calendarColor?: string - // url: string - // fetchOptions?: RequestInit - headers?: Record - uid?: unknown -} - -export type CalendarObject = { - data: IcsCalendar - etag?: string - url: string - calendarUrl: string -} - -export type CalendarEvent = { - calendarUrl: string - event: IcsEvent -} - -export type EventUid = { - uid: string - recurrenceId?: IcsRecurrenceId -} - -export type DisplayedCalendarEvent = { - calendarUrl: string - event: IcsEvent - recurringEvent?: IcsEvent -} diff --git a/src/frontend/packages/open-calendar/src/types/options.ts b/src/frontend/packages/open-calendar/src/types/options.ts deleted file mode 100644 index b12c0e9..0000000 --- a/src/frontend/packages/open-calendar/src/types/options.ts +++ /dev/null @@ -1,160 +0,0 @@ -import type { IcsEvent } from 'ts-ics' -import type { Calendar, CalendarEvent } from './calendar' -import type { AddressBookVCard, Contact, VCard } from './addressbook' -import type { attendeeRoleTypes, availableViews } from '../contants' - -export type RecursivePartial = { - [P in keyof T]?: RecursivePartial -} - -export type DomEvent = GlobalEventHandlersEventMap[keyof GlobalEventHandlersEventMap] - -export type ServerSource = { - serverUrl: string - headers?: Record - fetchOptions?: RequestInit -} - -export type CalendarSource = { - calendarUrl: string - calendarUid?: unknown - headers?: Record - fetchOptions?: RequestInit -} - -export type AddressBookSource = { - addressBookUrl: string - addressBookUid?: unknown - headers?: Record - fetchOptions?: RequestInit -} - -export type VCardProvider = { - fetchContacts: () => Promise -} - -export type View = typeof availableViews[number] -export type IcsAttendeeRoleType = typeof attendeeRoleTypes[number] - - -export type SelectedCalendar = { - url: string - selected: boolean -} - -export type SelectCalendarCallback = (calendar: SelectedCalendar) => void -export type SelectCalendarsClickInfo = { - jsEvent: DomEvent - calendars: Calendar[] - selectedCalendars: Set - handleSelect: SelectCalendarCallback -} -export type SelectCalendarHandlers = { - onClickSelectCalendars: (info: SelectCalendarsClickInfo) => void, -} - - -export type EventBodyInfo = { - calendar: Calendar - vCards: AddressBookVCard[] - event: IcsEvent - view: View - userContact?: Contact -} -export type BodyHandlers = { - getEventBody: (info: EventBodyInfo) => Node[] -} - -export type EventEditCallback = (event: CalendarEvent) => Promise -export type EventEditCreateInfo = { - jsEvent: DomEvent - userContact?: Contact, - event: IcsEvent - calendars: Calendar[] - vCards: AddressBookVCard[] - handleCreate: EventEditCallback -} -export type EventEditSelectInfo = { - jsEvent: DomEvent - userContact?: Contact, - calendarUrl: string - event: IcsEvent - recurringEvent?: IcsEvent - calendars: Calendar[] - vCards: AddressBookVCard[] - handleUpdate: EventEditCallback - handleDelete: EventEditCallback -} -export type EventEditMoveResizeInfo = { - jsEvent: DomEvent - calendarUrl: string - userContact?: Contact, - event: IcsEvent - recurringEvent?: IcsEvent, - start: Date, - end: Date, - handleUpdate: EventEditCallback -} -export type EventEditDeleteInfo = { - jsEvent: DomEvent - userContact?: Contact, - calendarUrl: string - event: IcsEvent - recurringEvent?: IcsEvent - handleDelete: EventEditCallback -} -export type EventEditHandlers = { - onCreateEvent: (info: EventEditCreateInfo) => void, - onSelectEvent: (info: EventEditSelectInfo) => void, - onMoveResizeEvent: (info: EventEditMoveResizeInfo) => void, - onDeleteEvent: (info: EventEditDeleteInfo) => void, -} - -export type EventChangeInfo = { - calendarUrl: string - event: IcsEvent - ical: string -} - -export type EventChangeHandlers = { - onEventCreated?: (info: EventChangeInfo) => void - onEventUpdated?: (info: EventChangeInfo) => void - onEventDeleted?: (info: EventChangeInfo) => void -} - -export type CalendarElementOptions = { - view?: View - views?: View[] - locale?: string - date?: Date - editable?: boolean -} - -export type CalendarClientOptions = { - userContact?: Contact -} - -export type DefaultComponentsOptions = { - hideVCardEmails?: boolean -} - -export type CalendarOptions = - // NOTE - CJ - 2025-07-03 - // May define individual options or not - CalendarElementOptions - // May define individual options or not - & CalendarClientOptions - // Must define all handlers or none - & (SelectCalendarHandlers | Record) - // Must define all handlers or none - & (EventEditHandlers | Record) - // May define individual handlers or not - & EventChangeHandlers - // May define handlers or not, but they will be assigned a default value if they are not - & Partial - & DefaultComponentsOptions - -export type CalendarResponse = { - response: Response - ical: string -} diff --git a/src/frontend/packages/open-calendar/src/vite-env.d.ts b/src/frontend/packages/open-calendar/src/vite-env.d.ts deleted file mode 100644 index 11f02fe..0000000 --- a/src/frontend/packages/open-calendar/src/vite-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/src/frontend/packages/open-calendar/tsconfig.json b/src/frontend/packages/open-calendar/tsconfig.json deleted file mode 100644 index 781d7f4..0000000 --- a/src/frontend/packages/open-calendar/tsconfig.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "include": ["src/**/*"], - "exclude": ["node_modules", "vite.config.ts"], - "compilerOptions": { - "outDir": "./dist/", - "module": "esnext", - "target": "es2020", - "lib": ["ES2020", "DOM"], - "useDefineForClassFields": true, - "skipLibCheck": true, - "types": [], - "declaration": true, - "declarationDir": "./build/", - "esModuleInterop": true, - /* Bundler mode */ - "moduleResolution": "node", - "resolveJsonModule": true, - "verbatimModuleSyntax": true, - "moduleDetection": "force", - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noImplicitAny": true, - "erasableSyntaxOnly": true, - "noFallthroughCasesInSwitch": true, - "noUncheckedSideEffectImports": true, - "allowSyntheticDefaultImports": true, - /* FIXME - CJ - 2025-07-03 - Compilation worked file when I added `tsconfig-paths-webpack-plugin` but I could not find a working plugin for the .d.ts files */ - // "baseUrl": "./src", - // "paths": { - // "@helpers/*": ["./helpers/*"], - // "@calendar-types": ["./types.ts"] - // }, - }, -} \ No newline at end of file diff --git a/src/frontend/packages/open-calendar/vite.config.ts b/src/frontend/packages/open-calendar/vite.config.ts deleted file mode 100644 index 7826993..0000000 --- a/src/frontend/packages/open-calendar/vite.config.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { defineConfig } from 'vite' -import { nodePolyfills } from 'vite-plugin-node-polyfills' -// INFO - CJ - 2025-07-03 - This plugin show tsc errors on vite dev -import pluginChecker from 'vite-plugin-checker' - -export default defineConfig({ - plugins: [ - nodePolyfills(), - pluginChecker({ typescript: true }), - ], - build: { - lib: { - entry: './src/index.ts', - name: 'CalendarClient', - fileName: 'index', - }, - }, - resolve: { - alias: { - 'node-fetch': 'axios', - }, - }, -}) diff --git a/src/frontend/packages/open-calendar/webpack.config.js b/src/frontend/packages/open-calendar/webpack.config.js deleted file mode 100644 index ec63624..0000000 --- a/src/frontend/packages/open-calendar/webpack.config.js +++ /dev/null @@ -1,43 +0,0 @@ -const path = require('path') -const NodePolyfillPlugin = require('node-polyfill-webpack-plugin') -const DtsBundleWebpack = require('dts-bundle-webpack') -const isProduction = process.env.NODE_ENV === 'production' || true -const name = 'open-dav-calendar' - -module.exports = { - mode: isProduction ? 'production' : 'development', - entry: { - index: "./src/index.ts", - }, - target: 'web', - plugins: [ - new NodePolyfillPlugin(), - new DtsBundleWebpack({ - name: name, - main: path.resolve(__dirname, "build/index.d.ts"), - out: path.resolve(__dirname, "dist/index.d.ts"), - }) - ], - module: { - rules: [{ - test: /\.ts$/, - use: 'ts-loader', - exclude: /node_modules/, - }, { - test: /\.css$/, - use: ['style-loader', 'css-loader'] - }], - }, - resolve: { - extensions: ['.ts', '.js'], - }, - output: { - path: path.resolve(__dirname, 'dist'), - filename: '[name].js', - library: { - type: 'umd', - name: name, - umdNamedDefine: true - } - } -} diff --git a/src/frontend/packages/open-calendar/yarn.lock b/src/frontend/packages/open-calendar/yarn.lock deleted file mode 100644 index 0393425..0000000 --- a/src/frontend/packages/open-calendar/yarn.lock +++ /dev/null @@ -1,3636 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.3.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" - integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - -"@babel/code-frame@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" - integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== - dependencies: - "@babel/helper-validator-identifier" "^7.27.1" - js-tokens "^4.0.0" - picocolors "^1.1.1" - -"@babel/helper-validator-identifier@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" - integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== - -"@discoveryjs/json-ext@^0.6.1": - version "0.6.3" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz#f13c7c205915eb91ae54c557f5e92bddd8be0e83" - integrity sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ== - -"@esbuild/aix-ppc64@0.25.5": - version "0.25.5" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz#4e0f91776c2b340e75558f60552195f6fad09f18" - integrity sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA== - -"@esbuild/android-arm64@0.25.5": - version "0.25.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz#bc766407f1718923f6b8079c8c61bf86ac3a6a4f" - integrity sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg== - -"@esbuild/android-arm@0.25.5": - version "0.25.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.5.tgz#4290d6d3407bae3883ad2cded1081a234473ce26" - integrity sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA== - -"@esbuild/android-x64@0.25.5": - version "0.25.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.5.tgz#40c11d9cbca4f2406548c8a9895d321bc3b35eff" - integrity sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw== - -"@esbuild/darwin-arm64@0.25.5": - version "0.25.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz#49d8bf8b1df95f759ac81eb1d0736018006d7e34" - integrity sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ== - -"@esbuild/darwin-x64@0.25.5": - version "0.25.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz#e27a5d92a14886ef1d492fd50fc61a2d4d87e418" - integrity sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ== - -"@esbuild/freebsd-arm64@0.25.5": - version "0.25.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz#97cede59d638840ca104e605cdb9f1b118ba0b1c" - integrity sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw== - -"@esbuild/freebsd-x64@0.25.5": - version "0.25.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz#71c77812042a1a8190c3d581e140d15b876b9c6f" - integrity sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw== - -"@esbuild/linux-arm64@0.25.5": - version "0.25.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz#f7b7c8f97eff8ffd2e47f6c67eb5c9765f2181b8" - integrity sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg== - -"@esbuild/linux-arm@0.25.5": - version "0.25.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz#2a0be71b6cd8201fa559aea45598dffabc05d911" - integrity sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw== - -"@esbuild/linux-ia32@0.25.5": - version "0.25.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz#763414463cd9ea6fa1f96555d2762f9f84c61783" - integrity sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA== - -"@esbuild/linux-loong64@0.25.5": - version "0.25.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz#428cf2213ff786a502a52c96cf29d1fcf1eb8506" - integrity sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg== - -"@esbuild/linux-mips64el@0.25.5": - version "0.25.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz#5cbcc7fd841b4cd53358afd33527cd394e325d96" - integrity sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg== - -"@esbuild/linux-ppc64@0.25.5": - version "0.25.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz#0d954ab39ce4f5e50f00c4f8c4fd38f976c13ad9" - integrity sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ== - -"@esbuild/linux-riscv64@0.25.5": - version "0.25.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz#0e7dd30730505abd8088321e8497e94b547bfb1e" - integrity sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA== - -"@esbuild/linux-s390x@0.25.5": - version "0.25.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz#5669af81327a398a336d7e40e320b5bbd6e6e72d" - integrity sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ== - -"@esbuild/linux-x64@0.25.5": - version "0.25.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz#b2357dd153aa49038967ddc1ffd90c68a9d2a0d4" - integrity sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw== - -"@esbuild/netbsd-arm64@0.25.5": - version "0.25.5" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz#53b4dfb8fe1cee93777c9e366893bd3daa6ba63d" - integrity sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw== - -"@esbuild/netbsd-x64@0.25.5": - version "0.25.5" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz#a0206f6314ce7dc8713b7732703d0f58de1d1e79" - integrity sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ== - -"@esbuild/openbsd-arm64@0.25.5": - version "0.25.5" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz#2a796c87c44e8de78001d808c77d948a21ec22fd" - integrity sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw== - -"@esbuild/openbsd-x64@0.25.5": - version "0.25.5" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz#28d0cd8909b7fa3953af998f2b2ed34f576728f0" - integrity sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg== - -"@esbuild/sunos-x64@0.25.5": - version "0.25.5" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz#a28164f5b997e8247d407e36c90d3fd5ddbe0dc5" - integrity sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA== - -"@esbuild/win32-arm64@0.25.5": - version "0.25.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz#6eadbead38e8bd12f633a5190e45eff80e24007e" - integrity sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw== - -"@esbuild/win32-ia32@0.25.5": - version "0.25.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz#bab6288005482f9ed2adb9ded7e88eba9a62cc0d" - integrity sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ== - -"@esbuild/win32-x64@0.25.5": - version "0.25.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz#7fc114af5f6563f19f73324b5d5ff36ece0803d1" - integrity sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g== - -"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.7.0": - version "4.7.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz#607084630c6c033992a082de6e6fbc1a8b52175a" - integrity sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw== - dependencies: - eslint-visitor-keys "^3.4.3" - -"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.12.1": - version "4.12.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" - integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== - -"@eslint/config-array@^0.21.0": - version "0.21.0" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.21.0.tgz#abdbcbd16b124c638081766392a4d6b509f72636" - integrity sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ== - dependencies: - "@eslint/object-schema" "^2.1.6" - debug "^4.3.1" - minimatch "^3.1.2" - -"@eslint/config-helpers@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.3.0.tgz#3e09a90dfb87e0005c7694791e58e97077271286" - integrity sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw== - -"@eslint/core@^0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.12.0.tgz#5f960c3d57728be9f6c65bd84aa6aa613078798e" - integrity sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg== - dependencies: - "@types/json-schema" "^7.0.15" - -"@eslint/core@^0.13.0": - version "0.13.0" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.13.0.tgz#bf02f209846d3bf996f9e8009db62df2739b458c" - integrity sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw== - dependencies: - "@types/json-schema" "^7.0.15" - -"@eslint/core@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.14.0.tgz#326289380968eaf7e96f364e1e4cf8f3adf2d003" - integrity sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg== - dependencies: - "@types/json-schema" "^7.0.15" - -"@eslint/core@^0.15.1": - version "0.15.1" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.15.1.tgz#d530d44209cbfe2f82ef86d6ba08760196dd3b60" - integrity sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA== - dependencies: - "@types/json-schema" "^7.0.15" - -"@eslint/css-tree@^3.6.1": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@eslint/css-tree/-/css-tree-3.6.1.tgz#7e162e2884b4581bb74e8cfe9ff1eb42cf87fc9f" - integrity sha512-5DIsBME23tUQD5zHD+T38lC2DG4jB8x8JRa+yDncLne2TIZA0VuCpcSazOX1EC+sM/q8w24qeevXfmfsIxAeqA== - dependencies: - mdn-data "2.21.0" - source-map-js "^1.0.1" - -"@eslint/css@^0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@eslint/css/-/css-0.9.0.tgz#fc095bb0a0ec5da5c7482d6360a64ba93743575b" - integrity sha512-fq8hYnjipdzVDSU/bXqv7qlvdjDA27Nq7DhQXzlPElLlVon3lnKovIM/6HaUrq1bz7EPgRobr+vOhpeM6z0X4w== - dependencies: - "@eslint/core" "^0.14.0" - "@eslint/css-tree" "^3.6.1" - "@eslint/plugin-kit" "^0.3.1" - -"@eslint/eslintrc@^3.3.1": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz#e55f7f1dd400600dd066dbba349c4c0bac916964" - integrity sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^10.0.1" - globals "^14.0.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@9.30.0", "@eslint/js@^9.29.0": - version "9.30.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.30.0.tgz#c396fa450d5505dd9b7b8846b33f0491aebd9a2d" - integrity sha512-Wzw3wQwPvc9sHM+NjakWTcPx11mbZyiYHuwWa/QfZ7cIRX7WK54PSk7bdyXDaoaopUcMatv1zaQvOAAO8hCdww== - -"@eslint/json@^0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@eslint/json/-/json-0.12.0.tgz#7d1cb7152d01f3837703c154a5b38233f409395e" - integrity sha512-n/7dz8HFStpEe4o5eYk0tdkBdGUS/ZGb0GQCeDWN1ZmRq67HMHK4vC33b0rQlTT6xdZoX935P4vstiWVk5Ying== - dependencies: - "@eslint/core" "^0.12.0" - "@eslint/plugin-kit" "^0.2.7" - "@humanwhocodes/momoa" "^3.3.4" - natural-compare "^1.4.0" - -"@eslint/object-schema@^2.1.6": - version "2.1.6" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.6.tgz#58369ab5b5b3ca117880c0f6c0b0f32f6950f24f" - integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== - -"@eslint/plugin-kit@^0.2.7": - version "0.2.8" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz#47488d8f8171b5d4613e833313f3ce708e3525f8" - integrity sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA== - dependencies: - "@eslint/core" "^0.13.0" - levn "^0.4.1" - -"@eslint/plugin-kit@^0.3.1": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.3.3.tgz#32926b59bd407d58d817941e48b2a7049359b1fd" - integrity sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag== - dependencies: - "@eslint/core" "^0.15.1" - levn "^0.4.1" - -"@event-calendar/core@^4.4.0": - version "4.5.0" - resolved "https://registry.yarnpkg.com/@event-calendar/core/-/core-4.5.0.tgz#bdd770f9e118d0d44b25e503471e581b604470f9" - integrity sha512-H7z3MCmXJP7Gdzdf9cxA3rR9ANw15y8cD041twStNQ3S7PniqcH+qygvZOHp45vTxNj2HA9vOUR4Reno8AK89Q== - dependencies: - svelte "^5.34.8" - -"@fortawesome/fontawesome-common-types@6.7.2": - version "6.7.2" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.7.2.tgz#7123d74b0c1e726794aed1184795dbce12186470" - integrity sha512-Zs+YeHUC5fkt7Mg1l6XTniei3k4bwG/yo3iFUtZWd/pMx9g3fdvkSK9E0FOC+++phXOka78uJcYb8JaFkW52Xg== - -"@fortawesome/fontawesome-svg-core@^6.7.2": - version "6.7.2" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.7.2.tgz#0ac6013724d5cc327c1eb81335b91300a4fce2f2" - integrity sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA== - dependencies: - "@fortawesome/fontawesome-common-types" "6.7.2" - -"@fortawesome/free-regular-svg-icons@^6.7.2": - version "6.7.2" - resolved "https://registry.yarnpkg.com/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.7.2.tgz#f1651e55e6651a15589b0569516208f9c65f96db" - integrity sha512-7Z/ur0gvCMW8G93dXIQOkQqHo2M5HLhYrRVC0//fakJXxcF1VmMPsxnG6Ee8qEylA8b8Q3peQXWMNZ62lYF28g== - dependencies: - "@fortawesome/fontawesome-common-types" "6.7.2" - -"@fortawesome/free-solid-svg-icons@^6.7.2": - version "6.7.2" - resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.7.2.tgz#fe25883b5eb8464a82918599950d283c465b57f6" - integrity sha512-GsBrnOzU8uj0LECDfD5zomZJIjrPhIlWU82AHwa2s40FKH+kcxQaBvBo3Z4TxyZHIyX8XTDxsyA33/Vx9eFuQA== - dependencies: - "@fortawesome/fontawesome-common-types" "6.7.2" - -"@humanfs/core@^0.19.1": - version "0.19.1" - resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" - integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== - -"@humanfs/node@^0.16.6": - version "0.16.6" - resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e" - integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== - dependencies: - "@humanfs/core" "^0.19.1" - "@humanwhocodes/retry" "^0.3.0" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/momoa@^3.3.4": - version "3.3.8" - resolved "https://registry.yarnpkg.com/@humanwhocodes/momoa/-/momoa-3.3.8.tgz#b00630bf689b6f758419c029e15a4be25c12179b" - integrity sha512-/3PZzor2imi/RLLcnHztkwA79txiVvW145Ve2cp5dxRcH5qOUNJPToasqLFHniTfw4B4lT7jGDdBOPXbXYlIMQ== - -"@humanwhocodes/retry@^0.3.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" - integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== - -"@humanwhocodes/retry@^0.4.2": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" - integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== - -"@isaacs/balanced-match@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz#3081dadbc3460661b751e7591d7faea5df39dd29" - integrity sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ== - -"@isaacs/brace-expansion@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz#4b3dabab7d8e75a429414a96bd67bf4c1d13e0f3" - integrity sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA== - dependencies: - "@isaacs/balanced-match" "^4.0.1" - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - -"@jridgewell/gen-mapping@^0.3.5": - version "0.3.10" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.10.tgz#1cad974c8478e644c5cbce2a4b738137bb64bd4f" - integrity sha512-HM2F4B9N4cA0RH2KQiIZOHAZqtP4xGS4IZ+SFe1SIbO4dyjf9MTY2Bo3vHYnm0hglWfXqBrzUBSa+cJfl3Xvrg== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/source-map@^0.3.3": - version "0.3.8" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.8.tgz#0af4be466bcbcbc7206f69623e32b3cefe3b39cd" - integrity sha512-3EDAPd0B8X1gsQQgGHU8vyxSp2MB414z3roN67fY7nI0GV3GDthHfaWcbCfrC95tpAzA5xUvAuoO9Dxx/ywwRQ== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - -"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15", "@jridgewell/sourcemap-codec@^1.5.0": - version "1.5.2" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.2.tgz#4f25c8f17f28ccf70ed16e03f8fbf6d3998cb8fd" - integrity sha512-gKYheCylLIedI+CSZoDtGkFV9YEBxRRVcfCH7OfAqh4TyUyRjEE6WVE/aXDXX0p8BIe/QgLcaAoI0220KRRFgg== - -"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": - version "0.3.27" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.27.tgz#3139cfeafce3aa9918454cce8b219eee39fd7df2" - integrity sha512-VO95AxtSFMelbg3ouljAYnfvTEwSWVt/2YLf+U5Ejd8iT5mXE2Sa/1LGyvySMne2CGsepGLI7KpF3EzE3Aq9Mg== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@rollup/plugin-inject@^5.0.5": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz#616f3a73fe075765f91c5bec90176608bed277a3" - integrity sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg== - dependencies: - "@rollup/pluginutils" "^5.0.1" - estree-walker "^2.0.2" - magic-string "^0.30.3" - -"@rollup/pluginutils@^5.0.1": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.2.0.tgz#eac25ca5b0bdda4ba735ddaca5fbf26bd435f602" - integrity sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw== - dependencies: - "@types/estree" "^1.0.0" - estree-walker "^2.0.2" - picomatch "^4.0.2" - -"@rollup/rollup-android-arm-eabi@4.44.1": - version "4.44.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.1.tgz#f768e3b2b0e6b55c595d7a053652c06413713983" - integrity sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w== - -"@rollup/rollup-android-arm64@4.44.1": - version "4.44.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.1.tgz#40379fd5501cfdfd7d8f86dfa1d3ce8d3a609493" - integrity sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ== - -"@rollup/rollup-darwin-arm64@4.44.1": - version "4.44.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.1.tgz#972c227bc89fe8a38a3f0c493e1966900e4e1ff7" - integrity sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg== - -"@rollup/rollup-darwin-x64@4.44.1": - version "4.44.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.1.tgz#96c919dcb87a5aa7dec5f7f77d90de881e578fdd" - integrity sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw== - -"@rollup/rollup-freebsd-arm64@4.44.1": - version "4.44.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.1.tgz#d199d8eaef830179c0c95b7a6e5455e893d1102c" - integrity sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA== - -"@rollup/rollup-freebsd-x64@4.44.1": - version "4.44.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.1.tgz#cab01f9e06ca756c1fabe87d64825ae016af4713" - integrity sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw== - -"@rollup/rollup-linux-arm-gnueabihf@4.44.1": - version "4.44.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.1.tgz#f6f1c42036dba0e58dc2315305429beff0d02c78" - integrity sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ== - -"@rollup/rollup-linux-arm-musleabihf@4.44.1": - version "4.44.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.1.tgz#1157e98e740facf858993fb51431dce3a4a96239" - integrity sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw== - -"@rollup/rollup-linux-arm64-gnu@4.44.1": - version "4.44.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.1.tgz#b39db73f8a4c22e7db31a4f3fd45170105f33265" - integrity sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ== - -"@rollup/rollup-linux-arm64-musl@4.44.1": - version "4.44.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.1.tgz#4043398049fe4449c1485312d1ae9ad8af4056dd" - integrity sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g== - -"@rollup/rollup-linux-loongarch64-gnu@4.44.1": - version "4.44.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.1.tgz#855a80e7e86490da15a85dcce247dbc25265bc08" - integrity sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew== - -"@rollup/rollup-linux-powerpc64le-gnu@4.44.1": - version "4.44.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.1.tgz#8cf843cb7ab1d42e1dda680937cf0a2db6d59047" - integrity sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA== - -"@rollup/rollup-linux-riscv64-gnu@4.44.1": - version "4.44.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.1.tgz#287c085472976c8711f16700326f736a527f2f38" - integrity sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw== - -"@rollup/rollup-linux-riscv64-musl@4.44.1": - version "4.44.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.1.tgz#095ad5e53a54ba475979f1b3226b92440c95c892" - integrity sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg== - -"@rollup/rollup-linux-s390x-gnu@4.44.1": - version "4.44.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.1.tgz#a3dec8281d8f2aef1703e48ebc65d29fe847933c" - integrity sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw== - -"@rollup/rollup-linux-x64-gnu@4.44.1": - version "4.44.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.1.tgz#4b211e6fd57edd6a134740f4f8e8ea61972ff2c5" - integrity sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw== - -"@rollup/rollup-linux-x64-musl@4.44.1": - version "4.44.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.1.tgz#3ecbf8e21b4157e57bb15dc6837b6db851f9a336" - integrity sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g== - -"@rollup/rollup-win32-arm64-msvc@4.44.1": - version "4.44.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.1.tgz#d4aae38465b2ad200557b53c8c817266a3ddbfd0" - integrity sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg== - -"@rollup/rollup-win32-ia32-msvc@4.44.1": - version "4.44.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.1.tgz#0258e8ca052abd48b23fd6113360fa0cd1ec3e23" - integrity sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A== - -"@rollup/rollup-win32-x64-msvc@4.44.1": - version "4.44.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.1.tgz#1c982f6a5044ffc2a35cd754a0951bdcb44d5ba0" - integrity sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug== - -"@standard-schema/spec@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.0.0.tgz#f193b73dc316c4170f2e82a881da0f550d551b9c" - integrity sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA== - -"@stylistic/eslint-plugin@^5.0.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@stylistic/eslint-plugin/-/eslint-plugin-5.1.0.tgz#98769a3e6fc68d92deba20538341b0ea7923b3ce" - integrity sha512-TJRJul4u/lmry5N/kyCU+7RWWOk0wyXN+BncRlDYBqpLFnzXkd7QGVfN7KewarFIXv0IX0jSF/Ksu7aHWEDeuw== - dependencies: - "@eslint-community/eslint-utils" "^4.7.0" - "@typescript-eslint/types" "^8.34.1" - eslint-visitor-keys "^4.2.1" - espree "^10.4.0" - estraverse "^5.3.0" - picomatch "^4.0.2" - -"@sveltejs/acorn-typescript@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.5.tgz#f518101d1b2e12ce80854f1cd850d3b9fb91d710" - integrity sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ== - -"@types/detect-indent@0.1.30": - version "0.1.30" - resolved "https://registry.yarnpkg.com/@types/detect-indent/-/detect-indent-0.1.30.tgz#dc682bb412b4e65ba098e70edad73b4833fb910d" - integrity sha512-AUmj9JHuHTD94slY1WR1VulFxRGC6D1pcNCN0MCulKFyiihvV/28lLS8oRHgfmc2Cxq954J8Vmosa8qzm7PLGQ== - -"@types/eslint-scope@^3.7.7": - version "3.7.7" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" - integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "9.6.1" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-9.6.1.tgz#d5795ad732ce81715f27f75da913004a56751584" - integrity sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*", "@types/estree@1.0.8", "@types/estree@^1.0.0", "@types/estree@^1.0.5", "@types/estree@^1.0.6": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" - integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== - -"@types/event-calendar__core@^4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@types/event-calendar__core/-/event-calendar__core-4.4.0.tgz#9a7ae0c7bceb0bcb0c859e9eafe6a16377583b7c" - integrity sha512-8Y4k+acsniRXn1bR0UGgDJE0Qquuk4+Dgx43VS1isIcAK00sfdu2hs726ikuWWzLZGm44ZfYtbq1eM84RtfT4g== - dependencies: - svelte "^5" - -"@types/glob@5.0.30": - version "5.0.30" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-5.0.30.tgz#1026409c5625a8689074602808d082b2867b8a51" - integrity sha512-ZM05wDByI+WA153sfirJyEHoYYoIuZ7lA2dB/Gl8ymmpMTR78fNRtDMqa7Z6SdH4fZdLWZNRE6mZpx3XqBOrHw== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - -"@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.9": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/minimatch@*": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" - integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== - -"@types/mkdirp@0.3.29": - version "0.3.29" - resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.3.29.tgz#7f2ad7ec55f914482fc9b1ec4bb1ae6028d46066" - integrity sha512-QRLQpFsIQGO2k8pupga9abfei85GKotAtQ+F6xuQmSGomUt6C52TyMiTFpP8kUwuPKr00gNtu3itLlC6gvI/NA== - -"@types/mustache@^4.2.6": - version "4.2.6" - resolved "https://registry.yarnpkg.com/@types/mustache/-/mustache-4.2.6.tgz#9d4f903f4ad373699b253aa1369727bc5042811f" - integrity sha512-t+8/QWTAhOFlrF1IVZqKnMRJi84EgkIK5Kh0p2JV4OLywUvCwJPFxbJAl7XAow7DVIHsF+xW9f1MVzg0L6Szjw== - -"@types/node@*", "@types/node@^24.0.3": - version "24.0.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-24.0.7.tgz#ee580f7850c7eabaeef61ef96b8d8c04fdf94f53" - integrity sha512-YIEUUr4yf8q8oQoXPpSlnvKNVKDQlPMWrmOcgzoduo7kvA2UF0/BwJ/eMKFTiTtkNL17I0M6Xe2tvwFU7be6iw== - dependencies: - undici-types "~7.8.0" - -"@types/node@8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.0.tgz#acaa89247afddc7967e9902fd11761dadea1a555" - integrity sha512-j2tekvJCO7j22cs+LO6i0kRPhmQ9MXaPZ55TzOc1lzkN5b6BWqq4AFjl04s1oRRQ1v5rSe+KEvnLUSTonuls/A== - -"@typescript-eslint/eslint-plugin@8.35.0": - version "8.35.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.0.tgz#515170100ff867445fe0a17ce05c14fc5fd9ca63" - integrity sha512-ijItUYaiWuce0N1SoSMrEd0b6b6lYkYt99pqCPfybd+HKVXtEvYhICfLdwp42MhiI5mp0oq7PKEL+g1cNiz/Eg== - dependencies: - "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.35.0" - "@typescript-eslint/type-utils" "8.35.0" - "@typescript-eslint/utils" "8.35.0" - "@typescript-eslint/visitor-keys" "8.35.0" - graphemer "^1.4.0" - ignore "^7.0.0" - natural-compare "^1.4.0" - ts-api-utils "^2.1.0" - -"@typescript-eslint/parser@8.35.0": - version "8.35.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.35.0.tgz#20a0e17778a329a6072722f5ac418d4376b767d2" - integrity sha512-6sMvZePQrnZH2/cJkwRpkT7DxoAWh+g6+GFRK6bV3YQo7ogi3SX5rgF6099r5Q53Ma5qeT7LGmOmuIutF4t3lA== - dependencies: - "@typescript-eslint/scope-manager" "8.35.0" - "@typescript-eslint/types" "8.35.0" - "@typescript-eslint/typescript-estree" "8.35.0" - "@typescript-eslint/visitor-keys" "8.35.0" - debug "^4.3.4" - -"@typescript-eslint/project-service@8.35.0": - version "8.35.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.35.0.tgz#00bd77e6845fbdb5684c6ab2d8a400a58dcfb07b" - integrity sha512-41xatqRwWZuhUMF/aZm2fcUsOFKNcG28xqRSS6ZVr9BVJtGExosLAm5A1OxTjRMagx8nJqva+P5zNIGt8RIgbQ== - dependencies: - "@typescript-eslint/tsconfig-utils" "^8.35.0" - "@typescript-eslint/types" "^8.35.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@8.35.0": - version "8.35.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.35.0.tgz#8ccb2ab63383544fab98fc4b542d8d141259ff4f" - integrity sha512-+AgL5+mcoLxl1vGjwNfiWq5fLDZM1TmTPYs2UkyHfFhgERxBbqHlNjRzhThJqz+ktBqTChRYY6zwbMwy0591AA== - dependencies: - "@typescript-eslint/types" "8.35.0" - "@typescript-eslint/visitor-keys" "8.35.0" - -"@typescript-eslint/tsconfig-utils@8.35.0", "@typescript-eslint/tsconfig-utils@^8.35.0": - version "8.35.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.0.tgz#6e05aeb999999e31d562ceb4fe144f3cbfbd670e" - integrity sha512-04k/7247kZzFraweuEirmvUj+W3bJLI9fX6fbo1Qm2YykuBvEhRTPl8tcxlYO8kZZW+HIXfkZNoasVb8EV4jpA== - -"@typescript-eslint/type-utils@8.35.0": - version "8.35.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.35.0.tgz#0201eae9d83ffcc3451ef8c94f53ecfbf2319ecc" - integrity sha512-ceNNttjfmSEoM9PW87bWLDEIaLAyR+E6BoYJQ5PfaDau37UGca9Nyq3lBk8Bw2ad0AKvYabz6wxc7DMTO2jnNA== - dependencies: - "@typescript-eslint/typescript-estree" "8.35.0" - "@typescript-eslint/utils" "8.35.0" - debug "^4.3.4" - ts-api-utils "^2.1.0" - -"@typescript-eslint/types@8.35.0", "@typescript-eslint/types@^8.34.1", "@typescript-eslint/types@^8.35.0": - version "8.35.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.35.0.tgz#e60d062907930e30008d796de5c4170f02618a93" - integrity sha512-0mYH3emanku0vHw2aRLNGqe7EXh9WHEhi7kZzscrMDf6IIRUQ5Jk4wp1QrledE/36KtdZrVfKnE32eZCf/vaVQ== - -"@typescript-eslint/typescript-estree@8.35.0": - version "8.35.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.0.tgz#86141e6c55b75bc1eaecc0781bd39704de14e52a" - integrity sha512-F+BhnaBemgu1Qf8oHrxyw14wq6vbL8xwWKKMwTMwYIRmFFY/1n/9T/jpbobZL8vp7QyEUcC6xGrnAO4ua8Kp7w== - dependencies: - "@typescript-eslint/project-service" "8.35.0" - "@typescript-eslint/tsconfig-utils" "8.35.0" - "@typescript-eslint/types" "8.35.0" - "@typescript-eslint/visitor-keys" "8.35.0" - debug "^4.3.4" - fast-glob "^3.3.2" - is-glob "^4.0.3" - minimatch "^9.0.4" - semver "^7.6.0" - ts-api-utils "^2.1.0" - -"@typescript-eslint/utils@8.35.0": - version "8.35.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.35.0.tgz#aaf0afab5ab51ea2f1897002907eacd9834606d5" - integrity sha512-nqoMu7WWM7ki5tPgLVsmPM8CkqtoPUG6xXGeefM5t4x3XumOEKMoUZPdi+7F+/EotukN4R9OWdmDxN80fqoZeg== - dependencies: - "@eslint-community/eslint-utils" "^4.7.0" - "@typescript-eslint/scope-manager" "8.35.0" - "@typescript-eslint/types" "8.35.0" - "@typescript-eslint/typescript-estree" "8.35.0" - -"@typescript-eslint/visitor-keys@8.35.0": - version "8.35.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.0.tgz#93e905e7f1e94d26a79771d1b1eb0024cb159dbf" - integrity sha512-zTh2+1Y8ZpmeQaQVIc/ZZxsx8UzgKJyNg1PTvjzC7WMhPSVS8bfDX34k1SrwOf016qd5RU3az2UxUNue3IfQ5g== - dependencies: - "@typescript-eslint/types" "8.35.0" - eslint-visitor-keys "^4.2.1" - -"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6" - integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== - dependencies: - "@webassemblyjs/helper-numbers" "1.13.2" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - -"@webassemblyjs/floating-point-hex-parser@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz#fcca1eeddb1cc4e7b6eed4fc7956d6813b21b9fb" - integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== - -"@webassemblyjs/helper-api-error@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz#e0a16152248bc38daee76dd7e21f15c5ef3ab1e7" - integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== - -"@webassemblyjs/helper-buffer@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz#822a9bc603166531f7d5df84e67b5bf99b72b96b" - integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA== - -"@webassemblyjs/helper-numbers@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz#dbd932548e7119f4b8a7877fd5a8d20e63490b2d" - integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.13.2" - "@webassemblyjs/helper-api-error" "1.13.2" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz#e556108758f448aae84c850e593ce18a0eb31e0b" - integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== - -"@webassemblyjs/helper-wasm-section@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz#9629dda9c4430eab54b591053d6dc6f3ba050348" - integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-buffer" "1.14.1" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/wasm-gen" "1.14.1" - -"@webassemblyjs/ieee754@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz#1c5eaace1d606ada2c7fd7045ea9356c59ee0dba" - integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz#57c5c3deb0105d02ce25fa3fd74f4ebc9fd0bbb0" - integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz#917a20e93f71ad5602966c2d685ae0c6c21f60f1" - integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== - -"@webassemblyjs/wasm-edit@^1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz#ac6689f502219b59198ddec42dcd496b1004d597" - integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-buffer" "1.14.1" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/helper-wasm-section" "1.14.1" - "@webassemblyjs/wasm-gen" "1.14.1" - "@webassemblyjs/wasm-opt" "1.14.1" - "@webassemblyjs/wasm-parser" "1.14.1" - "@webassemblyjs/wast-printer" "1.14.1" - -"@webassemblyjs/wasm-gen@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz#991e7f0c090cb0bb62bbac882076e3d219da9570" - integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/ieee754" "1.13.2" - "@webassemblyjs/leb128" "1.13.2" - "@webassemblyjs/utf8" "1.13.2" - -"@webassemblyjs/wasm-opt@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz#e6f71ed7ccae46781c206017d3c14c50efa8106b" - integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-buffer" "1.14.1" - "@webassemblyjs/wasm-gen" "1.14.1" - "@webassemblyjs/wasm-parser" "1.14.1" - -"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz#b3e13f1893605ca78b52c68e54cf6a865f90b9fb" - integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-api-error" "1.13.2" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/ieee754" "1.13.2" - "@webassemblyjs/leb128" "1.13.2" - "@webassemblyjs/utf8" "1.13.2" - -"@webassemblyjs/wast-printer@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz#3bb3e9638a8ae5fdaf9610e7a06b4d9f9aa6fe07" - integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@xtuc/long" "4.2.2" - -"@webpack-cli/configtest@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-3.0.1.tgz#76ac285b9658fa642ce238c276264589aa2b6b57" - integrity sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA== - -"@webpack-cli/info@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-3.0.1.tgz#3cff37fabb7d4ecaab6a8a4757d3826cf5888c63" - integrity sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ== - -"@webpack-cli/serve@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-3.0.1.tgz#bd8b1f824d57e30faa19eb78e4c0951056f72f00" - integrity sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg== - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn@^8.12.1, acorn@^8.14.0, acorn@^8.15.0: - version "8.15.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" - integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv-keywords@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.0, ajv@^8.9.0: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" - integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== - dependencies: - fast-deep-equal "^3.1.3" - fast-uri "^3.0.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" - integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -aria-query@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.2.tgz#93f81a43480e33a338f19163a3d10a50c01dcd59" - integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== - -asn1.js@^4.10.1: - version "4.10.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" - integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -assert@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-2.1.0.tgz#6d92a238d05dc02e7427c881fb8be81c8448b2dd" - integrity sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw== - dependencies: - call-bind "^1.0.2" - is-nan "^1.3.2" - object-is "^1.1.5" - object.assign "^4.1.4" - util "^0.12.5" - -autolinker@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-4.1.5.tgz#e0d45f04c41d62598bf80b809c422f732d3aafde" - integrity sha512-vEfYZPmvVOIuE567XBVCsx8SBgOYtjB2+S1iAaJ+HgH+DNjAcrHem2hmAeC9yaNGWayicv4yR+9UaJlkF3pvtw== - dependencies: - tslib "^2.8.1" - -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - -axobject-query@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-4.1.0.tgz#28768c76d0e3cff21bc62a9e2d0b6ac30042a1ee" - integrity sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base-64@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/base-64/-/base-64-1.0.0.tgz#09d0f2084e32a3fd08c2475b973788eee6ae8f4a" - integrity sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: - version "4.12.2" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.2.tgz#3d8fed6796c24e177737f7cc5172ee04ef39ec99" - integrity sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw== - -bn.js@^5.2.1: - version "5.2.2" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.2.tgz#82c09f9ebbb17107cd72cb7fd39bd1f9d0aaa566" - integrity sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw== - -brace-expansion@^1.1.7: - version "1.1.12" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" - integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" - integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -brorand@^1.0.1, brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== - -browser-resolve@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-2.0.0.tgz#99b7304cb392f8d73dba741bb2d7da28c6d7842b" - integrity sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ== - dependencies: - resolve "^1.17.0" - -browserify-aes@^1.0.4, browserify-aes@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.1.tgz#06e530907fe2949dc21fc3c2e2302e10b1437238" - integrity sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ== - dependencies: - bn.js "^5.2.1" - randombytes "^2.1.0" - safe-buffer "^5.2.1" - -browserify-sign@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.3.tgz#7afe4c01ec7ee59a89a558a4b75bd85ae62d4208" - integrity sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw== - dependencies: - bn.js "^5.2.1" - browserify-rsa "^4.1.0" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.5" - hash-base "~3.0" - inherits "^2.0.4" - parse-asn1 "^5.1.7" - readable-stream "^2.3.8" - safe-buffer "^5.2.1" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" - -browserslist@^4.24.0: - version "4.25.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.25.1.tgz#ba9e8e6f298a1d86f829c9b975e07948967bb111" - integrity sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw== - dependencies: - caniuse-lite "^1.0.30001726" - electron-to-chromium "^1.5.173" - node-releases "^2.0.19" - update-browserslist-db "^1.1.3" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== - -buffer@^5.7.1: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== - -call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" - integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - -call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.7, call-bind@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" - integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== - dependencies: - call-bind-apply-helpers "^1.0.0" - es-define-property "^1.0.0" - get-intrinsic "^1.2.4" - set-function-length "^1.2.2" - -call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" - integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== - dependencies: - call-bind-apply-helpers "^1.0.2" - get-intrinsic "^1.3.0" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -caniuse-lite@^1.0.30001726: - version "1.0.30001726" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001726.tgz#a15bd87d5a4bf01f6b6f70ae7c97fdfd28b5ae47" - integrity sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw== - -chalk@^4.0.0, chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chokidar@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" - integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== - dependencies: - readdirp "^4.0.1" - -chrome-trace-event@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" - integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.6.tgz#8fe672437d01cd6c4561af5334e0cc50ff1955f7" - integrity sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw== - dependencies: - inherits "^2.0.4" - safe-buffer "^5.2.1" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -clsx@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" - integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colorette@^2.0.14: - version "2.0.20" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - -commander@^12.1.0: - version "12.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" - integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== - -commander@^2.20.0, commander@^2.9.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -console-browserify@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" - integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== - -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -create-ecdh@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - -create-hash@^1.1.0, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hash@~1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" - integrity sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - ripemd160 "^2.0.0" - sha.js "^2.4.0" - -create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -create-require@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-fetch@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-4.1.0.tgz#8f69355007ee182e47fa692ecbaa37a52e43c3d2" - integrity sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw== - dependencies: - node-fetch "^2.7.0" - -cross-spawn@^7.0.3, cross-spawn@^7.0.6: - version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" - integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crypto-browserify@^3.12.1: - version "3.12.1" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.1.tgz#bb8921bec9acc81633379aa8f52d69b0b69e0dac" - integrity sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ== - dependencies: - browserify-cipher "^1.0.1" - browserify-sign "^4.2.3" - create-ecdh "^4.0.4" - create-hash "^1.2.0" - create-hmac "^1.1.7" - diffie-hellman "^5.0.3" - hash-base "~3.0.4" - inherits "^2.0.4" - pbkdf2 "^3.1.2" - public-encrypt "^4.0.3" - randombytes "^2.1.0" - randomfill "^1.0.4" - -css-loader@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-7.1.2.tgz#64671541c6efe06b0e22e750503106bdd86880f8" - integrity sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA== - dependencies: - icss-utils "^5.1.0" - postcss "^8.4.33" - postcss-modules-extract-imports "^3.1.0" - postcss-modules-local-by-default "^4.0.5" - postcss-modules-scope "^3.2.0" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.2.0" - semver "^7.5.4" - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -debug@4.4.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.4.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" - integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== - dependencies: - ms "^2.1.3" - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -define-data-property@^1.0.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-properties@^1.1.3, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -des.js@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da" - integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -detect-indent@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-0.2.0.tgz#042914498979ac2d9f3c73e4ff3e6877d3bc92b6" - integrity sha512-C6jyrDu/eGH4KT0ZxAzijiH+ts5YLy7DqGFoDuHGxZjMOdjzRltp3jByySnpFBVIy4Em0ZkLN8tIV6mcREdw5A== - dependencies: - get-stdin "^0.1.0" - minimist "^0.1.0" - -diffie-hellman@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -domain-browser@4.22.0: - version "4.22.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-4.22.0.tgz#6ddd34220ec281f9a65d3386d267ddd35c491f9f" - integrity sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw== - -dts-bundle-webpack@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/dts-bundle-webpack/-/dts-bundle-webpack-1.0.2.tgz#c50439a89e71fd9e42800092561c05d5c3ea9ea6" - integrity sha512-/gBQBu5spW8BsGKyYwZeDb+gzDsipisf4Hg0ERPrrS0661cYajVUHARwvts/vfvG5wuv+p295byoNl2da+Re6w== - dependencies: - dts-bundle "^0.7.3" - -dts-bundle@^0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/dts-bundle/-/dts-bundle-0.7.3.tgz#372b7bb69c820782e6382f400739a69dced3d59a" - integrity sha512-EEAEuPRk8QyKhoN90NHTh+spSQujkkvOnKWUfuzpmC/fgryiWopL1SegSktx0UsoPfNidIGVDN7/AXpBDBv0WQ== - dependencies: - "@types/detect-indent" "0.1.30" - "@types/glob" "5.0.30" - "@types/mkdirp" "0.3.29" - "@types/node" "8.0.0" - commander "^2.9.0" - detect-indent "^0.2.0" - glob "^6.0.4" - mkdirp "^0.5.0" - -dunder-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" - integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== - dependencies: - call-bind-apply-helpers "^1.0.1" - es-errors "^1.3.0" - gopd "^1.2.0" - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -electron-to-chromium@^1.5.173: - version "1.5.177" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.177.tgz#db730d8254959184e65320a3a0b7edcd29c54f60" - integrity sha512-7EH2G59nLsEMj97fpDuvVcYi6lwTcM1xuWw3PssD8xzboAW7zj7iB3COEEEATUfjLHrs5uKBLQT03V/8URx06g== - -elliptic@^6.5.3, elliptic@^6.5.5: - version "6.6.1" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.1.tgz#3b8ffb02670bf69e382c7f65bf524c97c5405c06" - integrity sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -email-addresses@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/email-addresses/-/email-addresses-5.0.0.tgz#7ae9e7f58eef7d5e3e2c2c2d3ea49b78dc854fa6" - integrity sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -enhanced-resolve@^5.0.0, enhanced-resolve@^5.17.1: - version "5.18.2" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz#7903c5b32ffd4b2143eeb4b92472bd68effd5464" - integrity sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -envinfo@^7.14.0: - version "7.14.0" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.14.0.tgz#26dac5db54418f2a4c1159153a0b2ae980838aae" - integrity sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg== - -es-define-property@^1.0.0, es-define-property@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" - integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-module-lexer@^1.2.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz#9159601561880a85f2734560a9099b2c31e5372a" - integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== - -es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" - integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== - dependencies: - es-errors "^1.3.0" - -esbuild@^0.25.0: - version "0.25.5" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.5.tgz#71075054993fdfae76c66586f9b9c1f8d7edd430" - integrity sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ== - optionalDependencies: - "@esbuild/aix-ppc64" "0.25.5" - "@esbuild/android-arm" "0.25.5" - "@esbuild/android-arm64" "0.25.5" - "@esbuild/android-x64" "0.25.5" - "@esbuild/darwin-arm64" "0.25.5" - "@esbuild/darwin-x64" "0.25.5" - "@esbuild/freebsd-arm64" "0.25.5" - "@esbuild/freebsd-x64" "0.25.5" - "@esbuild/linux-arm" "0.25.5" - "@esbuild/linux-arm64" "0.25.5" - "@esbuild/linux-ia32" "0.25.5" - "@esbuild/linux-loong64" "0.25.5" - "@esbuild/linux-mips64el" "0.25.5" - "@esbuild/linux-ppc64" "0.25.5" - "@esbuild/linux-riscv64" "0.25.5" - "@esbuild/linux-s390x" "0.25.5" - "@esbuild/linux-x64" "0.25.5" - "@esbuild/netbsd-arm64" "0.25.5" - "@esbuild/netbsd-x64" "0.25.5" - "@esbuild/openbsd-arm64" "0.25.5" - "@esbuild/openbsd-x64" "0.25.5" - "@esbuild/sunos-x64" "0.25.5" - "@esbuild/win32-arm64" "0.25.5" - "@esbuild/win32-ia32" "0.25.5" - "@esbuild/win32-x64" "0.25.5" - -escalade@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" - integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-scope@^8.4.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.4.0.tgz#88e646a207fad61436ffa39eb505147200655c82" - integrity sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint-visitor-keys@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" - integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== - -eslint@^9.29.0: - version "9.30.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.30.0.tgz#fb0c655f5e28fc1b2f4050c28efa1876d78034fc" - integrity sha512-iN/SiPxmQu6EVkf+m1qpBxzUhE12YqFLOSySuOyVLJLEF9nzTf+h/1AJYc1JWzCnktggeNrjvQGLngDzXirU6g== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.12.1" - "@eslint/config-array" "^0.21.0" - "@eslint/config-helpers" "^0.3.0" - "@eslint/core" "^0.14.0" - "@eslint/eslintrc" "^3.3.1" - "@eslint/js" "9.30.0" - "@eslint/plugin-kit" "^0.3.1" - "@humanfs/node" "^0.16.6" - "@humanwhocodes/module-importer" "^1.0.1" - "@humanwhocodes/retry" "^0.4.2" - "@types/estree" "^1.0.6" - "@types/json-schema" "^7.0.15" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.6" - debug "^4.3.2" - escape-string-regexp "^4.0.0" - eslint-scope "^8.4.0" - eslint-visitor-keys "^4.2.1" - espree "^10.4.0" - esquery "^1.5.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^8.0.0" - find-up "^5.0.0" - glob-parent "^6.0.2" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - json-stable-stringify-without-jsonify "^1.0.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - -esm-env@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/esm-env/-/esm-env-1.2.2.tgz#263c9455c55861f41618df31b20cb571fc20b75e" - integrity sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA== - -espree@^10.0.1, espree@^10.4.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-10.4.0.tgz#d54f4949d4629005a1fa168d937c3ff1f7e2a837" - integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== - dependencies: - acorn "^8.15.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^4.2.1" - -esquery@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" - integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== - dependencies: - estraverse "^5.1.0" - -esrap@^1.4.8: - version "1.4.9" - resolved "https://registry.yarnpkg.com/esrap/-/esrap-1.4.9.tgz#350362c55d8c83b263edfb0fd48dac95162167de" - integrity sha512-3OMlcd0a03UGuZpPeUC1HxR3nA23l+HEyCiZw3b3FumJIN9KphoGzDJKMXI1S72jVS1dsenDyQC0kJlO1U9E1g== - dependencies: - "@jridgewell/sourcemap-codec" "^1.4.15" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -estree-walker@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" - integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -events@^3.0.0, events@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.3.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" - integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.8" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fast-uri@^3.0.1: - version "3.0.6" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748" - integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== - -fastest-levenshtein@^1.0.12: - version "1.0.16" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" - integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== - -fastq@^1.6.0: - version "1.19.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" - integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== - dependencies: - reusify "^1.0.4" - -fdir@^6.4.4: - version "6.4.6" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.6.tgz#2b268c0232697063111bbf3f64810a2a741ba281" - integrity sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w== - -file-entry-cache@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" - integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== - dependencies: - flat-cache "^4.0.0" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" - integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.4" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -flatted@^3.2.9: - version "3.3.3" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" - integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== - -for-each@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" - integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== - dependencies: - is-callable "^1.2.7" - -foreground-child@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" - integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== - dependencies: - cross-spawn "^7.0.6" - signal-exit "^4.0.1" - -fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" - integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== - dependencies: - call-bind-apply-helpers "^1.0.2" - es-define-property "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - function-bind "^1.1.2" - get-proto "^1.0.1" - gopd "^1.2.0" - has-symbols "^1.1.0" - hasown "^2.0.2" - math-intrinsics "^1.1.0" - -get-proto@^1.0.0, get-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" - integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== - dependencies: - dunder-proto "^1.0.1" - es-object-atoms "^1.0.0" - -get-stdin@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-0.1.0.tgz#5998af24aafc802d15c82c685657eeb8b10d4a91" - integrity sha512-/WBu3IaQZxE3bs3BhBmR10ipDY4pjN+U4EZgXULa1eqKA0B/Lka/MVoAqhTVYBkkRlCrEGDOU9itrzIgm9Ksng== - -glob-parent@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@^11.0.0: - version "11.0.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-11.0.3.tgz#9d8087e6d72ddb3c4707b1d2778f80ea3eaefcd6" - integrity sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA== - dependencies: - foreground-child "^3.3.1" - jackspeak "^4.1.1" - minimatch "^10.0.3" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^2.0.0" - -glob@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" - integrity sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A== - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" - integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== - -globals@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-16.2.0.tgz#19efcd1ddde2bd5efce128e5c2e441df1abc6f7c" - integrity sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg== - -gopd@^1.0.1, gopd@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" - integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== - -graceful-fs@^4.1.2, graceful-fs@^4.2.11, graceful-fs@^4.2.4: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-symbols@^1.0.3, has-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" - integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== - -has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -hash-base@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" - integrity sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw== - dependencies: - inherits "^2.0.1" - -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash-base@~3.0, hash-base@~3.0.4: - version "3.0.5" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.5.tgz#52480e285395cf7fba17dc4c9e47acdc7f248a8a" - integrity sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg== - dependencies: - inherits "^2.0.4" - safe-buffer "^5.2.1" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== - -ical.js@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ical.js/-/ical.js-2.2.0.tgz#9c0c2d44c34e34104cc2dc8d24a2e13c0519ac9f" - integrity sha512-P8gjWkTEd5M/SEEvBVPPO/KC+V+HRNRZh3xfCDTVWmUTEfVbL8JaK5GTWS2MJ55aLMhfXhbh7kYzd0nrBARjsA== - -icss-utils@^5.0.0, icss-utils@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^5.2.0: - version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== - -ignore@^7.0.0: - version "7.0.5" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" - integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== - -import-fresh@^3.2.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" - integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-local@^3.0.2: - version "3.2.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" - integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -interpret@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" - integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== - -is-arguments@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.2.0.tgz#ad58c6aecf563b78ef2bf04df540da8f5d7d8e1b" - integrity sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA== - dependencies: - call-bound "^1.0.2" - has-tostringtag "^1.0.2" - -is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.16.0: - version "2.16.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" - integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== - dependencies: - hasown "^2.0.2" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-function@^1.0.7: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.0.tgz#bf3eeda931201394f57b5dba2800f91a238309ca" - integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ== - dependencies: - call-bound "^1.0.3" - get-proto "^1.0.0" - has-tostringtag "^1.0.2" - safe-regex-test "^1.1.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-nan@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" - integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-reference@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-3.0.3.tgz#9ef7bf9029c70a67b2152da4adf57c23d718910f" - integrity sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw== - dependencies: - "@types/estree" "^1.0.6" - -is-regex@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" - integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== - dependencies: - call-bound "^1.0.2" - gopd "^1.2.0" - has-tostringtag "^1.0.2" - hasown "^2.0.2" - -is-typed-array@^1.1.14, is-typed-array@^1.1.3: - version "1.1.15" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" - integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== - dependencies: - which-typed-array "^1.1.16" - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - -isomorphic-timers-promises@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/isomorphic-timers-promises/-/isomorphic-timers-promises-1.0.1.tgz#e4137c24dbc54892de8abae3a4b5c1ffff381598" - integrity sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ== - -jackspeak@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-4.1.1.tgz#96876030f450502047fc7e8c7fcf8ce8124e43ae" - integrity sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ== - dependencies: - "@isaacs/cliui" "^8.0.2" - -jest-worker@^27.4.5: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-parse-even-better-errors@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -keyv@^4.5.4: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -loader-runner@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" - integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== - -locate-character@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-character/-/locate-character-3.0.0.tgz#0305c5b8744f61028ef5d01f444009e00779f974" - integrity sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA== - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lru-cache@^11.0.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.1.0.tgz#afafb060607108132dbc1cf8ae661afb69486117" - integrity sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A== - -magic-string@^0.30.11, magic-string@^0.30.3: - version "0.30.17" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" - integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - -math-intrinsics@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" - integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -mdn-data@2.21.0: - version "2.21.0" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.21.0.tgz#f3a495e8b1e60cb4fbeaf9136aefba2f987a56e1" - integrity sha512-+ZKPQezM5vYJIkCxaC+4DTnRrVZR1CgsKLu5zsQERQx6Tea8Y+wMx5A24rq8A8NepCeatIQufVAekKNgiBMsGQ== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.0, micromatch@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.27: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== - -"minimatch@2 || 3", minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^10.0.3: - version "10.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.3.tgz#cf7a0314a16c4d9ab73a7730a0e8e3c3502d47aa" - integrity sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw== - dependencies: - "@isaacs/brace-expansion" "^5.0.0" - -minimatch@^9.0.4: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -minimist@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.1.0.tgz#99df657a52574c21c9057497df742790b2b4c0de" - integrity sha512-wR5Ipl99t0mTGwLjQJnBjrP/O7zBbLZqvA3aw32DmLx+nXHfWctUjzDjnDx09pX1Po86WFQazF9xUzfMea3Cnw== - -minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - -mkdirp@^0.5.0: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -mustache@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" - integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== - -nanoid@^3.3.11: - version "3.3.11" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" - integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -node-fetch@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -node-polyfill-webpack-plugin@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-4.1.0.tgz#13115d0e3b1c99d978acffeb8cd3aab55d2a9203" - integrity sha512-b4ei444EKkOagG/yFqojrD3QTYM5IOU1f8tn9o6uwrG4qL+brI7oVhjPVd0ZL2xy+Z6CP5bu9w8XTvlWgiXHcw== - dependencies: - node-stdlib-browser "^1.3.0" - type-fest "^4.27.0" - -node-releases@^2.0.19: - version "2.0.19" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" - integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== - -node-stdlib-browser@^1.2.0, node-stdlib-browser@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/node-stdlib-browser/-/node-stdlib-browser-1.3.1.tgz#f41fa554f720a3df951e40339f4d92ac512222ac" - integrity sha512-X75ZN8DCLftGM5iKwoYLA3rjnrAEs97MkzvSd4q2746Tgpg8b8XWiBGiBG4ZpgcAqBgtgPHTiAc8ZMCvZuikDw== - dependencies: - assert "^2.0.0" - browser-resolve "^2.0.0" - browserify-zlib "^0.2.0" - buffer "^5.7.1" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - create-require "^1.1.1" - crypto-browserify "^3.12.1" - domain-browser "4.22.0" - events "^3.0.0" - https-browserify "^1.0.0" - isomorphic-timers-promises "^1.0.1" - os-browserify "^0.3.0" - path-browserify "^1.0.1" - pkg-dir "^5.0.0" - process "^0.11.10" - punycode "^1.4.1" - querystring-es3 "^0.2.1" - readable-stream "^3.6.0" - stream-browserify "^3.0.0" - stream-http "^3.2.0" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.1" - url "^0.11.4" - util "^0.12.4" - vm-browserify "^1.0.1" - -npm-run-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-6.0.0.tgz#25cfdc4eae04976f3349c0b1afc089052c362537" - integrity sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA== - dependencies: - path-key "^4.0.0" - unicorn-magic "^0.3.0" - -object-inspect@^1.13.3: - version "1.13.4" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" - integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== - -object-is@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" - integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.4: - version "4.1.7" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" - integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - has-symbols "^1.1.0" - object-keys "^1.1.1" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.5" - -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -package-json-from-dist@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" - integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== - -pako@~1.0.5: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-asn1@^5.0.0, parse-asn1@^5.1.7: - version "5.1.7" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.7.tgz#73cdaaa822125f9647165625eb45f8a051d2df06" - integrity sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg== - dependencies: - asn1.js "^4.10.1" - browserify-aes "^1.2.0" - evp_bytestokey "^1.0.3" - hash-base "~3.0" - pbkdf2 "^3.1.2" - safe-buffer "^5.2.1" - -path-browserify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" - integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-scurry@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.0.tgz#9f052289f23ad8bf9397a2a0425e7b8615c58580" - integrity sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg== - dependencies: - lru-cache "^11.0.0" - minipass "^7.1.2" - -pbkdf2@^3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.3.tgz#8be674d591d65658113424592a95d1517318dd4b" - integrity sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA== - dependencies: - create-hash "~1.1.3" - create-hmac "^1.1.7" - ripemd160 "=2.0.1" - safe-buffer "^5.2.1" - sha.js "^2.4.11" - to-buffer "^1.2.0" - -picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -picomatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" - integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -pkg-dir@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760" - integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA== - dependencies: - find-up "^5.0.0" - -possible-typed-array-names@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" - integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== - -postcss-modules-extract-imports@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz#b4497cb85a9c0c4b5aabeb759bb25e8d89f15002" - integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== - -postcss-modules-local-by-default@^4.0.5: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz#d150f43837831dae25e4085596e84f6f5d6ec368" - integrity sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^7.0.0" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz#1bbccddcb398f1d7a511e0a2d1d047718af4078c" - integrity sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA== - dependencies: - postcss-selector-parser "^7.0.0" - -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== - dependencies: - icss-utils "^5.0.0" - -postcss-selector-parser@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz#4d6af97eba65d73bc4d84bcb343e865d7dd16262" - integrity sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@^8.4.33, postcss@^8.5.3: - version "8.5.6" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" - integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== - dependencies: - nanoid "^3.3.11" - picocolors "^1.1.1" - source-map-js "^1.2.1" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - -public-encrypt@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -qs@^6.12.3: - version "6.14.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930" - integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== - dependencies: - side-channel "^1.1.0" - -querystring-es3@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -readable-stream@^2.3.8: - version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.5.0, readable-stream@^3.6.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@^4.0.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" - integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== - -rechoir@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" - integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== - dependencies: - resolve "^1.20.0" - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve@^1.17.0, resolve@^1.20.0: - version "1.22.10" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" - integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== - dependencies: - is-core-module "^2.16.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -reusify@^1.0.4: - version "1.1.0" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" - integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== - -rimraf@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-6.0.1.tgz#ffb8ad8844dd60332ab15f52bc104bc3ed71ea4e" - integrity sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A== - dependencies: - glob "^11.0.0" - package-json-from-dist "^1.0.0" - -ripemd160@=2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" - integrity sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w== - dependencies: - hash-base "^2.0.0" - inherits "^2.0.1" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -rollup@^4.34.9: - version "4.44.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.44.1.tgz#641723932894e7acbe6052aea34b8e72ef8b7c8f" - integrity sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg== - dependencies: - "@types/estree" "1.0.8" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.44.1" - "@rollup/rollup-android-arm64" "4.44.1" - "@rollup/rollup-darwin-arm64" "4.44.1" - "@rollup/rollup-darwin-x64" "4.44.1" - "@rollup/rollup-freebsd-arm64" "4.44.1" - "@rollup/rollup-freebsd-x64" "4.44.1" - "@rollup/rollup-linux-arm-gnueabihf" "4.44.1" - "@rollup/rollup-linux-arm-musleabihf" "4.44.1" - "@rollup/rollup-linux-arm64-gnu" "4.44.1" - "@rollup/rollup-linux-arm64-musl" "4.44.1" - "@rollup/rollup-linux-loongarch64-gnu" "4.44.1" - "@rollup/rollup-linux-powerpc64le-gnu" "4.44.1" - "@rollup/rollup-linux-riscv64-gnu" "4.44.1" - "@rollup/rollup-linux-riscv64-musl" "4.44.1" - "@rollup/rollup-linux-s390x-gnu" "4.44.1" - "@rollup/rollup-linux-x64-gnu" "4.44.1" - "@rollup/rollup-linux-x64-musl" "4.44.1" - "@rollup/rollup-win32-arm64-msvc" "4.44.1" - "@rollup/rollup-win32-ia32-msvc" "4.44.1" - "@rollup/rollup-win32-x64-msvc" "4.44.1" - fsevents "~2.3.2" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-regex-test@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" - integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - is-regex "^1.2.1" - -sax@^1.2.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f" - integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== - -schema-utils@^4.3.0, schema-utils@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.2.tgz#0c10878bf4a73fd2b1dfd14b9462b26788c806ae" - integrity sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.9.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.1.0" - -semver@^7.3.4, semver@^7.5.4, semver@^7.6.0: - version "7.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" - integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== - -serialize-javascript@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" - integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== - dependencies: - randombytes "^2.1.0" - -set-function-length@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -setimmediate@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - -sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -side-channel-list@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" - integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== - dependencies: - es-errors "^1.3.0" - object-inspect "^1.13.3" - -side-channel-map@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" - integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - get-intrinsic "^1.2.5" - object-inspect "^1.13.3" - -side-channel-weakmap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" - integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - get-intrinsic "^1.2.5" - object-inspect "^1.13.3" - side-channel-map "^1.0.1" - -side-channel@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" - integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== - dependencies: - es-errors "^1.3.0" - object-inspect "^1.13.3" - side-channel-list "^1.0.0" - side-channel-map "^1.0.1" - side-channel-weakmap "^1.0.2" - -signal-exit@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -source-map-js@^1.0.1, source-map-js@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" - integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== - -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@^0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" - integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== - -stream-browserify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" - integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== - dependencies: - inherits "~2.0.4" - readable-stream "^3.5.0" - -stream-http@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.2.0.tgz#1872dfcf24cb15752677e40e5c3f9cc1926028b5" - integrity sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.4" - readable-stream "^3.6.0" - xtend "^4.0.2" - -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string_decoder@^1.0.0, string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1, strip-ansi@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -style-loader@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-4.0.0.tgz#0ea96e468f43c69600011e0589cb05c44f3b17a5" - integrity sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA== - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -svelte@^5, svelte@^5.34.8: - version "5.34.9" - resolved "https://registry.yarnpkg.com/svelte/-/svelte-5.34.9.tgz#c649e45821679c70c2c5cedf1ba1a2355dcb02bf" - integrity sha512-sld35zFpooaSRSj4qw8Vl/cyyK0/sLQq9qhJ7BGZo/Kd0ggYtEnvNYLlzhhoqYsYQzA0hJqkzt3RBO/8KoTZOg== - dependencies: - "@ampproject/remapping" "^2.3.0" - "@jridgewell/sourcemap-codec" "^1.5.0" - "@sveltejs/acorn-typescript" "^1.0.5" - "@types/estree" "^1.0.5" - acorn "^8.12.1" - aria-query "^5.3.1" - axobject-query "^4.1.0" - clsx "^2.1.1" - esm-env "^1.2.1" - esrap "^1.4.8" - is-reference "^3.0.3" - locate-character "^3.0.0" - magic-string "^0.30.11" - zimmerframe "^1.1.2" - -tapable@^2.1.1, tapable@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.2.tgz#ab4984340d30cb9989a490032f086dbb8b56d872" - integrity sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg== - -terser-webpack-plugin@^5.3.11: - version "5.3.14" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz#9031d48e57ab27567f02ace85c7d690db66c3e06" - integrity sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw== - dependencies: - "@jridgewell/trace-mapping" "^0.3.25" - jest-worker "^27.4.5" - schema-utils "^4.3.0" - serialize-javascript "^6.0.2" - terser "^5.31.1" - -terser@^5.31.1: - version "5.43.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.43.1.tgz#88387f4f9794ff1a29e7ad61fb2932e25b4fdb6d" - integrity sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg== - dependencies: - "@jridgewell/source-map" "^0.3.3" - acorn "^8.14.0" - commander "^2.20.0" - source-map-support "~0.5.20" - -timers-browserify@^2.0.4: - version "2.0.12" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" - integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== - dependencies: - setimmediate "^1.0.4" - -timezones-ical-library@^1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/timezones-ical-library/-/timezones-ical-library-1.10.0.tgz#7cbfcae7d670c28f1ce2b2a0fcc04995d45c0799" - integrity sha512-aSwylC0FyyxMqMjkuaYz56HBhhooYabGT74CbTuY1uOeIcBXSQTXf+u/mTR0MWJFPQDe21REjex+4wt0OdFDpA== - -tiny-invariant@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" - integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== - -tinyglobby@^0.2.13: - version "0.2.14" - resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.14.tgz#5280b0cf3f972b050e74ae88406c0a6a58f4079d" - integrity sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ== - dependencies: - fdir "^6.4.4" - picomatch "^4.0.2" - -to-buffer@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.2.1.tgz#2ce650cdb262e9112a18e65dc29dcb513c8155e0" - integrity sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ== - dependencies: - isarray "^2.0.5" - safe-buffer "^5.2.1" - typed-array-buffer "^1.0.3" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -ts-api-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz#595f7094e46eed364c13fd23e75f9513d29baf91" - integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ== - -ts-ics@^2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/ts-ics/-/ts-ics-2.1.8.tgz#801cdb1ab716e58187ab80f340440d7d79e85230" - integrity sha512-OxmvHHVe2mx1KPRODbtkguA/x4A5abqoDfEc3/+78+jJ0ilrdgXahkf773dn2ZmMGnK4+d5/hWSX2N1HsPyI+w== - dependencies: - "@standard-schema/spec" "^1.0.0" - -ts-loader@^9.5.2: - version "9.5.2" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.5.2.tgz#1f3d7f4bb709b487aaa260e8f19b301635d08020" - integrity sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw== - dependencies: - chalk "^4.1.0" - enhanced-resolve "^5.0.0" - micromatch "^4.0.0" - semver "^7.3.4" - source-map "^0.7.4" - -tsdav@^2.1.4: - version "2.1.5" - resolved "https://registry.yarnpkg.com/tsdav/-/tsdav-2.1.5.tgz#6658e57a8fd3b56030c226d2a835336eb02207b3" - integrity sha512-ZUNFysY8Dr11I7aVpFmjk6apvHCMSmOPKGz8Wc1F/8BPn/kVS50LR2T8eCsdF5u+h8hrZrQhC0HWD5d2CCov+g== - dependencies: - base-64 "1.0.0" - cross-fetch "4.1.0" - debug "4.4.1" - xml-js "1.6.11" - -tslib@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== - -tty-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" - integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-fest@^4.27.0: - version "4.41.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.41.0.tgz#6ae1c8e5731273c2bf1f58ad39cbae2c91a46c58" - integrity sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA== - -typed-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" - integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - is-typed-array "^1.1.14" - -typescript-eslint@^8.35.0: - version "8.35.0" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.35.0.tgz#65afcdde973614b8f44fa89293919420ca9b904e" - integrity sha512-uEnz70b7kBz6eg/j0Czy6K5NivaYopgxRjsnAJ2Fx5oTLo3wefTHIbL7AkQr1+7tJCRVpTs/wiM8JR/11Loq9A== - dependencies: - "@typescript-eslint/eslint-plugin" "8.35.0" - "@typescript-eslint/parser" "8.35.0" - "@typescript-eslint/utils" "8.35.0" - -typescript@^5.8.3: - version "5.8.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.3.tgz#92f8a3e5e3cf497356f4178c34cd65a7f5e8440e" - integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== - -undici-types@~7.8.0: - version "7.8.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.8.0.tgz#de00b85b710c54122e44fbfd911f8d70174cd294" - integrity sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw== - -unicorn-magic@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.3.0.tgz#4efd45c85a69e0dd576d25532fbfa22aa5c8a104" - integrity sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA== - -update-browserslist-db@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" - integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== - dependencies: - escalade "^3.2.0" - picocolors "^1.1.1" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url@^0.11.4: - version "0.11.4" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.4.tgz#adca77b3562d56b72746e76b330b7f27b6721f3c" - integrity sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg== - dependencies: - punycode "^1.4.1" - qs "^6.12.3" - -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -util@^0.12.4, util@^0.12.5: - version "0.12.5" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" - integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - which-typed-array "^1.1.2" - -vite-plugin-checker@^0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/vite-plugin-checker/-/vite-plugin-checker-0.9.3.tgz#f6665dba3d6fa8ef5a559e35e546abc33e5f6074" - integrity sha512-Tf7QBjeBtG7q11zG0lvoF38/2AVUzzhMNu+Wk+mcsJ00Rk/FpJ4rmUviVJpzWkagbU13cGXvKpt7CMiqtxVTbQ== - dependencies: - "@babel/code-frame" "^7.27.1" - chokidar "^4.0.3" - npm-run-path "^6.0.0" - picocolors "^1.1.1" - picomatch "^4.0.2" - strip-ansi "^7.1.0" - tiny-invariant "^1.3.3" - tinyglobby "^0.2.13" - vscode-uri "^3.1.0" - -vite-plugin-node-polyfills@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/vite-plugin-node-polyfills/-/vite-plugin-node-polyfills-0.23.0.tgz#99d0d1524fa75ce5c7bb1fc8af30283379e9c684" - integrity sha512-4n+Ys+2bKHQohPBKigFlndwWQ5fFKwaGY6muNDMTb0fSQLyBzS+jjUNRZG9sKF0S/Go4ApG6LFnUGopjkILg3w== - dependencies: - "@rollup/plugin-inject" "^5.0.5" - node-stdlib-browser "^1.2.0" - -vite@^6.3.5: - version "6.3.5" - resolved "https://registry.yarnpkg.com/vite/-/vite-6.3.5.tgz#fec73879013c9c0128c8d284504c6d19410d12a3" - integrity sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ== - dependencies: - esbuild "^0.25.0" - fdir "^6.4.4" - picomatch "^4.0.2" - postcss "^8.5.3" - rollup "^4.34.9" - tinyglobby "^0.2.13" - optionalDependencies: - fsevents "~2.3.3" - -vm-browserify@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" - integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== - -vscode-uri@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.1.0.tgz#dd09ec5a66a38b5c3fffc774015713496d14e09c" - integrity sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ== - -watchpack@^2.4.1: - version "2.4.4" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.4.tgz#473bda72f0850453da6425081ea46fc0d7602947" - integrity sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -webpack-cli@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-6.0.1.tgz#a1ce25da5ba077151afd73adfa12e208e5089207" - integrity sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw== - dependencies: - "@discoveryjs/json-ext" "^0.6.1" - "@webpack-cli/configtest" "^3.0.1" - "@webpack-cli/info" "^3.0.1" - "@webpack-cli/serve" "^3.0.1" - colorette "^2.0.14" - commander "^12.1.0" - cross-spawn "^7.0.3" - envinfo "^7.14.0" - fastest-levenshtein "^1.0.12" - import-local "^3.0.2" - interpret "^3.1.1" - rechoir "^0.8.0" - webpack-merge "^6.0.1" - -webpack-merge@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-6.0.1.tgz#50c776868e080574725abc5869bd6e4ef0a16c6a" - integrity sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg== - dependencies: - clone-deep "^4.0.1" - flat "^5.0.2" - wildcard "^2.0.1" - -webpack-sources@^3.2.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.3.3.tgz#d4bf7f9909675d7a070ff14d0ef2a4f3c982c723" - integrity sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg== - -webpack@^5.99.9: - version "5.99.9" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.99.9.tgz#d7de799ec17d0cce3c83b70744b4aedb537d8247" - integrity sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg== - dependencies: - "@types/eslint-scope" "^3.7.7" - "@types/estree" "^1.0.6" - "@types/json-schema" "^7.0.15" - "@webassemblyjs/ast" "^1.14.1" - "@webassemblyjs/wasm-edit" "^1.14.1" - "@webassemblyjs/wasm-parser" "^1.14.1" - acorn "^8.14.0" - browserslist "^4.24.0" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.17.1" - es-module-lexer "^1.2.1" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.11" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^4.3.2" - tapable "^2.1.1" - terser-webpack-plugin "^5.3.11" - watchpack "^2.4.1" - webpack-sources "^3.2.3" - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which-typed-array@^1.1.16, which-typed-array@^1.1.2: - version "1.1.19" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956" - integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.8" - call-bound "^1.0.4" - for-each "^0.3.5" - get-proto "^1.0.1" - gopd "^1.2.0" - has-tostringtag "^1.0.2" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wildcard@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" - integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== - -word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -xml-js@1.6.11: - version "1.6.11" - resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.11.tgz#927d2f6947f7f1c19a316dd8eea3614e8b18f8e9" - integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== - dependencies: - sax "^1.2.4" - -xtend@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zimmerframe@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/zimmerframe/-/zimmerframe-1.1.2.tgz#5b75f1fa83b07ae2a428d51e50f58e2ae6855e5e" - integrity sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==