diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..e0d43e3d3ed19a9921602907ba3415184cad598e
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,32 @@
+# syntax=docker/dockerfile:1
+# read the doc: https://huggingface.co/docs/hub/spaces-sdks-docker
+# you will also find guides on how best to write your Dockerfile
+FROM node:19 as builder-production
+
+WORKDIR /app
+
+COPY --link --chown=1000 package-lock.json package.json ./
+RUN --mount=type=cache,target=/app/.npm \
+ npm set cache /app/.npm && \
+ npm ci --omit=dev
+
+FROM builder-production as builder
+
+RUN --mount=type=cache,target=/app/.npm \
+ npm set cache /app/.npm && \
+ npm ci
+
+COPY --link --chown=1000 . .
+
+RUN --mount=type=secret,id=DOTENV_LOCAL,dst=.env.local \
+ npm run build
+
+FROM node:19-slim
+
+RUN npm install -g pm2
+
+COPY --from=builder-production /app/node_modules /app/node_modules
+COPY --link --chown=1000 package.json /app/package.json
+COPY --from=builder /app/build /app/build
+
+CMD pm2 start /app/build/index.js -i $CPU_CORES --no-daemon
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..28bec7110a03817df2c670c5a470a0610a883923
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 2023, Mithril Security SAS
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
\ No newline at end of file
diff --git a/PRIVACY.md b/PRIVACY.md
new file mode 100644
index 0000000000000000000000000000000000000000..e68a798574b6c921b92f59574f22a16152d761c2
--- /dev/null
+++ b/PRIVACY.md
@@ -0,0 +1,18 @@
+# About & Privacy - BlindChat
+
+## Privacy
+
+Last updated: September 15, 2023
+
+No conversations are recorded. All computation happens on your device, and conversations are stored locally in the browser’s cache.
+
+We don’t and never will see your data, so we cannot train on your data. Your data remains yours.
+
+## About
+
+BlindChat is an open-source project to provide fully in-browser and private Conversational AI.
+
+It is currently developed and maintained by [Mithril Security](https://www.mithrilsecurity.io/), a startup aiming to make AI more private.
+
+You can find more information on our [Github](https://github.com/mithril-security/blind_chat/), join us on our [Discord](https://discord.com/invite/TxEHagpWd4), or directly [contact us](mailto:contact@mithrilsecurity.io).
+
\ No newline at end of file
diff --git a/README.md b/README.md
index 5263ad2bdd7183ba45aa0bc2a929e2b361b3eead..26c2d9eba7826bae4cbb80f994d671fbf6aaaf62 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,233 @@
----
-title: Blind Chat
-emoji: 📚
-colorFrom: gray
-colorTo: pink
-sdk: docker
-pinned: false
----
-
-Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
+
+
+
+
+
+
+
+
+
BlindChat
+
+[![Website][website-shield]][website-url]
+[![Blog][blog-shield]][blog-url]
+
+
+
+
+ Open-source and privacy-by-design alternative to ChatGPT
+
+
+ Table of Contents
+
+ About the project
+ Roadmap
+ Design
+ Comparisons
+ Contact
+
+
+
+## 📜 About the project
+
+### What is BlindChat?
+
+🐱 **BlindChat** is an open-source project to develop **the first fully in-browser and private Conversational AI**.
+
+Most conversational AI solutions today require users to send their data to AI providers who serve AI models as a Service. This poses privacy issues for users who **lose control over their data**.
+
+⚠️ Because data is a key asset to improve LLMs, **many solutions more or less implicitly fine-tune users’ data to improve their model**.
+
+This creates privacy risks for users as LLMs might learn their data by heart. Carlini et al. [1] showed that LLMs such as GPT-J could learn at least 1% of their training set by heart.
+
+🔐 BlindChat solves this issue as users have guarantees that their data remains private at all times and have full control over it, either by doing local inference or using secure isolated environments called secure enclaves.
+
+### Local conversations
+
+### Demo
+
+👩💻 You can try out BlindChat [here](https://chat.mithrilsecurity.io)! We enable users to interact with a [Flan-T5 model](https://huggingface.co/docs/transformers/model_doc/flan-t5) locally through their browser: the model is pulled and used for local inference using [transformers.js](https://huggingface.co/docs/transformers.js/index).
+
+### Who is BlindChat for?
+
+BlindChat aims to serve two users:
+
+- **End users:** We want to provide privacy-by-design alternatives to change the current status quo. Most users today are forced to give up their data to leverage AI services, and opaque or inexistent privacy controls are the norm.
+
+- **Developers:** We want to help developers easily serve privacy-by-design Conversational AI, which is why we are focused on making BlindChat easy to customize and deploy.
+
+
(back to top )
+
+## Roadmap
+
+You can check out our progress in more detail on our [official roadmap](https://github.com/orgs/mithril-security/projects/2/views/4). We highlight feature on which we would love help from contributors in our [help wanted section](https://github.com/orgs/mithril-security/projects/2/views/3).
+
+Roadmap quick summary:
+
+- [x] Revamping of Hugging Face Chat UI to make it entirely client-side (removal of telemetry, data sharing, server-side history of conversations, server-side inference, etc.)
+- [x] Integration of privacy-by-design inference with local model
+- [x] Local caching of conversations
+- [ ] Integration of more advanced local models (e.g. [phi-1.5](https://huggingface.co/microsoft/phi-1_5)) and more advanced inference (e.g. [Web LLM](https://github.com/mlc-ai/web-llm))
+- [ ] Integration of privacy-by-design inference with remote enclaves using BlindLlama for powerful models such as [Llama 2 70b](https://huggingface.co/meta-llama/Llama-2-70b-chat-hf) & [Falcon 180b](https://huggingface.co/tiiuae/falcon-180B) ⌛
+- [ ] Integration with [LlamaIndex TS](https://github.com/run-llama/LlamaIndexTS) for local Retrieval Augmented Generation (RAG) ⌛
+- [ ] Internet search ⌛
+- [ ] Connectors to pull data from different sources ⌛
+
+(back to top )
+
+## 🔧 Setup
+
+Before going any further, please make sure you have [Node JS 18.0](https://nodejs.org/en) installed on your system.
+
+To run the chat user interface in dev/debug mode for testing purposes, execute the following commands in the root folder of your BlindChat code repo.
+
+```bash
+npm install
+npm run dev
+```
+
+This will install the dependencies of the project and launch the dev environment.
+
+The chat can be deployed in production mode with the following commands:
+
+```bash
+npm run build
+node build
+```
+
+The chat-ui uses server-side rendering, so building the pages before deploying them is mandatory.
+
+> ⚠️ Note that the command `node build` will run the server in `HTTP mode`.
+> If you wish to add TLS, please use a proxy server, such as NGINX.
+
+(back to top )
+
+## 🧑🎨 Design
+
+### Principles
+
+🤗 **BlindChat** is a fork from [**Hugging Face Chat UI project**](https://huggingface.co/spaces/huggingchat/chat-ui).
+
+We modified the code so that various tasks usually handled by the server are done by the browser. This is to **ensure privacy** as we do not want to send user data to the server/AI provider as our solution **places the AI provider outside of our trust model**.
+
+### Philosophy
+
+To make AI transparent and confidential, (almost) all of the logic is transported from the server-side to the client-side browser.
+
+This ensures end-users’ privacy and gives them control over what happens to their data. For instance, the inference can be done locally using transformers.js, and conversations can be stored in the user's browser chat. This means the operators of the AI service are blind to the user's data, hence the name BlindChat!
+
+Data is only sent server-side where our remote enclave mode is selected. With this mode, the server is deployed within a hardened and verifiable environment called an enclave which provides end-to-end protection and prevents external access. Not even the AI provider admins operating the enclave can read users’ data.
+
+Note that while our hardened environments don’t fit in with all definitions of an “enclave”, we will use it for convenience’s sake here to describe an environment that allows a server to process data without exposing its contents to service providers.
+
+### Private inference
+
+We offer two modes to ensure users’ data remains private:
+
+#### On-device inference
+
+![on-device-mode-dark](./assets/on-device-dark.png#gh-dark-mode-only)
+![on-device-mode-light](./assets/on-device-light.png#gh-light-mode-only)
+
+With the on-device mode, the model is sent locally to the users’ browser, and **inference is performed on-device**.
+
+This mode is **generally suitable for smaller models** as large models may require too much bandwidth and computational resources.
+
+#### Confidential and transparent AI APis with enclaves
+
+![zero-trust-mode-dark](./assets/zero-trust-dark.png#gh-dark-mode-only)
+![zero-trust-mode-light](./assets/zero-trust-light.png#gh-light-mode-only)
+
+With the Zero-trust AI APIs mode, data is sent to a **secure environment** called an **enclave** containing the model for remote inference.
+
+These environments provide **end-to-end protection** through robust **isolation and verification**. User data is **never accessible in clear** to the AI provider admins.
+
+> You can find out more about Confidential and transparent AI APIs with enclaves in the [guide](https://blindllama.mithrilsecurity.io/en/latest/docs/concepts/hardened-systems/) we provide with our [BlindLlama project](https://blindllama.mithrilsecurity.io/en/latest/), which is the underlying technology for this mode of BlindChat.
+
+(back to top )
+
+### Architecture
+
+The project currently has three major components:
+
+- **UI:** This is the Chat interface that the end user interacts with. It contains the Chat box, and will contain plugins and other widgets for more complex interaction, such as loading documents or enabling voice commands.
+- **Private LLM:** Developers can customize which LLM they choose to answer users’ queries. Current options are either local models or remote enclaves to ensure transparent and private inference.
+- **Storage:** Developers can customize what kind of storage is used to save information such as conversation history and, in the future, embeddings for RAG.
+
+**\*Coming soon:**
+
+- **Connectors:** Connectors will allows users to pull documents from various sources, e.g. PDF upload, and share outputs
+- **Integration with Llama Index TS:** This will allow users to index documents with local models, store them in local storage and use them for RAG (query the LLMs based on the information contained in their documents).
+
+## 📊 Comparisons
+
+| | Client-side bandwidth requirements | Client-side computing requirements | Model capabilities | Privacy |
+| -------------------- | ---------------------------------- | ---------------------------------- | ------------------ | ------- |
+| On-device prediction | High | High | Low | High |
+| Regular AI APIs | Low | Low | High | Low |
+| Zero-trust AI APIs | Low | Low | High | High |
+
+**On-device predictions and Confidential AI APIs both provide privacy** contrary to most existing Conversational AI solutions that expose data to privacy risks.
+
+**On-device prediction** has the advantage of providing the highest level of privacy as data does not leave the device but requires downloading models that are several hundreds of MBs to several GBs and require heavy memory and computing resources. For many users, this option will not be possible with larger, higher-performing models due to these device requirements.
+
+**Confidential AI APIs** are deployed remotely, meaning the size of models is not restricted by the specifications of user devices. Users are able to query large models while still having robust privacy guarantees.
+
+(back to top )
+
+## 📇 Get in touch
+
+We would love to hear your feedback or suggestions, here are the ways you can reach us:
+
+- Found a bug? [Open an issue!](https://github.com/mithril-security/blind_chat/issues)
+- Got a suggestion? [Join our Discord community and let us know!](https://discord.com/invite/TxEHagpWd4)
+- Set up [a one-on-one meeting](https://www.mithrilsecurity.io/contact) with a member of our team
+
+Want to hear more about our work on privacy in the field AI?
+
+- Check out our [blog](https://blog.mithrilsecurity.io/)
+- Subscribe to our newsletter [here](https://blog.mithrilsecurity.io/)
+
+Thank you for your support!
+
+(back to top )
+
+## References
+
+[1] Carlini, N., Ippolito, D., Jagielski, M., Lee, K., Tramer, F., & Zhang, C. (2022). Quantifying Memorization Across Neural Language Models. ArXiv. /abs/2202.07646
+
+
+
+[project-url]: https://github.com/mithril-security/blind_chat
+[twitter-url]: https://twitter.com/MithrilSecurity
+[contact-url]: https://www.mithrilsecurity.io/contact
+[docs-shield]: https://img.shields.io/badge/Docs-000000?style=for-the-badge&colorB=555
+[docs-url]: https://blindllama.mithrilsecurity.io/en/latest/
+[license-shield]: https://img.shields.io/github/license/mithril-security/aicert.svg?style=for-the-badge
+[contact]: https://img.shields.io/badge/Contact_us-000000?style=for-the-badge&colorB=555
+[project]: https://img.shields.io/badge/Project-000000?style=for-the-badge&colorB=555
+[linkedin-shield]: https://img.shields.io/badge/LinkedIn-0077B5?style=for-the-badge&logo=linkedin&logoColor=white&colorB=555
+[reddit-shield]: https://img.shields.io/badge/reddit-0077B5?style=for-the-badge&logo=reddit&logoColor=white&colorB=FF4500
+[twitter]: https://img.shields.io/badge/Twitter-1DA1F2?style=for-the-badge&logo=twitter&logoColor=white
+[fb-shield]: https://img.shields.io/badge/Facebook-0077B5?style=for-the-badge&logo=facebook&logoColor=white&colorB=3b5998
+[linkedin-url]: https://www.linkedin.com/company/mithril-security-company/
+[website-url]: https://www.mithrilsecurity.io
+[docs-url]: https://blindllama.mithrilsecurity.io/en/latest/
+[website-shield]: https://img.shields.io/badge/website-000000?style=for-the-badge&colorB=555
+[blog-url]: https://blog.mithrilsecurity.io/
+[blog-shield]: https://img.shields.io/badge/Blog-000?style=for-the-badge&logo=ghost&logoColor=yellow&colorB=555
+[facebook-share]: https://www.facebook.com/sharer/sharer.php?u=https%3A//github.com/mithril-security/blind_chat
+[twitter-share]: https://twitter.com/intent/tweet?url=https://github.com/mithril-security/blind_chat&text=Check%20out%20the%20open-source%20project%20to%20build%20a%20private%20Conversational%20AI%20app%20running%20fully%20in-browser
+[linkedin-share]: https://www.linkedin.com/sharing/share-offsite/?url=https://github.com/mithril-security/blind_chat
+[reddit-share]: https://www.reddit.com/submit?url=github.com%2Fmithril-security%2Fblind_chat&title=Private%20in-browser%20Conversational%20AI%20with%20BlindChat
diff --git a/assets/on-device-dark.png b/assets/on-device-dark.png
new file mode 100644
index 0000000000000000000000000000000000000000..181c0a7bcd9307fddbbe2bf4cc12513946532f8d
Binary files /dev/null and b/assets/on-device-dark.png differ
diff --git a/assets/on-device-light.png b/assets/on-device-light.png
new file mode 100644
index 0000000000000000000000000000000000000000..860cb390780f2391eb461658e6a96e5291741115
Binary files /dev/null and b/assets/on-device-light.png differ
diff --git a/assets/zero-trust-dark-border.png b/assets/zero-trust-dark-border.png
new file mode 100644
index 0000000000000000000000000000000000000000..285df9f7aaba7bf74adfdea6917c2066479d2264
Binary files /dev/null and b/assets/zero-trust-dark-border.png differ
diff --git a/assets/zero-trust-dark.png b/assets/zero-trust-dark.png
new file mode 100644
index 0000000000000000000000000000000000000000..4254f16d60d95b8577f899da69ea221b6ccdebcc
Binary files /dev/null and b/assets/zero-trust-dark.png differ
diff --git a/assets/zero-trust-light-border.png b/assets/zero-trust-light-border.png
new file mode 100644
index 0000000000000000000000000000000000000000..4b85b4a10c1e255261e80cd5ac5346c19a249b6e
Binary files /dev/null and b/assets/zero-trust-light-border.png differ
diff --git a/assets/zero-trust-light.png b/assets/zero-trust-light.png
new file mode 100644
index 0000000000000000000000000000000000000000..fb9c818b84c27b05d10a958f6433afa8e9bd2a2d
Binary files /dev/null and b/assets/zero-trust-light.png differ
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000000000000000000000000000000000000..06483c0fa26abc30535e069d835ba41e0057be8f
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,6263 @@
+{
+ "name": "chat-ui",
+ "version": "0.0.1",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "chat-ui",
+ "version": "0.0.1",
+ "dependencies": {
+ "@huggingface/hub": "^0.5.1",
+ "@huggingface/inference": "^2.2.0",
+ "@xenova/transformers": "^2.0.0",
+ "autoprefixer": "^10.4.14",
+ "aws4fetch": "^1.0.17",
+ "date-fns": "^2.29.3",
+ "dexie": "^3.2.4",
+ "dotenv": "^16.0.3",
+ "handlebars": "^4.7.8",
+ "highlight.js": "^11.7.0",
+ "jsdom": "^22.0.0",
+ "marked": "^4.3.0",
+ "nanoid": "^4.0.2",
+ "openid-client": "^5.4.2",
+ "parquetjs": "^0.11.2",
+ "postcss": "^8.4.21",
+ "save": "^2.9.0",
+ "serpapi": "^1.1.1",
+ "svelte-device-info": "^1.0.0",
+ "tailwind-scrollbar": "^3.0.0",
+ "tailwindcss": "^3.3.1",
+ "uuid": "^9.0.1",
+ "zod": "^3.21.4"
+ },
+ "devDependencies": {
+ "@iconify-json/carbon": "^1.1.16",
+ "@iconify-json/eos-icons": "^1.1.6",
+ "@sveltejs/adapter-node": "^1.2.4",
+ "@sveltejs/kit": "^1.15.10",
+ "@tailwindcss/typography": "^0.5.9",
+ "@types/jsdom": "^21.1.1",
+ "@types/marked": "^4.0.8",
+ "@types/parquetjs": "^0.10.3",
+ "@typescript-eslint/eslint-plugin": "^5.45.0",
+ "@typescript-eslint/parser": "^5.45.0",
+ "eslint": "^8.28.0",
+ "eslint-config-prettier": "^8.5.0",
+ "eslint-plugin-svelte": "^2.27.3",
+ "prettier": "^2.8.0",
+ "prettier-plugin-svelte": "^2.8.1",
+ "prettier-plugin-tailwindcss": "^0.2.7",
+ "svelte": "^3.58.0",
+ "svelte-check": "^3.2.0",
+ "tslib": "^2.4.1",
+ "typescript": "^4.9.3",
+ "unplugin-icons": "^0.16.1",
+ "vite": "^4.3.9",
+ "vitest": "^0.31.0"
+ }
+ },
+ "node_modules/@aashutoshrathi/word-wrap": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
+ "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@alloc/quick-lru": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@antfu/install-pkg": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-0.1.1.tgz",
+ "integrity": "sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==",
+ "dev": true,
+ "dependencies": {
+ "execa": "^5.1.1",
+ "find-up": "^5.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@antfu/utils": {
+ "version": "0.7.6",
+ "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.6.tgz",
+ "integrity": "sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz",
+ "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz",
+ "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz",
+ "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz",
+ "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz",
+ "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz",
+ "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz",
+ "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz",
+ "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz",
+ "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz",
+ "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz",
+ "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz",
+ "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz",
+ "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz",
+ "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz",
+ "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz",
+ "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz",
+ "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz",
+ "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz",
+ "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz",
+ "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz",
+ "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz",
+ "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz",
+ "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
+ "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.8.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz",
+ "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz",
+ "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.0",
+ "globals": "^13.19.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"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.49.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz",
+ "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@huggingface/hub": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/@huggingface/hub/-/hub-0.5.1.tgz",
+ "integrity": "sha512-ZaE2gY8NY+XwIOL7+gBhPq19PXG4gbGSSJ7zwWLoq6MKP+nsgkQk/c7fBFrxgBwR6lNd0AJMHPRCjwTndqsqWQ==",
+ "dependencies": {
+ "hash-wasm": "^4.9.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@huggingface/inference": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/@huggingface/inference/-/inference-2.6.1.tgz",
+ "integrity": "sha512-qFYchgOCPeEkZJKiSr7Kz62QwukJtgkeQCT7Q0SSKUcvHpTQVNJp6i/JrJMR4dBdzQysJ1SZDC0pLBBnnskTag==",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.11.11",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz",
+ "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "dev": true
+ },
+ "node_modules/@iconify-json/carbon": {
+ "version": "1.1.21",
+ "resolved": "https://registry.npmjs.org/@iconify-json/carbon/-/carbon-1.1.21.tgz",
+ "integrity": "sha512-bK2cMVM4noBU+FGlay433flpXLRzQu0ED095iAnoO6ka3yb4uz0lvb8acpN5gthyGLJ89C4HpfIbQZLQnMKQww==",
+ "dev": true,
+ "dependencies": {
+ "@iconify/types": "*"
+ }
+ },
+ "node_modules/@iconify-json/eos-icons": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/@iconify-json/eos-icons/-/eos-icons-1.1.7.tgz",
+ "integrity": "sha512-lAv0YFZlXrY5CaveJHvH9vOX2h+nprvvXayZijxR7lQprLmM9Pu2US9IQkEoI4iO8siLCUpM4KhjuxCg3WfI3A==",
+ "dev": true,
+ "dependencies": {
+ "@iconify/types": "*"
+ }
+ },
+ "node_modules/@iconify/types": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",
+ "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==",
+ "dev": true
+ },
+ "node_modules/@iconify/utils": {
+ "version": "2.1.10",
+ "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.1.10.tgz",
+ "integrity": "sha512-0/+5hxjzCZ9RoYpqxnOzbnpQyMdZRuHcMxPJeuX+x/aZkAAD/N4TajDjAPT7LpX+M0bfLExj/p0bbDkUfp0lrg==",
+ "dev": true,
+ "dependencies": {
+ "@antfu/install-pkg": "^0.1.1",
+ "@antfu/utils": "^0.7.5",
+ "@iconify/types": "^2.0.0",
+ "debug": "^4.3.4",
+ "kolorist": "^1.8.0",
+ "local-pkg": "^0.4.3"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+ "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+ "dependencies": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
+ "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.15",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.19",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz",
+ "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@polka/url": {
+ "version": "1.0.0-next.23",
+ "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.23.tgz",
+ "integrity": "sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==",
+ "dev": true
+ },
+ "node_modules/@protobufjs/aspromise": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
+ "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="
+ },
+ "node_modules/@protobufjs/base64": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
+ "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
+ },
+ "node_modules/@protobufjs/codegen": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
+ "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
+ },
+ "node_modules/@protobufjs/eventemitter": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
+ "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="
+ },
+ "node_modules/@protobufjs/fetch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
+ "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
+ "dependencies": {
+ "@protobufjs/aspromise": "^1.1.1",
+ "@protobufjs/inquire": "^1.1.0"
+ }
+ },
+ "node_modules/@protobufjs/float": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
+ "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="
+ },
+ "node_modules/@protobufjs/inquire": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
+ "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="
+ },
+ "node_modules/@protobufjs/path": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
+ "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="
+ },
+ "node_modules/@protobufjs/pool": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
+ "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="
+ },
+ "node_modules/@protobufjs/utf8": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
+ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
+ },
+ "node_modules/@rollup/plugin-commonjs": {
+ "version": "25.0.4",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.4.tgz",
+ "integrity": "sha512-L92Vz9WUZXDnlQQl3EwbypJR4+DM2EbsO+/KOcEkP4Mc6Ct453EeDB2uH9lgRwj4w5yflgNpq9pHOiY8aoUXBQ==",
+ "dev": true,
+ "dependencies": {
+ "@rollup/pluginutils": "^5.0.1",
+ "commondir": "^1.0.1",
+ "estree-walker": "^2.0.2",
+ "glob": "^8.0.3",
+ "is-reference": "1.2.1",
+ "magic-string": "^0.27.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^2.68.0||^3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/plugin-json": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.0.0.tgz",
+ "integrity": "sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==",
+ "dev": true,
+ "dependencies": {
+ "@rollup/pluginutils": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0||^3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/plugin-node-resolve": {
+ "version": "15.2.1",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.1.tgz",
+ "integrity": "sha512-nsbUg588+GDSu8/NS8T4UAshO6xeaOfINNuXeVHcKV02LJtoRaM1SiOacClw4kws1SFiNhdLGxlbMY9ga/zs/w==",
+ "dev": true,
+ "dependencies": {
+ "@rollup/pluginutils": "^5.0.1",
+ "@types/resolve": "1.20.2",
+ "deepmerge": "^4.2.2",
+ "is-builtin-module": "^3.2.1",
+ "is-module": "^1.0.0",
+ "resolve": "^1.22.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^2.78.0||^3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/pluginutils": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.4.tgz",
+ "integrity": "sha512-0KJnIoRI8A+a1dqOYLxH8vBf8bphDmty5QvIm2hqm7oFCFYKCAZWWd2hXgMibaPsNDhI0AtpYfQZJG47pt/k4g==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^2.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0||^3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@sveltejs/adapter-node": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@sveltejs/adapter-node/-/adapter-node-1.3.1.tgz",
+ "integrity": "sha512-A0VgRQDCDPzdLNoiAbcOxGw4zT1Mc+n1LwT1OmO350R7WxrEqdMUChPPOd1iMfIDWlP4ie6E2d/WQf5es2d4Zw==",
+ "dev": true,
+ "dependencies": {
+ "@rollup/plugin-commonjs": "^25.0.0",
+ "@rollup/plugin-json": "^6.0.0",
+ "@rollup/plugin-node-resolve": "^15.0.1",
+ "rollup": "^3.7.0"
+ },
+ "peerDependencies": {
+ "@sveltejs/kit": "^1.0.0"
+ }
+ },
+ "node_modules/@sveltejs/kit": {
+ "version": "1.25.0",
+ "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.25.0.tgz",
+ "integrity": "sha512-+VqMWJJYtcLoF8hYkdqY2qs/MPaawrMwA/gNBJW2o2UrcuYdNiy0ZZnjQQuPD33df/VcAulnoeyzF5ZtaajFEw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "dependencies": {
+ "@sveltejs/vite-plugin-svelte": "^2.4.1",
+ "@types/cookie": "^0.5.1",
+ "cookie": "^0.5.0",
+ "devalue": "^4.3.1",
+ "esm-env": "^1.0.0",
+ "kleur": "^4.1.5",
+ "magic-string": "^0.30.0",
+ "mime": "^3.0.0",
+ "sade": "^1.8.1",
+ "set-cookie-parser": "^2.6.0",
+ "sirv": "^2.0.2",
+ "tiny-glob": "^0.2.9",
+ "undici": "~5.23.0"
+ },
+ "bin": {
+ "svelte-kit": "svelte-kit.js"
+ },
+ "engines": {
+ "node": "^16.14 || >=18"
+ },
+ "peerDependencies": {
+ "svelte": "^3.54.0 || ^4.0.0-next.0",
+ "vite": "^4.0.0"
+ }
+ },
+ "node_modules/@sveltejs/kit/node_modules/magic-string": {
+ "version": "0.30.3",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.3.tgz",
+ "integrity": "sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.15"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@sveltejs/vite-plugin-svelte": {
+ "version": "2.4.6",
+ "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.4.6.tgz",
+ "integrity": "sha512-zO79p0+DZnXPnF0ltIigWDx/ux7Ni+HRaFOw720Qeivc1azFUrJxTl0OryXVibYNx1hCboGia1NRV3x8RNv4cA==",
+ "dev": true,
+ "dependencies": {
+ "@sveltejs/vite-plugin-svelte-inspector": "^1.0.4",
+ "debug": "^4.3.4",
+ "deepmerge": "^4.3.1",
+ "kleur": "^4.1.5",
+ "magic-string": "^0.30.3",
+ "svelte-hmr": "^0.15.3",
+ "vitefu": "^0.2.4"
+ },
+ "engines": {
+ "node": "^14.18.0 || >= 16"
+ },
+ "peerDependencies": {
+ "svelte": "^3.54.0 || ^4.0.0",
+ "vite": "^4.0.0"
+ }
+ },
+ "node_modules/@sveltejs/vite-plugin-svelte-inspector": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-1.0.4.tgz",
+ "integrity": "sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^14.18.0 || >= 16"
+ },
+ "peerDependencies": {
+ "@sveltejs/vite-plugin-svelte": "^2.2.0",
+ "svelte": "^3.54.0 || ^4.0.0",
+ "vite": "^4.0.0"
+ }
+ },
+ "node_modules/@sveltejs/vite-plugin-svelte/node_modules/magic-string": {
+ "version": "0.30.3",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.3.tgz",
+ "integrity": "sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.15"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@tailwindcss/typography": {
+ "version": "0.5.10",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.10.tgz",
+ "integrity": "sha512-Pe8BuPJQJd3FfRnm6H0ulKIGoMEQS+Vq01R6M5aCrFB/ccR/shT+0kXLjouGC1gFLm9hopTFN+DMP0pfwRWzPw==",
+ "dev": true,
+ "dependencies": {
+ "lodash.castarray": "^4.4.0",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.merge": "^4.6.2",
+ "postcss-selector-parser": "6.0.10"
+ },
+ "peerDependencies": {
+ "tailwindcss": ">=3.0.0 || insiders"
+ }
+ },
+ "node_modules/@tootallnate/once": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
+ "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@types/chai": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.6.tgz",
+ "integrity": "sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==",
+ "dev": true
+ },
+ "node_modules/@types/chai-subset": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz",
+ "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==",
+ "dev": true,
+ "dependencies": {
+ "@types/chai": "*"
+ }
+ },
+ "node_modules/@types/cookie": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.2.tgz",
+ "integrity": "sha512-DBpRoJGKJZn7RY92dPrgoMew8xCWc2P71beqsjyhEI/Ds9mOyVmBwtekyfhpwFIVt1WrxTonFifiOZ62V8CnNA==",
+ "dev": true
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz",
+ "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==",
+ "dev": true
+ },
+ "node_modules/@types/jsdom": {
+ "version": "21.1.3",
+ "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.3.tgz",
+ "integrity": "sha512-1zzqSP+iHJYV4lB3lZhNBa012pubABkj9yG/GuXuf6LZH1cSPIJBqFDrm5JX65HHt6VOnNYdTui/0ySerRbMgA==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "@types/tough-cookie": "*",
+ "parse5": "^7.0.0"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.13",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz",
+ "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==",
+ "dev": true
+ },
+ "node_modules/@types/long": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz",
+ "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA=="
+ },
+ "node_modules/@types/marked": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.3.1.tgz",
+ "integrity": "sha512-vSSbKZFbNktrQ15v7o1EaH78EbWV+sPQbPjHG+Cp8CaNcPFUEfjZ0Iml/V0bFDwsTlYe8o6XC5Hfdp91cqPV2g==",
+ "dev": true
+ },
+ "node_modules/@types/node": {
+ "version": "20.6.2",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.2.tgz",
+ "integrity": "sha512-Y+/1vGBHV/cYk6OI1Na/LHzwnlNCAfU3ZNGrc1LdRe/LAIbdDPTTv/HU3M7yXN448aTVDq3eKRm2cg7iKLb8gw=="
+ },
+ "node_modules/@types/node-int64": {
+ "version": "0.4.29",
+ "resolved": "https://registry.npmjs.org/@types/node-int64/-/node-int64-0.4.29.tgz",
+ "integrity": "sha512-rHXvenLTj/CcsmNAebaBOhxQ2MqEGl3yXZZcZ21XYR+gzGTTcpOy2N4IxpvTCz48loyQNatHvfn6GhIbbZ1R3Q==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/parquetjs": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@types/parquetjs/-/parquetjs-0.10.3.tgz",
+ "integrity": "sha512-n0xVEor3+3qHfCmFAf0pO4m/Pxc5JEmiVkEWWqJexN+p11/Nr+rqABKcIEj4X6tGKF1cnVIeBqy67mW2Yd+Kbg==",
+ "dev": true,
+ "dependencies": {
+ "@types/node-int64": "*"
+ }
+ },
+ "node_modules/@types/pug": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz",
+ "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==",
+ "dev": true
+ },
+ "node_modules/@types/resolve": {
+ "version": "1.20.2",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
+ "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==",
+ "dev": true
+ },
+ "node_modules/@types/semver": {
+ "version": "7.5.2",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz",
+ "integrity": "sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==",
+ "dev": true
+ },
+ "node_modules/@types/tough-cookie": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.3.tgz",
+ "integrity": "sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg==",
+ "dev": true
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz",
+ "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.4.0",
+ "@typescript-eslint/scope-manager": "5.62.0",
+ "@typescript-eslint/type-utils": "5.62.0",
+ "@typescript-eslint/utils": "5.62.0",
+ "debug": "^4.3.4",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "natural-compare-lite": "^1.4.0",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^5.0.0",
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz",
+ "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "5.62.0",
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/typescript-estree": "5.62.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz",
+ "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/visitor-keys": "5.62.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz",
+ "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "5.62.0",
+ "@typescript-eslint/utils": "5.62.0",
+ "debug": "^4.3.4",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz",
+ "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz",
+ "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/visitor-keys": "5.62.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz",
+ "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@types/json-schema": "^7.0.9",
+ "@types/semver": "^7.3.12",
+ "@typescript-eslint/scope-manager": "5.62.0",
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/typescript-estree": "5.62.0",
+ "eslint-scope": "^5.1.1",
+ "semver": "^7.3.7"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz",
+ "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@vitest/expect": {
+ "version": "0.31.4",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.31.4.tgz",
+ "integrity": "sha512-tibyx8o7GUyGHZGyPgzwiaPaLDQ9MMuCOrc03BYT0nryUuhLbL7NV2r/q98iv5STlwMgaKuFJkgBW/8iPKwlSg==",
+ "dev": true,
+ "dependencies": {
+ "@vitest/spy": "0.31.4",
+ "@vitest/utils": "0.31.4",
+ "chai": "^4.3.7"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/runner": {
+ "version": "0.31.4",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.31.4.tgz",
+ "integrity": "sha512-Wgm6UER+gwq6zkyrm5/wbpXGF+g+UBB78asJlFkIOwyse0pz8lZoiC6SW5i4gPnls/zUcPLWS7Zog0LVepXnpg==",
+ "dev": true,
+ "dependencies": {
+ "@vitest/utils": "0.31.4",
+ "concordance": "^5.0.4",
+ "p-limit": "^4.0.0",
+ "pathe": "^1.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/runner/node_modules/p-limit": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
+ "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^1.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@vitest/runner/node_modules/yocto-queue": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz",
+ "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@vitest/snapshot": {
+ "version": "0.31.4",
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.31.4.tgz",
+ "integrity": "sha512-LemvNumL3NdWSmfVAMpXILGyaXPkZbG5tyl6+RQSdcHnTj6hvA49UAI8jzez9oQyE/FWLKRSNqTGzsHuk89LRA==",
+ "dev": true,
+ "dependencies": {
+ "magic-string": "^0.30.0",
+ "pathe": "^1.1.0",
+ "pretty-format": "^27.5.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/snapshot/node_modules/magic-string": {
+ "version": "0.30.3",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.3.tgz",
+ "integrity": "sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.15"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@vitest/spy": {
+ "version": "0.31.4",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.31.4.tgz",
+ "integrity": "sha512-3ei5ZH1s3aqbEyftPAzSuunGICRuhE+IXOmpURFdkm5ybUADk+viyQfejNk6q8M5QGX8/EVKw+QWMEP3DTJDag==",
+ "dev": true,
+ "dependencies": {
+ "tinyspy": "^2.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/utils": {
+ "version": "0.31.4",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.31.4.tgz",
+ "integrity": "sha512-DobZbHacWznoGUfYU8XDPY78UubJxXfMNY1+SUdOp1NsI34eopSA6aZMeaGu10waSOeYwE8lxrd/pLfT0RMxjQ==",
+ "dev": true,
+ "dependencies": {
+ "concordance": "^5.0.4",
+ "loupe": "^2.3.6",
+ "pretty-format": "^27.5.1"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@xenova/transformers": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/@xenova/transformers/-/transformers-2.6.1.tgz",
+ "integrity": "sha512-fK1SkZUCvTdH1gEWmBUU5rvugZBqqu0ibkaBmUIr5t9Kf+Z8W4n0IszSRS2+M5ZHxRKS3SE7pFpsMDXByIzmQw==",
+ "dependencies": {
+ "onnxruntime-web": "1.14.0",
+ "sharp": "^0.32.0"
+ },
+ "optionalDependencies": {
+ "onnxruntime-node": "1.14.0"
+ }
+ },
+ "node_modules/abab": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
+ "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA=="
+ },
+ "node_modules/acorn": {
+ "version": "8.10.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
+ "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/acorn-walk": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
+ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "dependencies": {
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "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"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/async": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
+ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.15",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.15.tgz",
+ "integrity": "sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "browserslist": "^4.21.10",
+ "caniuse-lite": "^1.0.30001520",
+ "fraction.js": "^4.2.0",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/aws4fetch": {
+ "version": "1.0.17",
+ "resolved": "https://registry.npmjs.org/aws4fetch/-/aws4fetch-1.0.17.tgz",
+ "integrity": "sha512-4IbOvsxqxeOSxI4oA+8xEO8SzBMVlzbSTgGy/EF83rHnQ/aKtP6Sc6YV/k0oiW0mqrcxuThlbDosnvetGOuO+g=="
+ },
+ "node_modules/b4a": {
+ "version": "1.6.4",
+ "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz",
+ "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw=="
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/bindings": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz",
+ "integrity": "sha512-u4cBQNepWxYA55FunZSM7wMi55yQaN0otnhhilNoWHq0MfOfJeQx0v0mRRpolGOExPjZcl6FtB0BB8Xkb88F0g==",
+ "optional": true
+ },
+ "node_modules/bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "node_modules/blueimp-md5": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz",
+ "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==",
+ "dev": true
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/brotli": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz",
+ "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==",
+ "dependencies": {
+ "base64-js": "^1.1.2"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.21.10",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz",
+ "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001517",
+ "electron-to-chromium": "^1.4.477",
+ "node-releases": "^2.0.13",
+ "update-browserslist-db": "^1.0.11"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/builtin-modules": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
+ "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/busboy": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
+ "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
+ "dependencies": {
+ "streamsearch": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=10.16.0"
+ }
+ },
+ "node_modules/cac": {
+ "version": "6.7.14",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
+ "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase-css": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001538",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz",
+ "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ]
+ },
+ "node_modules/chai": {
+ "version": "4.3.8",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.8.tgz",
+ "integrity": "sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ==",
+ "dev": true,
+ "dependencies": {
+ "assertion-error": "^1.1.0",
+ "check-error": "^1.0.2",
+ "deep-eql": "^4.1.2",
+ "get-func-name": "^2.0.0",
+ "loupe": "^2.3.1",
+ "pathval": "^1.1.1",
+ "type-detect": "^4.0.5"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/check-error": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
+ "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/chownr": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
+ },
+ "node_modules/color": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
+ "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
+ "dependencies": {
+ "color-convert": "^2.0.1",
+ "color-string": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=12.5.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "node_modules/color-string": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+ "dependencies": {
+ "color-name": "^1.0.0",
+ "simple-swizzle": "^0.2.2"
+ }
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
+ "dev": true
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ },
+ "node_modules/concordance": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/concordance/-/concordance-5.0.4.tgz",
+ "integrity": "sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==",
+ "dev": true,
+ "dependencies": {
+ "date-time": "^3.1.0",
+ "esutils": "^2.0.3",
+ "fast-diff": "^1.2.0",
+ "js-string-escape": "^1.0.1",
+ "lodash": "^4.17.15",
+ "md5-hex": "^3.0.1",
+ "semver": "^7.3.2",
+ "well-known-symbols": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.18.0 <11 || >=12.14.0 <13 || >=14"
+ }
+ },
+ "node_modules/cookie": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
+ "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cssstyle": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz",
+ "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==",
+ "dependencies": {
+ "rrweb-cssom": "^0.6.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/data-urls": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz",
+ "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==",
+ "dependencies": {
+ "abab": "^2.0.6",
+ "whatwg-mimetype": "^3.0.0",
+ "whatwg-url": "^12.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/date-fns": {
+ "version": "2.30.0",
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
+ "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==",
+ "dependencies": {
+ "@babel/runtime": "^7.21.0"
+ },
+ "engines": {
+ "node": ">=0.11"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/date-fns"
+ }
+ },
+ "node_modules/date-time": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/date-time/-/date-time-3.1.0.tgz",
+ "integrity": "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==",
+ "dev": true,
+ "dependencies": {
+ "time-zone": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decimal.js": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
+ "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA=="
+ },
+ "node_modules/decompress-response": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+ "dependencies": {
+ "mimic-response": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/deep-eql": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz",
+ "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==",
+ "dev": true,
+ "dependencies": {
+ "type-detect": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/detect-indent": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz",
+ "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/detect-libc": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz",
+ "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/devalue": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.2.tgz",
+ "integrity": "sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==",
+ "dev": true
+ },
+ "node_modules/dexie": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/dexie/-/dexie-3.2.4.tgz",
+ "integrity": "sha512-VKoTQRSv7+RnffpOJ3Dh6ozknBqzWw/F3iqMdsZg958R0AS8AnY9x9d1lbwENr0gzeGJHXKcGhAMRaqys6SxqA==",
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/domexception": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz",
+ "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==",
+ "dependencies": {
+ "webidl-conversions": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/dotenv": {
+ "version": "16.3.1",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz",
+ "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/motdotla/dotenv?sponsor=1"
+ }
+ },
+ "node_modules/duplexer": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
+ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg=="
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.523",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.523.tgz",
+ "integrity": "sha512-9AreocSUWnzNtvLcbpng6N+GkXnCcBR80IQkxRC9Dfdyg4gaWNUPBujAHUpKkiUkoSoR9UlhA4zD/IgBklmhzg=="
+ },
+ "node_modules/end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/es6-promise": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz",
+ "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==",
+ "dev": true
+ },
+ "node_modules/esbuild": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz",
+ "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/android-arm": "0.18.20",
+ "@esbuild/android-arm64": "0.18.20",
+ "@esbuild/android-x64": "0.18.20",
+ "@esbuild/darwin-arm64": "0.18.20",
+ "@esbuild/darwin-x64": "0.18.20",
+ "@esbuild/freebsd-arm64": "0.18.20",
+ "@esbuild/freebsd-x64": "0.18.20",
+ "@esbuild/linux-arm": "0.18.20",
+ "@esbuild/linux-arm64": "0.18.20",
+ "@esbuild/linux-ia32": "0.18.20",
+ "@esbuild/linux-loong64": "0.18.20",
+ "@esbuild/linux-mips64el": "0.18.20",
+ "@esbuild/linux-ppc64": "0.18.20",
+ "@esbuild/linux-riscv64": "0.18.20",
+ "@esbuild/linux-s390x": "0.18.20",
+ "@esbuild/linux-x64": "0.18.20",
+ "@esbuild/netbsd-x64": "0.18.20",
+ "@esbuild/openbsd-x64": "0.18.20",
+ "@esbuild/sunos-x64": "0.18.20",
+ "@esbuild/win32-arm64": "0.18.20",
+ "@esbuild/win32-ia32": "0.18.20",
+ "@esbuild/win32-x64": "0.18.20"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.49.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz",
+ "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.2",
+ "@eslint/js": "8.49.0",
+ "@humanwhocodes/config-array": "^0.11.11",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.2",
+ "eslint-visitor-keys": "^3.4.3",
+ "espree": "^9.6.1",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-config-prettier": {
+ "version": "8.10.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz",
+ "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==",
+ "dev": true,
+ "bin": {
+ "eslint-config-prettier": "bin/cli.js"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-svelte": {
+ "version": "2.33.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.33.1.tgz",
+ "integrity": "sha512-veYmyjsbt8ikXdaa6pLsgytdlzJpZZKw9vRaQlRBNKaLNmrbsdJulwiWfcDZ7tYJdaVpRB4iDFn/fuPeebxUVg==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14",
+ "debug": "^4.3.1",
+ "esutils": "^2.0.3",
+ "known-css-properties": "^0.28.0",
+ "postcss": "^8.4.5",
+ "postcss-load-config": "^3.1.4",
+ "postcss-safe-parser": "^6.0.0",
+ "postcss-selector-parser": "^6.0.11",
+ "semver": "^7.5.3",
+ "svelte-eslint-parser": ">=0.33.0 <1.0.0"
+ },
+ "engines": {
+ "node": "^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ota-meshi"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0-0",
+ "svelte": "^3.37.0 || ^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "svelte": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-svelte/node_modules/postcss-selector-parser": {
+ "version": "6.0.13",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
+ "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esm-env": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz",
+ "integrity": "sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==",
+ "dev": true
+ },
+ "node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
+ "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esquery/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "dev": true
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/event-stream": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz",
+ "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==",
+ "dependencies": {
+ "duplexer": "^0.1.1",
+ "from": "^0.1.7",
+ "map-stream": "0.0.7",
+ "pause-stream": "^0.0.11",
+ "split": "^1.0.1",
+ "stream-combiner": "^0.2.2",
+ "through": "^2.3.8"
+ }
+ },
+ "node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/expand-template": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
+ "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/fast-diff": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz",
+ "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==",
+ "dev": true
+ },
+ "node_modules/fast-fifo": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
+ "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
+ "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
+ "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.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true
+ },
+ "node_modules/fastq": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+ "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz",
+ "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.2.7",
+ "keyv": "^4.5.3",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/flatbuffers": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-1.12.0.tgz",
+ "integrity": "sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ=="
+ },
+ "node_modules/flatted": {
+ "version": "3.2.9",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz",
+ "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
+ "dev": true
+ },
+ "node_modules/form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz",
+ "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "node_modules/from": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz",
+ "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g=="
+ },
+ "node_modules/fs-constants": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "node_modules/get-func-name": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
+ "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/github-from-package": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
+ "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="
+ },
+ "node_modules/glob": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
+ "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/glob/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/globals": {
+ "version": "13.21.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz",
+ "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globalyzer": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz",
+ "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==",
+ "dev": true
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globrex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
+ "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==",
+ "dev": true
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true
+ },
+ "node_modules/guid-typescript": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz",
+ "integrity": "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ=="
+ },
+ "node_modules/handlebars": {
+ "version": "4.7.8",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz",
+ "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==",
+ "dependencies": {
+ "minimist": "^1.2.5",
+ "neo-async": "^2.6.2",
+ "source-map": "^0.6.1",
+ "wordwrap": "^1.0.0"
+ },
+ "bin": {
+ "handlebars": "bin/handlebars"
+ },
+ "engines": {
+ "node": ">=0.4.7"
+ },
+ "optionalDependencies": {
+ "uglify-js": "^3.1.4"
+ }
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/hash-wasm": {
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/hash-wasm/-/hash-wasm-4.9.0.tgz",
+ "integrity": "sha512-7SW7ejyfnRxuOc7ptQHSf4LDoZaWOivfzqw+5rpcQku0nHfmicPKE51ra9BiRLAmT8+gGLestr1XroUkqdjL6w=="
+ },
+ "node_modules/highlight.js": {
+ "version": "11.8.0",
+ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.8.0.tgz",
+ "integrity": "sha512-MedQhoqVdr0U6SSnWPzfiadUcDHfN/Wzq25AkXiQv9oiOO/sG0S7XkvpFIqWBl9Yq1UYyYOOVORs5UW2XlPyzg==",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/html-encoding-sniffer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
+ "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
+ "dependencies": {
+ "whatwg-encoding": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
+ "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
+ "dependencies": {
+ "@tootallnate/once": "2",
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/ignore": {
+ "version": "5.2.4",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
+ },
+ "node_modules/int53": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/int53/-/int53-0.2.4.tgz",
+ "integrity": "sha512-a5jlKftS7HUOhkUyYD7j2sJ/ZnvWiNlZS1ldR+g1ifQ+/UuZXIE+YTc/lK1qGj/GwAU5F8Z0e1eVq2t1J5Ob2g=="
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-builtin-module": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz",
+ "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==",
+ "dev": true,
+ "dependencies": {
+ "builtin-modules": "^3.3.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.13.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz",
+ "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==",
+ "dependencies": {
+ "has": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
+ "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==",
+ "dev": true
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-potential-custom-element-name": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
+ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="
+ },
+ "node_modules/is-reference": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
+ "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/jiti": {
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz",
+ "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==",
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
+ "node_modules/jose": {
+ "version": "4.14.6",
+ "resolved": "https://registry.npmjs.org/jose/-/jose-4.14.6.tgz",
+ "integrity": "sha512-EqJPEUlZD0/CSUMubKtMaYUOtWe91tZXTWMJZoKSbLk+KtdhNdcvppH8lA9XwVu2V4Ailvsj0GBZJ2ZwDjfesQ==",
+ "funding": {
+ "url": "https://github.com/sponsors/panva"
+ }
+ },
+ "node_modules/js-string-escape": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz",
+ "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsdom": {
+ "version": "22.1.0",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-22.1.0.tgz",
+ "integrity": "sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==",
+ "dependencies": {
+ "abab": "^2.0.6",
+ "cssstyle": "^3.0.0",
+ "data-urls": "^4.0.0",
+ "decimal.js": "^10.4.3",
+ "domexception": "^4.0.0",
+ "form-data": "^4.0.0",
+ "html-encoding-sniffer": "^3.0.0",
+ "http-proxy-agent": "^5.0.0",
+ "https-proxy-agent": "^5.0.1",
+ "is-potential-custom-element-name": "^1.0.1",
+ "nwsapi": "^2.2.4",
+ "parse5": "^7.1.2",
+ "rrweb-cssom": "^0.6.0",
+ "saxes": "^6.0.0",
+ "symbol-tree": "^3.2.4",
+ "tough-cookie": "^4.1.2",
+ "w3c-xmlserializer": "^4.0.0",
+ "webidl-conversions": "^7.0.0",
+ "whatwg-encoding": "^2.0.0",
+ "whatwg-mimetype": "^3.0.0",
+ "whatwg-url": "^12.0.1",
+ "ws": "^8.13.0",
+ "xml-name-validator": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "peerDependencies": {
+ "canvas": "^2.5.0"
+ },
+ "peerDependenciesMeta": {
+ "canvas": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
+ "node_modules/jsonc-parser": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz",
+ "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==",
+ "dev": true
+ },
+ "node_modules/keyv": {
+ "version": "4.5.3",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz",
+ "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==",
+ "dev": true,
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/kleur": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
+ "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/known-css-properties": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.28.0.tgz",
+ "integrity": "sha512-9pSL5XB4J+ifHP0e0jmmC98OGC1nL8/JjS+fi6mnTlIf//yt/MfVLtKg7S6nCtj/8KTcWX7nRlY0XywoYY1ISQ==",
+ "dev": true
+ },
+ "node_modules/kolorist": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz",
+ "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==",
+ "dev": true
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
+ "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
+ },
+ "node_modules/local-pkg": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz",
+ "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "node_modules/lodash.assign": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
+ "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw=="
+ },
+ "node_modules/lodash.castarray": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz",
+ "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==",
+ "dev": true
+ },
+ "node_modules/lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
+ "dev": true
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "node_modules/long": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
+ "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
+ },
+ "node_modules/loupe": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz",
+ "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==",
+ "dev": true,
+ "dependencies": {
+ "get-func-name": "^2.0.0"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lzo": {
+ "version": "0.4.11",
+ "resolved": "https://registry.npmjs.org/lzo/-/lzo-0.4.11.tgz",
+ "integrity": "sha512-apQHNoW2Alg72FMqaC/7pn03I7umdgSVFt2KRkCXXils4Z9u3QBh1uOtl2O5WmZIDLd9g6Lu4lIdOLmiSTFVCQ==",
+ "hasInstallScript": true,
+ "optional": true,
+ "dependencies": {
+ "bindings": "~1.2.1"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz",
+ "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.13"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/map-stream": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz",
+ "integrity": "sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ=="
+ },
+ "node_modules/marked": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz",
+ "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==",
+ "bin": {
+ "marked": "bin/marked.js"
+ },
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/md5-hex": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz",
+ "integrity": "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==",
+ "dev": true,
+ "dependencies": {
+ "blueimp-md5": "^2.10.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dependencies": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
+ "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
+ "dev": true,
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/mimic-response": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/min-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mingo": {
+ "version": "6.4.4",
+ "resolved": "https://registry.npmjs.org/mingo/-/mingo-6.4.4.tgz",
+ "integrity": "sha512-GtgwqyBVLxKf8tSvN26TjbK+XAUW5HlWR3D7qBsBh9urQyZznqG2BOx90t3MXklpSxawjvaANiWFUCIxd9xa7w=="
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.6"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/mkdirp-classic": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
+ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="
+ },
+ "node_modules/mlly": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz",
+ "integrity": "sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.10.0",
+ "pathe": "^1.1.1",
+ "pkg-types": "^1.0.3",
+ "ufo": "^1.3.0"
+ }
+ },
+ "node_modules/mri": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
+ "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mrmime": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz",
+ "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz",
+ "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.js"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18"
+ }
+ },
+ "node_modules/napi-build-utils": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz",
+ "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg=="
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "node_modules/natural-compare-lite": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz",
+ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==",
+ "dev": true
+ },
+ "node_modules/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
+ },
+ "node_modules/node-abi": {
+ "version": "3.47.0",
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.47.0.tgz",
+ "integrity": "sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==",
+ "dependencies": {
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/node-addon-api": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz",
+ "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA=="
+ },
+ "node_modules/node-int64": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.13",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz",
+ "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ=="
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nwsapi": {
+ "version": "2.2.7",
+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz",
+ "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ=="
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-hash": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz",
+ "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/object-stream": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/object-stream/-/object-stream-0.0.1.tgz",
+ "integrity": "sha512-+NPJnRvX9RDMRY9mOWOo/NDppBjbZhXirNNSu2IBnuNboClC9h1ZGHXgHBLDbJMHsxeJDq922aVmG5xs24a/cA==",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/oidc-token-hash": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz",
+ "integrity": "sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==",
+ "engines": {
+ "node": "^10.13.0 || >=12.0.0"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/onnx-proto": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/onnx-proto/-/onnx-proto-4.0.4.tgz",
+ "integrity": "sha512-aldMOB3HRoo6q/phyB6QRQxSt895HNNw82BNyZ2CMh4bjeKv7g/c+VpAFtJuEMVfYLMbRx61hbuqnKceLeDcDA==",
+ "dependencies": {
+ "protobufjs": "^6.8.8"
+ }
+ },
+ "node_modules/onnxruntime-common": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.14.0.tgz",
+ "integrity": "sha512-3LJpegM2iMNRX2wUmtYfeX/ytfOzNwAWKSq1HbRrKc9+uqG/FsEA0bbKZl1btQeZaXhC26l44NWpNUeXPII7Ew=="
+ },
+ "node_modules/onnxruntime-node": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.14.0.tgz",
+ "integrity": "sha512-5ba7TWomIV/9b6NH/1x/8QEeowsb+jBEvFzU6z0T4mNsFwdPqXeFUM7uxC6QeSRkEbWu3qEB0VMjrvzN/0S9+w==",
+ "optional": true,
+ "os": [
+ "win32",
+ "darwin",
+ "linux"
+ ],
+ "dependencies": {
+ "onnxruntime-common": "~1.14.0"
+ }
+ },
+ "node_modules/onnxruntime-web": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.14.0.tgz",
+ "integrity": "sha512-Kcqf43UMfW8mCydVGcX9OMXI2VN17c0p6XvR7IPSZzBf/6lteBzXHvcEVWDPmCKuGombl997HgLqj91F11DzXw==",
+ "dependencies": {
+ "flatbuffers": "^1.12.0",
+ "guid-typescript": "^1.0.9",
+ "long": "^4.0.0",
+ "onnx-proto": "^4.0.4",
+ "onnxruntime-common": "~1.14.0",
+ "platform": "^1.3.6"
+ }
+ },
+ "node_modules/openid-client": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.5.0.tgz",
+ "integrity": "sha512-Y7Xl8BgsrkzWLHkVDYuroM67hi96xITyEDSkmWaGUiNX6CkcXC3XyQGdv5aWZ6dukVKBFVQCADi9gCavOmU14w==",
+ "dependencies": {
+ "jose": "^4.14.4",
+ "lru-cache": "^6.0.0",
+ "object-hash": "^2.2.0",
+ "oidc-token-hash": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/panva"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
+ "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
+ "dev": true,
+ "dependencies": {
+ "@aashutoshrathi/word-wrap": "^1.2.3",
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parquetjs": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/parquetjs/-/parquetjs-0.11.2.tgz",
+ "integrity": "sha512-Y6FOc3Oi2AxY4TzJPz7fhICCR8tQNL3p+2xGQoUAMbmlJBR7+JJmMrwuyMjIpDiM7G8Wj/8oqOH4UDUmu4I5ZA==",
+ "dependencies": {
+ "brotli": "^1.3.0",
+ "bson": "^1.0.4",
+ "int53": "^0.2.4",
+ "object-stream": "0.0.1",
+ "snappyjs": "^0.6.0",
+ "thrift": "^0.11.0",
+ "varint": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=7.6"
+ },
+ "optionalDependencies": {
+ "lzo": "^0.4.0"
+ }
+ },
+ "node_modules/parquetjs/node_modules/bson": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz",
+ "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==",
+ "engines": {
+ "node": ">=0.6.19"
+ }
+ },
+ "node_modules/parse5": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
+ "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
+ "dependencies": {
+ "entities": "^4.4.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pathe": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz",
+ "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==",
+ "dev": true
+ },
+ "node_modules/pathval": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
+ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/pause-stream": {
+ "version": "0.0.11",
+ "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz",
+ "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==",
+ "dependencies": {
+ "through": "~2.3"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+ "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/pkg-types": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz",
+ "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==",
+ "dev": true,
+ "dependencies": {
+ "jsonc-parser": "^3.2.0",
+ "mlly": "^1.2.0",
+ "pathe": "^1.1.0"
+ }
+ },
+ "node_modules/platform": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz",
+ "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg=="
+ },
+ "node_modules/postcss": {
+ "version": "8.4.30",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.30.tgz",
+ "integrity": "sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-import": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
+ "dependencies": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-js": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
+ "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
+ "dependencies": {
+ "camelcase-css": "^2.0.1"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >= 16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.21"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
+ "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
+ "dev": true,
+ "dependencies": {
+ "lilconfig": "^2.0.5",
+ "yaml": "^1.10.2"
+ },
+ "engines": {
+ "node": ">= 10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-nested": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz",
+ "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.11"
+ },
+ "engines": {
+ "node": ">=12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.14"
+ }
+ },
+ "node_modules/postcss-nested/node_modules/postcss-selector-parser": {
+ "version": "6.0.13",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
+ "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-safe-parser": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz",
+ "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.3.3"
+ }
+ },
+ "node_modules/postcss-scss": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.8.tgz",
+ "integrity": "sha512-Cr0X8Eu7xMhE96PJck6ses/uVVXDtE5ghUTKNUYgm8ozgP2TkgV3LWs3WgLV1xaSSLq8ZFiXaUrj0LVgG1fGEA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss-scss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "engines": {
+ "node": ">=12.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.29"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.0.10",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
+ "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
+ },
+ "node_modules/postcss/node_modules/nanoid": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
+ "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/prebuild-install": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz",
+ "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==",
+ "dependencies": {
+ "detect-libc": "^2.0.0",
+ "expand-template": "^2.0.3",
+ "github-from-package": "0.0.0",
+ "minimist": "^1.2.3",
+ "mkdirp-classic": "^0.5.3",
+ "napi-build-utils": "^1.0.1",
+ "node-abi": "^3.3.0",
+ "pump": "^3.0.0",
+ "rc": "^1.2.7",
+ "simple-get": "^4.0.0",
+ "tar-fs": "^2.0.0",
+ "tunnel-agent": "^0.6.0"
+ },
+ "bin": {
+ "prebuild-install": "bin.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/prebuild-install/node_modules/tar-fs": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
+ "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
+ "dependencies": {
+ "chownr": "^1.1.1",
+ "mkdirp-classic": "^0.5.2",
+ "pump": "^3.0.0",
+ "tar-stream": "^2.1.4"
+ }
+ },
+ "node_modules/prebuild-install/node_modules/tar-stream": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
+ "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+ "dependencies": {
+ "bl": "^4.0.3",
+ "end-of-stream": "^1.4.1",
+ "fs-constants": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.1.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
+ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+ "dev": true,
+ "bin": {
+ "prettier": "bin-prettier.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/prettier-plugin-svelte": {
+ "version": "2.10.1",
+ "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-2.10.1.tgz",
+ "integrity": "sha512-Wlq7Z5v2ueCubWo0TZzKc9XHcm7TDxqcuzRuGd0gcENfzfT4JZ9yDlCbEgxWgiPmLHkBjfOtpAWkcT28MCDpUQ==",
+ "dev": true,
+ "peerDependencies": {
+ "prettier": "^1.16.4 || ^2.0.0",
+ "svelte": "^3.2.0 || ^4.0.0-next.0"
+ }
+ },
+ "node_modules/prettier-plugin-tailwindcss": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.2.8.tgz",
+ "integrity": "sha512-KgPcEnJeIijlMjsA6WwYgRs5rh3/q76oInqtMXBA/EMcamrcYJpyhtRhyX1ayT9hnHlHTuO8sIifHF10WuSDKg==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.17.0"
+ },
+ "peerDependencies": {
+ "@ianvs/prettier-plugin-sort-imports": "*",
+ "@prettier/plugin-pug": "*",
+ "@shopify/prettier-plugin-liquid": "*",
+ "@shufo/prettier-plugin-blade": "*",
+ "@trivago/prettier-plugin-sort-imports": "*",
+ "prettier": ">=2.2.0",
+ "prettier-plugin-astro": "*",
+ "prettier-plugin-css-order": "*",
+ "prettier-plugin-import-sort": "*",
+ "prettier-plugin-jsdoc": "*",
+ "prettier-plugin-organize-attributes": "*",
+ "prettier-plugin-organize-imports": "*",
+ "prettier-plugin-style-order": "*",
+ "prettier-plugin-svelte": "*",
+ "prettier-plugin-twig-melody": "*"
+ },
+ "peerDependenciesMeta": {
+ "@ianvs/prettier-plugin-sort-imports": {
+ "optional": true
+ },
+ "@prettier/plugin-pug": {
+ "optional": true
+ },
+ "@shopify/prettier-plugin-liquid": {
+ "optional": true
+ },
+ "@shufo/prettier-plugin-blade": {
+ "optional": true
+ },
+ "@trivago/prettier-plugin-sort-imports": {
+ "optional": true
+ },
+ "prettier-plugin-astro": {
+ "optional": true
+ },
+ "prettier-plugin-css-order": {
+ "optional": true
+ },
+ "prettier-plugin-import-sort": {
+ "optional": true
+ },
+ "prettier-plugin-jsdoc": {
+ "optional": true
+ },
+ "prettier-plugin-organize-attributes": {
+ "optional": true
+ },
+ "prettier-plugin-organize-imports": {
+ "optional": true
+ },
+ "prettier-plugin-style-order": {
+ "optional": true
+ },
+ "prettier-plugin-svelte": {
+ "optional": true
+ },
+ "prettier-plugin-twig-melody": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/pretty-format": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
+ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^17.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/pretty-format/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/protobufjs": {
+ "version": "6.11.4",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz",
+ "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "@protobufjs/aspromise": "^1.1.2",
+ "@protobufjs/base64": "^1.1.2",
+ "@protobufjs/codegen": "^2.0.4",
+ "@protobufjs/eventemitter": "^1.1.0",
+ "@protobufjs/fetch": "^1.1.0",
+ "@protobufjs/float": "^1.0.2",
+ "@protobufjs/inquire": "^1.1.0",
+ "@protobufjs/path": "^1.1.2",
+ "@protobufjs/pool": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.0",
+ "@types/long": "^4.0.1",
+ "@types/node": ">=13.7.0",
+ "long": "^4.0.0"
+ },
+ "bin": {
+ "pbjs": "bin/pbjs",
+ "pbts": "bin/pbts"
+ }
+ },
+ "node_modules/psl": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
+ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
+ },
+ "node_modules/pump": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+ "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/q": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+ "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
+ "engines": {
+ "node": ">=0.6.0",
+ "teleport": ">=0.2.0"
+ }
+ },
+ "node_modules/querystringify": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/queue-tick": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz",
+ "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag=="
+ },
+ "node_modules/rc": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+ "dependencies": {
+ "deep-extend": "^0.6.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ },
+ "bin": {
+ "rc": "cli.js"
+ }
+ },
+ "node_modules/rc/node_modules/strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+ "dev": true
+ },
+ "node_modules/read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "dependencies": {
+ "pify": "^2.3.0"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz",
+ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA=="
+ },
+ "node_modules/requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
+ },
+ "node_modules/resolve": {
+ "version": "1.22.6",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz",
+ "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==",
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rimraf/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "3.29.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.2.tgz",
+ "integrity": "sha512-CJouHoZ27v6siztc21eEQGo0kIcE5D1gVPA571ez0mMYb25LGYGKnVNXpEj5MGlepmDWGXNjDB5q7uNiPHC11A==",
+ "dev": true,
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=14.18.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/rrweb-cssom": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz",
+ "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw=="
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/sade": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz",
+ "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==",
+ "dev": true,
+ "dependencies": {
+ "mri": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "node_modules/sander": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz",
+ "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==",
+ "dev": true,
+ "dependencies": {
+ "es6-promise": "^3.1.2",
+ "graceful-fs": "^4.1.3",
+ "mkdirp": "^0.5.1",
+ "rimraf": "^2.5.2"
+ }
+ },
+ "node_modules/sander/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/sander/node_modules/rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ }
+ },
+ "node_modules/save": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/save/-/save-2.9.0.tgz",
+ "integrity": "sha512-eg8+g8CjvehE/2C6EbLdtK1pINVD27pcJLj4M9PjWWhoeha/y5bWf4dp/0RF+OzbKTcG1bae9qi3PAqiR8CJTg==",
+ "dependencies": {
+ "async": "^3.2.2",
+ "event-stream": "^4.0.1",
+ "lodash.assign": "^4.2.0",
+ "mingo": "^6.1.0"
+ }
+ },
+ "node_modules/saxes": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
+ "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
+ "dependencies": {
+ "xmlchars": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=v12.22.7"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/serpapi": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/serpapi/-/serpapi-1.1.1.tgz",
+ "integrity": "sha512-t5Bqu/6VMJ9naX8K+qCgUStpZOaNQFvIM4AudhMJLS6sqQT/EHaYrhGidDZHVx8QvcEdY6y1wNlxizOCtvJtUQ==",
+ "dependencies": {
+ "undici": "^5.12.0"
+ }
+ },
+ "node_modules/set-cookie-parser": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz",
+ "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==",
+ "dev": true
+ },
+ "node_modules/sharp": {
+ "version": "0.32.6",
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz",
+ "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "color": "^4.2.3",
+ "detect-libc": "^2.0.2",
+ "node-addon-api": "^6.1.0",
+ "prebuild-install": "^7.1.1",
+ "semver": "^7.5.4",
+ "simple-get": "^4.0.1",
+ "tar-fs": "^3.0.4",
+ "tunnel-agent": "^0.6.0"
+ },
+ "engines": {
+ "node": ">=14.15.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/siginfo": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
+ "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
+ "dev": true
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "node_modules/simple-concat": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/simple-get": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
+ "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "decompress-response": "^6.0.0",
+ "once": "^1.3.1",
+ "simple-concat": "^1.0.0"
+ }
+ },
+ "node_modules/simple-swizzle": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+ "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
+ "dependencies": {
+ "is-arrayish": "^0.3.1"
+ }
+ },
+ "node_modules/sirv": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz",
+ "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==",
+ "dev": true,
+ "dependencies": {
+ "@polka/url": "^1.0.0-next.20",
+ "mrmime": "^1.0.0",
+ "totalist": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/snappyjs": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/snappyjs/-/snappyjs-0.6.1.tgz",
+ "integrity": "sha512-YIK6I2lsH072UE0aOFxxY1dPDCS43I5ktqHpeAsuLNYWkE5pGxRGWfDM4/vSUfNzXjC1Ivzt3qx31PCLmc9yqg=="
+ },
+ "node_modules/sorcery": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz",
+ "integrity": "sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.14",
+ "buffer-crc32": "^0.2.5",
+ "minimist": "^1.2.0",
+ "sander": "^0.5.0"
+ },
+ "bin": {
+ "sorcery": "bin/sorcery"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/split": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
+ "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
+ "dependencies": {
+ "through": "2"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/stackback": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
+ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
+ "dev": true
+ },
+ "node_modules/std-env": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.4.3.tgz",
+ "integrity": "sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==",
+ "dev": true
+ },
+ "node_modules/stream-combiner": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz",
+ "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==",
+ "dependencies": {
+ "duplexer": "~0.1.1",
+ "through": "~2.3.4"
+ }
+ },
+ "node_modules/streamsearch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
+ "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/streamx": {
+ "version": "2.15.1",
+ "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.1.tgz",
+ "integrity": "sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==",
+ "dependencies": {
+ "fast-fifo": "^1.1.0",
+ "queue-tick": "^1.0.1"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/strip-indent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+ "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
+ "dev": true,
+ "dependencies": {
+ "min-indent": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/strip-literal": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz",
+ "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.10.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/sucrase": {
+ "version": "3.34.0",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz",
+ "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "glob": "7.1.6",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "ts-interface-checker": "^0.1.9"
+ },
+ "bin": {
+ "sucrase": "bin/sucrase",
+ "sucrase-node": "bin/sucrase-node"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/sucrase/node_modules/glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/svelte": {
+ "version": "3.59.2",
+ "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.59.2.tgz",
+ "integrity": "sha512-vzSyuGr3eEoAtT/A6bmajosJZIUWySzY2CzB3w2pgPvnkUjGqlDnsNnA0PMO+mMAhuyMul6C2uuZzY6ELSkzyA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/svelte-check": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.5.1.tgz",
+ "integrity": "sha512-+Zb4iHxAhdUtcUg/WJPRjlS1RJalIsWAe9Mz6G1zyznSs7dDkT7VUBdXc3q7Iwg49O/VrZgyJRvOJkjuBfKjFA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.17",
+ "chokidar": "^3.4.1",
+ "fast-glob": "^3.2.7",
+ "import-fresh": "^3.2.1",
+ "picocolors": "^1.0.0",
+ "sade": "^1.7.4",
+ "svelte-preprocess": "^5.0.4",
+ "typescript": "^5.0.3"
+ },
+ "bin": {
+ "svelte-check": "bin/svelte-check"
+ },
+ "peerDependencies": {
+ "svelte": "^3.55.0 || ^4.0.0-next.0 || ^4.0.0"
+ }
+ },
+ "node_modules/svelte-check/node_modules/typescript": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz",
+ "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/svelte-device-info": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/svelte-device-info/-/svelte-device-info-1.0.0.tgz",
+ "integrity": "sha512-KL5/fXmhKVtM4ogoj9xrFTPjoWtTy/a8VFA5kEooIJiL48+aETCG2/owMvrsoyBRybUkzVf4ixkj+DncpNWMqw=="
+ },
+ "node_modules/svelte-eslint-parser": {
+ "version": "0.33.0",
+ "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.33.0.tgz",
+ "integrity": "sha512-5awZ6Bs+Tb/zQwa41PSdcLynAVQTwW0HGyCBjtbAQ59taLZqDgQSMzRlDmapjZdDtzERm0oXDZNE0E+PKJ6ryg==",
+ "dev": true,
+ "dependencies": {
+ "eslint-scope": "^7.0.0",
+ "eslint-visitor-keys": "^3.0.0",
+ "espree": "^9.0.0",
+ "postcss": "^8.4.28",
+ "postcss-scss": "^4.0.7"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ota-meshi"
+ },
+ "peerDependencies": {
+ "svelte": "^3.37.0 || ^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "svelte": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/svelte-eslint-parser/node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/svelte-eslint-parser/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/svelte-hmr": {
+ "version": "0.15.3",
+ "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.3.tgz",
+ "integrity": "sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.20 || ^14.13.1 || >= 16"
+ },
+ "peerDependencies": {
+ "svelte": "^3.19.0 || ^4.0.0"
+ }
+ },
+ "node_modules/svelte-preprocess": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.0.4.tgz",
+ "integrity": "sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "dependencies": {
+ "@types/pug": "^2.0.6",
+ "detect-indent": "^6.1.0",
+ "magic-string": "^0.27.0",
+ "sorcery": "^0.11.0",
+ "strip-indent": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 14.10.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.10.2",
+ "coffeescript": "^2.5.1",
+ "less": "^3.11.3 || ^4.0.0",
+ "postcss": "^7 || ^8",
+ "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0",
+ "pug": "^3.0.0",
+ "sass": "^1.26.8",
+ "stylus": "^0.55.0",
+ "sugarss": "^2.0.0 || ^3.0.0 || ^4.0.0",
+ "svelte": "^3.23.0 || ^4.0.0-next.0 || ^4.0.0",
+ "typescript": ">=3.9.5 || ^4.0.0 || ^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@babel/core": {
+ "optional": true
+ },
+ "coffeescript": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "postcss": {
+ "optional": true
+ },
+ "postcss-load-config": {
+ "optional": true
+ },
+ "pug": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/symbol-tree": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
+ },
+ "node_modules/tailwind-scrollbar": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/tailwind-scrollbar/-/tailwind-scrollbar-3.0.5.tgz",
+ "integrity": "sha512-0ZwxTivevqq9BY9fRP9zDjHl7Tu+J5giBGbln+0O1R/7nHtBUKnjQcA1aTIhK7Oyjp6Uc/Dj6/dn8Dq58k5Uww==",
+ "engines": {
+ "node": ">=12.13.0"
+ },
+ "peerDependencies": {
+ "tailwindcss": "3.x"
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz",
+ "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==",
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "arg": "^5.0.2",
+ "chokidar": "^3.5.3",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.2.12",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "jiti": "^1.18.2",
+ "lilconfig": "^2.1.0",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.23",
+ "postcss-import": "^15.1.0",
+ "postcss-js": "^4.0.1",
+ "postcss-load-config": "^4.0.1",
+ "postcss-nested": "^6.0.1",
+ "postcss-selector-parser": "^6.0.11",
+ "resolve": "^1.22.2",
+ "sucrase": "^3.32.0"
+ },
+ "bin": {
+ "tailwind": "lib/cli.js",
+ "tailwindcss": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/object-hash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/postcss-load-config": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz",
+ "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==",
+ "dependencies": {
+ "lilconfig": "^2.0.5",
+ "yaml": "^2.1.1"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tailwindcss/node_modules/postcss-selector-parser": {
+ "version": "6.0.13",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
+ "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/yaml": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz",
+ "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/tar-fs": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz",
+ "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==",
+ "dependencies": {
+ "mkdirp-classic": "^0.5.2",
+ "pump": "^3.0.0",
+ "tar-stream": "^3.1.5"
+ }
+ },
+ "node_modules/tar-stream": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz",
+ "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==",
+ "dependencies": {
+ "b4a": "^1.6.4",
+ "fast-fifo": "^1.2.0",
+ "streamx": "^2.15.0"
+ }
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true
+ },
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "dependencies": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/thrift": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/thrift/-/thrift-0.11.0.tgz",
+ "integrity": "sha512-UpsBhOC45a45TpeHOXE4wwYwL8uD2apbHTbtBvkwtUU4dNwCjC7DpQTjw2Q6eIdfNtw+dKthdwq94uLXTJPfFw==",
+ "dependencies": {
+ "node-int64": "^0.4.0",
+ "q": "^1.5.0",
+ "ws": ">= 2.2.3"
+ },
+ "engines": {
+ "node": ">= 4.1.0"
+ }
+ },
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="
+ },
+ "node_modules/time-zone": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz",
+ "integrity": "sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/tiny-glob": {
+ "version": "0.2.9",
+ "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz",
+ "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==",
+ "dev": true,
+ "dependencies": {
+ "globalyzer": "0.1.0",
+ "globrex": "^0.1.2"
+ }
+ },
+ "node_modules/tinybench": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.1.tgz",
+ "integrity": "sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==",
+ "dev": true
+ },
+ "node_modules/tinypool": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.5.0.tgz",
+ "integrity": "sha512-paHQtnrlS1QZYKF/GnLoOM/DN9fqaGOFbCbxzAhwniySnzl9Ebk8w73/dd34DAhe/obUbPAOldTyYXQZxnPBPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tinyspy": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz",
+ "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/totalist": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz",
+ "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tough-cookie": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz",
+ "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==",
+ "dependencies": {
+ "psl": "^1.1.33",
+ "punycode": "^2.1.1",
+ "universalify": "^0.2.0",
+ "url-parse": "^1.5.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz",
+ "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==",
+ "dependencies": {
+ "punycode": "^2.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/ts-interface-checker": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="
+ },
+ "node_modules/tslib": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
+ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
+ "dev": true
+ },
+ "node_modules/tsutils": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^1.8.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "peerDependencies": {
+ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
+ }
+ },
+ "node_modules/tsutils/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ },
+ "node_modules/tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "4.9.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
+ "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=4.2.0"
+ }
+ },
+ "node_modules/ufo": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.0.tgz",
+ "integrity": "sha512-bRn3CsoojyNStCZe0BG0Mt4Nr/4KF+rhFlnNXybgqt5pXHNFRlqinSoQaTrGyzE4X8aHplSb+TorH+COin9Yxw==",
+ "dev": true
+ },
+ "node_modules/uglify-js": {
+ "version": "3.17.4",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz",
+ "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==",
+ "optional": true,
+ "bin": {
+ "uglifyjs": "bin/uglifyjs"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/undici": {
+ "version": "5.23.0",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-5.23.0.tgz",
+ "integrity": "sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==",
+ "dependencies": {
+ "busboy": "^1.6.0"
+ },
+ "engines": {
+ "node": ">=14.0"
+ }
+ },
+ "node_modules/universalify": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
+ "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/unplugin": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.5.0.tgz",
+ "integrity": "sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.10.0",
+ "chokidar": "^3.5.3",
+ "webpack-sources": "^3.2.3",
+ "webpack-virtual-modules": "^0.5.0"
+ }
+ },
+ "node_modules/unplugin-icons": {
+ "version": "0.16.6",
+ "resolved": "https://registry.npmjs.org/unplugin-icons/-/unplugin-icons-0.16.6.tgz",
+ "integrity": "sha512-jL70sAC7twp4hI/MTfm+vyvTRtHqiEIzf3XOjJz7yzhMEEQnk5Ey5YIXRAU03Mc4BF99ITvvnBzfyRZee86OeA==",
+ "dev": true,
+ "dependencies": {
+ "@antfu/install-pkg": "^0.1.1",
+ "@antfu/utils": "^0.7.6",
+ "@iconify/utils": "^2.1.9",
+ "debug": "^4.3.4",
+ "kolorist": "^1.8.0",
+ "local-pkg": "^0.4.3",
+ "unplugin": "^1.4.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@svgr/core": ">=7.0.0",
+ "@svgx/core": "^1.0.1",
+ "@vue/compiler-sfc": "^3.0.2 || ^2.7.0",
+ "vue-template-compiler": "^2.6.12",
+ "vue-template-es2015-compiler": "^1.9.0"
+ },
+ "peerDependenciesMeta": {
+ "@svgr/core": {
+ "optional": true
+ },
+ "@svgx/core": {
+ "optional": true
+ },
+ "@vue/compiler-sfc": {
+ "optional": true
+ },
+ "vue-template-compiler": {
+ "optional": true
+ },
+ "vue-template-es2015-compiler": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
+ "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/url-parse": {
+ "version": "1.5.10",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
+ "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+ "dependencies": {
+ "querystringify": "^2.1.1",
+ "requires-port": "^1.0.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ },
+ "node_modules/uuid": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/varint": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz",
+ "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow=="
+ },
+ "node_modules/vite": {
+ "version": "4.4.9",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz",
+ "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.18.10",
+ "postcss": "^8.4.27",
+ "rollup": "^3.27.1"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ },
+ "peerDependencies": {
+ "@types/node": ">= 14",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-node": {
+ "version": "0.31.4",
+ "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.31.4.tgz",
+ "integrity": "sha512-uzL377GjJtTbuc5KQxVbDu2xfU/x0wVjUtXQR2ihS21q/NK6ROr4oG0rsSkBBddZUVCwzfx22in76/0ZZHXgkQ==",
+ "dev": true,
+ "dependencies": {
+ "cac": "^6.7.14",
+ "debug": "^4.3.4",
+ "mlly": "^1.2.0",
+ "pathe": "^1.1.0",
+ "picocolors": "^1.0.0",
+ "vite": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "vite-node": "vite-node.mjs"
+ },
+ "engines": {
+ "node": ">=v14.18.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/vitefu": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz",
+ "integrity": "sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==",
+ "dev": true,
+ "peerDependencies": {
+ "vite": "^3.0.0 || ^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "vite": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vitest": {
+ "version": "0.31.4",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.31.4.tgz",
+ "integrity": "sha512-GoV0VQPmWrUFOZSg3RpQAPN+LPmHg2/gxlMNJlyxJihkz6qReHDV6b0pPDcqFLNEPya4tWJ1pgwUNP9MLmUfvQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/chai": "^4.3.5",
+ "@types/chai-subset": "^1.3.3",
+ "@types/node": "*",
+ "@vitest/expect": "0.31.4",
+ "@vitest/runner": "0.31.4",
+ "@vitest/snapshot": "0.31.4",
+ "@vitest/spy": "0.31.4",
+ "@vitest/utils": "0.31.4",
+ "acorn": "^8.8.2",
+ "acorn-walk": "^8.2.0",
+ "cac": "^6.7.14",
+ "chai": "^4.3.7",
+ "concordance": "^5.0.4",
+ "debug": "^4.3.4",
+ "local-pkg": "^0.4.3",
+ "magic-string": "^0.30.0",
+ "pathe": "^1.1.0",
+ "picocolors": "^1.0.0",
+ "std-env": "^3.3.2",
+ "strip-literal": "^1.0.1",
+ "tinybench": "^2.5.0",
+ "tinypool": "^0.5.0",
+ "vite": "^3.0.0 || ^4.0.0",
+ "vite-node": "0.31.4",
+ "why-is-node-running": "^2.2.2"
+ },
+ "bin": {
+ "vitest": "vitest.mjs"
+ },
+ "engines": {
+ "node": ">=v14.18.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "@edge-runtime/vm": "*",
+ "@vitest/browser": "*",
+ "@vitest/ui": "*",
+ "happy-dom": "*",
+ "jsdom": "*",
+ "playwright": "*",
+ "safaridriver": "*",
+ "webdriverio": "*"
+ },
+ "peerDependenciesMeta": {
+ "@edge-runtime/vm": {
+ "optional": true
+ },
+ "@vitest/browser": {
+ "optional": true
+ },
+ "@vitest/ui": {
+ "optional": true
+ },
+ "happy-dom": {
+ "optional": true
+ },
+ "jsdom": {
+ "optional": true
+ },
+ "playwright": {
+ "optional": true
+ },
+ "safaridriver": {
+ "optional": true
+ },
+ "webdriverio": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vitest/node_modules/magic-string": {
+ "version": "0.30.3",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.3.tgz",
+ "integrity": "sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.15"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/w3c-xmlserializer": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz",
+ "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==",
+ "dependencies": {
+ "xml-name-validator": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/webpack-sources": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+ "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webpack-virtual-modules": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz",
+ "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==",
+ "dev": true
+ },
+ "node_modules/well-known-symbols": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz",
+ "integrity": "sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/whatwg-encoding": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
+ "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
+ "dependencies": {
+ "iconv-lite": "0.6.3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/whatwg-mimetype": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz",
+ "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/whatwg-url": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz",
+ "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==",
+ "dependencies": {
+ "tr46": "^4.1.1",
+ "webidl-conversions": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/why-is-node-running": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz",
+ "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==",
+ "dev": true,
+ "dependencies": {
+ "siginfo": "^2.0.0",
+ "stackback": "0.0.2"
+ },
+ "bin": {
+ "why-is-node-running": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q=="
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ },
+ "node_modules/ws": {
+ "version": "8.14.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz",
+ "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/xml-name-validator": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
+ "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/xmlchars": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ },
+ "node_modules/yaml": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zod": {
+ "version": "3.22.2",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.2.tgz",
+ "integrity": "sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg==",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..95bf709ab9d860bf3108dd8cf7e5e73d17ba3487
--- /dev/null
+++ b/package.json
@@ -0,0 +1,67 @@
+{
+ "name": "chat-ui",
+ "version": "0.0.1",
+ "private": true,
+ "packageManager": "npm@9.5.0",
+ "scripts": {
+ "dev": "vite dev",
+ "build": "vite build",
+ "preview": "vite preview",
+ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
+ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
+ "lint": "prettier --plugin-search-dir . --check . && eslint .",
+ "format": "prettier --plugin-search-dir . --write .",
+ "test": "MONGODB_URL=mongodb://127.0.0.1:27017/ vitest"
+ },
+ "devDependencies": {
+ "@iconify-json/carbon": "^1.1.16",
+ "@iconify-json/eos-icons": "^1.1.6",
+ "@sveltejs/adapter-node": "^1.2.4",
+ "@sveltejs/kit": "^1.15.10",
+ "@tailwindcss/typography": "^0.5.9",
+ "@types/jsdom": "^21.1.1",
+ "@types/marked": "^4.0.8",
+ "@types/parquetjs": "^0.10.3",
+ "@typescript-eslint/eslint-plugin": "^5.45.0",
+ "@typescript-eslint/parser": "^5.45.0",
+ "eslint": "^8.28.0",
+ "eslint-config-prettier": "^8.5.0",
+ "eslint-plugin-svelte": "^2.27.3",
+ "prettier": "^2.8.0",
+ "prettier-plugin-svelte": "^2.8.1",
+ "prettier-plugin-tailwindcss": "^0.2.7",
+ "svelte": "^3.58.0",
+ "svelte-check": "^3.2.0",
+ "tslib": "^2.4.1",
+ "typescript": "^4.9.3",
+ "unplugin-icons": "^0.16.1",
+ "vite": "^4.3.9",
+ "vitest": "^0.31.0"
+ },
+ "type": "module",
+ "dependencies": {
+ "@huggingface/hub": "^0.5.1",
+ "@huggingface/inference": "^2.2.0",
+ "@xenova/transformers": "^2.0.0",
+ "autoprefixer": "^10.4.14",
+ "aws4fetch": "^1.0.17",
+ "date-fns": "^2.29.3",
+ "dexie": "^3.2.4",
+ "dotenv": "^16.0.3",
+ "handlebars": "^4.7.8",
+ "highlight.js": "^11.7.0",
+ "jsdom": "^22.0.0",
+ "marked": "^4.3.0",
+ "nanoid": "^4.0.2",
+ "openid-client": "^5.4.2",
+ "parquetjs": "^0.11.2",
+ "postcss": "^8.4.21",
+ "save": "^2.9.0",
+ "serpapi": "^1.1.1",
+ "svelte-device-info": "^1.0.0",
+ "tailwind-scrollbar": "^3.0.0",
+ "tailwindcss": "^3.3.1",
+ "uuid": "^9.0.1",
+ "zod": "^3.21.4"
+ }
+}
diff --git a/postcss.config.js b/postcss.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..7b75c83aff1c05e0e0e315638e07a22314603d4d
--- /dev/null
+++ b/postcss.config.js
@@ -0,0 +1,6 @@
+export default {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+};
diff --git a/src/app.d.ts b/src/app.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..dfd942be68dce05eda0ca563062e867c1230d866
--- /dev/null
+++ b/src/app.d.ts
@@ -0,0 +1,20 @@
+///
+///
+
+import type { User } from "$lib/types/User";
+
+// See https://kit.svelte.dev/docs/types#app
+// for information about these interfaces
+declare global {
+ namespace App {
+ // interface Error {}
+ interface Locals {
+ sessionId: string;
+ user?: User;
+ }
+ // interface PageData {}
+ // interface Platform {}
+ }
+}
+
+export {};
diff --git a/src/app.html b/src/app.html
new file mode 100644
index 0000000000000000000000000000000000000000..364c5b5c24e8d0dab3492c4382ba8b7c73c77feb
--- /dev/null
+++ b/src/app.html
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+ %sveltekit.head%
+
+
+ %sveltekit.body%
+
+
+
+
+
+
+
+
diff --git a/src/hooks.server.ts b/src/hooks.server.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d25bfa2d85b1f97596e59e72de28a98478e06288
--- /dev/null
+++ b/src/hooks.server.ts
@@ -0,0 +1,107 @@
+import { COOKIE_NAME, MESSAGES_BEFORE_LOGIN } from "$env/static/private";
+import type { Handle } from "@sveltejs/kit";
+import {
+ PUBLIC_GOOGLE_ANALYTICS_ID,
+ PUBLIC_DEPRECATED_GOOGLE_ANALYTICS_ID,
+ PUBLIC_ORIGIN,
+ PUBLIC_APP_DISCLAIMER,
+} from "$env/static/public";
+import { collections } from "$lib/server/database";
+import { base } from "$app/paths";
+import { refreshSessionCookie, requiresUser } from "$lib/server/auth";
+import { ERROR_MESSAGES } from "$lib/stores/errors";
+
+export const handle: Handle = async ({ event, resolve }) => {
+ const token = event.cookies.get(COOKIE_NAME);
+
+ event.locals.sessionId = token || crypto.randomUUID();
+
+ function errorResponse(status: number, message: string) {
+ const sendJson =
+ event.request.headers.get("accept")?.includes("application/json") ||
+ event.request.headers.get("content-type")?.includes("application/json");
+ return new Response(sendJson ? JSON.stringify({ error: message }) : message, {
+ status,
+ headers: {
+ "content-type": sendJson ? "application/json" : "text/plain",
+ },
+ });
+ }
+
+ // CSRF protection
+ const requestContentType = event.request.headers.get("content-type")?.split(";")[0] ?? "";
+ /** https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form#attr-enctype */
+ const nativeFormContentTypes = [
+ "multipart/form-data",
+ "application/x-www-form-urlencoded",
+ "text/plain",
+ ];
+ if (event.request.method === "POST" && nativeFormContentTypes.includes(requestContentType)) {
+ const referer = event.request.headers.get("referer");
+
+ if (!referer) {
+ return errorResponse(403, "Non-JSON form requests need to have a referer");
+ }
+
+ const validOrigins = [
+ new URL(event.request.url).origin,
+ ...(PUBLIC_ORIGIN ? [new URL(PUBLIC_ORIGIN).origin] : []),
+ ];
+
+ if (!validOrigins.includes(new URL(referer).origin)) {
+ return errorResponse(403, "Invalid referer for POST request");
+ }
+ }
+
+ if (
+ !event.url.pathname.startsWith(`${base}/login`) &&
+ !event.url.pathname.startsWith(`${base}/admin`) &&
+ !["GET", "OPTIONS", "HEAD"].includes(event.request.method)
+ ) {
+ if (
+ !user &&
+ requiresUser &&
+ !((MESSAGES_BEFORE_LOGIN ? parseInt(MESSAGES_BEFORE_LOGIN) : 0) > 0)
+ ) {
+ return errorResponse(401, ERROR_MESSAGES.authOnly);
+ }
+
+ // if login is not required and the call is not from /settings and we display the ethics modal with PUBLIC_APP_DISCLAIMER
+ // we check if the user has accepted the ethics modal first.
+ // If login is required, `ethicsModalAcceptedAt` is already true at this point, so do not pass this condition. This saves a DB call.
+ if (
+ !requiresUser &&
+ !event.url.pathname.startsWith(`${base}/settings`) &&
+ !!PUBLIC_APP_DISCLAIMER
+ ) {
+ const hasAcceptedEthicsModal = await collections.settings.countDocuments({
+ sessionId: event.locals.sessionId,
+ ethicsModalAcceptedAt: { $exists: true },
+ });
+
+ if (!hasAcceptedEthicsModal) {
+ return errorResponse(405, "You need to accept the welcome modal first");
+ }
+ }
+ }
+
+ refreshSessionCookie(event.cookies, event.locals.sessionId);
+
+ let replaced = false;
+
+ const response = await resolve(event, {
+ transformPageChunk: (chunk) => {
+ // For some reason, Sveltekit doesn't let us load env variables from .env in the app.html template
+ if (replaced || !chunk.html.includes("%gaId%") || !chunk.html.includes("%gaIdDeprecated%")) {
+ return chunk.html;
+ }
+ replaced = true;
+
+ return chunk.html
+ .replace("%gaId%", PUBLIC_GOOGLE_ANALYTICS_ID)
+ .replace("%gaIdDeprecated%", PUBLIC_DEPRECATED_GOOGLE_ANALYTICS_ID);
+ },
+ });
+
+ return response;
+};
diff --git a/src/lib/actions/snapScrollToBottom.ts b/src/lib/actions/snapScrollToBottom.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b22a0648221f6b58853a910fb6286f79574a0246
--- /dev/null
+++ b/src/lib/actions/snapScrollToBottom.ts
@@ -0,0 +1,54 @@
+import { navigating } from "$app/stores";
+import { tick } from "svelte";
+import { get } from "svelte/store";
+
+const detachedOffset = 10;
+
+/**
+ * @param node element to snap scroll to bottom
+ * @param dependency pass in a dependency to update scroll on changes.
+ */
+export const snapScrollToBottom = (node: HTMLElement, dependency: unknown) => {
+ let prevScrollValue = node.scrollTop;
+ let isDetached = false;
+
+ const handleScroll = () => {
+ // if user scrolled up, we detach
+ if (node.scrollTop < prevScrollValue) {
+ isDetached = true;
+ }
+
+ // if user scrolled back to within 10px of bottom, we reattach
+ if (node.scrollTop - (node.scrollHeight - node.clientHeight) >= -detachedOffset) {
+ isDetached = false;
+ }
+
+ prevScrollValue = node.scrollTop;
+ };
+
+ const updateScroll = async (_options: { force?: boolean } = {}) => {
+ const defaultOptions = { force: false };
+ const options = { ...defaultOptions, ..._options };
+ const { force } = options;
+
+ if (!force && isDetached && !get(navigating)) return;
+
+ // wait for next tick to ensure that the DOM is updated
+ await tick();
+
+ node.scrollTo({ top: node.scrollHeight });
+ };
+
+ node.addEventListener("scroll", handleScroll);
+
+ if (dependency) {
+ updateScroll({ force: true });
+ }
+
+ return {
+ update: updateScroll,
+ destroy: () => {
+ node.removeEventListener("scroll", handleScroll);
+ },
+ };
+};
diff --git a/src/lib/buildPrompt.ts b/src/lib/buildPrompt.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ef64e9870e2e5726c0729eaced5d8483dfce8bd7
--- /dev/null
+++ b/src/lib/buildPrompt.ts
@@ -0,0 +1,34 @@
+import type { BackendModel } from "./server/models";
+import type { Message } from "./types/Message";
+import { collections } from "$lib/server/database";
+import { authCondition } from "./server/auth";
+/**
+ * Convert [{user: "assistant", content: "hi"}, {user: "user", content: "hello"}] to:
+ *
+ * <|assistant|>hi<|endoftext|><|prompter|>hello<|endoftext|><|assistant|>
+ */
+
+interface buildPromptOptions {
+ messages: Pick[];
+ model: BackendModel;
+ locals?: App.Locals;
+ webSearchId?: string;
+ preprompt?: string;
+}
+
+export async function buildPrompt({
+ messages,
+ model,
+ locals,
+ webSearchId,
+ preprompt,
+}: buildPromptOptions): Promise {
+ return (
+ model
+ .chatPromptRender({ messages, preprompt })
+ // Not super precise, but it's truncated in the model's backend anyway
+ .split(" ")
+ .slice(-(model.parameters?.truncate ?? 0))
+ .join(" ")
+ );
+}
diff --git a/src/lib/components/AnnouncementBanner.svelte b/src/lib/components/AnnouncementBanner.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..7d6948a6b387ef45104b9b08294ac1e5920e607b
--- /dev/null
+++ b/src/lib/components/AnnouncementBanner.svelte
@@ -0,0 +1,15 @@
+
+
+
diff --git a/src/lib/components/CodeBlock.svelte b/src/lib/components/CodeBlock.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..dc7cbc500d9eb55e709ef2767ad25a91692fe129
--- /dev/null
+++ b/src/lib/components/CodeBlock.svelte
@@ -0,0 +1,28 @@
+
+
+
+
+
{@html highlightedCode || code.replaceAll("<", "<")}
+
+
diff --git a/src/lib/components/CopyToClipBoardBtn.svelte b/src/lib/components/CopyToClipBoardBtn.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..bf5a8e31aab6939dadcd43a17885762ffe768b1a
--- /dev/null
+++ b/src/lib/components/CopyToClipBoardBtn.svelte
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
diff --git a/src/lib/components/LoadingModal.svelte b/src/lib/components/LoadingModal.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..7bc9272d8ffcac2592c566af17911a3784661fa7
--- /dev/null
+++ b/src/lib/components/LoadingModal.svelte
@@ -0,0 +1,40 @@
+
+
+
+
+
+
Loading the model...
+
+
+
+ Please wait while we download the model. This has to be done only once.
+
+
+ {#await forceUpdate(pr) then _}
+ {#each [...loadingMap] as [key, value]}
+
{key}
+
+
+ {/each}
+ {/await}
+
+
diff --git a/src/lib/components/LoadingModalWritable.js b/src/lib/components/LoadingModalWritable.js
new file mode 100644
index 0000000000000000000000000000000000000000..57eae97758b5d85f746b2f155e9e2793270fb1a5
--- /dev/null
+++ b/src/lib/components/LoadingModalWritable.js
@@ -0,0 +1,5 @@
+import { writable } from "svelte/store";
+
+export const progress_writable = writable(0);
+export const curr_model_writable = writable("");
+export const map_writable = writable(["", ""]);
diff --git a/src/lib/components/LoginModal.svelte b/src/lib/components/LoginModal.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..ba94d916d3f4c7d72ed978940e9cde30210c18ba
--- /dev/null
+++ b/src/lib/components/LoginModal.svelte
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+ {PUBLIC_APP_NAME}
+
+ v{PUBLIC_VERSION}
+
+
+ {#if $page.data.requiresLogin}
+
+ Please Sign in with Hugging Face to continue
+
+ {/if}
+
+ Disclaimer: AI is an area of active research with known problems such as biased generation and
+ misinformation. Do not use this application for high-stakes decisions or advice.
+
+ {#if PUBLIC_APP_DATA_SHARING}
+
+ Your conversations will be shared with model authors unless you disable it from your
+ settings.
+
+ {/if}
+
+
+
diff --git a/src/lib/components/MobileNav.svelte b/src/lib/components/MobileNav.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..7225e83dcbadc2229cf76e0b024a346368cec43b
--- /dev/null
+++ b/src/lib/components/MobileNav.svelte
@@ -0,0 +1,62 @@
+
+
+
+ dispatch("toggle", true)}
+ aria-label="Open menu"
+ bind:this={openEl}>
+ {title}
+
+
+
+
+ dispatch("toggle", false)}
+ aria-label="Close menu"
+ bind:this={closeEl}>
+
+
+
diff --git a/src/lib/components/MobileWarningModal.svelte b/src/lib/components/MobileWarningModal.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..3fe909955a9c2ae33257f33f45e7ba666e220c99
--- /dev/null
+++ b/src/lib/components/MobileWarningModal.svelte
@@ -0,0 +1,25 @@
+
+
+
+
+
+
Warning
+
+
+ This chat is still a beta. Therefore, it might have some issues on your phone. Use at your own
+ risk.
+
+
+
diff --git a/src/lib/components/Modal.svelte b/src/lib/components/Modal.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..c161ad33088cdfd69326156c910e73579ce3b244
--- /dev/null
+++ b/src/lib/components/Modal.svelte
@@ -0,0 +1,62 @@
+
+
+
+
+
diff --git a/src/lib/components/ModelCardMetadata.svelte b/src/lib/components/ModelCardMetadata.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..97f55d30f612cd320dafb18912ae9819dd666569
--- /dev/null
+++ b/src/lib/components/ModelCardMetadata.svelte
@@ -0,0 +1,48 @@
+
+
+
+
+ Model
+ page
+ {#if model.datasetName || model.datasetUrl}
+
+ Dataset
+ page
+ {/if}
+ {#if model.websiteUrl}
+
+
+ Website
+
+ {/if}
+
diff --git a/src/lib/components/ModelsModal.svelte b/src/lib/components/ModelsModal.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..168a182909c69cd30db89238448bec2e43fc231b
--- /dev/null
+++ b/src/lib/components/ModelsModal.svelte
@@ -0,0 +1,149 @@
+
+
+
+
+
diff --git a/src/lib/components/NavConversationItem.svelte b/src/lib/components/NavConversationItem.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..dcbe0c4c9aac2c641774f735f8c92c9293f84c07
--- /dev/null
+++ b/src/lib/components/NavConversationItem.svelte
@@ -0,0 +1,89 @@
+
+
+ {
+ confirmDelete = false;
+ }}
+ on:click = {() => {params_writable.set(conv.id)}}
+ href="{base}/conversation/{conv.id}"
+ class="group flex h-11 flex-none items-center gap-1.5 rounded-lg pl-3 pr-2 text-gray-500 hover:bg-gray-100 dark:text-gray-400 dark:hover:bg-gray-700 {conv.id ===
+ $page.params.id
+ ? 'bg-gray-100 dark:bg-gray-700'
+ : ''}"
+>
+
+ {#if confirmDelete}
+ Delete
+ {/if}
+ {conv.title}
+
+
+ {#if confirmDelete}
+ dispatch("deleteConversation", conv.id)}
+ >
+
+
+ {
+ confirmDelete = false;
+ }}
+ >
+
+
+ {:else}
+ {
+ const newTitle = prompt("Edit this conversation title:", conv.title);
+ if (!newTitle) return;
+ dispatch("editConversationTitle", { id: conv.id, title: newTitle });
+ }}
+ >
+
+
+
+ {
+ if (event.shiftKey) {
+ dispatch("deleteConversation", conv.id);
+ } else {
+ confirmDelete = true;
+ }
+ }}
+ >
+
+
+ {/if}
+
diff --git a/src/lib/components/NavMenu.svelte b/src/lib/components/NavMenu.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..182b8ba3349cf58536d4584edf5194c4e26653d8
--- /dev/null
+++ b/src/lib/components/NavMenu.svelte
@@ -0,0 +1,105 @@
+
+
+
+
+ {#each conversations as conv (conv.id)}
+
+ {/each}
+
+
+ {#if user?.username || user?.email}
+
+ {user?.username || user?.email}
+
+ Sign Out
+
+
+ {/if}
+ {#if canLogin}
+
(loginModalVisible = true)}
+ type="button"
+ class="flex h-9 flex-none items-center gap-1.5 rounded-lg pl-3 pr-2 text-gray-500 hover:bg-gray-100 dark:text-gray-400 dark:hover:bg-gray-700"
+ >
+ Login
+
+ {/if}
+
+ Theme
+
+
dispatch("clickSettings")}
+ type="button"
+ class="flex h-9 flex-none items-center gap-1.5 rounded-lg pl-3 pr-2 text-gray-500 hover:bg-gray-100 dark:text-gray-400 dark:hover:bg-gray-700"
+ >
+ Settings
+
+
+ Feedback
+
+
+ About & Privacy
+
+
diff --git a/src/lib/components/OpenWebSearchResults.svelte b/src/lib/components/OpenWebSearchResults.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..4b8fff3eb21ed91259d4db10a2dd8bf1e854e8a4
--- /dev/null
+++ b/src/lib/components/OpenWebSearchResults.svelte
@@ -0,0 +1,114 @@
+
+
+
+
+ {#if error}
+
+ {:else if loading}
+
+ {:else}
+
+ {/if}
+ Web search
+
+
+
+
+
+
+
+ {#if webSearchMessages.length === 0}
+
+
+
+ {:else}
+
+ {#each webSearchMessages as message}
+ {#if message.type === "update"}
+
+
+
+
+ {message.message}
+
+
+ {#if message.args}
+
+ {message.args}
+
+ {/if}
+
+ {:else if message.type === "error"}
+
+
+
+
+ {message.message}
+
+
+ {#if message.args}
+
+ {message.args}
+
+ {/if}
+
+ {/if}
+ {/each}
+
+ {/if}
+
+
+
+
diff --git a/src/lib/components/Portal.svelte b/src/lib/components/Portal.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..dad285ed6bd7317f94c4e6152bf6c076ecbc52b5
--- /dev/null
+++ b/src/lib/components/Portal.svelte
@@ -0,0 +1,19 @@
+
+
+
+
+
diff --git a/src/lib/components/ScrollToBottomBtn.svelte b/src/lib/components/ScrollToBottomBtn.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..07e1d985def7d9e1fa2e4edd93c104c47b23b178
--- /dev/null
+++ b/src/lib/components/ScrollToBottomBtn.svelte
@@ -0,0 +1,46 @@
+
+
+{#if visible}
+ scrollNode.scrollTo({ top: scrollNode.scrollHeight, behavior: "smooth" })}
+ class="btn absolute flex h-[41px] w-[41px] rounded-full border bg-white shadow-md transition-all hover:bg-gray-100 dark:border-gray-600 dark:bg-gray-700 dark:shadow-gray-950 dark:hover:bg-gray-600 {className}"
+ >
+{/if}
diff --git a/src/lib/components/SettingsModal.svelte b/src/lib/components/SettingsModal.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..6bfa102893a76d3c9efc28e837f6ea30174b0b90
--- /dev/null
+++ b/src/lib/components/SettingsModal.svelte
@@ -0,0 +1,80 @@
+
+
+
+
+
+
Settings
+ dispatch("close")}>
+
+
+
+
{
+ dispatch("close");
+ }}
+ method="post"
+ action="{base}/settings"
+ >
+ (isConfirmingDeletion = true)}
+ >
+
+ Delete all conversations
+
+
+
+ Apply
+
+
+
+ {#if isConfirmingDeletion}
+
(isConfirmingDeletion = false)}>
+ {
+ dispatch("close");
+ }}
+ method="post"
+ action="{base}/conversations?/delete"
+ class="flex w-full flex-col gap-5 p-6"
+ >
+
+
Are you sure?
+ (isConfirmingDeletion = false)}>
+
+
+
+
+ This action will delete all your conversations. This cannot be undone.
+
+
+ Confirm deletion
+
+
+
+ {/if}
+
+
diff --git a/src/lib/components/StopGeneratingBtn.svelte b/src/lib/components/StopGeneratingBtn.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..fd29e9c12e7d09db7fc59f7df3b6d914dda37326
--- /dev/null
+++ b/src/lib/components/StopGeneratingBtn.svelte
@@ -0,0 +1,13 @@
+
+
+
+ Stop generating
+
diff --git a/src/lib/components/Switch.svelte b/src/lib/components/Switch.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..013bde8dff2a538b8d3df1d6f409bb02295b9c43
--- /dev/null
+++ b/src/lib/components/Switch.svelte
@@ -0,0 +1,13 @@
+
+
+
+
diff --git a/src/lib/components/Toast.svelte b/src/lib/components/Toast.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..2470d358ae52406fbedeb43cbf8e1dacd09c5aec
--- /dev/null
+++ b/src/lib/components/Toast.svelte
@@ -0,0 +1,19 @@
+
+
+
diff --git a/src/lib/components/Tooltip.svelte b/src/lib/components/Tooltip.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..0caf14d5edb956e14c686c68b588c1e984ee42a6
--- /dev/null
+++ b/src/lib/components/Tooltip.svelte
@@ -0,0 +1,22 @@
+
+
+
diff --git a/src/lib/components/WebSearchToggle.svelte b/src/lib/components/WebSearchToggle.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..66295e7637c1a6c573ff26e260c9cf58948b4421
--- /dev/null
+++ b/src/lib/components/WebSearchToggle.svelte
@@ -0,0 +1,27 @@
+
+
+
+
+
Search web
+
+
+
+
+ When enabled, the model will try to complement its answer with information queried from the
+ web.
+
+
+
+
diff --git a/src/lib/components/chat/ChatInput.svelte b/src/lib/components/chat/ChatInput.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..6ceb9f4a7e119ea173b8466d8ae4353351ba4a94
--- /dev/null
+++ b/src/lib/components/chat/ChatInput.svelte
@@ -0,0 +1,65 @@
+
+
+
+
+
+
{(value || " ") + "\n"}
+
+
+
+
+
diff --git a/src/lib/components/chat/ChatIntroduction.svelte b/src/lib/components/chat/ChatIntroduction.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..42fecfe1120c315c5035886df22493efa211bdd4
--- /dev/null
+++ b/src/lib/components/chat/ChatIntroduction.svelte
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+ {PUBLIC_APP_NAME}
+
+ v{PUBLIC_VERSION}
+
+
+
+ Enjoying the best AI models, with privacy
+
+
+
+
+ {#if isModelsModalOpen}
+
(isModelsModalOpen = false)} />
+ {/if}
+
+
+
+
Current Model
+
{currentModel.displayName}
+
+ {#if models.length > 1}
+
(isModelsModalOpen = true)}
+ class="btn ml-auto flex h-7 w-7 self-start rounded-full bg-gray-100 p-1 text-xs hover:bg-gray-100 dark:border-gray-600 dark:bg-gray-800 dark:hover:bg-gray-600"
+ >
+ {/if}
+
+
+
+
+ {#if currentModelMetadata.promptExamples}
+
+
+ {#each currentModelMetadata.promptExamples as example}
+ dispatch("message", example.prompt)}
+ >
+ {example.title}
+
+ {/each}
+
+
{/if}
+
diff --git a/src/lib/components/chat/ChatMessage.svelte b/src/lib/components/chat/ChatMessage.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..728e366ff5898b6c3d1b6de0eb15003b9caa1c26
--- /dev/null
+++ b/src/lib/components/chat/ChatMessage.svelte
@@ -0,0 +1,212 @@
+
+
+{#if message.from === "assistant"}
+ (isTapped = !isTapped)}
+ on:keypress={() => (isTapped = !isTapped)}
+ >
+
+
+ {#if webSearchMessages && webSearchMessages.length > 0}
+
+ {/if}
+ {#if !message.content && (webSearchIsDone || (webSearchMessages && webSearchMessages.length === 0))}
+
+ {/if}
+
+
+ {#each tokens as token}
+ {#if token.type === "code"}
+
+ {:else}
+
+ {@html marked(token.raw, options)}
+ {/if}
+ {/each}
+
+
+
+
+{/if}
+{#if message.from === "user"}
+
+
+
+ {message.content.trim()}
+
+ {#if !loading}
+
+
+
+
+ {/if}
+
+{/if}
diff --git a/src/lib/components/chat/ChatMessages.svelte b/src/lib/components/chat/ChatMessages.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..a8c89b1ca0e9a42a44855e35801e1f7c6a3bfa69
--- /dev/null
+++ b/src/lib/components/chat/ChatMessages.svelte
@@ -0,0 +1,83 @@
+
+
+
diff --git a/src/lib/components/chat/ChatWindow.svelte b/src/lib/components/chat/ChatWindow.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..e19a2b5d608f295ed1961e40b0d3239bcff8198d
--- /dev/null
+++ b/src/lib/components/chat/ChatWindow.svelte
@@ -0,0 +1,147 @@
+
+
+
+ {#if loginModalOpen}
+
(loginModalOpen = false)} />
+ {/if}
+ {
+ if (!loading) dispatch("retry", ev.detail);
+ }}
+ />
+
+
+ {#if settings?.searchEnabled}
+
+ {/if}
+ {#if loading}
+ dispatch("stop")}
+ />
+ {/if}
+
+
+
+
{
+ if (loginRequired) loginModalOpen = true;
+ }}
+ maxRows={4}
+ disabled={isReadOnly}
+ />
+
+ {#if loading}
+ dispatch("stop")}
+ >
+
+
+
+
+
+ {:else}
+
+
+
+ {/if}
+
+
+
+
+ Model: {currentModel.displayName} · Generated content may be inaccurate
+ or false.
+ 🔒 All conversations are end-to-end protected
+
+
+
+
+
diff --git a/src/lib/components/icons/IconChevron.svelte b/src/lib/components/icons/IconChevron.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..6368a08fc43ec23d8dab0205215ecc99d53fc295
--- /dev/null
+++ b/src/lib/components/icons/IconChevron.svelte
@@ -0,0 +1,20 @@
+
+
+
+
+
diff --git a/src/lib/components/icons/IconCopy.svelte b/src/lib/components/icons/IconCopy.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..79fdfe1c97a696bb9729db87ab409aeb974e9c53
--- /dev/null
+++ b/src/lib/components/icons/IconCopy.svelte
@@ -0,0 +1,26 @@
+
+
+
+
+
+
diff --git a/src/lib/components/icons/IconDazzled.svelte b/src/lib/components/icons/IconDazzled.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..a57479e34716923bb4e3dabf63453b97f4ffaf88
--- /dev/null
+++ b/src/lib/components/icons/IconDazzled.svelte
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/lib/components/icons/IconLoading.svelte b/src/lib/components/icons/IconLoading.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..878fd9d6c99bedbed50e4031cf83ce731543d8be
--- /dev/null
+++ b/src/lib/components/icons/IconLoading.svelte
@@ -0,0 +1,18 @@
+
+
+
diff --git a/src/lib/components/icons/Logo.svelte b/src/lib/components/icons/Logo.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..ffd45f2b3706a5a5af74cccf8a473e72bd93c34b
--- /dev/null
+++ b/src/lib/components/icons/Logo.svelte
@@ -0,0 +1,28 @@
+
+
+{#if PUBLIC_APP_ASSETS === "chatui"}
+
+
+
+{:else}
+
+{/if}
diff --git a/src/lib/components/icons/LogoHuggingFaceBorderless.svelte b/src/lib/components/icons/LogoHuggingFaceBorderless.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..89a92da09ec15b979b768ec7f5613410ceac5e53
--- /dev/null
+++ b/src/lib/components/icons/LogoHuggingFaceBorderless.svelte
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/lib/constants/publicSepToken.ts b/src/lib/constants/publicSepToken.ts
new file mode 100644
index 0000000000000000000000000000000000000000..15d962d69ba33e1abeb8a35885aa7647d24cf7af
--- /dev/null
+++ b/src/lib/constants/publicSepToken.ts
@@ -0,0 +1 @@
+export const PUBLIC_SEP_TOKEN = "";
diff --git a/src/lib/server/abortedGenerations.ts b/src/lib/server/abortedGenerations.ts
new file mode 100644
index 0000000000000000000000000000000000000000..575cf637bfef812c40905e35570ba3ca1a31b241
--- /dev/null
+++ b/src/lib/server/abortedGenerations.ts
@@ -0,0 +1,29 @@
+// Shouldn't be needed if we dove into sveltekit internals, see https://github.com/huggingface/chat-ui/pull/88#issuecomment-1523173850
+
+import { setTimeout } from "node:timers/promises";
+import { collections } from "./database";
+
+let closed = false;
+process.on("SIGINT", () => {
+ closed = true;
+});
+
+export let abortedGenerations: Map = new Map();
+
+async function maintainAbortedGenerations() {
+ while (!closed) {
+ await setTimeout(1000);
+
+ try {
+ const aborts = await collections.abortedGenerations.find({}).sort({ createdAt: 1 }).toArray();
+
+ abortedGenerations = new Map(
+ aborts.map(({ conversationId, createdAt }) => [conversationId.toString(), createdAt])
+ );
+ } catch (err) {
+ console.error(err);
+ }
+ }
+}
+
+maintainAbortedGenerations();
diff --git a/src/lib/server/auth.ts b/src/lib/server/auth.ts
new file mode 100644
index 0000000000000000000000000000000000000000..96793da575f6f01695d714a71d45ee181b9e1964
--- /dev/null
+++ b/src/lib/server/auth.ts
@@ -0,0 +1,118 @@
+import { Issuer, BaseClient, type UserinfoResponse, TokenSet } from "openid-client";
+import { addHours, addYears } from "date-fns";
+import {
+ COOKIE_NAME,
+ OPENID_CLIENT_ID,
+ OPENID_CLIENT_SECRET,
+ OPENID_PROVIDER_URL,
+ OPENID_SCOPES,
+} from "$env/static/private";
+import { sha256 } from "$lib/utils/sha256";
+import { z } from "zod";
+import { dev } from "$app/environment";
+import type { Cookies } from "@sveltejs/kit";
+
+export interface OIDCSettings {
+ redirectURI: string;
+}
+
+export interface OIDCUserInfo {
+ token: TokenSet;
+ userData: UserinfoResponse;
+}
+
+export const requiresUser = !!OPENID_CLIENT_ID && !!OPENID_CLIENT_SECRET;
+
+export function refreshSessionCookie(cookies: Cookies, sessionId: string) {
+ cookies.set(COOKIE_NAME, sessionId, {
+ path: "/",
+ // So that it works inside the space's iframe
+ sameSite: dev ? "lax" : "none",
+ secure: !dev,
+ httpOnly: true,
+ expires: addYears(new Date(), 1),
+ });
+}
+
+export const authCondition = (locals: App.Locals) => {
+ return locals.user
+ ? { userId: locals.user._id }
+ : { sessionId: locals.sessionId, userId: { $exists: false } };
+};
+
+/**
+ * Generates a CSRF token using the user sessionId. Note that we don't need a secret because sessionId is enough.
+ */
+export async function generateCsrfToken(sessionId: string, redirectUrl: string): Promise {
+ const data = {
+ expiration: addHours(new Date(), 1).getTime(),
+ redirectUrl,
+ };
+
+ return Buffer.from(
+ JSON.stringify({
+ data,
+ signature: await sha256(JSON.stringify(data) + "##" + sessionId),
+ })
+ ).toString("base64");
+}
+
+async function getOIDCClient(settings: OIDCSettings): Promise {
+ const issuer = await Issuer.discover(OPENID_PROVIDER_URL);
+ return new issuer.Client({
+ client_id: OPENID_CLIENT_ID,
+ client_secret: OPENID_CLIENT_SECRET,
+ redirect_uris: [settings.redirectURI],
+ response_types: ["code"],
+ });
+}
+
+export async function getOIDCAuthorizationUrl(
+ settings: OIDCSettings,
+ params: { sessionId: string }
+): Promise {
+ const client = await getOIDCClient(settings);
+ const csrfToken = await generateCsrfToken(params.sessionId, settings.redirectURI);
+ const url = client.authorizationUrl({
+ scope: OPENID_SCOPES,
+ state: csrfToken,
+ });
+
+ return url;
+}
+
+export async function getOIDCUserData(settings: OIDCSettings, code: string): Promise {
+ const client = await getOIDCClient(settings);
+ const token = await client.callback(settings.redirectURI, { code });
+ const userData = await client.userinfo(token);
+
+ return { token, userData };
+}
+
+export async function validateAndParseCsrfToken(
+ token: string,
+ sessionId: string
+): Promise<{
+ /** This is the redirect url that was passed to the OIDC provider */
+ redirectUrl: string;
+} | null> {
+ try {
+ const { data, signature } = z
+ .object({
+ data: z.object({
+ expiration: z.number().int(),
+ redirectUrl: z.string().url(),
+ }),
+ signature: z.string().length(64),
+ })
+ .parse(JSON.parse(token));
+ const reconstructSign = await sha256(JSON.stringify(data) + "##" + sessionId);
+
+ if (data.expiration > Date.now() && signature === reconstructSign) {
+ return { redirectUrl: data.redirectUrl };
+ }
+ } catch (e) {
+ console.error(e);
+ }
+ return null;
+}
diff --git a/src/lib/server/database.ts b/src/lib/server/database.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3820b0a6ab8410291a43c37413c2cd50e7550fd1
--- /dev/null
+++ b/src/lib/server/database.ts
@@ -0,0 +1,23 @@
+let client = undefined
+export const connectPromise = undefined
+
+const db = undefined
+
+const conversations = undefined
+const sharedConversations = undefined
+const abortedGenerations = undefined
+const settings = undefined
+const users = undefined
+const webSearches = undefined
+const messageEvents = undefined
+
+export { client, db };
+export const collections = {
+ conversations,
+ sharedConversations,
+ abortedGenerations,
+ settings,
+ users,
+ webSearches,
+ messageEvents,
+};
\ No newline at end of file
diff --git a/src/lib/server/generateFromDefaultEndpoint.ts b/src/lib/server/generateFromDefaultEndpoint.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8b16bf80bc70f4f9c179d38e4388798b69e212ca
--- /dev/null
+++ b/src/lib/server/generateFromDefaultEndpoint.ts
@@ -0,0 +1,104 @@
+import { defaultModel } from "$lib/server/models";
+import { modelEndpoint } from "./modelEndpoint";
+import { trimSuffix } from "$lib/utils/trimSuffix";
+import { trimPrefix } from "$lib/utils/trimPrefix";
+import { PUBLIC_SEP_TOKEN } from "$lib/constants/publicSepToken";
+import { AwsClient } from "aws4fetch";
+
+interface Parameters {
+ temperature: number;
+ truncate: number;
+ max_new_tokens: number;
+ stop: string[];
+}
+export async function generateFromDefaultEndpoint(
+ prompt: string,
+ parameters?: Partial
+) {
+ const newParameters = {
+ ...defaultModel.parameters,
+ ...parameters,
+ return_full_text: false,
+ };
+
+ const randomEndpoint = modelEndpoint(defaultModel);
+
+ const abortController = new AbortController();
+
+ let resp: Response;
+
+ if (randomEndpoint.host === "sagemaker") {
+ const requestParams = JSON.stringify({
+ ...newParameters,
+ inputs: prompt,
+ });
+
+ const aws = new AwsClient({
+ accessKeyId: randomEndpoint.accessKey,
+ secretAccessKey: randomEndpoint.secretKey,
+ sessionToken: randomEndpoint.sessionToken,
+ service: "sagemaker",
+ });
+
+ resp = await aws.fetch(randomEndpoint.url, {
+ method: "POST",
+ body: requestParams,
+ signal: abortController.signal,
+ headers: {
+ "Content-Type": "application/json",
+ },
+ });
+ } else {
+ resp = await fetch(randomEndpoint.url, {
+ headers: {
+ "Content-Type": "application/json",
+ Authorization: randomEndpoint.authorization,
+ },
+ method: "POST",
+ body: JSON.stringify({
+ ...newParameters,
+ inputs: prompt,
+ }),
+ signal: abortController.signal,
+ });
+ }
+
+ if (!resp.ok) {
+ throw new Error(await resp.text());
+ }
+
+ if (!resp.body) {
+ throw new Error("Response body is empty");
+ }
+
+ const decoder = new TextDecoder();
+ const reader = resp.body.getReader();
+
+ let isDone = false;
+ let result = "";
+
+ while (!isDone) {
+ const { done, value } = await reader.read();
+
+ isDone = done;
+ result += decoder.decode(value, { stream: true }); // Convert current chunk to text
+ }
+
+ // Close the reader when done
+ reader.releaseLock();
+
+ const results = await JSON.parse(result);
+
+ let generated_text = trimSuffix(
+ trimPrefix(trimPrefix(results[0].generated_text, "<|startoftext|>"), prompt),
+ PUBLIC_SEP_TOKEN
+ ).trimEnd();
+
+ for (const stop of [...(newParameters?.stop ?? []), "<|endoftext|>"]) {
+ if (generated_text.endsWith(stop)) {
+ generated_text = generated_text.slice(0, -stop.length).trimEnd();
+ }
+ }
+
+ return generated_text;
+}
diff --git a/src/lib/server/modelEndpoint.ts b/src/lib/server/modelEndpoint.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f824b5fe43921dccbbcc524c272d5c71ad880e25
--- /dev/null
+++ b/src/lib/server/modelEndpoint.ts
@@ -0,0 +1,59 @@
+import {
+ HF_ACCESS_TOKEN,
+ HF_API_ROOT,
+ USE_CLIENT_CERTIFICATE,
+ CERT_PATH,
+ KEY_PATH,
+ CA_PATH,
+ CLIENT_KEY_PASSWORD,
+ REJECT_UNAUTHORIZED,
+} from "$env/static/private";
+import { sum } from "$lib/utils/sum";
+import type { BackendModel, Endpoint } from "./models";
+
+import { loadClientCertificates } from "$lib/utils/loadClientCerts";
+
+if (USE_CLIENT_CERTIFICATE === "true") {
+ loadClientCertificates(
+ CERT_PATH,
+ KEY_PATH,
+ CA_PATH,
+ CLIENT_KEY_PASSWORD,
+ REJECT_UNAUTHORIZED === "true"
+ );
+}
+
+/**
+ * Find a random load-balanced endpoint
+ */
+export function modelEndpoint(model: BackendModel): Endpoint {
+ if (model.is_local ?? false) {
+ return {
+ host: "local",
+ model: model.name,
+ weight: 1,
+ url: `${HF_API_ROOT}/${model.name}`,
+ authorization: `Bearer ${HF_ACCESS_TOKEN}`,
+ };
+ } else if (!model.endpoints) {
+ return {
+ host: "tgi",
+ url: `${HF_API_ROOT}/${model.name}`,
+ authorization: `Bearer ${HF_ACCESS_TOKEN}`,
+ weight: 1,
+ };
+ }
+ const endpoints = model.endpoints;
+ const totalWeight = sum(endpoints.map((e) => e.weight));
+
+ let random = Math.random() * totalWeight;
+ for (const endpoint of endpoints) {
+ if (random < endpoint.weight) {
+ console.log(endpoint);
+ return endpoint;
+ }
+ random -= endpoint.weight;
+ }
+
+ throw new Error("Invalid config, no endpoint found");
+}
diff --git a/src/lib/server/models.ts b/src/lib/server/models.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d2b893de2c74d375b1d857ab84af732a785819ac
--- /dev/null
+++ b/src/lib/server/models.ts
@@ -0,0 +1,175 @@
+import { HF_ACCESS_TOKEN, MODELS, OLD_MODELS } from "$env/static/private";
+import type {
+ ChatTemplateInput,
+ WebSearchQueryTemplateInput,
+ WebSearchSummaryTemplateInput,
+} from "$lib/types/Template";
+import { compileTemplate } from "$lib/utils/template";
+import { z } from "zod";
+
+type Optional = Pick, K> & Omit;
+
+const sagemakerEndpoint = z.object({
+ host: z.literal("sagemaker"),
+ url: z.string().url(),
+ accessKey: z.string().min(1),
+ secretKey: z.string().min(1),
+ sessionToken: z.string().optional(),
+});
+
+const tgiEndpoint = z.object({
+ host: z.union([z.literal("tgi"), z.undefined()]),
+ url: z.string().url(),
+ authorization: z.string().min(1).default(`Bearer ${HF_ACCESS_TOKEN}`),
+});
+
+const localEndpoint = z.object({
+ host: z.union([z.literal("local"), z.undefined()]),
+ model: z.string(),
+ url: z.string().url(),
+ authorization: z.string().min(1).default(`Bearer ${HF_ACCESS_TOKEN}`),
+});
+
+const commonEndpoint = z.object({
+ weight: z.number().int().positive().default(1),
+});
+
+const endpoint = z.lazy(() =>
+ z.union([
+ sagemakerEndpoint.merge(commonEndpoint),
+ tgiEndpoint.merge(commonEndpoint),
+ localEndpoint.merge(commonEndpoint),
+ ])
+);
+
+const combinedEndpoint = endpoint.transform((data) => {
+ if (data.host === "tgi" || data.host === undefined) {
+ return tgiEndpoint.merge(commonEndpoint).parse(data);
+ } else if (data.host === "sagemaker") {
+ return sagemakerEndpoint.merge(commonEndpoint).parse(data);
+ } else if (data.host === "local") {
+ return localEndpoint.merge(commonEndpoint).parse(data);
+ } else {
+ throw new Error(`Invalid host: ${data.host}`);
+ }
+});
+
+const modelsRaw = z
+ .array(
+ z.object({
+ /** Used as an identifier in DB */
+ id: z.string().optional(),
+ /** Used to link to the model page, and for inference */
+ name: z.string().min(1),
+ displayName: z.string().min(1).optional(),
+ description: z.string().min(1).optional(),
+ is_local: z.boolean().optional(),
+ websiteUrl: z.string().url().optional(),
+ modelUrl: z.string().url().optional(),
+ datasetName: z.string().min(1).optional(),
+ datasetUrl: z.string().url().optional(),
+ userMessageToken: z.string().default(""),
+ userMessageEndToken: z.string().default(""),
+ assistantMessageToken: z.string().default(""),
+ assistantMessageEndToken: z.string().default(""),
+ messageEndToken: z.string().default(""),
+ preprompt: z.string().default(""),
+ prepromptUrl: z.string().url().optional(),
+ chatPromptTemplate: z
+ .string()
+ .default(
+ "{{preprompt}}" +
+ "{{#each messages}}" +
+ "{{#ifUser}}{{@root.userMessageToken}}{{content}}{{@root.userMessageEndToken}}{{/ifUser}}" +
+ "{{#ifAssistant}}{{@root.assistantMessageToken}}{{content}}{{@root.assistantMessageEndToken}}{{/ifAssistant}}" +
+ "{{/each}}" +
+ "{{assistantMessageToken}}"
+ ),
+ webSearchSummaryPromptTemplate: z
+ .string()
+ .default(
+ "{{userMessageToken}}{{answer}}{{userMessageEndToken}}" +
+ "{{userMessageToken}}" +
+ "The text above should be summarized to best answer the query: {{query}}." +
+ "{{userMessageEndToken}}" +
+ "{{assistantMessageToken}}Summary: "
+ ),
+ webSearchQueryPromptTemplate: z
+ .string()
+ .default(
+ "{{userMessageToken}}" +
+ "The following messages were written by a user, trying to answer a question." +
+ "{{userMessageEndToken}}" +
+ "{{#each messages}}" +
+ "{{#ifUser}}{{@root.userMessageToken}}{{content}}{{@root.userMessageEndToken}}{{/ifUser}}" +
+ "{{/each}}" +
+ "{{userMessageToken}}" +
+ "What plain-text english sentence would you input into Google to answer the last question? Answer with a short (10 words max) simple sentence." +
+ "{{userMessageEndToken}}" +
+ "{{assistantMessageToken}}Query: "
+ ),
+ promptExamples: z
+ .array(
+ z.object({
+ title: z.string().min(1),
+ prompt: z.string().min(1),
+ })
+ )
+ .optional(),
+ endpoints: z.array(combinedEndpoint).optional(),
+ parameters: z
+ .object({
+ temperature: z.number().min(0).max(1),
+ truncate: z.number().int().positive(),
+ max_new_tokens: z.number().int().positive(),
+ stop: z.array(z.string()).optional(),
+ })
+ .passthrough()
+ .optional(),
+ })
+ )
+ .parse(JSON.parse(MODELS));
+
+export const models = await Promise.all(
+ modelsRaw.map(async (m) => ({
+ ...m,
+ userMessageEndToken: m?.userMessageEndToken || m?.messageEndToken,
+ assistantMessageEndToken: m?.assistantMessageEndToken || m?.messageEndToken,
+ chatPromptRender: compileTemplate(m.chatPromptTemplate, m),
+ webSearchSummaryPromptRender: compileTemplate(
+ m.webSearchSummaryPromptTemplate,
+ m
+ ),
+ webSearchQueryPromptRender: compileTemplate(
+ m.webSearchQueryPromptTemplate,
+ m
+ ),
+ id: m.id || m.name,
+ displayName: m.displayName || m.name,
+ preprompt: m.prepromptUrl ? await fetch(m.prepromptUrl).then((r) => r.text()) : m.preprompt,
+ }))
+);
+
+// Models that have been deprecated
+export const oldModels = OLD_MODELS
+ ? z
+ .array(
+ z.object({
+ id: z.string().optional(),
+ name: z.string().min(1),
+ displayName: z.string().min(1).optional(),
+ })
+ )
+ .parse(JSON.parse(OLD_MODELS))
+ .map((m) => ({ ...m, id: m.id || m.name, displayName: m.displayName || m.name }))
+ : [];
+
+export type BackendModel = Optional<(typeof models)[0], "preprompt">;
+export type Endpoint = z.infer;
+
+export const defaultModel = models[0];
+
+export const validateModel = (_models: BackendModel[]) => {
+ // Zod enum function requires 2 parameters
+ return z.enum([_models[0].id, ..._models.slice(1).map((m) => m.id)]);
+};
diff --git a/src/lib/server/websearch/generateQuery.ts b/src/lib/server/websearch/generateQuery.ts
new file mode 100644
index 0000000000000000000000000000000000000000..252bd0cad20cd5f8f7406fec09babaef647e4a46
--- /dev/null
+++ b/src/lib/server/websearch/generateQuery.ts
@@ -0,0 +1,13 @@
+import type { Message } from "$lib/types/Message";
+import { generateFromDefaultEndpoint } from "../generateFromDefaultEndpoint";
+import { defaultModel } from "../models";
+
+export async function generateQuery(messages: Message[]) {
+ const promptSearchQuery = defaultModel.webSearchQueryPromptRender({ messages });
+ const searchQuery = await generateFromDefaultEndpoint(promptSearchQuery).then((query) => {
+ const arr = query.split(/\r?\n/);
+ return arr[0].length > 0 ? arr[0] : arr[1];
+ });
+
+ return searchQuery;
+}
diff --git a/src/lib/server/websearch/parseWeb.ts b/src/lib/server/websearch/parseWeb.ts
new file mode 100644
index 0000000000000000000000000000000000000000..fe3e567a6e2b936c627f35b498719e7d19841c53
--- /dev/null
+++ b/src/lib/server/websearch/parseWeb.ts
@@ -0,0 +1,56 @@
+import { JSDOM, VirtualConsole } from "jsdom";
+
+function removeTags(node: Node) {
+ if (node.hasChildNodes()) {
+ node.childNodes.forEach((childNode) => {
+ if (node.nodeName === "SCRIPT" || node.nodeName === "STYLE") {
+ node.removeChild(childNode);
+ } else {
+ removeTags(childNode);
+ }
+ });
+ }
+}
+function naiveInnerText(node: Node): string {
+ const Node = node; // We need Node(DOM's Node) for the constants, but Node doesn't exist in the nodejs global space, and any Node instance references the constants through the prototype chain
+ return [...node.childNodes]
+ .map((childNode) => {
+ switch (childNode.nodeType) {
+ case Node.TEXT_NODE:
+ return node.textContent;
+ case Node.ELEMENT_NODE:
+ return naiveInnerText(childNode);
+ default:
+ return "";
+ }
+ })
+ .join("\n");
+}
+
+export async function parseWeb(url: string) {
+ const abortController = new AbortController();
+ setTimeout(() => abortController.abort(), 10000);
+ const htmlString = await fetch(url, { signal: abortController.signal })
+ .then((response) => response.text())
+ .catch((err) => console.log(err));
+
+ const virtualConsole = new VirtualConsole();
+ virtualConsole.on("error", () => {
+ // No-op to skip console errors.
+ });
+
+ // put the html string into a DOM
+ const dom = new JSDOM(htmlString ?? "", {
+ virtualConsole,
+ });
+
+ const body = dom.window.document.querySelector("body");
+ if (!body) throw new Error("body of the webpage is null");
+
+ removeTags(body);
+
+ // recursively extract text content from the body and then remove newlines and multiple spaces
+ const text = (naiveInnerText(body) ?? "").replace(/ {2}|\r\n|\n|\r/gm, "");
+
+ return text;
+}
diff --git a/src/lib/server/websearch/searchWeb.ts b/src/lib/server/websearch/searchWeb.ts
new file mode 100644
index 0000000000000000000000000000000000000000..42369689a102e1d01ea1f9a38d1b1a6f9a571298
--- /dev/null
+++ b/src/lib/server/websearch/searchWeb.ts
@@ -0,0 +1,63 @@
+import { SERPAPI_KEY, SERPER_API_KEY } from "$env/static/private";
+
+import { getJson } from "serpapi";
+import type { GoogleParameters } from "serpapi";
+
+// Show result as JSON
+export async function searchWeb(query: string) {
+ if (SERPER_API_KEY) {
+ return await searchWebSerper(query);
+ }
+ if (SERPAPI_KEY) {
+ return await searchWebSerpApi(query);
+ }
+ throw new Error("No Serper.dev or SerpAPI key found");
+}
+
+export async function searchWebSerper(query: string) {
+ const params = {
+ q: query,
+ hl: "en",
+ gl: "us",
+ };
+
+ const response = await fetch("https://google.serper.dev/search", {
+ method: "POST",
+ body: JSON.stringify(params),
+ headers: {
+ "x-api-key": SERPER_API_KEY,
+ "Content-type": "application/json; charset=UTF-8",
+ },
+ });
+
+ /* eslint-disable @typescript-eslint/no-explicit-any */
+ const data = (await response.json()) as Record;
+
+ if (!response.ok) {
+ throw new Error(
+ data["message"] ??
+ `Serper API returned error code ${response.status} - ${response.statusText}`
+ );
+ }
+
+ return {
+ organic_results: data["organic"] ?? [],
+ knowledge_graph: data["knowledgeGraph"] ?? null,
+ answer_box: data["answerBox"] ?? null,
+ };
+}
+
+export async function searchWebSerpApi(query: string) {
+ const params = {
+ q: query,
+ hl: "en",
+ gl: "us",
+ google_domain: "google.com",
+ api_key: SERPAPI_KEY,
+ } satisfies GoogleParameters;
+
+ // Show result as JSON
+ const response = await getJson("google", params);
+
+ return response;
+}
diff --git a/src/lib/server/websearch/summarizeWeb.ts b/src/lib/server/websearch/summarizeWeb.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2998f79e6939f16f6d5c6ff2967bead5729470e7
--- /dev/null
+++ b/src/lib/server/websearch/summarizeWeb.ts
@@ -0,0 +1,39 @@
+import { HF_ACCESS_TOKEN } from "$env/static/private";
+import { HfInference } from "@huggingface/inference";
+import { defaultModel } from "$lib/server/models";
+import type { BackendModel } from "../models";
+import { generateFromDefaultEndpoint } from "../generateFromDefaultEndpoint";
+
+export async function summarizeWeb(content: string, query: string, model: BackendModel) {
+ // if HF_ACCESS_TOKEN is set, we use a HF dedicated endpoint for summarization
+ try {
+ if (HF_ACCESS_TOKEN) {
+ const summary = (
+ await new HfInference(HF_ACCESS_TOKEN).summarization({
+ model: "facebook/bart-large-cnn",
+ inputs: content,
+ parameters: {
+ max_length: 512,
+ },
+ })
+ ).summary_text;
+ return summary;
+ }
+ } catch (e) {
+ console.log(e);
+ }
+
+ // else we use the LLM to generate a summary
+ const summaryPrompt = defaultModel.webSearchSummaryPromptRender({
+ answer: content
+ .split(" ")
+ .slice(0, model.parameters?.truncate ?? 0)
+ .join(" "),
+ query: query,
+ });
+ const summary = await generateFromDefaultEndpoint(summaryPrompt).then((txt: string) =>
+ txt.trim()
+ );
+
+ return summary;
+}
diff --git a/src/lib/shareConversation.ts b/src/lib/shareConversation.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4768b604a42258d5d97231dd0e44f9198ef1864c
--- /dev/null
+++ b/src/lib/shareConversation.ts
@@ -0,0 +1,27 @@
+import { base } from "$app/paths";
+import { ERROR_MESSAGES, error } from "$lib/stores/errors";
+import { share } from "./utils/share";
+
+export async function shareConversation(id: string, title: string) {
+ try {
+ const res = await fetch(`${base}/conversation/${id}/share`, {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ });
+
+ if (!res.ok) {
+ error.set("Error while sharing conversation, try again.");
+ console.error("Error while sharing conversation: " + (await res.text()));
+ return;
+ }
+
+ const { url } = await res.json();
+
+ share(url, title);
+ } catch (err) {
+ error.set(ERROR_MESSAGES.default);
+ console.error(err);
+ }
+}
diff --git a/src/lib/stores/errors.ts b/src/lib/stores/errors.ts
new file mode 100644
index 0000000000000000000000000000000000000000..144b16faba7cb1f74e1b5d8451403ab340ed1638
--- /dev/null
+++ b/src/lib/stores/errors.ts
@@ -0,0 +1,9 @@
+import { writable } from "svelte/store";
+
+export const ERROR_MESSAGES = {
+ default: "Oops, something went wrong.",
+ authOnly: "You have to be logged in.",
+ rateLimited: "You are sending too many messages. Try again later.",
+};
+
+export const error = writable(null);
diff --git a/src/lib/stores/pendingMessage.ts b/src/lib/stores/pendingMessage.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f28d7aaf9995f9848f6c7988503c20a08d81d97c
--- /dev/null
+++ b/src/lib/stores/pendingMessage.ts
@@ -0,0 +1,3 @@
+import { writable } from "svelte/store";
+
+export const pendingMessage = writable("");
diff --git a/src/lib/stores/pendingMessageIdToRetry.ts b/src/lib/stores/pendingMessageIdToRetry.ts
new file mode 100644
index 0000000000000000000000000000000000000000..47eec8770ae561b2c4881c5d001a3d46ee699b3b
--- /dev/null
+++ b/src/lib/stores/pendingMessageIdToRetry.ts
@@ -0,0 +1,4 @@
+import type { Message } from "$lib/types/Message";
+import { writable } from "svelte/store";
+
+export const pendingMessageIdToRetry = writable(null);
diff --git a/src/lib/stores/webSearchParameters.ts b/src/lib/stores/webSearchParameters.ts
new file mode 100644
index 0000000000000000000000000000000000000000..fd088a60621090930e9600c6086380afd2b412e8
--- /dev/null
+++ b/src/lib/stores/webSearchParameters.ts
@@ -0,0 +1,9 @@
+import { writable } from "svelte/store";
+export interface WebSearchParameters {
+ useSearch: boolean;
+ nItems: number;
+}
+export const webSearchParameters = writable({
+ useSearch: false,
+ nItems: 5,
+});
diff --git a/src/lib/switchTheme.ts b/src/lib/switchTheme.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9da30b244c4b20b4585b34a02617895a3499a56f
--- /dev/null
+++ b/src/lib/switchTheme.ts
@@ -0,0 +1,10 @@
+export function switchTheme() {
+ const { classList } = document.querySelector("html") as HTMLElement;
+ if (classList.contains("dark")) {
+ classList.remove("dark");
+ localStorage.theme = "light";
+ } else {
+ classList.add("dark");
+ localStorage.theme = "dark";
+ }
+}
diff --git a/src/lib/types/AbortedGeneration.ts b/src/lib/types/AbortedGeneration.ts
new file mode 100644
index 0000000000000000000000000000000000000000..fe4c2824b4f3257bea71c3acacd65fcee0918188
--- /dev/null
+++ b/src/lib/types/AbortedGeneration.ts
@@ -0,0 +1,8 @@
+// Ideally shouldn't be needed, see https://github.com/huggingface/chat-ui/pull/88#issuecomment-1523173850
+
+import type { Conversation } from "./Conversation";
+import type { Timestamps } from "./Timestamps";
+
+export interface AbortedGeneration extends Timestamps {
+ conversationId: Conversation["_id"];
+}
diff --git a/src/lib/types/Conversation.ts b/src/lib/types/Conversation.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5ad6670d27b853d9261dffcaa7b08fc16f739d4f
--- /dev/null
+++ b/src/lib/types/Conversation.ts
@@ -0,0 +1,17 @@
+import type { Message } from "./Message";
+import type { Timestamps } from "./Timestamps";
+import type { User } from "./User";
+
+export interface Conversation extends Timestamps {
+ sessionId?: string;
+ userId?: User["_id"];
+
+ model: string;
+
+ title: string;
+ messages: Message[];
+
+ meta?: {
+ fromShareId?: string;
+ };
+}
diff --git a/src/lib/types/Message.ts b/src/lib/types/Message.ts
new file mode 100644
index 0000000000000000000000000000000000000000..34908219c0debe1d9ba932a6003b58739d414d44
--- /dev/null
+++ b/src/lib/types/Message.ts
@@ -0,0 +1,9 @@
+import type { Timestamps } from "./Timestamps";
+
+export type Message = Partial & {
+ from: "user" | "assistant";
+ id: ReturnType;
+ content: string;
+ webSearchId?: string;
+ score?: -1 | 0 | 1;
+};
diff --git a/src/lib/types/MessageEvent.ts b/src/lib/types/MessageEvent.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7ec1a4b4303a2cd69e79a084b162102e04d2d5f7
--- /dev/null
+++ b/src/lib/types/MessageEvent.ts
@@ -0,0 +1,6 @@
+import type { Timestamps } from "./Timestamps";
+import type { User } from "./User";
+
+export interface MessageEvent extends Pick {
+ userId: User["_id"] | User["sessionId"];
+}
diff --git a/src/lib/types/Model.ts b/src/lib/types/Model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c0af16d471ddc3b6feafc7e68ee45a98717b8ebf
--- /dev/null
+++ b/src/lib/types/Model.ts
@@ -0,0 +1,16 @@
+import type { BackendModel } from "$lib/server/models";
+
+export type Model = Pick<
+ BackendModel,
+ | "id"
+ | "name"
+ | "displayName"
+ | "websiteUrl"
+ | "datasetName"
+ | "promptExamples"
+ | "parameters"
+ | "description"
+ | "modelUrl"
+ | "datasetUrl"
+ | "preprompt"
+>;
diff --git a/src/lib/types/Settings.ts b/src/lib/types/Settings.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b14b45e07ae9356f98a87efe6fe11a603eea0774
--- /dev/null
+++ b/src/lib/types/Settings.ts
@@ -0,0 +1,26 @@
+import { defaultModel } from "$lib/server/models";
+import type { Timestamps } from "./Timestamps";
+import type { User } from "./User";
+
+export interface Settings extends Timestamps {
+ userId?: User["_id"];
+ sessionId?: string;
+
+ /**
+ * Note: Only conversations with this settings explicitly set to true should be shared.
+ *
+ * This setting is explicitly set to true when users accept the ethics modal.
+ * */
+ shareConversationsWithModelAuthors: boolean;
+ ethicsModalAcceptedAt: Date | null;
+ activeModel: string;
+
+ // model name and system prompts
+ customPrompts?: Record;
+}
+
+// TODO: move this to a constant file along with other constants
+export const DEFAULT_SETTINGS = {
+ shareConversationsWithModelAuthors: true,
+ activeModel: defaultModel.id,
+};
diff --git a/src/lib/types/SharedConversation.ts b/src/lib/types/SharedConversation.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e8981ed83a8871ef49fa539a14cb1ebfca599ea0
--- /dev/null
+++ b/src/lib/types/SharedConversation.ts
@@ -0,0 +1,12 @@
+import type { Message } from "./Message";
+import type { Timestamps } from "./Timestamps";
+
+export interface SharedConversation extends Timestamps {
+ _id: string;
+
+ hash: string;
+
+ model: string;
+ title: string;
+ messages: Message[];
+}
diff --git a/src/lib/types/Template.ts b/src/lib/types/Template.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8b5ee9c39a9b68ddcbba1ce096e77372ae92355b
--- /dev/null
+++ b/src/lib/types/Template.ts
@@ -0,0 +1,23 @@
+import type { Message } from "./Message";
+
+export type LegacyParamatersTemplateInput = {
+ preprompt?: string;
+ userMessageToken: string;
+ userMessageEndToken: string;
+ assistantMessageToken: string;
+ assistantMessageEndToken: string;
+};
+
+export type ChatTemplateInput = {
+ messages: Pick[];
+ preprompt?: string;
+};
+
+export type WebSearchSummaryTemplateInput = {
+ answer: string;
+ query: string;
+};
+
+export type WebSearchQueryTemplateInput = {
+ messages: Pick[];
+};
diff --git a/src/lib/types/Timestamps.ts b/src/lib/types/Timestamps.ts
new file mode 100644
index 0000000000000000000000000000000000000000..12d1867d1be509310190df09d2392bfaa77d6500
--- /dev/null
+++ b/src/lib/types/Timestamps.ts
@@ -0,0 +1,4 @@
+export interface Timestamps {
+ createdAt: Date;
+ updatedAt: Date;
+}
diff --git a/src/lib/types/UrlDependency.ts b/src/lib/types/UrlDependency.ts
new file mode 100644
index 0000000000000000000000000000000000000000..dca26f87f494d42c15d5f6079a0a5cacd81e59a9
--- /dev/null
+++ b/src/lib/types/UrlDependency.ts
@@ -0,0 +1,5 @@
+/* eslint-disable no-shadow */
+export enum UrlDependency {
+ ConversationList = "conversation:list",
+ Conversation = "conversation",
+}
diff --git a/src/lib/types/User.ts b/src/lib/types/User.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9d154874b18422b8950917ca78744b520afd7b6a
--- /dev/null
+++ b/src/lib/types/User.ts
@@ -0,0 +1,12 @@
+import type { Timestamps } from "./Timestamps";
+
+export interface User extends Timestamps {
+ username?: string;
+ name: string;
+ email?: string;
+ avatarUrl: string;
+ hfUserId: string;
+
+ // Session identifier, stored in the cookie
+ sessionId: string;
+}
diff --git a/src/lib/types/WebSearch.ts b/src/lib/types/WebSearch.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7416f01f1a2c7ea9b94f525aec473312bc3deefd
--- /dev/null
+++ b/src/lib/types/WebSearch.ts
@@ -0,0 +1,36 @@
+import type { Conversation } from "./Conversation";
+import type { Timestamps } from "./Timestamps";
+
+export interface WebSearch extends Timestamps {
+ prompt: string;
+
+ searchQuery: string;
+ results: string[];
+ knowledgeGraph: string;
+ answerBox: string;
+ summary: string;
+
+ messages: WebSearchMessage[];
+}
+
+export type WebSearchMessageUpdate = {
+ type: "update";
+ message: string;
+ args?: string[];
+};
+
+export type WebSearchMessageError = {
+ type: "error";
+ message: string;
+ args?: string[];
+};
+
+export type WebSearchMessageResult = {
+ type: "result";
+ id: string;
+};
+
+export type WebSearchMessage =
+ | WebSearchMessageUpdate
+ | WebSearchMessageResult
+ | WebSearchMessageError;
diff --git a/src/lib/utils/analytics.ts b/src/lib/utils/analytics.ts
new file mode 100644
index 0000000000000000000000000000000000000000..72fd5d70df54c0436a8aa3f5fca4dfbcb5f64ff5
--- /dev/null
+++ b/src/lib/utils/analytics.ts
@@ -0,0 +1,39 @@
+export interface GAEvent {
+ hitType: "event";
+ eventCategory: string;
+ eventAction: string;
+ eventLabel?: string;
+ eventValue?: number;
+}
+
+// Send a Google Analytics event
+export function sendAnalyticsEvent({
+ eventCategory,
+ eventAction,
+ eventLabel,
+ eventValue,
+}: Omit): void {
+ // Mandatory fields
+ const event: GAEvent = {
+ hitType: "event",
+ eventCategory,
+ eventAction,
+ };
+ // Optional fields
+ if (eventLabel) {
+ event.eventLabel = eventLabel;
+ }
+ if (eventValue) {
+ event.eventValue = eventValue;
+ }
+
+ // @ts-expect-error typescript doesn't know gtag is on the window object
+ if (!!window?.gtag && typeof window?.gtag === "function") {
+ // @ts-expect-error typescript doesn't know gtag is on the window object
+ window?.gtag("event", eventAction, {
+ event_category: event.eventCategory,
+ event_label: event.eventLabel,
+ value: event.eventValue,
+ });
+ }
+}
diff --git a/src/lib/utils/concatUint8Arrays.ts b/src/lib/utils/concatUint8Arrays.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e53396eca7e3dee20a543fb6ac28ecf48c7e3965
--- /dev/null
+++ b/src/lib/utils/concatUint8Arrays.ts
@@ -0,0 +1,12 @@
+import { sum } from "./sum";
+
+export function concatUint8Arrays(arrays: Uint8Array[]): Uint8Array {
+ const totalLength = sum(arrays.map((a) => a.length));
+ const result = new Uint8Array(totalLength);
+ let offset = 0;
+ for (const array of arrays) {
+ result.set(array, offset);
+ offset += array.length;
+ }
+ return result;
+}
diff --git a/src/lib/utils/deepestChild.ts b/src/lib/utils/deepestChild.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ac6ed1d1dd64e6f3a8bbd559887de77b3e49f8c3
--- /dev/null
+++ b/src/lib/utils/deepestChild.ts
@@ -0,0 +1,6 @@
+export function deepestChild(el: HTMLElement): HTMLElement {
+ if (el.lastElementChild && el.lastElementChild.nodeType !== Node.TEXT_NODE) {
+ return deepestChild(el.lastElementChild as HTMLElement);
+ }
+ return el;
+}
diff --git a/src/lib/utils/hashConv.ts b/src/lib/utils/hashConv.ts
new file mode 100644
index 0000000000000000000000000000000000000000..de014324f6f21fbb67a61d098844027cfcdad0bf
--- /dev/null
+++ b/src/lib/utils/hashConv.ts
@@ -0,0 +1,12 @@
+import type { Conversation } from "$lib/types/Conversation";
+import { sha256 } from "./sha256";
+
+export async function hashConv(conv: Conversation) {
+ // messages contains the conversation message but only the immutable part
+ const messages = conv.messages.map((message) => {
+ return (({ from, id, content, webSearchId }) => ({ from, id, content, webSearchId }))(message);
+ });
+
+ const hash = await sha256(JSON.stringify(messages));
+ return hash;
+}
diff --git a/src/lib/utils/loadClientCerts.ts b/src/lib/utils/loadClientCerts.ts
new file mode 100644
index 0000000000000000000000000000000000000000..feb8c01e771846cf6191baf1f5d9d7d2b74cde29
--- /dev/null
+++ b/src/lib/utils/loadClientCerts.ts
@@ -0,0 +1,50 @@
+import * as fs from "fs";
+import { setGlobalDispatcher, Agent } from "undici";
+
+/**
+ * Load client certificates for mutual TLS authentication. This function must be called before any HTTP requests are made.
+ * This is a global setting that affects all HTTP requests made by the application using the native fetch API.
+ *
+ * @param clientCertPath Path to client certificate
+ * @param clientKeyPath Path to client key
+ * @param caCertPath Path to CA certificate [optional]
+ * @param clientKeyPassword Password for client key [optional]
+ * @param rejectUnauthorized Reject unauthorized certificates.
+ * Only use for testing/development, not recommended in production environments [optional]
+ *
+ * @returns void
+ *
+ * @example
+ * ```typescript
+ * loadClientCertificates("cert.pem", "key.pem", "ca.pem", "password", false);
+ * ```
+ *
+ * @see
+ * [Undici Agent](https://undici.nodejs.org/#/docs/api/Agent)
+ * @see
+ * [Undici Dispatcher](https://undici.nodejs.org/#/docs/api/Dispatcher)
+ * @see
+ * [NodeJS Native Fetch API](https://nodejs.org/docs/latest-v19.x/api/globals.html#fetch)
+ */
+export function loadClientCertificates(
+ clientCertPath: string,
+ clientKeyPath: string,
+ caCertPath?: string,
+ clientKeyPassword?: string,
+ rejectUnauthorized?: boolean
+): void {
+ const clientCert = fs.readFileSync(clientCertPath);
+ const clientKey = fs.readFileSync(clientKeyPath);
+ const caCert = caCertPath ? fs.readFileSync(caCertPath) : undefined;
+ const agent = new Agent({
+ connect: {
+ cert: clientCert,
+ key: clientKey,
+ ca: caCert,
+ passphrase: clientKeyPassword,
+ rejectUnauthorized: rejectUnauthorized,
+ },
+ });
+
+ setGlobalDispatcher(agent);
+}
diff --git a/src/lib/utils/models.ts b/src/lib/utils/models.ts
new file mode 100644
index 0000000000000000000000000000000000000000..181288d8d6a2cc1a852c9087dcbb8a3392e70051
--- /dev/null
+++ b/src/lib/utils/models.ts
@@ -0,0 +1,4 @@
+import type { Model } from "$lib/types/Model";
+
+export const findCurrentModel = (models: Model[], id?: string) =>
+ models.find((m) => m.id === id) ?? models[0];
diff --git a/src/lib/utils/randomUuid.ts b/src/lib/utils/randomUuid.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9d536365c57659305ad28d6fc06b89d77ab337ab
--- /dev/null
+++ b/src/lib/utils/randomUuid.ts
@@ -0,0 +1,14 @@
+type UUID = ReturnType;
+
+export function randomUUID(): UUID {
+ // Only on old safari / ios
+ if (!("randomUUID" in crypto)) {
+ return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, (c) =>
+ (
+ Number(c) ^
+ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (Number(c) / 4)))
+ ).toString(16)
+ ) as UUID;
+ }
+ return crypto.randomUUID();
+}
diff --git a/src/lib/utils/sha256.ts b/src/lib/utils/sha256.ts
new file mode 100644
index 0000000000000000000000000000000000000000..43059b518fc5a4da6ed08ab36aeb6c289007f6aa
--- /dev/null
+++ b/src/lib/utils/sha256.ts
@@ -0,0 +1,7 @@
+export async function sha256(input: string): Promise {
+ const utf8 = new TextEncoder().encode(input);
+ const hashBuffer = await crypto.subtle.digest("SHA-256", utf8);
+ const hashArray = Array.from(new Uint8Array(hashBuffer));
+ const hashHex = hashArray.map((bytes) => bytes.toString(16).padStart(2, "0")).join("");
+ return hashHex;
+}
diff --git a/src/lib/utils/share.ts b/src/lib/utils/share.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4587669a10164aa7c961429fbddec9cf438c0eca
--- /dev/null
+++ b/src/lib/utils/share.ts
@@ -0,0 +1,7 @@
+export function share(url: string, title: string) {
+ if (navigator.share) {
+ navigator.share({ url, title });
+ } else {
+ prompt("Copy this public url to share:", url);
+ }
+}
diff --git a/src/lib/utils/streamToAsyncIterable.ts b/src/lib/utils/streamToAsyncIterable.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e935d719c8c29eb5e4efc30812f61b5f44716923
--- /dev/null
+++ b/src/lib/utils/streamToAsyncIterable.ts
@@ -0,0 +1,15 @@
+// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for-await...of#iterating_over_async_generators
+export async function* streamToAsyncIterable(
+ stream: ReadableStream
+): AsyncIterableIterator {
+ const reader = stream.getReader();
+ try {
+ while (true) {
+ const { done, value } = await reader.read();
+ if (done) return;
+ yield value;
+ }
+ } finally {
+ reader.releaseLock();
+ }
+}
diff --git a/src/lib/utils/sum.ts b/src/lib/utils/sum.ts
new file mode 100644
index 0000000000000000000000000000000000000000..289b70584ef9f7795b1f4b1bf0151237dc2c55ff
--- /dev/null
+++ b/src/lib/utils/sum.ts
@@ -0,0 +1,3 @@
+export function sum(nums: number[]): number {
+ return nums.reduce((a, b) => a + b, 0);
+}
diff --git a/src/lib/utils/template.ts b/src/lib/utils/template.ts
new file mode 100644
index 0000000000000000000000000000000000000000..87360c88fe6c655fff39f7947da9c6b345402a60
--- /dev/null
+++ b/src/lib/utils/template.ts
@@ -0,0 +1,28 @@
+import type { Message } from "$lib/types/Message";
+import type { LegacyParamatersTemplateInput } from "$lib/types/Template";
+import Handlebars from "handlebars";
+
+Handlebars.registerHelper("ifUser", function (this: Pick, options) {
+ if (this.from == "user") return options.fn(this);
+});
+
+Handlebars.registerHelper(
+ "ifAssistant",
+ function (this: Pick, options) {
+ if (this.from == "assistant") return options.fn(this);
+ }
+);
+
+export function compileTemplate(input: string, model: LegacyParamatersTemplateInput) {
+ const template = Handlebars.compile(input, {
+ knownHelpers: { ifUser: true, ifAssistant: true },
+ knownHelpersOnly: true,
+ noEscape: true,
+ strict: true,
+ preventIndent: true,
+ });
+
+ return function render(inputs: T, options?: RuntimeOptions) {
+ return template({ ...model, ...inputs }, options);
+ };
+}
diff --git a/src/lib/utils/trimPrefix.ts b/src/lib/utils/trimPrefix.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d006e66deca639f3f4d208e77a64ba368fab00ee
--- /dev/null
+++ b/src/lib/utils/trimPrefix.ts
@@ -0,0 +1,6 @@
+export function trimPrefix(input: string, prefix: string) {
+ if (input.startsWith(prefix)) {
+ return input.slice(prefix.length);
+ }
+ return input;
+}
diff --git a/src/lib/utils/trimSuffix.ts b/src/lib/utils/trimSuffix.ts
new file mode 100644
index 0000000000000000000000000000000000000000..729107942ebaa2d7e1281dd77f8e52e8b135a5ad
--- /dev/null
+++ b/src/lib/utils/trimSuffix.ts
@@ -0,0 +1,6 @@
+export function trimSuffix(input: string, end: string): string {
+ if (input.endsWith(end)) {
+ return input.slice(0, input.length - end.length);
+ }
+ return input;
+}
diff --git a/src/routes/+error.svelte b/src/routes/+error.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..6836376aa41a8ef0bef4064e070e5de5c184879e
--- /dev/null
+++ b/src/routes/+error.svelte
@@ -0,0 +1,15 @@
+
+
+
+
+
{$page.status}
+
+
{$page.error?.message}
+
+
diff --git a/src/routes/+layout.server.ts b/src/routes/+layout.server.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2dc2719486d1302c27cff849385868b31932ed2e
--- /dev/null
+++ b/src/routes/+layout.server.ts
@@ -0,0 +1,65 @@
+import { redirect } from "@sveltejs/kit";
+import type { LayoutServerLoad } from "./$types";
+import { collections } from "$lib/server/database";
+import type { Conversation } from "$lib/types/Conversation";
+import { UrlDependency } from "$lib/types/UrlDependency";
+import { defaultModel, models, oldModels, validateModel } from "$lib/server/models";
+import { authCondition, requiresUser } from "$lib/server/auth";
+import { DEFAULT_SETTINGS } from "$lib/types/Settings";
+import { SERPAPI_KEY, SERPER_API_KEY, MESSAGES_BEFORE_LOGIN } from "$env/static/private";
+
+export const load: LayoutServerLoad = async ({ locals, depends, url }) => {
+ const { conversations } = collections;
+ const urlModel = url.searchParams.get("model");
+
+ depends(UrlDependency.ConversationList);
+
+ if (urlModel) {
+ const isValidModel = validateModel(models).safeParse(urlModel).success;
+
+ if (isValidModel) {
+ await collections.settings.updateOne(
+ authCondition(locals),
+ { $set: { activeModel: urlModel } },
+ { upsert: true }
+ );
+ }
+
+ throw redirect(302, url.pathname);
+ }
+
+
+ return {
+ conversations: [],
+ settings: {
+ shareConversationsWithModelAuthors:
+ DEFAULT_SETTINGS.shareConversationsWithModelAuthors,
+ ethicsModalAcceptedAt: null,
+ activeModel: DEFAULT_SETTINGS.activeModel,
+ searchEnabled: false,
+ customPrompts: {},
+ },
+ models: models.map((model) => ({
+ id: model.id,
+ name: model.name,
+ websiteUrl: model.websiteUrl,
+ modelUrl: model.modelUrl,
+ is_local: model.is_local,
+ datasetName: model.datasetName,
+ datasetUrl: model.datasetUrl,
+ displayName: model.displayName,
+ description: model.description,
+ promptExamples: model.promptExamples,
+ parameters: model.parameters,
+ preprompt: model.preprompt,
+ })),
+ oldModels,
+ user: locals.user && {
+ username: locals.user.username,
+ avatarUrl: locals.user.avatarUrl,
+ email: locals.user.email,
+ },
+ requiresLogin: requiresUser,
+ messagesBeforeLogin: MESSAGES_BEFORE_LOGIN ? parseInt(MESSAGES_BEFORE_LOGIN) : 0,
+ };
+};
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..388ae30686ebc9774c1dcf1a37849ea67bc62fb6
--- /dev/null
+++ b/src/routes/+layout.svelte
@@ -0,0 +1,213 @@
+
+
+
+ {PUBLIC_APP_NAME}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ (isNavOpen = ev.detail)}
+ title={conversations_list.find((conv) => conv.id === $page.params.id)?.title}
+ >
+ shareConversation(ev.detail.id, ev.detail.title)}
+ on:deleteConversation={(ev) => deleteConversation(ev.detail)}
+ on:clickSettings={() => (isSettingsOpen = true)}
+ on:editConversationTitle={(ev) => editConversationTitle(ev.detail.id, ev.detail.title)}
+ />
+
+
+ shareConversation(ev.detail.id, ev.detail.title)}
+ on:deleteConversation={(ev) => deleteConversation(ev.detail)}
+ on:clickSettings={() => (isSettingsOpen = true)}
+ on:editConversationTitle={(ev) => editConversationTitle(ev.detail.id, ev.detail.title)}
+ />
+
+ {#if currentError}
+
+ {/if}
+ {#if isloading}
+
+ {/if}
+ {#if isSettingsOpen}
+ (isSettingsOpen = false)}
+ settings={data.settings}
+ models={data.models}
+ />
+ {/if}
+ {#if (requiresLogin && data.messagesBeforeLogin === 0) || loginModalVisible}
+
+ {/if}
+
+
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..e095e01268d005b9c518e9f7c95444322785eaf3
--- /dev/null
+++ b/src/routes/+page.svelte
@@ -0,0 +1,60 @@
+
+
+
+ {PUBLIC_APP_NAME}
+
+
+ createConversation(ev.detail)}
+ {loading}
+ currentModel={findCurrentModel([...data.models, ...data.oldModels], data.settings.activeModel)}
+ models={data.models}
+ settings={data.settings}
+/>
diff --git a/src/routes/LayoutWritable.js b/src/routes/LayoutWritable.js
new file mode 100644
index 0000000000000000000000000000000000000000..52e64c4c295bfbf8583af45843acc395e80b3c49
--- /dev/null
+++ b/src/routes/LayoutWritable.js
@@ -0,0 +1,5 @@
+import { writable } from "svelte/store";
+
+export const isloading_writable = writable(false);
+export const refresh_chats_writable = writable([]);
+export const refresh_chats_writable_empty = writable(false);
diff --git a/src/routes/LocalDB.ts b/src/routes/LocalDB.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9f99886068f8543e8cb6b7d8121c0809b39482c5
--- /dev/null
+++ b/src/routes/LocalDB.ts
@@ -0,0 +1,154 @@
+import Dexie, { type Table, liveQuery } from 'dexie';
+import { refresh_chats_writable_empty, refresh_chats_writable } from "../routes/LayoutWritable";
+import { env } from '$env/dynamic/public';
+
+export interface Chat {
+ index?: number;
+ title: string,
+ id: string;
+ createdAt: Date,
+ message?: Array;
+}
+
+export interface MessageDb {
+ content: string;
+ from: string;
+ id: string;
+ createdAt: Date;
+ updatedAt: Date;
+}
+
+export class ChatDatabase extends Dexie {
+ chats!: Table;
+
+ constructor() {
+ super('blindchat');
+ this.version(16).stores({
+ chats: '++index, title, createdAt, id, message'
+ });
+ }
+}
+
+export async function createChat(id_chat: string, msg: MessageDb | undefined, title?: string) {
+ try {
+ let title_f = ""
+ if (title === undefined) {
+ let count = (await db.chats.count()) + 1
+ title_f = "Untitled " + count
+ }
+ else
+ title_f = title
+ const chat = {
+ id: id_chat,
+ title: title_f,
+ message: msg === undefined ? undefined : [msg],
+ createdAt: new Date(),
+ }
+ const id = await db.chats.add(chat);
+ } catch (error) {
+ console.log(error)
+ }
+ let push = await getChats()
+ refresh_chats_writable.set(push)
+}
+
+export async function deleteAllChats() {
+ const chat_ret = await db.chats.clear()
+ refresh_chats_writable_empty.set(true)
+}
+
+export async function deleteChat(id_chat: string) {
+ const chat_ret = await db.chats.where("id").equals(id_chat).delete()
+ let count = await db.chats.count()
+ if (count > 0) {
+ let push = await getChats()
+ refresh_chats_writable.set(push)
+ }
+ else {
+ refresh_chats_writable_empty.set(true)
+ }
+}
+
+export async function modifyTitle(id_chat: string, newTitle: string) {
+ const chat_ret = db.chats.where("id").equals(id_chat)
+ let count = await chat_ret.count()
+ if (count > 0) {
+ let res = await chat_ret.first()
+ chat_ret.modify({title: newTitle})
+ let push = await getChats()
+ refresh_chats_writable.set(push)
+ }
+}
+
+export async function addMessageToChat(id_chat: string, msg: MessageDb) {
+ const chat_ret = db.chats.where("id").equals(id_chat)
+ let count = await chat_ret.count()
+ if (count < 1) {
+ createChat(id_chat, msg, )
+ }
+ else {
+ let msgs: MessageDb[]
+ chat_ret.first().then((res) => {
+ if (res?.message == undefined) {
+ msgs.push(msg)
+ res.message = msgs
+ }
+ res.message.push(msg)
+ chat_ret.modify({id: id_chat, message: res.message})
+ })
+ }
+}
+
+export async function getTitle(id_chat: string) {
+ let title_ret = env.PUBLIC_APP_NAME
+ try {
+ const chat_ret = await (db.chats.where("id").equals(id_chat).first())
+ title_ret = chat_ret!.title
+ }
+ catch (err) {
+ console.log(err)
+ }
+ return title_ret
+}
+
+export async function getMessages(id_chat: string) {
+ try {
+ const chat_ret = await db.chats.where("id").equals(id_chat).first()
+ const msg = chat_ret?.message
+ return [...msg]
+ }
+ catch (err) {
+ console.log(err)
+ }
+ return undefined
+}
+
+export async function getChats() {
+ let titles = []
+ try {
+ const all = (await db.chats.orderBy('createdAt').toArray()).forEach(function (chat) {
+ titles.push({
+ title: chat.title,
+ model: "", // Hardcoded for now
+ id: chat.id,
+ updatedAt: chat.createdAt,
+ createdAt: chat.createdAt,
+ })
+ });
+ }
+ catch (err) {
+ console.log(err)
+ }
+ return titles;
+}
+
+
+export async function getChat(id_chat: string) {
+ const chat_ret = db.chats.where("id").equals(id_chat).first().then((res) => {
+ return res;
+ })
+}
+
+export const db = new ChatDatabase();
+
+
\ No newline at end of file
diff --git a/src/routes/admin/export/+server.ts b/src/routes/admin/export/+server.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2cdae1f2aa779316e5998907a2b0484be2847cfc
--- /dev/null
+++ b/src/routes/admin/export/+server.ts
@@ -0,0 +1,166 @@
+import {
+ PARQUET_EXPORT_DATASET,
+ PARQUET_EXPORT_HF_TOKEN,
+ PARQUET_EXPORT_SECRET,
+} from "$env/static/private";
+import { collections } from "$lib/server/database";
+import type { Message } from "$lib/types/Message";
+import { error } from "@sveltejs/kit";
+import { pathToFileURL } from "node:url";
+import { unlink } from "node:fs/promises";
+import { uploadFile } from "@huggingface/hub";
+import parquet from "parquetjs";
+import { z } from "zod";
+
+// Triger like this:
+// curl -X POST "http://localhost:5173/chat/admin/export" -H "Authorization: Bearer " -H "Content-Type: application/json" -d '{"model": "OpenAssistant/oasst-sft-6-llama-30b-xor"}'
+
+export async function POST({ request }) {
+ if (!PARQUET_EXPORT_SECRET || !PARQUET_EXPORT_DATASET || !PARQUET_EXPORT_HF_TOKEN) {
+ throw error(500, "Parquet export is not configured.");
+ }
+
+ if (request.headers.get("Authorization") !== `Bearer ${PARQUET_EXPORT_SECRET}`) {
+ throw error(403);
+ }
+
+ const { model } = z
+ .object({
+ model: z.string(),
+ })
+ .parse(await request.json());
+
+ const schema = new parquet.ParquetSchema({
+ title: { type: "UTF8" },
+ created_at: { type: "TIMESTAMP_MILLIS" },
+ updated_at: { type: "TIMESTAMP_MILLIS" },
+ messages: {
+ repeated: true,
+ fields: {
+ from: { type: "UTF8" },
+ content: { type: "UTF8" },
+ score: { type: "INT_8", optional: true },
+ },
+ },
+ });
+
+ const fileName = `/tmp/conversations-${new Date().toJSON().slice(0, 10)}-${Date.now()}.parquet`;
+
+ const writer = await parquet.ParquetWriter.openFile(schema, fileName);
+
+ let count = 0;
+ console.log("Exporting conversations for model", model);
+
+ for await (const conversation of collections.settings.aggregate<{
+ title: string;
+ created_at: Date;
+ updated_at: Date;
+ messages: Message[];
+ }>([
+ {
+ $match: {
+ shareConversationsWithModelAuthors: true,
+ sessionId: { $exists: true },
+ userId: { $exists: false },
+ },
+ },
+ {
+ $lookup: {
+ from: "conversations",
+ localField: "sessionId",
+ foreignField: "sessionId",
+ as: "conversations",
+ pipeline: [{ $match: { model, userId: { $exists: false } } }],
+ },
+ },
+ { $unwind: "$conversations" },
+ {
+ $project: {
+ title: "$conversations.title",
+ created_at: "$conversations.createdAt",
+ updated_at: "$conversations.updatedAt",
+ messages: "$conversations.messages",
+ },
+ },
+ ])) {
+ await writer.appendRow({
+ title: conversation.title,
+ created_at: conversation.created_at,
+ updated_at: conversation.updated_at,
+ messages: conversation.messages.map((message: Message) => ({
+ from: message.from,
+ content: message.content,
+ ...(message.score ? { score: message.score } : undefined),
+ })),
+ });
+ ++count;
+
+ if (count % 1_000 === 0) {
+ console.log("Exported", count, "conversations");
+ }
+ }
+
+ console.log("exporting convos with userId");
+
+ for await (const conversation of collections.settings.aggregate<{
+ title: string;
+ created_at: Date;
+ updated_at: Date;
+ messages: Message[];
+ }>([
+ { $match: { shareConversationsWithModelAuthors: true, userId: { $exists: true } } },
+ {
+ $lookup: {
+ from: "conversations",
+ localField: "userId",
+ foreignField: "userId",
+ as: "conversations",
+ pipeline: [{ $match: { model } }],
+ },
+ },
+ { $unwind: "$conversations" },
+ {
+ $project: {
+ title: "$conversations.title",
+ created_at: "$conversations.createdAt",
+ updated_at: "$conversations.updatedAt",
+ messages: "$conversations.messages",
+ },
+ },
+ ])) {
+ await writer.appendRow({
+ title: conversation.title,
+ created_at: conversation.created_at,
+ updated_at: conversation.updated_at,
+ messages: conversation.messages.map((message: Message) => ({
+ from: message.from,
+ content: message.content,
+ ...(message.score ? { score: message.score } : undefined),
+ })),
+ });
+ ++count;
+
+ if (count % 1_000 === 0) {
+ console.log("Exported", count, "conversations");
+ }
+ }
+
+ await writer.close();
+
+ console.log("Uploading", fileName, "to Hugging Face Hub");
+
+ await uploadFile({
+ file: pathToFileURL(fileName),
+ credentials: { accessToken: PARQUET_EXPORT_HF_TOKEN },
+ repo: {
+ type: "dataset",
+ name: PARQUET_EXPORT_DATASET,
+ },
+ });
+
+ console.log("Upload done");
+
+ await unlink(fileName);
+
+ return new Response();
+}
diff --git a/src/routes/conversation/+server.ts b/src/routes/conversation/+server.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3e6200320b3500ef07c9b1592e4247374c896857
--- /dev/null
+++ b/src/routes/conversation/+server.ts
@@ -0,0 +1,65 @@
+import type { RequestHandler } from "./$types";
+import { collections } from "$lib/server/database";
+import { error, redirect } from "@sveltejs/kit";
+import { base } from "$app/paths";
+import { z } from "zod";
+import type { Message } from "$lib/types/Message";
+import { models, validateModel } from "$lib/server/models";
+import { authCondition } from "$lib/server/auth";
+
+export const POST: RequestHandler = async ({ locals, request }) => {
+ /*const body = await request.text();
+
+ let title = "";
+ let messages: Message[] = [];
+
+ const values = z
+ .object({
+ fromShare: z.string().optional(),
+ model: validateModel(models),
+ })
+ .parse(JSON.parse(body));
+
+ if (values.fromShare) {
+ const conversation = await collections.sharedConversations.findOne({
+ _id: values.fromShare,
+ });
+
+ title = conversation.title;
+ messages = conversation.messages;
+ values.model = conversation.model;
+ }
+
+ const res = await collections.conversations.insertOne({
+ _id: new ObjectId(),
+ title:
+ title ||
+ "Untitled " + ((await collections.conversations.countDocuments(authCondition(locals))) + 1),
+ messages,
+ model: values.model,
+ createdAt: new Date(),
+ updatedAt: new Date(),
+ ...(locals.user ? { userId: locals.user._id } : { sessionId: locals.sessionId }),
+ ...(values.fromShare ? { meta: { fromShareId: values.fromShare } } : {}),
+ });
+
+ return new Response(
+ JSON.stringify({
+ conversationId: res.insertedId.toString(),
+ }),
+ { headers: { "Content-Type": "application/json" } }
+ );
+
+ */
+
+ return new Response(
+ JSON.stringify({
+ conversationId: "",
+ }),
+ { headers: { "Content-Type": "application/json" } }
+ );
+};
+
+export const GET: RequestHandler = async () => {
+ throw redirect(302, `${base}/`);
+};
diff --git a/src/routes/conversation/[id]/+page.server.ts b/src/routes/conversation/[id]/+page.server.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2a16a81508cbad2fb3f3efab6d808f32189e5491
--- /dev/null
+++ b/src/routes/conversation/[id]/+page.server.ts
@@ -0,0 +1,13 @@
+import { collections } from "$lib/server/database";
+import { error } from "@sveltejs/kit";
+import { authCondition } from "$lib/server/auth";
+import type { WebSearchMessageResult } from "$lib/types/WebSearch";
+import { UrlDependency } from "$lib/types/UrlDependency";
+
+export const load = async ({ params, depends, locals }) => {
+ return {
+ title: "Untitled",
+ model: "",
+ searches: undefined,
+ };
+};
diff --git a/src/routes/conversation/[id]/+page.svelte b/src/routes/conversation/[id]/+page.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..eaa1fc81fa909dda56afa2843f595510b296c56c
--- /dev/null
+++ b/src/routes/conversation/[id]/+page.svelte
@@ -0,0 +1,326 @@
+
+
+
+ {title}
+
+
+ writeMessage(event.detail)}
+ on:retry={(event) => writeMessage(event.detail.content, event.detail.id)}
+ on:vote={(event) => voteMessage(event.detail.score, event.detail.id)}
+ on:share={() => shareConversation($page.params.id, data.title)}
+ on:stop={() => (isAborted = true)}
+ models={data.models}
+ currentModel={findCurrentModel([...data.models, ...data.oldModels], data.model)}
+ settings={data.settings}
+ {loginRequired}
+/>
diff --git a/src/routes/conversation/[id]/+server.ts b/src/routes/conversation/[id]/+server.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8ad2ba28156aeb80188ae64d1bb77105c49429c5
--- /dev/null
+++ b/src/routes/conversation/[id]/+server.ts
@@ -0,0 +1,276 @@
+import { MESSAGES_BEFORE_LOGIN, RATE_LIMIT } from "$env/static/private";
+import { buildPrompt } from "$lib/buildPrompt";
+import { PUBLIC_SEP_TOKEN } from "$lib/constants/publicSepToken";
+import { abortedGenerations } from "$lib/server/abortedGenerations";
+import { authCondition, requiresUser } from "$lib/server/auth";
+import { collections } from "$lib/server/database";
+import { modelEndpoint } from "$lib/server/modelEndpoint";
+import { models } from "$lib/server/models";
+import { ERROR_MESSAGES } from "$lib/stores/errors.js";
+import type { Message } from "$lib/types/Message";
+import { concatUint8Arrays } from "$lib/utils/concatUint8Arrays";
+import { streamToAsyncIterable } from "$lib/utils/streamToAsyncIterable";
+import { trimPrefix } from "$lib/utils/trimPrefix";
+import { trimSuffix } from "$lib/utils/trimSuffix";
+import type { TextGenerationStreamOutput } from "@huggingface/inference";
+import { error } from "@sveltejs/kit";
+import { z } from "zod";
+import { AwsClient } from "aws4fetch";
+import { pipeline } from "@xenova/transformers";
+
+export async function POST({ request, fetch, locals, params }) {
+ /*const id = z.string().parse(params.id);
+ const date = new Date();
+ let generated_text = "";
+
+ const userId = locals.user?._id ?? locals.sessionId;
+
+ if (!userId) {
+ throw error(401, "Unauthorized");
+ }
+
+ const conv = await collections.conversations.findOne({
+ _id: convId,
+ ...authCondition(locals),
+ });
+
+ if (!conv) {
+ throw error(404, "Conversation not found");
+ }
+
+ if (
+ !locals.user?._id &&
+ requiresUser &&
+ conv.messages.length > (MESSAGES_BEFORE_LOGIN ? parseInt(MESSAGES_BEFORE_LOGIN) : 0)
+ ) {
+ throw error(429, "Exceeded number of messages before login");
+ }
+
+ const nEvents = await collections.messageEvents.countDocuments({ userId });
+
+ if (RATE_LIMIT != "" && nEvents > parseInt(RATE_LIMIT)) {
+ throw error(429, ERROR_MESSAGES.rateLimited);
+ }
+
+ const model = models.find((m) => m.id === conv.model);
+ const settings = await collections.settings.findOne(authCondition(locals));
+
+ if (!model) {
+ throw error(410, "Model not available anymore");
+ }
+
+ const json = await request.json();
+ const {
+ inputs: newPrompt,
+ options: { id: messageId, is_retry, web_search_id, response_id: responseId },
+ } = z
+ .object({
+ inputs: z.string().trim().min(1),
+ options: z.object({
+ id: z.optional(z.string().uuid()),
+ response_id: z.optional(z.string().uuid()),
+ is_retry: z.optional(z.boolean()),
+ web_search_id: z.ostring(),
+ }),
+ })
+ .parse(json);
+
+ const messages = (() => {
+ if (is_retry && messageId) {
+ let retryMessageIdx = conv.messages.findIndex((message) => message.id === messageId);
+ if (retryMessageIdx === -1) {
+ retryMessageIdx = conv.messages.length;
+ }
+ return [
+ ...conv.messages.slice(0, retryMessageIdx),
+ { content: newPrompt, from: "user", id: messageId as Message["id"], updatedAt: new Date() },
+ ];
+ }
+ return [
+ ...conv.messages,
+ {
+ content: newPrompt,
+ from: "user",
+ id: (messageId as Message["id"]) || crypto.randomUUID(),
+ createdAt: new Date(),
+ updatedAt: new Date(),
+ },
+ ];
+ })() satisfies Message[];
+
+ const prompt = await buildPrompt({
+ messages,
+ model,
+ webSearchId: web_search_id,
+ preprompt: settings?.customPrompts?.[model.id] ?? model.preprompt,
+ locals: locals,
+ });
+
+ const randomEndpoint = modelEndpoint(model);
+ console.log(randomEndpoint);
+
+ const abortController = new AbortController();
+
+ let stream1 = new ReadableStream();
+ let stream2 = new ReadableStream();
+
+ async function saveMessage() {
+ // We could also check if PUBLIC_ASSISTANT_MESSAGE_TOKEN is present and use it to slice the text
+ if (generated_text.startsWith(prompt)) {
+ generated_text = generated_text.slice(prompt.length);
+ }
+
+ generated_text = trimSuffix(
+ trimPrefix(generated_text, "<|startoftext|>"),
+ PUBLIC_SEP_TOKEN
+ ).trimEnd();
+
+ for (const stop of [...(model?.parameters?.stop ?? []), "<|endoftext|>"]) {
+ if (generated_text.endsWith(stop)) {
+ generated_text = generated_text.slice(0, -stop.length).trimEnd();
+ }
+ }
+
+ messages.push({
+ from: "assistant",
+ content: generated_text,
+ webSearchId: web_search_id,
+ id: (responseId as Message["id"]) || crypto.randomUUID(),
+ createdAt: new Date(),
+ updatedAt: new Date(),
+ });
+
+ await collections.messageEvents.insertOne({
+ userId: userId,
+ createdAt: new Date(),
+ });
+
+ await collections.conversations.updateOne(
+ {
+ _id: convId,
+ },
+ {
+ $set: {
+ messages,
+ updatedAt: new Date(),
+ },
+ }
+ );
+ }
+
+ saveMessage().catch(console.error);*/
+ // Todo: maybe we should wait for the message to be saved before ending the response - in case of errors
+ return new Response(undefined, {
+ headers: undefined,
+ status: 200,
+ statusText: "",
+ });
+}
+
+export async function DELETE({ locals, params }) {
+ /*const conv = await collections.conversations.findOne({
+ _id: convId,
+ ...authCondition(locals),
+ });
+
+ await collections.conversations.deleteOne({ _id: conv._id });*/
+
+ return new Response();
+}
+
+async function parseGeneratedText(
+ stream: ReadableStream,
+ conversationId: ObjectId,
+ promptedAt: Date,
+ abortController: AbortController
+): Promise {
+ const inputs: Uint8Array[] = [];
+ for await (const input of streamToAsyncIterable(stream)) {
+ inputs.push(input);
+
+ const date = abortedGenerations.get(conversationId.toString());
+
+ if (date && date > promptedAt) {
+ abortController.abort("Cancelled by user");
+ const completeInput = concatUint8Arrays(inputs);
+
+ const lines = new TextDecoder()
+ .decode(completeInput)
+ .split("\n")
+ .filter((line) => line.startsWith("data:"));
+
+ const tokens = lines.map((line) => {
+ try {
+ const json: TextGenerationStreamOutput = JSON.parse(line.slice("data:".length));
+ return json.token.text;
+ } catch {
+ return "";
+ }
+ });
+ return tokens.join("");
+ }
+ }
+ // Merge inputs into a single Uint8Array
+ const completeInput = concatUint8Arrays(inputs);
+
+ // Get last line starting with "data:" and parse it as JSON to get the generated text
+ const message = new TextDecoder().decode(completeInput);
+
+ let lastIndex = message.lastIndexOf("\ndata:");
+ if (lastIndex === -1) {
+ lastIndex = message.indexOf("data");
+ }
+
+ if (lastIndex === -1) {
+ console.error("Could not parse last message", message);
+ }
+
+ let lastMessage = message.slice(lastIndex).trim().slice("data:".length);
+ if (lastMessage.includes("\n")) {
+ lastMessage = lastMessage.slice(0, lastMessage.indexOf("\n"));
+ }
+
+ const lastMessageJSON = JSON.parse(lastMessage);
+
+ if (lastMessageJSON.error) {
+ throw new Error(lastMessageJSON.error);
+ }
+
+ const res = lastMessageJSON.generated_text;
+
+ if (typeof res !== "string") {
+ throw new Error("Could not parse generated text");
+ }
+
+ return res;
+}
+
+export async function PATCH({ request, locals, params }) {
+ /*const { title } = z
+ .object({ title: z.string().trim().min(1).max(100) })
+ .parse(await request.json());
+
+ const convId = new ObjectId(params.id);
+
+ const conv = await collections.conversations.findOne({
+ _id: convId,
+ ...authCondition(locals),
+ });
+
+ if (!conv) {
+ throw error(404, "Conversation not found");
+ }
+
+ await collections.conversations.updateOne(
+ {
+ _id: convId,
+ },
+ {
+ $set: {
+ title,
+ },
+ }
+ );*/
+
+ return new Response();
+}
diff --git a/src/routes/conversation/[id]/ParamsWritable.js b/src/routes/conversation/[id]/ParamsWritable.js
new file mode 100644
index 0000000000000000000000000000000000000000..45835b13106a6a55f562bbf669496de53a24be2e
--- /dev/null
+++ b/src/routes/conversation/[id]/ParamsWritable.js
@@ -0,0 +1,3 @@
+import { writable } from "svelte/store";
+
+export const params_writable = writable("");
\ No newline at end of file
diff --git a/src/routes/conversation/[id]/message/[messageId]/prompt/+server.ts b/src/routes/conversation/[id]/message/[messageId]/prompt/+server.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6aaf582d7263e074d2be99cfebf366f253235c14
--- /dev/null
+++ b/src/routes/conversation/[id]/message/[messageId]/prompt/+server.ts
@@ -0,0 +1,23 @@
+import { buildPrompt } from "$lib/buildPrompt";
+import { authCondition } from "$lib/server/auth";
+import { collections } from "$lib/server/database";
+import { models } from "$lib/server/models";
+import { error } from "@sveltejs/kit";
+
+export async function GET({ params, locals }) {
+ return new Response(
+ JSON.stringify(
+ {
+ note: "This is a preview of the prompt that will be sent to the model when retrying the message. It may differ from what was sent in the past if the parameters have been updated since",
+ prompt,
+ model: "",
+ parameters: {
+ return_full_text: false,
+ },
+ },
+ null,
+ 2
+ ),
+ { headers: { "Content-Type": "application/json" } }
+ );
+}
diff --git a/src/routes/conversation/[id]/message/[messageId]/vote/+server.ts b/src/routes/conversation/[id]/message/[messageId]/vote/+server.ts
new file mode 100644
index 0000000000000000000000000000000000000000..18b4e019b4c158b88b26507c2972498715ece89d
--- /dev/null
+++ b/src/routes/conversation/[id]/message/[messageId]/vote/+server.ts
@@ -0,0 +1,37 @@
+import { authCondition } from "$lib/server/auth";
+import { collections } from "$lib/server/database";
+import { error } from "@sveltejs/kit";
+import { z } from "zod";
+
+export async function POST({ params, request, locals }) {
+ /*const { score } = z
+ .object({
+ score: z.number().int().min(-1).max(1),
+ })
+ .parse(await request.json());
+ const conversationId = new ObjectId(params.id);
+ const messageId = params.messageId;
+
+ const document = await collections.conversations.updateOne(
+ {
+ _id: conversationId,
+ ...authCondition(locals),
+ "messages.id": messageId,
+ },
+ {
+ ...(score !== 0
+ ? {
+ $set: {
+ "messages.$.score": score,
+ },
+ }
+ : { $unset: { "messages.$.score": "" } }),
+ }
+ );
+
+ if (!document.matchedCount) {
+ throw error(404, "Message not found");
+ }*/
+
+ return new Response();
+}
diff --git a/src/routes/conversation/[id]/share/+server.ts b/src/routes/conversation/[id]/share/+server.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8204e061660a2aa59b6c5c23a07dafc6a8ec6529
--- /dev/null
+++ b/src/routes/conversation/[id]/share/+server.ts
@@ -0,0 +1,58 @@
+import { base } from "$app/paths";
+import { PUBLIC_ORIGIN, PUBLIC_SHARE_PREFIX } from "$env/static/public";
+import { authCondition } from "$lib/server/auth";
+import { collections } from "$lib/server/database";
+import type { SharedConversation } from "$lib/types/SharedConversation";
+import { hashConv } from "$lib/utils/hashConv.js";
+import { error } from "@sveltejs/kit";
+import { nanoid } from "nanoid";
+
+export async function POST({ params, url, locals }) {
+ /*const conversation = await collections.conversations.findOne({
+ _id: new ObjectId(params.id),
+ ...authCondition(locals),
+ });
+
+ const hash = await hashConv(conversation);
+
+ const existingShare = await collections.sharedConversations.findOne({ hash });
+
+ if (existingShare) {
+ return new Response(
+ JSON.stringify({
+ url: getShareUrl(url, existingShare._id),
+ }),
+ { headers: { "Content-Type": "application/json" } }
+ );
+ }
+
+ const shared: SharedConversation = {
+ _id: nanoid(7),
+ createdAt: new Date(),
+ messages: conversation.messages,
+ hash,
+ updatedAt: new Date(),
+ title: conversation.title,
+ model: conversation.model,
+ };
+
+ await collections.sharedConversations.insertOne(shared);
+
+ return new Response(
+ JSON.stringify({
+ url: getShareUrl(url, shared._id),
+ }),
+ { headers: { "Content-Type": "application/json" } }
+ );*/
+
+ return new Response(
+ JSON.stringify({
+ url: "",
+ }),
+ { headers: { "Content-Type": "application/json" } }
+ );
+}
+
+function getShareUrl(url: URL, shareId: string): string {
+ return `${PUBLIC_SHARE_PREFIX || `${PUBLIC_ORIGIN || url.origin}${base}`}/r/${shareId}`;
+}
diff --git a/src/routes/conversation/[id]/stop-generating/+server.ts b/src/routes/conversation/[id]/stop-generating/+server.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2c749156f82ada11bcea3b14d4a60cddb72d5825
--- /dev/null
+++ b/src/routes/conversation/[id]/stop-generating/+server.ts
@@ -0,0 +1,23 @@
+import { authCondition } from "$lib/server/auth";
+import { collections } from "$lib/server/database";
+import { error } from "@sveltejs/kit";
+
+/**
+ * Ideally, we'd be able to detect the client-side abort, see https://github.com/huggingface/chat-ui/pull/88#issuecomment-1523173850
+ */
+export async function POST({ params, locals }) {
+ /*const conversationId = new ObjectId(params.id);
+
+ const conversation = await collections.conversations.findOne({
+ _id: conversationId,
+ ...authCondition(locals),
+ });
+
+ await collections.abortedGenerations.updateOne(
+ { conversationId },
+ { $set: { updatedAt: new Date() }, $setOnInsert: { createdAt: new Date() } },
+ { upsert: true }
+ );*/
+
+ return new Response();
+}
diff --git a/src/routes/conversation/[id]/summarize/+server.ts b/src/routes/conversation/[id]/summarize/+server.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6642ae4a84705e460179e5c349c4b2392c6de155
--- /dev/null
+++ b/src/routes/conversation/[id]/summarize/+server.ts
@@ -0,0 +1,59 @@
+import { buildPrompt } from "$lib/buildPrompt";
+import { authCondition } from "$lib/server/auth";
+import { collections } from "$lib/server/database";
+import { generateFromDefaultEndpoint } from "$lib/server/generateFromDefaultEndpoint";
+import { defaultModel } from "$lib/server/models";
+import { error } from "@sveltejs/kit";
+
+export async function POST({ params, locals }) {
+ /*const convId = new ObjectId(params.id);
+
+ const conversation = await collections.conversations.findOne({
+ _id: convId,
+ ...authCondition(locals),
+ });
+
+ if (!conversation) {
+ throw error(404, "Conversation not found");
+ }
+
+ const firstMessage = conversation.messages.find((m) => m.from === "user");
+
+ const userPrompt =
+ `Please summarize the following message as a single sentence of less than 5 words:\n` +
+ firstMessage?.content;
+
+ const prompt = await buildPrompt({
+ messages: [{ from: "user", content: userPrompt }],
+ model: defaultModel,
+ });
+ const generated_text = await generateFromDefaultEndpoint(prompt);
+
+ if (generated_text) {
+ await collections.conversations.updateOne(
+ {
+ _id: convId,
+ ...authCondition(locals),
+ },
+ {
+ $set: { title: generated_text },
+ }
+ );
+ }
+
+ return new Response(
+ JSON.stringify(
+ generated_text
+ ? {
+ title: generated_text,
+ }
+ : {}
+ ),
+ { headers: { "Content-Type": "application/json" } }
+ );*/
+
+ return new Response(
+ JSON.stringify({}),
+ { headers: { "Content-Type": "application/json" } }
+ );
+}
diff --git a/src/routes/conversation/[id]/web-search/+server.ts b/src/routes/conversation/[id]/web-search/+server.ts
new file mode 100644
index 0000000000000000000000000000000000000000..000e3516bdf75a74f12e90159273d9d136ea9e80
--- /dev/null
+++ b/src/routes/conversation/[id]/web-search/+server.ts
@@ -0,0 +1,138 @@
+import { authCondition } from "$lib/server/auth";
+import { collections } from "$lib/server/database";
+import { defaultModel } from "$lib/server/models";
+import { searchWeb } from "$lib/server/websearch/searchWeb";
+import type { Message } from "$lib/types/Message";
+import { error } from "@sveltejs/kit";
+import { z } from "zod";
+import type { WebSearch } from "$lib/types/WebSearch";
+import { generateQuery } from "$lib/server/websearch/generateQuery";
+import { parseWeb } from "$lib/server/websearch/parseWeb";
+import { summarizeWeb } from "$lib/server/websearch/summarizeWeb";
+
+interface GenericObject {
+ [key: string]: GenericObject | unknown;
+}
+
+function removeLinks(obj: GenericObject) {
+ for (const prop in obj) {
+ if (prop.endsWith("link")) delete obj[prop];
+ else if (typeof obj[prop] === "object") removeLinks(obj[prop] as GenericObject);
+ }
+ return obj;
+}
+export async function GET({ params, locals, url }) {
+ /*const model = defaultModel;
+ const convId = new ObjectId(params.id);
+ const searchId = new ObjectId();
+
+ const conv = await collections.conversations.findOne({
+ _id: convId,
+ ...authCondition(locals),
+ });
+
+ if (!conv) {
+ throw error(404, "Conversation not found");
+ }
+
+ const prompt = z.string().trim().min(1).parse(url.searchParams.get("prompt"));
+
+ const messages = (() => {
+ return [...conv.messages, { content: prompt, from: "user", id: crypto.randomUUID() }];
+ })() satisfies Message[];
+
+ const stream = new ReadableStream({
+ async start(controller) {
+ const webSearch: WebSearch = {
+ _id: searchId,
+ convId: convId,
+ prompt: prompt,
+ searchQuery: "",
+ knowledgeGraph: "",
+ answerBox: "",
+ results: [],
+ summary: "",
+ messages: [],
+ createdAt: new Date(),
+ updatedAt: new Date(),
+ };
+
+ function appendUpdate(message: string, args?: string[], type?: "error" | "update") {
+ webSearch.messages.push({
+ type: type ?? "update",
+ message,
+ args,
+ });
+ controller.enqueue(JSON.stringify({ messages: webSearch.messages }));
+ }
+
+ try {
+ appendUpdate("Generating search query");
+ webSearch.searchQuery = await generateQuery(messages);
+
+ appendUpdate("Searching Google", [webSearch.searchQuery]);
+ const results = await searchWeb(webSearch.searchQuery);
+
+ let text = "";
+ webSearch.results =
+ (results.organic_results &&
+ results.organic_results.map((el: { link: string }) => el.link)) ??
+ [];
+
+ if (results.answer_box) {
+ // if google returns an answer box, we use it
+ webSearch.answerBox = JSON.stringify(removeLinks(results.answer_box));
+ text = webSearch.answerBox;
+ appendUpdate("Found a Google answer box");
+ } else if (results.knowledge_graph) {
+ // if google returns a knowledge graph, we use it
+ webSearch.knowledgeGraph = JSON.stringify(removeLinks(results.knowledge_graph));
+ text = webSearch.knowledgeGraph;
+ appendUpdate("Found a Google knowledge page");
+ } else if (webSearch.results.length > 0) {
+ let tries = 0;
+
+ while (!text && tries < 3) {
+ const searchUrl = webSearch.results[tries];
+ appendUpdate("Browsing result", [JSON.stringify(searchUrl)]);
+ try {
+ text = await parseWeb(searchUrl);
+ if (!text) throw new Error("text of the webpage is null");
+ } catch (e) {
+ appendUpdate("Error parsing webpage", [], "error");
+ tries++;
+ }
+ }
+ if (!text) throw new Error("No text found on the first 3 results");
+ } else {
+ throw new Error("No results found for this search query");
+ }
+
+ appendUpdate("Creating summary");
+ webSearch.summary = await summarizeWeb(text, webSearch.searchQuery, model);
+ appendUpdate("Injecting summary", [JSON.stringify(webSearch.summary)]);
+ } catch (searchError) {
+ if (searchError instanceof Error) {
+ webSearch.messages.push({
+ type: "error",
+ message: "An error occurred with the web search",
+ args: [JSON.stringify(searchError.message)],
+ });
+ }
+ }
+
+ const res = await collections.webSearches.insertOne(webSearch);
+ webSearch.messages.push({
+ type: "result",
+ id: res.insertedId.toString(),
+ });
+ controller.enqueue(JSON.stringify({ messages: webSearch.messages }));
+ },
+ });
+
+ return new Response(stream, { headers: { "Content-Type": "application/json" } });
+
+ */
+
+ return new Response(undefined, { headers: { "Content-Type": "application/json" } });
+}
diff --git a/src/routes/conversation/[id]/worker.js b/src/routes/conversation/[id]/worker.js
new file mode 100644
index 0000000000000000000000000000000000000000..05fbaa9440797d39acc60431e1f56c7574e0d341
--- /dev/null
+++ b/src/routes/conversation/[id]/worker.js
@@ -0,0 +1,38 @@
+import { pipeline, env } from "@xenova/transformers";
+
+export class FlanPipeline {
+ static task = "text2text-generation";
+ static model = "Xenova/LaMini-Flan-T5-783M";
+ static instance = null;
+
+ static async getInstance(progress_callback = null) {
+ if (this.instance === null) {
+ this.instance = pipeline(this.task, this.model, { progress_callback });
+ }
+ return this.instance;
+ }
+}
+
+// Listen for messages from the main thread
+self.addEventListener("message", async (event) => {
+ let pipe = await FlanPipeline.getInstance((x) => {
+ self.postMessage(x);
+ });
+
+ let output = await pipe(event.data.text, {
+ max_new_tokens: 256,
+ callback_function: (x) => {
+ self.postMessage({
+ status: "update",
+ output: pipe.tokenizer.decode(x[0].output_token_ids, { skip_special_tokens: true }),
+ });
+ },
+ });
+
+ // Send the output back to the main thread
+ self.postMessage({
+ status: "complete",
+ output: output,
+ searchID: event.data.searchID,
+ });
+});
diff --git a/src/routes/conversations/+page.server.ts b/src/routes/conversations/+page.server.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2fea53647ba0a35db0df914c30670935363d4366
--- /dev/null
+++ b/src/routes/conversations/+page.server.ts
@@ -0,0 +1,10 @@
+import { base } from "$app/paths";
+import { authCondition } from "$lib/server/auth";
+import { collections } from "$lib/server/database";
+import { redirect } from "@sveltejs/kit";
+
+export const actions = {
+ delete: async function ({ locals }) {
+ throw redirect(303, `${base}/`);
+ },
+};
\ No newline at end of file
diff --git a/src/routes/login/+page.server.ts b/src/routes/login/+page.server.ts
new file mode 100644
index 0000000000000000000000000000000000000000..28692b5304687ce69551c5015d71a4419069415a
--- /dev/null
+++ b/src/routes/login/+page.server.ts
@@ -0,0 +1,16 @@
+import { redirect } from "@sveltejs/kit";
+import { getOIDCAuthorizationUrl } from "$lib/server/auth";
+import { base } from "$app/paths";
+
+export const actions = {
+ default: async function ({ url, locals, request }) {
+ // TODO: Handle errors if provider is not responding
+ const referer = request.headers.get("referer");
+ const authorizationUrl = await getOIDCAuthorizationUrl(
+ { redirectURI: `${(referer ? new URL(referer) : url).origin}${base}/login/callback` },
+ { sessionId: locals.sessionId }
+ );
+
+ throw redirect(303, authorizationUrl);
+ },
+};
diff --git a/src/routes/login/callback/+page.server.ts b/src/routes/login/callback/+page.server.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1ccbc1b48b66f62a0c8a1fb9f7eb55e939d3215f
--- /dev/null
+++ b/src/routes/login/callback/+page.server.ts
@@ -0,0 +1,39 @@
+import { redirect, error } from "@sveltejs/kit";
+import { getOIDCUserData, validateAndParseCsrfToken } from "$lib/server/auth";
+import { z } from "zod";
+import { base } from "$app/paths";
+import { updateUser } from "./updateUser";
+
+export async function load({ url, locals, cookies }) {
+ const { error: errorName, error_description: errorDescription } = z
+ .object({
+ error: z.string().optional(),
+ error_description: z.string().optional(),
+ })
+ .parse(Object.fromEntries(url.searchParams.entries()));
+
+ if (errorName) {
+ throw error(400, errorName + (errorDescription ? ": " + errorDescription : ""));
+ }
+
+ const { code, state } = z
+ .object({
+ code: z.string(),
+ state: z.string(),
+ })
+ .parse(Object.fromEntries(url.searchParams.entries()));
+
+ const csrfToken = Buffer.from(state, "base64").toString("utf-8");
+
+ const validatedToken = await validateAndParseCsrfToken(csrfToken, locals.sessionId);
+
+ if (!validatedToken) {
+ throw error(403, "Invalid or expired CSRF token");
+ }
+
+ const { userData } = await getOIDCUserData({ redirectURI: validatedToken.redirectUrl }, code);
+
+ await updateUser({ userData, locals, cookies });
+
+ throw redirect(302, `${base}/`);
+}
diff --git a/src/routes/login/callback/updateUser.spec.ts b/src/routes/login/callback/updateUser.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..336da17dd996d62cf0ea0e7cf24ca3249a3c9e05
--- /dev/null
+++ b/src/routes/login/callback/updateUser.spec.ts
@@ -0,0 +1,143 @@
+import { assert, it, describe, afterEach, vi, expect } from "vitest";
+import type { Cookies } from "@sveltejs/kit";
+import { collections } from "$lib/server/database";
+import { updateUser } from "./updateUser";
+import { DEFAULT_SETTINGS } from "$lib/types/Settings";
+import { defaultModel } from "$lib/server/models";
+
+const userData = {
+ preferred_username: "new-username",
+ name: "name",
+ picture: "https://example.com/avatar.png",
+ sub: "1234567890",
+};
+
+const locals = {
+ userId: "1234567890",
+ sessionId: "1234567890",
+};
+
+// @ts-expect-error SvelteKit cookies dumb mock
+const cookiesMock: Cookies = {
+ set: vi.fn(),
+};
+
+const insertRandomUser = async () => {
+ /*const res = await collections.users.insertOne({
+ _id: new ObjectId(),
+ createdAt: new Date(),
+ updatedAt: new Date(),
+ username: "base-username",
+ name: userData.name,
+ avatarUrl: userData.picture,
+ hfUserId: userData.sub,
+ sessionId: locals.sessionId,
+ });
+
+ return res.insertedId;*/
+};
+
+const insertRandomConversations = async (count: number) => {
+ /*const res = await collections.conversations.insertMany(
+ new Array(count).fill(0).map(() => ({
+ _id: new ObjectId(),
+ title: "random title",
+ messages: [],
+ model: defaultModel.id,
+ createdAt: new Date(),
+ updatedAt: new Date(),
+ sessionId: locals.sessionId,
+ }))
+ );
+
+ return res.insertedIds;*/
+};
+
+describe("login", () => {
+ it("should update user if existing", async () => {
+ /*await insertRandomUser();
+
+ await updateUser({ userData, locals, cookies: cookiesMock });
+
+ const existingUser = await collections.users.findOne({ hfUserId: userData.sub });
+
+ assert.equal(existingUser?.name, userData.name);
+
+ expect(cookiesMock.set).toBeCalledTimes(1);*/
+ });
+
+ it("should migrate pre-existing conversations for new user", async () => {
+ /*const insertedId = await insertRandomUser();
+
+ await insertRandomConversations(2);
+
+ await updateUser({ userData, locals, cookies: cookiesMock });
+
+ const conversationCount = await collections.conversations.countDocuments({
+ userId: insertedId,
+ sessionId: { $exists: false },
+ });
+
+ assert.equal(conversationCount, 2);
+
+ await collections.conversations.deleteMany({ userId: insertedId });*/
+ });
+
+ it("should create default settings for new user", async () => {
+ /*await updateUser({ userData, locals, cookies: cookiesMock });
+
+ const user = await collections.users.findOne({ sessionId: locals.sessionId });
+
+ assert.exists(user);
+
+ const settings = await collections.settings.findOne({ userId: user?._id });
+
+ expect(settings).toMatchObject({
+ userId: user?._id,
+ updatedAt: expect.any(Date),
+ createdAt: expect.any(Date),
+ ethicsModalAcceptedAt: expect.any(Date),
+ ...DEFAULT_SETTINGS,
+ });
+
+ await collections.settings.deleteOne({ userId: user?._id });*/
+ });
+
+ it("should migrate pre-existing settings for pre-existing user", async () => {
+ /*const { insertedId } = await collections.settings.insertOne({
+ sessionId: locals.sessionId,
+ ethicsModalAcceptedAt: new Date(),
+ updatedAt: new Date(),
+ createdAt: new Date(),
+ ...DEFAULT_SETTINGS,
+ shareConversationsWithModelAuthors: false,
+ });
+
+ await updateUser({ userData, locals, cookies: cookiesMock });
+
+ const settings = await collections.settings.findOne({
+ _id: insertedId,
+ sessionId: { $exists: false },
+ });
+
+ assert.exists(settings);
+
+ const user = await collections.users.findOne({ hfUserId: userData.sub });
+
+ expect(settings).toMatchObject({
+ userId: user?._id,
+ updatedAt: expect.any(Date),
+ createdAt: expect.any(Date),
+ ethicsModalAcceptedAt: expect.any(Date),
+ ...DEFAULT_SETTINGS,
+ shareConversationsWithModelAuthors: false,
+ });
+
+ await collections.settings.deleteOne({ userId: user?._id });*/
+ });
+});
+
+afterEach(async () => {
+ /*await collections.users.deleteMany({ hfUserId: userData.sub });
+ vi.clearAllMocks();*/
+});
diff --git a/src/routes/login/callback/updateUser.ts b/src/routes/login/callback/updateUser.ts
new file mode 100644
index 0000000000000000000000000000000000000000..158d37e21b65bda07efd2f92329062a206c291d1
--- /dev/null
+++ b/src/routes/login/callback/updateUser.ts
@@ -0,0 +1,14 @@
+import { authCondition, refreshSessionCookie } from "$lib/server/auth";
+import { collections } from "$lib/server/database";
+import { DEFAULT_SETTINGS } from "$lib/types/Settings";
+import { z } from "zod";
+import type { UserinfoResponse } from "openid-client";
+import type { Cookies } from "@sveltejs/kit";
+
+export async function updateUser(params: {
+ userData: UserinfoResponse;
+ locals: App.Locals;
+ cookies: Cookies;
+}) {
+
+}
diff --git a/src/routes/logout/+page.server.ts b/src/routes/logout/+page.server.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1d60b6c5d8df28981da4d06d5ea58eeeaf838b47
--- /dev/null
+++ b/src/routes/logout/+page.server.ts
@@ -0,0 +1,17 @@
+import { dev } from "$app/environment";
+import { base } from "$app/paths";
+import { COOKIE_NAME } from "$env/static/private";
+import { redirect } from "@sveltejs/kit";
+
+export const actions = {
+ default: async function ({ cookies }) {
+ cookies.delete(COOKIE_NAME, {
+ path: "/",
+ // So that it works inside the space's iframe
+ sameSite: dev ? "lax" : "none",
+ secure: !dev,
+ httpOnly: true,
+ });
+ throw redirect(303, `${base}/`);
+ },
+};
diff --git a/src/routes/privacy/+page.svelte b/src/routes/privacy/+page.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..f50fa73a6017b02725a3f941ee796c56ae8d8b6d
--- /dev/null
+++ b/src/routes/privacy/+page.svelte
@@ -0,0 +1,11 @@
+
+
+
+
+
+ {@html marked(privacy, { gfm: true })}
+
+
diff --git a/src/routes/r/[id]/+page.server.ts b/src/routes/r/[id]/+page.server.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e09e70bac0c3ec133ea691d4c808160973ef2a7b
--- /dev/null
+++ b/src/routes/r/[id]/+page.server.ts
@@ -0,0 +1,34 @@
+import type { PageServerLoad } from "./$types";
+import { collections } from "$lib/server/database";
+import { error } from "@sveltejs/kit";
+import type { WebSearchMessageResult } from "$lib/types/WebSearch";
+
+export const load: PageServerLoad = async ({ params }) => {
+ /*const conversation = await collections.sharedConversations.findOne({
+ _id: params.id,
+ });
+
+ if (!conversation) {
+ throw error(404, "Conversation not found");
+ }
+
+ const webSearchesId = conversation.messages
+ .filter((message) => message.webSearchId)
+ .map((message) => new ObjectId(message.webSearchId));
+
+ const results = await collections.webSearches.find({ _id: { $in: webSearchesId } }).toArray();
+
+ const searches = Object.fromEntries(
+ results.map((x) => [
+ x._id.toString(),
+ [...x.messages, { type: "result", id: x._id.toString() } satisfies WebSearchMessageResult],
+ ])
+ );
+
+ return {
+ messages: conversation.messages,
+ title: conversation.title,
+ model: conversation.model,
+ searches,
+ };*/
+};
diff --git a/src/routes/r/[id]/+page.svelte b/src/routes/r/[id]/+page.svelte
new file mode 100644
index 0000000000000000000000000000000000000000..d62be5d033d6bd7184376854036b33c5d2e37b3e
--- /dev/null
+++ b/src/routes/r/[id]/+page.svelte
@@ -0,0 +1,88 @@
+
+
+
+ {data.title}
+
+
+
+ createConversation()
+ .then((convId) => {
+ $pendingMessage = ev.detail;
+ return goto(`${base}/conversation/${convId}`, { invalidateAll: true });
+ })
+ .finally(() => (loading = false))}
+ on:share={shareConversation}
+ on:retry={(ev) =>
+ createConversation()
+ .then((convId) => {
+ $pendingMessageIdToRetry = ev.detail.id;
+ $pendingMessage = ev.detail.content;
+ return goto(`${base}/conversation/${convId}`, { invalidateAll: true });
+ })
+ .finally(() => (loading = false))}
+ models={data.models}
+ currentModel={findCurrentModel(data.models, data.model)}
+ settings={data.settings}
+ loginRequired={!$page.error &&
+ (data.requiresLogin
+ ? !data.user
+ : !data.settings.ethicsModalAcceptedAt && !!PUBLIC_APP_DISCLAIMER)}
+/>
diff --git a/src/routes/r/[id]/message/[messageId]/prompt/+server.ts b/src/routes/r/[id]/message/[messageId]/prompt/+server.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3cd354946017d1b95060bd57fec04cc99cd2cc4f
--- /dev/null
+++ b/src/routes/r/[id]/message/[messageId]/prompt/+server.ts
@@ -0,0 +1,47 @@
+import { buildPrompt } from "$lib/buildPrompt";
+import { collections } from "$lib/server/database";
+import { models } from "$lib/server/models";
+import { error } from "@sveltejs/kit";
+
+export async function GET({ params }) {
+ const conv = await collections.sharedConversations.findOne({
+ _id: params.id,
+ });
+
+ if (!conv) {
+ throw error(404, "Conversation not found");
+ }
+
+ const messageId = params.messageId;
+
+ const messageIndex = conv.messages.findIndex((msg) => msg.id === messageId);
+
+ if (messageIndex === -1) {
+ throw error(404, "Message not found");
+ }
+
+ const model = models.find((m) => m.id === conv.model);
+
+ if (!model) {
+ throw error(404, "Conversation model not found");
+ }
+
+ const prompt = await buildPrompt({ messages: conv.messages.slice(0, messageIndex + 1), model });
+
+ return new Response(
+ JSON.stringify(
+ {
+ note: "This is a preview of the prompt that will be sent to the model when retrying the message. It may differ from what was sent in the past if the parameters have been updated since",
+ prompt,
+ model: model.name,
+ parameters: {
+ ...model.parameters,
+ return_full_text: false,
+ },
+ },
+ null,
+ 2
+ ),
+ { headers: { "Content-Type": "application/json" } }
+ );
+}
diff --git a/src/routes/search/[id]/+server.ts b/src/routes/search/[id]/+server.ts
new file mode 100644
index 0000000000000000000000000000000000000000..240de4cd73a9d03090618a8d475313735ad0d96e
--- /dev/null
+++ b/src/routes/search/[id]/+server.ts
@@ -0,0 +1,7 @@
+import { collections } from "$lib/server/database";
+import { hashConv } from "$lib/utils/hashConv.js";
+import { error } from "@sveltejs/kit";
+
+export async function GET({ params, locals }) {
+ return new Response(JSON.stringify(""), { headers: { "Content-Type": "application/json" } });
+}
diff --git a/src/routes/settings/+page.server.ts b/src/routes/settings/+page.server.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4b66d90e62f0f51f6c575f6ff6ee7195c1359899
--- /dev/null
+++ b/src/routes/settings/+page.server.ts
@@ -0,0 +1,49 @@
+import { base } from "$app/paths";
+import { collections } from "$lib/server/database";
+import { redirect } from "@sveltejs/kit";
+import { z } from "zod";
+import { models, validateModel } from "$lib/server/models";
+import { authCondition } from "$lib/server/auth";
+import { DEFAULT_SETTINGS } from "$lib/types/Settings";
+
+export const actions = {
+ default: async function ({ request, locals }) {
+ const formData = await request.formData();
+
+ const { ethicsModalAccepted, ...settings } = z
+ .object({
+ shareConversationsWithModelAuthors: z
+ .union([z.literal("true"), z.literal("on"), z.literal("false"), z.null()])
+ .transform((value) => {
+ return value === "true" || value === "on";
+ }),
+ ethicsModalAccepted: z.boolean({ coerce: true }).optional(),
+ activeModel: validateModel(models),
+ customPrompts: z.record(z.string()).default({}),
+ })
+ .parse({
+ shareConversationsWithModelAuthors: formData.get("shareConversationsWithModelAuthors"),
+ ethicsModalAccepted: formData.get("ethicsModalAccepted"),
+ activeModel: formData.get("activeModel") ?? DEFAULT_SETTINGS.activeModel,
+ customPrompts: JSON.parse(formData.get("customPrompts")?.toString() ?? "{}"),
+ });
+
+ await collections.settings.updateOne(
+ authCondition(locals),
+ {
+ $set: {
+ ...settings,
+ ...(ethicsModalAccepted && { ethicsModalAcceptedAt: new Date() }),
+ updatedAt: new Date(),
+ },
+ $setOnInsert: {
+ createdAt: new Date(),
+ },
+ },
+ {
+ upsert: true,
+ }
+ );
+ throw redirect(303, request.headers.get("referer") || `${base}/`);
+ },
+};
diff --git a/src/styles/highlight-js.css b/src/styles/highlight-js.css
new file mode 100644
index 0000000000000000000000000000000000000000..b262688368e9a946d72b21ae70fba7d711072fbb
--- /dev/null
+++ b/src/styles/highlight-js.css
@@ -0,0 +1 @@
+@import "highlight.js/styles/atom-one-dark";
diff --git a/src/styles/main.css b/src/styles/main.css
new file mode 100644
index 0000000000000000000000000000000000000000..6ea57c50974dab960f23ce8440bfd576f10ddb52
--- /dev/null
+++ b/src/styles/main.css
@@ -0,0 +1,17 @@
+@import "./highlight-js.css";
+
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+@layer components {
+ .btn {
+ @apply inline-flex flex-shrink-0 cursor-pointer select-none items-center justify-center whitespace-nowrap outline-none transition-all focus:ring disabled:cursor-default;
+ }
+}
+
+@layer utilities {
+ .scrollbar-custom {
+ @apply scrollbar-thin scrollbar-track-transparent scrollbar-thumb-black/10 scrollbar-thumb-rounded-full scrollbar-w-1 hover:scrollbar-thumb-black/20 dark:scrollbar-thumb-white/10 dark:hover:scrollbar-thumb-white/20;
+ }
+}
diff --git a/static/chatui/favicon.png b/static/chatui/favicon.png
new file mode 100644
index 0000000000000000000000000000000000000000..5a3f7c66f7cc89dccc2730821fed6eeb671d44ed
Binary files /dev/null and b/static/chatui/favicon.png differ
diff --git a/static/chatui/favicon.svg b/static/chatui/favicon.svg
new file mode 100644
index 0000000000000000000000000000000000000000..cc55dcb9e607621ed8dcc32a93168225304febc9
--- /dev/null
+++ b/static/chatui/favicon.svg
@@ -0,0 +1,6 @@
+
+
+
\ No newline at end of file
diff --git a/static/chatui/touch-icon-ipad-retina.png b/static/chatui/touch-icon-ipad-retina.png
new file mode 100644
index 0000000000000000000000000000000000000000..38a6b8c0310304f1c48fbf7c03f9d7015c10f96f
Binary files /dev/null and b/static/chatui/touch-icon-ipad-retina.png differ
diff --git a/static/chatui/touch-icon-ipad.png b/static/chatui/touch-icon-ipad.png
new file mode 100644
index 0000000000000000000000000000000000000000..66edeb65eb11b2e792a20a10d4ad08e697264654
Binary files /dev/null and b/static/chatui/touch-icon-ipad.png differ
diff --git a/static/chatui/touch-icon-iphone-retina.png b/static/chatui/touch-icon-iphone-retina.png
new file mode 100644
index 0000000000000000000000000000000000000000..776c4d1185525e6f9062a0cd57d48fa9079d4488
Binary files /dev/null and b/static/chatui/touch-icon-iphone-retina.png differ
diff --git a/static/huggingchat/favicon.png b/static/huggingchat/favicon.png
new file mode 100644
index 0000000000000000000000000000000000000000..a50bfcdf12b6c4b92228adfeb499a28ae0156160
Binary files /dev/null and b/static/huggingchat/favicon.png differ
diff --git a/static/huggingchat/favicon.svg b/static/huggingchat/favicon.svg
new file mode 100644
index 0000000000000000000000000000000000000000..baf19d86510b76622df3163c2df97cbca01b57e3
--- /dev/null
+++ b/static/huggingchat/favicon.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/static/huggingchat/thumbnail.png b/static/huggingchat/thumbnail.png
new file mode 100644
index 0000000000000000000000000000000000000000..1ee95c7fb3bd657664a78eb482643962f91b8f0e
Binary files /dev/null and b/static/huggingchat/thumbnail.png differ
diff --git a/static/huggingchat/touch-icon-ipad-retina.png b/static/huggingchat/touch-icon-ipad-retina.png
new file mode 100644
index 0000000000000000000000000000000000000000..61bdbba6b9f97c78906714d7f5476e30079bdae5
Binary files /dev/null and b/static/huggingchat/touch-icon-ipad-retina.png differ
diff --git a/static/huggingchat/touch-icon-ipad.png b/static/huggingchat/touch-icon-ipad.png
new file mode 100644
index 0000000000000000000000000000000000000000..895fc95800390bddfd2f365441698d2cc3846c9a
Binary files /dev/null and b/static/huggingchat/touch-icon-ipad.png differ
diff --git a/static/huggingchat/touch-icon-iphone-retina.png b/static/huggingchat/touch-icon-iphone-retina.png
new file mode 100644
index 0000000000000000000000000000000000000000..cdf6d55032eed5086b7c87a744f18fcce833882d
Binary files /dev/null and b/static/huggingchat/touch-icon-iphone-retina.png differ
diff --git a/svelte.config.js b/svelte.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..e93decaf872ef153bf12ba1a5aaad6e4937a2c87
--- /dev/null
+++ b/svelte.config.js
@@ -0,0 +1,29 @@
+import adapter from "@sveltejs/adapter-node";
+import { vitePreprocess } from "@sveltejs/kit/vite";
+import dotenv from "dotenv";
+
+dotenv.config({ path: "./.env.local" });
+dotenv.config({ path: "./.env" });
+
+process.env.PUBLIC_VERSION = process.env.npm_package_version;
+
+/** @type {import('@sveltejs/kit').Config} */
+const config = {
+ // Consult https://kit.svelte.dev/docs/integrations#preprocessors
+ // for more information about preprocessors
+ preprocess: vitePreprocess(),
+
+ kit: {
+ adapter: adapter(),
+
+ paths: {
+ base: process.env.APP_BASE || "",
+ },
+ csrf: {
+ // handled in hooks.server.ts, because we can have multiple valid origins
+ checkOrigin: false,
+ },
+ },
+};
+
+export default config;
diff --git a/tailwind.config.cjs b/tailwind.config.cjs
new file mode 100644
index 0000000000000000000000000000000000000000..773347ec02b3a46d6339829b8636f47b37c11a73
--- /dev/null
+++ b/tailwind.config.cjs
@@ -0,0 +1,29 @@
+const defaultTheme = require("tailwindcss/defaultTheme");
+const colors = require("tailwindcss/colors");
+
+import dotenv from "dotenv";
+dotenv.config({ path: "./.env" });
+
+/** @type {import('tailwindcss').Config} */
+export default {
+ darkMode: "class",
+ content: ["./src/**/*.{html,js,svelte,ts}"],
+ theme: {
+ extend: {
+ colors: {
+ primary: colors[process.env.PUBLIC_APP_COLOR],
+ },
+ // fontFamily: {
+ // sans: ['"Inter"', ...defaultTheme.fontFamily.sans]
+ // },
+ fontSize: {
+ xxs: "0.625rem",
+ smd: "0.94rem",
+ },
+ },
+ },
+ plugins: [
+ require("tailwind-scrollbar")({ nocompatible: true }),
+ require("@tailwindcss/typography"),
+ ],
+};
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000000000000000000000000000000000000..fbfc0ac0b5a0de065a5166c0e1475c4b98510268
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,18 @@
+{
+ "extends": "./.svelte-kit/tsconfig.json",
+ "compilerOptions": {
+ "allowJs": true,
+ "checkJs": true,
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
+ "resolveJsonModule": true,
+ "skipLibCheck": true,
+ "sourceMap": true,
+ "strict": true,
+ "target": "ES2018"
+ }
+ // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias
+ //
+ // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes
+ // from the referenced tsconfig.json - TypeScript does not merge them in
+}
diff --git a/vite.config.ts b/vite.config.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a8dcb65528b6002ae739ef1bead5b366d6aaf9b9
--- /dev/null
+++ b/vite.config.ts
@@ -0,0 +1,21 @@
+import { sveltekit } from "@sveltejs/kit/vite";
+import { defineConfig, searchForWorkspaceRoot } from "vite";
+import Icons from "unplugin-icons/vite";
+
+export default defineConfig({
+ plugins: [
+ sveltekit(),
+ Icons({
+ compiler: "svelte",
+ }),
+ ],
+ server: {
+ fs: {
+ allow: [
+ // your custom rules
+ "/models/Xenova/LaMini-Flan-T5-783M/onnx/decoder_model_merged_quantized.onnx",
+ "/models/Xenova/LaMini-Flan-T5-783M/onnx/encoder_model_quantized.onnx",
+ ],
+ },
+ },
+});