diff --git a/API/controller.js/record.controller.js b/API/controller.js/record.controller.js
new file mode 100644
index 0000000..8eddbfb
--- /dev/null
+++ b/API/controller.js/record.controller.js
@@ -0,0 +1,105 @@
+// Import the PetRecord model
+import PetRecord from '../model.js/record.model.js';
+
+// Controller to handle adding a new pet record
+export const addPetRecord = async (req, res) => {
+ try {
+ // Extracting data from the request body
+ const { petName, ownerName, petBreed, petAge, specialNotes } = req.body;
+
+ // Creating a new pet record instance
+ const newPetRecord = new PetRecord({
+ petName,
+ ownerName,
+ petBreed,
+ petAge,
+ specialNotes
+ });
+
+ // Saving the new pet record to the database
+ await newPetRecord.save();
+
+ // Sending a success response
+ res.status(201).json({ message: 'Pet record added successfully' });
+ } catch (error) {
+ // Handling errors
+ res.status(500).json({ message: 'Failed to add pet record', error: error.message });
+ }
+};
+
+// Controller to handle fetching all pet records
+export const getAllPetRecords = async (req, res) => {
+ try {
+ // Fetching all pet records from the database
+ const petRecords = await PetRecord.find();
+
+ // Sending the pet records as a response
+ res.status(200).json(petRecords);
+ } catch (error) {
+ // Handling errors
+ res.status(500).json({ message: 'Failed to fetch pet records', error: error.message });
+ }
+};
+
+// Controller to handle fetching a single pet record
+
+export const getSinglePetRecord = async (req, res) => {
+ try {
+ // Extracting the pet record ID from the request parameters
+ const { id } = req.params;
+
+ // Fetching the pet record from the database
+ const petRecord = await PetRecord.findById(id);
+
+ // Sending the pet record as a response
+ res.status(200).json(petRecord);
+ } catch (error) {
+ // Handling errors
+ res.status(500).json({ message: 'Failed to fetch pet record', error: error.message });
+ }
+};
+
+// Controller to handle updating a pet record
+
+export const updatePetRecord = async (req, res) => {
+ try {
+ // Extracting the pet record ID from the request parameters
+ const { id } = req.params;
+
+ // Extracting data from the request body
+ const { petName, ownerName, petBreed, petAge, specialNotes } = req.body;
+
+ // Updating the pet record in the database
+ await PetRecord.findByIdAndUpdate(id, {
+ petName,
+ ownerName,
+ petBreed,
+ petAge,
+ specialNotes
+ });
+
+ // Sending a success response
+ res.status(200).json({ message: 'Pet record updated successfully' });
+ } catch (error) {
+ // Handling errors
+ res.status(500).json({ message: 'Failed to update pet record', error: error.message });
+ }
+}
+
+// Controller to handle deleting a pet record
+
+export const deletePetRecord = async (req, res) => {
+ try {
+ // Extracting the pet record ID from the request parameters
+ const { id } = req.params;
+
+ // Deleting the pet record from the database
+ await PetRecord.findByIdAndDelete(id);
+
+ // Sending a success response
+ res.status(200).json({ message: 'Pet record deleted successfully' });
+ } catch (error) {
+ // Handling errors
+ res.status(500).json({ message: 'Failed to delete pet record', error: error.message });
+ }
+}
diff --git a/API/index.js b/API/index.js
new file mode 100644
index 0000000..bccb45b
--- /dev/null
+++ b/API/index.js
@@ -0,0 +1,25 @@
+import express from "express";
+import mongoose from "mongoose";
+import recordRouter from "./routes/record.route.js"
+import cors from "cors";
+import bodyParser from "body-parser";
+
+const app = express();
+
+app.use(cors());
+
+app.use(bodyParser.json());
+
+app.listen(3000, () => {
+ console.log("Server is running on port 3000");
+});
+
+mongoose.connect("mongodb+srv://nekanayake789:Naveen%23123@furrypets.sfoid0i.mongodb.net/?retryWrites=true&w=majority&appName=furrypets").then(() => {
+ console.log("Connected to the database");
+}).catch((err) => {
+
+ console.log("Could not connect to the database. Exiting now...", err);
+ process.exit();
+});
+
+app.use("/api/records", recordRouter);
\ No newline at end of file
diff --git a/API/model.js/record.model.js b/API/model.js/record.model.js
new file mode 100644
index 0000000..380a9ef
--- /dev/null
+++ b/API/model.js/record.model.js
@@ -0,0 +1,27 @@
+import mongoose from 'mongoose';
+
+// Define the schema for the pet record
+const petRecordSchema = new mongoose.Schema({
+ petName: {
+ type: String,
+ required: true
+ },
+ ownerName: {
+ type: String,
+ required: true
+ },
+ petBreed: {
+ type: String
+ },
+ petAge: {
+ type: Number
+ },
+ specialNotes: {
+ type: String
+ }
+});
+
+// Create a model from the schema
+const PetRecord = mongoose.model('PetRecord', petRecordSchema);
+
+export default PetRecord;
diff --git a/API/routes/record.route.js b/API/routes/record.route.js
new file mode 100644
index 0000000..3e45b28
--- /dev/null
+++ b/API/routes/record.route.js
@@ -0,0 +1,16 @@
+import express from 'express';
+import { addPetRecord, deletePetRecord, getAllPetRecords, getSinglePetRecord, updatePetRecord } from '../controller.js/record.controller.js';
+
+const router = express.Router();
+
+router.post('/petRecords', addPetRecord);
+
+router.get('/petRecords', getAllPetRecords);
+
+router.put('/petRecords/:id', updatePetRecord);
+
+router.delete('/petRecords/:id', deletePetRecord);
+
+router.get('/petRecords/:id', getSinglePetRecord);
+
+export default router;
diff --git a/client/.eslintrc.cjs b/client/.eslintrc.cjs
new file mode 100644
index 0000000..3e212e1
--- /dev/null
+++ b/client/.eslintrc.cjs
@@ -0,0 +1,21 @@
+module.exports = {
+ root: true,
+ env: { browser: true, es2020: true },
+ extends: [
+ 'eslint:recommended',
+ 'plugin:react/recommended',
+ 'plugin:react/jsx-runtime',
+ 'plugin:react-hooks/recommended',
+ ],
+ ignorePatterns: ['dist', '.eslintrc.cjs'],
+ parserOptions: { ecmaVersion: 'latest', sourceType: 'module' },
+ settings: { react: { version: '18.2' } },
+ plugins: ['react-refresh'],
+ rules: {
+ 'react/jsx-no-target-blank': 'off',
+ 'react-refresh/only-export-components': [
+ 'warn',
+ { allowConstantExport: true },
+ ],
+ },
+}
diff --git a/client/.gitignore b/client/.gitignore
new file mode 100644
index 0000000..a547bf3
--- /dev/null
+++ b/client/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/client/README.md b/client/README.md
new file mode 100644
index 0000000..f768e33
--- /dev/null
+++ b/client/README.md
@@ -0,0 +1,8 @@
+# React + Vite
+
+This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
+
+Currently, two official plugins are available:
+
+- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh
+- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
diff --git a/client/index.html b/client/index.html
new file mode 100644
index 0000000..0c589ec
--- /dev/null
+++ b/client/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite + React
+
+
+
+
+
+
diff --git a/client/package-lock.json b/client/package-lock.json
new file mode 100644
index 0000000..ed2e989
--- /dev/null
+++ b/client/package-lock.json
@@ -0,0 +1,5110 @@
+{
+ "name": "client",
+ "version": "0.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "client",
+ "version": "0.0.0",
+ "dependencies": {
+ "axios": "^1.6.8",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-router-dom": "^6.23.1"
+ },
+ "devDependencies": {
+ "@types/react": "^18.2.66",
+ "@types/react-dom": "^18.2.22",
+ "@vitejs/plugin-react-swc": "^3.5.0",
+ "autoprefixer": "^10.4.19",
+ "eslint": "^8.57.0",
+ "eslint-plugin-react": "^7.34.1",
+ "eslint-plugin-react-hooks": "^4.6.0",
+ "eslint-plugin-react-refresh": "^0.4.6",
+ "postcss": "^8.4.38",
+ "tailwindcss": "^3.4.3",
+ "vite": "^5.2.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==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
+ "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
+ "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",
+ "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz",
+ "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",
+ "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",
+ "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",
+ "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",
+ "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",
+ "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",
+ "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",
+ "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",
+ "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",
+ "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",
+ "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",
+ "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",
+ "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",
+ "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",
+ "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",
+ "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",
+ "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",
+ "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",
+ "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",
+ "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
+ "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.10.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
+ "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+ "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+ "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.57.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
+ "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.11.14",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
+ "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^2.0.2",
+ "debug": "^4.3.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": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
+ "dev": true
+ },
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
+ "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/set-array": "^1.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "dev": true,
+ "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==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@remix-run/router": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.16.1.tgz",
+ "integrity": "sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig==",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz",
+ "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz",
+ "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz",
+ "integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz",
+ "integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz",
+ "integrity": "sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz",
+ "integrity": "sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz",
+ "integrity": "sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz",
+ "integrity": "sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz",
+ "integrity": "sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz",
+ "integrity": "sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz",
+ "integrity": "sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz",
+ "integrity": "sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz",
+ "integrity": "sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz",
+ "integrity": "sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz",
+ "integrity": "sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz",
+ "integrity": "sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@swc/core": {
+ "version": "1.5.7",
+ "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.5.7.tgz",
+ "integrity": "sha512-U4qJRBefIJNJDRCCiVtkfa/hpiZ7w0R6kASea+/KLp+vkus3zcLSB8Ub8SvKgTIxjWpwsKcZlPf5nrv4ls46SQ==",
+ "dev": true,
+ "hasInstallScript": true,
+ "dependencies": {
+ "@swc/counter": "^0.1.2",
+ "@swc/types": "0.1.7"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/swc"
+ },
+ "optionalDependencies": {
+ "@swc/core-darwin-arm64": "1.5.7",
+ "@swc/core-darwin-x64": "1.5.7",
+ "@swc/core-linux-arm-gnueabihf": "1.5.7",
+ "@swc/core-linux-arm64-gnu": "1.5.7",
+ "@swc/core-linux-arm64-musl": "1.5.7",
+ "@swc/core-linux-x64-gnu": "1.5.7",
+ "@swc/core-linux-x64-musl": "1.5.7",
+ "@swc/core-win32-arm64-msvc": "1.5.7",
+ "@swc/core-win32-ia32-msvc": "1.5.7",
+ "@swc/core-win32-x64-msvc": "1.5.7"
+ },
+ "peerDependencies": {
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependenciesMeta": {
+ "@swc/helpers": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@swc/core-darwin-arm64": {
+ "version": "1.5.7",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.5.7.tgz",
+ "integrity": "sha512-bZLVHPTpH3h6yhwVl395k0Mtx8v6CGhq5r4KQdAoPbADU974Mauz1b6ViHAJ74O0IVE5vyy7tD3OpkQxL/vMDQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-darwin-x64": {
+ "version": "1.5.7",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.5.7.tgz",
+ "integrity": "sha512-RpUyu2GsviwTc2qVajPL0l8nf2vKj5wzO3WkLSHAHEJbiUZk83NJrZd1RVbEknIMO7+Uyjh54hEh8R26jSByaw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm-gnueabihf": {
+ "version": "1.5.7",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.5.7.tgz",
+ "integrity": "sha512-cTZWTnCXLABOuvWiv6nQQM0hP6ZWEkzdgDvztgHI/+u/MvtzJBN5lBQ2lue/9sSFYLMqzqff5EHKlFtrJCA9dQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm64-gnu": {
+ "version": "1.5.7",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.5.7.tgz",
+ "integrity": "sha512-hoeTJFBiE/IJP30Be7djWF8Q5KVgkbDtjySmvYLg9P94bHg9TJPSQoC72tXx/oXOgXvElDe/GMybru0UxhKx4g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm64-musl": {
+ "version": "1.5.7",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.5.7.tgz",
+ "integrity": "sha512-+NDhK+IFTiVK1/o7EXdCeF2hEzCiaRSrb9zD7X2Z7inwWlxAntcSuzZW7Y6BRqGQH89KA91qYgwbnjgTQ22PiQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-x64-gnu": {
+ "version": "1.5.7",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.5.7.tgz",
+ "integrity": "sha512-25GXpJmeFxKB+7pbY7YQLhWWjkYlR+kHz5I3j9WRl3Lp4v4UD67OGXwPe+DIcHqcouA1fhLhsgHJWtsaNOMBNg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-x64-musl": {
+ "version": "1.5.7",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.5.7.tgz",
+ "integrity": "sha512-0VN9Y5EAPBESmSPPsCJzplZHV26akC0sIgd3Hc/7S/1GkSMoeuVL+V9vt+F/cCuzr4VidzSkqftdP3qEIsXSpg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-arm64-msvc": {
+ "version": "1.5.7",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.5.7.tgz",
+ "integrity": "sha512-RtoNnstBwy5VloNCvmvYNApkTmuCe4sNcoYWpmY7C1+bPR+6SOo8im1G6/FpNem8AR5fcZCmXHWQ+EUmRWJyuA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-ia32-msvc": {
+ "version": "1.5.7",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.5.7.tgz",
+ "integrity": "sha512-Xm0TfvcmmspvQg1s4+USL3x8D+YPAfX2JHygvxAnCJ0EHun8cm2zvfNBcsTlnwYb0ybFWXXY129aq1wgFC9TpQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-x64-msvc": {
+ "version": "1.5.7",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.5.7.tgz",
+ "integrity": "sha512-tp43WfJLCsKLQKBmjmY/0vv1slVywR5Q4qKjF5OIY8QijaEW7/8VwPyUyVoJZEnDgv9jKtUTG5PzqtIYPZGnyg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/counter": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
+ "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==",
+ "dev": true
+ },
+ "node_modules/@swc/types": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.7.tgz",
+ "integrity": "sha512-scHWahbHF0eyj3JsxG9CFJgFdFNaVQCNAimBlT6PzS3n/HptxqREjsm4OH6AN3lYcffZYSPxXW8ua2BEHp0lJQ==",
+ "dev": true,
+ "dependencies": {
+ "@swc/counter": "^0.1.3"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
+ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+ "dev": true
+ },
+ "node_modules/@types/prop-types": {
+ "version": "15.7.12",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz",
+ "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==",
+ "dev": true
+ },
+ "node_modules/@types/react": {
+ "version": "18.3.2",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.2.tgz",
+ "integrity": "sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w==",
+ "dev": true,
+ "dependencies": {
+ "@types/prop-types": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "18.3.0",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz",
+ "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==",
+ "dev": true,
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
+ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
+ "dev": true
+ },
+ "node_modules/@vitejs/plugin-react-swc": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.6.0.tgz",
+ "integrity": "sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g==",
+ "dev": true,
+ "dependencies": {
+ "@swc/core": "^1.3.107"
+ },
+ "peerDependencies": {
+ "vite": "^4 || ^5"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.11.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
+ "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
+ "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/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==",
+ "dev": true
+ },
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true
+ },
+ "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-buffer-byte-length": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
+ "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "is-array-buffer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-includes": {
+ "version": "3.1.8",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz",
+ "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "is-string": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.findlast": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
+ "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flat": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz",
+ "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flatmap": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz",
+ "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.toreversed": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz",
+ "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0"
+ }
+ },
+ "node_modules/array.prototype.tosorted": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz",
+ "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.22.3",
+ "es-errors": "^1.1.0",
+ "es-shim-unscopables": "^1.0.2"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
+ "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==",
+ "dev": true,
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "call-bind": "^1.0.5",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.22.3",
+ "es-errors": "^1.2.1",
+ "get-intrinsic": "^1.2.3",
+ "is-array-buffer": "^3.0.4",
+ "is-shared-array-buffer": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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.19",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz",
+ "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==",
+ "dev": true,
+ "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.23.0",
+ "caniuse-lite": "^1.0.30001599",
+ "fraction.js": "^4.3.7",
+ "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/available-typed-arrays": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "dev": true,
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/axios": {
+ "version": "1.6.8",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz",
+ "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==",
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "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==",
+ "dev": true
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.23.0",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
+ "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
+ "dev": true,
+ "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.30001587",
+ "electron-to-chromium": "^1.4.668",
+ "node-releases": "^2.0.14",
+ "update-browserslist-db": "^1.0.13"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
+ "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+ "dev": true,
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001620",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001620.tgz",
+ "integrity": "sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew==",
+ "dev": true,
+ "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/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/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "dev": true,
+ "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"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true
+ },
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true
+ },
+ "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==",
+ "dev": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "dev": true
+ },
+ "node_modules/data-view-buffer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
+ "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.6",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/data-view-byte-length": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz",
+ "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/data-view-byte-offset": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz",
+ "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.6",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "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/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dev": true,
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "dev": true,
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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/didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+ "dev": true
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+ "dev": true
+ },
+ "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/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.772",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.772.tgz",
+ "integrity": "sha512-jFfEbxR/abTTJA3ci+2ok1NTuOBBtB4jH+UT6PUmRN+DY3WSD4FFRsgoVQ+QNIJ0T7wrXwzsWCI2WKC46b++2A==",
+ "dev": true
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true
+ },
+ "node_modules/es-abstract": {
+ "version": "1.23.3",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz",
+ "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==",
+ "dev": true,
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "arraybuffer.prototype.slice": "^1.0.3",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.7",
+ "data-view-buffer": "^1.0.1",
+ "data-view-byte-length": "^1.0.1",
+ "data-view-byte-offset": "^1.0.0",
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-set-tostringtag": "^2.0.3",
+ "es-to-primitive": "^1.2.1",
+ "function.prototype.name": "^1.1.6",
+ "get-intrinsic": "^1.2.4",
+ "get-symbol-description": "^1.0.2",
+ "globalthis": "^1.0.3",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.0.3",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.2",
+ "internal-slot": "^1.0.7",
+ "is-array-buffer": "^3.0.4",
+ "is-callable": "^1.2.7",
+ "is-data-view": "^1.0.1",
+ "is-negative-zero": "^2.0.3",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.3",
+ "is-string": "^1.0.7",
+ "is-typed-array": "^1.1.13",
+ "is-weakref": "^1.0.2",
+ "object-inspect": "^1.13.1",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.5",
+ "regexp.prototype.flags": "^1.5.2",
+ "safe-array-concat": "^1.1.2",
+ "safe-regex-test": "^1.0.3",
+ "string.prototype.trim": "^1.2.9",
+ "string.prototype.trimend": "^1.0.8",
+ "string.prototype.trimstart": "^1.0.8",
+ "typed-array-buffer": "^1.0.2",
+ "typed-array-byte-length": "^1.0.1",
+ "typed-array-byte-offset": "^1.0.2",
+ "typed-array-length": "^1.0.6",
+ "unbox-primitive": "^1.0.2",
+ "which-typed-array": "^1.1.15"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
+ "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.2.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-iterator-helpers": {
+ "version": "1.0.19",
+ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz",
+ "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3",
+ "es-errors": "^1.3.0",
+ "es-set-tostringtag": "^2.0.3",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "globalthis": "^1.0.3",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.0.3",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.7",
+ "iterator.prototype": "^1.1.2",
+ "safe-array-concat": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
+ "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
+ "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.2.4",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-shim-unscopables": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
+ "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
+ "dev": true,
+ "dependencies": {
+ "hasown": "^2.0.0"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "dependencies": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
+ "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.20.2",
+ "@esbuild/android-arm": "0.20.2",
+ "@esbuild/android-arm64": "0.20.2",
+ "@esbuild/android-x64": "0.20.2",
+ "@esbuild/darwin-arm64": "0.20.2",
+ "@esbuild/darwin-x64": "0.20.2",
+ "@esbuild/freebsd-arm64": "0.20.2",
+ "@esbuild/freebsd-x64": "0.20.2",
+ "@esbuild/linux-arm": "0.20.2",
+ "@esbuild/linux-arm64": "0.20.2",
+ "@esbuild/linux-ia32": "0.20.2",
+ "@esbuild/linux-loong64": "0.20.2",
+ "@esbuild/linux-mips64el": "0.20.2",
+ "@esbuild/linux-ppc64": "0.20.2",
+ "@esbuild/linux-riscv64": "0.20.2",
+ "@esbuild/linux-s390x": "0.20.2",
+ "@esbuild/linux-x64": "0.20.2",
+ "@esbuild/netbsd-x64": "0.20.2",
+ "@esbuild/openbsd-x64": "0.20.2",
+ "@esbuild/sunos-x64": "0.20.2",
+ "@esbuild/win32-arm64": "0.20.2",
+ "@esbuild/win32-ia32": "0.20.2",
+ "@esbuild/win32-x64": "0.20.2"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
+ "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
+ "dev": true,
+ "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.57.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
+ "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.4",
+ "@eslint/js": "8.57.0",
+ "@humanwhocodes/config-array": "^0.11.14",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "@ungap/structured-clone": "^1.2.0",
+ "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-plugin-react": {
+ "version": "7.34.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz",
+ "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==",
+ "dev": true,
+ "dependencies": {
+ "array-includes": "^3.1.7",
+ "array.prototype.findlast": "^1.2.4",
+ "array.prototype.flatmap": "^1.3.2",
+ "array.prototype.toreversed": "^1.1.2",
+ "array.prototype.tosorted": "^1.1.3",
+ "doctrine": "^2.1.0",
+ "es-iterator-helpers": "^1.0.17",
+ "estraverse": "^5.3.0",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.7",
+ "object.fromentries": "^2.0.7",
+ "object.hasown": "^1.1.3",
+ "object.values": "^1.1.7",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.5",
+ "semver": "^6.3.1",
+ "string.prototype.matchall": "^4.0.10"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz",
+ "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
+ }
+ },
+ "node_modules/eslint-plugin-react-refresh": {
+ "version": "0.4.7",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.7.tgz",
+ "integrity": "sha512-yrj+KInFmwuQS2UQcg1SF83ha1tuHC1jMQbRNyuWtlEzzKRDgAl7L4Yp4NlDUZTZNlWvHEzOtJhMi40R7JxcSw==",
+ "dev": true,
+ "peerDependencies": {
+ "eslint": ">=7"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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-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/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/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/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/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/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-glob": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "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.17.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
+ "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "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.2.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.3",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
+ "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
+ "dev": true
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.6",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
+ "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/for-each": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "dev": true,
+ "dependencies": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "node_modules/foreground-child": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
+ "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "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.7",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
+ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "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==",
+ "dev": true
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/function.prototype.name": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
+ "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "functions-have-names": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+ "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
+ "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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/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==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.1.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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/has-bigints": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
+ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "dev": true,
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
+ "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
+ "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true
+ },
+ "node_modules/internal-slot": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
+ "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.0",
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
+ "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-async-function": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz",
+ "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bigint": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "dev": true,
+ "dependencies": {
+ "has-bigints": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.13.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
+ "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+ "dev": true,
+ "dependencies": {
+ "hasown": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-data-view": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz",
+ "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==",
+ "dev": true,
+ "dependencies": {
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
+ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-finalizationregistry": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz",
+ "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
+ "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+ "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
+ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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-regex": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-set": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
+ "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
+ "dev": true,
+ "dependencies": {
+ "which-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakmap": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakref": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakset": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz",
+ "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "get-intrinsic": "^1.2.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true
+ },
+ "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/iterator.prototype": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz",
+ "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "get-intrinsic": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "reflect.getprototypeof": "^1.0.4",
+ "set-function-name": "^2.0.1"
+ }
+ },
+ "node_modules/jackspeak": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
+ "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
+ "dev": true,
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "1.21.0",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz",
+ "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==",
+ "dev": true,
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ },
+ "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/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/jsx-ast-utils": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
+ "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
+ "dev": true,
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "object.assign": "^4.1.4",
+ "object.values": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true
+ },
+ "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.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/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "10.2.2",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz",
+ "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==",
+ "dev": true,
+ "engines": {
+ "node": "14 || >=16.14"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "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/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz",
+ "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==",
+ "dev": true,
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "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==",
+ "dev": true
+ },
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "dev": true,
+ "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/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/node-releases": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
+ "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
+ "dev": true
+ },
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
+ "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
+ "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "define-properties": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz",
+ "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.fromentries": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
+ "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.hasown": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz",
+ "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.values": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz",
+ "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "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/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==",
+ "dev": true,
+ "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==",
+ "dev": true
+ },
+ "node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
+ "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
+ "dev": true
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/possible-typed-array-names": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
+ "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.38",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
+ "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
+ "dev": true,
+ "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.7",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.2.0"
+ },
+ "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==",
+ "dev": true,
+ "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-import/node_modules/resolve": {
+ "version": "1.22.8",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "dev": true,
+ "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/postcss-js": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
+ "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
+ "dev": true,
+ "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": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
+ "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "lilconfig": "^3.0.0",
+ "yaml": "^2.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-load-config/node_modules/lilconfig": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz",
+ "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
+ }
+ },
+ "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==",
+ "dev": true,
+ "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-selector-parser": {
+ "version": "6.0.16",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz",
+ "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==",
+ "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==",
+ "dev": true
+ },
+ "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/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "dev": true,
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "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==",
+ "dev": true,
+ "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/react": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
+ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
+ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.2"
+ },
+ "peerDependencies": {
+ "react": "^18.3.1"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "dev": true
+ },
+ "node_modules/react-router": {
+ "version": "6.23.1",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.23.1.tgz",
+ "integrity": "sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ==",
+ "dependencies": {
+ "@remix-run/router": "1.16.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8"
+ }
+ },
+ "node_modules/react-router-dom": {
+ "version": "6.23.1",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.23.1.tgz",
+ "integrity": "sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ==",
+ "dependencies": {
+ "@remix-run/router": "1.16.1",
+ "react-router": "6.23.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8",
+ "react-dom": ">=16.8"
+ }
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "pify": "^2.3.0"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/reflect.getprototypeof": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz",
+ "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.1",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.4",
+ "globalthis": "^1.0.3",
+ "which-builtin-type": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz",
+ "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.6",
+ "define-properties": "^1.2.1",
+ "es-errors": "^1.3.0",
+ "set-function-name": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "2.0.0-next.5",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
+ "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "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/rollup": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz",
+ "integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "1.0.5"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.17.2",
+ "@rollup/rollup-android-arm64": "4.17.2",
+ "@rollup/rollup-darwin-arm64": "4.17.2",
+ "@rollup/rollup-darwin-x64": "4.17.2",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.17.2",
+ "@rollup/rollup-linux-arm-musleabihf": "4.17.2",
+ "@rollup/rollup-linux-arm64-gnu": "4.17.2",
+ "@rollup/rollup-linux-arm64-musl": "4.17.2",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.17.2",
+ "@rollup/rollup-linux-riscv64-gnu": "4.17.2",
+ "@rollup/rollup-linux-s390x-gnu": "4.17.2",
+ "@rollup/rollup-linux-x64-gnu": "4.17.2",
+ "@rollup/rollup-linux-x64-musl": "4.17.2",
+ "@rollup/rollup-win32-arm64-msvc": "4.17.2",
+ "@rollup/rollup-win32-ia32-msvc": "4.17.2",
+ "@rollup/rollup-win32-x64-msvc": "4.17.2",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "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==",
+ "dev": true,
+ "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/safe-array-concat": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
+ "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "get-intrinsic": "^1.2.4",
+ "has-symbols": "^1.0.3",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz",
+ "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.6",
+ "es-errors": "^1.3.0",
+ "is-regex": "^1.1.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.23.2",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "dev": true,
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-function-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+ "dev": true,
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "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/side-channel": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
+ "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.4",
+ "object-inspect": "^1.13.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
+ "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/string-width/node_modules/ansi-regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/string-width/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/string.prototype.matchall": {
+ "version": "4.0.11",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz",
+ "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.7",
+ "regexp.prototype.flags": "^1.5.2",
+ "set-function-name": "^2.0.2",
+ "side-channel": "^1.0.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz",
+ "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.0",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz",
+ "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+ "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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-ansi-cjs": {
+ "name": "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-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/sucrase": {
+ "version": "3.35.0",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
+ "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "glob": "^10.3.10",
+ "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": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/sucrase/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/sucrase/node_modules/glob": {
+ "version": "10.3.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.15.tgz",
+ "integrity": "sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==",
+ "dev": true,
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^2.3.6",
+ "minimatch": "^9.0.1",
+ "minipass": "^7.0.4",
+ "path-scurry": "^1.11.0"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/sucrase/node_modules/minimatch": {
+ "version": "9.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
+ "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz",
+ "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==",
+ "dev": true,
+ "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.3.0",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "jiti": "^1.21.0",
+ "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/resolve": {
+ "version": "1.22.8",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "dev": true,
+ "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/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==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "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==",
+ "dev": true
+ },
+ "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-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/typed-array-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz",
+ "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz",
+ "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-proto": "^1.0.3",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-byte-offset": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz",
+ "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==",
+ "dev": true,
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-proto": "^1.0.3",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz",
+ "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-proto": "^1.0.3",
+ "is-typed-array": "^1.1.13",
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.0.3",
+ "which-boxed-primitive": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.0.16",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz",
+ "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==",
+ "dev": true,
+ "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.2",
+ "picocolors": "^1.0.1"
+ },
+ "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/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true
+ },
+ "node_modules/vite": {
+ "version": "5.2.11",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz",
+ "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.20.1",
+ "postcss": "^8.4.38",
+ "rollup": "^4.13.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || >=20.0.0",
+ "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/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/which-boxed-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "dev": true,
+ "dependencies": {
+ "is-bigint": "^1.0.1",
+ "is-boolean-object": "^1.1.0",
+ "is-number-object": "^1.0.4",
+ "is-string": "^1.0.5",
+ "is-symbol": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-builtin-type": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz",
+ "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==",
+ "dev": true,
+ "dependencies": {
+ "function.prototype.name": "^1.1.5",
+ "has-tostringtag": "^1.0.0",
+ "is-async-function": "^2.0.0",
+ "is-date-object": "^1.0.5",
+ "is-finalizationregistry": "^1.0.2",
+ "is-generator-function": "^1.0.10",
+ "is-regex": "^1.1.4",
+ "is-weakref": "^1.0.2",
+ "isarray": "^2.0.5",
+ "which-boxed-primitive": "^1.0.2",
+ "which-collection": "^1.0.1",
+ "which-typed-array": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-collection": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
+ "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
+ "dev": true,
+ "dependencies": {
+ "is-map": "^2.0.3",
+ "is-set": "^2.0.3",
+ "is-weakmap": "^2.0.2",
+ "is-weakset": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
+ "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
+ "dev": true,
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "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==",
+ "dev": true
+ },
+ "node_modules/yaml": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz",
+ "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==",
+ "dev": true,
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "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"
+ }
+ }
+ }
+}
diff --git a/client/package.json b/client/package.json
new file mode 100644
index 0000000..6ade7e6
--- /dev/null
+++ b/client/package.json
@@ -0,0 +1,31 @@
+{
+ "name": "client",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "axios": "^1.6.8",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-router-dom": "^6.23.1"
+ },
+ "devDependencies": {
+ "@types/react": "^18.2.66",
+ "@types/react-dom": "^18.2.22",
+ "@vitejs/plugin-react-swc": "^3.5.0",
+ "autoprefixer": "^10.4.19",
+ "eslint": "^8.57.0",
+ "eslint-plugin-react": "^7.34.1",
+ "eslint-plugin-react-hooks": "^4.6.0",
+ "eslint-plugin-react-refresh": "^0.4.6",
+ "postcss": "^8.4.38",
+ "tailwindcss": "^3.4.3",
+ "vite": "^5.2.0"
+ }
+}
diff --git a/client/postcss.config.js b/client/postcss.config.js
new file mode 100644
index 0000000..2e7af2b
--- /dev/null
+++ b/client/postcss.config.js
@@ -0,0 +1,6 @@
+export default {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+}
diff --git a/client/public/vite.svg b/client/public/vite.svg
new file mode 100644
index 0000000..e7b8dfb
--- /dev/null
+++ b/client/public/vite.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/client/src/App.jsx b/client/src/App.jsx
new file mode 100644
index 0000000..d810787
--- /dev/null
+++ b/client/src/App.jsx
@@ -0,0 +1,19 @@
+import React from "react";
+import { BrowserRouter, Route, Routes } from "react-router-dom";
+import AddRecord from "./pages/AddRecord";
+import PetRecordsTable from "./pages/ViewRecords";
+import UpdateRecord from "./pages/UpdateRecords";
+
+function App() {
+ return (
+
+
+ } />
+ } />
+ } />
+
+
+ );
+}
+
+export default App;
diff --git a/client/src/assets/image5.jpg b/client/src/assets/image5.jpg
new file mode 100644
index 0000000..d78bb85
Binary files /dev/null and b/client/src/assets/image5.jpg differ
diff --git a/client/src/assets/logo.png b/client/src/assets/logo.png
new file mode 100644
index 0000000..9532297
Binary files /dev/null and b/client/src/assets/logo.png differ
diff --git a/client/src/assets/react.svg b/client/src/assets/react.svg
new file mode 100644
index 0000000..6c87de9
--- /dev/null
+++ b/client/src/assets/react.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/client/src/components/Navbar.jsx b/client/src/components/Navbar.jsx
new file mode 100644
index 0000000..2006387
--- /dev/null
+++ b/client/src/components/Navbar.jsx
@@ -0,0 +1,52 @@
+import { Link } from "react-router-dom";
+import Logo from "../assets/logo.png";
+
+const Navbar = () => {
+
+
+ ;
+};
+
+export default Navbar;
diff --git a/client/src/index.css b/client/src/index.css
new file mode 100644
index 0000000..bd6213e
--- /dev/null
+++ b/client/src/index.css
@@ -0,0 +1,3 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
\ No newline at end of file
diff --git a/client/src/main.jsx b/client/src/main.jsx
new file mode 100644
index 0000000..54b39dd
--- /dev/null
+++ b/client/src/main.jsx
@@ -0,0 +1,10 @@
+import React from 'react'
+import ReactDOM from 'react-dom/client'
+import App from './App.jsx'
+import './index.css'
+
+ReactDOM.createRoot(document.getElementById('root')).render(
+
+
+ ,
+)
diff --git a/client/src/pages/AddRecord.jsx b/client/src/pages/AddRecord.jsx
new file mode 100644
index 0000000..7f9e7cf
--- /dev/null
+++ b/client/src/pages/AddRecord.jsx
@@ -0,0 +1,157 @@
+import React, { useState } from "react";
+import axios from "axios";
+import { Link } from "react-router-dom";
+import Navbar from "../components/Navbar";
+import backgroundImage from "../../src/assets/image5.jpg";
+
+function AddRecord() {
+ const [petName, setPetName] = useState("");
+ const [ownerName, setOwnerName] = useState("");
+ const [petBreed, setPetBreed] = useState("");
+ const [petAge, setPetAge] = useState("");
+ const [specialNotes, setSpecialNotes] = useState("");
+ const [errorMessage, setErrorMessage] = useState("");
+
+ const handleSubmit = async (e) => {
+ e.preventDefault();
+ try {
+ // Sending data to the backend
+ await axios.post("http://localhost:3000/api/records/petRecords", {
+ petName,
+ ownerName,
+ petBreed,
+ petAge,
+ specialNotes,
+ });
+ // Resetting the form and error message
+ setPetName("");
+ setOwnerName("");
+ setPetBreed("");
+ setPetAge("");
+ setSpecialNotes("");
+ setErrorMessage("");
+ alert("Pet record added successfully!");
+ } catch (error) {
+ // Handling errors
+ if (error.response && error.response.data) {
+ setErrorMessage(error.response.data.message);
+ } else {
+ setErrorMessage("Failed to add pet record");
+ }
+ }
+ };
+
+ return (
+
+
+
Add Pets
+
+ {errorMessage &&
{errorMessage}
}
+
+
+ );
+}
+
+export default AddRecord;
diff --git a/client/src/pages/UpdateRecords.jsx b/client/src/pages/UpdateRecords.jsx
new file mode 100644
index 0000000..d4a8b96
--- /dev/null
+++ b/client/src/pages/UpdateRecords.jsx
@@ -0,0 +1,176 @@
+import React, { useState, useEffect } from "react";
+import axios from "axios";
+import { useParams, useNavigate, Link } from "react-router-dom";
+import backgroundImage from "../../src/assets/image5.jpg";
+
+function UpdateRecord() {
+ const navigate = useNavigate();
+ const { id } = useParams();
+ const [petRecord, setPetRecord] = useState(null);
+ const [petName, setPetName] = useState("");
+ const [ownerName, setOwnerName] = useState("");
+ const [petBreed, setPetBreed] = useState("");
+ const [petAge, setPetAge] = useState("");
+ const [specialNotes, setSpecialNotes] = useState("");
+ const [errorMessage, setErrorMessage] = useState("");
+
+ useEffect(() => {
+ fetchPetRecord(id);
+ }, [id]);
+
+ const fetchPetRecord = async (id) => {
+ try {
+ const response = await axios.get(
+ `http://localhost:3000/api/records/petRecords/${id}`
+ );
+ setPetRecord(response.data);
+ setPetName(response.data.petName);
+ setOwnerName(response.data.ownerName);
+ setPetBreed(response.data.petBreed);
+ setPetAge(response.data.petAge);
+ setSpecialNotes(response.data.specialNotes);
+ setErrorMessage("");
+ } catch (error) {
+ console.error("Failed to fetch pet record:", error);
+ setErrorMessage("Failed to fetch pet record");
+ }
+ };
+
+ const handleSubmit = async (e) => {
+ e.preventDefault();
+ try {
+ await axios.put(`http://localhost:3000/api/records/petRecords/${id}`, {
+ petName,
+ ownerName,
+ petBreed,
+ petAge,
+ specialNotes,
+ });
+ alert("Pet record updated successfully!");
+ navigate("/view");
+ } catch (error) {
+ console.error("Failed to update pet record:", error);
+ setErrorMessage("Failed to update pet record");
+ }
+ };
+
+ return (
+
+
+
+ Update Pet Record
+
+ {petRecord && (
+
+
+
+
+ Update Record
+
+
+
+ Back
+
+
+
+ {errorMessage && (
+
+ {errorMessage}
+
+ )}
+
+ )}
+
+
+ );
+}
+
+export default UpdateRecord;
diff --git a/client/src/pages/ViewRecords.jsx b/client/src/pages/ViewRecords.jsx
new file mode 100644
index 0000000..3ac04f2
--- /dev/null
+++ b/client/src/pages/ViewRecords.jsx
@@ -0,0 +1,159 @@
+import React, { useState, useEffect } from "react";
+import axios from "axios";
+import { Link } from "react-router-dom";
+import backgroundImage from "../../src/assets/image5.jpg";
+import Navbar from "../components/Navbar";
+import Logo from "../assets/logo.png";
+
+function PetRecordsTable() {
+ const [petRecords, setPetRecords] = useState([]);
+
+ useEffect(() => {
+ // Fetch all pet records from the backend when the component mounts
+ fetchPetRecords();
+ }, []);
+
+ const fetchPetRecords = async () => {
+ try {
+ // Fetch pet records from the backend
+ const response = await axios.get(
+ "http://localhost:3000/api/records/petRecords"
+ );
+ // Set the fetched pet records to the state
+ setPetRecords(response.data);
+ } catch (error) {
+ console.error("Failed to fetch pet records:", error);
+ }
+ };
+
+ const handleDelete = async (id) => {
+ // Delete the pet record from the backend
+ try {
+ await axios.delete(`http://localhost:3000/api/records/petRecords/${id}`);
+
+ // Fetch all pet records from the backend
+ fetchPetRecords();
+ } catch (error) {
+ console.error("Failed to delete pet record:", error);
+ }
+ };
+
+ return (
+ <>
+
+
+
+
+
Pet Records
+
+
+
+ Add Pets
+
+
+
+
+
+
+ Pet Name
+ Owner Name
+ Breed
+ Age
+ Special Notes
+ Action
+
+
+
+ {petRecords.map((record, index) => (
+
+ {record.petName}
+ {record.ownerName}
+ {record.petBreed}
+ {record.petAge}
+ {record.specialNotes}
+
+ {
+ handleDelete(record._id);
+ }}
+ >
+ Delete
+
+
+
+ Update
+
+
+
+
+ ))}
+
+
+
+ >
+ );
+}
+
+export default PetRecordsTable;
diff --git a/client/tailwind.config.js b/client/tailwind.config.js
new file mode 100644
index 0000000..d37737f
--- /dev/null
+++ b/client/tailwind.config.js
@@ -0,0 +1,12 @@
+/** @type {import('tailwindcss').Config} */
+export default {
+ content: [
+ "./index.html",
+ "./src/**/*.{js,ts,jsx,tsx}",
+ ],
+ theme: {
+ extend: {},
+ },
+ plugins: [],
+}
+
diff --git a/client/vite.config.js b/client/vite.config.js
new file mode 100644
index 0000000..861b04b
--- /dev/null
+++ b/client/vite.config.js
@@ -0,0 +1,7 @@
+import { defineConfig } from 'vite'
+import react from '@vitejs/plugin-react-swc'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [react()],
+})
diff --git a/node_modules/.bin/loose-envify b/node_modules/.bin/loose-envify
new file mode 100644
index 0000000..076f91b
--- /dev/null
+++ b/node_modules/.bin/loose-envify
@@ -0,0 +1,16 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*)
+ if command -v cygpath > /dev/null 2>&1; then
+ basedir=`cygpath -w "$basedir"`
+ fi
+ ;;
+esac
+
+if [ -x "$basedir/node" ]; then
+ exec "$basedir/node" "$basedir/../loose-envify/cli.js" "$@"
+else
+ exec node "$basedir/../loose-envify/cli.js" "$@"
+fi
diff --git a/node_modules/.bin/loose-envify.cmd b/node_modules/.bin/loose-envify.cmd
new file mode 100644
index 0000000..599576f
--- /dev/null
+++ b/node_modules/.bin/loose-envify.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+GOTO start
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
+:start
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\loose-envify\cli.js" %*
diff --git a/node_modules/.bin/loose-envify.ps1 b/node_modules/.bin/loose-envify.ps1
new file mode 100644
index 0000000..eb866fc
--- /dev/null
+++ b/node_modules/.bin/loose-envify.ps1
@@ -0,0 +1,28 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+ # Support pipeline input
+ if ($MyInvocation.ExpectingInput) {
+ $input | & "$basedir/node$exe" "$basedir/../loose-envify/cli.js" $args
+ } else {
+ & "$basedir/node$exe" "$basedir/../loose-envify/cli.js" $args
+ }
+ $ret=$LASTEXITCODE
+} else {
+ # Support pipeline input
+ if ($MyInvocation.ExpectingInput) {
+ $input | & "node$exe" "$basedir/../loose-envify/cli.js" $args
+ } else {
+ & "node$exe" "$basedir/../loose-envify/cli.js" $args
+ }
+ $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json
new file mode 100644
index 0000000..71f88c0
--- /dev/null
+++ b/node_modules/.package-lock.json
@@ -0,0 +1,554 @@
+{
+ "name": "record-mangement",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "node_modules/@iconify/iconify": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@iconify/iconify/-/iconify-3.1.1.tgz",
+ "integrity": "sha512-1nemfyD/OJzh9ALepH7YfuuP8BdEB24Skhd8DXWh0hzcOxImbb1ZizSZkpCzAwSZSGcJFmscIBaBQu+yLyWaxQ==",
+ "deprecated": "no longer maintained, switch to modern iconify-icon web component",
+ "dependencies": {
+ "@iconify/types": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/cyberalien"
+ }
+ },
+ "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=="
+ },
+ "node_modules/body-parser": {
+ "version": "1.20.2",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
+ "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "content-type": "~1.0.5",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "on-finished": "2.4.1",
+ "qs": "6.11.0",
+ "raw-body": "2.5.2",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
+ "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/clsx": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cors": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "dependencies": {
+ "object-assign": "^4",
+ "vary": "^1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "peer": true
+ },
+ "node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
+ "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+ "dependencies": {
+ "get-intrinsic": "^1.2.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+ "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/goober": {
+ "version": "2.1.14",
+ "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.14.tgz",
+ "integrity": "sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg==",
+ "peerDependencies": {
+ "csstype": "^3.0.10"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "dependencies": {
+ "get-intrinsic": "^1.1.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
+ "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "dependencies": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "peer": true
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "peer": true,
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "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/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ },
+ "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-inspect": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
+ "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+ "dependencies": {
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
+ "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/react": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
+ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
+ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.2"
+ },
+ "peerDependencies": {
+ "react": "^18.3.1"
+ }
+ },
+ "node_modules/react-hot-toast": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.4.1.tgz",
+ "integrity": "sha512-j8z+cQbWIM5LY37pR6uZR6D4LfseplqnuAO4co4u8917hBUvXlEqyP1ZzqVLcqoyUesZZv/ImreoCeHVDpE5pQ==",
+ "dependencies": {
+ "goober": "^2.1.10"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "react": ">=16",
+ "react-dom": ">=16"
+ }
+ },
+ "node_modules/react-toast": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/react-toast/-/react-toast-1.0.3.tgz",
+ "integrity": "sha512-gL3+O5hlLaoBmd36oXWKrjFeUyLCMQ04AIh48LrnUvdeg2vhJQ0E803TgVemgJvYUXKlutMVn9+/QS2DDnk26Q==",
+ "peerDependencies": {
+ "react": ">=16"
+ }
+ },
+ "node_modules/react-toastify": {
+ "version": "10.0.5",
+ "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-10.0.5.tgz",
+ "integrity": "sha512-mNKt2jBXJg4O7pSdbNUfDdTsK9FIdikfsIE/yUCxbAEXl4HMyJaivrVFcn3Elvt5xvCQYhUZm+hqTIu1UXM3Pw==",
+ "dependencies": {
+ "clsx": "^2.1.0"
+ },
+ "peerDependencies": {
+ "react": ">=18",
+ "react-dom": ">=18"
+ }
+ },
+ "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/scheduler": {
+ "version": "0.23.2",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
+ },
+ "node_modules/side-channel": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
+ "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.4",
+ "object-inspect": "^1.13.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ }
+ }
+}
diff --git a/node_modules/@iconify/iconify/README.md b/node_modules/@iconify/iconify/README.md
new file mode 100644
index 0000000..adbd93d
--- /dev/null
+++ b/node_modules/@iconify/iconify/README.md
@@ -0,0 +1,316 @@
+# What is Iconify?
+
+Iconify is the most versatile icon framework.
+
+- Unified icon framework that can be used with any icon library.
+- Out of the box includes 100+ icon sets with more than 150,000 icons.
+- Embed icons in HTML with SVG framework or components for front-end frameworks.
+- Embed icons in designs with plug-ins for Figma, Sketch and Adobe XD.
+- Add icon search to your applications with Iconify Icon Finder.
+
+For more information visit [https://iconify.design/](https://iconify.design/).
+
+# Iconify SVG framework
+
+There are many fonts and SVG sets available, but they all have one thing in common: using any font or SVG set limits you to icons that are included in that set and forces browsers to load entire font or icons set. That limits developers to one or two fonts or icon sets.
+
+Iconify uses a new innovative approach to loading icons. Unlike fonts and SVG frameworks, Iconify only loads icons that are used on the page instead of loading entire fonts. How is it done? By serving icons dynamically from publicly available JSON API (you can make a copy of script and API if you prefer to keep everything on your servers).
+
+Iconify SVG framework is designed to be as easy to use as possible.
+
+Add this line to your page to load Iconify SVG framework (you can add it to `` section of the page or before ``):
+
+```html
+
+```
+
+or
+
+```html
+
+```
+
+or, if you are building a project with something like WebPack or Rollup, you can include the script by installing `@iconify/iconify` as a dependency and importing it in your project:
+
+```js
+import Iconify from '@iconify/iconify';
+```
+
+To add any icon, write something like this:
+
+```html
+
+```
+
+ ![Sample](https://iconify.design/assets/images/eva-people-outline.svg)
+
+or this:
+
+```html
+
+Return home!
+```
+
+ ![Screenshot](https://iconify.design/assets/images/inline-sample.png)
+
+That is it. Change `data-icon` value to the name of the icon you want to use. There are over 150,000 premade icons to choose from, including FontAwesome, Material Design Icons, Tabler Icons, Box Icons, Unicons, Bootstrap Icons and even several emoji sets.
+
+Do you want to make your own icon sets? Everything you need is [available on GitHub](https://github.com/iconify): tools for creating custom icon sets, Iconify API application and documentation to help you.
+
+## Web component
+
+SVG framework was designed a while ago, when browsers had poor support for web components.
+
+However, this is no longer an issue. All modern browsers support web components.
+
+A newer replacement for SVG framework is available: [Iconify Icon web component](https://iconify.design/docs/iconify-icon/). Consider switching to it.
+
+## Full documentation
+
+Below is a shortened version of documentation.
+
+Full documentation is available on [Iconify website](https://iconify.design/docs/):
+
+- [SVG framework documentation](https://iconify.design/docs/icon-components/svg-framework/).
+- [Iconify API documentation](https://iconify.design/docs/api/).
+- [Iconify Tools documentation](https://iconify.design/docs/libraries/tools/).
+
+## How does it work?
+
+The syntax is similar to icon fonts. Instead of inserting `SVG` in the document, you write a placeholder element, such `SPAN` or `I`.
+
+Iconify SVG framework finds those placeholders and uses the following logic to parse them:
+
+1. Retrieves icon name from `data-icon` attribute.
+2. Checks if icon exists. If not, it sends a request to Iconify API to retrieve icon data.
+3. Replaces placeholder element with `SVG`.
+
+This is done in a fraction of a second. Iconify SVG framework watches DOM for changes, so whenever you add new placeholders, it immediately replaces them with `SVG`, making it easy to use with dynamic content, such as AJAX forms.
+
+## Offline usage
+
+SVG framework is designed to be used with Iconify API, loading icon data on demand instead of bundling it.
+
+If you want to use icons without Iconify API, [there are many other options available](https://iconify.design/docs/usage/).
+
+## Attributes
+
+There are optional attributes to customise icon appearance.
+
+### Vertical alignment
+
+Code examples above use different class names: the first example uses "iconify", the second example uses "iconify-inline".
+
+What is the difference?
+
+- "iconify" renders icon as is, so it behaves like an image.
+- "iconify-inline" renders adds vertical alignment to the icon, making it behave like text (inline mode).
+
+Usually, icon fonts do not render like normal images, they render like text. Text is aligned slightly below the baseline.
+
+Visual example to show the difference between inline and block modes:
+
+ ![Inline icon](https://iconify.design/assets/images/inline.png)
+
+Why is the inline mode needed?
+
+- To easily align icons within the text, such as emojis.
+- To make the transition from outdated icon fonts to SVG easier.
+
+Use "iconify" for decorations, use "iconify-inline" if you want the icon to behave like an icon font.
+
+#### data-inline attribute
+
+In addition to using "iconify-inline" class, you can toggle inline mode with the `data-inline` attribute.
+
+Set value to "true" to force inline mode, set value to "false" to use block mode.
+
+Different ways to use block mode:
+
+```html
+
+
+```
+
+Different ways to use inline mode:
+
+```html
+
+
+
+```
+
+## Iconify API
+
+When you use an icon font, each visitor loads an entire font, even if your page only uses a few icons. This is a major downside of using icon fonts. That limits developers to one or two fonts or icon sets.
+
+Unlike icon fonts, Iconify SVG framework does not load the entire icon set. Unlike fonts and SVG frameworks, Iconify only loads icons that are used on the current page instead of loading entire icon sets. How is it done? By serving icons dynamically from publicly available JSON API.
+
+### Custom API
+
+Relying on a third party service is often not an option. Many companies and developers prefer to keep everything on their own servers to have full control.
+
+Iconify API and icon sets are all [available on GitHub](https://github.com/iconify), making it easy to host API on your own server.
+
+For more details see [Iconify API documentation](https://iconify.design/docs/api/).
+
+You can also create custom Iconify API to serve your own icons. For more details see [hosting custom icons in Iconify documentation](https://iconify.design/docs/api/hosting.html).
+
+## Color
+
+There are 2 types of icons: monotone and coloured.
+
+- Monotone icons are icons that use only 1 colour and you can change that colour. Most icon sets fall into this category: FontAwesome, Unicons, Material Design Icons, etc.
+- Coloured icons are icons that use the preset palette. Most emoji icons fall into this category: Noto Emoji, Emoji One, etc. You cannot change the palette for those icons.
+
+Monotone icons use font colour, just like glyph fonts. To change colour, you can do this:
+
+```html
+
+```
+
+and add this to CSS:
+
+```css
+.icon-bell {
+ color: #f80;
+}
+.icon-bell:hover {
+ color: #f00;
+}
+```
+
+Sample:
+
+ ![Sample](https://iconify.design/samples/icon-color.png)
+
+## Dimensions
+
+By default all icons are scaled to 1em height. To control icon height use font-size:
+
+```html
+
+```
+
+and add this to css:
+
+```css
+.icon-clipboard {
+ font-size: 32px;
+}
+```
+
+Sample:
+
+ ![Sample](https://iconify.design/samples/icon-size.png)
+
+you might also need to set line-height:
+
+```css
+.icon-clipboard {
+ font-size: 32px;
+ line-height: 1em;
+}
+```
+
+You can also set custom dimensions using `data-width` and `data-height` attributes:
+
+```html
+
+```
+
+Sample:
+
+ ![Sample](https://iconify.design/samples/icon-size2.png)
+
+## Transformations
+
+You can rotate and flip icon by adding `data-flip` and `data-rotate` attributes:
+
+```html
+
+
+```
+
+Possible values for `data-flip`: horizontal, vertical.
+Possible values for `data-rotate`: 90deg, 180deg, 270deg.
+
+If you use both flip and rotation, the icon is flipped first, then rotated.
+
+To use custom transformations use CSS transform rule.
+
+```html
+
+```
+
+```css
+.icon-helicopter {
+ transform: 45deg;
+}
+```
+
+Samples:
+
+ ![Sample](https://iconify.design/samples/icon-transform.png)
+
+## Available icons
+
+There are over 150,000 icons to choose from.
+
+General collections (monotone icons):
+
+- [Material Symbols](https://icon-sets.iconify.design/material-symbols/) (7000+ icons)
+- [Material Design Icons](https://icon-sets.iconify.design/mdi/) (5000+ icons)
+- [Unicons](https://icon-sets.iconify.design/uil/) (1000+ icons)
+- [Jam Icons](https://icon-sets.iconify.design/jam/) (900 icons)
+- [IonIcons](https://icon-sets.iconify.design/ion/) (1200+ icons)
+- [FontAwesome 6](https://icon-sets.iconify.design/fa6-solid/) (2000+ icons)
+- [Bootstrap Icons](https://icon-sets.iconify.design/bi/) (500+ icons)
+- [IcoMoon Free](https://icon-sets.iconify.design/icomoon-free/) (400+ icons)
+- [Dashicons](https://icon-sets.iconify.design/dashicons/) (300 icons)
+
+and many others.
+
+Emoji collections (mostly colored icons):
+
+- [Emoji One](https://icon-sets.iconify.design/emojione/) (1800+ colored version 2 icons, 1400+ monotone version 2 icons, 1200+ version 1 icons)
+- [OpenMoji](https://icon-sets.iconify.design/openmoji/) (3500+ icons)
+- [Noto Emoji](https://icon-sets.iconify.design/noto/) (2000+ icons for version 2, 2000+ icons for version 1)
+- [Twitter Emoji](https://icon-sets.iconify.design/twemoji/) (2000+ icons)
+- [Firefox OS Emoji](https://icon-sets.iconify.design/fxemoji/) (1000+ icons)
+
+Also, there are several thematic collections, such as weather icons, map icons, etc.
+
+You can use browse or search available icons on the Iconify website: https://icon-sets.iconify.design/
+
+Click an icon to get HTML code.
+
+## Browser support
+
+Iconify SVG framework supports all modern browsers.
+
+## License
+
+This package is licensed under MIT license.
+
+`SPDX-License-Identifier: MIT`
+
+Previous versions of this package were dual-licensed under Apache 2.0 and GPL 2.0 licence, which was messy and confusing. This was later changed to MIT for simplicity.
+
+This license does not apply to icons. Icons are released under different licenses, see each icon set for details.
+Icons available by default are all licensed under some kind of open-source or free license.
+
+© 2019-PRESENT Vjacheslav Trushkin
diff --git a/node_modules/@iconify/iconify/dist/iconify.cjs b/node_modules/@iconify/iconify/dist/iconify.cjs
new file mode 100644
index 0000000..3d25640
--- /dev/null
+++ b/node_modules/@iconify/iconify/dist/iconify.cjs
@@ -0,0 +1,2651 @@
+/**
+* (c) Iconify
+*
+* For the full copyright and license information, please view the license.txt or license.gpl.txt
+* files at https://github.com/iconify/iconify
+*
+* Licensed under MIT.
+*
+* @license MIT
+* @version 3.1.1
+*/
+'use strict';
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+const defaultIconDimensions = Object.freeze(
+ {
+ left: 0,
+ top: 0,
+ width: 16,
+ height: 16
+ }
+);
+const defaultIconTransformations = Object.freeze({
+ rotate: 0,
+ vFlip: false,
+ hFlip: false
+});
+const defaultIconProps = Object.freeze({
+ ...defaultIconDimensions,
+ ...defaultIconTransformations
+});
+const defaultExtendedIconProps = Object.freeze({
+ ...defaultIconProps,
+ body: "",
+ hidden: false
+});
+
+function mergeIconTransformations(obj1, obj2) {
+ const result = {};
+ if (!obj1.hFlip !== !obj2.hFlip) {
+ result.hFlip = true;
+ }
+ if (!obj1.vFlip !== !obj2.vFlip) {
+ result.vFlip = true;
+ }
+ const rotate = ((obj1.rotate || 0) + (obj2.rotate || 0)) % 4;
+ if (rotate) {
+ result.rotate = rotate;
+ }
+ return result;
+}
+
+function mergeIconData(parent, child) {
+ const result = mergeIconTransformations(parent, child);
+ for (const key in defaultExtendedIconProps) {
+ if (key in defaultIconTransformations) {
+ if (key in parent && !(key in result)) {
+ result[key] = defaultIconTransformations[key];
+ }
+ } else if (key in child) {
+ result[key] = child[key];
+ } else if (key in parent) {
+ result[key] = parent[key];
+ }
+ }
+ return result;
+}
+
+function getIconsTree(data, names) {
+ const icons = data.icons;
+ const aliases = data.aliases || /* @__PURE__ */ Object.create(null);
+ const resolved = /* @__PURE__ */ Object.create(null);
+ function resolve(name) {
+ if (icons[name]) {
+ return resolved[name] = [];
+ }
+ if (!(name in resolved)) {
+ resolved[name] = null;
+ const parent = aliases[name] && aliases[name].parent;
+ const value = parent && resolve(parent);
+ if (value) {
+ resolved[name] = [parent].concat(value);
+ }
+ }
+ return resolved[name];
+ }
+ (names || Object.keys(icons).concat(Object.keys(aliases))).forEach(resolve);
+ return resolved;
+}
+
+function internalGetIconData(data, name, tree) {
+ const icons = data.icons;
+ const aliases = data.aliases || /* @__PURE__ */ Object.create(null);
+ let currentProps = {};
+ function parse(name2) {
+ currentProps = mergeIconData(
+ icons[name2] || aliases[name2],
+ currentProps
+ );
+ }
+ parse(name);
+ tree.forEach(parse);
+ return mergeIconData(data, currentProps);
+}
+
+function parseIconSet(data, callback) {
+ const names = [];
+ if (typeof data !== "object" || typeof data.icons !== "object") {
+ return names;
+ }
+ if (data.not_found instanceof Array) {
+ data.not_found.forEach((name) => {
+ callback(name, null);
+ names.push(name);
+ });
+ }
+ const tree = getIconsTree(data);
+ for (const name in tree) {
+ const item = tree[name];
+ if (item) {
+ callback(name, internalGetIconData(data, name, item));
+ names.push(name);
+ }
+ }
+ return names;
+}
+
+const matchIconName = /^[a-z0-9]+(-[a-z0-9]+)*$/;
+const stringToIcon = (value, validate, allowSimpleName, provider = "") => {
+ const colonSeparated = value.split(":");
+ if (value.slice(0, 1) === "@") {
+ if (colonSeparated.length < 2 || colonSeparated.length > 3) {
+ return null;
+ }
+ provider = colonSeparated.shift().slice(1);
+ }
+ if (colonSeparated.length > 3 || !colonSeparated.length) {
+ return null;
+ }
+ if (colonSeparated.length > 1) {
+ const name2 = colonSeparated.pop();
+ const prefix = colonSeparated.pop();
+ const result = {
+ // Allow provider without '@': "provider:prefix:name"
+ provider: colonSeparated.length > 0 ? colonSeparated[0] : provider,
+ prefix,
+ name: name2
+ };
+ return validate && !validateIconName(result) ? null : result;
+ }
+ const name = colonSeparated[0];
+ const dashSeparated = name.split("-");
+ if (dashSeparated.length > 1) {
+ const result = {
+ provider,
+ prefix: dashSeparated.shift(),
+ name: dashSeparated.join("-")
+ };
+ return validate && !validateIconName(result) ? null : result;
+ }
+ if (allowSimpleName && provider === "") {
+ const result = {
+ provider,
+ prefix: "",
+ name
+ };
+ return validate && !validateIconName(result, allowSimpleName) ? null : result;
+ }
+ return null;
+};
+const validateIconName = (icon, allowSimpleName) => {
+ if (!icon) {
+ return false;
+ }
+ return !!((icon.provider === "" || icon.provider.match(matchIconName)) && (allowSimpleName && icon.prefix === "" || icon.prefix.match(matchIconName)) && icon.name.match(matchIconName));
+};
+
+const optionalPropertyDefaults = {
+ provider: "",
+ aliases: {},
+ not_found: {},
+ ...defaultIconDimensions
+};
+function checkOptionalProps(item, defaults) {
+ for (const prop in defaults) {
+ if (prop in item && typeof item[prop] !== typeof defaults[prop]) {
+ return false;
+ }
+ }
+ return true;
+}
+function quicklyValidateIconSet(obj) {
+ if (typeof obj !== "object" || obj === null) {
+ return null;
+ }
+ const data = obj;
+ if (typeof data.prefix !== "string" || !obj.icons || typeof obj.icons !== "object") {
+ return null;
+ }
+ if (!checkOptionalProps(obj, optionalPropertyDefaults)) {
+ return null;
+ }
+ const icons = data.icons;
+ for (const name in icons) {
+ const icon = icons[name];
+ if (!name.match(matchIconName) || typeof icon.body !== "string" || !checkOptionalProps(
+ icon,
+ defaultExtendedIconProps
+ )) {
+ return null;
+ }
+ }
+ const aliases = data.aliases || /* @__PURE__ */ Object.create(null);
+ for (const name in aliases) {
+ const icon = aliases[name];
+ const parent = icon.parent;
+ if (!name.match(matchIconName) || typeof parent !== "string" || !icons[parent] && !aliases[parent] || !checkOptionalProps(
+ icon,
+ defaultExtendedIconProps
+ )) {
+ return null;
+ }
+ }
+ return data;
+}
+
+const dataStorage = /* @__PURE__ */ Object.create(null);
+function newStorage(provider, prefix) {
+ return {
+ provider,
+ prefix,
+ icons: /* @__PURE__ */ Object.create(null),
+ missing: /* @__PURE__ */ new Set()
+ };
+}
+function getStorage(provider, prefix) {
+ const providerStorage = dataStorage[provider] || (dataStorage[provider] = /* @__PURE__ */ Object.create(null));
+ return providerStorage[prefix] || (providerStorage[prefix] = newStorage(provider, prefix));
+}
+function addIconSet(storage, data) {
+ if (!quicklyValidateIconSet(data)) {
+ return [];
+ }
+ return parseIconSet(data, (name, icon) => {
+ if (icon) {
+ storage.icons[name] = icon;
+ } else {
+ storage.missing.add(name);
+ }
+ });
+}
+function addIconToStorage(storage, name, icon) {
+ try {
+ if (typeof icon.body === "string") {
+ storage.icons[name] = { ...icon };
+ return true;
+ }
+ } catch (err) {
+ }
+ return false;
+}
+function listIcons(provider, prefix) {
+ let allIcons = [];
+ const providers = typeof provider === "string" ? [provider] : Object.keys(dataStorage);
+ providers.forEach((provider2) => {
+ const prefixes = typeof provider2 === "string" && typeof prefix === "string" ? [prefix] : Object.keys(dataStorage[provider2] || {});
+ prefixes.forEach((prefix2) => {
+ const storage = getStorage(provider2, prefix2);
+ allIcons = allIcons.concat(
+ Object.keys(storage.icons).map(
+ (name) => (provider2 !== "" ? "@" + provider2 + ":" : "") + prefix2 + ":" + name
+ )
+ );
+ });
+ });
+ return allIcons;
+}
+
+let simpleNames = false;
+function allowSimpleNames(allow) {
+ if (typeof allow === "boolean") {
+ simpleNames = allow;
+ }
+ return simpleNames;
+}
+function getIconData(name) {
+ const icon = typeof name === "string" ? stringToIcon(name, true, simpleNames) : name;
+ if (icon) {
+ const storage = getStorage(icon.provider, icon.prefix);
+ const iconName = icon.name;
+ return storage.icons[iconName] || (storage.missing.has(iconName) ? null : void 0);
+ }
+}
+function addIcon(name, data) {
+ const icon = stringToIcon(name, true, simpleNames);
+ if (!icon) {
+ return false;
+ }
+ const storage = getStorage(icon.provider, icon.prefix);
+ return addIconToStorage(storage, icon.name, data);
+}
+function addCollection(data, provider) {
+ if (typeof data !== "object") {
+ return false;
+ }
+ if (typeof provider !== "string") {
+ provider = data.provider || "";
+ }
+ if (simpleNames && !provider && !data.prefix) {
+ let added = false;
+ if (quicklyValidateIconSet(data)) {
+ data.prefix = "";
+ parseIconSet(data, (name, icon) => {
+ if (icon && addIcon(name, icon)) {
+ added = true;
+ }
+ });
+ }
+ return added;
+ }
+ const prefix = data.prefix;
+ if (!validateIconName({
+ provider,
+ prefix,
+ name: "a"
+ })) {
+ return false;
+ }
+ const storage = getStorage(provider, prefix);
+ return !!addIconSet(storage, data);
+}
+function iconExists(name) {
+ return !!getIconData(name);
+}
+function getIcon(name) {
+ const result = getIconData(name);
+ return result ? {
+ ...defaultIconProps,
+ ...result
+ } : null;
+}
+
+const defaultIconSizeCustomisations = Object.freeze({
+ width: null,
+ height: null
+});
+const defaultIconCustomisations = Object.freeze({
+ // Dimensions
+ ...defaultIconSizeCustomisations,
+ // Transformations
+ ...defaultIconTransformations
+});
+
+const unitsSplit = /(-?[0-9.]*[0-9]+[0-9.]*)/g;
+const unitsTest = /^-?[0-9.]*[0-9]+[0-9.]*$/g;
+function calculateSize(size, ratio, precision) {
+ if (ratio === 1) {
+ return size;
+ }
+ precision = precision || 100;
+ if (typeof size === "number") {
+ return Math.ceil(size * ratio * precision) / precision;
+ }
+ if (typeof size !== "string") {
+ return size;
+ }
+ const oldParts = size.split(unitsSplit);
+ if (oldParts === null || !oldParts.length) {
+ return size;
+ }
+ const newParts = [];
+ let code = oldParts.shift();
+ let isNumber = unitsTest.test(code);
+ while (true) {
+ if (isNumber) {
+ const num = parseFloat(code);
+ if (isNaN(num)) {
+ newParts.push(code);
+ } else {
+ newParts.push(Math.ceil(num * ratio * precision) / precision);
+ }
+ } else {
+ newParts.push(code);
+ }
+ code = oldParts.shift();
+ if (code === void 0) {
+ return newParts.join("");
+ }
+ isNumber = !isNumber;
+ }
+}
+
+const isUnsetKeyword = (value) => value === "unset" || value === "undefined" || value === "none";
+function iconToSVG(icon, customisations) {
+ const fullIcon = {
+ ...defaultIconProps,
+ ...icon
+ };
+ const fullCustomisations = {
+ ...defaultIconCustomisations,
+ ...customisations
+ };
+ const box = {
+ left: fullIcon.left,
+ top: fullIcon.top,
+ width: fullIcon.width,
+ height: fullIcon.height
+ };
+ let body = fullIcon.body;
+ [fullIcon, fullCustomisations].forEach((props) => {
+ const transformations = [];
+ const hFlip = props.hFlip;
+ const vFlip = props.vFlip;
+ let rotation = props.rotate;
+ if (hFlip) {
+ if (vFlip) {
+ rotation += 2;
+ } else {
+ transformations.push(
+ "translate(" + (box.width + box.left).toString() + " " + (0 - box.top).toString() + ")"
+ );
+ transformations.push("scale(-1 1)");
+ box.top = box.left = 0;
+ }
+ } else if (vFlip) {
+ transformations.push(
+ "translate(" + (0 - box.left).toString() + " " + (box.height + box.top).toString() + ")"
+ );
+ transformations.push("scale(1 -1)");
+ box.top = box.left = 0;
+ }
+ let tempValue;
+ if (rotation < 0) {
+ rotation -= Math.floor(rotation / 4) * 4;
+ }
+ rotation = rotation % 4;
+ switch (rotation) {
+ case 1:
+ tempValue = box.height / 2 + box.top;
+ transformations.unshift(
+ "rotate(90 " + tempValue.toString() + " " + tempValue.toString() + ")"
+ );
+ break;
+ case 2:
+ transformations.unshift(
+ "rotate(180 " + (box.width / 2 + box.left).toString() + " " + (box.height / 2 + box.top).toString() + ")"
+ );
+ break;
+ case 3:
+ tempValue = box.width / 2 + box.left;
+ transformations.unshift(
+ "rotate(-90 " + tempValue.toString() + " " + tempValue.toString() + ")"
+ );
+ break;
+ }
+ if (rotation % 2 === 1) {
+ if (box.left !== box.top) {
+ tempValue = box.left;
+ box.left = box.top;
+ box.top = tempValue;
+ }
+ if (box.width !== box.height) {
+ tempValue = box.width;
+ box.width = box.height;
+ box.height = tempValue;
+ }
+ }
+ if (transformations.length) {
+ body = '' + body + " ";
+ }
+ });
+ const customisationsWidth = fullCustomisations.width;
+ const customisationsHeight = fullCustomisations.height;
+ const boxWidth = box.width;
+ const boxHeight = box.height;
+ let width;
+ let height;
+ if (customisationsWidth === null) {
+ height = customisationsHeight === null ? "1em" : customisationsHeight === "auto" ? boxHeight : customisationsHeight;
+ width = calculateSize(height, boxWidth / boxHeight);
+ } else {
+ width = customisationsWidth === "auto" ? boxWidth : customisationsWidth;
+ height = customisationsHeight === null ? calculateSize(width, boxHeight / boxWidth) : customisationsHeight === "auto" ? boxHeight : customisationsHeight;
+ }
+ const attributes = {};
+ const setAttr = (prop, value) => {
+ if (!isUnsetKeyword(value)) {
+ attributes[prop] = value.toString();
+ }
+ };
+ setAttr("width", width);
+ setAttr("height", height);
+ attributes.viewBox = box.left.toString() + " " + box.top.toString() + " " + boxWidth.toString() + " " + boxHeight.toString();
+ return {
+ attributes,
+ body
+ };
+}
+
+const regex = /\sid="(\S+)"/g;
+const randomPrefix = "IconifyId" + Date.now().toString(16) + (Math.random() * 16777216 | 0).toString(16);
+let counter = 0;
+function replaceIDs(body, prefix = randomPrefix) {
+ const ids = [];
+ let match;
+ while (match = regex.exec(body)) {
+ ids.push(match[1]);
+ }
+ if (!ids.length) {
+ return body;
+ }
+ const suffix = "suffix" + (Math.random() * 16777216 | Date.now()).toString(16);
+ ids.forEach((id) => {
+ const newID = typeof prefix === "function" ? prefix(id) : prefix + (counter++).toString();
+ const escapedID = id.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
+ body = body.replace(
+ // Allowed characters before id: [#;"]
+ // Allowed characters after id: [)"], .[a-z]
+ new RegExp('([#;"])(' + escapedID + ')([")]|\\.[a-z])', "g"),
+ "$1" + newID + suffix + "$3"
+ );
+ });
+ body = body.replace(new RegExp(suffix, "g"), "");
+ return body;
+}
+
+const browserStorageConfig = {
+ local: true,
+ session: true
+};
+const browserStorageEmptyItems = {
+ local: /* @__PURE__ */ new Set(),
+ session: /* @__PURE__ */ new Set()
+};
+let browserStorageStatus = false;
+function setBrowserStorageStatus(status) {
+ browserStorageStatus = status;
+}
+
+const browserCacheVersion = "iconify2";
+const browserCachePrefix = "iconify";
+const browserCacheCountKey = browserCachePrefix + "-count";
+const browserCacheVersionKey = browserCachePrefix + "-version";
+const browserStorageHour = 36e5;
+const browserStorageCacheExpiration = 168;
+
+function getStoredItem(func, key) {
+ try {
+ return func.getItem(key);
+ } catch (err) {
+ }
+}
+function setStoredItem(func, key, value) {
+ try {
+ func.setItem(key, value);
+ return true;
+ } catch (err) {
+ }
+}
+function removeStoredItem(func, key) {
+ try {
+ func.removeItem(key);
+ } catch (err) {
+ }
+}
+
+function setBrowserStorageItemsCount(storage, value) {
+ return setStoredItem(storage, browserCacheCountKey, value.toString());
+}
+function getBrowserStorageItemsCount(storage) {
+ return parseInt(getStoredItem(storage, browserCacheCountKey)) || 0;
+}
+
+let _window = typeof window === "undefined" ? {} : window;
+function getBrowserStorage(key) {
+ const attr = key + "Storage";
+ try {
+ if (_window && _window[attr] && typeof _window[attr].length === "number") {
+ return _window[attr];
+ }
+ } catch (err) {
+ }
+ browserStorageConfig[key] = false;
+}
+
+function iterateBrowserStorage(key, callback) {
+ const func = getBrowserStorage(key);
+ if (!func) {
+ return;
+ }
+ const version = getStoredItem(func, browserCacheVersionKey);
+ if (version !== browserCacheVersion) {
+ if (version) {
+ const total2 = getBrowserStorageItemsCount(func);
+ for (let i = 0; i < total2; i++) {
+ removeStoredItem(func, browserCachePrefix + i.toString());
+ }
+ }
+ setStoredItem(func, browserCacheVersionKey, browserCacheVersion);
+ setBrowserStorageItemsCount(func, 0);
+ return;
+ }
+ const minTime = Math.floor(Date.now() / browserStorageHour) - browserStorageCacheExpiration;
+ const parseItem = (index) => {
+ const name = browserCachePrefix + index.toString();
+ const item = getStoredItem(func, name);
+ if (typeof item !== "string") {
+ return;
+ }
+ try {
+ const data = JSON.parse(item);
+ if (typeof data === "object" && typeof data.cached === "number" && data.cached > minTime && typeof data.provider === "string" && typeof data.data === "object" && typeof data.data.prefix === "string" && // Valid item: run callback
+ callback(data, index)) {
+ return true;
+ }
+ } catch (err) {
+ }
+ removeStoredItem(func, name);
+ };
+ let total = getBrowserStorageItemsCount(func);
+ for (let i = total - 1; i >= 0; i--) {
+ if (!parseItem(i)) {
+ if (i === total - 1) {
+ total--;
+ setBrowserStorageItemsCount(func, total);
+ } else {
+ browserStorageEmptyItems[key].add(i);
+ }
+ }
+ }
+}
+
+function initBrowserStorage() {
+ if (browserStorageStatus) {
+ return;
+ }
+ setBrowserStorageStatus(true);
+ for (const key in browserStorageConfig) {
+ iterateBrowserStorage(key, (item) => {
+ const iconSet = item.data;
+ const provider = item.provider;
+ const prefix = iconSet.prefix;
+ const storage = getStorage(
+ provider,
+ prefix
+ );
+ if (!addIconSet(storage, iconSet).length) {
+ return false;
+ }
+ const lastModified = iconSet.lastModified || -1;
+ storage.lastModifiedCached = storage.lastModifiedCached ? Math.min(storage.lastModifiedCached, lastModified) : lastModified;
+ return true;
+ });
+ }
+}
+
+function toggleBrowserCache(storage, value) {
+ switch (storage) {
+ case "local":
+ case "session":
+ browserStorageConfig[storage] = value;
+ break;
+ case "all":
+ for (const key in browserStorageConfig) {
+ browserStorageConfig[key] = value;
+ }
+ break;
+ }
+}
+
+const storage = /* @__PURE__ */ Object.create(null);
+function setAPIModule(provider, item) {
+ storage[provider] = item;
+}
+function getAPIModule(provider) {
+ return storage[provider] || storage[""];
+}
+
+function createAPIConfig(source) {
+ let resources;
+ if (typeof source.resources === "string") {
+ resources = [source.resources];
+ } else {
+ resources = source.resources;
+ if (!(resources instanceof Array) || !resources.length) {
+ return null;
+ }
+ }
+ const result = {
+ // API hosts
+ resources,
+ // Root path
+ path: source.path || "/",
+ // URL length limit
+ maxURL: source.maxURL || 500,
+ // Timeout before next host is used.
+ rotate: source.rotate || 750,
+ // Timeout before failing query.
+ timeout: source.timeout || 5e3,
+ // Randomise default API end point.
+ random: source.random === true,
+ // Start index
+ index: source.index || 0,
+ // Receive data after time out (used if time out kicks in first, then API module sends data anyway).
+ dataAfterTimeout: source.dataAfterTimeout !== false
+ };
+ return result;
+}
+const configStorage = /* @__PURE__ */ Object.create(null);
+const fallBackAPISources = [
+ "https://api.simplesvg.com",
+ "https://api.unisvg.com"
+];
+const fallBackAPI = [];
+while (fallBackAPISources.length > 0) {
+ if (fallBackAPISources.length === 1) {
+ fallBackAPI.push(fallBackAPISources.shift());
+ } else {
+ if (Math.random() > 0.5) {
+ fallBackAPI.push(fallBackAPISources.shift());
+ } else {
+ fallBackAPI.push(fallBackAPISources.pop());
+ }
+ }
+}
+configStorage[""] = createAPIConfig({
+ resources: ["https://api.iconify.design"].concat(fallBackAPI)
+});
+function addAPIProvider(provider, customConfig) {
+ const config = createAPIConfig(customConfig);
+ if (config === null) {
+ return false;
+ }
+ configStorage[provider] = config;
+ return true;
+}
+function getAPIConfig(provider) {
+ return configStorage[provider];
+}
+function listAPIProviders() {
+ return Object.keys(configStorage);
+}
+
+const detectFetch = () => {
+ let callback;
+ try {
+ callback = fetch;
+ if (typeof callback === "function") {
+ return callback;
+ }
+ } catch (err) {
+ }
+};
+let fetchModule = detectFetch();
+function setFetch(fetch2) {
+ fetchModule = fetch2;
+}
+function getFetch() {
+ return fetchModule;
+}
+function calculateMaxLength(provider, prefix) {
+ const config = getAPIConfig(provider);
+ if (!config) {
+ return 0;
+ }
+ let result;
+ if (!config.maxURL) {
+ result = 0;
+ } else {
+ let maxHostLength = 0;
+ config.resources.forEach((item) => {
+ const host = item;
+ maxHostLength = Math.max(maxHostLength, host.length);
+ });
+ const url = prefix + ".json?icons=";
+ result = config.maxURL - maxHostLength - config.path.length - url.length;
+ }
+ return result;
+}
+function shouldAbort(status) {
+ return status === 404;
+}
+const prepare = (provider, prefix, icons) => {
+ const results = [];
+ const maxLength = calculateMaxLength(provider, prefix);
+ const type = "icons";
+ let item = {
+ type,
+ provider,
+ prefix,
+ icons: []
+ };
+ let length = 0;
+ icons.forEach((name, index) => {
+ length += name.length + 1;
+ if (length >= maxLength && index > 0) {
+ results.push(item);
+ item = {
+ type,
+ provider,
+ prefix,
+ icons: []
+ };
+ length = name.length;
+ }
+ item.icons.push(name);
+ });
+ results.push(item);
+ return results;
+};
+function getPath(provider) {
+ if (typeof provider === "string") {
+ const config = getAPIConfig(provider);
+ if (config) {
+ return config.path;
+ }
+ }
+ return "/";
+}
+const send = (host, params, callback) => {
+ if (!fetchModule) {
+ callback("abort", 424);
+ return;
+ }
+ let path = getPath(params.provider);
+ switch (params.type) {
+ case "icons": {
+ const prefix = params.prefix;
+ const icons = params.icons;
+ const iconsList = icons.join(",");
+ const urlParams = new URLSearchParams({
+ icons: iconsList
+ });
+ path += prefix + ".json?" + urlParams.toString();
+ break;
+ }
+ case "custom": {
+ const uri = params.uri;
+ path += uri.slice(0, 1) === "/" ? uri.slice(1) : uri;
+ break;
+ }
+ default:
+ callback("abort", 400);
+ return;
+ }
+ let defaultError = 503;
+ fetchModule(host + path).then((response) => {
+ const status = response.status;
+ if (status !== 200) {
+ setTimeout(() => {
+ callback(shouldAbort(status) ? "abort" : "next", status);
+ });
+ return;
+ }
+ defaultError = 501;
+ return response.json();
+ }).then((data) => {
+ if (typeof data !== "object" || data === null) {
+ setTimeout(() => {
+ if (data === 404) {
+ callback("abort", data);
+ } else {
+ callback("next", defaultError);
+ }
+ });
+ return;
+ }
+ setTimeout(() => {
+ callback("success", data);
+ });
+ }).catch(() => {
+ callback("next", defaultError);
+ });
+};
+const fetchAPIModule = {
+ prepare,
+ send
+};
+
+function sortIcons(icons) {
+ const result = {
+ loaded: [],
+ missing: [],
+ pending: []
+ };
+ const storage = /* @__PURE__ */ Object.create(null);
+ icons.sort((a, b) => {
+ if (a.provider !== b.provider) {
+ return a.provider.localeCompare(b.provider);
+ }
+ if (a.prefix !== b.prefix) {
+ return a.prefix.localeCompare(b.prefix);
+ }
+ return a.name.localeCompare(b.name);
+ });
+ let lastIcon = {
+ provider: "",
+ prefix: "",
+ name: ""
+ };
+ icons.forEach((icon) => {
+ if (lastIcon.name === icon.name && lastIcon.prefix === icon.prefix && lastIcon.provider === icon.provider) {
+ return;
+ }
+ lastIcon = icon;
+ const provider = icon.provider;
+ const prefix = icon.prefix;
+ const name = icon.name;
+ const providerStorage = storage[provider] || (storage[provider] = /* @__PURE__ */ Object.create(null));
+ const localStorage = providerStorage[prefix] || (providerStorage[prefix] = getStorage(provider, prefix));
+ let list;
+ if (name in localStorage.icons) {
+ list = result.loaded;
+ } else if (prefix === "" || localStorage.missing.has(name)) {
+ list = result.missing;
+ } else {
+ list = result.pending;
+ }
+ const item = {
+ provider,
+ prefix,
+ name
+ };
+ list.push(item);
+ });
+ return result;
+}
+
+function removeCallback(storages, id) {
+ storages.forEach((storage) => {
+ const items = storage.loaderCallbacks;
+ if (items) {
+ storage.loaderCallbacks = items.filter((row) => row.id !== id);
+ }
+ });
+}
+function updateCallbacks(storage) {
+ if (!storage.pendingCallbacksFlag) {
+ storage.pendingCallbacksFlag = true;
+ setTimeout(() => {
+ storage.pendingCallbacksFlag = false;
+ const items = storage.loaderCallbacks ? storage.loaderCallbacks.slice(0) : [];
+ if (!items.length) {
+ return;
+ }
+ let hasPending = false;
+ const provider = storage.provider;
+ const prefix = storage.prefix;
+ items.forEach((item) => {
+ const icons = item.icons;
+ const oldLength = icons.pending.length;
+ icons.pending = icons.pending.filter((icon) => {
+ if (icon.prefix !== prefix) {
+ return true;
+ }
+ const name = icon.name;
+ if (storage.icons[name]) {
+ icons.loaded.push({
+ provider,
+ prefix,
+ name
+ });
+ } else if (storage.missing.has(name)) {
+ icons.missing.push({
+ provider,
+ prefix,
+ name
+ });
+ } else {
+ hasPending = true;
+ return true;
+ }
+ return false;
+ });
+ if (icons.pending.length !== oldLength) {
+ if (!hasPending) {
+ removeCallback([storage], item.id);
+ }
+ item.callback(
+ icons.loaded.slice(0),
+ icons.missing.slice(0),
+ icons.pending.slice(0),
+ item.abort
+ );
+ }
+ });
+ });
+ }
+}
+let idCounter = 0;
+function storeCallback(callback, icons, pendingSources) {
+ const id = idCounter++;
+ const abort = removeCallback.bind(null, pendingSources, id);
+ if (!icons.pending.length) {
+ return abort;
+ }
+ const item = {
+ id,
+ icons,
+ callback,
+ abort
+ };
+ pendingSources.forEach((storage) => {
+ (storage.loaderCallbacks || (storage.loaderCallbacks = [])).push(item);
+ });
+ return abort;
+}
+
+function listToIcons(list, validate = true, simpleNames = false) {
+ const result = [];
+ list.forEach((item) => {
+ const icon = typeof item === "string" ? stringToIcon(item, validate, simpleNames) : item;
+ if (icon) {
+ result.push(icon);
+ }
+ });
+ return result;
+}
+
+// src/config.ts
+var defaultConfig = {
+ resources: [],
+ index: 0,
+ timeout: 2e3,
+ rotate: 750,
+ random: false,
+ dataAfterTimeout: false
+};
+
+// src/query.ts
+function sendQuery(config, payload, query, done) {
+ const resourcesCount = config.resources.length;
+ const startIndex = config.random ? Math.floor(Math.random() * resourcesCount) : config.index;
+ let resources;
+ if (config.random) {
+ let list = config.resources.slice(0);
+ resources = [];
+ while (list.length > 1) {
+ const nextIndex = Math.floor(Math.random() * list.length);
+ resources.push(list[nextIndex]);
+ list = list.slice(0, nextIndex).concat(list.slice(nextIndex + 1));
+ }
+ resources = resources.concat(list);
+ } else {
+ resources = config.resources.slice(startIndex).concat(config.resources.slice(0, startIndex));
+ }
+ const startTime = Date.now();
+ let status = "pending";
+ let queriesSent = 0;
+ let lastError;
+ let timer = null;
+ let queue = [];
+ let doneCallbacks = [];
+ if (typeof done === "function") {
+ doneCallbacks.push(done);
+ }
+ function resetTimer() {
+ if (timer) {
+ clearTimeout(timer);
+ timer = null;
+ }
+ }
+ function abort() {
+ if (status === "pending") {
+ status = "aborted";
+ }
+ resetTimer();
+ queue.forEach((item) => {
+ if (item.status === "pending") {
+ item.status = "aborted";
+ }
+ });
+ queue = [];
+ }
+ function subscribe(callback, overwrite) {
+ if (overwrite) {
+ doneCallbacks = [];
+ }
+ if (typeof callback === "function") {
+ doneCallbacks.push(callback);
+ }
+ }
+ function getQueryStatus() {
+ return {
+ startTime,
+ payload,
+ status,
+ queriesSent,
+ queriesPending: queue.length,
+ subscribe,
+ abort
+ };
+ }
+ function failQuery() {
+ status = "failed";
+ doneCallbacks.forEach((callback) => {
+ callback(void 0, lastError);
+ });
+ }
+ function clearQueue() {
+ queue.forEach((item) => {
+ if (item.status === "pending") {
+ item.status = "aborted";
+ }
+ });
+ queue = [];
+ }
+ function moduleResponse(item, response, data) {
+ const isError = response !== "success";
+ queue = queue.filter((queued) => queued !== item);
+ switch (status) {
+ case "pending":
+ break;
+ case "failed":
+ if (isError || !config.dataAfterTimeout) {
+ return;
+ }
+ break;
+ default:
+ return;
+ }
+ if (response === "abort") {
+ lastError = data;
+ failQuery();
+ return;
+ }
+ if (isError) {
+ lastError = data;
+ if (!queue.length) {
+ if (!resources.length) {
+ failQuery();
+ } else {
+ execNext();
+ }
+ }
+ return;
+ }
+ resetTimer();
+ clearQueue();
+ if (!config.random) {
+ const index = config.resources.indexOf(item.resource);
+ if (index !== -1 && index !== config.index) {
+ config.index = index;
+ }
+ }
+ status = "completed";
+ doneCallbacks.forEach((callback) => {
+ callback(data);
+ });
+ }
+ function execNext() {
+ if (status !== "pending") {
+ return;
+ }
+ resetTimer();
+ const resource = resources.shift();
+ if (resource === void 0) {
+ if (queue.length) {
+ timer = setTimeout(() => {
+ resetTimer();
+ if (status === "pending") {
+ clearQueue();
+ failQuery();
+ }
+ }, config.timeout);
+ return;
+ }
+ failQuery();
+ return;
+ }
+ const item = {
+ status: "pending",
+ resource,
+ callback: (status2, data) => {
+ moduleResponse(item, status2, data);
+ }
+ };
+ queue.push(item);
+ queriesSent++;
+ timer = setTimeout(execNext, config.rotate);
+ query(resource, payload, item.callback);
+ }
+ setTimeout(execNext);
+ return getQueryStatus;
+}
+
+// src/index.ts
+function initRedundancy(cfg) {
+ const config = {
+ ...defaultConfig,
+ ...cfg
+ };
+ let queries = [];
+ function cleanup() {
+ queries = queries.filter((item) => item().status === "pending");
+ }
+ function query(payload, queryCallback, doneCallback) {
+ const query2 = sendQuery(
+ config,
+ payload,
+ queryCallback,
+ (data, error) => {
+ cleanup();
+ if (doneCallback) {
+ doneCallback(data, error);
+ }
+ }
+ );
+ queries.push(query2);
+ return query2;
+ }
+ function find(callback) {
+ return queries.find((value) => {
+ return callback(value);
+ }) || null;
+ }
+ const instance = {
+ query,
+ find,
+ setIndex: (index) => {
+ config.index = index;
+ },
+ getIndex: () => config.index,
+ cleanup
+ };
+ return instance;
+}
+
+function emptyCallback$1() {
+}
+const redundancyCache = /* @__PURE__ */ Object.create(null);
+function getRedundancyCache(provider) {
+ if (!redundancyCache[provider]) {
+ const config = getAPIConfig(provider);
+ if (!config) {
+ return;
+ }
+ const redundancy = initRedundancy(config);
+ const cachedReundancy = {
+ config,
+ redundancy
+ };
+ redundancyCache[provider] = cachedReundancy;
+ }
+ return redundancyCache[provider];
+}
+function sendAPIQuery(target, query, callback) {
+ let redundancy;
+ let send;
+ if (typeof target === "string") {
+ const api = getAPIModule(target);
+ if (!api) {
+ callback(void 0, 424);
+ return emptyCallback$1;
+ }
+ send = api.send;
+ const cached = getRedundancyCache(target);
+ if (cached) {
+ redundancy = cached.redundancy;
+ }
+ } else {
+ const config = createAPIConfig(target);
+ if (config) {
+ redundancy = initRedundancy(config);
+ const moduleKey = target.resources ? target.resources[0] : "";
+ const api = getAPIModule(moduleKey);
+ if (api) {
+ send = api.send;
+ }
+ }
+ }
+ if (!redundancy || !send) {
+ callback(void 0, 424);
+ return emptyCallback$1;
+ }
+ return redundancy.query(query, send, callback)().abort;
+}
+
+function updateLastModified(storage, lastModified) {
+ const lastValue = storage.lastModifiedCached;
+ if (
+ // Matches or newer
+ lastValue && lastValue >= lastModified
+ ) {
+ return lastValue === lastModified;
+ }
+ storage.lastModifiedCached = lastModified;
+ if (lastValue) {
+ for (const key in browserStorageConfig) {
+ iterateBrowserStorage(key, (item) => {
+ const iconSet = item.data;
+ return item.provider !== storage.provider || iconSet.prefix !== storage.prefix || iconSet.lastModified === lastModified;
+ });
+ }
+ }
+ return true;
+}
+function storeInBrowserStorage(storage, data) {
+ if (!browserStorageStatus) {
+ initBrowserStorage();
+ }
+ function store(key) {
+ let func;
+ if (!browserStorageConfig[key] || !(func = getBrowserStorage(key))) {
+ return;
+ }
+ const set = browserStorageEmptyItems[key];
+ let index;
+ if (set.size) {
+ set.delete(index = Array.from(set).shift());
+ } else {
+ index = getBrowserStorageItemsCount(func);
+ if (!setBrowserStorageItemsCount(func, index + 1)) {
+ return;
+ }
+ }
+ const item = {
+ cached: Math.floor(Date.now() / browserStorageHour),
+ provider: storage.provider,
+ data
+ };
+ return setStoredItem(
+ func,
+ browserCachePrefix + index.toString(),
+ JSON.stringify(item)
+ );
+ }
+ if (data.lastModified && !updateLastModified(storage, data.lastModified)) {
+ return;
+ }
+ if (!Object.keys(data.icons).length) {
+ return;
+ }
+ if (data.not_found) {
+ data = Object.assign({}, data);
+ delete data.not_found;
+ }
+ if (!store("local")) {
+ store("session");
+ }
+}
+
+function emptyCallback() {
+}
+function loadedNewIcons(storage) {
+ if (!storage.iconsLoaderFlag) {
+ storage.iconsLoaderFlag = true;
+ setTimeout(() => {
+ storage.iconsLoaderFlag = false;
+ updateCallbacks(storage);
+ });
+ }
+}
+function loadNewIcons(storage, icons) {
+ if (!storage.iconsToLoad) {
+ storage.iconsToLoad = icons;
+ } else {
+ storage.iconsToLoad = storage.iconsToLoad.concat(icons).sort();
+ }
+ if (!storage.iconsQueueFlag) {
+ storage.iconsQueueFlag = true;
+ setTimeout(() => {
+ storage.iconsQueueFlag = false;
+ const { provider, prefix } = storage;
+ const icons2 = storage.iconsToLoad;
+ delete storage.iconsToLoad;
+ let api;
+ if (!icons2 || !(api = getAPIModule(provider))) {
+ return;
+ }
+ const params = api.prepare(provider, prefix, icons2);
+ params.forEach((item) => {
+ sendAPIQuery(provider, item, (data) => {
+ if (typeof data !== "object") {
+ item.icons.forEach((name) => {
+ storage.missing.add(name);
+ });
+ } else {
+ try {
+ const parsed = addIconSet(
+ storage,
+ data
+ );
+ if (!parsed.length) {
+ return;
+ }
+ const pending = storage.pendingIcons;
+ if (pending) {
+ parsed.forEach((name) => {
+ pending.delete(name);
+ });
+ }
+ storeInBrowserStorage(storage, data);
+ } catch (err) {
+ console.error(err);
+ }
+ }
+ loadedNewIcons(storage);
+ });
+ });
+ });
+ }
+}
+const isPending = (icon) => {
+ const storage = getStorage(
+ icon.provider,
+ icon.prefix
+ );
+ const pending = storage.pendingIcons;
+ return !!(pending && pending.has(icon.name));
+};
+const loadIcons = (icons, callback) => {
+ const cleanedIcons = listToIcons(icons, true, allowSimpleNames());
+ const sortedIcons = sortIcons(cleanedIcons);
+ if (!sortedIcons.pending.length) {
+ let callCallback = true;
+ if (callback) {
+ setTimeout(() => {
+ if (callCallback) {
+ callback(
+ sortedIcons.loaded,
+ sortedIcons.missing,
+ sortedIcons.pending,
+ emptyCallback
+ );
+ }
+ });
+ }
+ return () => {
+ callCallback = false;
+ };
+ }
+ const newIcons = /* @__PURE__ */ Object.create(null);
+ const sources = [];
+ let lastProvider, lastPrefix;
+ sortedIcons.pending.forEach((icon) => {
+ const { provider, prefix } = icon;
+ if (prefix === lastPrefix && provider === lastProvider) {
+ return;
+ }
+ lastProvider = provider;
+ lastPrefix = prefix;
+ sources.push(getStorage(provider, prefix));
+ const providerNewIcons = newIcons[provider] || (newIcons[provider] = /* @__PURE__ */ Object.create(null));
+ if (!providerNewIcons[prefix]) {
+ providerNewIcons[prefix] = [];
+ }
+ });
+ sortedIcons.pending.forEach((icon) => {
+ const { provider, prefix, name } = icon;
+ const storage = getStorage(provider, prefix);
+ const pendingQueue = storage.pendingIcons || (storage.pendingIcons = /* @__PURE__ */ new Set());
+ if (!pendingQueue.has(name)) {
+ pendingQueue.add(name);
+ newIcons[provider][prefix].push(name);
+ }
+ });
+ sources.forEach((storage) => {
+ const { provider, prefix } = storage;
+ if (newIcons[provider][prefix].length) {
+ loadNewIcons(storage, newIcons[provider][prefix]);
+ }
+ });
+ return callback ? storeCallback(callback, sortedIcons, sources) : emptyCallback;
+};
+const loadIcon = (icon) => {
+ return new Promise((fulfill, reject) => {
+ const iconObj = typeof icon === "string" ? stringToIcon(icon, true) : icon;
+ if (!iconObj) {
+ reject(icon);
+ return;
+ }
+ loadIcons([iconObj || icon], (loaded) => {
+ if (loaded.length && iconObj) {
+ const data = getIconData(iconObj);
+ if (data) {
+ fulfill({
+ ...defaultIconProps,
+ ...data
+ });
+ return;
+ }
+ }
+ reject(icon);
+ });
+ });
+};
+
+function mergeCustomisations(defaults, item) {
+ const result = {
+ ...defaults
+ };
+ for (const key in item) {
+ const value = item[key];
+ const valueType = typeof value;
+ if (key in defaultIconSizeCustomisations) {
+ if (value === null || value && (valueType === "string" || valueType === "number")) {
+ result[key] = value;
+ }
+ } else if (valueType === typeof result[key]) {
+ result[key] = key === "rotate" ? value % 4 : value;
+ }
+ }
+ return result;
+}
+
+const defaultExtendedIconCustomisations = {
+ ...defaultIconCustomisations,
+ inline: false,
+};
+/**
+ * Class names
+ */
+const blockClass = 'iconify';
+const inlineClass = 'iconify-inline';
+/**
+ * Names of properties to add to nodes
+ */
+const elementDataProperty = ('iconifyData' + Date.now());
+
+/**
+ * List of root nodes
+ */
+let nodes = [];
+/**
+ * Find node
+ */
+function findRootNode(node) {
+ for (let i = 0; i < nodes.length; i++) {
+ const item = nodes[i];
+ const root = typeof item.node === 'function' ? item.node() : item.node;
+ if (root === node) {
+ return item;
+ }
+ }
+}
+/**
+ * Add extra root node
+ */
+function addRootNode(root, autoRemove = false) {
+ let node = findRootNode(root);
+ if (node) {
+ // Node already exist: switch type if needed
+ if (node.temporary) {
+ node.temporary = autoRemove;
+ }
+ return node;
+ }
+ // Create item, add it to list
+ node = {
+ node: root,
+ temporary: autoRemove,
+ };
+ nodes.push(node);
+ return node;
+}
+/**
+ * Add document.body node
+ */
+function addBodyNode() {
+ if (document.documentElement) {
+ return addRootNode(document.documentElement);
+ }
+ nodes.push({
+ node: () => {
+ return document.documentElement;
+ },
+ });
+}
+/**
+ * Remove root node
+ */
+function removeRootNode(root) {
+ nodes = nodes.filter((node) => root !== node &&
+ root !== (typeof node.node === 'function' ? node.node() : node.node));
+}
+/**
+ * Get list of root nodes
+ */
+function listRootNodes() {
+ return nodes;
+}
+
+/**
+ * Execute function when DOM is ready
+ */
+function onReady(callback) {
+ const doc = document;
+ if (doc.readyState && doc.readyState !== 'loading') {
+ callback();
+ }
+ else {
+ doc.addEventListener('DOMContentLoaded', callback);
+ }
+}
+
+/**
+ * Callback
+ */
+let callback = null;
+/**
+ * Parameters for mutation observer
+ */
+const observerParams = {
+ childList: true,
+ subtree: true,
+ attributes: true,
+};
+/**
+ * Queue DOM scan
+ */
+function queueScan(node) {
+ if (!node.observer) {
+ return;
+ }
+ const observer = node.observer;
+ if (!observer.pendingScan) {
+ observer.pendingScan = setTimeout(() => {
+ delete observer.pendingScan;
+ if (callback) {
+ callback(node);
+ }
+ });
+ }
+}
+/**
+ * Check mutations for added nodes
+ */
+function checkMutations(node, mutations) {
+ if (!node.observer) {
+ return;
+ }
+ const observer = node.observer;
+ if (!observer.pendingScan) {
+ for (let i = 0; i < mutations.length; i++) {
+ const item = mutations[i];
+ if (
+ // Check for added nodes
+ (item.addedNodes && item.addedNodes.length > 0) ||
+ // Check for icon or placeholder with modified attributes
+ (item.type === 'attributes' &&
+ item.target[elementDataProperty] !==
+ void 0)) {
+ if (!observer.paused) {
+ queueScan(node);
+ }
+ return;
+ }
+ }
+ }
+}
+/**
+ * Start/resume observer
+ */
+function continueObserving(node, root) {
+ node.observer.instance.observe(root, observerParams);
+}
+/**
+ * Start mutation observer
+ */
+function startObserver(node) {
+ let observer = node.observer;
+ if (observer && observer.instance) {
+ // Already started
+ return;
+ }
+ const root = typeof node.node === 'function' ? node.node() : node.node;
+ if (!root || !window) {
+ // document.body is not available yet or window is missing
+ return;
+ }
+ if (!observer) {
+ observer = {
+ paused: 0,
+ };
+ node.observer = observer;
+ }
+ // Create new instance, observe
+ observer.instance = new window.MutationObserver(checkMutations.bind(null, node));
+ continueObserving(node, root);
+ // Scan immediately
+ if (!observer.paused) {
+ queueScan(node);
+ }
+}
+/**
+ * Start all observers
+ */
+function startObservers() {
+ listRootNodes().forEach(startObserver);
+}
+/**
+ * Stop observer
+ */
+function stopObserver(node) {
+ if (!node.observer) {
+ return;
+ }
+ const observer = node.observer;
+ // Stop scan
+ if (observer.pendingScan) {
+ clearTimeout(observer.pendingScan);
+ delete observer.pendingScan;
+ }
+ // Disconnect observer
+ if (observer.instance) {
+ observer.instance.disconnect();
+ delete observer.instance;
+ }
+}
+/**
+ * Start observer when DOM is ready
+ */
+function initObserver(cb) {
+ const isRestart = callback !== null;
+ if (callback !== cb) {
+ // Change callback and stop all pending observers
+ callback = cb;
+ if (isRestart) {
+ listRootNodes().forEach(stopObserver);
+ }
+ }
+ if (isRestart) {
+ // Restart instances
+ startObservers();
+ return;
+ }
+ // Start observers when document is ready
+ onReady(startObservers);
+}
+/**
+ * Pause observing node
+ */
+function pauseObservingNode(node) {
+ (node ? [node] : listRootNodes()).forEach((node) => {
+ if (!node.observer) {
+ node.observer = {
+ paused: 1,
+ };
+ return;
+ }
+ const observer = node.observer;
+ observer.paused++;
+ if (observer.paused > 1 || !observer.instance) {
+ return;
+ }
+ // Disconnect observer
+ const instance = observer.instance;
+ // checkMutations(node, instance.takeRecords());
+ instance.disconnect();
+ });
+}
+/**
+ * Pause observer
+ */
+function pauseObserver(root) {
+ if (root) {
+ const node = findRootNode(root);
+ if (node) {
+ pauseObservingNode(node);
+ }
+ }
+ else {
+ pauseObservingNode();
+ }
+}
+/**
+ * Resume observer
+ */
+function resumeObservingNode(observer) {
+ (observer ? [observer] : listRootNodes()).forEach((node) => {
+ if (!node.observer) {
+ // Start observer
+ startObserver(node);
+ return;
+ }
+ const observer = node.observer;
+ if (observer.paused) {
+ observer.paused--;
+ if (!observer.paused) {
+ // Start / resume
+ const root = typeof node.node === 'function' ? node.node() : node.node;
+ if (!root) {
+ return;
+ }
+ else if (observer.instance) {
+ continueObserving(node, root);
+ }
+ else {
+ startObserver(node);
+ }
+ }
+ }
+ });
+}
+/**
+ * Resume observer
+ */
+function resumeObserver(root) {
+ if (root) {
+ const node = findRootNode(root);
+ if (node) {
+ resumeObservingNode(node);
+ }
+ }
+ else {
+ resumeObservingNode();
+ }
+}
+/**
+ * Observe node
+ */
+function observe(root, autoRemove = false) {
+ const node = addRootNode(root, autoRemove);
+ startObserver(node);
+ return node;
+}
+/**
+ * Remove observed node
+ */
+function stopObserving(root) {
+ const node = findRootNode(root);
+ if (node) {
+ stopObserver(node);
+ removeRootNode(root);
+ }
+}
+
+/**
+ * Compare props
+ */
+function propsChanged(props1, props2) {
+ if (props1.name !== props2.name || props1.mode !== props2.mode) {
+ return true;
+ }
+ const customisations1 = props1.customisations;
+ const customisations2 = props2.customisations;
+ for (const key in defaultExtendedIconCustomisations) {
+ if (customisations1[key] !== customisations2[key]) {
+ return true;
+ }
+ }
+ return false;
+}
+
+function rotateFromString(value, defaultValue = 0) {
+ const units = value.replace(/^-?[0-9.]*/, "");
+ function cleanup(value2) {
+ while (value2 < 0) {
+ value2 += 4;
+ }
+ return value2 % 4;
+ }
+ if (units === "") {
+ const num = parseInt(value);
+ return isNaN(num) ? 0 : cleanup(num);
+ } else if (units !== value) {
+ let split = 0;
+ switch (units) {
+ case "%":
+ split = 25;
+ break;
+ case "deg":
+ split = 90;
+ }
+ if (split) {
+ let num = parseFloat(value.slice(0, value.length - units.length));
+ if (isNaN(num)) {
+ return 0;
+ }
+ num = num / split;
+ return num % 1 === 0 ? cleanup(num) : 0;
+ }
+ }
+ return defaultValue;
+}
+
+const separator = /[\s,]+/;
+function flipFromString(custom, flip) {
+ flip.split(separator).forEach((str) => {
+ const value = str.trim();
+ switch (value) {
+ case "horizontal":
+ custom.hFlip = true;
+ break;
+ case "vertical":
+ custom.vFlip = true;
+ break;
+ }
+ });
+}
+
+/**
+ * Size attributes
+ */
+const sizeAttributes = ['width', 'height'];
+/**
+ * Boolean attributes
+ */
+const booleanAttributes = [
+ 'inline',
+ 'hFlip',
+ 'vFlip',
+];
+/**
+ * Get attribute value
+ */
+function getBooleanAttribute(value, key) {
+ if (value === key || value === 'true') {
+ return true;
+ }
+ if (value === '' || value === 'false') {
+ return false;
+ }
+ return null;
+}
+/**
+ * Get element properties from HTML element
+ */
+function getElementProps(element) {
+ // Get icon name
+ const name = element.getAttribute('data-icon');
+ const icon = typeof name === 'string' && stringToIcon(name, true);
+ if (!icon) {
+ return null;
+ }
+ // Get defaults and inline
+ const customisations = {
+ ...defaultExtendedIconCustomisations,
+ inline: element.classList && element.classList.contains(inlineClass),
+ };
+ // Get dimensions
+ sizeAttributes.forEach((attr) => {
+ const value = element.getAttribute('data-' + attr);
+ if (value) {
+ customisations[attr] = value;
+ }
+ });
+ // Get rotation
+ const rotation = element.getAttribute('data-rotate');
+ if (typeof rotation === 'string') {
+ customisations.rotate = rotateFromString(rotation);
+ }
+ // Get flip shorthand
+ const flip = element.getAttribute('data-flip');
+ if (typeof flip === 'string') {
+ flipFromString(customisations, flip);
+ }
+ // Boolean attributes
+ booleanAttributes.forEach((attr) => {
+ const key = 'data-' + attr;
+ const value = getBooleanAttribute(element.getAttribute(key), key);
+ if (typeof value === 'boolean') {
+ customisations[attr] = value;
+ }
+ });
+ // Get render mode. Not checking actual value because incorrect values are treated as inline
+ const mode = element.getAttribute('data-mode');
+ return {
+ name,
+ icon,
+ customisations,
+ mode,
+ };
+}
+
+/**
+ * Selector combining class names and tags
+ */
+const selector = 'svg.' +
+ blockClass +
+ ', i.' +
+ blockClass +
+ ', span.' +
+ blockClass +
+ ', i.' +
+ inlineClass +
+ ', span.' +
+ inlineClass;
+/**
+ * Find all parent nodes in DOM
+ */
+function scanRootNode(root) {
+ const nodes = [];
+ root.querySelectorAll(selector).forEach((node) => {
+ // Get props, ignore SVG rendered outside of SVG framework
+ const props = node[elementDataProperty] || node.tagName.toLowerCase() !== 'svg'
+ ? getElementProps(node)
+ : null;
+ if (props) {
+ nodes.push({
+ node,
+ props,
+ });
+ }
+ });
+ return nodes;
+}
+
+function iconToHTML(body, attributes) {
+ let renderAttribsHTML = body.indexOf("xlink:") === -1 ? "" : ' xmlns:xlink="http://www.w3.org/1999/xlink"';
+ for (const attr in attributes) {
+ renderAttribsHTML += " " + attr + '="' + attributes[attr] + '"';
+ }
+ return '" + body + " ";
+}
+
+let policy;
+function createPolicy() {
+ try {
+ policy = window.trustedTypes.createPolicy("iconify", {
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
+ createHTML: (s) => s
+ });
+ } catch (err) {
+ policy = null;
+ }
+}
+function cleanUpInnerHTML(html) {
+ if (policy === void 0) {
+ createPolicy();
+ }
+ return policy ? policy.createHTML(html) : html;
+}
+
+/**
+ * Get classes to add from icon name
+ */
+function iconClasses(iconName) {
+ const classesToAdd = new Set(['iconify']);
+ ['provider', 'prefix'].forEach((attr) => {
+ if (iconName[attr]) {
+ classesToAdd.add('iconify--' + iconName[attr]);
+ }
+ });
+ return classesToAdd;
+}
+/**
+ * Add classes to SVG, removing previously added classes, keeping custom classes
+ */
+function applyClasses(svg, classes, previouslyAddedClasses, placeholder) {
+ const svgClasses = svg.classList;
+ // Copy classes from placeholder
+ if (placeholder) {
+ const placeholderClasses = placeholder.classList;
+ Array.from(placeholderClasses).forEach((item) => {
+ svgClasses.add(item);
+ });
+ }
+ // Add new classes
+ const addedClasses = [];
+ classes.forEach((item) => {
+ if (!svgClasses.contains(item)) {
+ // Add new class
+ svgClasses.add(item);
+ addedClasses.push(item);
+ }
+ else if (previouslyAddedClasses.has(item)) {
+ // Was added before: keep it
+ addedClasses.push(item);
+ }
+ });
+ // Remove previously added classes
+ previouslyAddedClasses.forEach((item) => {
+ if (!classes.has(item)) {
+ // Class that was added before, but no longer needed
+ svgClasses.remove(item);
+ }
+ });
+ return addedClasses;
+}
+
+/**
+ * Copy old styles, apply new styles
+ */
+function applyStyle(svg, styles, previouslyAddedStyles) {
+ const svgStyle = svg.style;
+ // Remove previously added styles
+ (previouslyAddedStyles || []).forEach((prop) => {
+ svgStyle.removeProperty(prop);
+ });
+ // Apply new styles, ignoring styles that already exist
+ const appliedStyles = [];
+ for (const prop in styles) {
+ if (!svgStyle.getPropertyValue(prop)) {
+ appliedStyles.push(prop);
+ svgStyle.setProperty(prop, styles[prop]);
+ }
+ }
+ return appliedStyles;
+}
+
+/**
+ * Render icon as inline SVG
+ */
+function renderInlineSVG(element, props, iconData) {
+ // Create placeholder. Why placeholder? innerHTML setter on SVG does not work in some environments.
+ let span;
+ try {
+ span = document.createElement('span');
+ }
+ catch (err) {
+ return element;
+ }
+ // Generate data to render
+ const customisations = props.customisations;
+ const renderData = iconToSVG(iconData, customisations);
+ // Get old data
+ const oldData = element[elementDataProperty];
+ // Generate SVG
+ const html = iconToHTML(replaceIDs(renderData.body), {
+ 'aria-hidden': 'true',
+ 'role': 'img',
+ ...renderData.attributes,
+ });
+ span.innerHTML = cleanUpInnerHTML(html);
+ // Get SVG element
+ const svg = span.childNodes[0];
+ // Add attributes
+ const placeholderAttributes = element.attributes;
+ for (let i = 0; i < placeholderAttributes.length; i++) {
+ const item = placeholderAttributes.item(i);
+ const name = item.name;
+ if (name !== 'class' && !svg.hasAttribute(name)) {
+ svg.setAttribute(name, item.value);
+ }
+ }
+ // Add classes
+ const classesToAdd = iconClasses(props.icon);
+ const addedClasses = applyClasses(svg, classesToAdd, new Set(oldData && oldData.addedClasses), element);
+ // Update style
+ const addedStyles = applyStyle(svg, customisations.inline
+ ? {
+ 'vertical-align': '-0.125em',
+ }
+ : {}, oldData && oldData.addedStyles);
+ // Add data to element
+ const newData = {
+ ...props,
+ status: 'loaded',
+ addedClasses,
+ addedStyles,
+ };
+ svg[elementDataProperty] = newData;
+ // Replace old element
+ if (element.parentNode) {
+ element.parentNode.replaceChild(svg, element);
+ }
+ return svg;
+}
+
+function encodeSVGforURL(svg) {
+ return svg.replace(/"/g, "'").replace(/%/g, "%25").replace(/#/g, "%23").replace(//g, "%3E").replace(/\s+/g, " ");
+}
+function svgToData(svg) {
+ return "data:image/svg+xml," + encodeSVGforURL(svg);
+}
+function svgToURL(svg) {
+ return 'url("' + svgToData(svg) + '")';
+}
+
+const commonProps = {
+ display: 'inline-block',
+};
+const monotoneProps = {
+ 'background-color': 'currentColor',
+};
+const coloredProps = {
+ 'background-color': 'transparent',
+};
+// Dynamically add common props to variables above
+const propsToAdd = {
+ image: 'var(--svg)',
+ repeat: 'no-repeat',
+ size: '100% 100%',
+};
+const propsToAddTo = {
+ '-webkit-mask': monotoneProps,
+ 'mask': monotoneProps,
+ 'background': coloredProps,
+};
+for (const prefix in propsToAddTo) {
+ const list = propsToAddTo[prefix];
+ for (const prop in propsToAdd) {
+ list[prefix + '-' + prop] = propsToAdd[prop];
+ }
+}
+/**
+ * Fix size: add 'px' to numbers
+ */
+function fixSize(value) {
+ return value + (value.match(/^[-0-9.]+$/) ? 'px' : '');
+}
+/**
+ * Render icon as inline SVG
+ */
+function renderBackground(element, props, iconData, useMask) {
+ // Generate data to render
+ const customisations = props.customisations;
+ const renderData = iconToSVG(iconData, customisations);
+ const renderAttribs = renderData.attributes;
+ // Get old data
+ const oldData = element[elementDataProperty];
+ // Generate SVG
+ const html = iconToHTML(renderData.body, {
+ ...renderAttribs,
+ width: iconData.width + '',
+ height: iconData.height + '',
+ });
+ // Add classes
+ const classesToAdd = iconClasses(props.icon);
+ const addedClasses = applyClasses(element, classesToAdd, new Set(oldData && oldData.addedClasses));
+ // Update style
+ const url = svgToURL(html);
+ const newStyles = {
+ '--svg': url,
+ 'width': fixSize(renderAttribs.width),
+ 'height': fixSize(renderAttribs.height),
+ ...commonProps,
+ ...(useMask ? monotoneProps : coloredProps),
+ };
+ if (customisations.inline) {
+ newStyles['vertical-align'] = '-0.125em';
+ }
+ const addedStyles = applyStyle(element, newStyles, oldData && oldData.addedStyles);
+ // Add data to element
+ const newData = {
+ ...props,
+ status: 'loaded',
+ addedClasses,
+ addedStyles,
+ };
+ element[elementDataProperty] = newData;
+ return element;
+}
+
+/**
+ * Flag to avoid scanning DOM too often
+ */
+let scanQueued = false;
+/**
+ * Icons have been loaded
+ */
+function checkPendingIcons() {
+ if (!scanQueued) {
+ scanQueued = true;
+ setTimeout(() => {
+ if (scanQueued) {
+ scanQueued = false;
+ scanDOM();
+ }
+ });
+ }
+}
+/**
+ * Scan node for placeholders
+ */
+function scanDOM(rootNode, addTempNode = false) {
+ // List of icons to load: [provider][prefix] = Set
+ const iconsToLoad = Object.create(null);
+ function getIcon(icon, load) {
+ const { provider, prefix, name } = icon;
+ const storage = getStorage(provider, prefix);
+ const storedIcon = storage.icons[name];
+ if (storedIcon) {
+ return {
+ status: 'loaded',
+ icon: storedIcon,
+ };
+ }
+ if (storage.missing.has(name)) {
+ return {
+ status: 'missing',
+ };
+ }
+ if (load && !isPending(icon)) {
+ const providerIconsToLoad = iconsToLoad[provider] ||
+ (iconsToLoad[provider] = Object.create(null));
+ const set = providerIconsToLoad[prefix] ||
+ (providerIconsToLoad[prefix] = new Set());
+ set.add(name);
+ }
+ return {
+ status: 'loading',
+ };
+ }
+ // Parse all root nodes
+ (rootNode ? [rootNode] : listRootNodes()).forEach((observedNode) => {
+ const root = typeof observedNode.node === 'function'
+ ? observedNode.node()
+ : observedNode.node;
+ if (!root || !root.querySelectorAll) {
+ return;
+ }
+ // Track placeholders
+ let hasPlaceholders = false;
+ // Observer
+ let paused = false;
+ /**
+ * Render icon
+ */
+ function render(element, props, iconData) {
+ if (!paused) {
+ paused = true;
+ pauseObservingNode(observedNode);
+ }
+ if (element.tagName.toUpperCase() !== 'SVG') {
+ // Check for one of style modes
+ const mode = props.mode;
+ const isMask = mode === 'mask' ||
+ (mode === 'bg'
+ ? false
+ : mode === 'style'
+ ? iconData.body.indexOf('currentColor') !== -1
+ : null);
+ if (typeof isMask === 'boolean') {
+ renderBackground(element, props, {
+ ...defaultIconProps,
+ ...iconData,
+ }, isMask);
+ return;
+ }
+ }
+ renderInlineSVG(element, props, iconData);
+ }
+ // Find all elements
+ scanRootNode(root).forEach(({ node, props }) => {
+ // Check if item already has props
+ const oldData = node[elementDataProperty];
+ if (!oldData) {
+ // New icon without data
+ const { status, icon } = getIcon(props.icon, true);
+ if (icon) {
+ // Ready to render!
+ render(node, props, icon);
+ return;
+ }
+ // Loading or missing
+ hasPlaceholders = hasPlaceholders || status === 'loading';
+ node[elementDataProperty] = {
+ ...props,
+ status,
+ };
+ return;
+ }
+ // Previously found icon
+ let item;
+ if (!propsChanged(oldData, props)) {
+ // Props have not changed. Check status
+ const oldStatus = oldData.status;
+ if (oldStatus !== 'loading') {
+ return;
+ }
+ item = getIcon(props.icon, false);
+ if (!item.icon) {
+ // Nothing to render
+ oldData.status = item.status;
+ return;
+ }
+ }
+ else {
+ // Properties have changed: load icon if name has changed
+ item = getIcon(props.icon, oldData.name !== props.name);
+ if (!item.icon) {
+ // Cannot render icon: update status and props
+ hasPlaceholders =
+ hasPlaceholders || item.status === 'loading';
+ Object.assign(oldData, {
+ ...props,
+ status: item.status,
+ });
+ return;
+ }
+ }
+ // Re-render icon
+ render(node, props, item.icon);
+ });
+ // Observed node stuff
+ if (observedNode.temporary && !hasPlaceholders) {
+ // Remove temporary node
+ stopObserving(root);
+ }
+ else if (addTempNode && hasPlaceholders) {
+ // Add new temporary node
+ observe(root, true);
+ }
+ else if (paused && observedNode.observer) {
+ // Resume observer
+ resumeObservingNode(observedNode);
+ }
+ });
+ // Load icons
+ for (const provider in iconsToLoad) {
+ const providerIconsToLoad = iconsToLoad[provider];
+ for (const prefix in providerIconsToLoad) {
+ const set = providerIconsToLoad[prefix];
+ loadIcons(Array.from(set).map((name) => ({
+ provider,
+ prefix,
+ name,
+ })), checkPendingIcons);
+ }
+ }
+}
+/**
+ * Scan node for placeholders
+ */
+function scanElement(root) {
+ // Add temporary node
+ const node = findRootNode(root);
+ if (!node) {
+ scanDOM({
+ node: root,
+ temporary: true,
+ }, true);
+ }
+ else {
+ scanDOM(node);
+ }
+}
+
+function generateIcon(name, customisations, returnString = false) {
+ // Get icon data
+ const iconData = getIconData(name);
+ if (!iconData) {
+ return null;
+ }
+ // Split name
+ const iconName = stringToIcon(name);
+ // Clean up customisations
+ const changes = mergeCustomisations(defaultExtendedIconCustomisations, customisations || {});
+ // Get data
+ const result = renderInlineSVG(document.createElement('span'), {
+ name,
+ icon: iconName,
+ customisations: changes,
+ }, iconData);
+ return returnString
+ ? result.outerHTML
+ : result;
+}
+/**
+ * Get version
+ */
+function getVersion() {
+ return '3.1.1';
+}
+/**
+ * Generate SVG element
+ */
+function renderSVG(name, customisations) {
+ return generateIcon(name, customisations, false);
+}
+/**
+ * Generate SVG as string
+ */
+function renderHTML(name, customisations) {
+ return generateIcon(name, customisations, true);
+}
+/**
+ * Get rendered icon as object that can be used to create SVG (use replaceIDs on body)
+ */
+function renderIcon(name, customisations) {
+ // Get icon data
+ const iconData = getIconData(name);
+ if (!iconData) {
+ return null;
+ }
+ // Clean up customisations
+ const changes = mergeCustomisations(defaultExtendedIconCustomisations, customisations || {});
+ // Get data
+ return iconToSVG(iconData, changes);
+}
+/**
+ * Scan DOM
+ */
+function scan(root) {
+ if (root) {
+ scanElement(root);
+ }
+ else {
+ scanDOM();
+ }
+}
+/**
+ * Initialise stuff
+ */
+if (typeof document !== 'undefined' && typeof window !== 'undefined') {
+ // Add document.body node
+ addBodyNode();
+ const _window = window;
+ // Load icons from global "IconifyPreload"
+ if (_window.IconifyPreload !== void 0) {
+ const preload = _window.IconifyPreload;
+ const err = 'Invalid IconifyPreload syntax.';
+ if (typeof preload === 'object' && preload !== null) {
+ (preload instanceof Array ? preload : [preload]).forEach((item) => {
+ try {
+ if (
+ // Check if item is an object and not null/array
+ typeof item !== 'object' ||
+ item === null ||
+ item instanceof Array ||
+ // Check for 'icons' and 'prefix'
+ typeof item.icons !== 'object' ||
+ typeof item.prefix !== 'string' ||
+ // Add icon set
+ !addCollection(item)) {
+ console.error(err);
+ }
+ }
+ catch (e) {
+ console.error(err);
+ }
+ });
+ }
+ }
+ // Load observer and scan DOM on next tick
+ setTimeout(() => {
+ initObserver(scanDOM);
+ scanDOM();
+ });
+}
+
+/**
+ * Enable cache
+ */
+function enableCache(storage, enable) {
+ toggleBrowserCache(storage, enable !== false);
+}
+/**
+ * Disable cache
+ */
+function disableCache(storage) {
+ toggleBrowserCache(storage, true);
+}
+/**
+ * Initialise stuff
+ */
+// Set API module
+setAPIModule('', fetchAPIModule);
+/**
+ * Browser stuff
+ */
+if (typeof document !== 'undefined' && typeof window !== 'undefined') {
+ // Set cache and load existing cache
+ initBrowserStorage();
+ const _window = window;
+ // Set API from global "IconifyProviders"
+ if (_window.IconifyProviders !== void 0) {
+ const providers = _window.IconifyProviders;
+ if (typeof providers === 'object' && providers !== null) {
+ for (const key in providers) {
+ const err = 'IconifyProviders[' + key + '] is invalid.';
+ try {
+ const value = providers[key];
+ if (typeof value !== 'object' ||
+ !value ||
+ value.resources === void 0) {
+ continue;
+ }
+ if (!addAPIProvider(key, value)) {
+ console.error(err);
+ }
+ }
+ catch (e) {
+ console.error(err);
+ }
+ }
+ }
+ }
+}
+/**
+ * Internal API
+ */
+const _api = {
+ getAPIConfig,
+ setAPIModule,
+ sendAPIQuery,
+ setFetch,
+ getFetch,
+ listAPIProviders,
+};
+/**
+ * Global variable
+ */
+const Iconify = {
+ // IconifyAPIInternalFunctions
+ _api,
+ // IconifyAPIFunctions
+ addAPIProvider,
+ loadIcons,
+ loadIcon,
+ // IconifyStorageFunctions
+ iconExists,
+ getIcon,
+ listIcons,
+ addIcon,
+ addCollection,
+ // IconifyBuilderFunctions
+ replaceIDs,
+ calculateSize,
+ buildIcon: iconToSVG,
+ // IconifyCommonFunctions
+ getVersion,
+ renderSVG,
+ renderHTML,
+ renderIcon,
+ scan,
+ observe,
+ stopObserving,
+ pauseObserver,
+ resumeObserver,
+ // IconifyBrowserCacheFunctions
+ enableCache,
+ disableCache,
+};
+
+exports._api = _api;
+exports.addAPIProvider = addAPIProvider;
+exports.addCollection = addCollection;
+exports.addIcon = addIcon;
+exports.buildIcon = iconToSVG;
+exports.calculateSize = calculateSize;
+exports.default = Iconify;
+exports.disableCache = disableCache;
+exports.enableCache = enableCache;
+exports.getIcon = getIcon;
+exports.getVersion = getVersion;
+exports.iconExists = iconExists;
+exports.listIcons = listIcons;
+exports.loadIcon = loadIcon;
+exports.loadIcons = loadIcons;
+exports.observe = observe;
+exports.pauseObserver = pauseObserver;
+exports.renderHTML = renderHTML;
+exports.renderIcon = renderIcon;
+exports.renderSVG = renderSVG;
+exports.replaceIDs = replaceIDs;
+exports.resumeObserver = resumeObserver;
+exports.scan = scan;
+exports.stopObserving = stopObserving;
+
+// Export to window or web worker
+try {
+ if (self.Iconify === void 0) {
+ self.Iconify = Iconify;
+ }
+} catch (err) {
+}
diff --git a/node_modules/@iconify/iconify/dist/iconify.d.ts b/node_modules/@iconify/iconify/dist/iconify.d.ts
new file mode 100644
index 0000000..899c4dd
--- /dev/null
+++ b/node_modules/@iconify/iconify/dist/iconify.d.ts
@@ -0,0 +1,480 @@
+import { IconifyIcon } from '@iconify/types';
+import { IconifyJSON } from '@iconify/types';
+import { IconifyTransformations } from '@iconify/types';
+
+/**
+ * Add custom config for provider
+ */
+export declare function addAPIProvider(provider: string, customConfig: PartialIconifyAPIConfig): boolean;
+
+/**
+ * Add icon set
+ */
+export declare function addCollection(data: IconifyJSON, provider?: string): boolean;
+
+/**
+ * Add one icon
+ */
+export declare function addIcon(name: string, data: IconifyIcon): boolean;
+
+/**
+ * Internal API
+ */
+export declare const _api: IconifyAPIInternalFunctions;
+
+declare type BrowserStorageType = 'local' | 'session';
+
+/**
+ * Get SVG attributes and content from icon + customisations
+ *
+ * Does not generate style to make it compatible with frameworks that use objects for style, such as React.
+ * Instead, it generates 'inline' value. If true, rendering engine should add verticalAlign: -0.125em to icon.
+ *
+ * Customisations should be normalised by platform specific parser.
+ * Result should be converted to by platform specific parser.
+ * Use replaceIDs to generate unique IDs for body.
+ */
+export declare function buildIcon(icon: IconifyIcon, customisations?: IconifyIconCustomisations_2): IconifyIconBuildResult;
+
+/**
+ * Calculate second dimension when only 1 dimension is set
+ */
+export declare function calculateSize(size: string, ratio: number, precision?: number): string;
+
+export declare function calculateSize(size: number, ratio: number, precision?: number): number;
+
+export declare function calculateSize(size: string | number, ratio: number, precision?: number): string | number;
+
+/**
+ * Disable cache
+ */
+export declare function disableCache(storage: IconifyBrowserCacheType): void;
+
+/**
+ * Enable cache
+ */
+export declare function enableCache(storage: IconifyBrowserCacheType, enable?: boolean): void;
+
+/**
+ * Signature for getAPIConfig
+ */
+export declare type GetAPIConfig = (provider: string) => IconifyAPIConfig | undefined;
+
+/**
+ * Callback
+ */
+declare type GetHTMLElement = () => HTMLElement | null;
+
+/**
+ * Get full icon
+ */
+export declare function getIcon(name: string): Required | null;
+
+/**
+ * Get version
+ */
+export declare function getVersion(): string;
+
+/**
+ * Check if icon exists
+ */
+export declare function iconExists(name: string): boolean;
+
+/**
+ * Global variable
+ */
+declare const Iconify: IconifyGlobal;
+export default Iconify;
+
+/**
+ * API config
+ */
+export declare interface IconifyAPIConfig extends RedundancyConfig {
+ path: string;
+ maxURL: number;
+}
+
+export declare interface IconifyAPICustomQueryParams {
+ type: 'custom';
+ provider?: string;
+ uri: string;
+}
+
+/**
+ * Iconify API functions
+ */
+export declare interface IconifyAPIFunctions {
+ /**
+ * Load icons
+ */
+ loadIcons: (icons: (IconifyIconName | string)[], callback?: IconifyIconLoaderCallback) => IconifyIconLoaderAbort;
+ /**
+ * Load one icon, using Promise syntax
+ */
+ loadIcon: (icon: IconifyIconName | string) => Promise>;
+ /**
+ * Add API provider
+ */
+ addAPIProvider: (provider: string, customConfig: PartialIconifyAPIConfig) => boolean;
+}
+
+/**
+ * Params for sendQuery()
+ */
+declare interface IconifyAPIIconsQueryParams {
+ type: 'icons';
+ provider: string;
+ prefix: string;
+ icons: string[];
+}
+
+/**
+ * Exposed internal functions
+ *
+ * Used by plug-ins, such as Icon Finder
+ *
+ * Important: any changes published in a release must be backwards compatible.
+ */
+export declare interface IconifyAPIInternalFunctions {
+ /**
+ * Get API config, used by custom modules
+ */
+ getAPIConfig: GetAPIConfig;
+ /**
+ * Set custom API module
+ */
+ setAPIModule: (provider: string, item: IconifyAPIModule) => void;
+ /**
+ * Send API query
+ */
+ sendAPIQuery: (target: string | PartialIconifyAPIConfig, query: IconifyAPIQueryParams, callback: QueryDoneCallback) => QueryAbortCallback;
+ /**
+ * Set and get fetch()
+ */
+ setFetch: (item: typeof fetch) => void;
+ getFetch: () => typeof fetch | undefined;
+ /**
+ * List all API providers (from config)
+ */
+ listAPIProviders: () => string[];
+}
+
+/**
+ * API modules
+ */
+export declare interface IconifyAPIModule {
+ prepare: IconifyAPIPrepareIconsQuery;
+ send: IconifyAPISendQuery;
+}
+
+/**
+ * Functions to implement in module
+ */
+export declare type IconifyAPIPrepareIconsQuery = (provider: string, prefix: string, icons: string[]) => IconifyAPIIconsQueryParams[];
+
+export declare type IconifyAPIQueryParams = IconifyAPIIconsQueryParams | IconifyAPICustomQueryParams;
+
+export declare type IconifyAPISendQuery = (host: string, params: IconifyAPIQueryParams, callback: QueryModuleResponse) => void;
+
+/**
+ * Interface for exported functions
+ */
+export declare interface IconifyBrowserCacheFunctions {
+ enableCache: (storage: IconifyBrowserCacheType) => void;
+ disableCache: (storage: IconifyBrowserCacheType) => void;
+}
+
+/**
+ * Cache types
+ */
+export declare type IconifyBrowserCacheType = BrowserStorageType | 'all';
+
+/**
+ * Interface for exported builder functions
+ */
+export declare interface IconifyBuilderFunctions {
+ replaceIDs?: (body: string, prefix?: string | (() => string)) => string;
+ calculateSize: (size: string | number, ratio: number, precision?: number) => string | number;
+ buildIcon: (icon: IconifyIcon, customisations?: IconifyIconCustomisations_2) => IconifyIconBuildResult;
+}
+
+/**
+ * Iconify interface
+ */
+declare interface IconifyCommonFunctions {
+ /**
+ * Get version
+ */
+ getVersion: () => string;
+ /**
+ * Render icons
+ */
+ renderSVG: (name: string, customisations?: IconifyIconCustomisations_2) => SVGElement | null;
+ renderHTML: (name: string, customisations?: IconifyIconCustomisations_2) => string | null;
+ /**
+ * Get icon data
+ */
+ renderIcon: (name: string, customisations?: IconifyIconCustomisations_2) => IconifyIconBuildResult | null;
+ /**
+ * Scan DOM
+ */
+ scan: (root?: HTMLElement) => void;
+ /**
+ * Add root node
+ */
+ observe: (root: HTMLElement) => void;
+ /**
+ * Remove root node
+ */
+ stopObserving: (root: HTMLElement) => void;
+ /**
+ * Pause observer
+ */
+ pauseObserver: (root?: HTMLElement) => void;
+ /**
+ * Resume observer
+ */
+ resumeObserver: (root?: HTMLElement) => void;
+}
+
+/**
+ * Iconify interface
+ */
+export declare interface IconifyGlobal extends IconifyStorageFunctions, IconifyBuilderFunctions, IconifyCommonFunctions, IconifyBrowserCacheFunctions, IconifyAPIFunctions {
+ _api: IconifyAPIInternalFunctions;
+}
+
+export { IconifyIcon }
+
+/**
+ * Interface for getSVGData() result
+ */
+export declare interface IconifyIconBuildResult {
+ attributes: {
+ width?: string;
+ height?: string;
+ viewBox: string;
+ };
+ body: string;
+}
+
+/**
+ * Add inline to customisations
+ */
+export declare interface IconifyIconCustomisations extends IconifyIconCustomisations_2 {
+ inline?: boolean;
+}
+
+/**
+ * Icon customisations
+ */
+declare interface IconifyIconCustomisations_2 extends IconifyTransformations, IconifyIconSizeCustomisations {
+}
+
+/**
+ * Function to abort loading (usually just removes callback because loading is already in progress)
+ */
+export declare type IconifyIconLoaderAbort = () => void;
+
+/**
+ * Loader callback
+ *
+ * Provides list of icons that have been loaded
+ */
+export declare type IconifyIconLoaderCallback = (loaded: IconifyIconName[], missing: IconifyIconName[], pending: IconifyIconName[], unsubscribe: IconifyIconLoaderAbort) => void;
+
+/**
+ * Icon name
+ */
+export declare interface IconifyIconName {
+ readonly provider: string;
+ readonly prefix: string;
+ readonly name: string;
+}
+
+/**
+ * Icon size
+ */
+export declare type IconifyIconSize = null | string | number;
+
+/**
+ * Dimensions
+ */
+declare interface IconifyIconSizeCustomisations {
+ width?: IconifyIconSize;
+ height?: IconifyIconSize;
+}
+
+export { IconifyJSON }
+
+/**
+ * Function to load icons
+ */
+declare type IconifyLoadIcons = (icons: (IconifyIconName | string)[], callback?: IconifyIconLoaderCallback) => IconifyIconLoaderAbort;
+
+/**
+ * Icon render mode
+ *
+ * 'style' = 'bg' or 'mask', depending on icon content
+ * 'bg' = add inline style to placeholder using `background`
+ * 'mask' = add inline style to placeholder using `mask`
+ * 'svg' =
+ */
+export declare type IconifyRenderMode = 'style' | 'bg' | 'mask' | 'svg';
+
+/**
+ * Interface for exported storage functions
+ */
+export declare interface IconifyStorageFunctions {
+ /**
+ * Check if icon exists
+ */
+ iconExists: (name: string) => boolean;
+ /**
+ * Get icon data with all properties
+ */
+ getIcon: (name: string) => Required | null;
+ /**
+ * List all available icons
+ */
+ listIcons: (provider?: string, prefix?: string) => string[];
+ /**
+ * Add icon to storage
+ */
+ addIcon: (name: string, data: IconifyIcon) => boolean;
+ /**
+ * Add icon set to storage
+ */
+ addCollection: (data: IconifyJSON, provider?: string) => boolean;
+}
+
+/**
+ * List available icons
+ */
+export declare function listIcons(provider?: string, prefix?: string): string[];
+
+/**
+ * Load one icon using Promise
+ */
+export declare const loadIcon: (icon: IconifyIconName | string) => Promise>;
+
+/**
+ * Load icons
+ */
+export declare const loadIcons: IconifyLoadIcons;
+
+/**
+ * Observe node
+ */
+export declare function observe(root: HTMLElement, autoRemove?: boolean): ObservedNode;
+
+/**
+ * Observed node type
+ */
+declare interface ObservedNode {
+ node: HTMLElement | GetHTMLElement;
+ temporary?: boolean;
+ observer?: {
+ instance?: MutationObserver;
+ paused: number;
+ pendingScan?: unknown;
+ };
+}
+
+export declare type PartialIconifyAPIConfig = Partial & Pick;
+
+/**
+ * Pause observer
+ */
+export declare function pauseObserver(root?: HTMLElement): void;
+
+/**
+ * Callback for "abort" pending item.
+ */
+declare type QueryAbortCallback = () => void;
+
+/**
+ * Callback
+ *
+ * If error is present, something went wrong and data is undefined. If error is undefined, data is set.
+ */
+declare type QueryDoneCallback = (data?: QueryModuleResponseData, error?: QueryModuleResponseData) => void;
+
+declare type QueryModuleResponse = (status: QueryModuleResponseType, data: QueryModuleResponseData) => void;
+
+/**
+ * Response from query module
+ */
+declare type QueryModuleResponseData = unknown;
+
+/**
+ * Response from query module
+ */
+declare type QueryModuleResponseType = 'success' | 'next' | 'abort';
+
+/**
+ * Configuration object
+ */
+declare interface RedundancyConfig {
+ resources: RedundancyResource[];
+ index: number;
+ timeout: number;
+ rotate: number;
+ random: boolean;
+ dataAfterTimeout: boolean;
+}
+
+/**
+ * Resource to rotate (usually hostname or partial URL)
+ */
+declare type RedundancyResource = string;
+
+/**
+ * Generate SVG as string
+ */
+export declare function renderHTML(name: string, customisations?: IconifyIconCustomisations_2): string | null;
+
+/**
+ * Get rendered icon as object that can be used to create SVG (use replaceIDs on body)
+ */
+export declare function renderIcon(name: string, customisations?: IconifyIconCustomisations_2): IconifyIconBuildResult | null;
+
+/**
+ * Generate SVG element
+ */
+export declare function renderSVG(name: string, customisations?: IconifyIconCustomisations_2): SVGElement | null;
+
+/**
+ * IDs usage:
+ *
+ * id="{id}"
+ * xlink:href="#{id}"
+ * url(#{id})
+ *
+ * From SVG animations:
+ *
+ * begin="0;{id}.end"
+ * begin="{id}.end"
+ * begin="{id}.click"
+ */
+/**
+ * Replace IDs in SVG output with unique IDs
+ */
+export declare function replaceIDs(body: string, prefix?: string | ((id: string) => string)): string;
+
+/**
+ * Resume observer
+ */
+export declare function resumeObserver(root?: HTMLElement): void;
+
+/**
+ * Scan DOM
+ */
+export declare function scan(root?: HTMLElement): void;
+
+/**
+ * Remove observed node
+ */
+export declare function stopObserving(root: HTMLElement): void;
+
+export { }
diff --git a/node_modules/@iconify/iconify/dist/iconify.js b/node_modules/@iconify/iconify/dist/iconify.js
new file mode 100644
index 0000000..069a4bb
--- /dev/null
+++ b/node_modules/@iconify/iconify/dist/iconify.js
@@ -0,0 +1,2669 @@
+/**
+* (c) Iconify
+*
+* For the full copyright and license information, please view the license.txt or license.gpl.txt
+* files at https://github.com/iconify/iconify
+*
+* Licensed under MIT.
+*
+* @license MIT
+* @version 3.1.1
+*/
+var Iconify = (function (exports) {
+ 'use strict';
+
+ const defaultIconDimensions = Object.freeze(
+ {
+ left: 0,
+ top: 0,
+ width: 16,
+ height: 16
+ }
+ );
+ const defaultIconTransformations = Object.freeze({
+ rotate: 0,
+ vFlip: false,
+ hFlip: false
+ });
+ const defaultIconProps = Object.freeze({
+ ...defaultIconDimensions,
+ ...defaultIconTransformations
+ });
+ const defaultExtendedIconProps = Object.freeze({
+ ...defaultIconProps,
+ body: "",
+ hidden: false
+ });
+
+ function mergeIconTransformations(obj1, obj2) {
+ const result = {};
+ if (!obj1.hFlip !== !obj2.hFlip) {
+ result.hFlip = true;
+ }
+ if (!obj1.vFlip !== !obj2.vFlip) {
+ result.vFlip = true;
+ }
+ const rotate = ((obj1.rotate || 0) + (obj2.rotate || 0)) % 4;
+ if (rotate) {
+ result.rotate = rotate;
+ }
+ return result;
+ }
+
+ function mergeIconData(parent, child) {
+ const result = mergeIconTransformations(parent, child);
+ for (const key in defaultExtendedIconProps) {
+ if (key in defaultIconTransformations) {
+ if (key in parent && !(key in result)) {
+ result[key] = defaultIconTransformations[key];
+ }
+ } else if (key in child) {
+ result[key] = child[key];
+ } else if (key in parent) {
+ result[key] = parent[key];
+ }
+ }
+ return result;
+ }
+
+ function getIconsTree(data, names) {
+ const icons = data.icons;
+ const aliases = data.aliases || /* @__PURE__ */ Object.create(null);
+ const resolved = /* @__PURE__ */ Object.create(null);
+ function resolve(name) {
+ if (icons[name]) {
+ return resolved[name] = [];
+ }
+ if (!(name in resolved)) {
+ resolved[name] = null;
+ const parent = aliases[name] && aliases[name].parent;
+ const value = parent && resolve(parent);
+ if (value) {
+ resolved[name] = [parent].concat(value);
+ }
+ }
+ return resolved[name];
+ }
+ (names || Object.keys(icons).concat(Object.keys(aliases))).forEach(resolve);
+ return resolved;
+ }
+
+ function internalGetIconData(data, name, tree) {
+ const icons = data.icons;
+ const aliases = data.aliases || /* @__PURE__ */ Object.create(null);
+ let currentProps = {};
+ function parse(name2) {
+ currentProps = mergeIconData(
+ icons[name2] || aliases[name2],
+ currentProps
+ );
+ }
+ parse(name);
+ tree.forEach(parse);
+ return mergeIconData(data, currentProps);
+ }
+
+ function parseIconSet(data, callback) {
+ const names = [];
+ if (typeof data !== "object" || typeof data.icons !== "object") {
+ return names;
+ }
+ if (data.not_found instanceof Array) {
+ data.not_found.forEach((name) => {
+ callback(name, null);
+ names.push(name);
+ });
+ }
+ const tree = getIconsTree(data);
+ for (const name in tree) {
+ const item = tree[name];
+ if (item) {
+ callback(name, internalGetIconData(data, name, item));
+ names.push(name);
+ }
+ }
+ return names;
+ }
+
+ const matchIconName = /^[a-z0-9]+(-[a-z0-9]+)*$/;
+ const stringToIcon = (value, validate, allowSimpleName, provider = "") => {
+ const colonSeparated = value.split(":");
+ if (value.slice(0, 1) === "@") {
+ if (colonSeparated.length < 2 || colonSeparated.length > 3) {
+ return null;
+ }
+ provider = colonSeparated.shift().slice(1);
+ }
+ if (colonSeparated.length > 3 || !colonSeparated.length) {
+ return null;
+ }
+ if (colonSeparated.length > 1) {
+ const name2 = colonSeparated.pop();
+ const prefix = colonSeparated.pop();
+ const result = {
+ // Allow provider without '@': "provider:prefix:name"
+ provider: colonSeparated.length > 0 ? colonSeparated[0] : provider,
+ prefix,
+ name: name2
+ };
+ return validate && !validateIconName(result) ? null : result;
+ }
+ const name = colonSeparated[0];
+ const dashSeparated = name.split("-");
+ if (dashSeparated.length > 1) {
+ const result = {
+ provider,
+ prefix: dashSeparated.shift(),
+ name: dashSeparated.join("-")
+ };
+ return validate && !validateIconName(result) ? null : result;
+ }
+ if (allowSimpleName && provider === "") {
+ const result = {
+ provider,
+ prefix: "",
+ name
+ };
+ return validate && !validateIconName(result, allowSimpleName) ? null : result;
+ }
+ return null;
+ };
+ const validateIconName = (icon, allowSimpleName) => {
+ if (!icon) {
+ return false;
+ }
+ return !!((icon.provider === "" || icon.provider.match(matchIconName)) && (allowSimpleName && icon.prefix === "" || icon.prefix.match(matchIconName)) && icon.name.match(matchIconName));
+ };
+
+ const optionalPropertyDefaults = {
+ provider: "",
+ aliases: {},
+ not_found: {},
+ ...defaultIconDimensions
+ };
+ function checkOptionalProps(item, defaults) {
+ for (const prop in defaults) {
+ if (prop in item && typeof item[prop] !== typeof defaults[prop]) {
+ return false;
+ }
+ }
+ return true;
+ }
+ function quicklyValidateIconSet(obj) {
+ if (typeof obj !== "object" || obj === null) {
+ return null;
+ }
+ const data = obj;
+ if (typeof data.prefix !== "string" || !obj.icons || typeof obj.icons !== "object") {
+ return null;
+ }
+ if (!checkOptionalProps(obj, optionalPropertyDefaults)) {
+ return null;
+ }
+ const icons = data.icons;
+ for (const name in icons) {
+ const icon = icons[name];
+ if (!name.match(matchIconName) || typeof icon.body !== "string" || !checkOptionalProps(
+ icon,
+ defaultExtendedIconProps
+ )) {
+ return null;
+ }
+ }
+ const aliases = data.aliases || /* @__PURE__ */ Object.create(null);
+ for (const name in aliases) {
+ const icon = aliases[name];
+ const parent = icon.parent;
+ if (!name.match(matchIconName) || typeof parent !== "string" || !icons[parent] && !aliases[parent] || !checkOptionalProps(
+ icon,
+ defaultExtendedIconProps
+ )) {
+ return null;
+ }
+ }
+ return data;
+ }
+
+ const dataStorage = /* @__PURE__ */ Object.create(null);
+ function newStorage(provider, prefix) {
+ return {
+ provider,
+ prefix,
+ icons: /* @__PURE__ */ Object.create(null),
+ missing: /* @__PURE__ */ new Set()
+ };
+ }
+ function getStorage(provider, prefix) {
+ const providerStorage = dataStorage[provider] || (dataStorage[provider] = /* @__PURE__ */ Object.create(null));
+ return providerStorage[prefix] || (providerStorage[prefix] = newStorage(provider, prefix));
+ }
+ function addIconSet(storage, data) {
+ if (!quicklyValidateIconSet(data)) {
+ return [];
+ }
+ return parseIconSet(data, (name, icon) => {
+ if (icon) {
+ storage.icons[name] = icon;
+ } else {
+ storage.missing.add(name);
+ }
+ });
+ }
+ function addIconToStorage(storage, name, icon) {
+ try {
+ if (typeof icon.body === "string") {
+ storage.icons[name] = { ...icon };
+ return true;
+ }
+ } catch (err) {
+ }
+ return false;
+ }
+ function listIcons(provider, prefix) {
+ let allIcons = [];
+ const providers = typeof provider === "string" ? [provider] : Object.keys(dataStorage);
+ providers.forEach((provider2) => {
+ const prefixes = typeof provider2 === "string" && typeof prefix === "string" ? [prefix] : Object.keys(dataStorage[provider2] || {});
+ prefixes.forEach((prefix2) => {
+ const storage = getStorage(provider2, prefix2);
+ allIcons = allIcons.concat(
+ Object.keys(storage.icons).map(
+ (name) => (provider2 !== "" ? "@" + provider2 + ":" : "") + prefix2 + ":" + name
+ )
+ );
+ });
+ });
+ return allIcons;
+ }
+
+ let simpleNames = false;
+ function allowSimpleNames(allow) {
+ if (typeof allow === "boolean") {
+ simpleNames = allow;
+ }
+ return simpleNames;
+ }
+ function getIconData(name) {
+ const icon = typeof name === "string" ? stringToIcon(name, true, simpleNames) : name;
+ if (icon) {
+ const storage = getStorage(icon.provider, icon.prefix);
+ const iconName = icon.name;
+ return storage.icons[iconName] || (storage.missing.has(iconName) ? null : void 0);
+ }
+ }
+ function addIcon(name, data) {
+ const icon = stringToIcon(name, true, simpleNames);
+ if (!icon) {
+ return false;
+ }
+ const storage = getStorage(icon.provider, icon.prefix);
+ return addIconToStorage(storage, icon.name, data);
+ }
+ function addCollection(data, provider) {
+ if (typeof data !== "object") {
+ return false;
+ }
+ if (typeof provider !== "string") {
+ provider = data.provider || "";
+ }
+ if (simpleNames && !provider && !data.prefix) {
+ let added = false;
+ if (quicklyValidateIconSet(data)) {
+ data.prefix = "";
+ parseIconSet(data, (name, icon) => {
+ if (icon && addIcon(name, icon)) {
+ added = true;
+ }
+ });
+ }
+ return added;
+ }
+ const prefix = data.prefix;
+ if (!validateIconName({
+ provider,
+ prefix,
+ name: "a"
+ })) {
+ return false;
+ }
+ const storage = getStorage(provider, prefix);
+ return !!addIconSet(storage, data);
+ }
+ function iconExists(name) {
+ return !!getIconData(name);
+ }
+ function getIcon(name) {
+ const result = getIconData(name);
+ return result ? {
+ ...defaultIconProps,
+ ...result
+ } : null;
+ }
+
+ const defaultIconSizeCustomisations = Object.freeze({
+ width: null,
+ height: null
+ });
+ const defaultIconCustomisations = Object.freeze({
+ // Dimensions
+ ...defaultIconSizeCustomisations,
+ // Transformations
+ ...defaultIconTransformations
+ });
+
+ const unitsSplit = /(-?[0-9.]*[0-9]+[0-9.]*)/g;
+ const unitsTest = /^-?[0-9.]*[0-9]+[0-9.]*$/g;
+ function calculateSize(size, ratio, precision) {
+ if (ratio === 1) {
+ return size;
+ }
+ precision = precision || 100;
+ if (typeof size === "number") {
+ return Math.ceil(size * ratio * precision) / precision;
+ }
+ if (typeof size !== "string") {
+ return size;
+ }
+ const oldParts = size.split(unitsSplit);
+ if (oldParts === null || !oldParts.length) {
+ return size;
+ }
+ const newParts = [];
+ let code = oldParts.shift();
+ let isNumber = unitsTest.test(code);
+ while (true) {
+ if (isNumber) {
+ const num = parseFloat(code);
+ if (isNaN(num)) {
+ newParts.push(code);
+ } else {
+ newParts.push(Math.ceil(num * ratio * precision) / precision);
+ }
+ } else {
+ newParts.push(code);
+ }
+ code = oldParts.shift();
+ if (code === void 0) {
+ return newParts.join("");
+ }
+ isNumber = !isNumber;
+ }
+ }
+
+ const isUnsetKeyword = (value) => value === "unset" || value === "undefined" || value === "none";
+ function iconToSVG(icon, customisations) {
+ const fullIcon = {
+ ...defaultIconProps,
+ ...icon
+ };
+ const fullCustomisations = {
+ ...defaultIconCustomisations,
+ ...customisations
+ };
+ const box = {
+ left: fullIcon.left,
+ top: fullIcon.top,
+ width: fullIcon.width,
+ height: fullIcon.height
+ };
+ let body = fullIcon.body;
+ [fullIcon, fullCustomisations].forEach((props) => {
+ const transformations = [];
+ const hFlip = props.hFlip;
+ const vFlip = props.vFlip;
+ let rotation = props.rotate;
+ if (hFlip) {
+ if (vFlip) {
+ rotation += 2;
+ } else {
+ transformations.push(
+ "translate(" + (box.width + box.left).toString() + " " + (0 - box.top).toString() + ")"
+ );
+ transformations.push("scale(-1 1)");
+ box.top = box.left = 0;
+ }
+ } else if (vFlip) {
+ transformations.push(
+ "translate(" + (0 - box.left).toString() + " " + (box.height + box.top).toString() + ")"
+ );
+ transformations.push("scale(1 -1)");
+ box.top = box.left = 0;
+ }
+ let tempValue;
+ if (rotation < 0) {
+ rotation -= Math.floor(rotation / 4) * 4;
+ }
+ rotation = rotation % 4;
+ switch (rotation) {
+ case 1:
+ tempValue = box.height / 2 + box.top;
+ transformations.unshift(
+ "rotate(90 " + tempValue.toString() + " " + tempValue.toString() + ")"
+ );
+ break;
+ case 2:
+ transformations.unshift(
+ "rotate(180 " + (box.width / 2 + box.left).toString() + " " + (box.height / 2 + box.top).toString() + ")"
+ );
+ break;
+ case 3:
+ tempValue = box.width / 2 + box.left;
+ transformations.unshift(
+ "rotate(-90 " + tempValue.toString() + " " + tempValue.toString() + ")"
+ );
+ break;
+ }
+ if (rotation % 2 === 1) {
+ if (box.left !== box.top) {
+ tempValue = box.left;
+ box.left = box.top;
+ box.top = tempValue;
+ }
+ if (box.width !== box.height) {
+ tempValue = box.width;
+ box.width = box.height;
+ box.height = tempValue;
+ }
+ }
+ if (transformations.length) {
+ body = '' + body + " ";
+ }
+ });
+ const customisationsWidth = fullCustomisations.width;
+ const customisationsHeight = fullCustomisations.height;
+ const boxWidth = box.width;
+ const boxHeight = box.height;
+ let width;
+ let height;
+ if (customisationsWidth === null) {
+ height = customisationsHeight === null ? "1em" : customisationsHeight === "auto" ? boxHeight : customisationsHeight;
+ width = calculateSize(height, boxWidth / boxHeight);
+ } else {
+ width = customisationsWidth === "auto" ? boxWidth : customisationsWidth;
+ height = customisationsHeight === null ? calculateSize(width, boxHeight / boxWidth) : customisationsHeight === "auto" ? boxHeight : customisationsHeight;
+ }
+ const attributes = {};
+ const setAttr = (prop, value) => {
+ if (!isUnsetKeyword(value)) {
+ attributes[prop] = value.toString();
+ }
+ };
+ setAttr("width", width);
+ setAttr("height", height);
+ attributes.viewBox = box.left.toString() + " " + box.top.toString() + " " + boxWidth.toString() + " " + boxHeight.toString();
+ return {
+ attributes,
+ body
+ };
+ }
+
+ const regex = /\sid="(\S+)"/g;
+ const randomPrefix = "IconifyId" + Date.now().toString(16) + (Math.random() * 16777216 | 0).toString(16);
+ let counter = 0;
+ function replaceIDs(body, prefix = randomPrefix) {
+ const ids = [];
+ let match;
+ while (match = regex.exec(body)) {
+ ids.push(match[1]);
+ }
+ if (!ids.length) {
+ return body;
+ }
+ const suffix = "suffix" + (Math.random() * 16777216 | Date.now()).toString(16);
+ ids.forEach((id) => {
+ const newID = typeof prefix === "function" ? prefix(id) : prefix + (counter++).toString();
+ const escapedID = id.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
+ body = body.replace(
+ // Allowed characters before id: [#;"]
+ // Allowed characters after id: [)"], .[a-z]
+ new RegExp('([#;"])(' + escapedID + ')([")]|\\.[a-z])', "g"),
+ "$1" + newID + suffix + "$3"
+ );
+ });
+ body = body.replace(new RegExp(suffix, "g"), "");
+ return body;
+ }
+
+ const browserStorageConfig = {
+ local: true,
+ session: true
+ };
+ const browserStorageEmptyItems = {
+ local: /* @__PURE__ */ new Set(),
+ session: /* @__PURE__ */ new Set()
+ };
+ let browserStorageStatus = false;
+ function setBrowserStorageStatus(status) {
+ browserStorageStatus = status;
+ }
+
+ const browserCacheVersion = "iconify2";
+ const browserCachePrefix = "iconify";
+ const browserCacheCountKey = browserCachePrefix + "-count";
+ const browserCacheVersionKey = browserCachePrefix + "-version";
+ const browserStorageHour = 36e5;
+ const browserStorageCacheExpiration = 168;
+
+ function getStoredItem(func, key) {
+ try {
+ return func.getItem(key);
+ } catch (err) {
+ }
+ }
+ function setStoredItem(func, key, value) {
+ try {
+ func.setItem(key, value);
+ return true;
+ } catch (err) {
+ }
+ }
+ function removeStoredItem(func, key) {
+ try {
+ func.removeItem(key);
+ } catch (err) {
+ }
+ }
+
+ function setBrowserStorageItemsCount(storage, value) {
+ return setStoredItem(storage, browserCacheCountKey, value.toString());
+ }
+ function getBrowserStorageItemsCount(storage) {
+ return parseInt(getStoredItem(storage, browserCacheCountKey)) || 0;
+ }
+
+ let _window = typeof window === "undefined" ? {} : window;
+ function getBrowserStorage(key) {
+ const attr = key + "Storage";
+ try {
+ if (_window && _window[attr] && typeof _window[attr].length === "number") {
+ return _window[attr];
+ }
+ } catch (err) {
+ }
+ browserStorageConfig[key] = false;
+ }
+
+ function iterateBrowserStorage(key, callback) {
+ const func = getBrowserStorage(key);
+ if (!func) {
+ return;
+ }
+ const version = getStoredItem(func, browserCacheVersionKey);
+ if (version !== browserCacheVersion) {
+ if (version) {
+ const total2 = getBrowserStorageItemsCount(func);
+ for (let i = 0; i < total2; i++) {
+ removeStoredItem(func, browserCachePrefix + i.toString());
+ }
+ }
+ setStoredItem(func, browserCacheVersionKey, browserCacheVersion);
+ setBrowserStorageItemsCount(func, 0);
+ return;
+ }
+ const minTime = Math.floor(Date.now() / browserStorageHour) - browserStorageCacheExpiration;
+ const parseItem = (index) => {
+ const name = browserCachePrefix + index.toString();
+ const item = getStoredItem(func, name);
+ if (typeof item !== "string") {
+ return;
+ }
+ try {
+ const data = JSON.parse(item);
+ if (typeof data === "object" && typeof data.cached === "number" && data.cached > minTime && typeof data.provider === "string" && typeof data.data === "object" && typeof data.data.prefix === "string" && // Valid item: run callback
+ callback(data, index)) {
+ return true;
+ }
+ } catch (err) {
+ }
+ removeStoredItem(func, name);
+ };
+ let total = getBrowserStorageItemsCount(func);
+ for (let i = total - 1; i >= 0; i--) {
+ if (!parseItem(i)) {
+ if (i === total - 1) {
+ total--;
+ setBrowserStorageItemsCount(func, total);
+ } else {
+ browserStorageEmptyItems[key].add(i);
+ }
+ }
+ }
+ }
+
+ function initBrowserStorage() {
+ if (browserStorageStatus) {
+ return;
+ }
+ setBrowserStorageStatus(true);
+ for (const key in browserStorageConfig) {
+ iterateBrowserStorage(key, (item) => {
+ const iconSet = item.data;
+ const provider = item.provider;
+ const prefix = iconSet.prefix;
+ const storage = getStorage(
+ provider,
+ prefix
+ );
+ if (!addIconSet(storage, iconSet).length) {
+ return false;
+ }
+ const lastModified = iconSet.lastModified || -1;
+ storage.lastModifiedCached = storage.lastModifiedCached ? Math.min(storage.lastModifiedCached, lastModified) : lastModified;
+ return true;
+ });
+ }
+ }
+
+ function toggleBrowserCache(storage, value) {
+ switch (storage) {
+ case "local":
+ case "session":
+ browserStorageConfig[storage] = value;
+ break;
+ case "all":
+ for (const key in browserStorageConfig) {
+ browserStorageConfig[key] = value;
+ }
+ break;
+ }
+ }
+
+ const storage = /* @__PURE__ */ Object.create(null);
+ function setAPIModule(provider, item) {
+ storage[provider] = item;
+ }
+ function getAPIModule(provider) {
+ return storage[provider] || storage[""];
+ }
+
+ function createAPIConfig(source) {
+ let resources;
+ if (typeof source.resources === "string") {
+ resources = [source.resources];
+ } else {
+ resources = source.resources;
+ if (!(resources instanceof Array) || !resources.length) {
+ return null;
+ }
+ }
+ const result = {
+ // API hosts
+ resources,
+ // Root path
+ path: source.path || "/",
+ // URL length limit
+ maxURL: source.maxURL || 500,
+ // Timeout before next host is used.
+ rotate: source.rotate || 750,
+ // Timeout before failing query.
+ timeout: source.timeout || 5e3,
+ // Randomise default API end point.
+ random: source.random === true,
+ // Start index
+ index: source.index || 0,
+ // Receive data after time out (used if time out kicks in first, then API module sends data anyway).
+ dataAfterTimeout: source.dataAfterTimeout !== false
+ };
+ return result;
+ }
+ const configStorage = /* @__PURE__ */ Object.create(null);
+ const fallBackAPISources = [
+ "https://api.simplesvg.com",
+ "https://api.unisvg.com"
+ ];
+ const fallBackAPI = [];
+ while (fallBackAPISources.length > 0) {
+ if (fallBackAPISources.length === 1) {
+ fallBackAPI.push(fallBackAPISources.shift());
+ } else {
+ if (Math.random() > 0.5) {
+ fallBackAPI.push(fallBackAPISources.shift());
+ } else {
+ fallBackAPI.push(fallBackAPISources.pop());
+ }
+ }
+ }
+ configStorage[""] = createAPIConfig({
+ resources: ["https://api.iconify.design"].concat(fallBackAPI)
+ });
+ function addAPIProvider(provider, customConfig) {
+ const config = createAPIConfig(customConfig);
+ if (config === null) {
+ return false;
+ }
+ configStorage[provider] = config;
+ return true;
+ }
+ function getAPIConfig(provider) {
+ return configStorage[provider];
+ }
+ function listAPIProviders() {
+ return Object.keys(configStorage);
+ }
+
+ const detectFetch = () => {
+ let callback;
+ try {
+ callback = fetch;
+ if (typeof callback === "function") {
+ return callback;
+ }
+ } catch (err) {
+ }
+ };
+ let fetchModule = detectFetch();
+ function setFetch(fetch2) {
+ fetchModule = fetch2;
+ }
+ function getFetch() {
+ return fetchModule;
+ }
+ function calculateMaxLength(provider, prefix) {
+ const config = getAPIConfig(provider);
+ if (!config) {
+ return 0;
+ }
+ let result;
+ if (!config.maxURL) {
+ result = 0;
+ } else {
+ let maxHostLength = 0;
+ config.resources.forEach((item) => {
+ const host = item;
+ maxHostLength = Math.max(maxHostLength, host.length);
+ });
+ const url = prefix + ".json?icons=";
+ result = config.maxURL - maxHostLength - config.path.length - url.length;
+ }
+ return result;
+ }
+ function shouldAbort(status) {
+ return status === 404;
+ }
+ const prepare = (provider, prefix, icons) => {
+ const results = [];
+ const maxLength = calculateMaxLength(provider, prefix);
+ const type = "icons";
+ let item = {
+ type,
+ provider,
+ prefix,
+ icons: []
+ };
+ let length = 0;
+ icons.forEach((name, index) => {
+ length += name.length + 1;
+ if (length >= maxLength && index > 0) {
+ results.push(item);
+ item = {
+ type,
+ provider,
+ prefix,
+ icons: []
+ };
+ length = name.length;
+ }
+ item.icons.push(name);
+ });
+ results.push(item);
+ return results;
+ };
+ function getPath(provider) {
+ if (typeof provider === "string") {
+ const config = getAPIConfig(provider);
+ if (config) {
+ return config.path;
+ }
+ }
+ return "/";
+ }
+ const send = (host, params, callback) => {
+ if (!fetchModule) {
+ callback("abort", 424);
+ return;
+ }
+ let path = getPath(params.provider);
+ switch (params.type) {
+ case "icons": {
+ const prefix = params.prefix;
+ const icons = params.icons;
+ const iconsList = icons.join(",");
+ const urlParams = new URLSearchParams({
+ icons: iconsList
+ });
+ path += prefix + ".json?" + urlParams.toString();
+ break;
+ }
+ case "custom": {
+ const uri = params.uri;
+ path += uri.slice(0, 1) === "/" ? uri.slice(1) : uri;
+ break;
+ }
+ default:
+ callback("abort", 400);
+ return;
+ }
+ let defaultError = 503;
+ fetchModule(host + path).then((response) => {
+ const status = response.status;
+ if (status !== 200) {
+ setTimeout(() => {
+ callback(shouldAbort(status) ? "abort" : "next", status);
+ });
+ return;
+ }
+ defaultError = 501;
+ return response.json();
+ }).then((data) => {
+ if (typeof data !== "object" || data === null) {
+ setTimeout(() => {
+ if (data === 404) {
+ callback("abort", data);
+ } else {
+ callback("next", defaultError);
+ }
+ });
+ return;
+ }
+ setTimeout(() => {
+ callback("success", data);
+ });
+ }).catch(() => {
+ callback("next", defaultError);
+ });
+ };
+ const fetchAPIModule = {
+ prepare,
+ send
+ };
+
+ function sortIcons(icons) {
+ const result = {
+ loaded: [],
+ missing: [],
+ pending: []
+ };
+ const storage = /* @__PURE__ */ Object.create(null);
+ icons.sort((a, b) => {
+ if (a.provider !== b.provider) {
+ return a.provider.localeCompare(b.provider);
+ }
+ if (a.prefix !== b.prefix) {
+ return a.prefix.localeCompare(b.prefix);
+ }
+ return a.name.localeCompare(b.name);
+ });
+ let lastIcon = {
+ provider: "",
+ prefix: "",
+ name: ""
+ };
+ icons.forEach((icon) => {
+ if (lastIcon.name === icon.name && lastIcon.prefix === icon.prefix && lastIcon.provider === icon.provider) {
+ return;
+ }
+ lastIcon = icon;
+ const provider = icon.provider;
+ const prefix = icon.prefix;
+ const name = icon.name;
+ const providerStorage = storage[provider] || (storage[provider] = /* @__PURE__ */ Object.create(null));
+ const localStorage = providerStorage[prefix] || (providerStorage[prefix] = getStorage(provider, prefix));
+ let list;
+ if (name in localStorage.icons) {
+ list = result.loaded;
+ } else if (prefix === "" || localStorage.missing.has(name)) {
+ list = result.missing;
+ } else {
+ list = result.pending;
+ }
+ const item = {
+ provider,
+ prefix,
+ name
+ };
+ list.push(item);
+ });
+ return result;
+ }
+
+ function removeCallback(storages, id) {
+ storages.forEach((storage) => {
+ const items = storage.loaderCallbacks;
+ if (items) {
+ storage.loaderCallbacks = items.filter((row) => row.id !== id);
+ }
+ });
+ }
+ function updateCallbacks(storage) {
+ if (!storage.pendingCallbacksFlag) {
+ storage.pendingCallbacksFlag = true;
+ setTimeout(() => {
+ storage.pendingCallbacksFlag = false;
+ const items = storage.loaderCallbacks ? storage.loaderCallbacks.slice(0) : [];
+ if (!items.length) {
+ return;
+ }
+ let hasPending = false;
+ const provider = storage.provider;
+ const prefix = storage.prefix;
+ items.forEach((item) => {
+ const icons = item.icons;
+ const oldLength = icons.pending.length;
+ icons.pending = icons.pending.filter((icon) => {
+ if (icon.prefix !== prefix) {
+ return true;
+ }
+ const name = icon.name;
+ if (storage.icons[name]) {
+ icons.loaded.push({
+ provider,
+ prefix,
+ name
+ });
+ } else if (storage.missing.has(name)) {
+ icons.missing.push({
+ provider,
+ prefix,
+ name
+ });
+ } else {
+ hasPending = true;
+ return true;
+ }
+ return false;
+ });
+ if (icons.pending.length !== oldLength) {
+ if (!hasPending) {
+ removeCallback([storage], item.id);
+ }
+ item.callback(
+ icons.loaded.slice(0),
+ icons.missing.slice(0),
+ icons.pending.slice(0),
+ item.abort
+ );
+ }
+ });
+ });
+ }
+ }
+ let idCounter = 0;
+ function storeCallback(callback, icons, pendingSources) {
+ const id = idCounter++;
+ const abort = removeCallback.bind(null, pendingSources, id);
+ if (!icons.pending.length) {
+ return abort;
+ }
+ const item = {
+ id,
+ icons,
+ callback,
+ abort
+ };
+ pendingSources.forEach((storage) => {
+ (storage.loaderCallbacks || (storage.loaderCallbacks = [])).push(item);
+ });
+ return abort;
+ }
+
+ function listToIcons(list, validate = true, simpleNames = false) {
+ const result = [];
+ list.forEach((item) => {
+ const icon = typeof item === "string" ? stringToIcon(item, validate, simpleNames) : item;
+ if (icon) {
+ result.push(icon);
+ }
+ });
+ return result;
+ }
+
+ // src/config.ts
+ var defaultConfig = {
+ resources: [],
+ index: 0,
+ timeout: 2e3,
+ rotate: 750,
+ random: false,
+ dataAfterTimeout: false
+ };
+
+ // src/query.ts
+ function sendQuery(config, payload, query, done) {
+ const resourcesCount = config.resources.length;
+ const startIndex = config.random ? Math.floor(Math.random() * resourcesCount) : config.index;
+ let resources;
+ if (config.random) {
+ let list = config.resources.slice(0);
+ resources = [];
+ while (list.length > 1) {
+ const nextIndex = Math.floor(Math.random() * list.length);
+ resources.push(list[nextIndex]);
+ list = list.slice(0, nextIndex).concat(list.slice(nextIndex + 1));
+ }
+ resources = resources.concat(list);
+ } else {
+ resources = config.resources.slice(startIndex).concat(config.resources.slice(0, startIndex));
+ }
+ const startTime = Date.now();
+ let status = "pending";
+ let queriesSent = 0;
+ let lastError;
+ let timer = null;
+ let queue = [];
+ let doneCallbacks = [];
+ if (typeof done === "function") {
+ doneCallbacks.push(done);
+ }
+ function resetTimer() {
+ if (timer) {
+ clearTimeout(timer);
+ timer = null;
+ }
+ }
+ function abort() {
+ if (status === "pending") {
+ status = "aborted";
+ }
+ resetTimer();
+ queue.forEach((item) => {
+ if (item.status === "pending") {
+ item.status = "aborted";
+ }
+ });
+ queue = [];
+ }
+ function subscribe(callback, overwrite) {
+ if (overwrite) {
+ doneCallbacks = [];
+ }
+ if (typeof callback === "function") {
+ doneCallbacks.push(callback);
+ }
+ }
+ function getQueryStatus() {
+ return {
+ startTime,
+ payload,
+ status,
+ queriesSent,
+ queriesPending: queue.length,
+ subscribe,
+ abort
+ };
+ }
+ function failQuery() {
+ status = "failed";
+ doneCallbacks.forEach((callback) => {
+ callback(void 0, lastError);
+ });
+ }
+ function clearQueue() {
+ queue.forEach((item) => {
+ if (item.status === "pending") {
+ item.status = "aborted";
+ }
+ });
+ queue = [];
+ }
+ function moduleResponse(item, response, data) {
+ const isError = response !== "success";
+ queue = queue.filter((queued) => queued !== item);
+ switch (status) {
+ case "pending":
+ break;
+ case "failed":
+ if (isError || !config.dataAfterTimeout) {
+ return;
+ }
+ break;
+ default:
+ return;
+ }
+ if (response === "abort") {
+ lastError = data;
+ failQuery();
+ return;
+ }
+ if (isError) {
+ lastError = data;
+ if (!queue.length) {
+ if (!resources.length) {
+ failQuery();
+ } else {
+ execNext();
+ }
+ }
+ return;
+ }
+ resetTimer();
+ clearQueue();
+ if (!config.random) {
+ const index = config.resources.indexOf(item.resource);
+ if (index !== -1 && index !== config.index) {
+ config.index = index;
+ }
+ }
+ status = "completed";
+ doneCallbacks.forEach((callback) => {
+ callback(data);
+ });
+ }
+ function execNext() {
+ if (status !== "pending") {
+ return;
+ }
+ resetTimer();
+ const resource = resources.shift();
+ if (resource === void 0) {
+ if (queue.length) {
+ timer = setTimeout(() => {
+ resetTimer();
+ if (status === "pending") {
+ clearQueue();
+ failQuery();
+ }
+ }, config.timeout);
+ return;
+ }
+ failQuery();
+ return;
+ }
+ const item = {
+ status: "pending",
+ resource,
+ callback: (status2, data) => {
+ moduleResponse(item, status2, data);
+ }
+ };
+ queue.push(item);
+ queriesSent++;
+ timer = setTimeout(execNext, config.rotate);
+ query(resource, payload, item.callback);
+ }
+ setTimeout(execNext);
+ return getQueryStatus;
+ }
+
+ // src/index.ts
+ function initRedundancy(cfg) {
+ const config = {
+ ...defaultConfig,
+ ...cfg
+ };
+ let queries = [];
+ function cleanup() {
+ queries = queries.filter((item) => item().status === "pending");
+ }
+ function query(payload, queryCallback, doneCallback) {
+ const query2 = sendQuery(
+ config,
+ payload,
+ queryCallback,
+ (data, error) => {
+ cleanup();
+ if (doneCallback) {
+ doneCallback(data, error);
+ }
+ }
+ );
+ queries.push(query2);
+ return query2;
+ }
+ function find(callback) {
+ return queries.find((value) => {
+ return callback(value);
+ }) || null;
+ }
+ const instance = {
+ query,
+ find,
+ setIndex: (index) => {
+ config.index = index;
+ },
+ getIndex: () => config.index,
+ cleanup
+ };
+ return instance;
+ }
+
+ function emptyCallback$1() {
+ }
+ const redundancyCache = /* @__PURE__ */ Object.create(null);
+ function getRedundancyCache(provider) {
+ if (!redundancyCache[provider]) {
+ const config = getAPIConfig(provider);
+ if (!config) {
+ return;
+ }
+ const redundancy = initRedundancy(config);
+ const cachedReundancy = {
+ config,
+ redundancy
+ };
+ redundancyCache[provider] = cachedReundancy;
+ }
+ return redundancyCache[provider];
+ }
+ function sendAPIQuery(target, query, callback) {
+ let redundancy;
+ let send;
+ if (typeof target === "string") {
+ const api = getAPIModule(target);
+ if (!api) {
+ callback(void 0, 424);
+ return emptyCallback$1;
+ }
+ send = api.send;
+ const cached = getRedundancyCache(target);
+ if (cached) {
+ redundancy = cached.redundancy;
+ }
+ } else {
+ const config = createAPIConfig(target);
+ if (config) {
+ redundancy = initRedundancy(config);
+ const moduleKey = target.resources ? target.resources[0] : "";
+ const api = getAPIModule(moduleKey);
+ if (api) {
+ send = api.send;
+ }
+ }
+ }
+ if (!redundancy || !send) {
+ callback(void 0, 424);
+ return emptyCallback$1;
+ }
+ return redundancy.query(query, send, callback)().abort;
+ }
+
+ function updateLastModified(storage, lastModified) {
+ const lastValue = storage.lastModifiedCached;
+ if (
+ // Matches or newer
+ lastValue && lastValue >= lastModified
+ ) {
+ return lastValue === lastModified;
+ }
+ storage.lastModifiedCached = lastModified;
+ if (lastValue) {
+ for (const key in browserStorageConfig) {
+ iterateBrowserStorage(key, (item) => {
+ const iconSet = item.data;
+ return item.provider !== storage.provider || iconSet.prefix !== storage.prefix || iconSet.lastModified === lastModified;
+ });
+ }
+ }
+ return true;
+ }
+ function storeInBrowserStorage(storage, data) {
+ if (!browserStorageStatus) {
+ initBrowserStorage();
+ }
+ function store(key) {
+ let func;
+ if (!browserStorageConfig[key] || !(func = getBrowserStorage(key))) {
+ return;
+ }
+ const set = browserStorageEmptyItems[key];
+ let index;
+ if (set.size) {
+ set.delete(index = Array.from(set).shift());
+ } else {
+ index = getBrowserStorageItemsCount(func);
+ if (!setBrowserStorageItemsCount(func, index + 1)) {
+ return;
+ }
+ }
+ const item = {
+ cached: Math.floor(Date.now() / browserStorageHour),
+ provider: storage.provider,
+ data
+ };
+ return setStoredItem(
+ func,
+ browserCachePrefix + index.toString(),
+ JSON.stringify(item)
+ );
+ }
+ if (data.lastModified && !updateLastModified(storage, data.lastModified)) {
+ return;
+ }
+ if (!Object.keys(data.icons).length) {
+ return;
+ }
+ if (data.not_found) {
+ data = Object.assign({}, data);
+ delete data.not_found;
+ }
+ if (!store("local")) {
+ store("session");
+ }
+ }
+
+ function emptyCallback() {
+ }
+ function loadedNewIcons(storage) {
+ if (!storage.iconsLoaderFlag) {
+ storage.iconsLoaderFlag = true;
+ setTimeout(() => {
+ storage.iconsLoaderFlag = false;
+ updateCallbacks(storage);
+ });
+ }
+ }
+ function loadNewIcons(storage, icons) {
+ if (!storage.iconsToLoad) {
+ storage.iconsToLoad = icons;
+ } else {
+ storage.iconsToLoad = storage.iconsToLoad.concat(icons).sort();
+ }
+ if (!storage.iconsQueueFlag) {
+ storage.iconsQueueFlag = true;
+ setTimeout(() => {
+ storage.iconsQueueFlag = false;
+ const { provider, prefix } = storage;
+ const icons2 = storage.iconsToLoad;
+ delete storage.iconsToLoad;
+ let api;
+ if (!icons2 || !(api = getAPIModule(provider))) {
+ return;
+ }
+ const params = api.prepare(provider, prefix, icons2);
+ params.forEach((item) => {
+ sendAPIQuery(provider, item, (data) => {
+ if (typeof data !== "object") {
+ item.icons.forEach((name) => {
+ storage.missing.add(name);
+ });
+ } else {
+ try {
+ const parsed = addIconSet(
+ storage,
+ data
+ );
+ if (!parsed.length) {
+ return;
+ }
+ const pending = storage.pendingIcons;
+ if (pending) {
+ parsed.forEach((name) => {
+ pending.delete(name);
+ });
+ }
+ storeInBrowserStorage(storage, data);
+ } catch (err) {
+ console.error(err);
+ }
+ }
+ loadedNewIcons(storage);
+ });
+ });
+ });
+ }
+ }
+ const isPending = (icon) => {
+ const storage = getStorage(
+ icon.provider,
+ icon.prefix
+ );
+ const pending = storage.pendingIcons;
+ return !!(pending && pending.has(icon.name));
+ };
+ const loadIcons = (icons, callback) => {
+ const cleanedIcons = listToIcons(icons, true, allowSimpleNames());
+ const sortedIcons = sortIcons(cleanedIcons);
+ if (!sortedIcons.pending.length) {
+ let callCallback = true;
+ if (callback) {
+ setTimeout(() => {
+ if (callCallback) {
+ callback(
+ sortedIcons.loaded,
+ sortedIcons.missing,
+ sortedIcons.pending,
+ emptyCallback
+ );
+ }
+ });
+ }
+ return () => {
+ callCallback = false;
+ };
+ }
+ const newIcons = /* @__PURE__ */ Object.create(null);
+ const sources = [];
+ let lastProvider, lastPrefix;
+ sortedIcons.pending.forEach((icon) => {
+ const { provider, prefix } = icon;
+ if (prefix === lastPrefix && provider === lastProvider) {
+ return;
+ }
+ lastProvider = provider;
+ lastPrefix = prefix;
+ sources.push(getStorage(provider, prefix));
+ const providerNewIcons = newIcons[provider] || (newIcons[provider] = /* @__PURE__ */ Object.create(null));
+ if (!providerNewIcons[prefix]) {
+ providerNewIcons[prefix] = [];
+ }
+ });
+ sortedIcons.pending.forEach((icon) => {
+ const { provider, prefix, name } = icon;
+ const storage = getStorage(provider, prefix);
+ const pendingQueue = storage.pendingIcons || (storage.pendingIcons = /* @__PURE__ */ new Set());
+ if (!pendingQueue.has(name)) {
+ pendingQueue.add(name);
+ newIcons[provider][prefix].push(name);
+ }
+ });
+ sources.forEach((storage) => {
+ const { provider, prefix } = storage;
+ if (newIcons[provider][prefix].length) {
+ loadNewIcons(storage, newIcons[provider][prefix]);
+ }
+ });
+ return callback ? storeCallback(callback, sortedIcons, sources) : emptyCallback;
+ };
+ const loadIcon = (icon) => {
+ return new Promise((fulfill, reject) => {
+ const iconObj = typeof icon === "string" ? stringToIcon(icon, true) : icon;
+ if (!iconObj) {
+ reject(icon);
+ return;
+ }
+ loadIcons([iconObj || icon], (loaded) => {
+ if (loaded.length && iconObj) {
+ const data = getIconData(iconObj);
+ if (data) {
+ fulfill({
+ ...defaultIconProps,
+ ...data
+ });
+ return;
+ }
+ }
+ reject(icon);
+ });
+ });
+ };
+
+ function mergeCustomisations(defaults, item) {
+ const result = {
+ ...defaults
+ };
+ for (const key in item) {
+ const value = item[key];
+ const valueType = typeof value;
+ if (key in defaultIconSizeCustomisations) {
+ if (value === null || value && (valueType === "string" || valueType === "number")) {
+ result[key] = value;
+ }
+ } else if (valueType === typeof result[key]) {
+ result[key] = key === "rotate" ? value % 4 : value;
+ }
+ }
+ return result;
+ }
+
+ const defaultExtendedIconCustomisations = {
+ ...defaultIconCustomisations,
+ inline: false,
+ };
+ /**
+ * Class names
+ */
+ const blockClass = 'iconify';
+ const inlineClass = 'iconify-inline';
+ /**
+ * Names of properties to add to nodes
+ */
+ const elementDataProperty = ('iconifyData' + Date.now());
+
+ /**
+ * List of root nodes
+ */
+ let nodes = [];
+ /**
+ * Find node
+ */
+ function findRootNode(node) {
+ for (let i = 0; i < nodes.length; i++) {
+ const item = nodes[i];
+ const root = typeof item.node === 'function' ? item.node() : item.node;
+ if (root === node) {
+ return item;
+ }
+ }
+ }
+ /**
+ * Add extra root node
+ */
+ function addRootNode(root, autoRemove = false) {
+ let node = findRootNode(root);
+ if (node) {
+ // Node already exist: switch type if needed
+ if (node.temporary) {
+ node.temporary = autoRemove;
+ }
+ return node;
+ }
+ // Create item, add it to list
+ node = {
+ node: root,
+ temporary: autoRemove,
+ };
+ nodes.push(node);
+ return node;
+ }
+ /**
+ * Add document.body node
+ */
+ function addBodyNode() {
+ if (document.documentElement) {
+ return addRootNode(document.documentElement);
+ }
+ nodes.push({
+ node: () => {
+ return document.documentElement;
+ },
+ });
+ }
+ /**
+ * Remove root node
+ */
+ function removeRootNode(root) {
+ nodes = nodes.filter((node) => root !== node &&
+ root !== (typeof node.node === 'function' ? node.node() : node.node));
+ }
+ /**
+ * Get list of root nodes
+ */
+ function listRootNodes() {
+ return nodes;
+ }
+
+ /**
+ * Execute function when DOM is ready
+ */
+ function onReady(callback) {
+ const doc = document;
+ if (doc.readyState && doc.readyState !== 'loading') {
+ callback();
+ }
+ else {
+ doc.addEventListener('DOMContentLoaded', callback);
+ }
+ }
+
+ /**
+ * Callback
+ */
+ let callback = null;
+ /**
+ * Parameters for mutation observer
+ */
+ const observerParams = {
+ childList: true,
+ subtree: true,
+ attributes: true,
+ };
+ /**
+ * Queue DOM scan
+ */
+ function queueScan(node) {
+ if (!node.observer) {
+ return;
+ }
+ const observer = node.observer;
+ if (!observer.pendingScan) {
+ observer.pendingScan = setTimeout(() => {
+ delete observer.pendingScan;
+ if (callback) {
+ callback(node);
+ }
+ });
+ }
+ }
+ /**
+ * Check mutations for added nodes
+ */
+ function checkMutations(node, mutations) {
+ if (!node.observer) {
+ return;
+ }
+ const observer = node.observer;
+ if (!observer.pendingScan) {
+ for (let i = 0; i < mutations.length; i++) {
+ const item = mutations[i];
+ if (
+ // Check for added nodes
+ (item.addedNodes && item.addedNodes.length > 0) ||
+ // Check for icon or placeholder with modified attributes
+ (item.type === 'attributes' &&
+ item.target[elementDataProperty] !==
+ void 0)) {
+ if (!observer.paused) {
+ queueScan(node);
+ }
+ return;
+ }
+ }
+ }
+ }
+ /**
+ * Start/resume observer
+ */
+ function continueObserving(node, root) {
+ node.observer.instance.observe(root, observerParams);
+ }
+ /**
+ * Start mutation observer
+ */
+ function startObserver(node) {
+ let observer = node.observer;
+ if (observer && observer.instance) {
+ // Already started
+ return;
+ }
+ const root = typeof node.node === 'function' ? node.node() : node.node;
+ if (!root || !window) {
+ // document.body is not available yet or window is missing
+ return;
+ }
+ if (!observer) {
+ observer = {
+ paused: 0,
+ };
+ node.observer = observer;
+ }
+ // Create new instance, observe
+ observer.instance = new window.MutationObserver(checkMutations.bind(null, node));
+ continueObserving(node, root);
+ // Scan immediately
+ if (!observer.paused) {
+ queueScan(node);
+ }
+ }
+ /**
+ * Start all observers
+ */
+ function startObservers() {
+ listRootNodes().forEach(startObserver);
+ }
+ /**
+ * Stop observer
+ */
+ function stopObserver(node) {
+ if (!node.observer) {
+ return;
+ }
+ const observer = node.observer;
+ // Stop scan
+ if (observer.pendingScan) {
+ clearTimeout(observer.pendingScan);
+ delete observer.pendingScan;
+ }
+ // Disconnect observer
+ if (observer.instance) {
+ observer.instance.disconnect();
+ delete observer.instance;
+ }
+ }
+ /**
+ * Start observer when DOM is ready
+ */
+ function initObserver(cb) {
+ const isRestart = callback !== null;
+ if (callback !== cb) {
+ // Change callback and stop all pending observers
+ callback = cb;
+ if (isRestart) {
+ listRootNodes().forEach(stopObserver);
+ }
+ }
+ if (isRestart) {
+ // Restart instances
+ startObservers();
+ return;
+ }
+ // Start observers when document is ready
+ onReady(startObservers);
+ }
+ /**
+ * Pause observing node
+ */
+ function pauseObservingNode(node) {
+ (node ? [node] : listRootNodes()).forEach((node) => {
+ if (!node.observer) {
+ node.observer = {
+ paused: 1,
+ };
+ return;
+ }
+ const observer = node.observer;
+ observer.paused++;
+ if (observer.paused > 1 || !observer.instance) {
+ return;
+ }
+ // Disconnect observer
+ const instance = observer.instance;
+ // checkMutations(node, instance.takeRecords());
+ instance.disconnect();
+ });
+ }
+ /**
+ * Pause observer
+ */
+ function pauseObserver(root) {
+ if (root) {
+ const node = findRootNode(root);
+ if (node) {
+ pauseObservingNode(node);
+ }
+ }
+ else {
+ pauseObservingNode();
+ }
+ }
+ /**
+ * Resume observer
+ */
+ function resumeObservingNode(observer) {
+ (observer ? [observer] : listRootNodes()).forEach((node) => {
+ if (!node.observer) {
+ // Start observer
+ startObserver(node);
+ return;
+ }
+ const observer = node.observer;
+ if (observer.paused) {
+ observer.paused--;
+ if (!observer.paused) {
+ // Start / resume
+ const root = typeof node.node === 'function' ? node.node() : node.node;
+ if (!root) {
+ return;
+ }
+ else if (observer.instance) {
+ continueObserving(node, root);
+ }
+ else {
+ startObserver(node);
+ }
+ }
+ }
+ });
+ }
+ /**
+ * Resume observer
+ */
+ function resumeObserver(root) {
+ if (root) {
+ const node = findRootNode(root);
+ if (node) {
+ resumeObservingNode(node);
+ }
+ }
+ else {
+ resumeObservingNode();
+ }
+ }
+ /**
+ * Observe node
+ */
+ function observe(root, autoRemove = false) {
+ const node = addRootNode(root, autoRemove);
+ startObserver(node);
+ return node;
+ }
+ /**
+ * Remove observed node
+ */
+ function stopObserving(root) {
+ const node = findRootNode(root);
+ if (node) {
+ stopObserver(node);
+ removeRootNode(root);
+ }
+ }
+
+ /**
+ * Compare props
+ */
+ function propsChanged(props1, props2) {
+ if (props1.name !== props2.name || props1.mode !== props2.mode) {
+ return true;
+ }
+ const customisations1 = props1.customisations;
+ const customisations2 = props2.customisations;
+ for (const key in defaultExtendedIconCustomisations) {
+ if (customisations1[key] !== customisations2[key]) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ function rotateFromString(value, defaultValue = 0) {
+ const units = value.replace(/^-?[0-9.]*/, "");
+ function cleanup(value2) {
+ while (value2 < 0) {
+ value2 += 4;
+ }
+ return value2 % 4;
+ }
+ if (units === "") {
+ const num = parseInt(value);
+ return isNaN(num) ? 0 : cleanup(num);
+ } else if (units !== value) {
+ let split = 0;
+ switch (units) {
+ case "%":
+ split = 25;
+ break;
+ case "deg":
+ split = 90;
+ }
+ if (split) {
+ let num = parseFloat(value.slice(0, value.length - units.length));
+ if (isNaN(num)) {
+ return 0;
+ }
+ num = num / split;
+ return num % 1 === 0 ? cleanup(num) : 0;
+ }
+ }
+ return defaultValue;
+ }
+
+ const separator = /[\s,]+/;
+ function flipFromString(custom, flip) {
+ flip.split(separator).forEach((str) => {
+ const value = str.trim();
+ switch (value) {
+ case "horizontal":
+ custom.hFlip = true;
+ break;
+ case "vertical":
+ custom.vFlip = true;
+ break;
+ }
+ });
+ }
+
+ /**
+ * Size attributes
+ */
+ const sizeAttributes = ['width', 'height'];
+ /**
+ * Boolean attributes
+ */
+ const booleanAttributes = [
+ 'inline',
+ 'hFlip',
+ 'vFlip',
+ ];
+ /**
+ * Get attribute value
+ */
+ function getBooleanAttribute(value, key) {
+ if (value === key || value === 'true') {
+ return true;
+ }
+ if (value === '' || value === 'false') {
+ return false;
+ }
+ return null;
+ }
+ /**
+ * Get element properties from HTML element
+ */
+ function getElementProps(element) {
+ // Get icon name
+ const name = element.getAttribute('data-icon');
+ const icon = typeof name === 'string' && stringToIcon(name, true);
+ if (!icon) {
+ return null;
+ }
+ // Get defaults and inline
+ const customisations = {
+ ...defaultExtendedIconCustomisations,
+ inline: element.classList && element.classList.contains(inlineClass),
+ };
+ // Get dimensions
+ sizeAttributes.forEach((attr) => {
+ const value = element.getAttribute('data-' + attr);
+ if (value) {
+ customisations[attr] = value;
+ }
+ });
+ // Get rotation
+ const rotation = element.getAttribute('data-rotate');
+ if (typeof rotation === 'string') {
+ customisations.rotate = rotateFromString(rotation);
+ }
+ // Get flip shorthand
+ const flip = element.getAttribute('data-flip');
+ if (typeof flip === 'string') {
+ flipFromString(customisations, flip);
+ }
+ // Boolean attributes
+ booleanAttributes.forEach((attr) => {
+ const key = 'data-' + attr;
+ const value = getBooleanAttribute(element.getAttribute(key), key);
+ if (typeof value === 'boolean') {
+ customisations[attr] = value;
+ }
+ });
+ // Get render mode. Not checking actual value because incorrect values are treated as inline
+ const mode = element.getAttribute('data-mode');
+ return {
+ name,
+ icon,
+ customisations,
+ mode,
+ };
+ }
+
+ /**
+ * Selector combining class names and tags
+ */
+ const selector = 'svg.' +
+ blockClass +
+ ', i.' +
+ blockClass +
+ ', span.' +
+ blockClass +
+ ', i.' +
+ inlineClass +
+ ', span.' +
+ inlineClass;
+ /**
+ * Find all parent nodes in DOM
+ */
+ function scanRootNode(root) {
+ const nodes = [];
+ root.querySelectorAll(selector).forEach((node) => {
+ // Get props, ignore SVG rendered outside of SVG framework
+ const props = node[elementDataProperty] || node.tagName.toLowerCase() !== 'svg'
+ ? getElementProps(node)
+ : null;
+ if (props) {
+ nodes.push({
+ node,
+ props,
+ });
+ }
+ });
+ return nodes;
+ }
+
+ function iconToHTML(body, attributes) {
+ let renderAttribsHTML = body.indexOf("xlink:") === -1 ? "" : ' xmlns:xlink="http://www.w3.org/1999/xlink"';
+ for (const attr in attributes) {
+ renderAttribsHTML += " " + attr + '="' + attributes[attr] + '"';
+ }
+ return '" + body + " ";
+ }
+
+ let policy;
+ function createPolicy() {
+ try {
+ policy = window.trustedTypes.createPolicy("iconify", {
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
+ createHTML: (s) => s
+ });
+ } catch (err) {
+ policy = null;
+ }
+ }
+ function cleanUpInnerHTML(html) {
+ if (policy === void 0) {
+ createPolicy();
+ }
+ return policy ? policy.createHTML(html) : html;
+ }
+
+ /**
+ * Get classes to add from icon name
+ */
+ function iconClasses(iconName) {
+ const classesToAdd = new Set(['iconify']);
+ ['provider', 'prefix'].forEach((attr) => {
+ if (iconName[attr]) {
+ classesToAdd.add('iconify--' + iconName[attr]);
+ }
+ });
+ return classesToAdd;
+ }
+ /**
+ * Add classes to SVG, removing previously added classes, keeping custom classes
+ */
+ function applyClasses(svg, classes, previouslyAddedClasses, placeholder) {
+ const svgClasses = svg.classList;
+ // Copy classes from placeholder
+ if (placeholder) {
+ const placeholderClasses = placeholder.classList;
+ Array.from(placeholderClasses).forEach((item) => {
+ svgClasses.add(item);
+ });
+ }
+ // Add new classes
+ const addedClasses = [];
+ classes.forEach((item) => {
+ if (!svgClasses.contains(item)) {
+ // Add new class
+ svgClasses.add(item);
+ addedClasses.push(item);
+ }
+ else if (previouslyAddedClasses.has(item)) {
+ // Was added before: keep it
+ addedClasses.push(item);
+ }
+ });
+ // Remove previously added classes
+ previouslyAddedClasses.forEach((item) => {
+ if (!classes.has(item)) {
+ // Class that was added before, but no longer needed
+ svgClasses.remove(item);
+ }
+ });
+ return addedClasses;
+ }
+
+ /**
+ * Copy old styles, apply new styles
+ */
+ function applyStyle(svg, styles, previouslyAddedStyles) {
+ const svgStyle = svg.style;
+ // Remove previously added styles
+ (previouslyAddedStyles || []).forEach((prop) => {
+ svgStyle.removeProperty(prop);
+ });
+ // Apply new styles, ignoring styles that already exist
+ const appliedStyles = [];
+ for (const prop in styles) {
+ if (!svgStyle.getPropertyValue(prop)) {
+ appliedStyles.push(prop);
+ svgStyle.setProperty(prop, styles[prop]);
+ }
+ }
+ return appliedStyles;
+ }
+
+ /**
+ * Render icon as inline SVG
+ */
+ function renderInlineSVG(element, props, iconData) {
+ // Create placeholder. Why placeholder? innerHTML setter on SVG does not work in some environments.
+ let span;
+ try {
+ span = document.createElement('span');
+ }
+ catch (err) {
+ return element;
+ }
+ // Generate data to render
+ const customisations = props.customisations;
+ const renderData = iconToSVG(iconData, customisations);
+ // Get old data
+ const oldData = element[elementDataProperty];
+ // Generate SVG
+ const html = iconToHTML(replaceIDs(renderData.body), {
+ 'aria-hidden': 'true',
+ 'role': 'img',
+ ...renderData.attributes,
+ });
+ span.innerHTML = cleanUpInnerHTML(html);
+ // Get SVG element
+ const svg = span.childNodes[0];
+ // Add attributes
+ const placeholderAttributes = element.attributes;
+ for (let i = 0; i < placeholderAttributes.length; i++) {
+ const item = placeholderAttributes.item(i);
+ const name = item.name;
+ if (name !== 'class' && !svg.hasAttribute(name)) {
+ svg.setAttribute(name, item.value);
+ }
+ }
+ // Add classes
+ const classesToAdd = iconClasses(props.icon);
+ const addedClasses = applyClasses(svg, classesToAdd, new Set(oldData && oldData.addedClasses), element);
+ // Update style
+ const addedStyles = applyStyle(svg, customisations.inline
+ ? {
+ 'vertical-align': '-0.125em',
+ }
+ : {}, oldData && oldData.addedStyles);
+ // Add data to element
+ const newData = {
+ ...props,
+ status: 'loaded',
+ addedClasses,
+ addedStyles,
+ };
+ svg[elementDataProperty] = newData;
+ // Replace old element
+ if (element.parentNode) {
+ element.parentNode.replaceChild(svg, element);
+ }
+ return svg;
+ }
+
+ function encodeSVGforURL(svg) {
+ return svg.replace(/"/g, "'").replace(/%/g, "%25").replace(/#/g, "%23").replace(//g, "%3E").replace(/\s+/g, " ");
+ }
+ function svgToData(svg) {
+ return "data:image/svg+xml," + encodeSVGforURL(svg);
+ }
+ function svgToURL(svg) {
+ return 'url("' + svgToData(svg) + '")';
+ }
+
+ const commonProps = {
+ display: 'inline-block',
+ };
+ const monotoneProps = {
+ 'background-color': 'currentColor',
+ };
+ const coloredProps = {
+ 'background-color': 'transparent',
+ };
+ // Dynamically add common props to variables above
+ const propsToAdd = {
+ image: 'var(--svg)',
+ repeat: 'no-repeat',
+ size: '100% 100%',
+ };
+ const propsToAddTo = {
+ '-webkit-mask': monotoneProps,
+ 'mask': monotoneProps,
+ 'background': coloredProps,
+ };
+ for (const prefix in propsToAddTo) {
+ const list = propsToAddTo[prefix];
+ for (const prop in propsToAdd) {
+ list[prefix + '-' + prop] = propsToAdd[prop];
+ }
+ }
+ /**
+ * Fix size: add 'px' to numbers
+ */
+ function fixSize(value) {
+ return value + (value.match(/^[-0-9.]+$/) ? 'px' : '');
+ }
+ /**
+ * Render icon as inline SVG
+ */
+ function renderBackground(element, props, iconData, useMask) {
+ // Generate data to render
+ const customisations = props.customisations;
+ const renderData = iconToSVG(iconData, customisations);
+ const renderAttribs = renderData.attributes;
+ // Get old data
+ const oldData = element[elementDataProperty];
+ // Generate SVG
+ const html = iconToHTML(renderData.body, {
+ ...renderAttribs,
+ width: iconData.width + '',
+ height: iconData.height + '',
+ });
+ // Add classes
+ const classesToAdd = iconClasses(props.icon);
+ const addedClasses = applyClasses(element, classesToAdd, new Set(oldData && oldData.addedClasses));
+ // Update style
+ const url = svgToURL(html);
+ const newStyles = {
+ '--svg': url,
+ 'width': fixSize(renderAttribs.width),
+ 'height': fixSize(renderAttribs.height),
+ ...commonProps,
+ ...(useMask ? monotoneProps : coloredProps),
+ };
+ if (customisations.inline) {
+ newStyles['vertical-align'] = '-0.125em';
+ }
+ const addedStyles = applyStyle(element, newStyles, oldData && oldData.addedStyles);
+ // Add data to element
+ const newData = {
+ ...props,
+ status: 'loaded',
+ addedClasses,
+ addedStyles,
+ };
+ element[elementDataProperty] = newData;
+ return element;
+ }
+
+ /**
+ * Flag to avoid scanning DOM too often
+ */
+ let scanQueued = false;
+ /**
+ * Icons have been loaded
+ */
+ function checkPendingIcons() {
+ if (!scanQueued) {
+ scanQueued = true;
+ setTimeout(() => {
+ if (scanQueued) {
+ scanQueued = false;
+ scanDOM();
+ }
+ });
+ }
+ }
+ /**
+ * Scan node for placeholders
+ */
+ function scanDOM(rootNode, addTempNode = false) {
+ // List of icons to load: [provider][prefix] = Set
+ const iconsToLoad = Object.create(null);
+ function getIcon(icon, load) {
+ const { provider, prefix, name } = icon;
+ const storage = getStorage(provider, prefix);
+ const storedIcon = storage.icons[name];
+ if (storedIcon) {
+ return {
+ status: 'loaded',
+ icon: storedIcon,
+ };
+ }
+ if (storage.missing.has(name)) {
+ return {
+ status: 'missing',
+ };
+ }
+ if (load && !isPending(icon)) {
+ const providerIconsToLoad = iconsToLoad[provider] ||
+ (iconsToLoad[provider] = Object.create(null));
+ const set = providerIconsToLoad[prefix] ||
+ (providerIconsToLoad[prefix] = new Set());
+ set.add(name);
+ }
+ return {
+ status: 'loading',
+ };
+ }
+ // Parse all root nodes
+ (rootNode ? [rootNode] : listRootNodes()).forEach((observedNode) => {
+ const root = typeof observedNode.node === 'function'
+ ? observedNode.node()
+ : observedNode.node;
+ if (!root || !root.querySelectorAll) {
+ return;
+ }
+ // Track placeholders
+ let hasPlaceholders = false;
+ // Observer
+ let paused = false;
+ /**
+ * Render icon
+ */
+ function render(element, props, iconData) {
+ if (!paused) {
+ paused = true;
+ pauseObservingNode(observedNode);
+ }
+ if (element.tagName.toUpperCase() !== 'SVG') {
+ // Check for one of style modes
+ const mode = props.mode;
+ const isMask = mode === 'mask' ||
+ (mode === 'bg'
+ ? false
+ : mode === 'style'
+ ? iconData.body.indexOf('currentColor') !== -1
+ : null);
+ if (typeof isMask === 'boolean') {
+ renderBackground(element, props, {
+ ...defaultIconProps,
+ ...iconData,
+ }, isMask);
+ return;
+ }
+ }
+ renderInlineSVG(element, props, iconData);
+ }
+ // Find all elements
+ scanRootNode(root).forEach(({ node, props }) => {
+ // Check if item already has props
+ const oldData = node[elementDataProperty];
+ if (!oldData) {
+ // New icon without data
+ const { status, icon } = getIcon(props.icon, true);
+ if (icon) {
+ // Ready to render!
+ render(node, props, icon);
+ return;
+ }
+ // Loading or missing
+ hasPlaceholders = hasPlaceholders || status === 'loading';
+ node[elementDataProperty] = {
+ ...props,
+ status,
+ };
+ return;
+ }
+ // Previously found icon
+ let item;
+ if (!propsChanged(oldData, props)) {
+ // Props have not changed. Check status
+ const oldStatus = oldData.status;
+ if (oldStatus !== 'loading') {
+ return;
+ }
+ item = getIcon(props.icon, false);
+ if (!item.icon) {
+ // Nothing to render
+ oldData.status = item.status;
+ return;
+ }
+ }
+ else {
+ // Properties have changed: load icon if name has changed
+ item = getIcon(props.icon, oldData.name !== props.name);
+ if (!item.icon) {
+ // Cannot render icon: update status and props
+ hasPlaceholders =
+ hasPlaceholders || item.status === 'loading';
+ Object.assign(oldData, {
+ ...props,
+ status: item.status,
+ });
+ return;
+ }
+ }
+ // Re-render icon
+ render(node, props, item.icon);
+ });
+ // Observed node stuff
+ if (observedNode.temporary && !hasPlaceholders) {
+ // Remove temporary node
+ stopObserving(root);
+ }
+ else if (addTempNode && hasPlaceholders) {
+ // Add new temporary node
+ observe(root, true);
+ }
+ else if (paused && observedNode.observer) {
+ // Resume observer
+ resumeObservingNode(observedNode);
+ }
+ });
+ // Load icons
+ for (const provider in iconsToLoad) {
+ const providerIconsToLoad = iconsToLoad[provider];
+ for (const prefix in providerIconsToLoad) {
+ const set = providerIconsToLoad[prefix];
+ loadIcons(Array.from(set).map((name) => ({
+ provider,
+ prefix,
+ name,
+ })), checkPendingIcons);
+ }
+ }
+ }
+ /**
+ * Scan node for placeholders
+ */
+ function scanElement(root) {
+ // Add temporary node
+ const node = findRootNode(root);
+ if (!node) {
+ scanDOM({
+ node: root,
+ temporary: true,
+ }, true);
+ }
+ else {
+ scanDOM(node);
+ }
+ }
+
+ function generateIcon(name, customisations, returnString = false) {
+ // Get icon data
+ const iconData = getIconData(name);
+ if (!iconData) {
+ return null;
+ }
+ // Split name
+ const iconName = stringToIcon(name);
+ // Clean up customisations
+ const changes = mergeCustomisations(defaultExtendedIconCustomisations, customisations || {});
+ // Get data
+ const result = renderInlineSVG(document.createElement('span'), {
+ name,
+ icon: iconName,
+ customisations: changes,
+ }, iconData);
+ return returnString
+ ? result.outerHTML
+ : result;
+ }
+ /**
+ * Get version
+ */
+ function getVersion() {
+ return '3.1.1';
+ }
+ /**
+ * Generate SVG element
+ */
+ function renderSVG(name, customisations) {
+ return generateIcon(name, customisations, false);
+ }
+ /**
+ * Generate SVG as string
+ */
+ function renderHTML(name, customisations) {
+ return generateIcon(name, customisations, true);
+ }
+ /**
+ * Get rendered icon as object that can be used to create SVG (use replaceIDs on body)
+ */
+ function renderIcon(name, customisations) {
+ // Get icon data
+ const iconData = getIconData(name);
+ if (!iconData) {
+ return null;
+ }
+ // Clean up customisations
+ const changes = mergeCustomisations(defaultExtendedIconCustomisations, customisations || {});
+ // Get data
+ return iconToSVG(iconData, changes);
+ }
+ /**
+ * Scan DOM
+ */
+ function scan(root) {
+ if (root) {
+ scanElement(root);
+ }
+ else {
+ scanDOM();
+ }
+ }
+ /**
+ * Initialise stuff
+ */
+ if (typeof document !== 'undefined' && typeof window !== 'undefined') {
+ // Add document.body node
+ addBodyNode();
+ const _window = window;
+ // Load icons from global "IconifyPreload"
+ if (_window.IconifyPreload !== void 0) {
+ const preload = _window.IconifyPreload;
+ const err = 'Invalid IconifyPreload syntax.';
+ if (typeof preload === 'object' && preload !== null) {
+ (preload instanceof Array ? preload : [preload]).forEach((item) => {
+ try {
+ if (
+ // Check if item is an object and not null/array
+ typeof item !== 'object' ||
+ item === null ||
+ item instanceof Array ||
+ // Check for 'icons' and 'prefix'
+ typeof item.icons !== 'object' ||
+ typeof item.prefix !== 'string' ||
+ // Add icon set
+ !addCollection(item)) {
+ console.error(err);
+ }
+ }
+ catch (e) {
+ console.error(err);
+ }
+ });
+ }
+ }
+ // Load observer and scan DOM on next tick
+ setTimeout(() => {
+ initObserver(scanDOM);
+ scanDOM();
+ });
+ }
+
+ /**
+ * Enable cache
+ */
+ function enableCache(storage, enable) {
+ toggleBrowserCache(storage, enable !== false);
+ }
+ /**
+ * Disable cache
+ */
+ function disableCache(storage) {
+ toggleBrowserCache(storage, true);
+ }
+ /**
+ * Initialise stuff
+ */
+ // Set API module
+ setAPIModule('', fetchAPIModule);
+ /**
+ * Browser stuff
+ */
+ if (typeof document !== 'undefined' && typeof window !== 'undefined') {
+ // Set cache and load existing cache
+ initBrowserStorage();
+ const _window = window;
+ // Set API from global "IconifyProviders"
+ if (_window.IconifyProviders !== void 0) {
+ const providers = _window.IconifyProviders;
+ if (typeof providers === 'object' && providers !== null) {
+ for (const key in providers) {
+ const err = 'IconifyProviders[' + key + '] is invalid.';
+ try {
+ const value = providers[key];
+ if (typeof value !== 'object' ||
+ !value ||
+ value.resources === void 0) {
+ continue;
+ }
+ if (!addAPIProvider(key, value)) {
+ console.error(err);
+ }
+ }
+ catch (e) {
+ console.error(err);
+ }
+ }
+ }
+ }
+ }
+ /**
+ * Internal API
+ */
+ const _api = {
+ getAPIConfig,
+ setAPIModule,
+ sendAPIQuery,
+ setFetch,
+ getFetch,
+ listAPIProviders,
+ };
+ /**
+ * Global variable
+ */
+ const Iconify = {
+ // IconifyAPIInternalFunctions
+ _api,
+ // IconifyAPIFunctions
+ addAPIProvider,
+ loadIcons,
+ loadIcon,
+ // IconifyStorageFunctions
+ iconExists,
+ getIcon,
+ listIcons,
+ addIcon,
+ addCollection,
+ // IconifyBuilderFunctions
+ replaceIDs,
+ calculateSize,
+ buildIcon: iconToSVG,
+ // IconifyCommonFunctions
+ getVersion,
+ renderSVG,
+ renderHTML,
+ renderIcon,
+ scan,
+ observe,
+ stopObserving,
+ pauseObserver,
+ resumeObserver,
+ // IconifyBrowserCacheFunctions
+ enableCache,
+ disableCache,
+ };
+
+ exports._api = _api;
+ exports.addAPIProvider = addAPIProvider;
+ exports.addCollection = addCollection;
+ exports.addIcon = addIcon;
+ exports.buildIcon = iconToSVG;
+ exports.calculateSize = calculateSize;
+ exports.default = Iconify;
+ exports.disableCache = disableCache;
+ exports.enableCache = enableCache;
+ exports.getIcon = getIcon;
+ exports.getVersion = getVersion;
+ exports.iconExists = iconExists;
+ exports.listIcons = listIcons;
+ exports.loadIcon = loadIcon;
+ exports.loadIcons = loadIcons;
+ exports.observe = observe;
+ exports.pauseObserver = pauseObserver;
+ exports.renderHTML = renderHTML;
+ exports.renderIcon = renderIcon;
+ exports.renderSVG = renderSVG;
+ exports.replaceIDs = replaceIDs;
+ exports.resumeObserver = resumeObserver;
+ exports.scan = scan;
+ exports.stopObserving = stopObserving;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+ return exports;
+
+})({});
+
+// Export as ES module
+if (typeof exports === 'object') {
+ try {
+ exports.__esModule = true;
+ exports.default = Iconify;
+ for (var key in Iconify) {
+ exports[key] = Iconify[key];
+ }
+ } catch (err) {
+ }
+}
+
+
+// Export to window or web worker
+try {
+ if (self.Iconify === void 0) {
+ self.Iconify = Iconify;
+ }
+} catch (err) {
+}
diff --git a/node_modules/@iconify/iconify/dist/iconify.min.js b/node_modules/@iconify/iconify/dist/iconify.min.js
new file mode 100644
index 0000000..5e5cd8c
--- /dev/null
+++ b/node_modules/@iconify/iconify/dist/iconify.min.js
@@ -0,0 +1,12 @@
+/**
+* (c) Iconify
+*
+* For the full copyright and license information, please view the license.txt or license.gpl.txt
+* files at https://github.com/iconify/iconify
+*
+* Licensed under MIT.
+*
+* @license MIT
+* @version 3.1.1
+*/
+var Iconify=function(t){"use strict";const e=Object.freeze({left:0,top:0,width:16,height:16}),n=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),o=Object.freeze({...e,...n}),r=Object.freeze({...o,body:"",hidden:!1});function i(t,e){const o=function(t,e){const n={};!t.hFlip!=!e.hFlip&&(n.hFlip=!0),!t.vFlip!=!e.vFlip&&(n.vFlip=!0);const o=((t.rotate||0)+(e.rotate||0))%4;return o&&(n.rotate=o),n}(t,e);for(const i in r)i in n?i in t&&!(i in o)&&(o[i]=n[i]):i in e?o[i]=e[i]:i in t&&(o[i]=t[i]);return o}function c(t,e,n){const o=t.icons,r=t.aliases||Object.create(null);let c={};function s(t){c=i(o[t]||r[t],c)}return s(e),n.forEach(s),i(t,c)}function s(t,e){const n=[];if("object"!=typeof t||"object"!=typeof t.icons)return n;t.not_found instanceof Array&&t.not_found.forEach((t=>{e(t,null),n.push(t)}));const o=function(t,e){const n=t.icons,o=t.aliases||Object.create(null),r=Object.create(null);return(e||Object.keys(n).concat(Object.keys(o))).forEach((function t(e){if(n[e])return r[e]=[];if(!(e in r)){r[e]=null;const n=o[e]&&o[e].parent,i=n&&t(n);i&&(r[e]=[n].concat(i))}return r[e]})),r}(t);for(const r in o){const i=o[r];i&&(e(r,c(t,r,i)),n.push(r))}return n}const a=/^[a-z0-9]+(-[a-z0-9]+)*$/,u=(t,e,n,o="")=>{const r=t.split(":");if("@"===t.slice(0,1)){if(r.length<2||r.length>3)return null;o=r.shift().slice(1)}if(r.length>3||!r.length)return null;if(r.length>1){const t=r.pop(),n=r.pop(),i={provider:r.length>0?r[0]:o,prefix:n,name:t};return e&&!f(i)?null:i}const i=r[0],c=i.split("-");if(c.length>1){const t={provider:o,prefix:c.shift(),name:c.join("-")};return e&&!f(t)?null:t}if(n&&""===o){const t={provider:o,prefix:"",name:i};return e&&!f(t,n)?null:t}return null},f=(t,e)=>!!t&&!(""!==t.provider&&!t.provider.match(a)||!(e&&""===t.prefix||t.prefix.match(a))||!t.name.match(a)),l={provider:"",aliases:{},not_found:{},...e};function d(t,e){for(const n in e)if(n in t&&typeof t[n]!=typeof e[n])return!1;return!0}function p(t){if("object"!=typeof t||null===t)return null;const e=t;if("string"!=typeof e.prefix||!t.icons||"object"!=typeof t.icons)return null;if(!d(t,l))return null;const n=e.icons;for(const t in n){const e=n[t];if(!t.match(a)||"string"!=typeof e.body||!d(e,r))return null}const o=e.aliases||Object.create(null);for(const t in o){const e=o[t],i=e.parent;if(!t.match(a)||"string"!=typeof i||!n[i]&&!o[i]||!d(e,r))return null}return e}const h=Object.create(null);function g(t,e){const n=h[t]||(h[t]=Object.create(null));return n[e]||(n[e]=function(t,e){return{provider:t,prefix:e,icons:Object.create(null),missing:new Set}}(t,e))}function m(t,e){return p(e)?s(e,((e,n)=>{n?t.icons[e]=n:t.missing.add(e)})):[]}function y(t,e){let n=[];return("string"==typeof t?[t]:Object.keys(h)).forEach((t=>{("string"==typeof t&&"string"==typeof e?[e]:Object.keys(h[t]||{})).forEach((e=>{const o=g(t,e);n=n.concat(Object.keys(o.icons).map((n=>(""!==t?"@"+t+":":"")+e+":"+n)))}))})),n}let b=!1;function v(t){const e="string"==typeof t?u(t,!0,b):t;if(e){const t=g(e.provider,e.prefix),n=e.name;return t.icons[n]||(t.missing.has(n)?null:void 0)}}function x(t,e){const n=u(t,!0,b);if(!n)return!1;return function(t,e,n){try{if("string"==typeof n.body)return t.icons[e]={...n},!0}catch(t){}return!1}(g(n.provider,n.prefix),n.name,e)}function w(t,e){if("object"!=typeof t)return!1;if("string"!=typeof e&&(e=t.provider||""),b&&!e&&!t.prefix){let e=!1;return p(t)&&(t.prefix="",s(t,((t,n)=>{n&&x(t,n)&&(e=!0)}))),e}const n=t.prefix;if(!f({provider:e,prefix:n,name:"a"}))return!1;return!!m(g(e,n),t)}function S(t){return!!v(t)}function j(t){const e=v(t);return e?{...o,...e}:null}const E=Object.freeze({width:null,height:null}),I=Object.freeze({...E,...n}),O=/(-?[0-9.]*[0-9]+[0-9.]*)/g,k=/^-?[0-9.]*[0-9]+[0-9.]*$/g;function C(t,e,n){if(1===e)return t;if(n=n||100,"number"==typeof t)return Math.ceil(t*e*n)/n;if("string"!=typeof t)return t;const o=t.split(O);if(null===o||!o.length)return t;const r=[];let i=o.shift(),c=k.test(i);for(;;){if(c){const t=parseFloat(i);isNaN(t)?r.push(i):r.push(Math.ceil(t*e*n)/n)}else r.push(i);if(i=o.shift(),void 0===i)return r.join("");c=!c}}const M=t=>"unset"===t||"undefined"===t||"none"===t;function T(t,e){const n={...o,...t},r={...I,...e},i={left:n.left,top:n.top,width:n.width,height:n.height};let c=n.body;[n,r].forEach((t=>{const e=[],n=t.hFlip,o=t.vFlip;let r,s=t.rotate;switch(n?o?s+=2:(e.push("translate("+(i.width+i.left).toString()+" "+(0-i.top).toString()+")"),e.push("scale(-1 1)"),i.top=i.left=0):o&&(e.push("translate("+(0-i.left).toString()+" "+(i.height+i.top).toString()+")"),e.push("scale(1 -1)"),i.top=i.left=0),s<0&&(s-=4*Math.floor(s/4)),s%=4,s){case 1:r=i.height/2+i.top,e.unshift("rotate(90 "+r.toString()+" "+r.toString()+")");break;case 2:e.unshift("rotate(180 "+(i.width/2+i.left).toString()+" "+(i.height/2+i.top).toString()+")");break;case 3:r=i.width/2+i.left,e.unshift("rotate(-90 "+r.toString()+" "+r.toString()+")")}s%2==1&&(i.left!==i.top&&(r=i.left,i.left=i.top,i.top=r),i.width!==i.height&&(r=i.width,i.width=i.height,i.height=r)),e.length&&(c=''+c+" ")}));const s=r.width,a=r.height,u=i.width,f=i.height;let l,d;null===s?(d=null===a?"1em":"auto"===a?f:a,l=C(d,u/f)):(l="auto"===s?u:s,d=null===a?C(l,f/u):"auto"===a?f:a);const p={},h=(t,e)=>{M(e)||(p[t]=e.toString())};return h("width",l),h("height",d),p.viewBox=i.left.toString()+" "+i.top.toString()+" "+u.toString()+" "+f.toString(),{attributes:p,body:c}}const L=/\sid="(\S+)"/g,A="IconifyId"+Date.now().toString(16)+(16777216*Math.random()|0).toString(16);let F=0;function P(t,e=A){const n=[];let o;for(;o=L.exec(t);)n.push(o[1]);if(!n.length)return t;const r="suffix"+(16777216*Math.random()|Date.now()).toString(16);return n.forEach((n=>{const o="function"==typeof e?e(n):e+(F++).toString(),i=n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");t=t.replace(new RegExp('([#;"])('+i+')([")]|\\.[a-z])',"g"),"$1"+o+r+"$3")})),t=t.replace(new RegExp(r,"g"),"")}const N={local:!0,session:!0},z={local:new Set,session:new Set};let _=!1;const D="iconify2",R="iconify",$=R+"-count",q=R+"-version",H=36e5,U=168;function V(t,e){try{return t.getItem(e)}catch(t){}}function Q(t,e,n){try{return t.setItem(e,n),!0}catch(t){}}function G(t,e){try{t.removeItem(e)}catch(t){}}function J(t,e){return Q(t,$,e.toString())}function B(t){return parseInt(V(t,$))||0}let K="undefined"==typeof window?{}:window;function W(t){const e=t+"Storage";try{if(K&&K[e]&&"number"==typeof K[e].length)return K[e]}catch(t){}N[t]=!1}function X(t,e){const n=W(t);if(!n)return;const o=V(n,q);if(o!==D){if(o){const t=B(n);for(let e=0;e{const o=R+t.toString(),i=V(n,o);if("string"==typeof i){try{const n=JSON.parse(i);if("object"==typeof n&&"number"==typeof n.cached&&n.cached>r&&"string"==typeof n.provider&&"object"==typeof n.data&&"string"==typeof n.data.prefix&&e(n,t))return!0}catch(t){}G(n,o)}};let c=B(n);for(let e=c-1;e>=0;e--)i(e)||(e===c-1?(c--,J(n,c)):z[t].add(e))}function Y(){if(!_){_=!0;for(const t in N)X(t,(t=>{const e=t.data,n=g(t.provider,e.prefix);if(!m(n,e).length)return!1;const o=e.lastModified||-1;return n.lastModifiedCached=n.lastModifiedCached?Math.min(n.lastModifiedCached,o):o,!0}))}}function Z(t,e){switch(t){case"local":case"session":N[t]=e;break;case"all":for(const t in N)N[t]=e}}const tt=Object.create(null);function et(t,e){tt[t]=e}function nt(t){return tt[t]||tt[""]}function ot(t){let e;if("string"==typeof t.resources)e=[t.resources];else if(e=t.resources,!(e instanceof Array&&e.length))return null;return{resources:e,path:t.path||"/",maxURL:t.maxURL||500,rotate:t.rotate||750,timeout:t.timeout||5e3,random:!0===t.random,index:t.index||0,dataAfterTimeout:!1!==t.dataAfterTimeout}}const rt=Object.create(null),it=["https://api.simplesvg.com","https://api.unisvg.com"],ct=[];for(;it.length>0;)1===it.length||Math.random()>.5?ct.push(it.shift()):ct.push(it.pop());function st(t,e){const n=ot(e);return null!==n&&(rt[t]=n,!0)}function at(t){return rt[t]}rt[""]=ot({resources:["https://api.iconify.design"].concat(ct)});let ut=(()=>{let t;try{if(t=fetch,"function"==typeof t)return t}catch(t){}})();const ft={prepare:(t,e,n)=>{const o=[],r=function(t,e){const n=at(t);if(!n)return 0;let o;if(n.maxURL){let t=0;n.resources.forEach((e=>{const n=e;t=Math.max(t,n.length)}));const r=e+".json?icons=";o=n.maxURL-t-n.path.length-r.length}else o=0;return o}(t,e),i="icons";let c={type:i,provider:t,prefix:e,icons:[]},s=0;return n.forEach(((n,a)=>{s+=n.length+1,s>=r&&a>0&&(o.push(c),c={type:i,provider:t,prefix:e,icons:[]},s=n.length),c.icons.push(n)})),o.push(c),o},send:(t,e,n)=>{if(!ut)return void n("abort",424);let o=function(t){if("string"==typeof t){const e=at(t);if(e)return e.path}return"/"}(e.provider);switch(e.type){case"icons":{const t=e.prefix,n=e.icons.join(",");o+=t+".json?"+new URLSearchParams({icons:n}).toString();break}case"custom":{const t=e.uri;o+="/"===t.slice(0,1)?t.slice(1):t;break}default:return void n("abort",400)}let r=503;ut(t+o).then((t=>{const e=t.status;if(200===e)return r=501,t.json();setTimeout((()=>{n(function(t){return 404===t}(e)?"abort":"next",e)}))})).then((t=>{"object"==typeof t&&null!==t?setTimeout((()=>{n("success",t)})):setTimeout((()=>{404===t?n("abort",t):n("next",r)}))})).catch((()=>{n("next",r)}))}};function lt(t,e){t.forEach((t=>{const n=t.loaderCallbacks;n&&(t.loaderCallbacks=n.filter((t=>t.id!==e)))}))}let dt=0;var pt={resources:[],index:0,timeout:2e3,rotate:750,random:!1,dataAfterTimeout:!1};function ht(t,e,n,o){const r=t.resources.length,i=t.random?Math.floor(Math.random()*r):t.index;let c;if(t.random){let e=t.resources.slice(0);for(c=[];e.length>1;){const t=Math.floor(Math.random()*e.length);c.push(e[t]),e=e.slice(0,t).concat(e.slice(t+1))}c=c.concat(e)}else c=t.resources.slice(i).concat(t.resources.slice(0,i));const s=Date.now();let a,u="pending",f=0,l=null,d=[],p=[];function h(){l&&(clearTimeout(l),l=null)}function g(){"pending"===u&&(u="aborted"),h(),d.forEach((t=>{"pending"===t.status&&(t.status="aborted")})),d=[]}function m(t,e){e&&(p=[]),"function"==typeof t&&p.push(t)}function y(){u="failed",p.forEach((t=>{t(void 0,a)}))}function b(){d.forEach((t=>{"pending"===t.status&&(t.status="aborted")})),d=[]}function v(){if("pending"!==u)return;h();const o=c.shift();if(void 0===o)return d.length?void(l=setTimeout((()=>{h(),"pending"===u&&(b(),y())}),t.timeout)):void y();const r={status:"pending",resource:o,callback:(e,n)=>{!function(e,n,o){const r="success"!==n;switch(d=d.filter((t=>t!==e)),u){case"pending":break;case"failed":if(r||!t.dataAfterTimeout)return;break;default:return}if("abort"===n)return a=o,void y();if(r)return a=o,void(d.length||(c.length?v():y()));if(h(),b(),!t.random){const n=t.resources.indexOf(e.resource);-1!==n&&n!==t.index&&(t.index=n)}u="completed",p.forEach((t=>{t(o)}))}(r,e,n)}};d.push(r),f++,l=setTimeout(v,t.rotate),n(o,e,r.callback)}return"function"==typeof o&&p.push(o),setTimeout(v),function(){return{startTime:s,payload:e,status:u,queriesSent:f,queriesPending:d.length,subscribe:m,abort:g}}}function gt(t){const e={...pt,...t};let n=[];function o(){n=n.filter((t=>"pending"===t().status))}const r={query:function(t,r,i){const c=ht(e,t,r,((t,e)=>{o(),i&&i(t,e)}));return n.push(c),c},find:function(t){return n.find((e=>t(e)))||null},setIndex:t=>{e.index=t},getIndex:()=>e.index,cleanup:o};return r}function mt(){}const yt=Object.create(null);function bt(t,e,n){let o,r;if("string"==typeof t){const e=nt(t);if(!e)return n(void 0,424),mt;r=e.send;const i=function(t){if(!yt[t]){const e=at(t);if(!e)return;const n={config:e,redundancy:gt(e)};yt[t]=n}return yt[t]}(t);i&&(o=i.redundancy)}else{const e=ot(t);if(e){o=gt(e);const n=nt(t.resources?t.resources[0]:"");n&&(r=n.send)}}return o&&r?o.query(e,r,n)().abort:(n(void 0,424),mt)}function vt(t,e){function n(n){let o;if(!N[n]||!(o=W(n)))return;const r=z[n];let i;if(r.size)r.delete(i=Array.from(r).shift());else if(i=B(o),!J(o,i+1))return;const c={cached:Math.floor(Date.now()/H),provider:t.provider,data:e};return Q(o,R+i.toString(),JSON.stringify(c))}_||Y(),e.lastModified&&!function(t,e){const n=t.lastModifiedCached;if(n&&n>=e)return n===e;if(t.lastModifiedCached=e,n)for(const n in N)X(n,(n=>{const o=n.data;return n.provider!==t.provider||o.prefix!==t.prefix||o.lastModified===e}));return!0}(t,e.lastModified)||Object.keys(e.icons).length&&(e.not_found&&delete(e=Object.assign({},e)).not_found,n("local")||n("session"))}function xt(){}function wt(t){t.iconsLoaderFlag||(t.iconsLoaderFlag=!0,setTimeout((()=>{t.iconsLoaderFlag=!1,function(t){t.pendingCallbacksFlag||(t.pendingCallbacksFlag=!0,setTimeout((()=>{t.pendingCallbacksFlag=!1;const e=t.loaderCallbacks?t.loaderCallbacks.slice(0):[];if(!e.length)return;let n=!1;const o=t.provider,r=t.prefix;e.forEach((e=>{const i=e.icons,c=i.pending.length;i.pending=i.pending.filter((e=>{if(e.prefix!==r)return!0;const c=e.name;if(t.icons[c])i.loaded.push({provider:o,prefix:r,name:c});else{if(!t.missing.has(c))return n=!0,!0;i.missing.push({provider:o,prefix:r,name:c})}return!1})),i.pending.length!==c&&(n||lt([t],e.id),e.callback(i.loaded.slice(0),i.missing.slice(0),i.pending.slice(0),e.abort))}))})))}(t)})))}const St=t=>{const e=g(t.provider,t.prefix).pendingIcons;return!(!e||!e.has(t.name))},jt=(t,e)=>{var n;const o=function(t){const e={loaded:[],missing:[],pending:[]},n=Object.create(null);t.sort(((t,e)=>t.provider!==e.provider?t.provider.localeCompare(e.provider):t.prefix!==e.prefix?t.prefix.localeCompare(e.prefix):t.name.localeCompare(e.name)));let o={provider:"",prefix:"",name:""};return t.forEach((t=>{if(o.name===t.name&&o.prefix===t.prefix&&o.provider===t.provider)return;o=t;const r=t.provider,i=t.prefix,c=t.name,s=n[r]||(n[r]=Object.create(null)),a=s[i]||(s[i]=g(r,i));let u;u=c in a.icons?e.loaded:""===i||a.missing.has(c)?e.missing:e.pending;const f={provider:r,prefix:i,name:c};u.push(f)})),e}(function(t,e=!0,n=!1){const o=[];return t.forEach((t=>{const r="string"==typeof t?u(t,e,n):t;r&&o.push(r)})),o}(t,!0,("boolean"==typeof n&&(b=n),b)));if(!o.pending.length){let t=!0;return e&&setTimeout((()=>{t&&e(o.loaded,o.missing,o.pending,xt)})),()=>{t=!1}}const r=Object.create(null),i=[];let c,s;return o.pending.forEach((t=>{const{provider:e,prefix:n}=t;if(n===s&&e===c)return;c=e,s=n,i.push(g(e,n));const o=r[e]||(r[e]=Object.create(null));o[n]||(o[n]=[])})),o.pending.forEach((t=>{const{provider:e,prefix:n,name:o}=t,i=g(e,n),c=i.pendingIcons||(i.pendingIcons=new Set);c.has(o)||(c.add(o),r[e][n].push(o))})),i.forEach((t=>{const{provider:e,prefix:n}=t;r[e][n].length&&function(t,e){t.iconsToLoad?t.iconsToLoad=t.iconsToLoad.concat(e).sort():t.iconsToLoad=e,t.iconsQueueFlag||(t.iconsQueueFlag=!0,setTimeout((()=>{t.iconsQueueFlag=!1;const{provider:e,prefix:n}=t,o=t.iconsToLoad;let r;delete t.iconsToLoad,o&&(r=nt(e))&&r.prepare(e,n,o).forEach((n=>{bt(e,n,(e=>{if("object"!=typeof e)n.icons.forEach((e=>{t.missing.add(e)}));else try{const n=m(t,e);if(!n.length)return;const o=t.pendingIcons;o&&n.forEach((t=>{o.delete(t)})),vt(t,e)}catch(t){console.error(t)}wt(t)}))}))})))}(t,r[e][n])})),e?function(t,e,n){const o=dt++,r=lt.bind(null,n,o);if(!e.pending.length)return r;const i={id:o,icons:e,callback:t,abort:r};return n.forEach((t=>{(t.loaderCallbacks||(t.loaderCallbacks=[])).push(i)})),r}(e,o,i):xt},Et=t=>new Promise(((e,n)=>{const r="string"==typeof t?u(t,!0):t;r?jt([r||t],(i=>{if(i.length&&r){const t=v(r);if(t)return void e({...o,...t})}n(t)})):n(t)}));function It(t,e){const n={...t};for(const t in e){const o=e[t],r=typeof o;t in E?(null===o||o&&("string"===r||"number"===r))&&(n[t]=o):r===typeof n[t]&&(n[t]="rotate"===t?o%4:o)}return n}const Ot={...I,inline:!1},kt="iconify",Ct="iconify-inline",Mt="iconifyData"+Date.now();let Tt=[];function Lt(t){for(let e=0;e{delete e.pendingScan,Pt&&Pt(t)})))}function _t(t,e){if(!t.observer)return;const n=t.observer;if(!n.pendingScan)for(let o=0;o0||"attributes"===r.type&&void 0!==r.target[Mt])return void(n.paused||zt(t))}}function Dt(t,e){t.observer.instance.observe(e,Nt)}function Rt(t){let e=t.observer;if(e&&e.instance)return;const n="function"==typeof t.node?t.node():t.node;n&&window&&(e||(e={paused:0},t.observer=e),e.instance=new window.MutationObserver(_t.bind(null,t)),Dt(t,n),e.paused||zt(t))}function $t(){Ft().forEach(Rt)}function qt(t){if(!t.observer)return;const e=t.observer;e.pendingScan&&(clearTimeout(e.pendingScan),delete e.pendingScan),e.instance&&(e.instance.disconnect(),delete e.instance)}function Ht(t){const e=null!==Pt;Pt!==t&&(Pt=t,e&&Ft().forEach(qt)),e?$t():function(t){const e=document;e.readyState&&"loading"!==e.readyState?t():e.addEventListener("DOMContentLoaded",t)}($t)}function Ut(t){(t?[t]:Ft()).forEach((t=>{if(!t.observer)return void(t.observer={paused:1});const e=t.observer;if(e.paused++,e.paused>1||!e.instance)return;e.instance.disconnect()}))}function Vt(t){if(t){const e=Lt(t);e&&Ut(e)}else Ut()}function Qt(t){(t?[t]:Ft()).forEach((t=>{if(!t.observer)return void Rt(t);const e=t.observer;if(e.paused&&(e.paused--,!e.paused)){const n="function"==typeof t.node?t.node():t.node;if(!n)return;e.instance?Dt(t,n):Rt(t)}}))}function Gt(t){if(t){const e=Lt(t);e&&Qt(e)}else Qt()}function Jt(t,e=!1){const n=At(t,e);return Rt(n),n}function Bt(t){const e=Lt(t);e&&(qt(e),function(t){Tt=Tt.filter((e=>t!==e&&t!==("function"==typeof e.node?e.node():e.node)))}(t))}const Kt=/[\s,]+/;const Wt=["width","height"],Xt=["inline","hFlip","vFlip"];function Yt(t){const e=t.getAttribute("data-icon"),n="string"==typeof e&&u(e,!0);if(!n)return null;const o={...Ot,inline:t.classList&&t.classList.contains(Ct)};Wt.forEach((e=>{const n=t.getAttribute("data-"+e);n&&(o[e]=n)}));const r=t.getAttribute("data-rotate");"string"==typeof r&&(o.rotate=function(t,e=0){const n=t.replace(/^-?[0-9.]*/,"");function o(t){for(;t<0;)t+=4;return t%4}if(""===n){const e=parseInt(t);return isNaN(e)?0:o(e)}if(n!==t){let e=0;switch(n){case"%":e=25;break;case"deg":e=90}if(e){let r=parseFloat(t.slice(0,t.length-n.length));return isNaN(r)?0:(r/=e,r%1==0?o(r):0)}}return e}(r));const i=t.getAttribute("data-flip");"string"==typeof i&&function(t,e){e.split(Kt).forEach((e=>{switch(e.trim()){case"horizontal":t.hFlip=!0;break;case"vertical":t.vFlip=!0}}))}(o,i),Xt.forEach((e=>{const n="data-"+e,r=function(t,e){return t===e||"true"===t||""!==t&&"false"!==t&&null}(t.getAttribute(n),n);"boolean"==typeof r&&(o[e]=r)}));const c=t.getAttribute("data-mode");return{name:e,icon:n,customisations:o,mode:c}}const Zt="svg."+kt+", i."+kt+", span."+kt+", i."+Ct+", span."+Ct;function te(t,e){let n=-1===t.indexOf("xlink:")?"":' xmlns:xlink="http://www.w3.org/1999/xlink"';for(const t in e)n+=" "+t+'="'+e[t]+'"';return'"+t+" "}let ee;function ne(t){return void 0===ee&&function(){try{ee=window.trustedTypes.createPolicy("iconify",{createHTML:t=>t})}catch(t){ee=null}}(),ee?ee.createHTML(t):t}function oe(t){const e=new Set(["iconify"]);return["provider","prefix"].forEach((n=>{t[n]&&e.add("iconify--"+t[n])})),e}function re(t,e,n,o){const r=t.classList;if(o){const t=o.classList;Array.from(t).forEach((t=>{r.add(t)}))}const i=[];return e.forEach((t=>{r.contains(t)?n.has(t)&&i.push(t):(r.add(t),i.push(t))})),n.forEach((t=>{e.has(t)||r.remove(t)})),i}function ie(t,e,n){const o=t.style;(n||[]).forEach((t=>{o.removeProperty(t)}));const r=[];for(const t in e)o.getPropertyValue(t)||(r.push(t),o.setProperty(t,e[t]));return r}function ce(t,e,n){let o;try{o=document.createElement("span")}catch(e){return t}const r=e.customisations,i=T(n,r),c=t[Mt],s=te(P(i.body),{"aria-hidden":"true",role:"img",...i.attributes});o.innerHTML=ne(s);const a=o.childNodes[0],u=t.attributes;for(let t=0;t{pe&&(pe=!1,ge())})))}function ge(t,e=!1){const n=Object.create(null);function r(t,e){const{provider:o,prefix:r,name:i}=t,c=g(o,r),s=c.icons[i];if(s)return{status:"loaded",icon:s};if(c.missing.has(i))return{status:"missing"};if(e&&!St(t)){const t=n[o]||(n[o]=Object.create(null));(t[r]||(t[r]=new Set)).add(i)}return{status:"loading"}}(t?[t]:Ft()).forEach((t=>{const n="function"==typeof t.node?t.node():t.node;if(!n||!n.querySelectorAll)return;let i=!1,c=!1;function s(e,n,r){if(c||(c=!0,Ut(t)),"SVG"!==e.tagName.toUpperCase()){const t=n.mode,i="mask"===t||"bg"!==t&&("style"===t?-1!==r.body.indexOf("currentColor"):null);if("boolean"==typeof i)return void function(t,e,n,o){const r=e.customisations,i=T(n,r),c=i.attributes,s=t[Mt],a=te(i.body,{...c,width:n.width+"",height:n.height+""}),u=re(t,oe(e.icon),new Set(s&&s.addedClasses)),f={"--svg":'url("'+(l=a,"data:image/svg+xml,"+function(t){return t.replace(/"/g,"'").replace(/%/g,"%25").replace(/#/g,"%23").replace(//g,"%3E").replace(/\s+/g," ")}(l)+'")'),width:de(c.width),height:de(c.height),...se,...o?ae:ue};var l;r.inline&&(f["vertical-align"]="-0.125em");const d=ie(t,f,s&&s.addedStyles),p={...e,status:"loaded",addedClasses:u,addedStyles:d};t[Mt]=p}(e,n,{...o,...r},i)}ce(e,n,r)}(function(t){const e=[];return t.querySelectorAll(Zt).forEach((t=>{const n=t[Mt]||"svg"!==t.tagName.toLowerCase()?Yt(t):null;n&&e.push({node:t,props:n})})),e})(n).forEach((({node:t,props:e})=>{const n=t[Mt];if(!n){const{status:n,icon:o}=r(e.icon,!0);return o?void s(t,e,o):(i=i||"loading"===n,void(t[Mt]={...e,status:n}))}let o;if(function(t,e){if(t.name!==e.name||t.mode!==e.mode)return!0;const n=t.customisations,o=e.customisations;for(const t in Ot)if(n[t]!==o[t])return!0;return!1}(n,e)){if(o=r(e.icon,n.name!==e.name),!o.icon)return i=i||"loading"===o.status,void Object.assign(n,{...e,status:o.status})}else{if("loading"!==n.status)return;if(o=r(e.icon,!1),!o.icon)return void(n.status=o.status)}s(t,e,o.icon)})),t.temporary&&!i?Bt(n):e&&i?Jt(n,!0):c&&t.observer&&Qt(t)}));for(const t in n){const e=n[t];for(const n in e){const o=e[n];jt(Array.from(o).map((e=>({provider:t,prefix:n,name:e}))),he)}}}function me(t,e,n=!1){const o=v(t);if(!o)return null;const r=u(t),i=It(Ot,e||{}),c=ce(document.createElement("span"),{name:t,icon:r,customisations:i},o);return n?c.outerHTML:c}function ye(){return"3.1.1"}function be(t,e){return me(t,e,!1)}function ve(t,e){return me(t,e,!0)}function xe(t,e){const n=v(t);if(!n)return null;return T(n,It(Ot,e||{}))}function we(t){t?function(t){const e=Lt(t);e?ge(e):ge({node:t,temporary:!0},!0)}(t):ge()}if("undefined"!=typeof document&&"undefined"!=typeof window){!function(){if(document.documentElement)return At(document.documentElement);Tt.push({node:()=>document.documentElement})}();const t=window;if(void 0!==t.IconifyPreload){const e=t.IconifyPreload,n="Invalid IconifyPreload syntax.";"object"==typeof e&&null!==e&&(e instanceof Array?e:[e]).forEach((t=>{try{("object"!=typeof t||null===t||t instanceof Array||"object"!=typeof t.icons||"string"!=typeof t.prefix||!w(t))&&console.error(n)}catch(t){console.error(n)}}))}setTimeout((()=>{Ht(ge),ge()}))}function Se(t,e){Z(t,!1!==e)}function je(t){Z(t,!0)}if(et("",ft),"undefined"!=typeof document&&"undefined"!=typeof window){Y();const t=window;if(void 0!==t.IconifyProviders){const e=t.IconifyProviders;if("object"==typeof e&&null!==e)for(const t in e){const n="IconifyProviders["+t+"] is invalid.";try{const o=e[t];if("object"!=typeof o||!o||void 0===o.resources)continue;st(t,o)||console.error(n)}catch(t){console.error(n)}}}}const Ee={getAPIConfig:at,setAPIModule:et,sendAPIQuery:bt,setFetch:function(t){ut=t},getFetch:function(){return ut},listAPIProviders:function(){return Object.keys(rt)}},Ie={_api:Ee,addAPIProvider:st,loadIcons:jt,loadIcon:Et,iconExists:S,getIcon:j,listIcons:y,addIcon:x,addCollection:w,replaceIDs:P,calculateSize:C,buildIcon:T,getVersion:ye,renderSVG:be,renderHTML:ve,renderIcon:xe,scan:we,observe:Jt,stopObserving:Bt,pauseObserver:Vt,resumeObserver:Gt,enableCache:Se,disableCache:je};return t._api=Ee,t.addAPIProvider=st,t.addCollection=w,t.addIcon=x,t.buildIcon=T,t.calculateSize=C,t.default=Ie,t.disableCache=je,t.enableCache=Se,t.getIcon=j,t.getVersion=ye,t.iconExists=S,t.listIcons=y,t.loadIcon=Et,t.loadIcons=jt,t.observe=Jt,t.pauseObserver=Vt,t.renderHTML=ve,t.renderIcon=xe,t.renderSVG=be,t.replaceIDs=P,t.resumeObserver=Gt,t.scan=we,t.stopObserving=Bt,Object.defineProperty(t,"__esModule",{value:!0}),t}({});if("object"==typeof exports)try{for(var key in exports.__esModule=!0,exports.default=Iconify,Iconify)exports[key]=Iconify[key]}catch(t){}try{void 0===self.Iconify&&(self.Iconify=Iconify)}catch(t){}
diff --git a/node_modules/@iconify/iconify/dist/iconify.mjs b/node_modules/@iconify/iconify/dist/iconify.mjs
new file mode 100644
index 0000000..3f65ead
--- /dev/null
+++ b/node_modules/@iconify/iconify/dist/iconify.mjs
@@ -0,0 +1,2624 @@
+/**
+* (c) Iconify
+*
+* For the full copyright and license information, please view the license.txt or license.gpl.txt
+* files at https://github.com/iconify/iconify
+*
+* Licensed under MIT.
+*
+* @license MIT
+* @version 3.1.1
+*/
+const defaultIconDimensions = Object.freeze(
+ {
+ left: 0,
+ top: 0,
+ width: 16,
+ height: 16
+ }
+);
+const defaultIconTransformations = Object.freeze({
+ rotate: 0,
+ vFlip: false,
+ hFlip: false
+});
+const defaultIconProps = Object.freeze({
+ ...defaultIconDimensions,
+ ...defaultIconTransformations
+});
+const defaultExtendedIconProps = Object.freeze({
+ ...defaultIconProps,
+ body: "",
+ hidden: false
+});
+
+function mergeIconTransformations(obj1, obj2) {
+ const result = {};
+ if (!obj1.hFlip !== !obj2.hFlip) {
+ result.hFlip = true;
+ }
+ if (!obj1.vFlip !== !obj2.vFlip) {
+ result.vFlip = true;
+ }
+ const rotate = ((obj1.rotate || 0) + (obj2.rotate || 0)) % 4;
+ if (rotate) {
+ result.rotate = rotate;
+ }
+ return result;
+}
+
+function mergeIconData(parent, child) {
+ const result = mergeIconTransformations(parent, child);
+ for (const key in defaultExtendedIconProps) {
+ if (key in defaultIconTransformations) {
+ if (key in parent && !(key in result)) {
+ result[key] = defaultIconTransformations[key];
+ }
+ } else if (key in child) {
+ result[key] = child[key];
+ } else if (key in parent) {
+ result[key] = parent[key];
+ }
+ }
+ return result;
+}
+
+function getIconsTree(data, names) {
+ const icons = data.icons;
+ const aliases = data.aliases || /* @__PURE__ */ Object.create(null);
+ const resolved = /* @__PURE__ */ Object.create(null);
+ function resolve(name) {
+ if (icons[name]) {
+ return resolved[name] = [];
+ }
+ if (!(name in resolved)) {
+ resolved[name] = null;
+ const parent = aliases[name] && aliases[name].parent;
+ const value = parent && resolve(parent);
+ if (value) {
+ resolved[name] = [parent].concat(value);
+ }
+ }
+ return resolved[name];
+ }
+ (names || Object.keys(icons).concat(Object.keys(aliases))).forEach(resolve);
+ return resolved;
+}
+
+function internalGetIconData(data, name, tree) {
+ const icons = data.icons;
+ const aliases = data.aliases || /* @__PURE__ */ Object.create(null);
+ let currentProps = {};
+ function parse(name2) {
+ currentProps = mergeIconData(
+ icons[name2] || aliases[name2],
+ currentProps
+ );
+ }
+ parse(name);
+ tree.forEach(parse);
+ return mergeIconData(data, currentProps);
+}
+
+function parseIconSet(data, callback) {
+ const names = [];
+ if (typeof data !== "object" || typeof data.icons !== "object") {
+ return names;
+ }
+ if (data.not_found instanceof Array) {
+ data.not_found.forEach((name) => {
+ callback(name, null);
+ names.push(name);
+ });
+ }
+ const tree = getIconsTree(data);
+ for (const name in tree) {
+ const item = tree[name];
+ if (item) {
+ callback(name, internalGetIconData(data, name, item));
+ names.push(name);
+ }
+ }
+ return names;
+}
+
+const matchIconName = /^[a-z0-9]+(-[a-z0-9]+)*$/;
+const stringToIcon = (value, validate, allowSimpleName, provider = "") => {
+ const colonSeparated = value.split(":");
+ if (value.slice(0, 1) === "@") {
+ if (colonSeparated.length < 2 || colonSeparated.length > 3) {
+ return null;
+ }
+ provider = colonSeparated.shift().slice(1);
+ }
+ if (colonSeparated.length > 3 || !colonSeparated.length) {
+ return null;
+ }
+ if (colonSeparated.length > 1) {
+ const name2 = colonSeparated.pop();
+ const prefix = colonSeparated.pop();
+ const result = {
+ // Allow provider without '@': "provider:prefix:name"
+ provider: colonSeparated.length > 0 ? colonSeparated[0] : provider,
+ prefix,
+ name: name2
+ };
+ return validate && !validateIconName(result) ? null : result;
+ }
+ const name = colonSeparated[0];
+ const dashSeparated = name.split("-");
+ if (dashSeparated.length > 1) {
+ const result = {
+ provider,
+ prefix: dashSeparated.shift(),
+ name: dashSeparated.join("-")
+ };
+ return validate && !validateIconName(result) ? null : result;
+ }
+ if (allowSimpleName && provider === "") {
+ const result = {
+ provider,
+ prefix: "",
+ name
+ };
+ return validate && !validateIconName(result, allowSimpleName) ? null : result;
+ }
+ return null;
+};
+const validateIconName = (icon, allowSimpleName) => {
+ if (!icon) {
+ return false;
+ }
+ return !!((icon.provider === "" || icon.provider.match(matchIconName)) && (allowSimpleName && icon.prefix === "" || icon.prefix.match(matchIconName)) && icon.name.match(matchIconName));
+};
+
+const optionalPropertyDefaults = {
+ provider: "",
+ aliases: {},
+ not_found: {},
+ ...defaultIconDimensions
+};
+function checkOptionalProps(item, defaults) {
+ for (const prop in defaults) {
+ if (prop in item && typeof item[prop] !== typeof defaults[prop]) {
+ return false;
+ }
+ }
+ return true;
+}
+function quicklyValidateIconSet(obj) {
+ if (typeof obj !== "object" || obj === null) {
+ return null;
+ }
+ const data = obj;
+ if (typeof data.prefix !== "string" || !obj.icons || typeof obj.icons !== "object") {
+ return null;
+ }
+ if (!checkOptionalProps(obj, optionalPropertyDefaults)) {
+ return null;
+ }
+ const icons = data.icons;
+ for (const name in icons) {
+ const icon = icons[name];
+ if (!name.match(matchIconName) || typeof icon.body !== "string" || !checkOptionalProps(
+ icon,
+ defaultExtendedIconProps
+ )) {
+ return null;
+ }
+ }
+ const aliases = data.aliases || /* @__PURE__ */ Object.create(null);
+ for (const name in aliases) {
+ const icon = aliases[name];
+ const parent = icon.parent;
+ if (!name.match(matchIconName) || typeof parent !== "string" || !icons[parent] && !aliases[parent] || !checkOptionalProps(
+ icon,
+ defaultExtendedIconProps
+ )) {
+ return null;
+ }
+ }
+ return data;
+}
+
+const dataStorage = /* @__PURE__ */ Object.create(null);
+function newStorage(provider, prefix) {
+ return {
+ provider,
+ prefix,
+ icons: /* @__PURE__ */ Object.create(null),
+ missing: /* @__PURE__ */ new Set()
+ };
+}
+function getStorage(provider, prefix) {
+ const providerStorage = dataStorage[provider] || (dataStorage[provider] = /* @__PURE__ */ Object.create(null));
+ return providerStorage[prefix] || (providerStorage[prefix] = newStorage(provider, prefix));
+}
+function addIconSet(storage, data) {
+ if (!quicklyValidateIconSet(data)) {
+ return [];
+ }
+ return parseIconSet(data, (name, icon) => {
+ if (icon) {
+ storage.icons[name] = icon;
+ } else {
+ storage.missing.add(name);
+ }
+ });
+}
+function addIconToStorage(storage, name, icon) {
+ try {
+ if (typeof icon.body === "string") {
+ storage.icons[name] = { ...icon };
+ return true;
+ }
+ } catch (err) {
+ }
+ return false;
+}
+function listIcons(provider, prefix) {
+ let allIcons = [];
+ const providers = typeof provider === "string" ? [provider] : Object.keys(dataStorage);
+ providers.forEach((provider2) => {
+ const prefixes = typeof provider2 === "string" && typeof prefix === "string" ? [prefix] : Object.keys(dataStorage[provider2] || {});
+ prefixes.forEach((prefix2) => {
+ const storage = getStorage(provider2, prefix2);
+ allIcons = allIcons.concat(
+ Object.keys(storage.icons).map(
+ (name) => (provider2 !== "" ? "@" + provider2 + ":" : "") + prefix2 + ":" + name
+ )
+ );
+ });
+ });
+ return allIcons;
+}
+
+let simpleNames = false;
+function allowSimpleNames(allow) {
+ if (typeof allow === "boolean") {
+ simpleNames = allow;
+ }
+ return simpleNames;
+}
+function getIconData(name) {
+ const icon = typeof name === "string" ? stringToIcon(name, true, simpleNames) : name;
+ if (icon) {
+ const storage = getStorage(icon.provider, icon.prefix);
+ const iconName = icon.name;
+ return storage.icons[iconName] || (storage.missing.has(iconName) ? null : void 0);
+ }
+}
+function addIcon(name, data) {
+ const icon = stringToIcon(name, true, simpleNames);
+ if (!icon) {
+ return false;
+ }
+ const storage = getStorage(icon.provider, icon.prefix);
+ return addIconToStorage(storage, icon.name, data);
+}
+function addCollection(data, provider) {
+ if (typeof data !== "object") {
+ return false;
+ }
+ if (typeof provider !== "string") {
+ provider = data.provider || "";
+ }
+ if (simpleNames && !provider && !data.prefix) {
+ let added = false;
+ if (quicklyValidateIconSet(data)) {
+ data.prefix = "";
+ parseIconSet(data, (name, icon) => {
+ if (icon && addIcon(name, icon)) {
+ added = true;
+ }
+ });
+ }
+ return added;
+ }
+ const prefix = data.prefix;
+ if (!validateIconName({
+ provider,
+ prefix,
+ name: "a"
+ })) {
+ return false;
+ }
+ const storage = getStorage(provider, prefix);
+ return !!addIconSet(storage, data);
+}
+function iconExists(name) {
+ return !!getIconData(name);
+}
+function getIcon(name) {
+ const result = getIconData(name);
+ return result ? {
+ ...defaultIconProps,
+ ...result
+ } : null;
+}
+
+const defaultIconSizeCustomisations = Object.freeze({
+ width: null,
+ height: null
+});
+const defaultIconCustomisations = Object.freeze({
+ // Dimensions
+ ...defaultIconSizeCustomisations,
+ // Transformations
+ ...defaultIconTransformations
+});
+
+const unitsSplit = /(-?[0-9.]*[0-9]+[0-9.]*)/g;
+const unitsTest = /^-?[0-9.]*[0-9]+[0-9.]*$/g;
+function calculateSize(size, ratio, precision) {
+ if (ratio === 1) {
+ return size;
+ }
+ precision = precision || 100;
+ if (typeof size === "number") {
+ return Math.ceil(size * ratio * precision) / precision;
+ }
+ if (typeof size !== "string") {
+ return size;
+ }
+ const oldParts = size.split(unitsSplit);
+ if (oldParts === null || !oldParts.length) {
+ return size;
+ }
+ const newParts = [];
+ let code = oldParts.shift();
+ let isNumber = unitsTest.test(code);
+ while (true) {
+ if (isNumber) {
+ const num = parseFloat(code);
+ if (isNaN(num)) {
+ newParts.push(code);
+ } else {
+ newParts.push(Math.ceil(num * ratio * precision) / precision);
+ }
+ } else {
+ newParts.push(code);
+ }
+ code = oldParts.shift();
+ if (code === void 0) {
+ return newParts.join("");
+ }
+ isNumber = !isNumber;
+ }
+}
+
+const isUnsetKeyword = (value) => value === "unset" || value === "undefined" || value === "none";
+function iconToSVG(icon, customisations) {
+ const fullIcon = {
+ ...defaultIconProps,
+ ...icon
+ };
+ const fullCustomisations = {
+ ...defaultIconCustomisations,
+ ...customisations
+ };
+ const box = {
+ left: fullIcon.left,
+ top: fullIcon.top,
+ width: fullIcon.width,
+ height: fullIcon.height
+ };
+ let body = fullIcon.body;
+ [fullIcon, fullCustomisations].forEach((props) => {
+ const transformations = [];
+ const hFlip = props.hFlip;
+ const vFlip = props.vFlip;
+ let rotation = props.rotate;
+ if (hFlip) {
+ if (vFlip) {
+ rotation += 2;
+ } else {
+ transformations.push(
+ "translate(" + (box.width + box.left).toString() + " " + (0 - box.top).toString() + ")"
+ );
+ transformations.push("scale(-1 1)");
+ box.top = box.left = 0;
+ }
+ } else if (vFlip) {
+ transformations.push(
+ "translate(" + (0 - box.left).toString() + " " + (box.height + box.top).toString() + ")"
+ );
+ transformations.push("scale(1 -1)");
+ box.top = box.left = 0;
+ }
+ let tempValue;
+ if (rotation < 0) {
+ rotation -= Math.floor(rotation / 4) * 4;
+ }
+ rotation = rotation % 4;
+ switch (rotation) {
+ case 1:
+ tempValue = box.height / 2 + box.top;
+ transformations.unshift(
+ "rotate(90 " + tempValue.toString() + " " + tempValue.toString() + ")"
+ );
+ break;
+ case 2:
+ transformations.unshift(
+ "rotate(180 " + (box.width / 2 + box.left).toString() + " " + (box.height / 2 + box.top).toString() + ")"
+ );
+ break;
+ case 3:
+ tempValue = box.width / 2 + box.left;
+ transformations.unshift(
+ "rotate(-90 " + tempValue.toString() + " " + tempValue.toString() + ")"
+ );
+ break;
+ }
+ if (rotation % 2 === 1) {
+ if (box.left !== box.top) {
+ tempValue = box.left;
+ box.left = box.top;
+ box.top = tempValue;
+ }
+ if (box.width !== box.height) {
+ tempValue = box.width;
+ box.width = box.height;
+ box.height = tempValue;
+ }
+ }
+ if (transformations.length) {
+ body = '' + body + " ";
+ }
+ });
+ const customisationsWidth = fullCustomisations.width;
+ const customisationsHeight = fullCustomisations.height;
+ const boxWidth = box.width;
+ const boxHeight = box.height;
+ let width;
+ let height;
+ if (customisationsWidth === null) {
+ height = customisationsHeight === null ? "1em" : customisationsHeight === "auto" ? boxHeight : customisationsHeight;
+ width = calculateSize(height, boxWidth / boxHeight);
+ } else {
+ width = customisationsWidth === "auto" ? boxWidth : customisationsWidth;
+ height = customisationsHeight === null ? calculateSize(width, boxHeight / boxWidth) : customisationsHeight === "auto" ? boxHeight : customisationsHeight;
+ }
+ const attributes = {};
+ const setAttr = (prop, value) => {
+ if (!isUnsetKeyword(value)) {
+ attributes[prop] = value.toString();
+ }
+ };
+ setAttr("width", width);
+ setAttr("height", height);
+ attributes.viewBox = box.left.toString() + " " + box.top.toString() + " " + boxWidth.toString() + " " + boxHeight.toString();
+ return {
+ attributes,
+ body
+ };
+}
+
+const regex = /\sid="(\S+)"/g;
+const randomPrefix = "IconifyId" + Date.now().toString(16) + (Math.random() * 16777216 | 0).toString(16);
+let counter = 0;
+function replaceIDs(body, prefix = randomPrefix) {
+ const ids = [];
+ let match;
+ while (match = regex.exec(body)) {
+ ids.push(match[1]);
+ }
+ if (!ids.length) {
+ return body;
+ }
+ const suffix = "suffix" + (Math.random() * 16777216 | Date.now()).toString(16);
+ ids.forEach((id) => {
+ const newID = typeof prefix === "function" ? prefix(id) : prefix + (counter++).toString();
+ const escapedID = id.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
+ body = body.replace(
+ // Allowed characters before id: [#;"]
+ // Allowed characters after id: [)"], .[a-z]
+ new RegExp('([#;"])(' + escapedID + ')([")]|\\.[a-z])', "g"),
+ "$1" + newID + suffix + "$3"
+ );
+ });
+ body = body.replace(new RegExp(suffix, "g"), "");
+ return body;
+}
+
+const browserStorageConfig = {
+ local: true,
+ session: true
+};
+const browserStorageEmptyItems = {
+ local: /* @__PURE__ */ new Set(),
+ session: /* @__PURE__ */ new Set()
+};
+let browserStorageStatus = false;
+function setBrowserStorageStatus(status) {
+ browserStorageStatus = status;
+}
+
+const browserCacheVersion = "iconify2";
+const browserCachePrefix = "iconify";
+const browserCacheCountKey = browserCachePrefix + "-count";
+const browserCacheVersionKey = browserCachePrefix + "-version";
+const browserStorageHour = 36e5;
+const browserStorageCacheExpiration = 168;
+
+function getStoredItem(func, key) {
+ try {
+ return func.getItem(key);
+ } catch (err) {
+ }
+}
+function setStoredItem(func, key, value) {
+ try {
+ func.setItem(key, value);
+ return true;
+ } catch (err) {
+ }
+}
+function removeStoredItem(func, key) {
+ try {
+ func.removeItem(key);
+ } catch (err) {
+ }
+}
+
+function setBrowserStorageItemsCount(storage, value) {
+ return setStoredItem(storage, browserCacheCountKey, value.toString());
+}
+function getBrowserStorageItemsCount(storage) {
+ return parseInt(getStoredItem(storage, browserCacheCountKey)) || 0;
+}
+
+let _window = typeof window === "undefined" ? {} : window;
+function getBrowserStorage(key) {
+ const attr = key + "Storage";
+ try {
+ if (_window && _window[attr] && typeof _window[attr].length === "number") {
+ return _window[attr];
+ }
+ } catch (err) {
+ }
+ browserStorageConfig[key] = false;
+}
+
+function iterateBrowserStorage(key, callback) {
+ const func = getBrowserStorage(key);
+ if (!func) {
+ return;
+ }
+ const version = getStoredItem(func, browserCacheVersionKey);
+ if (version !== browserCacheVersion) {
+ if (version) {
+ const total2 = getBrowserStorageItemsCount(func);
+ for (let i = 0; i < total2; i++) {
+ removeStoredItem(func, browserCachePrefix + i.toString());
+ }
+ }
+ setStoredItem(func, browserCacheVersionKey, browserCacheVersion);
+ setBrowserStorageItemsCount(func, 0);
+ return;
+ }
+ const minTime = Math.floor(Date.now() / browserStorageHour) - browserStorageCacheExpiration;
+ const parseItem = (index) => {
+ const name = browserCachePrefix + index.toString();
+ const item = getStoredItem(func, name);
+ if (typeof item !== "string") {
+ return;
+ }
+ try {
+ const data = JSON.parse(item);
+ if (typeof data === "object" && typeof data.cached === "number" && data.cached > minTime && typeof data.provider === "string" && typeof data.data === "object" && typeof data.data.prefix === "string" && // Valid item: run callback
+ callback(data, index)) {
+ return true;
+ }
+ } catch (err) {
+ }
+ removeStoredItem(func, name);
+ };
+ let total = getBrowserStorageItemsCount(func);
+ for (let i = total - 1; i >= 0; i--) {
+ if (!parseItem(i)) {
+ if (i === total - 1) {
+ total--;
+ setBrowserStorageItemsCount(func, total);
+ } else {
+ browserStorageEmptyItems[key].add(i);
+ }
+ }
+ }
+}
+
+function initBrowserStorage() {
+ if (browserStorageStatus) {
+ return;
+ }
+ setBrowserStorageStatus(true);
+ for (const key in browserStorageConfig) {
+ iterateBrowserStorage(key, (item) => {
+ const iconSet = item.data;
+ const provider = item.provider;
+ const prefix = iconSet.prefix;
+ const storage = getStorage(
+ provider,
+ prefix
+ );
+ if (!addIconSet(storage, iconSet).length) {
+ return false;
+ }
+ const lastModified = iconSet.lastModified || -1;
+ storage.lastModifiedCached = storage.lastModifiedCached ? Math.min(storage.lastModifiedCached, lastModified) : lastModified;
+ return true;
+ });
+ }
+}
+
+function toggleBrowserCache(storage, value) {
+ switch (storage) {
+ case "local":
+ case "session":
+ browserStorageConfig[storage] = value;
+ break;
+ case "all":
+ for (const key in browserStorageConfig) {
+ browserStorageConfig[key] = value;
+ }
+ break;
+ }
+}
+
+const storage = /* @__PURE__ */ Object.create(null);
+function setAPIModule(provider, item) {
+ storage[provider] = item;
+}
+function getAPIModule(provider) {
+ return storage[provider] || storage[""];
+}
+
+function createAPIConfig(source) {
+ let resources;
+ if (typeof source.resources === "string") {
+ resources = [source.resources];
+ } else {
+ resources = source.resources;
+ if (!(resources instanceof Array) || !resources.length) {
+ return null;
+ }
+ }
+ const result = {
+ // API hosts
+ resources,
+ // Root path
+ path: source.path || "/",
+ // URL length limit
+ maxURL: source.maxURL || 500,
+ // Timeout before next host is used.
+ rotate: source.rotate || 750,
+ // Timeout before failing query.
+ timeout: source.timeout || 5e3,
+ // Randomise default API end point.
+ random: source.random === true,
+ // Start index
+ index: source.index || 0,
+ // Receive data after time out (used if time out kicks in first, then API module sends data anyway).
+ dataAfterTimeout: source.dataAfterTimeout !== false
+ };
+ return result;
+}
+const configStorage = /* @__PURE__ */ Object.create(null);
+const fallBackAPISources = [
+ "https://api.simplesvg.com",
+ "https://api.unisvg.com"
+];
+const fallBackAPI = [];
+while (fallBackAPISources.length > 0) {
+ if (fallBackAPISources.length === 1) {
+ fallBackAPI.push(fallBackAPISources.shift());
+ } else {
+ if (Math.random() > 0.5) {
+ fallBackAPI.push(fallBackAPISources.shift());
+ } else {
+ fallBackAPI.push(fallBackAPISources.pop());
+ }
+ }
+}
+configStorage[""] = createAPIConfig({
+ resources: ["https://api.iconify.design"].concat(fallBackAPI)
+});
+function addAPIProvider(provider, customConfig) {
+ const config = createAPIConfig(customConfig);
+ if (config === null) {
+ return false;
+ }
+ configStorage[provider] = config;
+ return true;
+}
+function getAPIConfig(provider) {
+ return configStorage[provider];
+}
+function listAPIProviders() {
+ return Object.keys(configStorage);
+}
+
+const detectFetch = () => {
+ let callback;
+ try {
+ callback = fetch;
+ if (typeof callback === "function") {
+ return callback;
+ }
+ } catch (err) {
+ }
+};
+let fetchModule = detectFetch();
+function setFetch(fetch2) {
+ fetchModule = fetch2;
+}
+function getFetch() {
+ return fetchModule;
+}
+function calculateMaxLength(provider, prefix) {
+ const config = getAPIConfig(provider);
+ if (!config) {
+ return 0;
+ }
+ let result;
+ if (!config.maxURL) {
+ result = 0;
+ } else {
+ let maxHostLength = 0;
+ config.resources.forEach((item) => {
+ const host = item;
+ maxHostLength = Math.max(maxHostLength, host.length);
+ });
+ const url = prefix + ".json?icons=";
+ result = config.maxURL - maxHostLength - config.path.length - url.length;
+ }
+ return result;
+}
+function shouldAbort(status) {
+ return status === 404;
+}
+const prepare = (provider, prefix, icons) => {
+ const results = [];
+ const maxLength = calculateMaxLength(provider, prefix);
+ const type = "icons";
+ let item = {
+ type,
+ provider,
+ prefix,
+ icons: []
+ };
+ let length = 0;
+ icons.forEach((name, index) => {
+ length += name.length + 1;
+ if (length >= maxLength && index > 0) {
+ results.push(item);
+ item = {
+ type,
+ provider,
+ prefix,
+ icons: []
+ };
+ length = name.length;
+ }
+ item.icons.push(name);
+ });
+ results.push(item);
+ return results;
+};
+function getPath(provider) {
+ if (typeof provider === "string") {
+ const config = getAPIConfig(provider);
+ if (config) {
+ return config.path;
+ }
+ }
+ return "/";
+}
+const send = (host, params, callback) => {
+ if (!fetchModule) {
+ callback("abort", 424);
+ return;
+ }
+ let path = getPath(params.provider);
+ switch (params.type) {
+ case "icons": {
+ const prefix = params.prefix;
+ const icons = params.icons;
+ const iconsList = icons.join(",");
+ const urlParams = new URLSearchParams({
+ icons: iconsList
+ });
+ path += prefix + ".json?" + urlParams.toString();
+ break;
+ }
+ case "custom": {
+ const uri = params.uri;
+ path += uri.slice(0, 1) === "/" ? uri.slice(1) : uri;
+ break;
+ }
+ default:
+ callback("abort", 400);
+ return;
+ }
+ let defaultError = 503;
+ fetchModule(host + path).then((response) => {
+ const status = response.status;
+ if (status !== 200) {
+ setTimeout(() => {
+ callback(shouldAbort(status) ? "abort" : "next", status);
+ });
+ return;
+ }
+ defaultError = 501;
+ return response.json();
+ }).then((data) => {
+ if (typeof data !== "object" || data === null) {
+ setTimeout(() => {
+ if (data === 404) {
+ callback("abort", data);
+ } else {
+ callback("next", defaultError);
+ }
+ });
+ return;
+ }
+ setTimeout(() => {
+ callback("success", data);
+ });
+ }).catch(() => {
+ callback("next", defaultError);
+ });
+};
+const fetchAPIModule = {
+ prepare,
+ send
+};
+
+function sortIcons(icons) {
+ const result = {
+ loaded: [],
+ missing: [],
+ pending: []
+ };
+ const storage = /* @__PURE__ */ Object.create(null);
+ icons.sort((a, b) => {
+ if (a.provider !== b.provider) {
+ return a.provider.localeCompare(b.provider);
+ }
+ if (a.prefix !== b.prefix) {
+ return a.prefix.localeCompare(b.prefix);
+ }
+ return a.name.localeCompare(b.name);
+ });
+ let lastIcon = {
+ provider: "",
+ prefix: "",
+ name: ""
+ };
+ icons.forEach((icon) => {
+ if (lastIcon.name === icon.name && lastIcon.prefix === icon.prefix && lastIcon.provider === icon.provider) {
+ return;
+ }
+ lastIcon = icon;
+ const provider = icon.provider;
+ const prefix = icon.prefix;
+ const name = icon.name;
+ const providerStorage = storage[provider] || (storage[provider] = /* @__PURE__ */ Object.create(null));
+ const localStorage = providerStorage[prefix] || (providerStorage[prefix] = getStorage(provider, prefix));
+ let list;
+ if (name in localStorage.icons) {
+ list = result.loaded;
+ } else if (prefix === "" || localStorage.missing.has(name)) {
+ list = result.missing;
+ } else {
+ list = result.pending;
+ }
+ const item = {
+ provider,
+ prefix,
+ name
+ };
+ list.push(item);
+ });
+ return result;
+}
+
+function removeCallback(storages, id) {
+ storages.forEach((storage) => {
+ const items = storage.loaderCallbacks;
+ if (items) {
+ storage.loaderCallbacks = items.filter((row) => row.id !== id);
+ }
+ });
+}
+function updateCallbacks(storage) {
+ if (!storage.pendingCallbacksFlag) {
+ storage.pendingCallbacksFlag = true;
+ setTimeout(() => {
+ storage.pendingCallbacksFlag = false;
+ const items = storage.loaderCallbacks ? storage.loaderCallbacks.slice(0) : [];
+ if (!items.length) {
+ return;
+ }
+ let hasPending = false;
+ const provider = storage.provider;
+ const prefix = storage.prefix;
+ items.forEach((item) => {
+ const icons = item.icons;
+ const oldLength = icons.pending.length;
+ icons.pending = icons.pending.filter((icon) => {
+ if (icon.prefix !== prefix) {
+ return true;
+ }
+ const name = icon.name;
+ if (storage.icons[name]) {
+ icons.loaded.push({
+ provider,
+ prefix,
+ name
+ });
+ } else if (storage.missing.has(name)) {
+ icons.missing.push({
+ provider,
+ prefix,
+ name
+ });
+ } else {
+ hasPending = true;
+ return true;
+ }
+ return false;
+ });
+ if (icons.pending.length !== oldLength) {
+ if (!hasPending) {
+ removeCallback([storage], item.id);
+ }
+ item.callback(
+ icons.loaded.slice(0),
+ icons.missing.slice(0),
+ icons.pending.slice(0),
+ item.abort
+ );
+ }
+ });
+ });
+ }
+}
+let idCounter = 0;
+function storeCallback(callback, icons, pendingSources) {
+ const id = idCounter++;
+ const abort = removeCallback.bind(null, pendingSources, id);
+ if (!icons.pending.length) {
+ return abort;
+ }
+ const item = {
+ id,
+ icons,
+ callback,
+ abort
+ };
+ pendingSources.forEach((storage) => {
+ (storage.loaderCallbacks || (storage.loaderCallbacks = [])).push(item);
+ });
+ return abort;
+}
+
+function listToIcons(list, validate = true, simpleNames = false) {
+ const result = [];
+ list.forEach((item) => {
+ const icon = typeof item === "string" ? stringToIcon(item, validate, simpleNames) : item;
+ if (icon) {
+ result.push(icon);
+ }
+ });
+ return result;
+}
+
+// src/config.ts
+var defaultConfig = {
+ resources: [],
+ index: 0,
+ timeout: 2e3,
+ rotate: 750,
+ random: false,
+ dataAfterTimeout: false
+};
+
+// src/query.ts
+function sendQuery(config, payload, query, done) {
+ const resourcesCount = config.resources.length;
+ const startIndex = config.random ? Math.floor(Math.random() * resourcesCount) : config.index;
+ let resources;
+ if (config.random) {
+ let list = config.resources.slice(0);
+ resources = [];
+ while (list.length > 1) {
+ const nextIndex = Math.floor(Math.random() * list.length);
+ resources.push(list[nextIndex]);
+ list = list.slice(0, nextIndex).concat(list.slice(nextIndex + 1));
+ }
+ resources = resources.concat(list);
+ } else {
+ resources = config.resources.slice(startIndex).concat(config.resources.slice(0, startIndex));
+ }
+ const startTime = Date.now();
+ let status = "pending";
+ let queriesSent = 0;
+ let lastError;
+ let timer = null;
+ let queue = [];
+ let doneCallbacks = [];
+ if (typeof done === "function") {
+ doneCallbacks.push(done);
+ }
+ function resetTimer() {
+ if (timer) {
+ clearTimeout(timer);
+ timer = null;
+ }
+ }
+ function abort() {
+ if (status === "pending") {
+ status = "aborted";
+ }
+ resetTimer();
+ queue.forEach((item) => {
+ if (item.status === "pending") {
+ item.status = "aborted";
+ }
+ });
+ queue = [];
+ }
+ function subscribe(callback, overwrite) {
+ if (overwrite) {
+ doneCallbacks = [];
+ }
+ if (typeof callback === "function") {
+ doneCallbacks.push(callback);
+ }
+ }
+ function getQueryStatus() {
+ return {
+ startTime,
+ payload,
+ status,
+ queriesSent,
+ queriesPending: queue.length,
+ subscribe,
+ abort
+ };
+ }
+ function failQuery() {
+ status = "failed";
+ doneCallbacks.forEach((callback) => {
+ callback(void 0, lastError);
+ });
+ }
+ function clearQueue() {
+ queue.forEach((item) => {
+ if (item.status === "pending") {
+ item.status = "aborted";
+ }
+ });
+ queue = [];
+ }
+ function moduleResponse(item, response, data) {
+ const isError = response !== "success";
+ queue = queue.filter((queued) => queued !== item);
+ switch (status) {
+ case "pending":
+ break;
+ case "failed":
+ if (isError || !config.dataAfterTimeout) {
+ return;
+ }
+ break;
+ default:
+ return;
+ }
+ if (response === "abort") {
+ lastError = data;
+ failQuery();
+ return;
+ }
+ if (isError) {
+ lastError = data;
+ if (!queue.length) {
+ if (!resources.length) {
+ failQuery();
+ } else {
+ execNext();
+ }
+ }
+ return;
+ }
+ resetTimer();
+ clearQueue();
+ if (!config.random) {
+ const index = config.resources.indexOf(item.resource);
+ if (index !== -1 && index !== config.index) {
+ config.index = index;
+ }
+ }
+ status = "completed";
+ doneCallbacks.forEach((callback) => {
+ callback(data);
+ });
+ }
+ function execNext() {
+ if (status !== "pending") {
+ return;
+ }
+ resetTimer();
+ const resource = resources.shift();
+ if (resource === void 0) {
+ if (queue.length) {
+ timer = setTimeout(() => {
+ resetTimer();
+ if (status === "pending") {
+ clearQueue();
+ failQuery();
+ }
+ }, config.timeout);
+ return;
+ }
+ failQuery();
+ return;
+ }
+ const item = {
+ status: "pending",
+ resource,
+ callback: (status2, data) => {
+ moduleResponse(item, status2, data);
+ }
+ };
+ queue.push(item);
+ queriesSent++;
+ timer = setTimeout(execNext, config.rotate);
+ query(resource, payload, item.callback);
+ }
+ setTimeout(execNext);
+ return getQueryStatus;
+}
+
+// src/index.ts
+function initRedundancy(cfg) {
+ const config = {
+ ...defaultConfig,
+ ...cfg
+ };
+ let queries = [];
+ function cleanup() {
+ queries = queries.filter((item) => item().status === "pending");
+ }
+ function query(payload, queryCallback, doneCallback) {
+ const query2 = sendQuery(
+ config,
+ payload,
+ queryCallback,
+ (data, error) => {
+ cleanup();
+ if (doneCallback) {
+ doneCallback(data, error);
+ }
+ }
+ );
+ queries.push(query2);
+ return query2;
+ }
+ function find(callback) {
+ return queries.find((value) => {
+ return callback(value);
+ }) || null;
+ }
+ const instance = {
+ query,
+ find,
+ setIndex: (index) => {
+ config.index = index;
+ },
+ getIndex: () => config.index,
+ cleanup
+ };
+ return instance;
+}
+
+function emptyCallback$1() {
+}
+const redundancyCache = /* @__PURE__ */ Object.create(null);
+function getRedundancyCache(provider) {
+ if (!redundancyCache[provider]) {
+ const config = getAPIConfig(provider);
+ if (!config) {
+ return;
+ }
+ const redundancy = initRedundancy(config);
+ const cachedReundancy = {
+ config,
+ redundancy
+ };
+ redundancyCache[provider] = cachedReundancy;
+ }
+ return redundancyCache[provider];
+}
+function sendAPIQuery(target, query, callback) {
+ let redundancy;
+ let send;
+ if (typeof target === "string") {
+ const api = getAPIModule(target);
+ if (!api) {
+ callback(void 0, 424);
+ return emptyCallback$1;
+ }
+ send = api.send;
+ const cached = getRedundancyCache(target);
+ if (cached) {
+ redundancy = cached.redundancy;
+ }
+ } else {
+ const config = createAPIConfig(target);
+ if (config) {
+ redundancy = initRedundancy(config);
+ const moduleKey = target.resources ? target.resources[0] : "";
+ const api = getAPIModule(moduleKey);
+ if (api) {
+ send = api.send;
+ }
+ }
+ }
+ if (!redundancy || !send) {
+ callback(void 0, 424);
+ return emptyCallback$1;
+ }
+ return redundancy.query(query, send, callback)().abort;
+}
+
+function updateLastModified(storage, lastModified) {
+ const lastValue = storage.lastModifiedCached;
+ if (
+ // Matches or newer
+ lastValue && lastValue >= lastModified
+ ) {
+ return lastValue === lastModified;
+ }
+ storage.lastModifiedCached = lastModified;
+ if (lastValue) {
+ for (const key in browserStorageConfig) {
+ iterateBrowserStorage(key, (item) => {
+ const iconSet = item.data;
+ return item.provider !== storage.provider || iconSet.prefix !== storage.prefix || iconSet.lastModified === lastModified;
+ });
+ }
+ }
+ return true;
+}
+function storeInBrowserStorage(storage, data) {
+ if (!browserStorageStatus) {
+ initBrowserStorage();
+ }
+ function store(key) {
+ let func;
+ if (!browserStorageConfig[key] || !(func = getBrowserStorage(key))) {
+ return;
+ }
+ const set = browserStorageEmptyItems[key];
+ let index;
+ if (set.size) {
+ set.delete(index = Array.from(set).shift());
+ } else {
+ index = getBrowserStorageItemsCount(func);
+ if (!setBrowserStorageItemsCount(func, index + 1)) {
+ return;
+ }
+ }
+ const item = {
+ cached: Math.floor(Date.now() / browserStorageHour),
+ provider: storage.provider,
+ data
+ };
+ return setStoredItem(
+ func,
+ browserCachePrefix + index.toString(),
+ JSON.stringify(item)
+ );
+ }
+ if (data.lastModified && !updateLastModified(storage, data.lastModified)) {
+ return;
+ }
+ if (!Object.keys(data.icons).length) {
+ return;
+ }
+ if (data.not_found) {
+ data = Object.assign({}, data);
+ delete data.not_found;
+ }
+ if (!store("local")) {
+ store("session");
+ }
+}
+
+function emptyCallback() {
+}
+function loadedNewIcons(storage) {
+ if (!storage.iconsLoaderFlag) {
+ storage.iconsLoaderFlag = true;
+ setTimeout(() => {
+ storage.iconsLoaderFlag = false;
+ updateCallbacks(storage);
+ });
+ }
+}
+function loadNewIcons(storage, icons) {
+ if (!storage.iconsToLoad) {
+ storage.iconsToLoad = icons;
+ } else {
+ storage.iconsToLoad = storage.iconsToLoad.concat(icons).sort();
+ }
+ if (!storage.iconsQueueFlag) {
+ storage.iconsQueueFlag = true;
+ setTimeout(() => {
+ storage.iconsQueueFlag = false;
+ const { provider, prefix } = storage;
+ const icons2 = storage.iconsToLoad;
+ delete storage.iconsToLoad;
+ let api;
+ if (!icons2 || !(api = getAPIModule(provider))) {
+ return;
+ }
+ const params = api.prepare(provider, prefix, icons2);
+ params.forEach((item) => {
+ sendAPIQuery(provider, item, (data) => {
+ if (typeof data !== "object") {
+ item.icons.forEach((name) => {
+ storage.missing.add(name);
+ });
+ } else {
+ try {
+ const parsed = addIconSet(
+ storage,
+ data
+ );
+ if (!parsed.length) {
+ return;
+ }
+ const pending = storage.pendingIcons;
+ if (pending) {
+ parsed.forEach((name) => {
+ pending.delete(name);
+ });
+ }
+ storeInBrowserStorage(storage, data);
+ } catch (err) {
+ console.error(err);
+ }
+ }
+ loadedNewIcons(storage);
+ });
+ });
+ });
+ }
+}
+const isPending = (icon) => {
+ const storage = getStorage(
+ icon.provider,
+ icon.prefix
+ );
+ const pending = storage.pendingIcons;
+ return !!(pending && pending.has(icon.name));
+};
+const loadIcons = (icons, callback) => {
+ const cleanedIcons = listToIcons(icons, true, allowSimpleNames());
+ const sortedIcons = sortIcons(cleanedIcons);
+ if (!sortedIcons.pending.length) {
+ let callCallback = true;
+ if (callback) {
+ setTimeout(() => {
+ if (callCallback) {
+ callback(
+ sortedIcons.loaded,
+ sortedIcons.missing,
+ sortedIcons.pending,
+ emptyCallback
+ );
+ }
+ });
+ }
+ return () => {
+ callCallback = false;
+ };
+ }
+ const newIcons = /* @__PURE__ */ Object.create(null);
+ const sources = [];
+ let lastProvider, lastPrefix;
+ sortedIcons.pending.forEach((icon) => {
+ const { provider, prefix } = icon;
+ if (prefix === lastPrefix && provider === lastProvider) {
+ return;
+ }
+ lastProvider = provider;
+ lastPrefix = prefix;
+ sources.push(getStorage(provider, prefix));
+ const providerNewIcons = newIcons[provider] || (newIcons[provider] = /* @__PURE__ */ Object.create(null));
+ if (!providerNewIcons[prefix]) {
+ providerNewIcons[prefix] = [];
+ }
+ });
+ sortedIcons.pending.forEach((icon) => {
+ const { provider, prefix, name } = icon;
+ const storage = getStorage(provider, prefix);
+ const pendingQueue = storage.pendingIcons || (storage.pendingIcons = /* @__PURE__ */ new Set());
+ if (!pendingQueue.has(name)) {
+ pendingQueue.add(name);
+ newIcons[provider][prefix].push(name);
+ }
+ });
+ sources.forEach((storage) => {
+ const { provider, prefix } = storage;
+ if (newIcons[provider][prefix].length) {
+ loadNewIcons(storage, newIcons[provider][prefix]);
+ }
+ });
+ return callback ? storeCallback(callback, sortedIcons, sources) : emptyCallback;
+};
+const loadIcon = (icon) => {
+ return new Promise((fulfill, reject) => {
+ const iconObj = typeof icon === "string" ? stringToIcon(icon, true) : icon;
+ if (!iconObj) {
+ reject(icon);
+ return;
+ }
+ loadIcons([iconObj || icon], (loaded) => {
+ if (loaded.length && iconObj) {
+ const data = getIconData(iconObj);
+ if (data) {
+ fulfill({
+ ...defaultIconProps,
+ ...data
+ });
+ return;
+ }
+ }
+ reject(icon);
+ });
+ });
+};
+
+function mergeCustomisations(defaults, item) {
+ const result = {
+ ...defaults
+ };
+ for (const key in item) {
+ const value = item[key];
+ const valueType = typeof value;
+ if (key in defaultIconSizeCustomisations) {
+ if (value === null || value && (valueType === "string" || valueType === "number")) {
+ result[key] = value;
+ }
+ } else if (valueType === typeof result[key]) {
+ result[key] = key === "rotate" ? value % 4 : value;
+ }
+ }
+ return result;
+}
+
+const defaultExtendedIconCustomisations = {
+ ...defaultIconCustomisations,
+ inline: false,
+};
+/**
+ * Class names
+ */
+const blockClass = 'iconify';
+const inlineClass = 'iconify-inline';
+/**
+ * Names of properties to add to nodes
+ */
+const elementDataProperty = ('iconifyData' + Date.now());
+
+/**
+ * List of root nodes
+ */
+let nodes = [];
+/**
+ * Find node
+ */
+function findRootNode(node) {
+ for (let i = 0; i < nodes.length; i++) {
+ const item = nodes[i];
+ const root = typeof item.node === 'function' ? item.node() : item.node;
+ if (root === node) {
+ return item;
+ }
+ }
+}
+/**
+ * Add extra root node
+ */
+function addRootNode(root, autoRemove = false) {
+ let node = findRootNode(root);
+ if (node) {
+ // Node already exist: switch type if needed
+ if (node.temporary) {
+ node.temporary = autoRemove;
+ }
+ return node;
+ }
+ // Create item, add it to list
+ node = {
+ node: root,
+ temporary: autoRemove,
+ };
+ nodes.push(node);
+ return node;
+}
+/**
+ * Add document.body node
+ */
+function addBodyNode() {
+ if (document.documentElement) {
+ return addRootNode(document.documentElement);
+ }
+ nodes.push({
+ node: () => {
+ return document.documentElement;
+ },
+ });
+}
+/**
+ * Remove root node
+ */
+function removeRootNode(root) {
+ nodes = nodes.filter((node) => root !== node &&
+ root !== (typeof node.node === 'function' ? node.node() : node.node));
+}
+/**
+ * Get list of root nodes
+ */
+function listRootNodes() {
+ return nodes;
+}
+
+/**
+ * Execute function when DOM is ready
+ */
+function onReady(callback) {
+ const doc = document;
+ if (doc.readyState && doc.readyState !== 'loading') {
+ callback();
+ }
+ else {
+ doc.addEventListener('DOMContentLoaded', callback);
+ }
+}
+
+/**
+ * Callback
+ */
+let callback = null;
+/**
+ * Parameters for mutation observer
+ */
+const observerParams = {
+ childList: true,
+ subtree: true,
+ attributes: true,
+};
+/**
+ * Queue DOM scan
+ */
+function queueScan(node) {
+ if (!node.observer) {
+ return;
+ }
+ const observer = node.observer;
+ if (!observer.pendingScan) {
+ observer.pendingScan = setTimeout(() => {
+ delete observer.pendingScan;
+ if (callback) {
+ callback(node);
+ }
+ });
+ }
+}
+/**
+ * Check mutations for added nodes
+ */
+function checkMutations(node, mutations) {
+ if (!node.observer) {
+ return;
+ }
+ const observer = node.observer;
+ if (!observer.pendingScan) {
+ for (let i = 0; i < mutations.length; i++) {
+ const item = mutations[i];
+ if (
+ // Check for added nodes
+ (item.addedNodes && item.addedNodes.length > 0) ||
+ // Check for icon or placeholder with modified attributes
+ (item.type === 'attributes' &&
+ item.target[elementDataProperty] !==
+ void 0)) {
+ if (!observer.paused) {
+ queueScan(node);
+ }
+ return;
+ }
+ }
+ }
+}
+/**
+ * Start/resume observer
+ */
+function continueObserving(node, root) {
+ node.observer.instance.observe(root, observerParams);
+}
+/**
+ * Start mutation observer
+ */
+function startObserver(node) {
+ let observer = node.observer;
+ if (observer && observer.instance) {
+ // Already started
+ return;
+ }
+ const root = typeof node.node === 'function' ? node.node() : node.node;
+ if (!root || !window) {
+ // document.body is not available yet or window is missing
+ return;
+ }
+ if (!observer) {
+ observer = {
+ paused: 0,
+ };
+ node.observer = observer;
+ }
+ // Create new instance, observe
+ observer.instance = new window.MutationObserver(checkMutations.bind(null, node));
+ continueObserving(node, root);
+ // Scan immediately
+ if (!observer.paused) {
+ queueScan(node);
+ }
+}
+/**
+ * Start all observers
+ */
+function startObservers() {
+ listRootNodes().forEach(startObserver);
+}
+/**
+ * Stop observer
+ */
+function stopObserver(node) {
+ if (!node.observer) {
+ return;
+ }
+ const observer = node.observer;
+ // Stop scan
+ if (observer.pendingScan) {
+ clearTimeout(observer.pendingScan);
+ delete observer.pendingScan;
+ }
+ // Disconnect observer
+ if (observer.instance) {
+ observer.instance.disconnect();
+ delete observer.instance;
+ }
+}
+/**
+ * Start observer when DOM is ready
+ */
+function initObserver(cb) {
+ const isRestart = callback !== null;
+ if (callback !== cb) {
+ // Change callback and stop all pending observers
+ callback = cb;
+ if (isRestart) {
+ listRootNodes().forEach(stopObserver);
+ }
+ }
+ if (isRestart) {
+ // Restart instances
+ startObservers();
+ return;
+ }
+ // Start observers when document is ready
+ onReady(startObservers);
+}
+/**
+ * Pause observing node
+ */
+function pauseObservingNode(node) {
+ (node ? [node] : listRootNodes()).forEach((node) => {
+ if (!node.observer) {
+ node.observer = {
+ paused: 1,
+ };
+ return;
+ }
+ const observer = node.observer;
+ observer.paused++;
+ if (observer.paused > 1 || !observer.instance) {
+ return;
+ }
+ // Disconnect observer
+ const instance = observer.instance;
+ // checkMutations(node, instance.takeRecords());
+ instance.disconnect();
+ });
+}
+/**
+ * Pause observer
+ */
+function pauseObserver(root) {
+ if (root) {
+ const node = findRootNode(root);
+ if (node) {
+ pauseObservingNode(node);
+ }
+ }
+ else {
+ pauseObservingNode();
+ }
+}
+/**
+ * Resume observer
+ */
+function resumeObservingNode(observer) {
+ (observer ? [observer] : listRootNodes()).forEach((node) => {
+ if (!node.observer) {
+ // Start observer
+ startObserver(node);
+ return;
+ }
+ const observer = node.observer;
+ if (observer.paused) {
+ observer.paused--;
+ if (!observer.paused) {
+ // Start / resume
+ const root = typeof node.node === 'function' ? node.node() : node.node;
+ if (!root) {
+ return;
+ }
+ else if (observer.instance) {
+ continueObserving(node, root);
+ }
+ else {
+ startObserver(node);
+ }
+ }
+ }
+ });
+}
+/**
+ * Resume observer
+ */
+function resumeObserver(root) {
+ if (root) {
+ const node = findRootNode(root);
+ if (node) {
+ resumeObservingNode(node);
+ }
+ }
+ else {
+ resumeObservingNode();
+ }
+}
+/**
+ * Observe node
+ */
+function observe(root, autoRemove = false) {
+ const node = addRootNode(root, autoRemove);
+ startObserver(node);
+ return node;
+}
+/**
+ * Remove observed node
+ */
+function stopObserving(root) {
+ const node = findRootNode(root);
+ if (node) {
+ stopObserver(node);
+ removeRootNode(root);
+ }
+}
+
+/**
+ * Compare props
+ */
+function propsChanged(props1, props2) {
+ if (props1.name !== props2.name || props1.mode !== props2.mode) {
+ return true;
+ }
+ const customisations1 = props1.customisations;
+ const customisations2 = props2.customisations;
+ for (const key in defaultExtendedIconCustomisations) {
+ if (customisations1[key] !== customisations2[key]) {
+ return true;
+ }
+ }
+ return false;
+}
+
+function rotateFromString(value, defaultValue = 0) {
+ const units = value.replace(/^-?[0-9.]*/, "");
+ function cleanup(value2) {
+ while (value2 < 0) {
+ value2 += 4;
+ }
+ return value2 % 4;
+ }
+ if (units === "") {
+ const num = parseInt(value);
+ return isNaN(num) ? 0 : cleanup(num);
+ } else if (units !== value) {
+ let split = 0;
+ switch (units) {
+ case "%":
+ split = 25;
+ break;
+ case "deg":
+ split = 90;
+ }
+ if (split) {
+ let num = parseFloat(value.slice(0, value.length - units.length));
+ if (isNaN(num)) {
+ return 0;
+ }
+ num = num / split;
+ return num % 1 === 0 ? cleanup(num) : 0;
+ }
+ }
+ return defaultValue;
+}
+
+const separator = /[\s,]+/;
+function flipFromString(custom, flip) {
+ flip.split(separator).forEach((str) => {
+ const value = str.trim();
+ switch (value) {
+ case "horizontal":
+ custom.hFlip = true;
+ break;
+ case "vertical":
+ custom.vFlip = true;
+ break;
+ }
+ });
+}
+
+/**
+ * Size attributes
+ */
+const sizeAttributes = ['width', 'height'];
+/**
+ * Boolean attributes
+ */
+const booleanAttributes = [
+ 'inline',
+ 'hFlip',
+ 'vFlip',
+];
+/**
+ * Get attribute value
+ */
+function getBooleanAttribute(value, key) {
+ if (value === key || value === 'true') {
+ return true;
+ }
+ if (value === '' || value === 'false') {
+ return false;
+ }
+ return null;
+}
+/**
+ * Get element properties from HTML element
+ */
+function getElementProps(element) {
+ // Get icon name
+ const name = element.getAttribute('data-icon');
+ const icon = typeof name === 'string' && stringToIcon(name, true);
+ if (!icon) {
+ return null;
+ }
+ // Get defaults and inline
+ const customisations = {
+ ...defaultExtendedIconCustomisations,
+ inline: element.classList && element.classList.contains(inlineClass),
+ };
+ // Get dimensions
+ sizeAttributes.forEach((attr) => {
+ const value = element.getAttribute('data-' + attr);
+ if (value) {
+ customisations[attr] = value;
+ }
+ });
+ // Get rotation
+ const rotation = element.getAttribute('data-rotate');
+ if (typeof rotation === 'string') {
+ customisations.rotate = rotateFromString(rotation);
+ }
+ // Get flip shorthand
+ const flip = element.getAttribute('data-flip');
+ if (typeof flip === 'string') {
+ flipFromString(customisations, flip);
+ }
+ // Boolean attributes
+ booleanAttributes.forEach((attr) => {
+ const key = 'data-' + attr;
+ const value = getBooleanAttribute(element.getAttribute(key), key);
+ if (typeof value === 'boolean') {
+ customisations[attr] = value;
+ }
+ });
+ // Get render mode. Not checking actual value because incorrect values are treated as inline
+ const mode = element.getAttribute('data-mode');
+ return {
+ name,
+ icon,
+ customisations,
+ mode,
+ };
+}
+
+/**
+ * Selector combining class names and tags
+ */
+const selector = 'svg.' +
+ blockClass +
+ ', i.' +
+ blockClass +
+ ', span.' +
+ blockClass +
+ ', i.' +
+ inlineClass +
+ ', span.' +
+ inlineClass;
+/**
+ * Find all parent nodes in DOM
+ */
+function scanRootNode(root) {
+ const nodes = [];
+ root.querySelectorAll(selector).forEach((node) => {
+ // Get props, ignore SVG rendered outside of SVG framework
+ const props = node[elementDataProperty] || node.tagName.toLowerCase() !== 'svg'
+ ? getElementProps(node)
+ : null;
+ if (props) {
+ nodes.push({
+ node,
+ props,
+ });
+ }
+ });
+ return nodes;
+}
+
+function iconToHTML(body, attributes) {
+ let renderAttribsHTML = body.indexOf("xlink:") === -1 ? "" : ' xmlns:xlink="http://www.w3.org/1999/xlink"';
+ for (const attr in attributes) {
+ renderAttribsHTML += " " + attr + '="' + attributes[attr] + '"';
+ }
+ return '" + body + " ";
+}
+
+let policy;
+function createPolicy() {
+ try {
+ policy = window.trustedTypes.createPolicy("iconify", {
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
+ createHTML: (s) => s
+ });
+ } catch (err) {
+ policy = null;
+ }
+}
+function cleanUpInnerHTML(html) {
+ if (policy === void 0) {
+ createPolicy();
+ }
+ return policy ? policy.createHTML(html) : html;
+}
+
+/**
+ * Get classes to add from icon name
+ */
+function iconClasses(iconName) {
+ const classesToAdd = new Set(['iconify']);
+ ['provider', 'prefix'].forEach((attr) => {
+ if (iconName[attr]) {
+ classesToAdd.add('iconify--' + iconName[attr]);
+ }
+ });
+ return classesToAdd;
+}
+/**
+ * Add classes to SVG, removing previously added classes, keeping custom classes
+ */
+function applyClasses(svg, classes, previouslyAddedClasses, placeholder) {
+ const svgClasses = svg.classList;
+ // Copy classes from placeholder
+ if (placeholder) {
+ const placeholderClasses = placeholder.classList;
+ Array.from(placeholderClasses).forEach((item) => {
+ svgClasses.add(item);
+ });
+ }
+ // Add new classes
+ const addedClasses = [];
+ classes.forEach((item) => {
+ if (!svgClasses.contains(item)) {
+ // Add new class
+ svgClasses.add(item);
+ addedClasses.push(item);
+ }
+ else if (previouslyAddedClasses.has(item)) {
+ // Was added before: keep it
+ addedClasses.push(item);
+ }
+ });
+ // Remove previously added classes
+ previouslyAddedClasses.forEach((item) => {
+ if (!classes.has(item)) {
+ // Class that was added before, but no longer needed
+ svgClasses.remove(item);
+ }
+ });
+ return addedClasses;
+}
+
+/**
+ * Copy old styles, apply new styles
+ */
+function applyStyle(svg, styles, previouslyAddedStyles) {
+ const svgStyle = svg.style;
+ // Remove previously added styles
+ (previouslyAddedStyles || []).forEach((prop) => {
+ svgStyle.removeProperty(prop);
+ });
+ // Apply new styles, ignoring styles that already exist
+ const appliedStyles = [];
+ for (const prop in styles) {
+ if (!svgStyle.getPropertyValue(prop)) {
+ appliedStyles.push(prop);
+ svgStyle.setProperty(prop, styles[prop]);
+ }
+ }
+ return appliedStyles;
+}
+
+/**
+ * Render icon as inline SVG
+ */
+function renderInlineSVG(element, props, iconData) {
+ // Create placeholder. Why placeholder? innerHTML setter on SVG does not work in some environments.
+ let span;
+ try {
+ span = document.createElement('span');
+ }
+ catch (err) {
+ return element;
+ }
+ // Generate data to render
+ const customisations = props.customisations;
+ const renderData = iconToSVG(iconData, customisations);
+ // Get old data
+ const oldData = element[elementDataProperty];
+ // Generate SVG
+ const html = iconToHTML(replaceIDs(renderData.body), {
+ 'aria-hidden': 'true',
+ 'role': 'img',
+ ...renderData.attributes,
+ });
+ span.innerHTML = cleanUpInnerHTML(html);
+ // Get SVG element
+ const svg = span.childNodes[0];
+ // Add attributes
+ const placeholderAttributes = element.attributes;
+ for (let i = 0; i < placeholderAttributes.length; i++) {
+ const item = placeholderAttributes.item(i);
+ const name = item.name;
+ if (name !== 'class' && !svg.hasAttribute(name)) {
+ svg.setAttribute(name, item.value);
+ }
+ }
+ // Add classes
+ const classesToAdd = iconClasses(props.icon);
+ const addedClasses = applyClasses(svg, classesToAdd, new Set(oldData && oldData.addedClasses), element);
+ // Update style
+ const addedStyles = applyStyle(svg, customisations.inline
+ ? {
+ 'vertical-align': '-0.125em',
+ }
+ : {}, oldData && oldData.addedStyles);
+ // Add data to element
+ const newData = {
+ ...props,
+ status: 'loaded',
+ addedClasses,
+ addedStyles,
+ };
+ svg[elementDataProperty] = newData;
+ // Replace old element
+ if (element.parentNode) {
+ element.parentNode.replaceChild(svg, element);
+ }
+ return svg;
+}
+
+function encodeSVGforURL(svg) {
+ return svg.replace(/"/g, "'").replace(/%/g, "%25").replace(/#/g, "%23").replace(//g, "%3E").replace(/\s+/g, " ");
+}
+function svgToData(svg) {
+ return "data:image/svg+xml," + encodeSVGforURL(svg);
+}
+function svgToURL(svg) {
+ return 'url("' + svgToData(svg) + '")';
+}
+
+const commonProps = {
+ display: 'inline-block',
+};
+const monotoneProps = {
+ 'background-color': 'currentColor',
+};
+const coloredProps = {
+ 'background-color': 'transparent',
+};
+// Dynamically add common props to variables above
+const propsToAdd = {
+ image: 'var(--svg)',
+ repeat: 'no-repeat',
+ size: '100% 100%',
+};
+const propsToAddTo = {
+ '-webkit-mask': monotoneProps,
+ 'mask': monotoneProps,
+ 'background': coloredProps,
+};
+for (const prefix in propsToAddTo) {
+ const list = propsToAddTo[prefix];
+ for (const prop in propsToAdd) {
+ list[prefix + '-' + prop] = propsToAdd[prop];
+ }
+}
+/**
+ * Fix size: add 'px' to numbers
+ */
+function fixSize(value) {
+ return value + (value.match(/^[-0-9.]+$/) ? 'px' : '');
+}
+/**
+ * Render icon as inline SVG
+ */
+function renderBackground(element, props, iconData, useMask) {
+ // Generate data to render
+ const customisations = props.customisations;
+ const renderData = iconToSVG(iconData, customisations);
+ const renderAttribs = renderData.attributes;
+ // Get old data
+ const oldData = element[elementDataProperty];
+ // Generate SVG
+ const html = iconToHTML(renderData.body, {
+ ...renderAttribs,
+ width: iconData.width + '',
+ height: iconData.height + '',
+ });
+ // Add classes
+ const classesToAdd = iconClasses(props.icon);
+ const addedClasses = applyClasses(element, classesToAdd, new Set(oldData && oldData.addedClasses));
+ // Update style
+ const url = svgToURL(html);
+ const newStyles = {
+ '--svg': url,
+ 'width': fixSize(renderAttribs.width),
+ 'height': fixSize(renderAttribs.height),
+ ...commonProps,
+ ...(useMask ? monotoneProps : coloredProps),
+ };
+ if (customisations.inline) {
+ newStyles['vertical-align'] = '-0.125em';
+ }
+ const addedStyles = applyStyle(element, newStyles, oldData && oldData.addedStyles);
+ // Add data to element
+ const newData = {
+ ...props,
+ status: 'loaded',
+ addedClasses,
+ addedStyles,
+ };
+ element[elementDataProperty] = newData;
+ return element;
+}
+
+/**
+ * Flag to avoid scanning DOM too often
+ */
+let scanQueued = false;
+/**
+ * Icons have been loaded
+ */
+function checkPendingIcons() {
+ if (!scanQueued) {
+ scanQueued = true;
+ setTimeout(() => {
+ if (scanQueued) {
+ scanQueued = false;
+ scanDOM();
+ }
+ });
+ }
+}
+/**
+ * Scan node for placeholders
+ */
+function scanDOM(rootNode, addTempNode = false) {
+ // List of icons to load: [provider][prefix] = Set
+ const iconsToLoad = Object.create(null);
+ function getIcon(icon, load) {
+ const { provider, prefix, name } = icon;
+ const storage = getStorage(provider, prefix);
+ const storedIcon = storage.icons[name];
+ if (storedIcon) {
+ return {
+ status: 'loaded',
+ icon: storedIcon,
+ };
+ }
+ if (storage.missing.has(name)) {
+ return {
+ status: 'missing',
+ };
+ }
+ if (load && !isPending(icon)) {
+ const providerIconsToLoad = iconsToLoad[provider] ||
+ (iconsToLoad[provider] = Object.create(null));
+ const set = providerIconsToLoad[prefix] ||
+ (providerIconsToLoad[prefix] = new Set());
+ set.add(name);
+ }
+ return {
+ status: 'loading',
+ };
+ }
+ // Parse all root nodes
+ (rootNode ? [rootNode] : listRootNodes()).forEach((observedNode) => {
+ const root = typeof observedNode.node === 'function'
+ ? observedNode.node()
+ : observedNode.node;
+ if (!root || !root.querySelectorAll) {
+ return;
+ }
+ // Track placeholders
+ let hasPlaceholders = false;
+ // Observer
+ let paused = false;
+ /**
+ * Render icon
+ */
+ function render(element, props, iconData) {
+ if (!paused) {
+ paused = true;
+ pauseObservingNode(observedNode);
+ }
+ if (element.tagName.toUpperCase() !== 'SVG') {
+ // Check for one of style modes
+ const mode = props.mode;
+ const isMask = mode === 'mask' ||
+ (mode === 'bg'
+ ? false
+ : mode === 'style'
+ ? iconData.body.indexOf('currentColor') !== -1
+ : null);
+ if (typeof isMask === 'boolean') {
+ renderBackground(element, props, {
+ ...defaultIconProps,
+ ...iconData,
+ }, isMask);
+ return;
+ }
+ }
+ renderInlineSVG(element, props, iconData);
+ }
+ // Find all elements
+ scanRootNode(root).forEach(({ node, props }) => {
+ // Check if item already has props
+ const oldData = node[elementDataProperty];
+ if (!oldData) {
+ // New icon without data
+ const { status, icon } = getIcon(props.icon, true);
+ if (icon) {
+ // Ready to render!
+ render(node, props, icon);
+ return;
+ }
+ // Loading or missing
+ hasPlaceholders = hasPlaceholders || status === 'loading';
+ node[elementDataProperty] = {
+ ...props,
+ status,
+ };
+ return;
+ }
+ // Previously found icon
+ let item;
+ if (!propsChanged(oldData, props)) {
+ // Props have not changed. Check status
+ const oldStatus = oldData.status;
+ if (oldStatus !== 'loading') {
+ return;
+ }
+ item = getIcon(props.icon, false);
+ if (!item.icon) {
+ // Nothing to render
+ oldData.status = item.status;
+ return;
+ }
+ }
+ else {
+ // Properties have changed: load icon if name has changed
+ item = getIcon(props.icon, oldData.name !== props.name);
+ if (!item.icon) {
+ // Cannot render icon: update status and props
+ hasPlaceholders =
+ hasPlaceholders || item.status === 'loading';
+ Object.assign(oldData, {
+ ...props,
+ status: item.status,
+ });
+ return;
+ }
+ }
+ // Re-render icon
+ render(node, props, item.icon);
+ });
+ // Observed node stuff
+ if (observedNode.temporary && !hasPlaceholders) {
+ // Remove temporary node
+ stopObserving(root);
+ }
+ else if (addTempNode && hasPlaceholders) {
+ // Add new temporary node
+ observe(root, true);
+ }
+ else if (paused && observedNode.observer) {
+ // Resume observer
+ resumeObservingNode(observedNode);
+ }
+ });
+ // Load icons
+ for (const provider in iconsToLoad) {
+ const providerIconsToLoad = iconsToLoad[provider];
+ for (const prefix in providerIconsToLoad) {
+ const set = providerIconsToLoad[prefix];
+ loadIcons(Array.from(set).map((name) => ({
+ provider,
+ prefix,
+ name,
+ })), checkPendingIcons);
+ }
+ }
+}
+/**
+ * Scan node for placeholders
+ */
+function scanElement(root) {
+ // Add temporary node
+ const node = findRootNode(root);
+ if (!node) {
+ scanDOM({
+ node: root,
+ temporary: true,
+ }, true);
+ }
+ else {
+ scanDOM(node);
+ }
+}
+
+function generateIcon(name, customisations, returnString = false) {
+ // Get icon data
+ const iconData = getIconData(name);
+ if (!iconData) {
+ return null;
+ }
+ // Split name
+ const iconName = stringToIcon(name);
+ // Clean up customisations
+ const changes = mergeCustomisations(defaultExtendedIconCustomisations, customisations || {});
+ // Get data
+ const result = renderInlineSVG(document.createElement('span'), {
+ name,
+ icon: iconName,
+ customisations: changes,
+ }, iconData);
+ return returnString
+ ? result.outerHTML
+ : result;
+}
+/**
+ * Get version
+ */
+function getVersion() {
+ return '3.1.1';
+}
+/**
+ * Generate SVG element
+ */
+function renderSVG(name, customisations) {
+ return generateIcon(name, customisations, false);
+}
+/**
+ * Generate SVG as string
+ */
+function renderHTML(name, customisations) {
+ return generateIcon(name, customisations, true);
+}
+/**
+ * Get rendered icon as object that can be used to create SVG (use replaceIDs on body)
+ */
+function renderIcon(name, customisations) {
+ // Get icon data
+ const iconData = getIconData(name);
+ if (!iconData) {
+ return null;
+ }
+ // Clean up customisations
+ const changes = mergeCustomisations(defaultExtendedIconCustomisations, customisations || {});
+ // Get data
+ return iconToSVG(iconData, changes);
+}
+/**
+ * Scan DOM
+ */
+function scan(root) {
+ if (root) {
+ scanElement(root);
+ }
+ else {
+ scanDOM();
+ }
+}
+/**
+ * Initialise stuff
+ */
+if (typeof document !== 'undefined' && typeof window !== 'undefined') {
+ // Add document.body node
+ addBodyNode();
+ const _window = window;
+ // Load icons from global "IconifyPreload"
+ if (_window.IconifyPreload !== void 0) {
+ const preload = _window.IconifyPreload;
+ const err = 'Invalid IconifyPreload syntax.';
+ if (typeof preload === 'object' && preload !== null) {
+ (preload instanceof Array ? preload : [preload]).forEach((item) => {
+ try {
+ if (
+ // Check if item is an object and not null/array
+ typeof item !== 'object' ||
+ item === null ||
+ item instanceof Array ||
+ // Check for 'icons' and 'prefix'
+ typeof item.icons !== 'object' ||
+ typeof item.prefix !== 'string' ||
+ // Add icon set
+ !addCollection(item)) {
+ console.error(err);
+ }
+ }
+ catch (e) {
+ console.error(err);
+ }
+ });
+ }
+ }
+ // Load observer and scan DOM on next tick
+ setTimeout(() => {
+ initObserver(scanDOM);
+ scanDOM();
+ });
+}
+
+/**
+ * Enable cache
+ */
+function enableCache(storage, enable) {
+ toggleBrowserCache(storage, enable !== false);
+}
+/**
+ * Disable cache
+ */
+function disableCache(storage) {
+ toggleBrowserCache(storage, true);
+}
+/**
+ * Initialise stuff
+ */
+// Set API module
+setAPIModule('', fetchAPIModule);
+/**
+ * Browser stuff
+ */
+if (typeof document !== 'undefined' && typeof window !== 'undefined') {
+ // Set cache and load existing cache
+ initBrowserStorage();
+ const _window = window;
+ // Set API from global "IconifyProviders"
+ if (_window.IconifyProviders !== void 0) {
+ const providers = _window.IconifyProviders;
+ if (typeof providers === 'object' && providers !== null) {
+ for (const key in providers) {
+ const err = 'IconifyProviders[' + key + '] is invalid.';
+ try {
+ const value = providers[key];
+ if (typeof value !== 'object' ||
+ !value ||
+ value.resources === void 0) {
+ continue;
+ }
+ if (!addAPIProvider(key, value)) {
+ console.error(err);
+ }
+ }
+ catch (e) {
+ console.error(err);
+ }
+ }
+ }
+ }
+}
+/**
+ * Internal API
+ */
+const _api = {
+ getAPIConfig,
+ setAPIModule,
+ sendAPIQuery,
+ setFetch,
+ getFetch,
+ listAPIProviders,
+};
+/**
+ * Global variable
+ */
+const Iconify = {
+ // IconifyAPIInternalFunctions
+ _api,
+ // IconifyAPIFunctions
+ addAPIProvider,
+ loadIcons,
+ loadIcon,
+ // IconifyStorageFunctions
+ iconExists,
+ getIcon,
+ listIcons,
+ addIcon,
+ addCollection,
+ // IconifyBuilderFunctions
+ replaceIDs,
+ calculateSize,
+ buildIcon: iconToSVG,
+ // IconifyCommonFunctions
+ getVersion,
+ renderSVG,
+ renderHTML,
+ renderIcon,
+ scan,
+ observe,
+ stopObserving,
+ pauseObserver,
+ resumeObserver,
+ // IconifyBrowserCacheFunctions
+ enableCache,
+ disableCache,
+};
+
+export { _api, addAPIProvider, addCollection, addIcon, iconToSVG as buildIcon, calculateSize, Iconify as default, disableCache, enableCache, getIcon, getVersion, iconExists, listIcons, loadIcon, loadIcons, observe, pauseObserver, renderHTML, renderIcon, renderSVG, replaceIDs, resumeObserver, scan, stopObserving };
+
+// Export to window or web worker
+try {
+ if (self.Iconify === void 0) {
+ self.Iconify = Iconify;
+ }
+} catch (err) {
+}
diff --git a/node_modules/@iconify/iconify/dist/iconify.without-api.cjs b/node_modules/@iconify/iconify/dist/iconify.without-api.cjs
new file mode 100644
index 0000000..b78ab05
--- /dev/null
+++ b/node_modules/@iconify/iconify/dist/iconify.without-api.cjs
@@ -0,0 +1,2391 @@
+/**
+* (c) Iconify
+*
+* For the full copyright and license information, please view the license.txt or license.gpl.txt
+* files at https://github.com/iconify/iconify
+*
+* Licensed under MIT.
+*
+* @license MIT
+* @version 3.1.1
+*/
+'use strict';
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+const defaultIconDimensions = Object.freeze(
+ {
+ left: 0,
+ top: 0,
+ width: 16,
+ height: 16
+ }
+);
+const defaultIconTransformations = Object.freeze({
+ rotate: 0,
+ vFlip: false,
+ hFlip: false
+});
+const defaultIconProps = Object.freeze({
+ ...defaultIconDimensions,
+ ...defaultIconTransformations
+});
+const defaultExtendedIconProps = Object.freeze({
+ ...defaultIconProps,
+ body: "",
+ hidden: false
+});
+
+function mergeIconTransformations(obj1, obj2) {
+ const result = {};
+ if (!obj1.hFlip !== !obj2.hFlip) {
+ result.hFlip = true;
+ }
+ if (!obj1.vFlip !== !obj2.vFlip) {
+ result.vFlip = true;
+ }
+ const rotate = ((obj1.rotate || 0) + (obj2.rotate || 0)) % 4;
+ if (rotate) {
+ result.rotate = rotate;
+ }
+ return result;
+}
+
+function mergeIconData(parent, child) {
+ const result = mergeIconTransformations(parent, child);
+ for (const key in defaultExtendedIconProps) {
+ if (key in defaultIconTransformations) {
+ if (key in parent && !(key in result)) {
+ result[key] = defaultIconTransformations[key];
+ }
+ } else if (key in child) {
+ result[key] = child[key];
+ } else if (key in parent) {
+ result[key] = parent[key];
+ }
+ }
+ return result;
+}
+
+function getIconsTree(data, names) {
+ const icons = data.icons;
+ const aliases = data.aliases || /* @__PURE__ */ Object.create(null);
+ const resolved = /* @__PURE__ */ Object.create(null);
+ function resolve(name) {
+ if (icons[name]) {
+ return resolved[name] = [];
+ }
+ if (!(name in resolved)) {
+ resolved[name] = null;
+ const parent = aliases[name] && aliases[name].parent;
+ const value = parent && resolve(parent);
+ if (value) {
+ resolved[name] = [parent].concat(value);
+ }
+ }
+ return resolved[name];
+ }
+ (names || Object.keys(icons).concat(Object.keys(aliases))).forEach(resolve);
+ return resolved;
+}
+
+function internalGetIconData(data, name, tree) {
+ const icons = data.icons;
+ const aliases = data.aliases || /* @__PURE__ */ Object.create(null);
+ let currentProps = {};
+ function parse(name2) {
+ currentProps = mergeIconData(
+ icons[name2] || aliases[name2],
+ currentProps
+ );
+ }
+ parse(name);
+ tree.forEach(parse);
+ return mergeIconData(data, currentProps);
+}
+
+function parseIconSet(data, callback) {
+ const names = [];
+ if (typeof data !== "object" || typeof data.icons !== "object") {
+ return names;
+ }
+ if (data.not_found instanceof Array) {
+ data.not_found.forEach((name) => {
+ callback(name, null);
+ names.push(name);
+ });
+ }
+ const tree = getIconsTree(data);
+ for (const name in tree) {
+ const item = tree[name];
+ if (item) {
+ callback(name, internalGetIconData(data, name, item));
+ names.push(name);
+ }
+ }
+ return names;
+}
+
+const matchIconName = /^[a-z0-9]+(-[a-z0-9]+)*$/;
+const stringToIcon = (value, validate, allowSimpleName, provider = "") => {
+ const colonSeparated = value.split(":");
+ if (value.slice(0, 1) === "@") {
+ if (colonSeparated.length < 2 || colonSeparated.length > 3) {
+ return null;
+ }
+ provider = colonSeparated.shift().slice(1);
+ }
+ if (colonSeparated.length > 3 || !colonSeparated.length) {
+ return null;
+ }
+ if (colonSeparated.length > 1) {
+ const name2 = colonSeparated.pop();
+ const prefix = colonSeparated.pop();
+ const result = {
+ // Allow provider without '@': "provider:prefix:name"
+ provider: colonSeparated.length > 0 ? colonSeparated[0] : provider,
+ prefix,
+ name: name2
+ };
+ return validate && !validateIconName(result) ? null : result;
+ }
+ const name = colonSeparated[0];
+ const dashSeparated = name.split("-");
+ if (dashSeparated.length > 1) {
+ const result = {
+ provider,
+ prefix: dashSeparated.shift(),
+ name: dashSeparated.join("-")
+ };
+ return validate && !validateIconName(result) ? null : result;
+ }
+ if (allowSimpleName && provider === "") {
+ const result = {
+ provider,
+ prefix: "",
+ name
+ };
+ return validate && !validateIconName(result, allowSimpleName) ? null : result;
+ }
+ return null;
+};
+const validateIconName = (icon, allowSimpleName) => {
+ if (!icon) {
+ return false;
+ }
+ return !!((icon.provider === "" || icon.provider.match(matchIconName)) && (allowSimpleName && icon.prefix === "" || icon.prefix.match(matchIconName)) && icon.name.match(matchIconName));
+};
+
+const optionalPropertyDefaults = {
+ provider: "",
+ aliases: {},
+ not_found: {},
+ ...defaultIconDimensions
+};
+function checkOptionalProps(item, defaults) {
+ for (const prop in defaults) {
+ if (prop in item && typeof item[prop] !== typeof defaults[prop]) {
+ return false;
+ }
+ }
+ return true;
+}
+function quicklyValidateIconSet(obj) {
+ if (typeof obj !== "object" || obj === null) {
+ return null;
+ }
+ const data = obj;
+ if (typeof data.prefix !== "string" || !obj.icons || typeof obj.icons !== "object") {
+ return null;
+ }
+ if (!checkOptionalProps(obj, optionalPropertyDefaults)) {
+ return null;
+ }
+ const icons = data.icons;
+ for (const name in icons) {
+ const icon = icons[name];
+ if (!name.match(matchIconName) || typeof icon.body !== "string" || !checkOptionalProps(
+ icon,
+ defaultExtendedIconProps
+ )) {
+ return null;
+ }
+ }
+ const aliases = data.aliases || /* @__PURE__ */ Object.create(null);
+ for (const name in aliases) {
+ const icon = aliases[name];
+ const parent = icon.parent;
+ if (!name.match(matchIconName) || typeof parent !== "string" || !icons[parent] && !aliases[parent] || !checkOptionalProps(
+ icon,
+ defaultExtendedIconProps
+ )) {
+ return null;
+ }
+ }
+ return data;
+}
+
+const dataStorage = /* @__PURE__ */ Object.create(null);
+function newStorage(provider, prefix) {
+ return {
+ provider,
+ prefix,
+ icons: /* @__PURE__ */ Object.create(null),
+ missing: /* @__PURE__ */ new Set()
+ };
+}
+function getStorage(provider, prefix) {
+ const providerStorage = dataStorage[provider] || (dataStorage[provider] = /* @__PURE__ */ Object.create(null));
+ return providerStorage[prefix] || (providerStorage[prefix] = newStorage(provider, prefix));
+}
+function addIconSet(storage, data) {
+ if (!quicklyValidateIconSet(data)) {
+ return [];
+ }
+ return parseIconSet(data, (name, icon) => {
+ if (icon) {
+ storage.icons[name] = icon;
+ } else {
+ storage.missing.add(name);
+ }
+ });
+}
+function addIconToStorage(storage, name, icon) {
+ try {
+ if (typeof icon.body === "string") {
+ storage.icons[name] = { ...icon };
+ return true;
+ }
+ } catch (err) {
+ }
+ return false;
+}
+function listIcons(provider, prefix) {
+ let allIcons = [];
+ const providers = typeof provider === "string" ? [provider] : Object.keys(dataStorage);
+ providers.forEach((provider2) => {
+ const prefixes = typeof provider2 === "string" && typeof prefix === "string" ? [prefix] : Object.keys(dataStorage[provider2] || {});
+ prefixes.forEach((prefix2) => {
+ const storage = getStorage(provider2, prefix2);
+ allIcons = allIcons.concat(
+ Object.keys(storage.icons).map(
+ (name) => (provider2 !== "" ? "@" + provider2 + ":" : "") + prefix2 + ":" + name
+ )
+ );
+ });
+ });
+ return allIcons;
+}
+
+let simpleNames = false;
+function allowSimpleNames(allow) {
+ if (typeof allow === "boolean") {
+ simpleNames = allow;
+ }
+ return simpleNames;
+}
+function getIconData(name) {
+ const icon = typeof name === "string" ? stringToIcon(name, true, simpleNames) : name;
+ if (icon) {
+ const storage = getStorage(icon.provider, icon.prefix);
+ const iconName = icon.name;
+ return storage.icons[iconName] || (storage.missing.has(iconName) ? null : void 0);
+ }
+}
+function addIcon(name, data) {
+ const icon = stringToIcon(name, true, simpleNames);
+ if (!icon) {
+ return false;
+ }
+ const storage = getStorage(icon.provider, icon.prefix);
+ return addIconToStorage(storage, icon.name, data);
+}
+function addCollection(data, provider) {
+ if (typeof data !== "object") {
+ return false;
+ }
+ if (typeof provider !== "string") {
+ provider = data.provider || "";
+ }
+ if (simpleNames && !provider && !data.prefix) {
+ let added = false;
+ if (quicklyValidateIconSet(data)) {
+ data.prefix = "";
+ parseIconSet(data, (name, icon) => {
+ if (icon && addIcon(name, icon)) {
+ added = true;
+ }
+ });
+ }
+ return added;
+ }
+ const prefix = data.prefix;
+ if (!validateIconName({
+ provider,
+ prefix,
+ name: "a"
+ })) {
+ return false;
+ }
+ const storage = getStorage(provider, prefix);
+ return !!addIconSet(storage, data);
+}
+function iconExists(name) {
+ return !!getIconData(name);
+}
+function getIcon(name) {
+ const result = getIconData(name);
+ return result ? {
+ ...defaultIconProps,
+ ...result
+ } : null;
+}
+
+const defaultIconSizeCustomisations = Object.freeze({
+ width: null,
+ height: null
+});
+const defaultIconCustomisations = Object.freeze({
+ // Dimensions
+ ...defaultIconSizeCustomisations,
+ // Transformations
+ ...defaultIconTransformations
+});
+
+const unitsSplit = /(-?[0-9.]*[0-9]+[0-9.]*)/g;
+const unitsTest = /^-?[0-9.]*[0-9]+[0-9.]*$/g;
+function calculateSize(size, ratio, precision) {
+ if (ratio === 1) {
+ return size;
+ }
+ precision = precision || 100;
+ if (typeof size === "number") {
+ return Math.ceil(size * ratio * precision) / precision;
+ }
+ if (typeof size !== "string") {
+ return size;
+ }
+ const oldParts = size.split(unitsSplit);
+ if (oldParts === null || !oldParts.length) {
+ return size;
+ }
+ const newParts = [];
+ let code = oldParts.shift();
+ let isNumber = unitsTest.test(code);
+ while (true) {
+ if (isNumber) {
+ const num = parseFloat(code);
+ if (isNaN(num)) {
+ newParts.push(code);
+ } else {
+ newParts.push(Math.ceil(num * ratio * precision) / precision);
+ }
+ } else {
+ newParts.push(code);
+ }
+ code = oldParts.shift();
+ if (code === void 0) {
+ return newParts.join("");
+ }
+ isNumber = !isNumber;
+ }
+}
+
+const isUnsetKeyword = (value) => value === "unset" || value === "undefined" || value === "none";
+function iconToSVG(icon, customisations) {
+ const fullIcon = {
+ ...defaultIconProps,
+ ...icon
+ };
+ const fullCustomisations = {
+ ...defaultIconCustomisations,
+ ...customisations
+ };
+ const box = {
+ left: fullIcon.left,
+ top: fullIcon.top,
+ width: fullIcon.width,
+ height: fullIcon.height
+ };
+ let body = fullIcon.body;
+ [fullIcon, fullCustomisations].forEach((props) => {
+ const transformations = [];
+ const hFlip = props.hFlip;
+ const vFlip = props.vFlip;
+ let rotation = props.rotate;
+ if (hFlip) {
+ if (vFlip) {
+ rotation += 2;
+ } else {
+ transformations.push(
+ "translate(" + (box.width + box.left).toString() + " " + (0 - box.top).toString() + ")"
+ );
+ transformations.push("scale(-1 1)");
+ box.top = box.left = 0;
+ }
+ } else if (vFlip) {
+ transformations.push(
+ "translate(" + (0 - box.left).toString() + " " + (box.height + box.top).toString() + ")"
+ );
+ transformations.push("scale(1 -1)");
+ box.top = box.left = 0;
+ }
+ let tempValue;
+ if (rotation < 0) {
+ rotation -= Math.floor(rotation / 4) * 4;
+ }
+ rotation = rotation % 4;
+ switch (rotation) {
+ case 1:
+ tempValue = box.height / 2 + box.top;
+ transformations.unshift(
+ "rotate(90 " + tempValue.toString() + " " + tempValue.toString() + ")"
+ );
+ break;
+ case 2:
+ transformations.unshift(
+ "rotate(180 " + (box.width / 2 + box.left).toString() + " " + (box.height / 2 + box.top).toString() + ")"
+ );
+ break;
+ case 3:
+ tempValue = box.width / 2 + box.left;
+ transformations.unshift(
+ "rotate(-90 " + tempValue.toString() + " " + tempValue.toString() + ")"
+ );
+ break;
+ }
+ if (rotation % 2 === 1) {
+ if (box.left !== box.top) {
+ tempValue = box.left;
+ box.left = box.top;
+ box.top = tempValue;
+ }
+ if (box.width !== box.height) {
+ tempValue = box.width;
+ box.width = box.height;
+ box.height = tempValue;
+ }
+ }
+ if (transformations.length) {
+ body = '' + body + " ";
+ }
+ });
+ const customisationsWidth = fullCustomisations.width;
+ const customisationsHeight = fullCustomisations.height;
+ const boxWidth = box.width;
+ const boxHeight = box.height;
+ let width;
+ let height;
+ if (customisationsWidth === null) {
+ height = customisationsHeight === null ? "1em" : customisationsHeight === "auto" ? boxHeight : customisationsHeight;
+ width = calculateSize(height, boxWidth / boxHeight);
+ } else {
+ width = customisationsWidth === "auto" ? boxWidth : customisationsWidth;
+ height = customisationsHeight === null ? calculateSize(width, boxHeight / boxWidth) : customisationsHeight === "auto" ? boxHeight : customisationsHeight;
+ }
+ const attributes = {};
+ const setAttr = (prop, value) => {
+ if (!isUnsetKeyword(value)) {
+ attributes[prop] = value.toString();
+ }
+ };
+ setAttr("width", width);
+ setAttr("height", height);
+ attributes.viewBox = box.left.toString() + " " + box.top.toString() + " " + boxWidth.toString() + " " + boxHeight.toString();
+ return {
+ attributes,
+ body
+ };
+}
+
+const regex = /\sid="(\S+)"/g;
+const randomPrefix = "IconifyId" + Date.now().toString(16) + (Math.random() * 16777216 | 0).toString(16);
+let counter = 0;
+function replaceIDs(body, prefix = randomPrefix) {
+ const ids = [];
+ let match;
+ while (match = regex.exec(body)) {
+ ids.push(match[1]);
+ }
+ if (!ids.length) {
+ return body;
+ }
+ const suffix = "suffix" + (Math.random() * 16777216 | Date.now()).toString(16);
+ ids.forEach((id) => {
+ const newID = typeof prefix === "function" ? prefix(id) : prefix + (counter++).toString();
+ const escapedID = id.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
+ body = body.replace(
+ // Allowed characters before id: [#;"]
+ // Allowed characters after id: [)"], .[a-z]
+ new RegExp('([#;"])(' + escapedID + ')([")]|\\.[a-z])', "g"),
+ "$1" + newID + suffix + "$3"
+ );
+ });
+ body = body.replace(new RegExp(suffix, "g"), "");
+ return body;
+}
+
+function mergeCustomisations(defaults, item) {
+ const result = {
+ ...defaults
+ };
+ for (const key in item) {
+ const value = item[key];
+ const valueType = typeof value;
+ if (key in defaultIconSizeCustomisations) {
+ if (value === null || value && (valueType === "string" || valueType === "number")) {
+ result[key] = value;
+ }
+ } else if (valueType === typeof result[key]) {
+ result[key] = key === "rotate" ? value % 4 : value;
+ }
+ }
+ return result;
+}
+
+const defaultExtendedIconCustomisations = {
+ ...defaultIconCustomisations,
+ inline: false,
+};
+/**
+ * Class names
+ */
+const blockClass = 'iconify';
+const inlineClass = 'iconify-inline';
+/**
+ * Names of properties to add to nodes
+ */
+const elementDataProperty = ('iconifyData' + Date.now());
+
+/**
+ * List of root nodes
+ */
+let nodes = [];
+/**
+ * Find node
+ */
+function findRootNode(node) {
+ for (let i = 0; i < nodes.length; i++) {
+ const item = nodes[i];
+ const root = typeof item.node === 'function' ? item.node() : item.node;
+ if (root === node) {
+ return item;
+ }
+ }
+}
+/**
+ * Add extra root node
+ */
+function addRootNode(root, autoRemove = false) {
+ let node = findRootNode(root);
+ if (node) {
+ // Node already exist: switch type if needed
+ if (node.temporary) {
+ node.temporary = autoRemove;
+ }
+ return node;
+ }
+ // Create item, add it to list
+ node = {
+ node: root,
+ temporary: autoRemove,
+ };
+ nodes.push(node);
+ return node;
+}
+/**
+ * Add document.body node
+ */
+function addBodyNode() {
+ if (document.documentElement) {
+ return addRootNode(document.documentElement);
+ }
+ nodes.push({
+ node: () => {
+ return document.documentElement;
+ },
+ });
+}
+/**
+ * Remove root node
+ */
+function removeRootNode(root) {
+ nodes = nodes.filter((node) => root !== node &&
+ root !== (typeof node.node === 'function' ? node.node() : node.node));
+}
+/**
+ * Get list of root nodes
+ */
+function listRootNodes() {
+ return nodes;
+}
+
+/**
+ * Execute function when DOM is ready
+ */
+function onReady(callback) {
+ const doc = document;
+ if (doc.readyState && doc.readyState !== 'loading') {
+ callback();
+ }
+ else {
+ doc.addEventListener('DOMContentLoaded', callback);
+ }
+}
+
+/**
+ * Callback
+ */
+let callback = null;
+/**
+ * Parameters for mutation observer
+ */
+const observerParams = {
+ childList: true,
+ subtree: true,
+ attributes: true,
+};
+/**
+ * Queue DOM scan
+ */
+function queueScan(node) {
+ if (!node.observer) {
+ return;
+ }
+ const observer = node.observer;
+ if (!observer.pendingScan) {
+ observer.pendingScan = setTimeout(() => {
+ delete observer.pendingScan;
+ if (callback) {
+ callback(node);
+ }
+ });
+ }
+}
+/**
+ * Check mutations for added nodes
+ */
+function checkMutations(node, mutations) {
+ if (!node.observer) {
+ return;
+ }
+ const observer = node.observer;
+ if (!observer.pendingScan) {
+ for (let i = 0; i < mutations.length; i++) {
+ const item = mutations[i];
+ if (
+ // Check for added nodes
+ (item.addedNodes && item.addedNodes.length > 0) ||
+ // Check for icon or placeholder with modified attributes
+ (item.type === 'attributes' &&
+ item.target[elementDataProperty] !==
+ void 0)) {
+ if (!observer.paused) {
+ queueScan(node);
+ }
+ return;
+ }
+ }
+ }
+}
+/**
+ * Start/resume observer
+ */
+function continueObserving(node, root) {
+ node.observer.instance.observe(root, observerParams);
+}
+/**
+ * Start mutation observer
+ */
+function startObserver(node) {
+ let observer = node.observer;
+ if (observer && observer.instance) {
+ // Already started
+ return;
+ }
+ const root = typeof node.node === 'function' ? node.node() : node.node;
+ if (!root || !window) {
+ // document.body is not available yet or window is missing
+ return;
+ }
+ if (!observer) {
+ observer = {
+ paused: 0,
+ };
+ node.observer = observer;
+ }
+ // Create new instance, observe
+ observer.instance = new window.MutationObserver(checkMutations.bind(null, node));
+ continueObserving(node, root);
+ // Scan immediately
+ if (!observer.paused) {
+ queueScan(node);
+ }
+}
+/**
+ * Start all observers
+ */
+function startObservers() {
+ listRootNodes().forEach(startObserver);
+}
+/**
+ * Stop observer
+ */
+function stopObserver(node) {
+ if (!node.observer) {
+ return;
+ }
+ const observer = node.observer;
+ // Stop scan
+ if (observer.pendingScan) {
+ clearTimeout(observer.pendingScan);
+ delete observer.pendingScan;
+ }
+ // Disconnect observer
+ if (observer.instance) {
+ observer.instance.disconnect();
+ delete observer.instance;
+ }
+}
+/**
+ * Start observer when DOM is ready
+ */
+function initObserver(cb) {
+ const isRestart = callback !== null;
+ if (callback !== cb) {
+ // Change callback and stop all pending observers
+ callback = cb;
+ if (isRestart) {
+ listRootNodes().forEach(stopObserver);
+ }
+ }
+ if (isRestart) {
+ // Restart instances
+ startObservers();
+ return;
+ }
+ // Start observers when document is ready
+ onReady(startObservers);
+}
+/**
+ * Pause observing node
+ */
+function pauseObservingNode(node) {
+ (node ? [node] : listRootNodes()).forEach((node) => {
+ if (!node.observer) {
+ node.observer = {
+ paused: 1,
+ };
+ return;
+ }
+ const observer = node.observer;
+ observer.paused++;
+ if (observer.paused > 1 || !observer.instance) {
+ return;
+ }
+ // Disconnect observer
+ const instance = observer.instance;
+ // checkMutations(node, instance.takeRecords());
+ instance.disconnect();
+ });
+}
+/**
+ * Pause observer
+ */
+function pauseObserver(root) {
+ if (root) {
+ const node = findRootNode(root);
+ if (node) {
+ pauseObservingNode(node);
+ }
+ }
+ else {
+ pauseObservingNode();
+ }
+}
+/**
+ * Resume observer
+ */
+function resumeObservingNode(observer) {
+ (observer ? [observer] : listRootNodes()).forEach((node) => {
+ if (!node.observer) {
+ // Start observer
+ startObserver(node);
+ return;
+ }
+ const observer = node.observer;
+ if (observer.paused) {
+ observer.paused--;
+ if (!observer.paused) {
+ // Start / resume
+ const root = typeof node.node === 'function' ? node.node() : node.node;
+ if (!root) {
+ return;
+ }
+ else if (observer.instance) {
+ continueObserving(node, root);
+ }
+ else {
+ startObserver(node);
+ }
+ }
+ }
+ });
+}
+/**
+ * Resume observer
+ */
+function resumeObserver(root) {
+ if (root) {
+ const node = findRootNode(root);
+ if (node) {
+ resumeObservingNode(node);
+ }
+ }
+ else {
+ resumeObservingNode();
+ }
+}
+/**
+ * Observe node
+ */
+function observe(root, autoRemove = false) {
+ const node = addRootNode(root, autoRemove);
+ startObserver(node);
+ return node;
+}
+/**
+ * Remove observed node
+ */
+function stopObserving(root) {
+ const node = findRootNode(root);
+ if (node) {
+ stopObserver(node);
+ removeRootNode(root);
+ }
+}
+
+function sortIcons(icons) {
+ const result = {
+ loaded: [],
+ missing: [],
+ pending: []
+ };
+ const storage = /* @__PURE__ */ Object.create(null);
+ icons.sort((a, b) => {
+ if (a.provider !== b.provider) {
+ return a.provider.localeCompare(b.provider);
+ }
+ if (a.prefix !== b.prefix) {
+ return a.prefix.localeCompare(b.prefix);
+ }
+ return a.name.localeCompare(b.name);
+ });
+ let lastIcon = {
+ provider: "",
+ prefix: "",
+ name: ""
+ };
+ icons.forEach((icon) => {
+ if (lastIcon.name === icon.name && lastIcon.prefix === icon.prefix && lastIcon.provider === icon.provider) {
+ return;
+ }
+ lastIcon = icon;
+ const provider = icon.provider;
+ const prefix = icon.prefix;
+ const name = icon.name;
+ const providerStorage = storage[provider] || (storage[provider] = /* @__PURE__ */ Object.create(null));
+ const localStorage = providerStorage[prefix] || (providerStorage[prefix] = getStorage(provider, prefix));
+ let list;
+ if (name in localStorage.icons) {
+ list = result.loaded;
+ } else if (prefix === "" || localStorage.missing.has(name)) {
+ list = result.missing;
+ } else {
+ list = result.pending;
+ }
+ const item = {
+ provider,
+ prefix,
+ name
+ };
+ list.push(item);
+ });
+ return result;
+}
+
+function removeCallback(storages, id) {
+ storages.forEach((storage) => {
+ const items = storage.loaderCallbacks;
+ if (items) {
+ storage.loaderCallbacks = items.filter((row) => row.id !== id);
+ }
+ });
+}
+function updateCallbacks(storage) {
+ if (!storage.pendingCallbacksFlag) {
+ storage.pendingCallbacksFlag = true;
+ setTimeout(() => {
+ storage.pendingCallbacksFlag = false;
+ const items = storage.loaderCallbacks ? storage.loaderCallbacks.slice(0) : [];
+ if (!items.length) {
+ return;
+ }
+ let hasPending = false;
+ const provider = storage.provider;
+ const prefix = storage.prefix;
+ items.forEach((item) => {
+ const icons = item.icons;
+ const oldLength = icons.pending.length;
+ icons.pending = icons.pending.filter((icon) => {
+ if (icon.prefix !== prefix) {
+ return true;
+ }
+ const name = icon.name;
+ if (storage.icons[name]) {
+ icons.loaded.push({
+ provider,
+ prefix,
+ name
+ });
+ } else if (storage.missing.has(name)) {
+ icons.missing.push({
+ provider,
+ prefix,
+ name
+ });
+ } else {
+ hasPending = true;
+ return true;
+ }
+ return false;
+ });
+ if (icons.pending.length !== oldLength) {
+ if (!hasPending) {
+ removeCallback([storage], item.id);
+ }
+ item.callback(
+ icons.loaded.slice(0),
+ icons.missing.slice(0),
+ icons.pending.slice(0),
+ item.abort
+ );
+ }
+ });
+ });
+ }
+}
+let idCounter = 0;
+function storeCallback(callback, icons, pendingSources) {
+ const id = idCounter++;
+ const abort = removeCallback.bind(null, pendingSources, id);
+ if (!icons.pending.length) {
+ return abort;
+ }
+ const item = {
+ id,
+ icons,
+ callback,
+ abort
+ };
+ pendingSources.forEach((storage) => {
+ (storage.loaderCallbacks || (storage.loaderCallbacks = [])).push(item);
+ });
+ return abort;
+}
+
+const storage = /* @__PURE__ */ Object.create(null);
+function getAPIModule(provider) {
+ return storage[provider] || storage[""];
+}
+
+function listToIcons(list, validate = true, simpleNames = false) {
+ const result = [];
+ list.forEach((item) => {
+ const icon = typeof item === "string" ? stringToIcon(item, validate, simpleNames) : item;
+ if (icon) {
+ result.push(icon);
+ }
+ });
+ return result;
+}
+
+// src/config.ts
+var defaultConfig = {
+ resources: [],
+ index: 0,
+ timeout: 2e3,
+ rotate: 750,
+ random: false,
+ dataAfterTimeout: false
+};
+
+// src/query.ts
+function sendQuery(config, payload, query, done) {
+ const resourcesCount = config.resources.length;
+ const startIndex = config.random ? Math.floor(Math.random() * resourcesCount) : config.index;
+ let resources;
+ if (config.random) {
+ let list = config.resources.slice(0);
+ resources = [];
+ while (list.length > 1) {
+ const nextIndex = Math.floor(Math.random() * list.length);
+ resources.push(list[nextIndex]);
+ list = list.slice(0, nextIndex).concat(list.slice(nextIndex + 1));
+ }
+ resources = resources.concat(list);
+ } else {
+ resources = config.resources.slice(startIndex).concat(config.resources.slice(0, startIndex));
+ }
+ const startTime = Date.now();
+ let status = "pending";
+ let queriesSent = 0;
+ let lastError;
+ let timer = null;
+ let queue = [];
+ let doneCallbacks = [];
+ if (typeof done === "function") {
+ doneCallbacks.push(done);
+ }
+ function resetTimer() {
+ if (timer) {
+ clearTimeout(timer);
+ timer = null;
+ }
+ }
+ function abort() {
+ if (status === "pending") {
+ status = "aborted";
+ }
+ resetTimer();
+ queue.forEach((item) => {
+ if (item.status === "pending") {
+ item.status = "aborted";
+ }
+ });
+ queue = [];
+ }
+ function subscribe(callback, overwrite) {
+ if (overwrite) {
+ doneCallbacks = [];
+ }
+ if (typeof callback === "function") {
+ doneCallbacks.push(callback);
+ }
+ }
+ function getQueryStatus() {
+ return {
+ startTime,
+ payload,
+ status,
+ queriesSent,
+ queriesPending: queue.length,
+ subscribe,
+ abort
+ };
+ }
+ function failQuery() {
+ status = "failed";
+ doneCallbacks.forEach((callback) => {
+ callback(void 0, lastError);
+ });
+ }
+ function clearQueue() {
+ queue.forEach((item) => {
+ if (item.status === "pending") {
+ item.status = "aborted";
+ }
+ });
+ queue = [];
+ }
+ function moduleResponse(item, response, data) {
+ const isError = response !== "success";
+ queue = queue.filter((queued) => queued !== item);
+ switch (status) {
+ case "pending":
+ break;
+ case "failed":
+ if (isError || !config.dataAfterTimeout) {
+ return;
+ }
+ break;
+ default:
+ return;
+ }
+ if (response === "abort") {
+ lastError = data;
+ failQuery();
+ return;
+ }
+ if (isError) {
+ lastError = data;
+ if (!queue.length) {
+ if (!resources.length) {
+ failQuery();
+ } else {
+ execNext();
+ }
+ }
+ return;
+ }
+ resetTimer();
+ clearQueue();
+ if (!config.random) {
+ const index = config.resources.indexOf(item.resource);
+ if (index !== -1 && index !== config.index) {
+ config.index = index;
+ }
+ }
+ status = "completed";
+ doneCallbacks.forEach((callback) => {
+ callback(data);
+ });
+ }
+ function execNext() {
+ if (status !== "pending") {
+ return;
+ }
+ resetTimer();
+ const resource = resources.shift();
+ if (resource === void 0) {
+ if (queue.length) {
+ timer = setTimeout(() => {
+ resetTimer();
+ if (status === "pending") {
+ clearQueue();
+ failQuery();
+ }
+ }, config.timeout);
+ return;
+ }
+ failQuery();
+ return;
+ }
+ const item = {
+ status: "pending",
+ resource,
+ callback: (status2, data) => {
+ moduleResponse(item, status2, data);
+ }
+ };
+ queue.push(item);
+ queriesSent++;
+ timer = setTimeout(execNext, config.rotate);
+ query(resource, payload, item.callback);
+ }
+ setTimeout(execNext);
+ return getQueryStatus;
+}
+
+// src/index.ts
+function initRedundancy(cfg) {
+ const config = {
+ ...defaultConfig,
+ ...cfg
+ };
+ let queries = [];
+ function cleanup() {
+ queries = queries.filter((item) => item().status === "pending");
+ }
+ function query(payload, queryCallback, doneCallback) {
+ const query2 = sendQuery(
+ config,
+ payload,
+ queryCallback,
+ (data, error) => {
+ cleanup();
+ if (doneCallback) {
+ doneCallback(data, error);
+ }
+ }
+ );
+ queries.push(query2);
+ return query2;
+ }
+ function find(callback) {
+ return queries.find((value) => {
+ return callback(value);
+ }) || null;
+ }
+ const instance = {
+ query,
+ find,
+ setIndex: (index) => {
+ config.index = index;
+ },
+ getIndex: () => config.index,
+ cleanup
+ };
+ return instance;
+}
+
+function createAPIConfig(source) {
+ let resources;
+ if (typeof source.resources === "string") {
+ resources = [source.resources];
+ } else {
+ resources = source.resources;
+ if (!(resources instanceof Array) || !resources.length) {
+ return null;
+ }
+ }
+ const result = {
+ // API hosts
+ resources,
+ // Root path
+ path: source.path || "/",
+ // URL length limit
+ maxURL: source.maxURL || 500,
+ // Timeout before next host is used.
+ rotate: source.rotate || 750,
+ // Timeout before failing query.
+ timeout: source.timeout || 5e3,
+ // Randomise default API end point.
+ random: source.random === true,
+ // Start index
+ index: source.index || 0,
+ // Receive data after time out (used if time out kicks in first, then API module sends data anyway).
+ dataAfterTimeout: source.dataAfterTimeout !== false
+ };
+ return result;
+}
+const configStorage = /* @__PURE__ */ Object.create(null);
+const fallBackAPISources = [
+ "https://api.simplesvg.com",
+ "https://api.unisvg.com"
+];
+const fallBackAPI = [];
+while (fallBackAPISources.length > 0) {
+ if (fallBackAPISources.length === 1) {
+ fallBackAPI.push(fallBackAPISources.shift());
+ } else {
+ if (Math.random() > 0.5) {
+ fallBackAPI.push(fallBackAPISources.shift());
+ } else {
+ fallBackAPI.push(fallBackAPISources.pop());
+ }
+ }
+}
+configStorage[""] = createAPIConfig({
+ resources: ["https://api.iconify.design"].concat(fallBackAPI)
+});
+function getAPIConfig(provider) {
+ return configStorage[provider];
+}
+
+function emptyCallback$1() {
+}
+const redundancyCache = /* @__PURE__ */ Object.create(null);
+function getRedundancyCache(provider) {
+ if (!redundancyCache[provider]) {
+ const config = getAPIConfig(provider);
+ if (!config) {
+ return;
+ }
+ const redundancy = initRedundancy(config);
+ const cachedReundancy = {
+ config,
+ redundancy
+ };
+ redundancyCache[provider] = cachedReundancy;
+ }
+ return redundancyCache[provider];
+}
+function sendAPIQuery(target, query, callback) {
+ let redundancy;
+ let send;
+ if (typeof target === "string") {
+ const api = getAPIModule(target);
+ if (!api) {
+ callback(void 0, 424);
+ return emptyCallback$1;
+ }
+ send = api.send;
+ const cached = getRedundancyCache(target);
+ if (cached) {
+ redundancy = cached.redundancy;
+ }
+ } else {
+ const config = createAPIConfig(target);
+ if (config) {
+ redundancy = initRedundancy(config);
+ const moduleKey = target.resources ? target.resources[0] : "";
+ const api = getAPIModule(moduleKey);
+ if (api) {
+ send = api.send;
+ }
+ }
+ }
+ if (!redundancy || !send) {
+ callback(void 0, 424);
+ return emptyCallback$1;
+ }
+ return redundancy.query(query, send, callback)().abort;
+}
+
+const browserCacheVersion = "iconify2";
+const browserCachePrefix = "iconify";
+const browserCacheCountKey = browserCachePrefix + "-count";
+const browserCacheVersionKey = browserCachePrefix + "-version";
+const browserStorageHour = 36e5;
+const browserStorageCacheExpiration = 168;
+
+function getStoredItem(func, key) {
+ try {
+ return func.getItem(key);
+ } catch (err) {
+ }
+}
+function setStoredItem(func, key, value) {
+ try {
+ func.setItem(key, value);
+ return true;
+ } catch (err) {
+ }
+}
+function removeStoredItem(func, key) {
+ try {
+ func.removeItem(key);
+ } catch (err) {
+ }
+}
+
+function setBrowserStorageItemsCount(storage, value) {
+ return setStoredItem(storage, browserCacheCountKey, value.toString());
+}
+function getBrowserStorageItemsCount(storage) {
+ return parseInt(getStoredItem(storage, browserCacheCountKey)) || 0;
+}
+
+const browserStorageConfig = {
+ local: true,
+ session: true
+};
+const browserStorageEmptyItems = {
+ local: /* @__PURE__ */ new Set(),
+ session: /* @__PURE__ */ new Set()
+};
+let browserStorageStatus = false;
+function setBrowserStorageStatus(status) {
+ browserStorageStatus = status;
+}
+
+let _window = typeof window === "undefined" ? {} : window;
+function getBrowserStorage(key) {
+ const attr = key + "Storage";
+ try {
+ if (_window && _window[attr] && typeof _window[attr].length === "number") {
+ return _window[attr];
+ }
+ } catch (err) {
+ }
+ browserStorageConfig[key] = false;
+}
+
+function iterateBrowserStorage(key, callback) {
+ const func = getBrowserStorage(key);
+ if (!func) {
+ return;
+ }
+ const version = getStoredItem(func, browserCacheVersionKey);
+ if (version !== browserCacheVersion) {
+ if (version) {
+ const total2 = getBrowserStorageItemsCount(func);
+ for (let i = 0; i < total2; i++) {
+ removeStoredItem(func, browserCachePrefix + i.toString());
+ }
+ }
+ setStoredItem(func, browserCacheVersionKey, browserCacheVersion);
+ setBrowserStorageItemsCount(func, 0);
+ return;
+ }
+ const minTime = Math.floor(Date.now() / browserStorageHour) - browserStorageCacheExpiration;
+ const parseItem = (index) => {
+ const name = browserCachePrefix + index.toString();
+ const item = getStoredItem(func, name);
+ if (typeof item !== "string") {
+ return;
+ }
+ try {
+ const data = JSON.parse(item);
+ if (typeof data === "object" && typeof data.cached === "number" && data.cached > minTime && typeof data.provider === "string" && typeof data.data === "object" && typeof data.data.prefix === "string" && // Valid item: run callback
+ callback(data, index)) {
+ return true;
+ }
+ } catch (err) {
+ }
+ removeStoredItem(func, name);
+ };
+ let total = getBrowserStorageItemsCount(func);
+ for (let i = total - 1; i >= 0; i--) {
+ if (!parseItem(i)) {
+ if (i === total - 1) {
+ total--;
+ setBrowserStorageItemsCount(func, total);
+ } else {
+ browserStorageEmptyItems[key].add(i);
+ }
+ }
+ }
+}
+
+function initBrowserStorage() {
+ if (browserStorageStatus) {
+ return;
+ }
+ setBrowserStorageStatus(true);
+ for (const key in browserStorageConfig) {
+ iterateBrowserStorage(key, (item) => {
+ const iconSet = item.data;
+ const provider = item.provider;
+ const prefix = iconSet.prefix;
+ const storage = getStorage(
+ provider,
+ prefix
+ );
+ if (!addIconSet(storage, iconSet).length) {
+ return false;
+ }
+ const lastModified = iconSet.lastModified || -1;
+ storage.lastModifiedCached = storage.lastModifiedCached ? Math.min(storage.lastModifiedCached, lastModified) : lastModified;
+ return true;
+ });
+ }
+}
+
+function updateLastModified(storage, lastModified) {
+ const lastValue = storage.lastModifiedCached;
+ if (
+ // Matches or newer
+ lastValue && lastValue >= lastModified
+ ) {
+ return lastValue === lastModified;
+ }
+ storage.lastModifiedCached = lastModified;
+ if (lastValue) {
+ for (const key in browserStorageConfig) {
+ iterateBrowserStorage(key, (item) => {
+ const iconSet = item.data;
+ return item.provider !== storage.provider || iconSet.prefix !== storage.prefix || iconSet.lastModified === lastModified;
+ });
+ }
+ }
+ return true;
+}
+function storeInBrowserStorage(storage, data) {
+ if (!browserStorageStatus) {
+ initBrowserStorage();
+ }
+ function store(key) {
+ let func;
+ if (!browserStorageConfig[key] || !(func = getBrowserStorage(key))) {
+ return;
+ }
+ const set = browserStorageEmptyItems[key];
+ let index;
+ if (set.size) {
+ set.delete(index = Array.from(set).shift());
+ } else {
+ index = getBrowserStorageItemsCount(func);
+ if (!setBrowserStorageItemsCount(func, index + 1)) {
+ return;
+ }
+ }
+ const item = {
+ cached: Math.floor(Date.now() / browserStorageHour),
+ provider: storage.provider,
+ data
+ };
+ return setStoredItem(
+ func,
+ browserCachePrefix + index.toString(),
+ JSON.stringify(item)
+ );
+ }
+ if (data.lastModified && !updateLastModified(storage, data.lastModified)) {
+ return;
+ }
+ if (!Object.keys(data.icons).length) {
+ return;
+ }
+ if (data.not_found) {
+ data = Object.assign({}, data);
+ delete data.not_found;
+ }
+ if (!store("local")) {
+ store("session");
+ }
+}
+
+function emptyCallback() {
+}
+function loadedNewIcons(storage) {
+ if (!storage.iconsLoaderFlag) {
+ storage.iconsLoaderFlag = true;
+ setTimeout(() => {
+ storage.iconsLoaderFlag = false;
+ updateCallbacks(storage);
+ });
+ }
+}
+function loadNewIcons(storage, icons) {
+ if (!storage.iconsToLoad) {
+ storage.iconsToLoad = icons;
+ } else {
+ storage.iconsToLoad = storage.iconsToLoad.concat(icons).sort();
+ }
+ if (!storage.iconsQueueFlag) {
+ storage.iconsQueueFlag = true;
+ setTimeout(() => {
+ storage.iconsQueueFlag = false;
+ const { provider, prefix } = storage;
+ const icons2 = storage.iconsToLoad;
+ delete storage.iconsToLoad;
+ let api;
+ if (!icons2 || !(api = getAPIModule(provider))) {
+ return;
+ }
+ const params = api.prepare(provider, prefix, icons2);
+ params.forEach((item) => {
+ sendAPIQuery(provider, item, (data) => {
+ if (typeof data !== "object") {
+ item.icons.forEach((name) => {
+ storage.missing.add(name);
+ });
+ } else {
+ try {
+ const parsed = addIconSet(
+ storage,
+ data
+ );
+ if (!parsed.length) {
+ return;
+ }
+ const pending = storage.pendingIcons;
+ if (pending) {
+ parsed.forEach((name) => {
+ pending.delete(name);
+ });
+ }
+ storeInBrowserStorage(storage, data);
+ } catch (err) {
+ console.error(err);
+ }
+ }
+ loadedNewIcons(storage);
+ });
+ });
+ });
+ }
+}
+const isPending = (icon) => {
+ const storage = getStorage(
+ icon.provider,
+ icon.prefix
+ );
+ const pending = storage.pendingIcons;
+ return !!(pending && pending.has(icon.name));
+};
+const loadIcons = (icons, callback) => {
+ const cleanedIcons = listToIcons(icons, true, allowSimpleNames());
+ const sortedIcons = sortIcons(cleanedIcons);
+ if (!sortedIcons.pending.length) {
+ let callCallback = true;
+ if (callback) {
+ setTimeout(() => {
+ if (callCallback) {
+ callback(
+ sortedIcons.loaded,
+ sortedIcons.missing,
+ sortedIcons.pending,
+ emptyCallback
+ );
+ }
+ });
+ }
+ return () => {
+ callCallback = false;
+ };
+ }
+ const newIcons = /* @__PURE__ */ Object.create(null);
+ const sources = [];
+ let lastProvider, lastPrefix;
+ sortedIcons.pending.forEach((icon) => {
+ const { provider, prefix } = icon;
+ if (prefix === lastPrefix && provider === lastProvider) {
+ return;
+ }
+ lastProvider = provider;
+ lastPrefix = prefix;
+ sources.push(getStorage(provider, prefix));
+ const providerNewIcons = newIcons[provider] || (newIcons[provider] = /* @__PURE__ */ Object.create(null));
+ if (!providerNewIcons[prefix]) {
+ providerNewIcons[prefix] = [];
+ }
+ });
+ sortedIcons.pending.forEach((icon) => {
+ const { provider, prefix, name } = icon;
+ const storage = getStorage(provider, prefix);
+ const pendingQueue = storage.pendingIcons || (storage.pendingIcons = /* @__PURE__ */ new Set());
+ if (!pendingQueue.has(name)) {
+ pendingQueue.add(name);
+ newIcons[provider][prefix].push(name);
+ }
+ });
+ sources.forEach((storage) => {
+ const { provider, prefix } = storage;
+ if (newIcons[provider][prefix].length) {
+ loadNewIcons(storage, newIcons[provider][prefix]);
+ }
+ });
+ return callback ? storeCallback(callback, sortedIcons, sources) : emptyCallback;
+};
+
+/**
+ * Compare props
+ */
+function propsChanged(props1, props2) {
+ if (props1.name !== props2.name || props1.mode !== props2.mode) {
+ return true;
+ }
+ const customisations1 = props1.customisations;
+ const customisations2 = props2.customisations;
+ for (const key in defaultExtendedIconCustomisations) {
+ if (customisations1[key] !== customisations2[key]) {
+ return true;
+ }
+ }
+ return false;
+}
+
+function rotateFromString(value, defaultValue = 0) {
+ const units = value.replace(/^-?[0-9.]*/, "");
+ function cleanup(value2) {
+ while (value2 < 0) {
+ value2 += 4;
+ }
+ return value2 % 4;
+ }
+ if (units === "") {
+ const num = parseInt(value);
+ return isNaN(num) ? 0 : cleanup(num);
+ } else if (units !== value) {
+ let split = 0;
+ switch (units) {
+ case "%":
+ split = 25;
+ break;
+ case "deg":
+ split = 90;
+ }
+ if (split) {
+ let num = parseFloat(value.slice(0, value.length - units.length));
+ if (isNaN(num)) {
+ return 0;
+ }
+ num = num / split;
+ return num % 1 === 0 ? cleanup(num) : 0;
+ }
+ }
+ return defaultValue;
+}
+
+const separator = /[\s,]+/;
+function flipFromString(custom, flip) {
+ flip.split(separator).forEach((str) => {
+ const value = str.trim();
+ switch (value) {
+ case "horizontal":
+ custom.hFlip = true;
+ break;
+ case "vertical":
+ custom.vFlip = true;
+ break;
+ }
+ });
+}
+
+/**
+ * Size attributes
+ */
+const sizeAttributes = ['width', 'height'];
+/**
+ * Boolean attributes
+ */
+const booleanAttributes = [
+ 'inline',
+ 'hFlip',
+ 'vFlip',
+];
+/**
+ * Get attribute value
+ */
+function getBooleanAttribute(value, key) {
+ if (value === key || value === 'true') {
+ return true;
+ }
+ if (value === '' || value === 'false') {
+ return false;
+ }
+ return null;
+}
+/**
+ * Get element properties from HTML element
+ */
+function getElementProps(element) {
+ // Get icon name
+ const name = element.getAttribute('data-icon');
+ const icon = typeof name === 'string' && stringToIcon(name, true);
+ if (!icon) {
+ return null;
+ }
+ // Get defaults and inline
+ const customisations = {
+ ...defaultExtendedIconCustomisations,
+ inline: element.classList && element.classList.contains(inlineClass),
+ };
+ // Get dimensions
+ sizeAttributes.forEach((attr) => {
+ const value = element.getAttribute('data-' + attr);
+ if (value) {
+ customisations[attr] = value;
+ }
+ });
+ // Get rotation
+ const rotation = element.getAttribute('data-rotate');
+ if (typeof rotation === 'string') {
+ customisations.rotate = rotateFromString(rotation);
+ }
+ // Get flip shorthand
+ const flip = element.getAttribute('data-flip');
+ if (typeof flip === 'string') {
+ flipFromString(customisations, flip);
+ }
+ // Boolean attributes
+ booleanAttributes.forEach((attr) => {
+ const key = 'data-' + attr;
+ const value = getBooleanAttribute(element.getAttribute(key), key);
+ if (typeof value === 'boolean') {
+ customisations[attr] = value;
+ }
+ });
+ // Get render mode. Not checking actual value because incorrect values are treated as inline
+ const mode = element.getAttribute('data-mode');
+ return {
+ name,
+ icon,
+ customisations,
+ mode,
+ };
+}
+
+/**
+ * Selector combining class names and tags
+ */
+const selector = 'svg.' +
+ blockClass +
+ ', i.' +
+ blockClass +
+ ', span.' +
+ blockClass +
+ ', i.' +
+ inlineClass +
+ ', span.' +
+ inlineClass;
+/**
+ * Find all parent nodes in DOM
+ */
+function scanRootNode(root) {
+ const nodes = [];
+ root.querySelectorAll(selector).forEach((node) => {
+ // Get props, ignore SVG rendered outside of SVG framework
+ const props = node[elementDataProperty] || node.tagName.toLowerCase() !== 'svg'
+ ? getElementProps(node)
+ : null;
+ if (props) {
+ nodes.push({
+ node,
+ props,
+ });
+ }
+ });
+ return nodes;
+}
+
+function iconToHTML(body, attributes) {
+ let renderAttribsHTML = body.indexOf("xlink:") === -1 ? "" : ' xmlns:xlink="http://www.w3.org/1999/xlink"';
+ for (const attr in attributes) {
+ renderAttribsHTML += " " + attr + '="' + attributes[attr] + '"';
+ }
+ return '" + body + " ";
+}
+
+let policy;
+function createPolicy() {
+ try {
+ policy = window.trustedTypes.createPolicy("iconify", {
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
+ createHTML: (s) => s
+ });
+ } catch (err) {
+ policy = null;
+ }
+}
+function cleanUpInnerHTML(html) {
+ if (policy === void 0) {
+ createPolicy();
+ }
+ return policy ? policy.createHTML(html) : html;
+}
+
+/**
+ * Get classes to add from icon name
+ */
+function iconClasses(iconName) {
+ const classesToAdd = new Set(['iconify']);
+ ['provider', 'prefix'].forEach((attr) => {
+ if (iconName[attr]) {
+ classesToAdd.add('iconify--' + iconName[attr]);
+ }
+ });
+ return classesToAdd;
+}
+/**
+ * Add classes to SVG, removing previously added classes, keeping custom classes
+ */
+function applyClasses(svg, classes, previouslyAddedClasses, placeholder) {
+ const svgClasses = svg.classList;
+ // Copy classes from placeholder
+ if (placeholder) {
+ const placeholderClasses = placeholder.classList;
+ Array.from(placeholderClasses).forEach((item) => {
+ svgClasses.add(item);
+ });
+ }
+ // Add new classes
+ const addedClasses = [];
+ classes.forEach((item) => {
+ if (!svgClasses.contains(item)) {
+ // Add new class
+ svgClasses.add(item);
+ addedClasses.push(item);
+ }
+ else if (previouslyAddedClasses.has(item)) {
+ // Was added before: keep it
+ addedClasses.push(item);
+ }
+ });
+ // Remove previously added classes
+ previouslyAddedClasses.forEach((item) => {
+ if (!classes.has(item)) {
+ // Class that was added before, but no longer needed
+ svgClasses.remove(item);
+ }
+ });
+ return addedClasses;
+}
+
+/**
+ * Copy old styles, apply new styles
+ */
+function applyStyle(svg, styles, previouslyAddedStyles) {
+ const svgStyle = svg.style;
+ // Remove previously added styles
+ (previouslyAddedStyles || []).forEach((prop) => {
+ svgStyle.removeProperty(prop);
+ });
+ // Apply new styles, ignoring styles that already exist
+ const appliedStyles = [];
+ for (const prop in styles) {
+ if (!svgStyle.getPropertyValue(prop)) {
+ appliedStyles.push(prop);
+ svgStyle.setProperty(prop, styles[prop]);
+ }
+ }
+ return appliedStyles;
+}
+
+/**
+ * Render icon as inline SVG
+ */
+function renderInlineSVG(element, props, iconData) {
+ // Create placeholder. Why placeholder? innerHTML setter on SVG does not work in some environments.
+ let span;
+ try {
+ span = document.createElement('span');
+ }
+ catch (err) {
+ return element;
+ }
+ // Generate data to render
+ const customisations = props.customisations;
+ const renderData = iconToSVG(iconData, customisations);
+ // Get old data
+ const oldData = element[elementDataProperty];
+ // Generate SVG
+ const html = iconToHTML(replaceIDs(renderData.body), {
+ 'aria-hidden': 'true',
+ 'role': 'img',
+ ...renderData.attributes,
+ });
+ span.innerHTML = cleanUpInnerHTML(html);
+ // Get SVG element
+ const svg = span.childNodes[0];
+ // Add attributes
+ const placeholderAttributes = element.attributes;
+ for (let i = 0; i < placeholderAttributes.length; i++) {
+ const item = placeholderAttributes.item(i);
+ const name = item.name;
+ if (name !== 'class' && !svg.hasAttribute(name)) {
+ svg.setAttribute(name, item.value);
+ }
+ }
+ // Add classes
+ const classesToAdd = iconClasses(props.icon);
+ const addedClasses = applyClasses(svg, classesToAdd, new Set(oldData && oldData.addedClasses), element);
+ // Update style
+ const addedStyles = applyStyle(svg, customisations.inline
+ ? {
+ 'vertical-align': '-0.125em',
+ }
+ : {}, oldData && oldData.addedStyles);
+ // Add data to element
+ const newData = {
+ ...props,
+ status: 'loaded',
+ addedClasses,
+ addedStyles,
+ };
+ svg[elementDataProperty] = newData;
+ // Replace old element
+ if (element.parentNode) {
+ element.parentNode.replaceChild(svg, element);
+ }
+ return svg;
+}
+
+function encodeSVGforURL(svg) {
+ return svg.replace(/"/g, "'").replace(/%/g, "%25").replace(/#/g, "%23").replace(//g, "%3E").replace(/\s+/g, " ");
+}
+function svgToData(svg) {
+ return "data:image/svg+xml," + encodeSVGforURL(svg);
+}
+function svgToURL(svg) {
+ return 'url("' + svgToData(svg) + '")';
+}
+
+const commonProps = {
+ display: 'inline-block',
+};
+const monotoneProps = {
+ 'background-color': 'currentColor',
+};
+const coloredProps = {
+ 'background-color': 'transparent',
+};
+// Dynamically add common props to variables above
+const propsToAdd = {
+ image: 'var(--svg)',
+ repeat: 'no-repeat',
+ size: '100% 100%',
+};
+const propsToAddTo = {
+ '-webkit-mask': monotoneProps,
+ 'mask': monotoneProps,
+ 'background': coloredProps,
+};
+for (const prefix in propsToAddTo) {
+ const list = propsToAddTo[prefix];
+ for (const prop in propsToAdd) {
+ list[prefix + '-' + prop] = propsToAdd[prop];
+ }
+}
+/**
+ * Fix size: add 'px' to numbers
+ */
+function fixSize(value) {
+ return value + (value.match(/^[-0-9.]+$/) ? 'px' : '');
+}
+/**
+ * Render icon as inline SVG
+ */
+function renderBackground(element, props, iconData, useMask) {
+ // Generate data to render
+ const customisations = props.customisations;
+ const renderData = iconToSVG(iconData, customisations);
+ const renderAttribs = renderData.attributes;
+ // Get old data
+ const oldData = element[elementDataProperty];
+ // Generate SVG
+ const html = iconToHTML(renderData.body, {
+ ...renderAttribs,
+ width: iconData.width + '',
+ height: iconData.height + '',
+ });
+ // Add classes
+ const classesToAdd = iconClasses(props.icon);
+ const addedClasses = applyClasses(element, classesToAdd, new Set(oldData && oldData.addedClasses));
+ // Update style
+ const url = svgToURL(html);
+ const newStyles = {
+ '--svg': url,
+ 'width': fixSize(renderAttribs.width),
+ 'height': fixSize(renderAttribs.height),
+ ...commonProps,
+ ...(useMask ? monotoneProps : coloredProps),
+ };
+ if (customisations.inline) {
+ newStyles['vertical-align'] = '-0.125em';
+ }
+ const addedStyles = applyStyle(element, newStyles, oldData && oldData.addedStyles);
+ // Add data to element
+ const newData = {
+ ...props,
+ status: 'loaded',
+ addedClasses,
+ addedStyles,
+ };
+ element[elementDataProperty] = newData;
+ return element;
+}
+
+/**
+ * Flag to avoid scanning DOM too often
+ */
+let scanQueued = false;
+/**
+ * Icons have been loaded
+ */
+function checkPendingIcons() {
+ if (!scanQueued) {
+ scanQueued = true;
+ setTimeout(() => {
+ if (scanQueued) {
+ scanQueued = false;
+ scanDOM();
+ }
+ });
+ }
+}
+/**
+ * Scan node for placeholders
+ */
+function scanDOM(rootNode, addTempNode = false) {
+ // List of icons to load: [provider][prefix] = Set
+ const iconsToLoad = Object.create(null);
+ function getIcon(icon, load) {
+ const { provider, prefix, name } = icon;
+ const storage = getStorage(provider, prefix);
+ const storedIcon = storage.icons[name];
+ if (storedIcon) {
+ return {
+ status: 'loaded',
+ icon: storedIcon,
+ };
+ }
+ if (storage.missing.has(name)) {
+ return {
+ status: 'missing',
+ };
+ }
+ if (load && !isPending(icon)) {
+ const providerIconsToLoad = iconsToLoad[provider] ||
+ (iconsToLoad[provider] = Object.create(null));
+ const set = providerIconsToLoad[prefix] ||
+ (providerIconsToLoad[prefix] = new Set());
+ set.add(name);
+ }
+ return {
+ status: 'loading',
+ };
+ }
+ // Parse all root nodes
+ (rootNode ? [rootNode] : listRootNodes()).forEach((observedNode) => {
+ const root = typeof observedNode.node === 'function'
+ ? observedNode.node()
+ : observedNode.node;
+ if (!root || !root.querySelectorAll) {
+ return;
+ }
+ // Track placeholders
+ let hasPlaceholders = false;
+ // Observer
+ let paused = false;
+ /**
+ * Render icon
+ */
+ function render(element, props, iconData) {
+ if (!paused) {
+ paused = true;
+ pauseObservingNode(observedNode);
+ }
+ if (element.tagName.toUpperCase() !== 'SVG') {
+ // Check for one of style modes
+ const mode = props.mode;
+ const isMask = mode === 'mask' ||
+ (mode === 'bg'
+ ? false
+ : mode === 'style'
+ ? iconData.body.indexOf('currentColor') !== -1
+ : null);
+ if (typeof isMask === 'boolean') {
+ renderBackground(element, props, {
+ ...defaultIconProps,
+ ...iconData,
+ }, isMask);
+ return;
+ }
+ }
+ renderInlineSVG(element, props, iconData);
+ }
+ // Find all elements
+ scanRootNode(root).forEach(({ node, props }) => {
+ // Check if item already has props
+ const oldData = node[elementDataProperty];
+ if (!oldData) {
+ // New icon without data
+ const { status, icon } = getIcon(props.icon, true);
+ if (icon) {
+ // Ready to render!
+ render(node, props, icon);
+ return;
+ }
+ // Loading or missing
+ hasPlaceholders = hasPlaceholders || status === 'loading';
+ node[elementDataProperty] = {
+ ...props,
+ status,
+ };
+ return;
+ }
+ // Previously found icon
+ let item;
+ if (!propsChanged(oldData, props)) {
+ // Props have not changed. Check status
+ const oldStatus = oldData.status;
+ if (oldStatus !== 'loading') {
+ return;
+ }
+ item = getIcon(props.icon, false);
+ if (!item.icon) {
+ // Nothing to render
+ oldData.status = item.status;
+ return;
+ }
+ }
+ else {
+ // Properties have changed: load icon if name has changed
+ item = getIcon(props.icon, oldData.name !== props.name);
+ if (!item.icon) {
+ // Cannot render icon: update status and props
+ hasPlaceholders =
+ hasPlaceholders || item.status === 'loading';
+ Object.assign(oldData, {
+ ...props,
+ status: item.status,
+ });
+ return;
+ }
+ }
+ // Re-render icon
+ render(node, props, item.icon);
+ });
+ // Observed node stuff
+ if (observedNode.temporary && !hasPlaceholders) {
+ // Remove temporary node
+ stopObserving(root);
+ }
+ else if (addTempNode && hasPlaceholders) {
+ // Add new temporary node
+ observe(root, true);
+ }
+ else if (paused && observedNode.observer) {
+ // Resume observer
+ resumeObservingNode(observedNode);
+ }
+ });
+ // Load icons
+ for (const provider in iconsToLoad) {
+ const providerIconsToLoad = iconsToLoad[provider];
+ for (const prefix in providerIconsToLoad) {
+ const set = providerIconsToLoad[prefix];
+ loadIcons(Array.from(set).map((name) => ({
+ provider,
+ prefix,
+ name,
+ })), checkPendingIcons);
+ }
+ }
+}
+/**
+ * Scan node for placeholders
+ */
+function scanElement(root) {
+ // Add temporary node
+ const node = findRootNode(root);
+ if (!node) {
+ scanDOM({
+ node: root,
+ temporary: true,
+ }, true);
+ }
+ else {
+ scanDOM(node);
+ }
+}
+
+function generateIcon(name, customisations, returnString = false) {
+ // Get icon data
+ const iconData = getIconData(name);
+ if (!iconData) {
+ return null;
+ }
+ // Split name
+ const iconName = stringToIcon(name);
+ // Clean up customisations
+ const changes = mergeCustomisations(defaultExtendedIconCustomisations, customisations || {});
+ // Get data
+ const result = renderInlineSVG(document.createElement('span'), {
+ name,
+ icon: iconName,
+ customisations: changes,
+ }, iconData);
+ return returnString
+ ? result.outerHTML
+ : result;
+}
+/**
+ * Get version
+ */
+function getVersion() {
+ return '3.1.1';
+}
+/**
+ * Generate SVG element
+ */
+function renderSVG(name, customisations) {
+ return generateIcon(name, customisations, false);
+}
+/**
+ * Generate SVG as string
+ */
+function renderHTML(name, customisations) {
+ return generateIcon(name, customisations, true);
+}
+/**
+ * Get rendered icon as object that can be used to create SVG (use replaceIDs on body)
+ */
+function renderIcon(name, customisations) {
+ // Get icon data
+ const iconData = getIconData(name);
+ if (!iconData) {
+ return null;
+ }
+ // Clean up customisations
+ const changes = mergeCustomisations(defaultExtendedIconCustomisations, customisations || {});
+ // Get data
+ return iconToSVG(iconData, changes);
+}
+/**
+ * Scan DOM
+ */
+function scan(root) {
+ if (root) {
+ scanElement(root);
+ }
+ else {
+ scanDOM();
+ }
+}
+/**
+ * Initialise stuff
+ */
+if (typeof document !== 'undefined' && typeof window !== 'undefined') {
+ // Add document.body node
+ addBodyNode();
+ const _window = window;
+ // Load icons from global "IconifyPreload"
+ if (_window.IconifyPreload !== void 0) {
+ const preload = _window.IconifyPreload;
+ const err = 'Invalid IconifyPreload syntax.';
+ if (typeof preload === 'object' && preload !== null) {
+ (preload instanceof Array ? preload : [preload]).forEach((item) => {
+ try {
+ if (
+ // Check if item is an object and not null/array
+ typeof item !== 'object' ||
+ item === null ||
+ item instanceof Array ||
+ // Check for 'icons' and 'prefix'
+ typeof item.icons !== 'object' ||
+ typeof item.prefix !== 'string' ||
+ // Add icon set
+ !addCollection(item)) {
+ console.error(err);
+ }
+ }
+ catch (e) {
+ console.error(err);
+ }
+ });
+ }
+ }
+ // Load observer and scan DOM on next tick
+ setTimeout(() => {
+ initObserver(scanDOM);
+ scanDOM();
+ });
+}
+
+/**
+ * Global variable
+ */
+const Iconify = {
+ // IconifyStorageFunctions
+ iconExists,
+ getIcon,
+ listIcons,
+ addIcon,
+ addCollection,
+ // IconifyBuilderFunctions
+ replaceIDs,
+ calculateSize,
+ buildIcon: iconToSVG,
+ // IconifyCommonFunctions
+ getVersion,
+ renderSVG,
+ renderHTML,
+ renderIcon,
+ scan,
+ observe,
+ stopObserving,
+ pauseObserver,
+ resumeObserver,
+};
+
+exports.addCollection = addCollection;
+exports.addIcon = addIcon;
+exports.buildIcon = iconToSVG;
+exports.calculateSize = calculateSize;
+exports.default = Iconify;
+exports.getIcon = getIcon;
+exports.getVersion = getVersion;
+exports.iconExists = iconExists;
+exports.listIcons = listIcons;
+exports.observe = observe;
+exports.pauseObserver = pauseObserver;
+exports.renderHTML = renderHTML;
+exports.renderIcon = renderIcon;
+exports.renderSVG = renderSVG;
+exports.replaceIDs = replaceIDs;
+exports.resumeObserver = resumeObserver;
+exports.scan = scan;
+exports.stopObserving = stopObserving;
+
+// Export to window or web worker
+try {
+ if (self.Iconify === void 0) {
+ self.Iconify = Iconify;
+ }
+} catch (err) {
+}
diff --git a/node_modules/@iconify/iconify/dist/iconify.without-api.d.ts b/node_modules/@iconify/iconify/dist/iconify.without-api.d.ts
new file mode 100644
index 0000000..fca7b6f
--- /dev/null
+++ b/node_modules/@iconify/iconify/dist/iconify.without-api.d.ts
@@ -0,0 +1,279 @@
+import { IconifyIcon } from '@iconify/types';
+import { IconifyJSON } from '@iconify/types';
+import { IconifyTransformations } from '@iconify/types';
+
+/**
+ * Add icon set
+ */
+export declare function addCollection(data: IconifyJSON, provider?: string): boolean;
+
+/**
+ * Add one icon
+ */
+export declare function addIcon(name: string, data: IconifyIcon): boolean;
+
+/**
+ * Get SVG attributes and content from icon + customisations
+ *
+ * Does not generate style to make it compatible with frameworks that use objects for style, such as React.
+ * Instead, it generates 'inline' value. If true, rendering engine should add verticalAlign: -0.125em to icon.
+ *
+ * Customisations should be normalised by platform specific parser.
+ * Result should be converted to by platform specific parser.
+ * Use replaceIDs to generate unique IDs for body.
+ */
+export declare function buildIcon(icon: IconifyIcon, customisations?: IconifyIconCustomisations_2): IconifyIconBuildResult;
+
+/**
+ * Calculate second dimension when only 1 dimension is set
+ */
+export declare function calculateSize(size: string, ratio: number, precision?: number): string;
+
+export declare function calculateSize(size: number, ratio: number, precision?: number): number;
+
+export declare function calculateSize(size: string | number, ratio: number, precision?: number): string | number;
+
+/**
+ * Callback
+ */
+declare type GetHTMLElement = () => HTMLElement | null;
+
+/**
+ * Get full icon
+ */
+export declare function getIcon(name: string): Required | null;
+
+/**
+ * Get version
+ */
+export declare function getVersion(): string;
+
+/**
+ * Check if icon exists
+ */
+export declare function iconExists(name: string): boolean;
+
+/**
+ * Global variable
+ */
+declare const Iconify: IconifyGlobal;
+export default Iconify;
+
+/**
+ * Interface for exported builder functions
+ */
+export declare interface IconifyBuilderFunctions {
+ replaceIDs?: (body: string, prefix?: string | (() => string)) => string;
+ calculateSize: (size: string | number, ratio: number, precision?: number) => string | number;
+ buildIcon: (icon: IconifyIcon, customisations?: IconifyIconCustomisations_2) => IconifyIconBuildResult;
+}
+
+/**
+ * Iconify interface
+ */
+declare interface IconifyCommonFunctions {
+ /**
+ * Get version
+ */
+ getVersion: () => string;
+ /**
+ * Render icons
+ */
+ renderSVG: (name: string, customisations?: IconifyIconCustomisations_2) => SVGElement | null;
+ renderHTML: (name: string, customisations?: IconifyIconCustomisations_2) => string | null;
+ /**
+ * Get icon data
+ */
+ renderIcon: (name: string, customisations?: IconifyIconCustomisations_2) => IconifyIconBuildResult | null;
+ /**
+ * Scan DOM
+ */
+ scan: (root?: HTMLElement) => void;
+ /**
+ * Add root node
+ */
+ observe: (root: HTMLElement) => void;
+ /**
+ * Remove root node
+ */
+ stopObserving: (root: HTMLElement) => void;
+ /**
+ * Pause observer
+ */
+ pauseObserver: (root?: HTMLElement) => void;
+ /**
+ * Resume observer
+ */
+ resumeObserver: (root?: HTMLElement) => void;
+}
+
+/**
+ * Iconify interface
+ */
+export declare interface IconifyGlobal extends IconifyStorageFunctions, IconifyBuilderFunctions, IconifyCommonFunctions {
+}
+
+export { IconifyIcon }
+
+/**
+ * Interface for getSVGData() result
+ */
+export declare interface IconifyIconBuildResult {
+ attributes: {
+ width?: string;
+ height?: string;
+ viewBox: string;
+ };
+ body: string;
+}
+
+/**
+ * Add inline to customisations
+ */
+export declare interface IconifyIconCustomisations extends IconifyIconCustomisations_2 {
+ inline?: boolean;
+}
+
+/**
+ * Icon customisations
+ */
+declare interface IconifyIconCustomisations_2 extends IconifyTransformations, IconifyIconSizeCustomisations {
+}
+
+/**
+ * Icon name
+ */
+export declare interface IconifyIconName {
+ readonly provider: string;
+ readonly prefix: string;
+ readonly name: string;
+}
+
+/**
+ * Icon size
+ */
+export declare type IconifyIconSize = null | string | number;
+
+/**
+ * Dimensions
+ */
+declare interface IconifyIconSizeCustomisations {
+ width?: IconifyIconSize;
+ height?: IconifyIconSize;
+}
+
+export { IconifyJSON }
+
+/**
+ * Icon render mode
+ *
+ * 'style' = 'bg' or 'mask', depending on icon content
+ * 'bg' = add inline style to placeholder using `background`
+ * 'mask' = add inline style to placeholder using `mask`
+ * 'svg' =
+ */
+export declare type IconifyRenderMode = 'style' | 'bg' | 'mask' | 'svg';
+
+/**
+ * Interface for exported storage functions
+ */
+export declare interface IconifyStorageFunctions {
+ /**
+ * Check if icon exists
+ */
+ iconExists: (name: string) => boolean;
+ /**
+ * Get icon data with all properties
+ */
+ getIcon: (name: string) => Required | null;
+ /**
+ * List all available icons
+ */
+ listIcons: (provider?: string, prefix?: string) => string[];
+ /**
+ * Add icon to storage
+ */
+ addIcon: (name: string, data: IconifyIcon) => boolean;
+ /**
+ * Add icon set to storage
+ */
+ addCollection: (data: IconifyJSON, provider?: string) => boolean;
+}
+
+/**
+ * List available icons
+ */
+export declare function listIcons(provider?: string, prefix?: string): string[];
+
+/**
+ * Observe node
+ */
+export declare function observe(root: HTMLElement, autoRemove?: boolean): ObservedNode;
+
+/**
+ * Observed node type
+ */
+declare interface ObservedNode {
+ node: HTMLElement | GetHTMLElement;
+ temporary?: boolean;
+ observer?: {
+ instance?: MutationObserver;
+ paused: number;
+ pendingScan?: unknown;
+ };
+}
+
+/**
+ * Pause observer
+ */
+export declare function pauseObserver(root?: HTMLElement): void;
+
+/**
+ * Generate SVG as string
+ */
+export declare function renderHTML(name: string, customisations?: IconifyIconCustomisations_2): string | null;
+
+/**
+ * Get rendered icon as object that can be used to create SVG (use replaceIDs on body)
+ */
+export declare function renderIcon(name: string, customisations?: IconifyIconCustomisations_2): IconifyIconBuildResult | null;
+
+/**
+ * Generate SVG element
+ */
+export declare function renderSVG(name: string, customisations?: IconifyIconCustomisations_2): SVGElement | null;
+
+/**
+ * IDs usage:
+ *
+ * id="{id}"
+ * xlink:href="#{id}"
+ * url(#{id})
+ *
+ * From SVG animations:
+ *
+ * begin="0;{id}.end"
+ * begin="{id}.end"
+ * begin="{id}.click"
+ */
+/**
+ * Replace IDs in SVG output with unique IDs
+ */
+export declare function replaceIDs(body: string, prefix?: string | ((id: string) => string)): string;
+
+/**
+ * Resume observer
+ */
+export declare function resumeObserver(root?: HTMLElement): void;
+
+/**
+ * Scan DOM
+ */
+export declare function scan(root?: HTMLElement): void;
+
+/**
+ * Remove observed node
+ */
+export declare function stopObserving(root: HTMLElement): void;
+
+export { }
diff --git a/node_modules/@iconify/iconify/dist/iconify.without-api.js b/node_modules/@iconify/iconify/dist/iconify.without-api.js
new file mode 100644
index 0000000..7127695
--- /dev/null
+++ b/node_modules/@iconify/iconify/dist/iconify.without-api.js
@@ -0,0 +1,2409 @@
+/**
+* (c) Iconify
+*
+* For the full copyright and license information, please view the license.txt or license.gpl.txt
+* files at https://github.com/iconify/iconify
+*
+* Licensed under MIT.
+*
+* @license MIT
+* @version 3.1.1
+*/
+var Iconify = (function (exports) {
+ 'use strict';
+
+ const defaultIconDimensions = Object.freeze(
+ {
+ left: 0,
+ top: 0,
+ width: 16,
+ height: 16
+ }
+ );
+ const defaultIconTransformations = Object.freeze({
+ rotate: 0,
+ vFlip: false,
+ hFlip: false
+ });
+ const defaultIconProps = Object.freeze({
+ ...defaultIconDimensions,
+ ...defaultIconTransformations
+ });
+ const defaultExtendedIconProps = Object.freeze({
+ ...defaultIconProps,
+ body: "",
+ hidden: false
+ });
+
+ function mergeIconTransformations(obj1, obj2) {
+ const result = {};
+ if (!obj1.hFlip !== !obj2.hFlip) {
+ result.hFlip = true;
+ }
+ if (!obj1.vFlip !== !obj2.vFlip) {
+ result.vFlip = true;
+ }
+ const rotate = ((obj1.rotate || 0) + (obj2.rotate || 0)) % 4;
+ if (rotate) {
+ result.rotate = rotate;
+ }
+ return result;
+ }
+
+ function mergeIconData(parent, child) {
+ const result = mergeIconTransformations(parent, child);
+ for (const key in defaultExtendedIconProps) {
+ if (key in defaultIconTransformations) {
+ if (key in parent && !(key in result)) {
+ result[key] = defaultIconTransformations[key];
+ }
+ } else if (key in child) {
+ result[key] = child[key];
+ } else if (key in parent) {
+ result[key] = parent[key];
+ }
+ }
+ return result;
+ }
+
+ function getIconsTree(data, names) {
+ const icons = data.icons;
+ const aliases = data.aliases || /* @__PURE__ */ Object.create(null);
+ const resolved = /* @__PURE__ */ Object.create(null);
+ function resolve(name) {
+ if (icons[name]) {
+ return resolved[name] = [];
+ }
+ if (!(name in resolved)) {
+ resolved[name] = null;
+ const parent = aliases[name] && aliases[name].parent;
+ const value = parent && resolve(parent);
+ if (value) {
+ resolved[name] = [parent].concat(value);
+ }
+ }
+ return resolved[name];
+ }
+ (names || Object.keys(icons).concat(Object.keys(aliases))).forEach(resolve);
+ return resolved;
+ }
+
+ function internalGetIconData(data, name, tree) {
+ const icons = data.icons;
+ const aliases = data.aliases || /* @__PURE__ */ Object.create(null);
+ let currentProps = {};
+ function parse(name2) {
+ currentProps = mergeIconData(
+ icons[name2] || aliases[name2],
+ currentProps
+ );
+ }
+ parse(name);
+ tree.forEach(parse);
+ return mergeIconData(data, currentProps);
+ }
+
+ function parseIconSet(data, callback) {
+ const names = [];
+ if (typeof data !== "object" || typeof data.icons !== "object") {
+ return names;
+ }
+ if (data.not_found instanceof Array) {
+ data.not_found.forEach((name) => {
+ callback(name, null);
+ names.push(name);
+ });
+ }
+ const tree = getIconsTree(data);
+ for (const name in tree) {
+ const item = tree[name];
+ if (item) {
+ callback(name, internalGetIconData(data, name, item));
+ names.push(name);
+ }
+ }
+ return names;
+ }
+
+ const matchIconName = /^[a-z0-9]+(-[a-z0-9]+)*$/;
+ const stringToIcon = (value, validate, allowSimpleName, provider = "") => {
+ const colonSeparated = value.split(":");
+ if (value.slice(0, 1) === "@") {
+ if (colonSeparated.length < 2 || colonSeparated.length > 3) {
+ return null;
+ }
+ provider = colonSeparated.shift().slice(1);
+ }
+ if (colonSeparated.length > 3 || !colonSeparated.length) {
+ return null;
+ }
+ if (colonSeparated.length > 1) {
+ const name2 = colonSeparated.pop();
+ const prefix = colonSeparated.pop();
+ const result = {
+ // Allow provider without '@': "provider:prefix:name"
+ provider: colonSeparated.length > 0 ? colonSeparated[0] : provider,
+ prefix,
+ name: name2
+ };
+ return validate && !validateIconName(result) ? null : result;
+ }
+ const name = colonSeparated[0];
+ const dashSeparated = name.split("-");
+ if (dashSeparated.length > 1) {
+ const result = {
+ provider,
+ prefix: dashSeparated.shift(),
+ name: dashSeparated.join("-")
+ };
+ return validate && !validateIconName(result) ? null : result;
+ }
+ if (allowSimpleName && provider === "") {
+ const result = {
+ provider,
+ prefix: "",
+ name
+ };
+ return validate && !validateIconName(result, allowSimpleName) ? null : result;
+ }
+ return null;
+ };
+ const validateIconName = (icon, allowSimpleName) => {
+ if (!icon) {
+ return false;
+ }
+ return !!((icon.provider === "" || icon.provider.match(matchIconName)) && (allowSimpleName && icon.prefix === "" || icon.prefix.match(matchIconName)) && icon.name.match(matchIconName));
+ };
+
+ const optionalPropertyDefaults = {
+ provider: "",
+ aliases: {},
+ not_found: {},
+ ...defaultIconDimensions
+ };
+ function checkOptionalProps(item, defaults) {
+ for (const prop in defaults) {
+ if (prop in item && typeof item[prop] !== typeof defaults[prop]) {
+ return false;
+ }
+ }
+ return true;
+ }
+ function quicklyValidateIconSet(obj) {
+ if (typeof obj !== "object" || obj === null) {
+ return null;
+ }
+ const data = obj;
+ if (typeof data.prefix !== "string" || !obj.icons || typeof obj.icons !== "object") {
+ return null;
+ }
+ if (!checkOptionalProps(obj, optionalPropertyDefaults)) {
+ return null;
+ }
+ const icons = data.icons;
+ for (const name in icons) {
+ const icon = icons[name];
+ if (!name.match(matchIconName) || typeof icon.body !== "string" || !checkOptionalProps(
+ icon,
+ defaultExtendedIconProps
+ )) {
+ return null;
+ }
+ }
+ const aliases = data.aliases || /* @__PURE__ */ Object.create(null);
+ for (const name in aliases) {
+ const icon = aliases[name];
+ const parent = icon.parent;
+ if (!name.match(matchIconName) || typeof parent !== "string" || !icons[parent] && !aliases[parent] || !checkOptionalProps(
+ icon,
+ defaultExtendedIconProps
+ )) {
+ return null;
+ }
+ }
+ return data;
+ }
+
+ const dataStorage = /* @__PURE__ */ Object.create(null);
+ function newStorage(provider, prefix) {
+ return {
+ provider,
+ prefix,
+ icons: /* @__PURE__ */ Object.create(null),
+ missing: /* @__PURE__ */ new Set()
+ };
+ }
+ function getStorage(provider, prefix) {
+ const providerStorage = dataStorage[provider] || (dataStorage[provider] = /* @__PURE__ */ Object.create(null));
+ return providerStorage[prefix] || (providerStorage[prefix] = newStorage(provider, prefix));
+ }
+ function addIconSet(storage, data) {
+ if (!quicklyValidateIconSet(data)) {
+ return [];
+ }
+ return parseIconSet(data, (name, icon) => {
+ if (icon) {
+ storage.icons[name] = icon;
+ } else {
+ storage.missing.add(name);
+ }
+ });
+ }
+ function addIconToStorage(storage, name, icon) {
+ try {
+ if (typeof icon.body === "string") {
+ storage.icons[name] = { ...icon };
+ return true;
+ }
+ } catch (err) {
+ }
+ return false;
+ }
+ function listIcons(provider, prefix) {
+ let allIcons = [];
+ const providers = typeof provider === "string" ? [provider] : Object.keys(dataStorage);
+ providers.forEach((provider2) => {
+ const prefixes = typeof provider2 === "string" && typeof prefix === "string" ? [prefix] : Object.keys(dataStorage[provider2] || {});
+ prefixes.forEach((prefix2) => {
+ const storage = getStorage(provider2, prefix2);
+ allIcons = allIcons.concat(
+ Object.keys(storage.icons).map(
+ (name) => (provider2 !== "" ? "@" + provider2 + ":" : "") + prefix2 + ":" + name
+ )
+ );
+ });
+ });
+ return allIcons;
+ }
+
+ let simpleNames = false;
+ function allowSimpleNames(allow) {
+ if (typeof allow === "boolean") {
+ simpleNames = allow;
+ }
+ return simpleNames;
+ }
+ function getIconData(name) {
+ const icon = typeof name === "string" ? stringToIcon(name, true, simpleNames) : name;
+ if (icon) {
+ const storage = getStorage(icon.provider, icon.prefix);
+ const iconName = icon.name;
+ return storage.icons[iconName] || (storage.missing.has(iconName) ? null : void 0);
+ }
+ }
+ function addIcon(name, data) {
+ const icon = stringToIcon(name, true, simpleNames);
+ if (!icon) {
+ return false;
+ }
+ const storage = getStorage(icon.provider, icon.prefix);
+ return addIconToStorage(storage, icon.name, data);
+ }
+ function addCollection(data, provider) {
+ if (typeof data !== "object") {
+ return false;
+ }
+ if (typeof provider !== "string") {
+ provider = data.provider || "";
+ }
+ if (simpleNames && !provider && !data.prefix) {
+ let added = false;
+ if (quicklyValidateIconSet(data)) {
+ data.prefix = "";
+ parseIconSet(data, (name, icon) => {
+ if (icon && addIcon(name, icon)) {
+ added = true;
+ }
+ });
+ }
+ return added;
+ }
+ const prefix = data.prefix;
+ if (!validateIconName({
+ provider,
+ prefix,
+ name: "a"
+ })) {
+ return false;
+ }
+ const storage = getStorage(provider, prefix);
+ return !!addIconSet(storage, data);
+ }
+ function iconExists(name) {
+ return !!getIconData(name);
+ }
+ function getIcon(name) {
+ const result = getIconData(name);
+ return result ? {
+ ...defaultIconProps,
+ ...result
+ } : null;
+ }
+
+ const defaultIconSizeCustomisations = Object.freeze({
+ width: null,
+ height: null
+ });
+ const defaultIconCustomisations = Object.freeze({
+ // Dimensions
+ ...defaultIconSizeCustomisations,
+ // Transformations
+ ...defaultIconTransformations
+ });
+
+ const unitsSplit = /(-?[0-9.]*[0-9]+[0-9.]*)/g;
+ const unitsTest = /^-?[0-9.]*[0-9]+[0-9.]*$/g;
+ function calculateSize(size, ratio, precision) {
+ if (ratio === 1) {
+ return size;
+ }
+ precision = precision || 100;
+ if (typeof size === "number") {
+ return Math.ceil(size * ratio * precision) / precision;
+ }
+ if (typeof size !== "string") {
+ return size;
+ }
+ const oldParts = size.split(unitsSplit);
+ if (oldParts === null || !oldParts.length) {
+ return size;
+ }
+ const newParts = [];
+ let code = oldParts.shift();
+ let isNumber = unitsTest.test(code);
+ while (true) {
+ if (isNumber) {
+ const num = parseFloat(code);
+ if (isNaN(num)) {
+ newParts.push(code);
+ } else {
+ newParts.push(Math.ceil(num * ratio * precision) / precision);
+ }
+ } else {
+ newParts.push(code);
+ }
+ code = oldParts.shift();
+ if (code === void 0) {
+ return newParts.join("");
+ }
+ isNumber = !isNumber;
+ }
+ }
+
+ const isUnsetKeyword = (value) => value === "unset" || value === "undefined" || value === "none";
+ function iconToSVG(icon, customisations) {
+ const fullIcon = {
+ ...defaultIconProps,
+ ...icon
+ };
+ const fullCustomisations = {
+ ...defaultIconCustomisations,
+ ...customisations
+ };
+ const box = {
+ left: fullIcon.left,
+ top: fullIcon.top,
+ width: fullIcon.width,
+ height: fullIcon.height
+ };
+ let body = fullIcon.body;
+ [fullIcon, fullCustomisations].forEach((props) => {
+ const transformations = [];
+ const hFlip = props.hFlip;
+ const vFlip = props.vFlip;
+ let rotation = props.rotate;
+ if (hFlip) {
+ if (vFlip) {
+ rotation += 2;
+ } else {
+ transformations.push(
+ "translate(" + (box.width + box.left).toString() + " " + (0 - box.top).toString() + ")"
+ );
+ transformations.push("scale(-1 1)");
+ box.top = box.left = 0;
+ }
+ } else if (vFlip) {
+ transformations.push(
+ "translate(" + (0 - box.left).toString() + " " + (box.height + box.top).toString() + ")"
+ );
+ transformations.push("scale(1 -1)");
+ box.top = box.left = 0;
+ }
+ let tempValue;
+ if (rotation < 0) {
+ rotation -= Math.floor(rotation / 4) * 4;
+ }
+ rotation = rotation % 4;
+ switch (rotation) {
+ case 1:
+ tempValue = box.height / 2 + box.top;
+ transformations.unshift(
+ "rotate(90 " + tempValue.toString() + " " + tempValue.toString() + ")"
+ );
+ break;
+ case 2:
+ transformations.unshift(
+ "rotate(180 " + (box.width / 2 + box.left).toString() + " " + (box.height / 2 + box.top).toString() + ")"
+ );
+ break;
+ case 3:
+ tempValue = box.width / 2 + box.left;
+ transformations.unshift(
+ "rotate(-90 " + tempValue.toString() + " " + tempValue.toString() + ")"
+ );
+ break;
+ }
+ if (rotation % 2 === 1) {
+ if (box.left !== box.top) {
+ tempValue = box.left;
+ box.left = box.top;
+ box.top = tempValue;
+ }
+ if (box.width !== box.height) {
+ tempValue = box.width;
+ box.width = box.height;
+ box.height = tempValue;
+ }
+ }
+ if (transformations.length) {
+ body = '' + body + " ";
+ }
+ });
+ const customisationsWidth = fullCustomisations.width;
+ const customisationsHeight = fullCustomisations.height;
+ const boxWidth = box.width;
+ const boxHeight = box.height;
+ let width;
+ let height;
+ if (customisationsWidth === null) {
+ height = customisationsHeight === null ? "1em" : customisationsHeight === "auto" ? boxHeight : customisationsHeight;
+ width = calculateSize(height, boxWidth / boxHeight);
+ } else {
+ width = customisationsWidth === "auto" ? boxWidth : customisationsWidth;
+ height = customisationsHeight === null ? calculateSize(width, boxHeight / boxWidth) : customisationsHeight === "auto" ? boxHeight : customisationsHeight;
+ }
+ const attributes = {};
+ const setAttr = (prop, value) => {
+ if (!isUnsetKeyword(value)) {
+ attributes[prop] = value.toString();
+ }
+ };
+ setAttr("width", width);
+ setAttr("height", height);
+ attributes.viewBox = box.left.toString() + " " + box.top.toString() + " " + boxWidth.toString() + " " + boxHeight.toString();
+ return {
+ attributes,
+ body
+ };
+ }
+
+ const regex = /\sid="(\S+)"/g;
+ const randomPrefix = "IconifyId" + Date.now().toString(16) + (Math.random() * 16777216 | 0).toString(16);
+ let counter = 0;
+ function replaceIDs(body, prefix = randomPrefix) {
+ const ids = [];
+ let match;
+ while (match = regex.exec(body)) {
+ ids.push(match[1]);
+ }
+ if (!ids.length) {
+ return body;
+ }
+ const suffix = "suffix" + (Math.random() * 16777216 | Date.now()).toString(16);
+ ids.forEach((id) => {
+ const newID = typeof prefix === "function" ? prefix(id) : prefix + (counter++).toString();
+ const escapedID = id.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
+ body = body.replace(
+ // Allowed characters before id: [#;"]
+ // Allowed characters after id: [)"], .[a-z]
+ new RegExp('([#;"])(' + escapedID + ')([")]|\\.[a-z])', "g"),
+ "$1" + newID + suffix + "$3"
+ );
+ });
+ body = body.replace(new RegExp(suffix, "g"), "");
+ return body;
+ }
+
+ function mergeCustomisations(defaults, item) {
+ const result = {
+ ...defaults
+ };
+ for (const key in item) {
+ const value = item[key];
+ const valueType = typeof value;
+ if (key in defaultIconSizeCustomisations) {
+ if (value === null || value && (valueType === "string" || valueType === "number")) {
+ result[key] = value;
+ }
+ } else if (valueType === typeof result[key]) {
+ result[key] = key === "rotate" ? value % 4 : value;
+ }
+ }
+ return result;
+ }
+
+ const defaultExtendedIconCustomisations = {
+ ...defaultIconCustomisations,
+ inline: false,
+ };
+ /**
+ * Class names
+ */
+ const blockClass = 'iconify';
+ const inlineClass = 'iconify-inline';
+ /**
+ * Names of properties to add to nodes
+ */
+ const elementDataProperty = ('iconifyData' + Date.now());
+
+ /**
+ * List of root nodes
+ */
+ let nodes = [];
+ /**
+ * Find node
+ */
+ function findRootNode(node) {
+ for (let i = 0; i < nodes.length; i++) {
+ const item = nodes[i];
+ const root = typeof item.node === 'function' ? item.node() : item.node;
+ if (root === node) {
+ return item;
+ }
+ }
+ }
+ /**
+ * Add extra root node
+ */
+ function addRootNode(root, autoRemove = false) {
+ let node = findRootNode(root);
+ if (node) {
+ // Node already exist: switch type if needed
+ if (node.temporary) {
+ node.temporary = autoRemove;
+ }
+ return node;
+ }
+ // Create item, add it to list
+ node = {
+ node: root,
+ temporary: autoRemove,
+ };
+ nodes.push(node);
+ return node;
+ }
+ /**
+ * Add document.body node
+ */
+ function addBodyNode() {
+ if (document.documentElement) {
+ return addRootNode(document.documentElement);
+ }
+ nodes.push({
+ node: () => {
+ return document.documentElement;
+ },
+ });
+ }
+ /**
+ * Remove root node
+ */
+ function removeRootNode(root) {
+ nodes = nodes.filter((node) => root !== node &&
+ root !== (typeof node.node === 'function' ? node.node() : node.node));
+ }
+ /**
+ * Get list of root nodes
+ */
+ function listRootNodes() {
+ return nodes;
+ }
+
+ /**
+ * Execute function when DOM is ready
+ */
+ function onReady(callback) {
+ const doc = document;
+ if (doc.readyState && doc.readyState !== 'loading') {
+ callback();
+ }
+ else {
+ doc.addEventListener('DOMContentLoaded', callback);
+ }
+ }
+
+ /**
+ * Callback
+ */
+ let callback = null;
+ /**
+ * Parameters for mutation observer
+ */
+ const observerParams = {
+ childList: true,
+ subtree: true,
+ attributes: true,
+ };
+ /**
+ * Queue DOM scan
+ */
+ function queueScan(node) {
+ if (!node.observer) {
+ return;
+ }
+ const observer = node.observer;
+ if (!observer.pendingScan) {
+ observer.pendingScan = setTimeout(() => {
+ delete observer.pendingScan;
+ if (callback) {
+ callback(node);
+ }
+ });
+ }
+ }
+ /**
+ * Check mutations for added nodes
+ */
+ function checkMutations(node, mutations) {
+ if (!node.observer) {
+ return;
+ }
+ const observer = node.observer;
+ if (!observer.pendingScan) {
+ for (let i = 0; i < mutations.length; i++) {
+ const item = mutations[i];
+ if (
+ // Check for added nodes
+ (item.addedNodes && item.addedNodes.length > 0) ||
+ // Check for icon or placeholder with modified attributes
+ (item.type === 'attributes' &&
+ item.target[elementDataProperty] !==
+ void 0)) {
+ if (!observer.paused) {
+ queueScan(node);
+ }
+ return;
+ }
+ }
+ }
+ }
+ /**
+ * Start/resume observer
+ */
+ function continueObserving(node, root) {
+ node.observer.instance.observe(root, observerParams);
+ }
+ /**
+ * Start mutation observer
+ */
+ function startObserver(node) {
+ let observer = node.observer;
+ if (observer && observer.instance) {
+ // Already started
+ return;
+ }
+ const root = typeof node.node === 'function' ? node.node() : node.node;
+ if (!root || !window) {
+ // document.body is not available yet or window is missing
+ return;
+ }
+ if (!observer) {
+ observer = {
+ paused: 0,
+ };
+ node.observer = observer;
+ }
+ // Create new instance, observe
+ observer.instance = new window.MutationObserver(checkMutations.bind(null, node));
+ continueObserving(node, root);
+ // Scan immediately
+ if (!observer.paused) {
+ queueScan(node);
+ }
+ }
+ /**
+ * Start all observers
+ */
+ function startObservers() {
+ listRootNodes().forEach(startObserver);
+ }
+ /**
+ * Stop observer
+ */
+ function stopObserver(node) {
+ if (!node.observer) {
+ return;
+ }
+ const observer = node.observer;
+ // Stop scan
+ if (observer.pendingScan) {
+ clearTimeout(observer.pendingScan);
+ delete observer.pendingScan;
+ }
+ // Disconnect observer
+ if (observer.instance) {
+ observer.instance.disconnect();
+ delete observer.instance;
+ }
+ }
+ /**
+ * Start observer when DOM is ready
+ */
+ function initObserver(cb) {
+ const isRestart = callback !== null;
+ if (callback !== cb) {
+ // Change callback and stop all pending observers
+ callback = cb;
+ if (isRestart) {
+ listRootNodes().forEach(stopObserver);
+ }
+ }
+ if (isRestart) {
+ // Restart instances
+ startObservers();
+ return;
+ }
+ // Start observers when document is ready
+ onReady(startObservers);
+ }
+ /**
+ * Pause observing node
+ */
+ function pauseObservingNode(node) {
+ (node ? [node] : listRootNodes()).forEach((node) => {
+ if (!node.observer) {
+ node.observer = {
+ paused: 1,
+ };
+ return;
+ }
+ const observer = node.observer;
+ observer.paused++;
+ if (observer.paused > 1 || !observer.instance) {
+ return;
+ }
+ // Disconnect observer
+ const instance = observer.instance;
+ // checkMutations(node, instance.takeRecords());
+ instance.disconnect();
+ });
+ }
+ /**
+ * Pause observer
+ */
+ function pauseObserver(root) {
+ if (root) {
+ const node = findRootNode(root);
+ if (node) {
+ pauseObservingNode(node);
+ }
+ }
+ else {
+ pauseObservingNode();
+ }
+ }
+ /**
+ * Resume observer
+ */
+ function resumeObservingNode(observer) {
+ (observer ? [observer] : listRootNodes()).forEach((node) => {
+ if (!node.observer) {
+ // Start observer
+ startObserver(node);
+ return;
+ }
+ const observer = node.observer;
+ if (observer.paused) {
+ observer.paused--;
+ if (!observer.paused) {
+ // Start / resume
+ const root = typeof node.node === 'function' ? node.node() : node.node;
+ if (!root) {
+ return;
+ }
+ else if (observer.instance) {
+ continueObserving(node, root);
+ }
+ else {
+ startObserver(node);
+ }
+ }
+ }
+ });
+ }
+ /**
+ * Resume observer
+ */
+ function resumeObserver(root) {
+ if (root) {
+ const node = findRootNode(root);
+ if (node) {
+ resumeObservingNode(node);
+ }
+ }
+ else {
+ resumeObservingNode();
+ }
+ }
+ /**
+ * Observe node
+ */
+ function observe(root, autoRemove = false) {
+ const node = addRootNode(root, autoRemove);
+ startObserver(node);
+ return node;
+ }
+ /**
+ * Remove observed node
+ */
+ function stopObserving(root) {
+ const node = findRootNode(root);
+ if (node) {
+ stopObserver(node);
+ removeRootNode(root);
+ }
+ }
+
+ function sortIcons(icons) {
+ const result = {
+ loaded: [],
+ missing: [],
+ pending: []
+ };
+ const storage = /* @__PURE__ */ Object.create(null);
+ icons.sort((a, b) => {
+ if (a.provider !== b.provider) {
+ return a.provider.localeCompare(b.provider);
+ }
+ if (a.prefix !== b.prefix) {
+ return a.prefix.localeCompare(b.prefix);
+ }
+ return a.name.localeCompare(b.name);
+ });
+ let lastIcon = {
+ provider: "",
+ prefix: "",
+ name: ""
+ };
+ icons.forEach((icon) => {
+ if (lastIcon.name === icon.name && lastIcon.prefix === icon.prefix && lastIcon.provider === icon.provider) {
+ return;
+ }
+ lastIcon = icon;
+ const provider = icon.provider;
+ const prefix = icon.prefix;
+ const name = icon.name;
+ const providerStorage = storage[provider] || (storage[provider] = /* @__PURE__ */ Object.create(null));
+ const localStorage = providerStorage[prefix] || (providerStorage[prefix] = getStorage(provider, prefix));
+ let list;
+ if (name in localStorage.icons) {
+ list = result.loaded;
+ } else if (prefix === "" || localStorage.missing.has(name)) {
+ list = result.missing;
+ } else {
+ list = result.pending;
+ }
+ const item = {
+ provider,
+ prefix,
+ name
+ };
+ list.push(item);
+ });
+ return result;
+ }
+
+ function removeCallback(storages, id) {
+ storages.forEach((storage) => {
+ const items = storage.loaderCallbacks;
+ if (items) {
+ storage.loaderCallbacks = items.filter((row) => row.id !== id);
+ }
+ });
+ }
+ function updateCallbacks(storage) {
+ if (!storage.pendingCallbacksFlag) {
+ storage.pendingCallbacksFlag = true;
+ setTimeout(() => {
+ storage.pendingCallbacksFlag = false;
+ const items = storage.loaderCallbacks ? storage.loaderCallbacks.slice(0) : [];
+ if (!items.length) {
+ return;
+ }
+ let hasPending = false;
+ const provider = storage.provider;
+ const prefix = storage.prefix;
+ items.forEach((item) => {
+ const icons = item.icons;
+ const oldLength = icons.pending.length;
+ icons.pending = icons.pending.filter((icon) => {
+ if (icon.prefix !== prefix) {
+ return true;
+ }
+ const name = icon.name;
+ if (storage.icons[name]) {
+ icons.loaded.push({
+ provider,
+ prefix,
+ name
+ });
+ } else if (storage.missing.has(name)) {
+ icons.missing.push({
+ provider,
+ prefix,
+ name
+ });
+ } else {
+ hasPending = true;
+ return true;
+ }
+ return false;
+ });
+ if (icons.pending.length !== oldLength) {
+ if (!hasPending) {
+ removeCallback([storage], item.id);
+ }
+ item.callback(
+ icons.loaded.slice(0),
+ icons.missing.slice(0),
+ icons.pending.slice(0),
+ item.abort
+ );
+ }
+ });
+ });
+ }
+ }
+ let idCounter = 0;
+ function storeCallback(callback, icons, pendingSources) {
+ const id = idCounter++;
+ const abort = removeCallback.bind(null, pendingSources, id);
+ if (!icons.pending.length) {
+ return abort;
+ }
+ const item = {
+ id,
+ icons,
+ callback,
+ abort
+ };
+ pendingSources.forEach((storage) => {
+ (storage.loaderCallbacks || (storage.loaderCallbacks = [])).push(item);
+ });
+ return abort;
+ }
+
+ const storage = /* @__PURE__ */ Object.create(null);
+ function getAPIModule(provider) {
+ return storage[provider] || storage[""];
+ }
+
+ function listToIcons(list, validate = true, simpleNames = false) {
+ const result = [];
+ list.forEach((item) => {
+ const icon = typeof item === "string" ? stringToIcon(item, validate, simpleNames) : item;
+ if (icon) {
+ result.push(icon);
+ }
+ });
+ return result;
+ }
+
+ // src/config.ts
+ var defaultConfig = {
+ resources: [],
+ index: 0,
+ timeout: 2e3,
+ rotate: 750,
+ random: false,
+ dataAfterTimeout: false
+ };
+
+ // src/query.ts
+ function sendQuery(config, payload, query, done) {
+ const resourcesCount = config.resources.length;
+ const startIndex = config.random ? Math.floor(Math.random() * resourcesCount) : config.index;
+ let resources;
+ if (config.random) {
+ let list = config.resources.slice(0);
+ resources = [];
+ while (list.length > 1) {
+ const nextIndex = Math.floor(Math.random() * list.length);
+ resources.push(list[nextIndex]);
+ list = list.slice(0, nextIndex).concat(list.slice(nextIndex + 1));
+ }
+ resources = resources.concat(list);
+ } else {
+ resources = config.resources.slice(startIndex).concat(config.resources.slice(0, startIndex));
+ }
+ const startTime = Date.now();
+ let status = "pending";
+ let queriesSent = 0;
+ let lastError;
+ let timer = null;
+ let queue = [];
+ let doneCallbacks = [];
+ if (typeof done === "function") {
+ doneCallbacks.push(done);
+ }
+ function resetTimer() {
+ if (timer) {
+ clearTimeout(timer);
+ timer = null;
+ }
+ }
+ function abort() {
+ if (status === "pending") {
+ status = "aborted";
+ }
+ resetTimer();
+ queue.forEach((item) => {
+ if (item.status === "pending") {
+ item.status = "aborted";
+ }
+ });
+ queue = [];
+ }
+ function subscribe(callback, overwrite) {
+ if (overwrite) {
+ doneCallbacks = [];
+ }
+ if (typeof callback === "function") {
+ doneCallbacks.push(callback);
+ }
+ }
+ function getQueryStatus() {
+ return {
+ startTime,
+ payload,
+ status,
+ queriesSent,
+ queriesPending: queue.length,
+ subscribe,
+ abort
+ };
+ }
+ function failQuery() {
+ status = "failed";
+ doneCallbacks.forEach((callback) => {
+ callback(void 0, lastError);
+ });
+ }
+ function clearQueue() {
+ queue.forEach((item) => {
+ if (item.status === "pending") {
+ item.status = "aborted";
+ }
+ });
+ queue = [];
+ }
+ function moduleResponse(item, response, data) {
+ const isError = response !== "success";
+ queue = queue.filter((queued) => queued !== item);
+ switch (status) {
+ case "pending":
+ break;
+ case "failed":
+ if (isError || !config.dataAfterTimeout) {
+ return;
+ }
+ break;
+ default:
+ return;
+ }
+ if (response === "abort") {
+ lastError = data;
+ failQuery();
+ return;
+ }
+ if (isError) {
+ lastError = data;
+ if (!queue.length) {
+ if (!resources.length) {
+ failQuery();
+ } else {
+ execNext();
+ }
+ }
+ return;
+ }
+ resetTimer();
+ clearQueue();
+ if (!config.random) {
+ const index = config.resources.indexOf(item.resource);
+ if (index !== -1 && index !== config.index) {
+ config.index = index;
+ }
+ }
+ status = "completed";
+ doneCallbacks.forEach((callback) => {
+ callback(data);
+ });
+ }
+ function execNext() {
+ if (status !== "pending") {
+ return;
+ }
+ resetTimer();
+ const resource = resources.shift();
+ if (resource === void 0) {
+ if (queue.length) {
+ timer = setTimeout(() => {
+ resetTimer();
+ if (status === "pending") {
+ clearQueue();
+ failQuery();
+ }
+ }, config.timeout);
+ return;
+ }
+ failQuery();
+ return;
+ }
+ const item = {
+ status: "pending",
+ resource,
+ callback: (status2, data) => {
+ moduleResponse(item, status2, data);
+ }
+ };
+ queue.push(item);
+ queriesSent++;
+ timer = setTimeout(execNext, config.rotate);
+ query(resource, payload, item.callback);
+ }
+ setTimeout(execNext);
+ return getQueryStatus;
+ }
+
+ // src/index.ts
+ function initRedundancy(cfg) {
+ const config = {
+ ...defaultConfig,
+ ...cfg
+ };
+ let queries = [];
+ function cleanup() {
+ queries = queries.filter((item) => item().status === "pending");
+ }
+ function query(payload, queryCallback, doneCallback) {
+ const query2 = sendQuery(
+ config,
+ payload,
+ queryCallback,
+ (data, error) => {
+ cleanup();
+ if (doneCallback) {
+ doneCallback(data, error);
+ }
+ }
+ );
+ queries.push(query2);
+ return query2;
+ }
+ function find(callback) {
+ return queries.find((value) => {
+ return callback(value);
+ }) || null;
+ }
+ const instance = {
+ query,
+ find,
+ setIndex: (index) => {
+ config.index = index;
+ },
+ getIndex: () => config.index,
+ cleanup
+ };
+ return instance;
+ }
+
+ function createAPIConfig(source) {
+ let resources;
+ if (typeof source.resources === "string") {
+ resources = [source.resources];
+ } else {
+ resources = source.resources;
+ if (!(resources instanceof Array) || !resources.length) {
+ return null;
+ }
+ }
+ const result = {
+ // API hosts
+ resources,
+ // Root path
+ path: source.path || "/",
+ // URL length limit
+ maxURL: source.maxURL || 500,
+ // Timeout before next host is used.
+ rotate: source.rotate || 750,
+ // Timeout before failing query.
+ timeout: source.timeout || 5e3,
+ // Randomise default API end point.
+ random: source.random === true,
+ // Start index
+ index: source.index || 0,
+ // Receive data after time out (used if time out kicks in first, then API module sends data anyway).
+ dataAfterTimeout: source.dataAfterTimeout !== false
+ };
+ return result;
+ }
+ const configStorage = /* @__PURE__ */ Object.create(null);
+ const fallBackAPISources = [
+ "https://api.simplesvg.com",
+ "https://api.unisvg.com"
+ ];
+ const fallBackAPI = [];
+ while (fallBackAPISources.length > 0) {
+ if (fallBackAPISources.length === 1) {
+ fallBackAPI.push(fallBackAPISources.shift());
+ } else {
+ if (Math.random() > 0.5) {
+ fallBackAPI.push(fallBackAPISources.shift());
+ } else {
+ fallBackAPI.push(fallBackAPISources.pop());
+ }
+ }
+ }
+ configStorage[""] = createAPIConfig({
+ resources: ["https://api.iconify.design"].concat(fallBackAPI)
+ });
+ function getAPIConfig(provider) {
+ return configStorage[provider];
+ }
+
+ function emptyCallback$1() {
+ }
+ const redundancyCache = /* @__PURE__ */ Object.create(null);
+ function getRedundancyCache(provider) {
+ if (!redundancyCache[provider]) {
+ const config = getAPIConfig(provider);
+ if (!config) {
+ return;
+ }
+ const redundancy = initRedundancy(config);
+ const cachedReundancy = {
+ config,
+ redundancy
+ };
+ redundancyCache[provider] = cachedReundancy;
+ }
+ return redundancyCache[provider];
+ }
+ function sendAPIQuery(target, query, callback) {
+ let redundancy;
+ let send;
+ if (typeof target === "string") {
+ const api = getAPIModule(target);
+ if (!api) {
+ callback(void 0, 424);
+ return emptyCallback$1;
+ }
+ send = api.send;
+ const cached = getRedundancyCache(target);
+ if (cached) {
+ redundancy = cached.redundancy;
+ }
+ } else {
+ const config = createAPIConfig(target);
+ if (config) {
+ redundancy = initRedundancy(config);
+ const moduleKey = target.resources ? target.resources[0] : "";
+ const api = getAPIModule(moduleKey);
+ if (api) {
+ send = api.send;
+ }
+ }
+ }
+ if (!redundancy || !send) {
+ callback(void 0, 424);
+ return emptyCallback$1;
+ }
+ return redundancy.query(query, send, callback)().abort;
+ }
+
+ const browserCacheVersion = "iconify2";
+ const browserCachePrefix = "iconify";
+ const browserCacheCountKey = browserCachePrefix + "-count";
+ const browserCacheVersionKey = browserCachePrefix + "-version";
+ const browserStorageHour = 36e5;
+ const browserStorageCacheExpiration = 168;
+
+ function getStoredItem(func, key) {
+ try {
+ return func.getItem(key);
+ } catch (err) {
+ }
+ }
+ function setStoredItem(func, key, value) {
+ try {
+ func.setItem(key, value);
+ return true;
+ } catch (err) {
+ }
+ }
+ function removeStoredItem(func, key) {
+ try {
+ func.removeItem(key);
+ } catch (err) {
+ }
+ }
+
+ function setBrowserStorageItemsCount(storage, value) {
+ return setStoredItem(storage, browserCacheCountKey, value.toString());
+ }
+ function getBrowserStorageItemsCount(storage) {
+ return parseInt(getStoredItem(storage, browserCacheCountKey)) || 0;
+ }
+
+ const browserStorageConfig = {
+ local: true,
+ session: true
+ };
+ const browserStorageEmptyItems = {
+ local: /* @__PURE__ */ new Set(),
+ session: /* @__PURE__ */ new Set()
+ };
+ let browserStorageStatus = false;
+ function setBrowserStorageStatus(status) {
+ browserStorageStatus = status;
+ }
+
+ let _window = typeof window === "undefined" ? {} : window;
+ function getBrowserStorage(key) {
+ const attr = key + "Storage";
+ try {
+ if (_window && _window[attr] && typeof _window[attr].length === "number") {
+ return _window[attr];
+ }
+ } catch (err) {
+ }
+ browserStorageConfig[key] = false;
+ }
+
+ function iterateBrowserStorage(key, callback) {
+ const func = getBrowserStorage(key);
+ if (!func) {
+ return;
+ }
+ const version = getStoredItem(func, browserCacheVersionKey);
+ if (version !== browserCacheVersion) {
+ if (version) {
+ const total2 = getBrowserStorageItemsCount(func);
+ for (let i = 0; i < total2; i++) {
+ removeStoredItem(func, browserCachePrefix + i.toString());
+ }
+ }
+ setStoredItem(func, browserCacheVersionKey, browserCacheVersion);
+ setBrowserStorageItemsCount(func, 0);
+ return;
+ }
+ const minTime = Math.floor(Date.now() / browserStorageHour) - browserStorageCacheExpiration;
+ const parseItem = (index) => {
+ const name = browserCachePrefix + index.toString();
+ const item = getStoredItem(func, name);
+ if (typeof item !== "string") {
+ return;
+ }
+ try {
+ const data = JSON.parse(item);
+ if (typeof data === "object" && typeof data.cached === "number" && data.cached > minTime && typeof data.provider === "string" && typeof data.data === "object" && typeof data.data.prefix === "string" && // Valid item: run callback
+ callback(data, index)) {
+ return true;
+ }
+ } catch (err) {
+ }
+ removeStoredItem(func, name);
+ };
+ let total = getBrowserStorageItemsCount(func);
+ for (let i = total - 1; i >= 0; i--) {
+ if (!parseItem(i)) {
+ if (i === total - 1) {
+ total--;
+ setBrowserStorageItemsCount(func, total);
+ } else {
+ browserStorageEmptyItems[key].add(i);
+ }
+ }
+ }
+ }
+
+ function initBrowserStorage() {
+ if (browserStorageStatus) {
+ return;
+ }
+ setBrowserStorageStatus(true);
+ for (const key in browserStorageConfig) {
+ iterateBrowserStorage(key, (item) => {
+ const iconSet = item.data;
+ const provider = item.provider;
+ const prefix = iconSet.prefix;
+ const storage = getStorage(
+ provider,
+ prefix
+ );
+ if (!addIconSet(storage, iconSet).length) {
+ return false;
+ }
+ const lastModified = iconSet.lastModified || -1;
+ storage.lastModifiedCached = storage.lastModifiedCached ? Math.min(storage.lastModifiedCached, lastModified) : lastModified;
+ return true;
+ });
+ }
+ }
+
+ function updateLastModified(storage, lastModified) {
+ const lastValue = storage.lastModifiedCached;
+ if (
+ // Matches or newer
+ lastValue && lastValue >= lastModified
+ ) {
+ return lastValue === lastModified;
+ }
+ storage.lastModifiedCached = lastModified;
+ if (lastValue) {
+ for (const key in browserStorageConfig) {
+ iterateBrowserStorage(key, (item) => {
+ const iconSet = item.data;
+ return item.provider !== storage.provider || iconSet.prefix !== storage.prefix || iconSet.lastModified === lastModified;
+ });
+ }
+ }
+ return true;
+ }
+ function storeInBrowserStorage(storage, data) {
+ if (!browserStorageStatus) {
+ initBrowserStorage();
+ }
+ function store(key) {
+ let func;
+ if (!browserStorageConfig[key] || !(func = getBrowserStorage(key))) {
+ return;
+ }
+ const set = browserStorageEmptyItems[key];
+ let index;
+ if (set.size) {
+ set.delete(index = Array.from(set).shift());
+ } else {
+ index = getBrowserStorageItemsCount(func);
+ if (!setBrowserStorageItemsCount(func, index + 1)) {
+ return;
+ }
+ }
+ const item = {
+ cached: Math.floor(Date.now() / browserStorageHour),
+ provider: storage.provider,
+ data
+ };
+ return setStoredItem(
+ func,
+ browserCachePrefix + index.toString(),
+ JSON.stringify(item)
+ );
+ }
+ if (data.lastModified && !updateLastModified(storage, data.lastModified)) {
+ return;
+ }
+ if (!Object.keys(data.icons).length) {
+ return;
+ }
+ if (data.not_found) {
+ data = Object.assign({}, data);
+ delete data.not_found;
+ }
+ if (!store("local")) {
+ store("session");
+ }
+ }
+
+ function emptyCallback() {
+ }
+ function loadedNewIcons(storage) {
+ if (!storage.iconsLoaderFlag) {
+ storage.iconsLoaderFlag = true;
+ setTimeout(() => {
+ storage.iconsLoaderFlag = false;
+ updateCallbacks(storage);
+ });
+ }
+ }
+ function loadNewIcons(storage, icons) {
+ if (!storage.iconsToLoad) {
+ storage.iconsToLoad = icons;
+ } else {
+ storage.iconsToLoad = storage.iconsToLoad.concat(icons).sort();
+ }
+ if (!storage.iconsQueueFlag) {
+ storage.iconsQueueFlag = true;
+ setTimeout(() => {
+ storage.iconsQueueFlag = false;
+ const { provider, prefix } = storage;
+ const icons2 = storage.iconsToLoad;
+ delete storage.iconsToLoad;
+ let api;
+ if (!icons2 || !(api = getAPIModule(provider))) {
+ return;
+ }
+ const params = api.prepare(provider, prefix, icons2);
+ params.forEach((item) => {
+ sendAPIQuery(provider, item, (data) => {
+ if (typeof data !== "object") {
+ item.icons.forEach((name) => {
+ storage.missing.add(name);
+ });
+ } else {
+ try {
+ const parsed = addIconSet(
+ storage,
+ data
+ );
+ if (!parsed.length) {
+ return;
+ }
+ const pending = storage.pendingIcons;
+ if (pending) {
+ parsed.forEach((name) => {
+ pending.delete(name);
+ });
+ }
+ storeInBrowserStorage(storage, data);
+ } catch (err) {
+ console.error(err);
+ }
+ }
+ loadedNewIcons(storage);
+ });
+ });
+ });
+ }
+ }
+ const isPending = (icon) => {
+ const storage = getStorage(
+ icon.provider,
+ icon.prefix
+ );
+ const pending = storage.pendingIcons;
+ return !!(pending && pending.has(icon.name));
+ };
+ const loadIcons = (icons, callback) => {
+ const cleanedIcons = listToIcons(icons, true, allowSimpleNames());
+ const sortedIcons = sortIcons(cleanedIcons);
+ if (!sortedIcons.pending.length) {
+ let callCallback = true;
+ if (callback) {
+ setTimeout(() => {
+ if (callCallback) {
+ callback(
+ sortedIcons.loaded,
+ sortedIcons.missing,
+ sortedIcons.pending,
+ emptyCallback
+ );
+ }
+ });
+ }
+ return () => {
+ callCallback = false;
+ };
+ }
+ const newIcons = /* @__PURE__ */ Object.create(null);
+ const sources = [];
+ let lastProvider, lastPrefix;
+ sortedIcons.pending.forEach((icon) => {
+ const { provider, prefix } = icon;
+ if (prefix === lastPrefix && provider === lastProvider) {
+ return;
+ }
+ lastProvider = provider;
+ lastPrefix = prefix;
+ sources.push(getStorage(provider, prefix));
+ const providerNewIcons = newIcons[provider] || (newIcons[provider] = /* @__PURE__ */ Object.create(null));
+ if (!providerNewIcons[prefix]) {
+ providerNewIcons[prefix] = [];
+ }
+ });
+ sortedIcons.pending.forEach((icon) => {
+ const { provider, prefix, name } = icon;
+ const storage = getStorage(provider, prefix);
+ const pendingQueue = storage.pendingIcons || (storage.pendingIcons = /* @__PURE__ */ new Set());
+ if (!pendingQueue.has(name)) {
+ pendingQueue.add(name);
+ newIcons[provider][prefix].push(name);
+ }
+ });
+ sources.forEach((storage) => {
+ const { provider, prefix } = storage;
+ if (newIcons[provider][prefix].length) {
+ loadNewIcons(storage, newIcons[provider][prefix]);
+ }
+ });
+ return callback ? storeCallback(callback, sortedIcons, sources) : emptyCallback;
+ };
+
+ /**
+ * Compare props
+ */
+ function propsChanged(props1, props2) {
+ if (props1.name !== props2.name || props1.mode !== props2.mode) {
+ return true;
+ }
+ const customisations1 = props1.customisations;
+ const customisations2 = props2.customisations;
+ for (const key in defaultExtendedIconCustomisations) {
+ if (customisations1[key] !== customisations2[key]) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ function rotateFromString(value, defaultValue = 0) {
+ const units = value.replace(/^-?[0-9.]*/, "");
+ function cleanup(value2) {
+ while (value2 < 0) {
+ value2 += 4;
+ }
+ return value2 % 4;
+ }
+ if (units === "") {
+ const num = parseInt(value);
+ return isNaN(num) ? 0 : cleanup(num);
+ } else if (units !== value) {
+ let split = 0;
+ switch (units) {
+ case "%":
+ split = 25;
+ break;
+ case "deg":
+ split = 90;
+ }
+ if (split) {
+ let num = parseFloat(value.slice(0, value.length - units.length));
+ if (isNaN(num)) {
+ return 0;
+ }
+ num = num / split;
+ return num % 1 === 0 ? cleanup(num) : 0;
+ }
+ }
+ return defaultValue;
+ }
+
+ const separator = /[\s,]+/;
+ function flipFromString(custom, flip) {
+ flip.split(separator).forEach((str) => {
+ const value = str.trim();
+ switch (value) {
+ case "horizontal":
+ custom.hFlip = true;
+ break;
+ case "vertical":
+ custom.vFlip = true;
+ break;
+ }
+ });
+ }
+
+ /**
+ * Size attributes
+ */
+ const sizeAttributes = ['width', 'height'];
+ /**
+ * Boolean attributes
+ */
+ const booleanAttributes = [
+ 'inline',
+ 'hFlip',
+ 'vFlip',
+ ];
+ /**
+ * Get attribute value
+ */
+ function getBooleanAttribute(value, key) {
+ if (value === key || value === 'true') {
+ return true;
+ }
+ if (value === '' || value === 'false') {
+ return false;
+ }
+ return null;
+ }
+ /**
+ * Get element properties from HTML element
+ */
+ function getElementProps(element) {
+ // Get icon name
+ const name = element.getAttribute('data-icon');
+ const icon = typeof name === 'string' && stringToIcon(name, true);
+ if (!icon) {
+ return null;
+ }
+ // Get defaults and inline
+ const customisations = {
+ ...defaultExtendedIconCustomisations,
+ inline: element.classList && element.classList.contains(inlineClass),
+ };
+ // Get dimensions
+ sizeAttributes.forEach((attr) => {
+ const value = element.getAttribute('data-' + attr);
+ if (value) {
+ customisations[attr] = value;
+ }
+ });
+ // Get rotation
+ const rotation = element.getAttribute('data-rotate');
+ if (typeof rotation === 'string') {
+ customisations.rotate = rotateFromString(rotation);
+ }
+ // Get flip shorthand
+ const flip = element.getAttribute('data-flip');
+ if (typeof flip === 'string') {
+ flipFromString(customisations, flip);
+ }
+ // Boolean attributes
+ booleanAttributes.forEach((attr) => {
+ const key = 'data-' + attr;
+ const value = getBooleanAttribute(element.getAttribute(key), key);
+ if (typeof value === 'boolean') {
+ customisations[attr] = value;
+ }
+ });
+ // Get render mode. Not checking actual value because incorrect values are treated as inline
+ const mode = element.getAttribute('data-mode');
+ return {
+ name,
+ icon,
+ customisations,
+ mode,
+ };
+ }
+
+ /**
+ * Selector combining class names and tags
+ */
+ const selector = 'svg.' +
+ blockClass +
+ ', i.' +
+ blockClass +
+ ', span.' +
+ blockClass +
+ ', i.' +
+ inlineClass +
+ ', span.' +
+ inlineClass;
+ /**
+ * Find all parent nodes in DOM
+ */
+ function scanRootNode(root) {
+ const nodes = [];
+ root.querySelectorAll(selector).forEach((node) => {
+ // Get props, ignore SVG rendered outside of SVG framework
+ const props = node[elementDataProperty] || node.tagName.toLowerCase() !== 'svg'
+ ? getElementProps(node)
+ : null;
+ if (props) {
+ nodes.push({
+ node,
+ props,
+ });
+ }
+ });
+ return nodes;
+ }
+
+ function iconToHTML(body, attributes) {
+ let renderAttribsHTML = body.indexOf("xlink:") === -1 ? "" : ' xmlns:xlink="http://www.w3.org/1999/xlink"';
+ for (const attr in attributes) {
+ renderAttribsHTML += " " + attr + '="' + attributes[attr] + '"';
+ }
+ return '" + body + " ";
+ }
+
+ let policy;
+ function createPolicy() {
+ try {
+ policy = window.trustedTypes.createPolicy("iconify", {
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
+ createHTML: (s) => s
+ });
+ } catch (err) {
+ policy = null;
+ }
+ }
+ function cleanUpInnerHTML(html) {
+ if (policy === void 0) {
+ createPolicy();
+ }
+ return policy ? policy.createHTML(html) : html;
+ }
+
+ /**
+ * Get classes to add from icon name
+ */
+ function iconClasses(iconName) {
+ const classesToAdd = new Set(['iconify']);
+ ['provider', 'prefix'].forEach((attr) => {
+ if (iconName[attr]) {
+ classesToAdd.add('iconify--' + iconName[attr]);
+ }
+ });
+ return classesToAdd;
+ }
+ /**
+ * Add classes to SVG, removing previously added classes, keeping custom classes
+ */
+ function applyClasses(svg, classes, previouslyAddedClasses, placeholder) {
+ const svgClasses = svg.classList;
+ // Copy classes from placeholder
+ if (placeholder) {
+ const placeholderClasses = placeholder.classList;
+ Array.from(placeholderClasses).forEach((item) => {
+ svgClasses.add(item);
+ });
+ }
+ // Add new classes
+ const addedClasses = [];
+ classes.forEach((item) => {
+ if (!svgClasses.contains(item)) {
+ // Add new class
+ svgClasses.add(item);
+ addedClasses.push(item);
+ }
+ else if (previouslyAddedClasses.has(item)) {
+ // Was added before: keep it
+ addedClasses.push(item);
+ }
+ });
+ // Remove previously added classes
+ previouslyAddedClasses.forEach((item) => {
+ if (!classes.has(item)) {
+ // Class that was added before, but no longer needed
+ svgClasses.remove(item);
+ }
+ });
+ return addedClasses;
+ }
+
+ /**
+ * Copy old styles, apply new styles
+ */
+ function applyStyle(svg, styles, previouslyAddedStyles) {
+ const svgStyle = svg.style;
+ // Remove previously added styles
+ (previouslyAddedStyles || []).forEach((prop) => {
+ svgStyle.removeProperty(prop);
+ });
+ // Apply new styles, ignoring styles that already exist
+ const appliedStyles = [];
+ for (const prop in styles) {
+ if (!svgStyle.getPropertyValue(prop)) {
+ appliedStyles.push(prop);
+ svgStyle.setProperty(prop, styles[prop]);
+ }
+ }
+ return appliedStyles;
+ }
+
+ /**
+ * Render icon as inline SVG
+ */
+ function renderInlineSVG(element, props, iconData) {
+ // Create placeholder. Why placeholder? innerHTML setter on SVG does not work in some environments.
+ let span;
+ try {
+ span = document.createElement('span');
+ }
+ catch (err) {
+ return element;
+ }
+ // Generate data to render
+ const customisations = props.customisations;
+ const renderData = iconToSVG(iconData, customisations);
+ // Get old data
+ const oldData = element[elementDataProperty];
+ // Generate SVG
+ const html = iconToHTML(replaceIDs(renderData.body), {
+ 'aria-hidden': 'true',
+ 'role': 'img',
+ ...renderData.attributes,
+ });
+ span.innerHTML = cleanUpInnerHTML(html);
+ // Get SVG element
+ const svg = span.childNodes[0];
+ // Add attributes
+ const placeholderAttributes = element.attributes;
+ for (let i = 0; i < placeholderAttributes.length; i++) {
+ const item = placeholderAttributes.item(i);
+ const name = item.name;
+ if (name !== 'class' && !svg.hasAttribute(name)) {
+ svg.setAttribute(name, item.value);
+ }
+ }
+ // Add classes
+ const classesToAdd = iconClasses(props.icon);
+ const addedClasses = applyClasses(svg, classesToAdd, new Set(oldData && oldData.addedClasses), element);
+ // Update style
+ const addedStyles = applyStyle(svg, customisations.inline
+ ? {
+ 'vertical-align': '-0.125em',
+ }
+ : {}, oldData && oldData.addedStyles);
+ // Add data to element
+ const newData = {
+ ...props,
+ status: 'loaded',
+ addedClasses,
+ addedStyles,
+ };
+ svg[elementDataProperty] = newData;
+ // Replace old element
+ if (element.parentNode) {
+ element.parentNode.replaceChild(svg, element);
+ }
+ return svg;
+ }
+
+ function encodeSVGforURL(svg) {
+ return svg.replace(/"/g, "'").replace(/%/g, "%25").replace(/#/g, "%23").replace(//g, "%3E").replace(/\s+/g, " ");
+ }
+ function svgToData(svg) {
+ return "data:image/svg+xml," + encodeSVGforURL(svg);
+ }
+ function svgToURL(svg) {
+ return 'url("' + svgToData(svg) + '")';
+ }
+
+ const commonProps = {
+ display: 'inline-block',
+ };
+ const monotoneProps = {
+ 'background-color': 'currentColor',
+ };
+ const coloredProps = {
+ 'background-color': 'transparent',
+ };
+ // Dynamically add common props to variables above
+ const propsToAdd = {
+ image: 'var(--svg)',
+ repeat: 'no-repeat',
+ size: '100% 100%',
+ };
+ const propsToAddTo = {
+ '-webkit-mask': monotoneProps,
+ 'mask': monotoneProps,
+ 'background': coloredProps,
+ };
+ for (const prefix in propsToAddTo) {
+ const list = propsToAddTo[prefix];
+ for (const prop in propsToAdd) {
+ list[prefix + '-' + prop] = propsToAdd[prop];
+ }
+ }
+ /**
+ * Fix size: add 'px' to numbers
+ */
+ function fixSize(value) {
+ return value + (value.match(/^[-0-9.]+$/) ? 'px' : '');
+ }
+ /**
+ * Render icon as inline SVG
+ */
+ function renderBackground(element, props, iconData, useMask) {
+ // Generate data to render
+ const customisations = props.customisations;
+ const renderData = iconToSVG(iconData, customisations);
+ const renderAttribs = renderData.attributes;
+ // Get old data
+ const oldData = element[elementDataProperty];
+ // Generate SVG
+ const html = iconToHTML(renderData.body, {
+ ...renderAttribs,
+ width: iconData.width + '',
+ height: iconData.height + '',
+ });
+ // Add classes
+ const classesToAdd = iconClasses(props.icon);
+ const addedClasses = applyClasses(element, classesToAdd, new Set(oldData && oldData.addedClasses));
+ // Update style
+ const url = svgToURL(html);
+ const newStyles = {
+ '--svg': url,
+ 'width': fixSize(renderAttribs.width),
+ 'height': fixSize(renderAttribs.height),
+ ...commonProps,
+ ...(useMask ? monotoneProps : coloredProps),
+ };
+ if (customisations.inline) {
+ newStyles['vertical-align'] = '-0.125em';
+ }
+ const addedStyles = applyStyle(element, newStyles, oldData && oldData.addedStyles);
+ // Add data to element
+ const newData = {
+ ...props,
+ status: 'loaded',
+ addedClasses,
+ addedStyles,
+ };
+ element[elementDataProperty] = newData;
+ return element;
+ }
+
+ /**
+ * Flag to avoid scanning DOM too often
+ */
+ let scanQueued = false;
+ /**
+ * Icons have been loaded
+ */
+ function checkPendingIcons() {
+ if (!scanQueued) {
+ scanQueued = true;
+ setTimeout(() => {
+ if (scanQueued) {
+ scanQueued = false;
+ scanDOM();
+ }
+ });
+ }
+ }
+ /**
+ * Scan node for placeholders
+ */
+ function scanDOM(rootNode, addTempNode = false) {
+ // List of icons to load: [provider][prefix] = Set
+ const iconsToLoad = Object.create(null);
+ function getIcon(icon, load) {
+ const { provider, prefix, name } = icon;
+ const storage = getStorage(provider, prefix);
+ const storedIcon = storage.icons[name];
+ if (storedIcon) {
+ return {
+ status: 'loaded',
+ icon: storedIcon,
+ };
+ }
+ if (storage.missing.has(name)) {
+ return {
+ status: 'missing',
+ };
+ }
+ if (load && !isPending(icon)) {
+ const providerIconsToLoad = iconsToLoad[provider] ||
+ (iconsToLoad[provider] = Object.create(null));
+ const set = providerIconsToLoad[prefix] ||
+ (providerIconsToLoad[prefix] = new Set());
+ set.add(name);
+ }
+ return {
+ status: 'loading',
+ };
+ }
+ // Parse all root nodes
+ (rootNode ? [rootNode] : listRootNodes()).forEach((observedNode) => {
+ const root = typeof observedNode.node === 'function'
+ ? observedNode.node()
+ : observedNode.node;
+ if (!root || !root.querySelectorAll) {
+ return;
+ }
+ // Track placeholders
+ let hasPlaceholders = false;
+ // Observer
+ let paused = false;
+ /**
+ * Render icon
+ */
+ function render(element, props, iconData) {
+ if (!paused) {
+ paused = true;
+ pauseObservingNode(observedNode);
+ }
+ if (element.tagName.toUpperCase() !== 'SVG') {
+ // Check for one of style modes
+ const mode = props.mode;
+ const isMask = mode === 'mask' ||
+ (mode === 'bg'
+ ? false
+ : mode === 'style'
+ ? iconData.body.indexOf('currentColor') !== -1
+ : null);
+ if (typeof isMask === 'boolean') {
+ renderBackground(element, props, {
+ ...defaultIconProps,
+ ...iconData,
+ }, isMask);
+ return;
+ }
+ }
+ renderInlineSVG(element, props, iconData);
+ }
+ // Find all elements
+ scanRootNode(root).forEach(({ node, props }) => {
+ // Check if item already has props
+ const oldData = node[elementDataProperty];
+ if (!oldData) {
+ // New icon without data
+ const { status, icon } = getIcon(props.icon, true);
+ if (icon) {
+ // Ready to render!
+ render(node, props, icon);
+ return;
+ }
+ // Loading or missing
+ hasPlaceholders = hasPlaceholders || status === 'loading';
+ node[elementDataProperty] = {
+ ...props,
+ status,
+ };
+ return;
+ }
+ // Previously found icon
+ let item;
+ if (!propsChanged(oldData, props)) {
+ // Props have not changed. Check status
+ const oldStatus = oldData.status;
+ if (oldStatus !== 'loading') {
+ return;
+ }
+ item = getIcon(props.icon, false);
+ if (!item.icon) {
+ // Nothing to render
+ oldData.status = item.status;
+ return;
+ }
+ }
+ else {
+ // Properties have changed: load icon if name has changed
+ item = getIcon(props.icon, oldData.name !== props.name);
+ if (!item.icon) {
+ // Cannot render icon: update status and props
+ hasPlaceholders =
+ hasPlaceholders || item.status === 'loading';
+ Object.assign(oldData, {
+ ...props,
+ status: item.status,
+ });
+ return;
+ }
+ }
+ // Re-render icon
+ render(node, props, item.icon);
+ });
+ // Observed node stuff
+ if (observedNode.temporary && !hasPlaceholders) {
+ // Remove temporary node
+ stopObserving(root);
+ }
+ else if (addTempNode && hasPlaceholders) {
+ // Add new temporary node
+ observe(root, true);
+ }
+ else if (paused && observedNode.observer) {
+ // Resume observer
+ resumeObservingNode(observedNode);
+ }
+ });
+ // Load icons
+ for (const provider in iconsToLoad) {
+ const providerIconsToLoad = iconsToLoad[provider];
+ for (const prefix in providerIconsToLoad) {
+ const set = providerIconsToLoad[prefix];
+ loadIcons(Array.from(set).map((name) => ({
+ provider,
+ prefix,
+ name,
+ })), checkPendingIcons);
+ }
+ }
+ }
+ /**
+ * Scan node for placeholders
+ */
+ function scanElement(root) {
+ // Add temporary node
+ const node = findRootNode(root);
+ if (!node) {
+ scanDOM({
+ node: root,
+ temporary: true,
+ }, true);
+ }
+ else {
+ scanDOM(node);
+ }
+ }
+
+ function generateIcon(name, customisations, returnString = false) {
+ // Get icon data
+ const iconData = getIconData(name);
+ if (!iconData) {
+ return null;
+ }
+ // Split name
+ const iconName = stringToIcon(name);
+ // Clean up customisations
+ const changes = mergeCustomisations(defaultExtendedIconCustomisations, customisations || {});
+ // Get data
+ const result = renderInlineSVG(document.createElement('span'), {
+ name,
+ icon: iconName,
+ customisations: changes,
+ }, iconData);
+ return returnString
+ ? result.outerHTML
+ : result;
+ }
+ /**
+ * Get version
+ */
+ function getVersion() {
+ return '3.1.1';
+ }
+ /**
+ * Generate SVG element
+ */
+ function renderSVG(name, customisations) {
+ return generateIcon(name, customisations, false);
+ }
+ /**
+ * Generate SVG as string
+ */
+ function renderHTML(name, customisations) {
+ return generateIcon(name, customisations, true);
+ }
+ /**
+ * Get rendered icon as object that can be used to create SVG (use replaceIDs on body)
+ */
+ function renderIcon(name, customisations) {
+ // Get icon data
+ const iconData = getIconData(name);
+ if (!iconData) {
+ return null;
+ }
+ // Clean up customisations
+ const changes = mergeCustomisations(defaultExtendedIconCustomisations, customisations || {});
+ // Get data
+ return iconToSVG(iconData, changes);
+ }
+ /**
+ * Scan DOM
+ */
+ function scan(root) {
+ if (root) {
+ scanElement(root);
+ }
+ else {
+ scanDOM();
+ }
+ }
+ /**
+ * Initialise stuff
+ */
+ if (typeof document !== 'undefined' && typeof window !== 'undefined') {
+ // Add document.body node
+ addBodyNode();
+ const _window = window;
+ // Load icons from global "IconifyPreload"
+ if (_window.IconifyPreload !== void 0) {
+ const preload = _window.IconifyPreload;
+ const err = 'Invalid IconifyPreload syntax.';
+ if (typeof preload === 'object' && preload !== null) {
+ (preload instanceof Array ? preload : [preload]).forEach((item) => {
+ try {
+ if (
+ // Check if item is an object and not null/array
+ typeof item !== 'object' ||
+ item === null ||
+ item instanceof Array ||
+ // Check for 'icons' and 'prefix'
+ typeof item.icons !== 'object' ||
+ typeof item.prefix !== 'string' ||
+ // Add icon set
+ !addCollection(item)) {
+ console.error(err);
+ }
+ }
+ catch (e) {
+ console.error(err);
+ }
+ });
+ }
+ }
+ // Load observer and scan DOM on next tick
+ setTimeout(() => {
+ initObserver(scanDOM);
+ scanDOM();
+ });
+ }
+
+ /**
+ * Global variable
+ */
+ const Iconify = {
+ // IconifyStorageFunctions
+ iconExists,
+ getIcon,
+ listIcons,
+ addIcon,
+ addCollection,
+ // IconifyBuilderFunctions
+ replaceIDs,
+ calculateSize,
+ buildIcon: iconToSVG,
+ // IconifyCommonFunctions
+ getVersion,
+ renderSVG,
+ renderHTML,
+ renderIcon,
+ scan,
+ observe,
+ stopObserving,
+ pauseObserver,
+ resumeObserver,
+ };
+
+ exports.addCollection = addCollection;
+ exports.addIcon = addIcon;
+ exports.buildIcon = iconToSVG;
+ exports.calculateSize = calculateSize;
+ exports.default = Iconify;
+ exports.getIcon = getIcon;
+ exports.getVersion = getVersion;
+ exports.iconExists = iconExists;
+ exports.listIcons = listIcons;
+ exports.observe = observe;
+ exports.pauseObserver = pauseObserver;
+ exports.renderHTML = renderHTML;
+ exports.renderIcon = renderIcon;
+ exports.renderSVG = renderSVG;
+ exports.replaceIDs = replaceIDs;
+ exports.resumeObserver = resumeObserver;
+ exports.scan = scan;
+ exports.stopObserving = stopObserving;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+ return exports;
+
+})({});
+
+// Export as ES module
+if (typeof exports === 'object') {
+ try {
+ exports.__esModule = true;
+ exports.default = Iconify;
+ for (var key in Iconify) {
+ exports[key] = Iconify[key];
+ }
+ } catch (err) {
+ }
+}
+
+
+// Export to window or web worker
+try {
+ if (self.Iconify === void 0) {
+ self.Iconify = Iconify;
+ }
+} catch (err) {
+}
diff --git a/node_modules/@iconify/iconify/dist/iconify.without-api.min.js b/node_modules/@iconify/iconify/dist/iconify.without-api.min.js
new file mode 100644
index 0000000..07a9e99
--- /dev/null
+++ b/node_modules/@iconify/iconify/dist/iconify.without-api.min.js
@@ -0,0 +1,12 @@
+/**
+* (c) Iconify
+*
+* For the full copyright and license information, please view the license.txt or license.gpl.txt
+* files at https://github.com/iconify/iconify
+*
+* Licensed under MIT.
+*
+* @license MIT
+* @version 3.1.1
+*/
+var Iconify=function(t){"use strict";const e=Object.freeze({left:0,top:0,width:16,height:16}),n=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),o=Object.freeze({...e,...n}),r=Object.freeze({...o,body:"",hidden:!1});function i(t,e){const o=function(t,e){const n={};!t.hFlip!=!e.hFlip&&(n.hFlip=!0),!t.vFlip!=!e.vFlip&&(n.vFlip=!0);const o=((t.rotate||0)+(e.rotate||0))%4;return o&&(n.rotate=o),n}(t,e);for(const i in r)i in n?i in t&&!(i in o)&&(o[i]=n[i]):i in e?o[i]=e[i]:i in t&&(o[i]=t[i]);return o}function c(t,e,n){const o=t.icons,r=t.aliases||Object.create(null);let c={};function s(t){c=i(o[t]||r[t],c)}return s(e),n.forEach(s),i(t,c)}function s(t,e){const n=[];if("object"!=typeof t||"object"!=typeof t.icons)return n;t.not_found instanceof Array&&t.not_found.forEach((t=>{e(t,null),n.push(t)}));const o=function(t,e){const n=t.icons,o=t.aliases||Object.create(null),r=Object.create(null);return(e||Object.keys(n).concat(Object.keys(o))).forEach((function t(e){if(n[e])return r[e]=[];if(!(e in r)){r[e]=null;const n=o[e]&&o[e].parent,i=n&&t(n);i&&(r[e]=[n].concat(i))}return r[e]})),r}(t);for(const r in o){const i=o[r];i&&(e(r,c(t,r,i)),n.push(r))}return n}const a=/^[a-z0-9]+(-[a-z0-9]+)*$/,u=(t,e,n,o="")=>{const r=t.split(":");if("@"===t.slice(0,1)){if(r.length<2||r.length>3)return null;o=r.shift().slice(1)}if(r.length>3||!r.length)return null;if(r.length>1){const t=r.pop(),n=r.pop(),i={provider:r.length>0?r[0]:o,prefix:n,name:t};return e&&!f(i)?null:i}const i=r[0],c=i.split("-");if(c.length>1){const t={provider:o,prefix:c.shift(),name:c.join("-")};return e&&!f(t)?null:t}if(n&&""===o){const t={provider:o,prefix:"",name:i};return e&&!f(t,n)?null:t}return null},f=(t,e)=>!!t&&!(""!==t.provider&&!t.provider.match(a)||!(e&&""===t.prefix||t.prefix.match(a))||!t.name.match(a)),l={provider:"",aliases:{},not_found:{},...e};function d(t,e){for(const n in e)if(n in t&&typeof t[n]!=typeof e[n])return!1;return!0}function p(t){if("object"!=typeof t||null===t)return null;const e=t;if("string"!=typeof e.prefix||!t.icons||"object"!=typeof t.icons)return null;if(!d(t,l))return null;const n=e.icons;for(const t in n){const e=n[t];if(!t.match(a)||"string"!=typeof e.body||!d(e,r))return null}const o=e.aliases||Object.create(null);for(const t in o){const e=o[t],i=e.parent;if(!t.match(a)||"string"!=typeof i||!n[i]&&!o[i]||!d(e,r))return null}return e}const h=Object.create(null);function g(t,e){const n=h[t]||(h[t]=Object.create(null));return n[e]||(n[e]=function(t,e){return{provider:t,prefix:e,icons:Object.create(null),missing:new Set}}(t,e))}function m(t,e){return p(e)?s(e,((e,n)=>{n?t.icons[e]=n:t.missing.add(e)})):[]}function y(t,e){let n=[];return("string"==typeof t?[t]:Object.keys(h)).forEach((t=>{("string"==typeof t&&"string"==typeof e?[e]:Object.keys(h[t]||{})).forEach((e=>{const o=g(t,e);n=n.concat(Object.keys(o.icons).map((n=>(""!==t?"@"+t+":":"")+e+":"+n)))}))})),n}let b=!1;function v(t){const e="string"==typeof t?u(t,!0,b):t;if(e){const t=g(e.provider,e.prefix),n=e.name;return t.icons[n]||(t.missing.has(n)?null:void 0)}}function x(t,e){const n=u(t,!0,b);if(!n)return!1;return function(t,e,n){try{if("string"==typeof n.body)return t.icons[e]={...n},!0}catch(t){}return!1}(g(n.provider,n.prefix),n.name,e)}function w(t,e){if("object"!=typeof t)return!1;if("string"!=typeof e&&(e=t.provider||""),b&&!e&&!t.prefix){let e=!1;return p(t)&&(t.prefix="",s(t,((t,n)=>{n&&x(t,n)&&(e=!0)}))),e}const n=t.prefix;if(!f({provider:e,prefix:n,name:"a"}))return!1;return!!m(g(e,n),t)}function S(t){return!!v(t)}function E(t){const e=v(t);return e?{...o,...e}:null}const j=Object.freeze({width:null,height:null}),O=Object.freeze({...j,...n}),k=/(-?[0-9.]*[0-9]+[0-9.]*)/g,I=/^-?[0-9.]*[0-9]+[0-9.]*$/g;function M(t,e,n){if(1===e)return t;if(n=n||100,"number"==typeof t)return Math.ceil(t*e*n)/n;if("string"!=typeof t)return t;const o=t.split(k);if(null===o||!o.length)return t;const r=[];let i=o.shift(),c=I.test(i);for(;;){if(c){const t=parseFloat(i);isNaN(t)?r.push(i):r.push(Math.ceil(t*e*n)/n)}else r.push(i);if(i=o.shift(),void 0===i)return r.join("");c=!c}}const C=t=>"unset"===t||"undefined"===t||"none"===t;function T(t,e){const n={...o,...t},r={...O,...e},i={left:n.left,top:n.top,width:n.width,height:n.height};let c=n.body;[n,r].forEach((t=>{const e=[],n=t.hFlip,o=t.vFlip;let r,s=t.rotate;switch(n?o?s+=2:(e.push("translate("+(i.width+i.left).toString()+" "+(0-i.top).toString()+")"),e.push("scale(-1 1)"),i.top=i.left=0):o&&(e.push("translate("+(0-i.left).toString()+" "+(i.height+i.top).toString()+")"),e.push("scale(1 -1)"),i.top=i.left=0),s<0&&(s-=4*Math.floor(s/4)),s%=4,s){case 1:r=i.height/2+i.top,e.unshift("rotate(90 "+r.toString()+" "+r.toString()+")");break;case 2:e.unshift("rotate(180 "+(i.width/2+i.left).toString()+" "+(i.height/2+i.top).toString()+")");break;case 3:r=i.width/2+i.left,e.unshift("rotate(-90 "+r.toString()+" "+r.toString()+")")}s%2==1&&(i.left!==i.top&&(r=i.left,i.left=i.top,i.top=r),i.width!==i.height&&(r=i.width,i.width=i.height,i.height=r)),e.length&&(c=''+c+" ")}));const s=r.width,a=r.height,u=i.width,f=i.height;let l,d;null===s?(d=null===a?"1em":"auto"===a?f:a,l=M(d,u/f)):(l="auto"===s?u:s,d=null===a?M(l,f/u):"auto"===a?f:a);const p={},h=(t,e)=>{C(e)||(p[t]=e.toString())};return h("width",l),h("height",d),p.viewBox=i.left.toString()+" "+i.top.toString()+" "+u.toString()+" "+f.toString(),{attributes:p,body:c}}const F=/\sid="(\S+)"/g,L="IconifyId"+Date.now().toString(16)+(16777216*Math.random()|0).toString(16);let A=0;function N(t,e=L){const n=[];let o;for(;o=F.exec(t);)n.push(o[1]);if(!n.length)return t;const r="suffix"+(16777216*Math.random()|Date.now()).toString(16);return n.forEach((n=>{const o="function"==typeof e?e(n):e+(A++).toString(),i=n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");t=t.replace(new RegExp('([#;"])('+i+')([")]|\\.[a-z])',"g"),"$1"+o+r+"$3")})),t=t.replace(new RegExp(r,"g"),"")}function z(t,e){const n={...t};for(const t in e){const o=e[t],r=typeof o;t in j?(null===o||o&&("string"===r||"number"===r))&&(n[t]=o):r===typeof n[t]&&(n[t]="rotate"===t?o%4:o)}return n}const D={...O,inline:!1},P="iconify",_="iconify-inline",$="iconifyData"+Date.now();let q=[];function H(t){for(let e=0;e{delete e.pendingScan,G&&G(t)})))}function J(t,e){if(!t.observer)return;const n=t.observer;if(!n.pendingScan)for(let o=0;o0||"attributes"===r.type&&void 0!==r.target[$])return void(n.paused||U(t))}}function B(t,e){t.observer.instance.observe(e,Q)}function K(t){let e=t.observer;if(e&&e.instance)return;const n="function"==typeof t.node?t.node():t.node;n&&window&&(e||(e={paused:0},t.observer=e),e.instance=new window.MutationObserver(J.bind(null,t)),B(t,n),e.paused||U(t))}function W(){R().forEach(K)}function X(t){if(!t.observer)return;const e=t.observer;e.pendingScan&&(clearTimeout(e.pendingScan),delete e.pendingScan),e.instance&&(e.instance.disconnect(),delete e.instance)}function Y(t){const e=null!==G;G!==t&&(G=t,e&&R().forEach(X)),e?W():function(t){const e=document;e.readyState&&"loading"!==e.readyState?t():e.addEventListener("DOMContentLoaded",t)}(W)}function Z(t){(t?[t]:R()).forEach((t=>{if(!t.observer)return void(t.observer={paused:1});const e=t.observer;if(e.paused++,e.paused>1||!e.instance)return;e.instance.disconnect()}))}function tt(t){if(t){const e=H(t);e&&Z(e)}else Z()}function et(t){(t?[t]:R()).forEach((t=>{if(!t.observer)return void K(t);const e=t.observer;if(e.paused&&(e.paused--,!e.paused)){const n="function"==typeof t.node?t.node():t.node;if(!n)return;e.instance?B(t,n):K(t)}}))}function nt(t){if(t){const e=H(t);e&&et(e)}else et()}function ot(t,e=!1){const n=V(t,e);return K(n),n}function rt(t){const e=H(t);e&&(X(e),function(t){q=q.filter((e=>t!==e&&t!==("function"==typeof e.node?e.node():e.node)))}(t))}function it(t,e){t.forEach((t=>{const n=t.loaderCallbacks;n&&(t.loaderCallbacks=n.filter((t=>t.id!==e)))}))}let ct=0;const st=Object.create(null);function at(t){return st[t]||st[""]}var ut={resources:[],index:0,timeout:2e3,rotate:750,random:!1,dataAfterTimeout:!1};function ft(t,e,n,o){const r=t.resources.length,i=t.random?Math.floor(Math.random()*r):t.index;let c;if(t.random){let e=t.resources.slice(0);for(c=[];e.length>1;){const t=Math.floor(Math.random()*e.length);c.push(e[t]),e=e.slice(0,t).concat(e.slice(t+1))}c=c.concat(e)}else c=t.resources.slice(i).concat(t.resources.slice(0,i));const s=Date.now();let a,u="pending",f=0,l=null,d=[],p=[];function h(){l&&(clearTimeout(l),l=null)}function g(){"pending"===u&&(u="aborted"),h(),d.forEach((t=>{"pending"===t.status&&(t.status="aborted")})),d=[]}function m(t,e){e&&(p=[]),"function"==typeof t&&p.push(t)}function y(){u="failed",p.forEach((t=>{t(void 0,a)}))}function b(){d.forEach((t=>{"pending"===t.status&&(t.status="aborted")})),d=[]}function v(){if("pending"!==u)return;h();const o=c.shift();if(void 0===o)return d.length?void(l=setTimeout((()=>{h(),"pending"===u&&(b(),y())}),t.timeout)):void y();const r={status:"pending",resource:o,callback:(e,n)=>{!function(e,n,o){const r="success"!==n;switch(d=d.filter((t=>t!==e)),u){case"pending":break;case"failed":if(r||!t.dataAfterTimeout)return;break;default:return}if("abort"===n)return a=o,void y();if(r)return a=o,void(d.length||(c.length?v():y()));if(h(),b(),!t.random){const n=t.resources.indexOf(e.resource);-1!==n&&n!==t.index&&(t.index=n)}u="completed",p.forEach((t=>{t(o)}))}(r,e,n)}};d.push(r),f++,l=setTimeout(v,t.rotate),n(o,e,r.callback)}return"function"==typeof o&&p.push(o),setTimeout(v),function(){return{startTime:s,payload:e,status:u,queriesSent:f,queriesPending:d.length,subscribe:m,abort:g}}}function lt(t){const e={...ut,...t};let n=[];function o(){n=n.filter((t=>"pending"===t().status))}const r={query:function(t,r,i){const c=ft(e,t,r,((t,e)=>{o(),i&&i(t,e)}));return n.push(c),c},find:function(t){return n.find((e=>t(e)))||null},setIndex:t=>{e.index=t},getIndex:()=>e.index,cleanup:o};return r}function dt(t){let e;if("string"==typeof t.resources)e=[t.resources];else if(e=t.resources,!(e instanceof Array&&e.length))return null;return{resources:e,path:t.path||"/",maxURL:t.maxURL||500,rotate:t.rotate||750,timeout:t.timeout||5e3,random:!0===t.random,index:t.index||0,dataAfterTimeout:!1!==t.dataAfterTimeout}}const pt=Object.create(null),ht=["https://api.simplesvg.com","https://api.unisvg.com"],gt=[];for(;ht.length>0;)1===ht.length||Math.random()>.5?gt.push(ht.shift()):gt.push(ht.pop());function mt(){}pt[""]=dt({resources:["https://api.iconify.design"].concat(gt)});const yt=Object.create(null);function bt(t){if(!yt[t]){const e=function(t){return pt[t]}(t);if(!e)return;const n={config:e,redundancy:lt(e)};yt[t]=n}return yt[t]}const vt="iconify2",xt="iconify",wt=xt+"-count",St=xt+"-version",Et=36e5,jt=168;function Ot(t,e){try{return t.getItem(e)}catch(t){}}function kt(t,e,n){try{return t.setItem(e,n),!0}catch(t){}}function It(t,e){try{t.removeItem(e)}catch(t){}}function Mt(t,e){return kt(t,wt,e.toString())}function Ct(t){return parseInt(Ot(t,wt))||0}const Tt={local:!0,session:!0},Ft={local:new Set,session:new Set};let Lt=!1;let At="undefined"==typeof window?{}:window;function Nt(t){const e=t+"Storage";try{if(At&&At[e]&&"number"==typeof At[e].length)return At[e]}catch(t){}Tt[t]=!1}function zt(t,e){const n=Nt(t);if(!n)return;const o=Ot(n,St);if(o!==vt){if(o){const t=Ct(n);for(let e=0;e{const o=xt+t.toString(),i=Ot(n,o);if("string"==typeof i){try{const n=JSON.parse(i);if("object"==typeof n&&"number"==typeof n.cached&&n.cached>r&&"string"==typeof n.provider&&"object"==typeof n.data&&"string"==typeof n.data.prefix&&e(n,t))return!0}catch(t){}It(n,o)}};let c=Ct(n);for(let e=c-1;e>=0;e--)i(e)||(e===c-1?(c--,Mt(n,c)):Ft[t].add(e))}function Dt(){if(!Lt){Lt=!0;for(const t in Tt)zt(t,(t=>{const e=t.data,n=g(t.provider,e.prefix);if(!m(n,e).length)return!1;const o=e.lastModified||-1;return n.lastModifiedCached=n.lastModifiedCached?Math.min(n.lastModifiedCached,o):o,!0}))}}function Pt(t,e){function n(n){let o;if(!Tt[n]||!(o=Nt(n)))return;const r=Ft[n];let i;if(r.size)r.delete(i=Array.from(r).shift());else if(i=Ct(o),!Mt(o,i+1))return;const c={cached:Math.floor(Date.now()/Et),provider:t.provider,data:e};return kt(o,xt+i.toString(),JSON.stringify(c))}Lt||Dt(),e.lastModified&&!function(t,e){const n=t.lastModifiedCached;if(n&&n>=e)return n===e;if(t.lastModifiedCached=e,n)for(const n in Tt)zt(n,(n=>{const o=n.data;return n.provider!==t.provider||o.prefix!==t.prefix||o.lastModified===e}));return!0}(t,e.lastModified)||Object.keys(e.icons).length&&(e.not_found&&delete(e=Object.assign({},e)).not_found,n("local")||n("session"))}function _t(){}function $t(t){t.iconsLoaderFlag||(t.iconsLoaderFlag=!0,setTimeout((()=>{t.iconsLoaderFlag=!1,function(t){t.pendingCallbacksFlag||(t.pendingCallbacksFlag=!0,setTimeout((()=>{t.pendingCallbacksFlag=!1;const e=t.loaderCallbacks?t.loaderCallbacks.slice(0):[];if(!e.length)return;let n=!1;const o=t.provider,r=t.prefix;e.forEach((e=>{const i=e.icons,c=i.pending.length;i.pending=i.pending.filter((e=>{if(e.prefix!==r)return!0;const c=e.name;if(t.icons[c])i.loaded.push({provider:o,prefix:r,name:c});else{if(!t.missing.has(c))return n=!0,!0;i.missing.push({provider:o,prefix:r,name:c})}return!1})),i.pending.length!==c&&(n||it([t],e.id),e.callback(i.loaded.slice(0),i.missing.slice(0),i.pending.slice(0),e.abort))}))})))}(t)})))}function qt(t,e){t.iconsToLoad?t.iconsToLoad=t.iconsToLoad.concat(e).sort():t.iconsToLoad=e,t.iconsQueueFlag||(t.iconsQueueFlag=!0,setTimeout((()=>{t.iconsQueueFlag=!1;const{provider:e,prefix:n}=t,o=t.iconsToLoad;let r;if(delete t.iconsToLoad,!o||!(r=at(e)))return;r.prepare(e,n,o).forEach((n=>{!function(t,e,n){let o,r;if("string"==typeof t){const e=at(t);if(!e)return n(void 0,424),mt;r=e.send;const i=bt(t);i&&(o=i.redundancy)}else{const e=dt(t);if(e){o=lt(e);const n=at(t.resources?t.resources[0]:"");n&&(r=n.send)}}o&&r?o.query(e,r,n)().abort:n(void 0,424)}(e,n,(e=>{if("object"!=typeof e)n.icons.forEach((e=>{t.missing.add(e)}));else try{const n=m(t,e);if(!n.length)return;const o=t.pendingIcons;o&&n.forEach((t=>{o.delete(t)})),Pt(t,e)}catch(t){console.error(t)}$t(t)}))}))})))}const Ht=t=>{const e=g(t.provider,t.prefix).pendingIcons;return!(!e||!e.has(t.name))},Vt=(t,e)=>{var n;const o=function(t){const e={loaded:[],missing:[],pending:[]},n=Object.create(null);t.sort(((t,e)=>t.provider!==e.provider?t.provider.localeCompare(e.provider):t.prefix!==e.prefix?t.prefix.localeCompare(e.prefix):t.name.localeCompare(e.name)));let o={provider:"",prefix:"",name:""};return t.forEach((t=>{if(o.name===t.name&&o.prefix===t.prefix&&o.provider===t.provider)return;o=t;const r=t.provider,i=t.prefix,c=t.name,s=n[r]||(n[r]=Object.create(null)),a=s[i]||(s[i]=g(r,i));let u;u=c in a.icons?e.loaded:""===i||a.missing.has(c)?e.missing:e.pending;const f={provider:r,prefix:i,name:c};u.push(f)})),e}(function(t,e=!0,n=!1){const o=[];return t.forEach((t=>{const r="string"==typeof t?u(t,e,n):t;r&&o.push(r)})),o}(t,!0,("boolean"==typeof n&&(b=n),b)));if(!o.pending.length){let t=!0;return e&&setTimeout((()=>{t&&e(o.loaded,o.missing,o.pending,_t)})),()=>{t=!1}}const r=Object.create(null),i=[];let c,s;return o.pending.forEach((t=>{const{provider:e,prefix:n}=t;if(n===s&&e===c)return;c=e,s=n,i.push(g(e,n));const o=r[e]||(r[e]=Object.create(null));o[n]||(o[n]=[])})),o.pending.forEach((t=>{const{provider:e,prefix:n,name:o}=t,i=g(e,n),c=i.pendingIcons||(i.pendingIcons=new Set);c.has(o)||(c.add(o),r[e][n].push(o))})),i.forEach((t=>{const{provider:e,prefix:n}=t;r[e][n].length&&qt(t,r[e][n])})),e?function(t,e,n){const o=ct++,r=it.bind(null,n,o);if(!e.pending.length)return r;const i={id:o,icons:e,callback:t,abort:r};return n.forEach((t=>{(t.loaderCallbacks||(t.loaderCallbacks=[])).push(i)})),r}(e,o,i):_t};const Rt=/[\s,]+/;const Gt=["width","height"],Qt=["inline","hFlip","vFlip"];function Ut(t){const e=t.getAttribute("data-icon"),n="string"==typeof e&&u(e,!0);if(!n)return null;const o={...D,inline:t.classList&&t.classList.contains(_)};Gt.forEach((e=>{const n=t.getAttribute("data-"+e);n&&(o[e]=n)}));const r=t.getAttribute("data-rotate");"string"==typeof r&&(o.rotate=function(t,e=0){const n=t.replace(/^-?[0-9.]*/,"");function o(t){for(;t<0;)t+=4;return t%4}if(""===n){const e=parseInt(t);return isNaN(e)?0:o(e)}if(n!==t){let e=0;switch(n){case"%":e=25;break;case"deg":e=90}if(e){let r=parseFloat(t.slice(0,t.length-n.length));return isNaN(r)?0:(r/=e,r%1==0?o(r):0)}}return e}(r));const i=t.getAttribute("data-flip");"string"==typeof i&&function(t,e){e.split(Rt).forEach((e=>{switch(e.trim()){case"horizontal":t.hFlip=!0;break;case"vertical":t.vFlip=!0}}))}(o,i),Qt.forEach((e=>{const n="data-"+e,r=function(t,e){return t===e||"true"===t||""!==t&&"false"!==t&&null}(t.getAttribute(n),n);"boolean"==typeof r&&(o[e]=r)}));const c=t.getAttribute("data-mode");return{name:e,icon:n,customisations:o,mode:c}}const Jt="svg."+P+", i."+P+", span."+P+", i."+_+", span."+_;function Bt(t,e){let n=-1===t.indexOf("xlink:")?"":' xmlns:xlink="http://www.w3.org/1999/xlink"';for(const t in e)n+=" "+t+'="'+e[t]+'"';return'"+t+" "}let Kt;function Wt(t){return void 0===Kt&&function(){try{Kt=window.trustedTypes.createPolicy("iconify",{createHTML:t=>t})}catch(t){Kt=null}}(),Kt?Kt.createHTML(t):t}function Xt(t){const e=new Set(["iconify"]);return["provider","prefix"].forEach((n=>{t[n]&&e.add("iconify--"+t[n])})),e}function Yt(t,e,n,o){const r=t.classList;if(o){const t=o.classList;Array.from(t).forEach((t=>{r.add(t)}))}const i=[];return e.forEach((t=>{r.contains(t)?n.has(t)&&i.push(t):(r.add(t),i.push(t))})),n.forEach((t=>{e.has(t)||r.remove(t)})),i}function Zt(t,e,n){const o=t.style;(n||[]).forEach((t=>{o.removeProperty(t)}));const r=[];for(const t in e)o.getPropertyValue(t)||(r.push(t),o.setProperty(t,e[t]));return r}function te(t,e,n){let o;try{o=document.createElement("span")}catch(e){return t}const r=e.customisations,i=T(n,r),c=t[$],s=Bt(N(i.body),{"aria-hidden":"true",role:"img",...i.attributes});o.innerHTML=Wt(s);const a=o.childNodes[0],u=t.attributes;for(let t=0;t{se&&(se=!1,ue())})))}function ue(t,e=!1){const n=Object.create(null);function r(t,e){const{provider:o,prefix:r,name:i}=t,c=g(o,r),s=c.icons[i];if(s)return{status:"loaded",icon:s};if(c.missing.has(i))return{status:"missing"};if(e&&!Ht(t)){const t=n[o]||(n[o]=Object.create(null));(t[r]||(t[r]=new Set)).add(i)}return{status:"loading"}}(t?[t]:R()).forEach((t=>{const n="function"==typeof t.node?t.node():t.node;if(!n||!n.querySelectorAll)return;let i=!1,c=!1;function s(e,n,r){if(c||(c=!0,Z(t)),"SVG"!==e.tagName.toUpperCase()){const t=n.mode,i="mask"===t||"bg"!==t&&("style"===t?-1!==r.body.indexOf("currentColor"):null);if("boolean"==typeof i)return void function(t,e,n,o){const r=e.customisations,i=T(n,r),c=i.attributes,s=t[$],a=Bt(i.body,{...c,width:n.width+"",height:n.height+""}),u=Yt(t,Xt(e.icon),new Set(s&&s.addedClasses)),f={"--svg":'url("'+(l=a,"data:image/svg+xml,"+function(t){return t.replace(/"/g,"'").replace(/%/g,"%25").replace(/#/g,"%23").replace(//g,"%3E").replace(/\s+/g," ")}(l)+'")'),width:ce(c.width),height:ce(c.height),...ee,...o?ne:oe};var l;r.inline&&(f["vertical-align"]="-0.125em");const d=Zt(t,f,s&&s.addedStyles),p={...e,status:"loaded",addedClasses:u,addedStyles:d};t[$]=p}(e,n,{...o,...r},i)}te(e,n,r)}(function(t){const e=[];return t.querySelectorAll(Jt).forEach((t=>{const n=t[$]||"svg"!==t.tagName.toLowerCase()?Ut(t):null;n&&e.push({node:t,props:n})})),e})(n).forEach((({node:t,props:e})=>{const n=t[$];if(!n){const{status:n,icon:o}=r(e.icon,!0);return o?void s(t,e,o):(i=i||"loading"===n,void(t[$]={...e,status:n}))}let o;if(function(t,e){if(t.name!==e.name||t.mode!==e.mode)return!0;const n=t.customisations,o=e.customisations;for(const t in D)if(n[t]!==o[t])return!0;return!1}(n,e)){if(o=r(e.icon,n.name!==e.name),!o.icon)return i=i||"loading"===o.status,void Object.assign(n,{...e,status:o.status})}else{if("loading"!==n.status)return;if(o=r(e.icon,!1),!o.icon)return void(n.status=o.status)}s(t,e,o.icon)})),t.temporary&&!i?rt(n):e&&i?ot(n,!0):c&&t.observer&&et(t)}));for(const t in n){const e=n[t];for(const n in e){const o=e[n];Vt(Array.from(o).map((e=>({provider:t,prefix:n,name:e}))),ae)}}}function fe(t,e,n=!1){const o=v(t);if(!o)return null;const r=u(t),i=z(D,e||{}),c=te(document.createElement("span"),{name:t,icon:r,customisations:i},o);return n?c.outerHTML:c}function le(){return"3.1.1"}function de(t,e){return fe(t,e,!1)}function pe(t,e){return fe(t,e,!0)}function he(t,e){const n=v(t);if(!n)return null;return T(n,z(D,e||{}))}function ge(t){t?function(t){const e=H(t);e?ue(e):ue({node:t,temporary:!0},!0)}(t):ue()}if("undefined"!=typeof document&&"undefined"!=typeof window){!function(){if(document.documentElement)return V(document.documentElement);q.push({node:()=>document.documentElement})}();const t=window;if(void 0!==t.IconifyPreload){const e=t.IconifyPreload,n="Invalid IconifyPreload syntax.";"object"==typeof e&&null!==e&&(e instanceof Array?e:[e]).forEach((t=>{try{("object"!=typeof t||null===t||t instanceof Array||"object"!=typeof t.icons||"string"!=typeof t.prefix||!w(t))&&console.error(n)}catch(t){console.error(n)}}))}setTimeout((()=>{Y(ue),ue()}))}const me={iconExists:S,getIcon:E,listIcons:y,addIcon:x,addCollection:w,replaceIDs:N,calculateSize:M,buildIcon:T,getVersion:le,renderSVG:de,renderHTML:pe,renderIcon:he,scan:ge,observe:ot,stopObserving:rt,pauseObserver:tt,resumeObserver:nt};return t.addCollection=w,t.addIcon=x,t.buildIcon=T,t.calculateSize=M,t.default=me,t.getIcon=E,t.getVersion=le,t.iconExists=S,t.listIcons=y,t.observe=ot,t.pauseObserver=tt,t.renderHTML=pe,t.renderIcon=he,t.renderSVG=de,t.replaceIDs=N,t.resumeObserver=nt,t.scan=ge,t.stopObserving=rt,Object.defineProperty(t,"__esModule",{value:!0}),t}({});if("object"==typeof exports)try{for(var key in exports.__esModule=!0,exports.default=Iconify,Iconify)exports[key]=Iconify[key]}catch(t){}try{void 0===self.Iconify&&(self.Iconify=Iconify)}catch(t){}
diff --git a/node_modules/@iconify/iconify/dist/iconify.without-api.mjs b/node_modules/@iconify/iconify/dist/iconify.without-api.mjs
new file mode 100644
index 0000000..e97b6ef
--- /dev/null
+++ b/node_modules/@iconify/iconify/dist/iconify.without-api.mjs
@@ -0,0 +1,2370 @@
+/**
+* (c) Iconify
+*
+* For the full copyright and license information, please view the license.txt or license.gpl.txt
+* files at https://github.com/iconify/iconify
+*
+* Licensed under MIT.
+*
+* @license MIT
+* @version 3.1.1
+*/
+const defaultIconDimensions = Object.freeze(
+ {
+ left: 0,
+ top: 0,
+ width: 16,
+ height: 16
+ }
+);
+const defaultIconTransformations = Object.freeze({
+ rotate: 0,
+ vFlip: false,
+ hFlip: false
+});
+const defaultIconProps = Object.freeze({
+ ...defaultIconDimensions,
+ ...defaultIconTransformations
+});
+const defaultExtendedIconProps = Object.freeze({
+ ...defaultIconProps,
+ body: "",
+ hidden: false
+});
+
+function mergeIconTransformations(obj1, obj2) {
+ const result = {};
+ if (!obj1.hFlip !== !obj2.hFlip) {
+ result.hFlip = true;
+ }
+ if (!obj1.vFlip !== !obj2.vFlip) {
+ result.vFlip = true;
+ }
+ const rotate = ((obj1.rotate || 0) + (obj2.rotate || 0)) % 4;
+ if (rotate) {
+ result.rotate = rotate;
+ }
+ return result;
+}
+
+function mergeIconData(parent, child) {
+ const result = mergeIconTransformations(parent, child);
+ for (const key in defaultExtendedIconProps) {
+ if (key in defaultIconTransformations) {
+ if (key in parent && !(key in result)) {
+ result[key] = defaultIconTransformations[key];
+ }
+ } else if (key in child) {
+ result[key] = child[key];
+ } else if (key in parent) {
+ result[key] = parent[key];
+ }
+ }
+ return result;
+}
+
+function getIconsTree(data, names) {
+ const icons = data.icons;
+ const aliases = data.aliases || /* @__PURE__ */ Object.create(null);
+ const resolved = /* @__PURE__ */ Object.create(null);
+ function resolve(name) {
+ if (icons[name]) {
+ return resolved[name] = [];
+ }
+ if (!(name in resolved)) {
+ resolved[name] = null;
+ const parent = aliases[name] && aliases[name].parent;
+ const value = parent && resolve(parent);
+ if (value) {
+ resolved[name] = [parent].concat(value);
+ }
+ }
+ return resolved[name];
+ }
+ (names || Object.keys(icons).concat(Object.keys(aliases))).forEach(resolve);
+ return resolved;
+}
+
+function internalGetIconData(data, name, tree) {
+ const icons = data.icons;
+ const aliases = data.aliases || /* @__PURE__ */ Object.create(null);
+ let currentProps = {};
+ function parse(name2) {
+ currentProps = mergeIconData(
+ icons[name2] || aliases[name2],
+ currentProps
+ );
+ }
+ parse(name);
+ tree.forEach(parse);
+ return mergeIconData(data, currentProps);
+}
+
+function parseIconSet(data, callback) {
+ const names = [];
+ if (typeof data !== "object" || typeof data.icons !== "object") {
+ return names;
+ }
+ if (data.not_found instanceof Array) {
+ data.not_found.forEach((name) => {
+ callback(name, null);
+ names.push(name);
+ });
+ }
+ const tree = getIconsTree(data);
+ for (const name in tree) {
+ const item = tree[name];
+ if (item) {
+ callback(name, internalGetIconData(data, name, item));
+ names.push(name);
+ }
+ }
+ return names;
+}
+
+const matchIconName = /^[a-z0-9]+(-[a-z0-9]+)*$/;
+const stringToIcon = (value, validate, allowSimpleName, provider = "") => {
+ const colonSeparated = value.split(":");
+ if (value.slice(0, 1) === "@") {
+ if (colonSeparated.length < 2 || colonSeparated.length > 3) {
+ return null;
+ }
+ provider = colonSeparated.shift().slice(1);
+ }
+ if (colonSeparated.length > 3 || !colonSeparated.length) {
+ return null;
+ }
+ if (colonSeparated.length > 1) {
+ const name2 = colonSeparated.pop();
+ const prefix = colonSeparated.pop();
+ const result = {
+ // Allow provider without '@': "provider:prefix:name"
+ provider: colonSeparated.length > 0 ? colonSeparated[0] : provider,
+ prefix,
+ name: name2
+ };
+ return validate && !validateIconName(result) ? null : result;
+ }
+ const name = colonSeparated[0];
+ const dashSeparated = name.split("-");
+ if (dashSeparated.length > 1) {
+ const result = {
+ provider,
+ prefix: dashSeparated.shift(),
+ name: dashSeparated.join("-")
+ };
+ return validate && !validateIconName(result) ? null : result;
+ }
+ if (allowSimpleName && provider === "") {
+ const result = {
+ provider,
+ prefix: "",
+ name
+ };
+ return validate && !validateIconName(result, allowSimpleName) ? null : result;
+ }
+ return null;
+};
+const validateIconName = (icon, allowSimpleName) => {
+ if (!icon) {
+ return false;
+ }
+ return !!((icon.provider === "" || icon.provider.match(matchIconName)) && (allowSimpleName && icon.prefix === "" || icon.prefix.match(matchIconName)) && icon.name.match(matchIconName));
+};
+
+const optionalPropertyDefaults = {
+ provider: "",
+ aliases: {},
+ not_found: {},
+ ...defaultIconDimensions
+};
+function checkOptionalProps(item, defaults) {
+ for (const prop in defaults) {
+ if (prop in item && typeof item[prop] !== typeof defaults[prop]) {
+ return false;
+ }
+ }
+ return true;
+}
+function quicklyValidateIconSet(obj) {
+ if (typeof obj !== "object" || obj === null) {
+ return null;
+ }
+ const data = obj;
+ if (typeof data.prefix !== "string" || !obj.icons || typeof obj.icons !== "object") {
+ return null;
+ }
+ if (!checkOptionalProps(obj, optionalPropertyDefaults)) {
+ return null;
+ }
+ const icons = data.icons;
+ for (const name in icons) {
+ const icon = icons[name];
+ if (!name.match(matchIconName) || typeof icon.body !== "string" || !checkOptionalProps(
+ icon,
+ defaultExtendedIconProps
+ )) {
+ return null;
+ }
+ }
+ const aliases = data.aliases || /* @__PURE__ */ Object.create(null);
+ for (const name in aliases) {
+ const icon = aliases[name];
+ const parent = icon.parent;
+ if (!name.match(matchIconName) || typeof parent !== "string" || !icons[parent] && !aliases[parent] || !checkOptionalProps(
+ icon,
+ defaultExtendedIconProps
+ )) {
+ return null;
+ }
+ }
+ return data;
+}
+
+const dataStorage = /* @__PURE__ */ Object.create(null);
+function newStorage(provider, prefix) {
+ return {
+ provider,
+ prefix,
+ icons: /* @__PURE__ */ Object.create(null),
+ missing: /* @__PURE__ */ new Set()
+ };
+}
+function getStorage(provider, prefix) {
+ const providerStorage = dataStorage[provider] || (dataStorage[provider] = /* @__PURE__ */ Object.create(null));
+ return providerStorage[prefix] || (providerStorage[prefix] = newStorage(provider, prefix));
+}
+function addIconSet(storage, data) {
+ if (!quicklyValidateIconSet(data)) {
+ return [];
+ }
+ return parseIconSet(data, (name, icon) => {
+ if (icon) {
+ storage.icons[name] = icon;
+ } else {
+ storage.missing.add(name);
+ }
+ });
+}
+function addIconToStorage(storage, name, icon) {
+ try {
+ if (typeof icon.body === "string") {
+ storage.icons[name] = { ...icon };
+ return true;
+ }
+ } catch (err) {
+ }
+ return false;
+}
+function listIcons(provider, prefix) {
+ let allIcons = [];
+ const providers = typeof provider === "string" ? [provider] : Object.keys(dataStorage);
+ providers.forEach((provider2) => {
+ const prefixes = typeof provider2 === "string" && typeof prefix === "string" ? [prefix] : Object.keys(dataStorage[provider2] || {});
+ prefixes.forEach((prefix2) => {
+ const storage = getStorage(provider2, prefix2);
+ allIcons = allIcons.concat(
+ Object.keys(storage.icons).map(
+ (name) => (provider2 !== "" ? "@" + provider2 + ":" : "") + prefix2 + ":" + name
+ )
+ );
+ });
+ });
+ return allIcons;
+}
+
+let simpleNames = false;
+function allowSimpleNames(allow) {
+ if (typeof allow === "boolean") {
+ simpleNames = allow;
+ }
+ return simpleNames;
+}
+function getIconData(name) {
+ const icon = typeof name === "string" ? stringToIcon(name, true, simpleNames) : name;
+ if (icon) {
+ const storage = getStorage(icon.provider, icon.prefix);
+ const iconName = icon.name;
+ return storage.icons[iconName] || (storage.missing.has(iconName) ? null : void 0);
+ }
+}
+function addIcon(name, data) {
+ const icon = stringToIcon(name, true, simpleNames);
+ if (!icon) {
+ return false;
+ }
+ const storage = getStorage(icon.provider, icon.prefix);
+ return addIconToStorage(storage, icon.name, data);
+}
+function addCollection(data, provider) {
+ if (typeof data !== "object") {
+ return false;
+ }
+ if (typeof provider !== "string") {
+ provider = data.provider || "";
+ }
+ if (simpleNames && !provider && !data.prefix) {
+ let added = false;
+ if (quicklyValidateIconSet(data)) {
+ data.prefix = "";
+ parseIconSet(data, (name, icon) => {
+ if (icon && addIcon(name, icon)) {
+ added = true;
+ }
+ });
+ }
+ return added;
+ }
+ const prefix = data.prefix;
+ if (!validateIconName({
+ provider,
+ prefix,
+ name: "a"
+ })) {
+ return false;
+ }
+ const storage = getStorage(provider, prefix);
+ return !!addIconSet(storage, data);
+}
+function iconExists(name) {
+ return !!getIconData(name);
+}
+function getIcon(name) {
+ const result = getIconData(name);
+ return result ? {
+ ...defaultIconProps,
+ ...result
+ } : null;
+}
+
+const defaultIconSizeCustomisations = Object.freeze({
+ width: null,
+ height: null
+});
+const defaultIconCustomisations = Object.freeze({
+ // Dimensions
+ ...defaultIconSizeCustomisations,
+ // Transformations
+ ...defaultIconTransformations
+});
+
+const unitsSplit = /(-?[0-9.]*[0-9]+[0-9.]*)/g;
+const unitsTest = /^-?[0-9.]*[0-9]+[0-9.]*$/g;
+function calculateSize(size, ratio, precision) {
+ if (ratio === 1) {
+ return size;
+ }
+ precision = precision || 100;
+ if (typeof size === "number") {
+ return Math.ceil(size * ratio * precision) / precision;
+ }
+ if (typeof size !== "string") {
+ return size;
+ }
+ const oldParts = size.split(unitsSplit);
+ if (oldParts === null || !oldParts.length) {
+ return size;
+ }
+ const newParts = [];
+ let code = oldParts.shift();
+ let isNumber = unitsTest.test(code);
+ while (true) {
+ if (isNumber) {
+ const num = parseFloat(code);
+ if (isNaN(num)) {
+ newParts.push(code);
+ } else {
+ newParts.push(Math.ceil(num * ratio * precision) / precision);
+ }
+ } else {
+ newParts.push(code);
+ }
+ code = oldParts.shift();
+ if (code === void 0) {
+ return newParts.join("");
+ }
+ isNumber = !isNumber;
+ }
+}
+
+const isUnsetKeyword = (value) => value === "unset" || value === "undefined" || value === "none";
+function iconToSVG(icon, customisations) {
+ const fullIcon = {
+ ...defaultIconProps,
+ ...icon
+ };
+ const fullCustomisations = {
+ ...defaultIconCustomisations,
+ ...customisations
+ };
+ const box = {
+ left: fullIcon.left,
+ top: fullIcon.top,
+ width: fullIcon.width,
+ height: fullIcon.height
+ };
+ let body = fullIcon.body;
+ [fullIcon, fullCustomisations].forEach((props) => {
+ const transformations = [];
+ const hFlip = props.hFlip;
+ const vFlip = props.vFlip;
+ let rotation = props.rotate;
+ if (hFlip) {
+ if (vFlip) {
+ rotation += 2;
+ } else {
+ transformations.push(
+ "translate(" + (box.width + box.left).toString() + " " + (0 - box.top).toString() + ")"
+ );
+ transformations.push("scale(-1 1)");
+ box.top = box.left = 0;
+ }
+ } else if (vFlip) {
+ transformations.push(
+ "translate(" + (0 - box.left).toString() + " " + (box.height + box.top).toString() + ")"
+ );
+ transformations.push("scale(1 -1)");
+ box.top = box.left = 0;
+ }
+ let tempValue;
+ if (rotation < 0) {
+ rotation -= Math.floor(rotation / 4) * 4;
+ }
+ rotation = rotation % 4;
+ switch (rotation) {
+ case 1:
+ tempValue = box.height / 2 + box.top;
+ transformations.unshift(
+ "rotate(90 " + tempValue.toString() + " " + tempValue.toString() + ")"
+ );
+ break;
+ case 2:
+ transformations.unshift(
+ "rotate(180 " + (box.width / 2 + box.left).toString() + " " + (box.height / 2 + box.top).toString() + ")"
+ );
+ break;
+ case 3:
+ tempValue = box.width / 2 + box.left;
+ transformations.unshift(
+ "rotate(-90 " + tempValue.toString() + " " + tempValue.toString() + ")"
+ );
+ break;
+ }
+ if (rotation % 2 === 1) {
+ if (box.left !== box.top) {
+ tempValue = box.left;
+ box.left = box.top;
+ box.top = tempValue;
+ }
+ if (box.width !== box.height) {
+ tempValue = box.width;
+ box.width = box.height;
+ box.height = tempValue;
+ }
+ }
+ if (transformations.length) {
+ body = '' + body + " ";
+ }
+ });
+ const customisationsWidth = fullCustomisations.width;
+ const customisationsHeight = fullCustomisations.height;
+ const boxWidth = box.width;
+ const boxHeight = box.height;
+ let width;
+ let height;
+ if (customisationsWidth === null) {
+ height = customisationsHeight === null ? "1em" : customisationsHeight === "auto" ? boxHeight : customisationsHeight;
+ width = calculateSize(height, boxWidth / boxHeight);
+ } else {
+ width = customisationsWidth === "auto" ? boxWidth : customisationsWidth;
+ height = customisationsHeight === null ? calculateSize(width, boxHeight / boxWidth) : customisationsHeight === "auto" ? boxHeight : customisationsHeight;
+ }
+ const attributes = {};
+ const setAttr = (prop, value) => {
+ if (!isUnsetKeyword(value)) {
+ attributes[prop] = value.toString();
+ }
+ };
+ setAttr("width", width);
+ setAttr("height", height);
+ attributes.viewBox = box.left.toString() + " " + box.top.toString() + " " + boxWidth.toString() + " " + boxHeight.toString();
+ return {
+ attributes,
+ body
+ };
+}
+
+const regex = /\sid="(\S+)"/g;
+const randomPrefix = "IconifyId" + Date.now().toString(16) + (Math.random() * 16777216 | 0).toString(16);
+let counter = 0;
+function replaceIDs(body, prefix = randomPrefix) {
+ const ids = [];
+ let match;
+ while (match = regex.exec(body)) {
+ ids.push(match[1]);
+ }
+ if (!ids.length) {
+ return body;
+ }
+ const suffix = "suffix" + (Math.random() * 16777216 | Date.now()).toString(16);
+ ids.forEach((id) => {
+ const newID = typeof prefix === "function" ? prefix(id) : prefix + (counter++).toString();
+ const escapedID = id.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
+ body = body.replace(
+ // Allowed characters before id: [#;"]
+ // Allowed characters after id: [)"], .[a-z]
+ new RegExp('([#;"])(' + escapedID + ')([")]|\\.[a-z])', "g"),
+ "$1" + newID + suffix + "$3"
+ );
+ });
+ body = body.replace(new RegExp(suffix, "g"), "");
+ return body;
+}
+
+function mergeCustomisations(defaults, item) {
+ const result = {
+ ...defaults
+ };
+ for (const key in item) {
+ const value = item[key];
+ const valueType = typeof value;
+ if (key in defaultIconSizeCustomisations) {
+ if (value === null || value && (valueType === "string" || valueType === "number")) {
+ result[key] = value;
+ }
+ } else if (valueType === typeof result[key]) {
+ result[key] = key === "rotate" ? value % 4 : value;
+ }
+ }
+ return result;
+}
+
+const defaultExtendedIconCustomisations = {
+ ...defaultIconCustomisations,
+ inline: false,
+};
+/**
+ * Class names
+ */
+const blockClass = 'iconify';
+const inlineClass = 'iconify-inline';
+/**
+ * Names of properties to add to nodes
+ */
+const elementDataProperty = ('iconifyData' + Date.now());
+
+/**
+ * List of root nodes
+ */
+let nodes = [];
+/**
+ * Find node
+ */
+function findRootNode(node) {
+ for (let i = 0; i < nodes.length; i++) {
+ const item = nodes[i];
+ const root = typeof item.node === 'function' ? item.node() : item.node;
+ if (root === node) {
+ return item;
+ }
+ }
+}
+/**
+ * Add extra root node
+ */
+function addRootNode(root, autoRemove = false) {
+ let node = findRootNode(root);
+ if (node) {
+ // Node already exist: switch type if needed
+ if (node.temporary) {
+ node.temporary = autoRemove;
+ }
+ return node;
+ }
+ // Create item, add it to list
+ node = {
+ node: root,
+ temporary: autoRemove,
+ };
+ nodes.push(node);
+ return node;
+}
+/**
+ * Add document.body node
+ */
+function addBodyNode() {
+ if (document.documentElement) {
+ return addRootNode(document.documentElement);
+ }
+ nodes.push({
+ node: () => {
+ return document.documentElement;
+ },
+ });
+}
+/**
+ * Remove root node
+ */
+function removeRootNode(root) {
+ nodes = nodes.filter((node) => root !== node &&
+ root !== (typeof node.node === 'function' ? node.node() : node.node));
+}
+/**
+ * Get list of root nodes
+ */
+function listRootNodes() {
+ return nodes;
+}
+
+/**
+ * Execute function when DOM is ready
+ */
+function onReady(callback) {
+ const doc = document;
+ if (doc.readyState && doc.readyState !== 'loading') {
+ callback();
+ }
+ else {
+ doc.addEventListener('DOMContentLoaded', callback);
+ }
+}
+
+/**
+ * Callback
+ */
+let callback = null;
+/**
+ * Parameters for mutation observer
+ */
+const observerParams = {
+ childList: true,
+ subtree: true,
+ attributes: true,
+};
+/**
+ * Queue DOM scan
+ */
+function queueScan(node) {
+ if (!node.observer) {
+ return;
+ }
+ const observer = node.observer;
+ if (!observer.pendingScan) {
+ observer.pendingScan = setTimeout(() => {
+ delete observer.pendingScan;
+ if (callback) {
+ callback(node);
+ }
+ });
+ }
+}
+/**
+ * Check mutations for added nodes
+ */
+function checkMutations(node, mutations) {
+ if (!node.observer) {
+ return;
+ }
+ const observer = node.observer;
+ if (!observer.pendingScan) {
+ for (let i = 0; i < mutations.length; i++) {
+ const item = mutations[i];
+ if (
+ // Check for added nodes
+ (item.addedNodes && item.addedNodes.length > 0) ||
+ // Check for icon or placeholder with modified attributes
+ (item.type === 'attributes' &&
+ item.target[elementDataProperty] !==
+ void 0)) {
+ if (!observer.paused) {
+ queueScan(node);
+ }
+ return;
+ }
+ }
+ }
+}
+/**
+ * Start/resume observer
+ */
+function continueObserving(node, root) {
+ node.observer.instance.observe(root, observerParams);
+}
+/**
+ * Start mutation observer
+ */
+function startObserver(node) {
+ let observer = node.observer;
+ if (observer && observer.instance) {
+ // Already started
+ return;
+ }
+ const root = typeof node.node === 'function' ? node.node() : node.node;
+ if (!root || !window) {
+ // document.body is not available yet or window is missing
+ return;
+ }
+ if (!observer) {
+ observer = {
+ paused: 0,
+ };
+ node.observer = observer;
+ }
+ // Create new instance, observe
+ observer.instance = new window.MutationObserver(checkMutations.bind(null, node));
+ continueObserving(node, root);
+ // Scan immediately
+ if (!observer.paused) {
+ queueScan(node);
+ }
+}
+/**
+ * Start all observers
+ */
+function startObservers() {
+ listRootNodes().forEach(startObserver);
+}
+/**
+ * Stop observer
+ */
+function stopObserver(node) {
+ if (!node.observer) {
+ return;
+ }
+ const observer = node.observer;
+ // Stop scan
+ if (observer.pendingScan) {
+ clearTimeout(observer.pendingScan);
+ delete observer.pendingScan;
+ }
+ // Disconnect observer
+ if (observer.instance) {
+ observer.instance.disconnect();
+ delete observer.instance;
+ }
+}
+/**
+ * Start observer when DOM is ready
+ */
+function initObserver(cb) {
+ const isRestart = callback !== null;
+ if (callback !== cb) {
+ // Change callback and stop all pending observers
+ callback = cb;
+ if (isRestart) {
+ listRootNodes().forEach(stopObserver);
+ }
+ }
+ if (isRestart) {
+ // Restart instances
+ startObservers();
+ return;
+ }
+ // Start observers when document is ready
+ onReady(startObservers);
+}
+/**
+ * Pause observing node
+ */
+function pauseObservingNode(node) {
+ (node ? [node] : listRootNodes()).forEach((node) => {
+ if (!node.observer) {
+ node.observer = {
+ paused: 1,
+ };
+ return;
+ }
+ const observer = node.observer;
+ observer.paused++;
+ if (observer.paused > 1 || !observer.instance) {
+ return;
+ }
+ // Disconnect observer
+ const instance = observer.instance;
+ // checkMutations(node, instance.takeRecords());
+ instance.disconnect();
+ });
+}
+/**
+ * Pause observer
+ */
+function pauseObserver(root) {
+ if (root) {
+ const node = findRootNode(root);
+ if (node) {
+ pauseObservingNode(node);
+ }
+ }
+ else {
+ pauseObservingNode();
+ }
+}
+/**
+ * Resume observer
+ */
+function resumeObservingNode(observer) {
+ (observer ? [observer] : listRootNodes()).forEach((node) => {
+ if (!node.observer) {
+ // Start observer
+ startObserver(node);
+ return;
+ }
+ const observer = node.observer;
+ if (observer.paused) {
+ observer.paused--;
+ if (!observer.paused) {
+ // Start / resume
+ const root = typeof node.node === 'function' ? node.node() : node.node;
+ if (!root) {
+ return;
+ }
+ else if (observer.instance) {
+ continueObserving(node, root);
+ }
+ else {
+ startObserver(node);
+ }
+ }
+ }
+ });
+}
+/**
+ * Resume observer
+ */
+function resumeObserver(root) {
+ if (root) {
+ const node = findRootNode(root);
+ if (node) {
+ resumeObservingNode(node);
+ }
+ }
+ else {
+ resumeObservingNode();
+ }
+}
+/**
+ * Observe node
+ */
+function observe(root, autoRemove = false) {
+ const node = addRootNode(root, autoRemove);
+ startObserver(node);
+ return node;
+}
+/**
+ * Remove observed node
+ */
+function stopObserving(root) {
+ const node = findRootNode(root);
+ if (node) {
+ stopObserver(node);
+ removeRootNode(root);
+ }
+}
+
+function sortIcons(icons) {
+ const result = {
+ loaded: [],
+ missing: [],
+ pending: []
+ };
+ const storage = /* @__PURE__ */ Object.create(null);
+ icons.sort((a, b) => {
+ if (a.provider !== b.provider) {
+ return a.provider.localeCompare(b.provider);
+ }
+ if (a.prefix !== b.prefix) {
+ return a.prefix.localeCompare(b.prefix);
+ }
+ return a.name.localeCompare(b.name);
+ });
+ let lastIcon = {
+ provider: "",
+ prefix: "",
+ name: ""
+ };
+ icons.forEach((icon) => {
+ if (lastIcon.name === icon.name && lastIcon.prefix === icon.prefix && lastIcon.provider === icon.provider) {
+ return;
+ }
+ lastIcon = icon;
+ const provider = icon.provider;
+ const prefix = icon.prefix;
+ const name = icon.name;
+ const providerStorage = storage[provider] || (storage[provider] = /* @__PURE__ */ Object.create(null));
+ const localStorage = providerStorage[prefix] || (providerStorage[prefix] = getStorage(provider, prefix));
+ let list;
+ if (name in localStorage.icons) {
+ list = result.loaded;
+ } else if (prefix === "" || localStorage.missing.has(name)) {
+ list = result.missing;
+ } else {
+ list = result.pending;
+ }
+ const item = {
+ provider,
+ prefix,
+ name
+ };
+ list.push(item);
+ });
+ return result;
+}
+
+function removeCallback(storages, id) {
+ storages.forEach((storage) => {
+ const items = storage.loaderCallbacks;
+ if (items) {
+ storage.loaderCallbacks = items.filter((row) => row.id !== id);
+ }
+ });
+}
+function updateCallbacks(storage) {
+ if (!storage.pendingCallbacksFlag) {
+ storage.pendingCallbacksFlag = true;
+ setTimeout(() => {
+ storage.pendingCallbacksFlag = false;
+ const items = storage.loaderCallbacks ? storage.loaderCallbacks.slice(0) : [];
+ if (!items.length) {
+ return;
+ }
+ let hasPending = false;
+ const provider = storage.provider;
+ const prefix = storage.prefix;
+ items.forEach((item) => {
+ const icons = item.icons;
+ const oldLength = icons.pending.length;
+ icons.pending = icons.pending.filter((icon) => {
+ if (icon.prefix !== prefix) {
+ return true;
+ }
+ const name = icon.name;
+ if (storage.icons[name]) {
+ icons.loaded.push({
+ provider,
+ prefix,
+ name
+ });
+ } else if (storage.missing.has(name)) {
+ icons.missing.push({
+ provider,
+ prefix,
+ name
+ });
+ } else {
+ hasPending = true;
+ return true;
+ }
+ return false;
+ });
+ if (icons.pending.length !== oldLength) {
+ if (!hasPending) {
+ removeCallback([storage], item.id);
+ }
+ item.callback(
+ icons.loaded.slice(0),
+ icons.missing.slice(0),
+ icons.pending.slice(0),
+ item.abort
+ );
+ }
+ });
+ });
+ }
+}
+let idCounter = 0;
+function storeCallback(callback, icons, pendingSources) {
+ const id = idCounter++;
+ const abort = removeCallback.bind(null, pendingSources, id);
+ if (!icons.pending.length) {
+ return abort;
+ }
+ const item = {
+ id,
+ icons,
+ callback,
+ abort
+ };
+ pendingSources.forEach((storage) => {
+ (storage.loaderCallbacks || (storage.loaderCallbacks = [])).push(item);
+ });
+ return abort;
+}
+
+const storage = /* @__PURE__ */ Object.create(null);
+function getAPIModule(provider) {
+ return storage[provider] || storage[""];
+}
+
+function listToIcons(list, validate = true, simpleNames = false) {
+ const result = [];
+ list.forEach((item) => {
+ const icon = typeof item === "string" ? stringToIcon(item, validate, simpleNames) : item;
+ if (icon) {
+ result.push(icon);
+ }
+ });
+ return result;
+}
+
+// src/config.ts
+var defaultConfig = {
+ resources: [],
+ index: 0,
+ timeout: 2e3,
+ rotate: 750,
+ random: false,
+ dataAfterTimeout: false
+};
+
+// src/query.ts
+function sendQuery(config, payload, query, done) {
+ const resourcesCount = config.resources.length;
+ const startIndex = config.random ? Math.floor(Math.random() * resourcesCount) : config.index;
+ let resources;
+ if (config.random) {
+ let list = config.resources.slice(0);
+ resources = [];
+ while (list.length > 1) {
+ const nextIndex = Math.floor(Math.random() * list.length);
+ resources.push(list[nextIndex]);
+ list = list.slice(0, nextIndex).concat(list.slice(nextIndex + 1));
+ }
+ resources = resources.concat(list);
+ } else {
+ resources = config.resources.slice(startIndex).concat(config.resources.slice(0, startIndex));
+ }
+ const startTime = Date.now();
+ let status = "pending";
+ let queriesSent = 0;
+ let lastError;
+ let timer = null;
+ let queue = [];
+ let doneCallbacks = [];
+ if (typeof done === "function") {
+ doneCallbacks.push(done);
+ }
+ function resetTimer() {
+ if (timer) {
+ clearTimeout(timer);
+ timer = null;
+ }
+ }
+ function abort() {
+ if (status === "pending") {
+ status = "aborted";
+ }
+ resetTimer();
+ queue.forEach((item) => {
+ if (item.status === "pending") {
+ item.status = "aborted";
+ }
+ });
+ queue = [];
+ }
+ function subscribe(callback, overwrite) {
+ if (overwrite) {
+ doneCallbacks = [];
+ }
+ if (typeof callback === "function") {
+ doneCallbacks.push(callback);
+ }
+ }
+ function getQueryStatus() {
+ return {
+ startTime,
+ payload,
+ status,
+ queriesSent,
+ queriesPending: queue.length,
+ subscribe,
+ abort
+ };
+ }
+ function failQuery() {
+ status = "failed";
+ doneCallbacks.forEach((callback) => {
+ callback(void 0, lastError);
+ });
+ }
+ function clearQueue() {
+ queue.forEach((item) => {
+ if (item.status === "pending") {
+ item.status = "aborted";
+ }
+ });
+ queue = [];
+ }
+ function moduleResponse(item, response, data) {
+ const isError = response !== "success";
+ queue = queue.filter((queued) => queued !== item);
+ switch (status) {
+ case "pending":
+ break;
+ case "failed":
+ if (isError || !config.dataAfterTimeout) {
+ return;
+ }
+ break;
+ default:
+ return;
+ }
+ if (response === "abort") {
+ lastError = data;
+ failQuery();
+ return;
+ }
+ if (isError) {
+ lastError = data;
+ if (!queue.length) {
+ if (!resources.length) {
+ failQuery();
+ } else {
+ execNext();
+ }
+ }
+ return;
+ }
+ resetTimer();
+ clearQueue();
+ if (!config.random) {
+ const index = config.resources.indexOf(item.resource);
+ if (index !== -1 && index !== config.index) {
+ config.index = index;
+ }
+ }
+ status = "completed";
+ doneCallbacks.forEach((callback) => {
+ callback(data);
+ });
+ }
+ function execNext() {
+ if (status !== "pending") {
+ return;
+ }
+ resetTimer();
+ const resource = resources.shift();
+ if (resource === void 0) {
+ if (queue.length) {
+ timer = setTimeout(() => {
+ resetTimer();
+ if (status === "pending") {
+ clearQueue();
+ failQuery();
+ }
+ }, config.timeout);
+ return;
+ }
+ failQuery();
+ return;
+ }
+ const item = {
+ status: "pending",
+ resource,
+ callback: (status2, data) => {
+ moduleResponse(item, status2, data);
+ }
+ };
+ queue.push(item);
+ queriesSent++;
+ timer = setTimeout(execNext, config.rotate);
+ query(resource, payload, item.callback);
+ }
+ setTimeout(execNext);
+ return getQueryStatus;
+}
+
+// src/index.ts
+function initRedundancy(cfg) {
+ const config = {
+ ...defaultConfig,
+ ...cfg
+ };
+ let queries = [];
+ function cleanup() {
+ queries = queries.filter((item) => item().status === "pending");
+ }
+ function query(payload, queryCallback, doneCallback) {
+ const query2 = sendQuery(
+ config,
+ payload,
+ queryCallback,
+ (data, error) => {
+ cleanup();
+ if (doneCallback) {
+ doneCallback(data, error);
+ }
+ }
+ );
+ queries.push(query2);
+ return query2;
+ }
+ function find(callback) {
+ return queries.find((value) => {
+ return callback(value);
+ }) || null;
+ }
+ const instance = {
+ query,
+ find,
+ setIndex: (index) => {
+ config.index = index;
+ },
+ getIndex: () => config.index,
+ cleanup
+ };
+ return instance;
+}
+
+function createAPIConfig(source) {
+ let resources;
+ if (typeof source.resources === "string") {
+ resources = [source.resources];
+ } else {
+ resources = source.resources;
+ if (!(resources instanceof Array) || !resources.length) {
+ return null;
+ }
+ }
+ const result = {
+ // API hosts
+ resources,
+ // Root path
+ path: source.path || "/",
+ // URL length limit
+ maxURL: source.maxURL || 500,
+ // Timeout before next host is used.
+ rotate: source.rotate || 750,
+ // Timeout before failing query.
+ timeout: source.timeout || 5e3,
+ // Randomise default API end point.
+ random: source.random === true,
+ // Start index
+ index: source.index || 0,
+ // Receive data after time out (used if time out kicks in first, then API module sends data anyway).
+ dataAfterTimeout: source.dataAfterTimeout !== false
+ };
+ return result;
+}
+const configStorage = /* @__PURE__ */ Object.create(null);
+const fallBackAPISources = [
+ "https://api.simplesvg.com",
+ "https://api.unisvg.com"
+];
+const fallBackAPI = [];
+while (fallBackAPISources.length > 0) {
+ if (fallBackAPISources.length === 1) {
+ fallBackAPI.push(fallBackAPISources.shift());
+ } else {
+ if (Math.random() > 0.5) {
+ fallBackAPI.push(fallBackAPISources.shift());
+ } else {
+ fallBackAPI.push(fallBackAPISources.pop());
+ }
+ }
+}
+configStorage[""] = createAPIConfig({
+ resources: ["https://api.iconify.design"].concat(fallBackAPI)
+});
+function getAPIConfig(provider) {
+ return configStorage[provider];
+}
+
+function emptyCallback$1() {
+}
+const redundancyCache = /* @__PURE__ */ Object.create(null);
+function getRedundancyCache(provider) {
+ if (!redundancyCache[provider]) {
+ const config = getAPIConfig(provider);
+ if (!config) {
+ return;
+ }
+ const redundancy = initRedundancy(config);
+ const cachedReundancy = {
+ config,
+ redundancy
+ };
+ redundancyCache[provider] = cachedReundancy;
+ }
+ return redundancyCache[provider];
+}
+function sendAPIQuery(target, query, callback) {
+ let redundancy;
+ let send;
+ if (typeof target === "string") {
+ const api = getAPIModule(target);
+ if (!api) {
+ callback(void 0, 424);
+ return emptyCallback$1;
+ }
+ send = api.send;
+ const cached = getRedundancyCache(target);
+ if (cached) {
+ redundancy = cached.redundancy;
+ }
+ } else {
+ const config = createAPIConfig(target);
+ if (config) {
+ redundancy = initRedundancy(config);
+ const moduleKey = target.resources ? target.resources[0] : "";
+ const api = getAPIModule(moduleKey);
+ if (api) {
+ send = api.send;
+ }
+ }
+ }
+ if (!redundancy || !send) {
+ callback(void 0, 424);
+ return emptyCallback$1;
+ }
+ return redundancy.query(query, send, callback)().abort;
+}
+
+const browserCacheVersion = "iconify2";
+const browserCachePrefix = "iconify";
+const browserCacheCountKey = browserCachePrefix + "-count";
+const browserCacheVersionKey = browserCachePrefix + "-version";
+const browserStorageHour = 36e5;
+const browserStorageCacheExpiration = 168;
+
+function getStoredItem(func, key) {
+ try {
+ return func.getItem(key);
+ } catch (err) {
+ }
+}
+function setStoredItem(func, key, value) {
+ try {
+ func.setItem(key, value);
+ return true;
+ } catch (err) {
+ }
+}
+function removeStoredItem(func, key) {
+ try {
+ func.removeItem(key);
+ } catch (err) {
+ }
+}
+
+function setBrowserStorageItemsCount(storage, value) {
+ return setStoredItem(storage, browserCacheCountKey, value.toString());
+}
+function getBrowserStorageItemsCount(storage) {
+ return parseInt(getStoredItem(storage, browserCacheCountKey)) || 0;
+}
+
+const browserStorageConfig = {
+ local: true,
+ session: true
+};
+const browserStorageEmptyItems = {
+ local: /* @__PURE__ */ new Set(),
+ session: /* @__PURE__ */ new Set()
+};
+let browserStorageStatus = false;
+function setBrowserStorageStatus(status) {
+ browserStorageStatus = status;
+}
+
+let _window = typeof window === "undefined" ? {} : window;
+function getBrowserStorage(key) {
+ const attr = key + "Storage";
+ try {
+ if (_window && _window[attr] && typeof _window[attr].length === "number") {
+ return _window[attr];
+ }
+ } catch (err) {
+ }
+ browserStorageConfig[key] = false;
+}
+
+function iterateBrowserStorage(key, callback) {
+ const func = getBrowserStorage(key);
+ if (!func) {
+ return;
+ }
+ const version = getStoredItem(func, browserCacheVersionKey);
+ if (version !== browserCacheVersion) {
+ if (version) {
+ const total2 = getBrowserStorageItemsCount(func);
+ for (let i = 0; i < total2; i++) {
+ removeStoredItem(func, browserCachePrefix + i.toString());
+ }
+ }
+ setStoredItem(func, browserCacheVersionKey, browserCacheVersion);
+ setBrowserStorageItemsCount(func, 0);
+ return;
+ }
+ const minTime = Math.floor(Date.now() / browserStorageHour) - browserStorageCacheExpiration;
+ const parseItem = (index) => {
+ const name = browserCachePrefix + index.toString();
+ const item = getStoredItem(func, name);
+ if (typeof item !== "string") {
+ return;
+ }
+ try {
+ const data = JSON.parse(item);
+ if (typeof data === "object" && typeof data.cached === "number" && data.cached > minTime && typeof data.provider === "string" && typeof data.data === "object" && typeof data.data.prefix === "string" && // Valid item: run callback
+ callback(data, index)) {
+ return true;
+ }
+ } catch (err) {
+ }
+ removeStoredItem(func, name);
+ };
+ let total = getBrowserStorageItemsCount(func);
+ for (let i = total - 1; i >= 0; i--) {
+ if (!parseItem(i)) {
+ if (i === total - 1) {
+ total--;
+ setBrowserStorageItemsCount(func, total);
+ } else {
+ browserStorageEmptyItems[key].add(i);
+ }
+ }
+ }
+}
+
+function initBrowserStorage() {
+ if (browserStorageStatus) {
+ return;
+ }
+ setBrowserStorageStatus(true);
+ for (const key in browserStorageConfig) {
+ iterateBrowserStorage(key, (item) => {
+ const iconSet = item.data;
+ const provider = item.provider;
+ const prefix = iconSet.prefix;
+ const storage = getStorage(
+ provider,
+ prefix
+ );
+ if (!addIconSet(storage, iconSet).length) {
+ return false;
+ }
+ const lastModified = iconSet.lastModified || -1;
+ storage.lastModifiedCached = storage.lastModifiedCached ? Math.min(storage.lastModifiedCached, lastModified) : lastModified;
+ return true;
+ });
+ }
+}
+
+function updateLastModified(storage, lastModified) {
+ const lastValue = storage.lastModifiedCached;
+ if (
+ // Matches or newer
+ lastValue && lastValue >= lastModified
+ ) {
+ return lastValue === lastModified;
+ }
+ storage.lastModifiedCached = lastModified;
+ if (lastValue) {
+ for (const key in browserStorageConfig) {
+ iterateBrowserStorage(key, (item) => {
+ const iconSet = item.data;
+ return item.provider !== storage.provider || iconSet.prefix !== storage.prefix || iconSet.lastModified === lastModified;
+ });
+ }
+ }
+ return true;
+}
+function storeInBrowserStorage(storage, data) {
+ if (!browserStorageStatus) {
+ initBrowserStorage();
+ }
+ function store(key) {
+ let func;
+ if (!browserStorageConfig[key] || !(func = getBrowserStorage(key))) {
+ return;
+ }
+ const set = browserStorageEmptyItems[key];
+ let index;
+ if (set.size) {
+ set.delete(index = Array.from(set).shift());
+ } else {
+ index = getBrowserStorageItemsCount(func);
+ if (!setBrowserStorageItemsCount(func, index + 1)) {
+ return;
+ }
+ }
+ const item = {
+ cached: Math.floor(Date.now() / browserStorageHour),
+ provider: storage.provider,
+ data
+ };
+ return setStoredItem(
+ func,
+ browserCachePrefix + index.toString(),
+ JSON.stringify(item)
+ );
+ }
+ if (data.lastModified && !updateLastModified(storage, data.lastModified)) {
+ return;
+ }
+ if (!Object.keys(data.icons).length) {
+ return;
+ }
+ if (data.not_found) {
+ data = Object.assign({}, data);
+ delete data.not_found;
+ }
+ if (!store("local")) {
+ store("session");
+ }
+}
+
+function emptyCallback() {
+}
+function loadedNewIcons(storage) {
+ if (!storage.iconsLoaderFlag) {
+ storage.iconsLoaderFlag = true;
+ setTimeout(() => {
+ storage.iconsLoaderFlag = false;
+ updateCallbacks(storage);
+ });
+ }
+}
+function loadNewIcons(storage, icons) {
+ if (!storage.iconsToLoad) {
+ storage.iconsToLoad = icons;
+ } else {
+ storage.iconsToLoad = storage.iconsToLoad.concat(icons).sort();
+ }
+ if (!storage.iconsQueueFlag) {
+ storage.iconsQueueFlag = true;
+ setTimeout(() => {
+ storage.iconsQueueFlag = false;
+ const { provider, prefix } = storage;
+ const icons2 = storage.iconsToLoad;
+ delete storage.iconsToLoad;
+ let api;
+ if (!icons2 || !(api = getAPIModule(provider))) {
+ return;
+ }
+ const params = api.prepare(provider, prefix, icons2);
+ params.forEach((item) => {
+ sendAPIQuery(provider, item, (data) => {
+ if (typeof data !== "object") {
+ item.icons.forEach((name) => {
+ storage.missing.add(name);
+ });
+ } else {
+ try {
+ const parsed = addIconSet(
+ storage,
+ data
+ );
+ if (!parsed.length) {
+ return;
+ }
+ const pending = storage.pendingIcons;
+ if (pending) {
+ parsed.forEach((name) => {
+ pending.delete(name);
+ });
+ }
+ storeInBrowserStorage(storage, data);
+ } catch (err) {
+ console.error(err);
+ }
+ }
+ loadedNewIcons(storage);
+ });
+ });
+ });
+ }
+}
+const isPending = (icon) => {
+ const storage = getStorage(
+ icon.provider,
+ icon.prefix
+ );
+ const pending = storage.pendingIcons;
+ return !!(pending && pending.has(icon.name));
+};
+const loadIcons = (icons, callback) => {
+ const cleanedIcons = listToIcons(icons, true, allowSimpleNames());
+ const sortedIcons = sortIcons(cleanedIcons);
+ if (!sortedIcons.pending.length) {
+ let callCallback = true;
+ if (callback) {
+ setTimeout(() => {
+ if (callCallback) {
+ callback(
+ sortedIcons.loaded,
+ sortedIcons.missing,
+ sortedIcons.pending,
+ emptyCallback
+ );
+ }
+ });
+ }
+ return () => {
+ callCallback = false;
+ };
+ }
+ const newIcons = /* @__PURE__ */ Object.create(null);
+ const sources = [];
+ let lastProvider, lastPrefix;
+ sortedIcons.pending.forEach((icon) => {
+ const { provider, prefix } = icon;
+ if (prefix === lastPrefix && provider === lastProvider) {
+ return;
+ }
+ lastProvider = provider;
+ lastPrefix = prefix;
+ sources.push(getStorage(provider, prefix));
+ const providerNewIcons = newIcons[provider] || (newIcons[provider] = /* @__PURE__ */ Object.create(null));
+ if (!providerNewIcons[prefix]) {
+ providerNewIcons[prefix] = [];
+ }
+ });
+ sortedIcons.pending.forEach((icon) => {
+ const { provider, prefix, name } = icon;
+ const storage = getStorage(provider, prefix);
+ const pendingQueue = storage.pendingIcons || (storage.pendingIcons = /* @__PURE__ */ new Set());
+ if (!pendingQueue.has(name)) {
+ pendingQueue.add(name);
+ newIcons[provider][prefix].push(name);
+ }
+ });
+ sources.forEach((storage) => {
+ const { provider, prefix } = storage;
+ if (newIcons[provider][prefix].length) {
+ loadNewIcons(storage, newIcons[provider][prefix]);
+ }
+ });
+ return callback ? storeCallback(callback, sortedIcons, sources) : emptyCallback;
+};
+
+/**
+ * Compare props
+ */
+function propsChanged(props1, props2) {
+ if (props1.name !== props2.name || props1.mode !== props2.mode) {
+ return true;
+ }
+ const customisations1 = props1.customisations;
+ const customisations2 = props2.customisations;
+ for (const key in defaultExtendedIconCustomisations) {
+ if (customisations1[key] !== customisations2[key]) {
+ return true;
+ }
+ }
+ return false;
+}
+
+function rotateFromString(value, defaultValue = 0) {
+ const units = value.replace(/^-?[0-9.]*/, "");
+ function cleanup(value2) {
+ while (value2 < 0) {
+ value2 += 4;
+ }
+ return value2 % 4;
+ }
+ if (units === "") {
+ const num = parseInt(value);
+ return isNaN(num) ? 0 : cleanup(num);
+ } else if (units !== value) {
+ let split = 0;
+ switch (units) {
+ case "%":
+ split = 25;
+ break;
+ case "deg":
+ split = 90;
+ }
+ if (split) {
+ let num = parseFloat(value.slice(0, value.length - units.length));
+ if (isNaN(num)) {
+ return 0;
+ }
+ num = num / split;
+ return num % 1 === 0 ? cleanup(num) : 0;
+ }
+ }
+ return defaultValue;
+}
+
+const separator = /[\s,]+/;
+function flipFromString(custom, flip) {
+ flip.split(separator).forEach((str) => {
+ const value = str.trim();
+ switch (value) {
+ case "horizontal":
+ custom.hFlip = true;
+ break;
+ case "vertical":
+ custom.vFlip = true;
+ break;
+ }
+ });
+}
+
+/**
+ * Size attributes
+ */
+const sizeAttributes = ['width', 'height'];
+/**
+ * Boolean attributes
+ */
+const booleanAttributes = [
+ 'inline',
+ 'hFlip',
+ 'vFlip',
+];
+/**
+ * Get attribute value
+ */
+function getBooleanAttribute(value, key) {
+ if (value === key || value === 'true') {
+ return true;
+ }
+ if (value === '' || value === 'false') {
+ return false;
+ }
+ return null;
+}
+/**
+ * Get element properties from HTML element
+ */
+function getElementProps(element) {
+ // Get icon name
+ const name = element.getAttribute('data-icon');
+ const icon = typeof name === 'string' && stringToIcon(name, true);
+ if (!icon) {
+ return null;
+ }
+ // Get defaults and inline
+ const customisations = {
+ ...defaultExtendedIconCustomisations,
+ inline: element.classList && element.classList.contains(inlineClass),
+ };
+ // Get dimensions
+ sizeAttributes.forEach((attr) => {
+ const value = element.getAttribute('data-' + attr);
+ if (value) {
+ customisations[attr] = value;
+ }
+ });
+ // Get rotation
+ const rotation = element.getAttribute('data-rotate');
+ if (typeof rotation === 'string') {
+ customisations.rotate = rotateFromString(rotation);
+ }
+ // Get flip shorthand
+ const flip = element.getAttribute('data-flip');
+ if (typeof flip === 'string') {
+ flipFromString(customisations, flip);
+ }
+ // Boolean attributes
+ booleanAttributes.forEach((attr) => {
+ const key = 'data-' + attr;
+ const value = getBooleanAttribute(element.getAttribute(key), key);
+ if (typeof value === 'boolean') {
+ customisations[attr] = value;
+ }
+ });
+ // Get render mode. Not checking actual value because incorrect values are treated as inline
+ const mode = element.getAttribute('data-mode');
+ return {
+ name,
+ icon,
+ customisations,
+ mode,
+ };
+}
+
+/**
+ * Selector combining class names and tags
+ */
+const selector = 'svg.' +
+ blockClass +
+ ', i.' +
+ blockClass +
+ ', span.' +
+ blockClass +
+ ', i.' +
+ inlineClass +
+ ', span.' +
+ inlineClass;
+/**
+ * Find all parent nodes in DOM
+ */
+function scanRootNode(root) {
+ const nodes = [];
+ root.querySelectorAll(selector).forEach((node) => {
+ // Get props, ignore SVG rendered outside of SVG framework
+ const props = node[elementDataProperty] || node.tagName.toLowerCase() !== 'svg'
+ ? getElementProps(node)
+ : null;
+ if (props) {
+ nodes.push({
+ node,
+ props,
+ });
+ }
+ });
+ return nodes;
+}
+
+function iconToHTML(body, attributes) {
+ let renderAttribsHTML = body.indexOf("xlink:") === -1 ? "" : ' xmlns:xlink="http://www.w3.org/1999/xlink"';
+ for (const attr in attributes) {
+ renderAttribsHTML += " " + attr + '="' + attributes[attr] + '"';
+ }
+ return '" + body + " ";
+}
+
+let policy;
+function createPolicy() {
+ try {
+ policy = window.trustedTypes.createPolicy("iconify", {
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
+ createHTML: (s) => s
+ });
+ } catch (err) {
+ policy = null;
+ }
+}
+function cleanUpInnerHTML(html) {
+ if (policy === void 0) {
+ createPolicy();
+ }
+ return policy ? policy.createHTML(html) : html;
+}
+
+/**
+ * Get classes to add from icon name
+ */
+function iconClasses(iconName) {
+ const classesToAdd = new Set(['iconify']);
+ ['provider', 'prefix'].forEach((attr) => {
+ if (iconName[attr]) {
+ classesToAdd.add('iconify--' + iconName[attr]);
+ }
+ });
+ return classesToAdd;
+}
+/**
+ * Add classes to SVG, removing previously added classes, keeping custom classes
+ */
+function applyClasses(svg, classes, previouslyAddedClasses, placeholder) {
+ const svgClasses = svg.classList;
+ // Copy classes from placeholder
+ if (placeholder) {
+ const placeholderClasses = placeholder.classList;
+ Array.from(placeholderClasses).forEach((item) => {
+ svgClasses.add(item);
+ });
+ }
+ // Add new classes
+ const addedClasses = [];
+ classes.forEach((item) => {
+ if (!svgClasses.contains(item)) {
+ // Add new class
+ svgClasses.add(item);
+ addedClasses.push(item);
+ }
+ else if (previouslyAddedClasses.has(item)) {
+ // Was added before: keep it
+ addedClasses.push(item);
+ }
+ });
+ // Remove previously added classes
+ previouslyAddedClasses.forEach((item) => {
+ if (!classes.has(item)) {
+ // Class that was added before, but no longer needed
+ svgClasses.remove(item);
+ }
+ });
+ return addedClasses;
+}
+
+/**
+ * Copy old styles, apply new styles
+ */
+function applyStyle(svg, styles, previouslyAddedStyles) {
+ const svgStyle = svg.style;
+ // Remove previously added styles
+ (previouslyAddedStyles || []).forEach((prop) => {
+ svgStyle.removeProperty(prop);
+ });
+ // Apply new styles, ignoring styles that already exist
+ const appliedStyles = [];
+ for (const prop in styles) {
+ if (!svgStyle.getPropertyValue(prop)) {
+ appliedStyles.push(prop);
+ svgStyle.setProperty(prop, styles[prop]);
+ }
+ }
+ return appliedStyles;
+}
+
+/**
+ * Render icon as inline SVG
+ */
+function renderInlineSVG(element, props, iconData) {
+ // Create placeholder. Why placeholder? innerHTML setter on SVG does not work in some environments.
+ let span;
+ try {
+ span = document.createElement('span');
+ }
+ catch (err) {
+ return element;
+ }
+ // Generate data to render
+ const customisations = props.customisations;
+ const renderData = iconToSVG(iconData, customisations);
+ // Get old data
+ const oldData = element[elementDataProperty];
+ // Generate SVG
+ const html = iconToHTML(replaceIDs(renderData.body), {
+ 'aria-hidden': 'true',
+ 'role': 'img',
+ ...renderData.attributes,
+ });
+ span.innerHTML = cleanUpInnerHTML(html);
+ // Get SVG element
+ const svg = span.childNodes[0];
+ // Add attributes
+ const placeholderAttributes = element.attributes;
+ for (let i = 0; i < placeholderAttributes.length; i++) {
+ const item = placeholderAttributes.item(i);
+ const name = item.name;
+ if (name !== 'class' && !svg.hasAttribute(name)) {
+ svg.setAttribute(name, item.value);
+ }
+ }
+ // Add classes
+ const classesToAdd = iconClasses(props.icon);
+ const addedClasses = applyClasses(svg, classesToAdd, new Set(oldData && oldData.addedClasses), element);
+ // Update style
+ const addedStyles = applyStyle(svg, customisations.inline
+ ? {
+ 'vertical-align': '-0.125em',
+ }
+ : {}, oldData && oldData.addedStyles);
+ // Add data to element
+ const newData = {
+ ...props,
+ status: 'loaded',
+ addedClasses,
+ addedStyles,
+ };
+ svg[elementDataProperty] = newData;
+ // Replace old element
+ if (element.parentNode) {
+ element.parentNode.replaceChild(svg, element);
+ }
+ return svg;
+}
+
+function encodeSVGforURL(svg) {
+ return svg.replace(/"/g, "'").replace(/%/g, "%25").replace(/#/g, "%23").replace(//g, "%3E").replace(/\s+/g, " ");
+}
+function svgToData(svg) {
+ return "data:image/svg+xml," + encodeSVGforURL(svg);
+}
+function svgToURL(svg) {
+ return 'url("' + svgToData(svg) + '")';
+}
+
+const commonProps = {
+ display: 'inline-block',
+};
+const monotoneProps = {
+ 'background-color': 'currentColor',
+};
+const coloredProps = {
+ 'background-color': 'transparent',
+};
+// Dynamically add common props to variables above
+const propsToAdd = {
+ image: 'var(--svg)',
+ repeat: 'no-repeat',
+ size: '100% 100%',
+};
+const propsToAddTo = {
+ '-webkit-mask': monotoneProps,
+ 'mask': monotoneProps,
+ 'background': coloredProps,
+};
+for (const prefix in propsToAddTo) {
+ const list = propsToAddTo[prefix];
+ for (const prop in propsToAdd) {
+ list[prefix + '-' + prop] = propsToAdd[prop];
+ }
+}
+/**
+ * Fix size: add 'px' to numbers
+ */
+function fixSize(value) {
+ return value + (value.match(/^[-0-9.]+$/) ? 'px' : '');
+}
+/**
+ * Render icon as inline SVG
+ */
+function renderBackground(element, props, iconData, useMask) {
+ // Generate data to render
+ const customisations = props.customisations;
+ const renderData = iconToSVG(iconData, customisations);
+ const renderAttribs = renderData.attributes;
+ // Get old data
+ const oldData = element[elementDataProperty];
+ // Generate SVG
+ const html = iconToHTML(renderData.body, {
+ ...renderAttribs,
+ width: iconData.width + '',
+ height: iconData.height + '',
+ });
+ // Add classes
+ const classesToAdd = iconClasses(props.icon);
+ const addedClasses = applyClasses(element, classesToAdd, new Set(oldData && oldData.addedClasses));
+ // Update style
+ const url = svgToURL(html);
+ const newStyles = {
+ '--svg': url,
+ 'width': fixSize(renderAttribs.width),
+ 'height': fixSize(renderAttribs.height),
+ ...commonProps,
+ ...(useMask ? monotoneProps : coloredProps),
+ };
+ if (customisations.inline) {
+ newStyles['vertical-align'] = '-0.125em';
+ }
+ const addedStyles = applyStyle(element, newStyles, oldData && oldData.addedStyles);
+ // Add data to element
+ const newData = {
+ ...props,
+ status: 'loaded',
+ addedClasses,
+ addedStyles,
+ };
+ element[elementDataProperty] = newData;
+ return element;
+}
+
+/**
+ * Flag to avoid scanning DOM too often
+ */
+let scanQueued = false;
+/**
+ * Icons have been loaded
+ */
+function checkPendingIcons() {
+ if (!scanQueued) {
+ scanQueued = true;
+ setTimeout(() => {
+ if (scanQueued) {
+ scanQueued = false;
+ scanDOM();
+ }
+ });
+ }
+}
+/**
+ * Scan node for placeholders
+ */
+function scanDOM(rootNode, addTempNode = false) {
+ // List of icons to load: [provider][prefix] = Set
+ const iconsToLoad = Object.create(null);
+ function getIcon(icon, load) {
+ const { provider, prefix, name } = icon;
+ const storage = getStorage(provider, prefix);
+ const storedIcon = storage.icons[name];
+ if (storedIcon) {
+ return {
+ status: 'loaded',
+ icon: storedIcon,
+ };
+ }
+ if (storage.missing.has(name)) {
+ return {
+ status: 'missing',
+ };
+ }
+ if (load && !isPending(icon)) {
+ const providerIconsToLoad = iconsToLoad[provider] ||
+ (iconsToLoad[provider] = Object.create(null));
+ const set = providerIconsToLoad[prefix] ||
+ (providerIconsToLoad[prefix] = new Set());
+ set.add(name);
+ }
+ return {
+ status: 'loading',
+ };
+ }
+ // Parse all root nodes
+ (rootNode ? [rootNode] : listRootNodes()).forEach((observedNode) => {
+ const root = typeof observedNode.node === 'function'
+ ? observedNode.node()
+ : observedNode.node;
+ if (!root || !root.querySelectorAll) {
+ return;
+ }
+ // Track placeholders
+ let hasPlaceholders = false;
+ // Observer
+ let paused = false;
+ /**
+ * Render icon
+ */
+ function render(element, props, iconData) {
+ if (!paused) {
+ paused = true;
+ pauseObservingNode(observedNode);
+ }
+ if (element.tagName.toUpperCase() !== 'SVG') {
+ // Check for one of style modes
+ const mode = props.mode;
+ const isMask = mode === 'mask' ||
+ (mode === 'bg'
+ ? false
+ : mode === 'style'
+ ? iconData.body.indexOf('currentColor') !== -1
+ : null);
+ if (typeof isMask === 'boolean') {
+ renderBackground(element, props, {
+ ...defaultIconProps,
+ ...iconData,
+ }, isMask);
+ return;
+ }
+ }
+ renderInlineSVG(element, props, iconData);
+ }
+ // Find all elements
+ scanRootNode(root).forEach(({ node, props }) => {
+ // Check if item already has props
+ const oldData = node[elementDataProperty];
+ if (!oldData) {
+ // New icon without data
+ const { status, icon } = getIcon(props.icon, true);
+ if (icon) {
+ // Ready to render!
+ render(node, props, icon);
+ return;
+ }
+ // Loading or missing
+ hasPlaceholders = hasPlaceholders || status === 'loading';
+ node[elementDataProperty] = {
+ ...props,
+ status,
+ };
+ return;
+ }
+ // Previously found icon
+ let item;
+ if (!propsChanged(oldData, props)) {
+ // Props have not changed. Check status
+ const oldStatus = oldData.status;
+ if (oldStatus !== 'loading') {
+ return;
+ }
+ item = getIcon(props.icon, false);
+ if (!item.icon) {
+ // Nothing to render
+ oldData.status = item.status;
+ return;
+ }
+ }
+ else {
+ // Properties have changed: load icon if name has changed
+ item = getIcon(props.icon, oldData.name !== props.name);
+ if (!item.icon) {
+ // Cannot render icon: update status and props
+ hasPlaceholders =
+ hasPlaceholders || item.status === 'loading';
+ Object.assign(oldData, {
+ ...props,
+ status: item.status,
+ });
+ return;
+ }
+ }
+ // Re-render icon
+ render(node, props, item.icon);
+ });
+ // Observed node stuff
+ if (observedNode.temporary && !hasPlaceholders) {
+ // Remove temporary node
+ stopObserving(root);
+ }
+ else if (addTempNode && hasPlaceholders) {
+ // Add new temporary node
+ observe(root, true);
+ }
+ else if (paused && observedNode.observer) {
+ // Resume observer
+ resumeObservingNode(observedNode);
+ }
+ });
+ // Load icons
+ for (const provider in iconsToLoad) {
+ const providerIconsToLoad = iconsToLoad[provider];
+ for (const prefix in providerIconsToLoad) {
+ const set = providerIconsToLoad[prefix];
+ loadIcons(Array.from(set).map((name) => ({
+ provider,
+ prefix,
+ name,
+ })), checkPendingIcons);
+ }
+ }
+}
+/**
+ * Scan node for placeholders
+ */
+function scanElement(root) {
+ // Add temporary node
+ const node = findRootNode(root);
+ if (!node) {
+ scanDOM({
+ node: root,
+ temporary: true,
+ }, true);
+ }
+ else {
+ scanDOM(node);
+ }
+}
+
+function generateIcon(name, customisations, returnString = false) {
+ // Get icon data
+ const iconData = getIconData(name);
+ if (!iconData) {
+ return null;
+ }
+ // Split name
+ const iconName = stringToIcon(name);
+ // Clean up customisations
+ const changes = mergeCustomisations(defaultExtendedIconCustomisations, customisations || {});
+ // Get data
+ const result = renderInlineSVG(document.createElement('span'), {
+ name,
+ icon: iconName,
+ customisations: changes,
+ }, iconData);
+ return returnString
+ ? result.outerHTML
+ : result;
+}
+/**
+ * Get version
+ */
+function getVersion() {
+ return '3.1.1';
+}
+/**
+ * Generate SVG element
+ */
+function renderSVG(name, customisations) {
+ return generateIcon(name, customisations, false);
+}
+/**
+ * Generate SVG as string
+ */
+function renderHTML(name, customisations) {
+ return generateIcon(name, customisations, true);
+}
+/**
+ * Get rendered icon as object that can be used to create SVG (use replaceIDs on body)
+ */
+function renderIcon(name, customisations) {
+ // Get icon data
+ const iconData = getIconData(name);
+ if (!iconData) {
+ return null;
+ }
+ // Clean up customisations
+ const changes = mergeCustomisations(defaultExtendedIconCustomisations, customisations || {});
+ // Get data
+ return iconToSVG(iconData, changes);
+}
+/**
+ * Scan DOM
+ */
+function scan(root) {
+ if (root) {
+ scanElement(root);
+ }
+ else {
+ scanDOM();
+ }
+}
+/**
+ * Initialise stuff
+ */
+if (typeof document !== 'undefined' && typeof window !== 'undefined') {
+ // Add document.body node
+ addBodyNode();
+ const _window = window;
+ // Load icons from global "IconifyPreload"
+ if (_window.IconifyPreload !== void 0) {
+ const preload = _window.IconifyPreload;
+ const err = 'Invalid IconifyPreload syntax.';
+ if (typeof preload === 'object' && preload !== null) {
+ (preload instanceof Array ? preload : [preload]).forEach((item) => {
+ try {
+ if (
+ // Check if item is an object and not null/array
+ typeof item !== 'object' ||
+ item === null ||
+ item instanceof Array ||
+ // Check for 'icons' and 'prefix'
+ typeof item.icons !== 'object' ||
+ typeof item.prefix !== 'string' ||
+ // Add icon set
+ !addCollection(item)) {
+ console.error(err);
+ }
+ }
+ catch (e) {
+ console.error(err);
+ }
+ });
+ }
+ }
+ // Load observer and scan DOM on next tick
+ setTimeout(() => {
+ initObserver(scanDOM);
+ scanDOM();
+ });
+}
+
+/**
+ * Global variable
+ */
+const Iconify = {
+ // IconifyStorageFunctions
+ iconExists,
+ getIcon,
+ listIcons,
+ addIcon,
+ addCollection,
+ // IconifyBuilderFunctions
+ replaceIDs,
+ calculateSize,
+ buildIcon: iconToSVG,
+ // IconifyCommonFunctions
+ getVersion,
+ renderSVG,
+ renderHTML,
+ renderIcon,
+ scan,
+ observe,
+ stopObserving,
+ pauseObserver,
+ resumeObserver,
+};
+
+export { addCollection, addIcon, iconToSVG as buildIcon, calculateSize, Iconify as default, getIcon, getVersion, iconExists, listIcons, observe, pauseObserver, renderHTML, renderIcon, renderSVG, replaceIDs, resumeObserver, scan, stopObserving };
+
+// Export to window or web worker
+try {
+ if (self.Iconify === void 0) {
+ self.Iconify = Iconify;
+ }
+} catch (err) {
+}
diff --git a/node_modules/@iconify/iconify/license.txt b/node_modules/@iconify/iconify/license.txt
new file mode 100644
index 0000000..5673d20
--- /dev/null
+++ b/node_modules/@iconify/iconify/license.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2019-PRESENT Vjacheslav Trushkin
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/node_modules/@iconify/iconify/offline/package.json b/node_modules/@iconify/iconify/offline/package.json
new file mode 100644
index 0000000..bf4a0b2
--- /dev/null
+++ b/node_modules/@iconify/iconify/offline/package.json
@@ -0,0 +1,16 @@
+{
+ "name": "@iconify/iconify/offline",
+ "main": "../dist/iconify.without-api.min.js",
+ "types": "../dist/iconify.without-api.d.ts",
+ "browser": "../dist/iconify.without-api.min.js",
+ "module": "../dist/iconify.without-api.mjs",
+ "exports": {
+ "./*": "./*",
+ ".": {
+ "require": "../dist/iconify.without-api.cjs",
+ "import": "../dist/iconify.without-api.mjs",
+ "types": "../dist/iconify.without-api.d.ts",
+ "default": "../dist/iconify.without-api.min.js"
+ }
+ }
+}
diff --git a/node_modules/@iconify/iconify/offline/readme.md b/node_modules/@iconify/iconify/offline/readme.md
new file mode 100644
index 0000000..a1ccc40
--- /dev/null
+++ b/node_modules/@iconify/iconify/offline/readme.md
@@ -0,0 +1,5 @@
+# @iconify/iconify/offline
+
+This sub-directory contains `package.json` with entry points for importing `@iconify/iconify/offline`.
+
+There is a duplicate entry in `exports` section of `package.json` in the parent directory, but at moment of coding this, TypeScript does not support conditional exports properly, so this directory is used as a duplicate to make everything work with TypeScript.
diff --git a/node_modules/@iconify/iconify/package.json b/node_modules/@iconify/iconify/package.json
new file mode 100644
index 0000000..c2629fb
--- /dev/null
+++ b/node_modules/@iconify/iconify/package.json
@@ -0,0 +1,94 @@
+{
+ "name": "@iconify/iconify",
+ "description": "Unified SVG framework with over 100,000 icons to choose from",
+ "author": "Vjacheslav Trushkin (https://iconify.design)",
+ "version": "3.1.1",
+ "license": "MIT",
+ "main": "./dist/iconify.min.js",
+ "types": "./dist/iconify.d.ts",
+ "browser": "./dist/iconify.min.js",
+ "module": "./dist/iconify.mjs",
+ "bugs": "https://github.com/iconify/iconify/issues",
+ "homepage": "https://iconify.design/",
+ "funding": "https://github.com/sponsors/cyberalien",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/iconify/iconify.git",
+ "directory": "components/svg-framework"
+ },
+ "exports": {
+ "./*": "./*",
+ ".": {
+ "require": "./dist/iconify.cjs",
+ "import": "./dist/iconify.mjs",
+ "types": "./dist/iconify.d.ts",
+ "default": "./dist/iconify.min.js"
+ },
+ "./dist/iconify": {
+ "require": "./dist/iconify.cjs",
+ "import": "./dist/iconify.mjs",
+ "default": "./dist/iconify.min.js",
+ "types": "./dist/iconify.d.ts"
+ },
+ "./dist/iconify.min": {
+ "require": "./dist/iconify.cjs",
+ "import": "./dist/iconify.mjs",
+ "types": "./dist/iconify.d.ts",
+ "default": "./dist/iconify.min.js"
+ },
+ "./dist/iconify.without-api": {
+ "require": "./dist/iconify.without-api.cjs",
+ "import": "./dist/iconify.without-api.mjs",
+ "types": "./dist/iconify.without-api.d.ts",
+ "default": "./dist/iconify.without-api.min.js"
+ },
+ "./dist/iconify.without-api.min": {
+ "require": "./dist/iconify.without-api.cjs",
+ "import": "./dist/iconify.without-api.mjs",
+ "types": "./dist/iconify.without-api.d.ts",
+ "default": "./dist/iconify.without-api.min.js"
+ },
+ "./offline": {
+ "require": "./dist/iconify.without-api.cjs",
+ "import": "./dist/iconify.without-api.mjs",
+ "types": "./dist/iconify.without-api.d.ts",
+ "default": "./dist/iconify.without-api.min.js"
+ }
+ },
+ "dependencies": {
+ "@iconify/types": "^2.0.0"
+ },
+ "devDependencies": {
+ "@microsoft/api-extractor": "^7.35.1",
+ "@rollup/plugin-node-resolve": "^15.1.0",
+ "@rollup/plugin-replace": "^5.0.2",
+ "@rollup/plugin-terser": "^0.4.3",
+ "@types/jest": "^29.5.2",
+ "@types/jsdom": "^21.1.1",
+ "@types/node": "^18.16.16",
+ "@typescript-eslint/eslint-plugin": "^5.59.9",
+ "cross-env": "^7.0.3",
+ "eslint": "^8.42.0",
+ "jest": "^29.5.0",
+ "jsdom": "^21.1.2",
+ "rimraf": "^4.4.1",
+ "rollup": "^3.23.1",
+ "ts-jest": "^29.1.0",
+ "typescript": "^5.1.3",
+ "@iconify/core": "^2.0.1",
+ "@iconify/utils": "^2.1.6"
+ },
+ "scripts": {
+ "clean": "rimraf lib dist tests-compiled tsconfig.tsbuildinfo",
+ "lint": "eslint src/**/*.ts",
+ "prebuild": "pnpm run lint && pnpm run clean",
+ "build": "node build",
+ "build:lib": "tsc -b",
+ "build:dist": "rollup -c rollup.config.mjs",
+ "build:api": "api-extractor run --local --verbose",
+ "build:api2": "api-extractor run --local --verbose --config api-extractor.without-api.json",
+ "test:jest": "jest --runInBand",
+ "test:mjs": "cross-env NODE_OPTIONS=--experimental-vm-modules node tests/import-test.mjs",
+ "test": "pnpm run test:jest && pnpm run test:mjs"
+ }
+}
\ No newline at end of file
diff --git a/node_modules/@iconify/iconify/rollup.config.mjs b/node_modules/@iconify/iconify/rollup.config.mjs
new file mode 100644
index 0000000..a86d275
--- /dev/null
+++ b/node_modules/@iconify/iconify/rollup.config.mjs
@@ -0,0 +1,132 @@
+import { readFileSync, writeFileSync } from 'fs';
+import resolve from '@rollup/plugin-node-resolve';
+import terser from '@rollup/plugin-terser';
+import replace from '@rollup/plugin-replace';
+
+const names = ['iconify', 'iconify.without-api'];
+const global = 'Iconify';
+
+// Wrapper to export module as global and as ES module
+const header = `/**
+* (c) Iconify
+*
+* For the full copyright and license information, please view the license.txt or license.gpl.txt
+* files at https://github.com/iconify/iconify
+*
+* Licensed under MIT.
+*
+* @license MIT
+* @version __iconify_version__
+*/`;
+
+const defaultFooter = `
+// Export to window or web worker
+try {
+ if (self.Iconify === void 0) {
+ self.Iconify = Iconify;
+ }
+} catch (err) {
+}`;
+
+const iifeFooter = `
+// Export as ES module
+if (typeof exports === 'object') {
+ try {
+ exports.__esModule = true;
+ exports.default = Iconify;
+ for (var key in Iconify) {
+ exports[key] = Iconify[key];
+ }
+ } catch (err) {
+ }
+}
+
+${defaultFooter}`;
+
+// Get replacements
+const replacements = {
+ preventAssignment: true,
+};
+const packageJSON = JSON.parse(readFileSync('package.json', 'utf8'));
+replacements['__iconify_version__'] = packageJSON.version;
+
+// Update README.md
+let readme = readFileSync('README.md', 'utf8');
+const oldReadme = readme;
+const replaceCodeLink = (search) => {
+ let start = 0;
+ let pos;
+ while ((pos = readme.indexOf(search, start)) !== -1) {
+ start = pos + search.length;
+ let pos2 = readme.indexOf('/', start);
+ if (pos2 === -1) {
+ return;
+ }
+ readme =
+ readme.slice(0, start) + packageJSON.version + readme.slice(pos2);
+ }
+};
+replaceCodeLink('/code.iconify.design/3/');
+replaceCodeLink('/@iconify/iconify@');
+
+if (readme !== oldReadme) {
+ console.log('Updatead README');
+ writeFileSync('README.md', readme, 'utf8');
+}
+
+// Export configuration
+const config = [];
+names.forEach((name) => {
+ // Full and minified
+ [false, true].forEach((minify) => {
+ // Parse all formats
+ ['js', 'cjs', 'mjs'].forEach((ext) => {
+ if (minify && ext !== 'js') {
+ // Minify only .js files
+ return;
+ }
+
+ // Get export format and footer
+ let format = ext;
+ let footer = defaultFooter;
+ switch (ext) {
+ case 'js':
+ format = 'iife';
+ footer = iifeFooter;
+ break;
+
+ case 'mjs':
+ format = 'es';
+ break;
+ }
+
+ const item = {
+ input: `lib/${name}.js`,
+ output: [
+ {
+ file: `dist/${name}${minify ? '.min' : ''}.${ext}`,
+ format,
+ exports: 'named',
+ name: global,
+ banner: header,
+ footer,
+ },
+ ],
+ plugins: [
+ resolve({
+ browser: true,
+ }),
+ replace(replacements),
+ ],
+ };
+
+ if (minify) {
+ item.plugins.push(terser());
+ }
+
+ config.push(item);
+ });
+ });
+});
+
+export default config;
diff --git a/node_modules/@iconify/types/.prettierrc b/node_modules/@iconify/types/.prettierrc
new file mode 100644
index 0000000..103b29e
--- /dev/null
+++ b/node_modules/@iconify/types/.prettierrc
@@ -0,0 +1,8 @@
+{
+ "trailingComma": "es5",
+ "singleQuote": true,
+ "useTabs": true,
+ "semi": true,
+ "quoteProps": "consistent",
+ "endOfLine": "lf"
+}
diff --git a/node_modules/@iconify/types/README.md b/node_modules/@iconify/types/README.md
new file mode 100644
index 0000000..7480c51
--- /dev/null
+++ b/node_modules/@iconify/types/README.md
@@ -0,0 +1,459 @@
+# Iconify Types
+
+Type definitions for using Iconify icon sets with TypeScript.
+
+## Files structure
+
+Iconify icon sets are available in several formats:
+
+- Big JSON files that combine many icons in one file
+- Node.js packages split into individual icons
+
+### Icon format
+
+Each icon is represented by the `IconifyIcon` type. It is a simple object with multiple string, number or boolean attributes.
+
+The only required attribute is:
+
+- `body`: string. Value contains inner HTML of an icon as a string, for example ` `.
+
+Optional attributes are represented by type `IconifyOptional`. They are split into several types: dimensions (`IconifyDimenisons` type) and transformations (`IconifyTransformations` type).
+
+Dimensions attributes:
+
+- `width`: number. viewBox width, number. If missing, value is set to 16.
+- `height`: number. viewBox height, number. If missing, value is set to 16.
+- `left`: number. viewBox left, number. If missing, the value is set to 0.
+- `top`: number. viewBox top, number. If missing, the value is set to 0.
+
+Transformations:
+
+- `rotate`: number. Icon rotation. Iconify icons can be rotated in 90 degrees increments, allowing to reuse the same source icon for multiple icons, such as arrow-up being a copy of arrow-left rotated by 90 degrees. Values are 0 for 0 degrees, 1 for 90 degrees, 2 for 180 degrees, 3 for 270 degrees. The default value is 0.
+- `hFlip`: boolean. Horizontal flip. Similar to the rotation transformation, an icon can be flipped horizontally and vertically. It can be used to quickly create aliases, such as arrow-left being an alias of arrow-right, but with hFlip set to true. The default value is false.
+- `vFlip`: boolean. Vertical flip. The default value is false.
+
+Example of icon object:
+
+```js
+const mdiHandIcon = {
+ body: ' ',
+ width: 24,
+ height: 24,
+};
+```
+
+### Icon sets format
+
+Iconify icon sets format is available from multiple sources:
+
+- NPM package `@iconify/json` that includes all icon sets
+- API responses used by SVG framework
+
+Icon set format structure is available as the `IconifyJSON` type. It is an object with several fields:
+
+- `prefix`: string. Icon set prefix.
+- `icons`: object. Icons data. Value is an object that represents a set of icons, where the key is an icon name and value is `IconifyIcon` object (see "Icon format" above).
+- `aliases`: object. Icon aliases, similar to the `icons` object (see "Aliases" section below).
+
+Example:
+
+```json
+{
+ "prefix": "mdi",
+ "icons": {
+ "home": {
+ "body": "",
+ "width": 24,
+ "height": 24
+ },
+ "arrow-left": {
+ "body": "",
+ "width": 24,
+ "height": 24
+ }
+ }
+}
+```
+
+All icon properties except for `body` are optional and are represented by type `IconifyOptional`. Type `IconifyJSON` also extends type `IconifyOptional`, allowing all optional properties to be placed in the root object.
+
+If an icon is missing a property, look in the root object for the default value. If the root object does not have the default value, use Iconify default value for that property (see list of properties and default values in the "Icon format" section above).
+
+Default values in the root object make it possible to reduce duplication.
+
+Example:
+
+```json
+{
+ "prefix": "mdi",
+ "icons": {
+ "home": {
+ "body": ""
+ },
+ "arrow-left": {
+ "body": ""
+ }
+ },
+ "width": 24,
+ "height": 24
+}
+```
+
+In this example, both icons are 24x24, so width and height have been moved to the root object.
+
+Another example:
+
+```json
+{
+ "prefix": "fa-solid",
+ "icons": {
+ "arrow-left": {
+ "body": "",
+ "width": 448
+ },
+ "arrow-circle-left": {
+ "body": ""
+ },
+ "barcode": {
+ "body": ""
+ }
+ },
+ "width": 512,
+ "height": 512
+}
+```
+
+In this example `arrow-circle-left` and `barcode` have width of 512, `arrow-left` has width of 448. All icons have a height of 512.
+
+#### Aliases
+
+In addition to `icons`, another important field in icon set object is `aliases`.
+
+Aliases object is similar to icons object, except that instead of icon body icons reference another icon.
+
+Each entry has the same attributes as an icon, except for `body` and has required attribute `parent` that contains the name of the parent icon. The parent icon must be present in the icon set file.
+
+Example:
+
+```json
+{
+ "prefix": "fa",
+ "icons": {
+ "automobile": {
+ "body": "",
+ "width": 2048,
+ "height": 1600
+ }
+ },
+ "aliases": {
+ "car": {
+ "parent": "automobile"
+ }
+ }
+}
+```
+
+In this example `car` is an alias of `automobile`, allowing to use the same icon by multiple names.
+
+Another example:
+
+```json
+{
+ "prefix": "fa",
+ "icons": {
+ "caret-left": {
+ "body": "",
+ "width": 576,
+ "height": 1280
+ }
+ },
+ "aliases": {
+ "caret-right": {
+ "parent": "caret-left",
+ "hFlip": true
+ }
+ }
+}
+```
+
+In this example `caret-right` is alias of `caret-left`, but with additional `hFlip` attribute. It is identical to this:
+
+```json
+{
+ "prefix": "fa",
+ "icons": {
+ "caret-left": {
+ "body": ""
+ },
+ "caret-right": {
+ "body": "",
+ "hFlip": true
+ }
+ },
+ "width": 576,
+ "height": 1280
+}
+```
+
+##### Merging alias attributes
+
+If both icon and alias have same attribute, following rules apply:
+
+- `rotate`: attributes are combined. For example, icon has rotate = 1, alias has rotate = 1. Result will have rotate = 2. To prevent overflow, if rotate > 3, rotate = rotate - 4.
+- `hFlip` and `vFlip`: attributes are combined. For example, icon has hFlip = true, alias also has hFlip = true (icon.hFlip !== alias.hFlip). Result is false. false + false = false, false + true = true, true + true = false.
+- other attributes are overwritten.
+
+Example:
+
+```json
+{
+ "prefix": "fa",
+ "icons": {
+ "caret-left": {
+ "body": "",
+ "hFlip": true,
+ "width": 576,
+ "height": 1280
+ }
+ },
+ "aliases": {
+ "caret-left-compact": {
+ "parent": "caret-left",
+ "left": 64,
+ "width": 448
+ },
+ "caret-right": {
+ "parent": "caret-left",
+ "hFlip": true
+ }
+ }
+}
+```
+
+is identical to:
+
+```json
+{
+ "prefix": "fa",
+ "icons": {
+ "caret-left": {
+ "body": "",
+ "hFlip": true
+ },
+ "caret-left-compact": {
+ "body": "",
+ "hFlip": true, // from caret-left
+ "left": 64, // overwritten
+ "width": 448 // overwritten
+ },
+ "caret-right": {
+ "body": ""
+ // hFlip = false, which is default value, so it was removed
+ }
+ },
+ "width": 576,
+ "height": 1280
+}
+```
+
+#### Metadata
+
+Icon set files might also contain the metadata. That data is used for browsing icons, searching icons, exporting icon sets as fonts.
+
+Metadata is a combination of several types, represented as type `IconifyMetaData`.
+
+##### Icon set information
+
+Icon set information is part of the metadata, it includes information about an author and license.
+
+Example:
+
+```json
+{
+ "prefix": "dashicons",
+ "info": {
+ "name": "Dashicons",
+ "total": 304,
+ "author": {
+ "name": "WordPress",
+ "url": "https://github.com/WordPress/dashicons"
+ },
+ "license": {
+ "title": "GPL 2.0",
+ "spdx": "GPL-2.0-only",
+ "url": "http://www.gnu.org/licenses/gpl-2.0.html"
+ },
+ "version": "0.9.0",
+ "samples": ["shortcode", "businessperson", "editor-expand"],
+ "height": 20,
+ "category": "General",
+ "palette": false
+ },
+ "icons": {
+ // Icons here
+ }
+}
+```
+
+##### Info
+
+Information block is part of the metadata, it is used for browsing or searching icon sets. It also contains the license for icons in the icon set and information about the author.
+
+Info block is represented by the type `IconifyInfo`. You can see an example above in "info" property.
+
+IconifyInfo type has the following properties, most of them are optional:
+
+- `name`: string. Icon set name. This field is always set.
+- `total`: number. The total number of icons, optional.
+- `version`: string. The current version, optional.
+- `author`: object. Information about the author, always set. Author information has the following properties:
+ - `name`: string. Author name. This field is always set.
+ - `url`: string. Link to icon set, optional. Usually links to GitHub repository.
+- `license`: object. Information about the license, always set. License information has the following properties:
+ - `title`: string. License title. This field is always set.
+ - `spdx`: string. SPDX license identifier, optional.
+ - `url`: string. Link to the license, optional.
+- `samples`: string[]. Value is an array of icon names that should be used as samples when showing the icon set in an icon sets list.
+- `height`: number | number[]. Value is a number or array of numbers, values are pixel grids used in the icon set. If any icons in an icon set do not match the grid, this attribute should not be set.
+- `displayHeight`: number. The height value that should be used for displaying samples. Value is a number between 16 and 30 (inclusive).
+
+##### Characters map
+
+Characters map is part of the metadata, it is used for icon sets that are either imported from icon fonts or intended to be exported to icon font.
+
+Characters map allows storing characters for export as well as searching icons by character used in an icon font.
+
+It is a simple object, where the key is character code in hexadecimal form, value is an icon name.
+
+Important: each icon can have multiple characters!
+
+Example:
+
+```json
+{
+ "prefix": "fa",
+ "icons": {
+ // Icons here
+ },
+ "chars": {
+ "f000": "glass",
+ "f001": "music",
+ "f002": "search",
+ "f003": "envelope-o",
+ "f004": "heart",
+ "f005": "star"
+ // and so on...
+ }
+}
+```
+
+##### Categories
+
+Categories are part of the metadata, used to allow filtering icons when showing the entire icons set.
+
+Categories list is a simple object, where the key is category name, value is the list of icons.
+
+Important: each icon can belong to multiple categories!
+
+```json
+{
+ "prefix": "fa-solid",
+ "icons": {
+ // Icons here
+ },
+ "categories": {
+ "Accessibility": [
+ "american-sign-language-interpreting",
+ "assistive-listening-systems",
+ "audio-description",
+ "blind",
+ "braille",
+ "closed-captioning",
+ "deaf",
+ "low-vision",
+ "phone-volume",
+ "question-circle",
+ "sign-language",
+ "tty",
+ "universal-access",
+ "wheelchair"
+ ],
+ "Alert": [
+ "bell",
+ "bell-slash",
+ "exclamation",
+ "exclamation-circle",
+ "exclamation-triangle",
+ "radiation",
+ "radiation-alt",
+ "skull-crossbones"
+ ]
+ // and so on...
+ }
+}
+```
+
+##### Themes
+
+Themes are part of the metadata, similar to categories, but using prefixes or suffixes to identify icons that belong to a theme.
+
+This is useful when icon set has variations of icons, such as "baseline-_", "outline-_".
+
+Example:
+
+```json
+{
+ "prefix": "ic",
+ "icons": {
+ // Icons here
+ },
+ "themes": {
+ "baseline": {
+ "title": "Baseline",
+ "prefix": "baseline-"
+ },
+ "outline": {
+ "title": "Outline",
+ "prefix": "outline-"
+ },
+ "round": {
+ "title": "Round",
+ "prefix": "round-"
+ },
+ "sharp": {
+ "title": "Sharp",
+ "prefix": "sharp-"
+ },
+ "twotone": {
+ "title": "Two-Tone",
+ "prefix": "twotone-"
+ }
+ }
+}
+```
+
+Each theme can have one of the attributes: `prefix` or `suffix`. The prefix must end with `-`, suffix must start with `-`.
+
+In an example above, all icons that start with "baseline-", such as "baseline-home", are considered part of the "Baseline" theme.
+
+#### All attributes
+
+For an example of full icon set files that include metadata, look in icon set files in `@iconify/json` package or browse it at GitHub: [https://github.com/iconify/collections-json](https://github.com/iconify/collections-json)
+
+For an example of individual icons, look in JavaScript files in NPM packages such as `@iconify/icons-mdi`.
+
+## Usage
+
+This repository is intended to be used with any Iconify packages.
+
+At the moment of writing, multiple Iconify packages are written without TypeScript. At the beginning of the year 2020 plan is to rewrite all of them with TypeScript to make sure data is consistent and avoid duplication, this package will be used for sharing types between Iconify packages.
+
+## License
+
+This package is licensed under MIT license.
+
+`SPDX-License-Identifier: MIT`
+
+Previous versions of this package were dual-licensed under Apache 2.0 and GPL 2.0 licence, which was messy and confusing. This was later changed to MIT for simplicity.
+
+© 2021 - 2022 Vjacheslav Trushkin / Iconify OÜ
diff --git a/node_modules/@iconify/types/license.txt b/node_modules/@iconify/types/license.txt
new file mode 100644
index 0000000..4150193
--- /dev/null
+++ b/node_modules/@iconify/types/license.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021 - 2022 Vjacheslav Trushkin / Iconify OÜ
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/node_modules/@iconify/types/package.json b/node_modules/@iconify/types/package.json
new file mode 100644
index 0000000..44b759b
--- /dev/null
+++ b/node_modules/@iconify/types/package.json
@@ -0,0 +1,23 @@
+{
+ "name": "@iconify/types",
+ "type": "module",
+ "description": "Types for Iconify data",
+ "version": "2.0.0",
+ "author": "Vjacheslav Trushkin",
+ "license": "MIT",
+ "main": "./types.js",
+ "types": "./types.d.ts",
+ "bugs": "https://github.com/iconify/iconify/issues",
+ "homepage": "https://github.com/iconify/iconify",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/iconify/iconify.git",
+ "directory": "packages/types"
+ },
+ "devDependencies": {
+ "typescript": "^4.8.2"
+ },
+ "scripts": {
+ "test": "tsc --noEmit --strict --typeRoots '[]' types.d.ts"
+ }
+}
\ No newline at end of file
diff --git a/node_modules/@iconify/types/pnpm-lock.yaml b/node_modules/@iconify/types/pnpm-lock.yaml
new file mode 100644
index 0000000..d48c5a6
--- /dev/null
+++ b/node_modules/@iconify/types/pnpm-lock.yaml
@@ -0,0 +1,15 @@
+lockfileVersion: 5.4
+
+specifiers:
+ typescript: ^4.6.2
+
+devDependencies:
+ typescript: 4.7.4
+
+packages:
+
+ /typescript/4.7.4:
+ resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==}
+ engines: {node: '>=4.2.0'}
+ hasBin: true
+ dev: true
diff --git a/node_modules/@iconify/types/provider.d.ts b/node_modules/@iconify/types/provider.d.ts
new file mode 100644
index 0000000..ba38007
--- /dev/null
+++ b/node_modules/@iconify/types/provider.d.ts
@@ -0,0 +1,44 @@
+/**
+ * Raw data sent by API
+ */
+
+// Links
+export interface APIProviderRawDataLinks {
+ // Collections list
+ home?: string;
+ // Collection. Available variables: {prefix}
+ collection?: string;
+ // Icon. Available variables: {prefix}, {name}
+ icon?: string;
+}
+
+// NPM
+export interface APIProviderRawDataNPM {
+ // Package name for installation. Available variables: {prefix}
+ package?: string;
+
+ // Icon import source. Available variables: {prefix}, {name}
+ icon?: string;
+}
+
+// Main type
+export interface APIProviderRawData {
+ // Provider name (as used in icon names)
+ provider: string;
+
+ // Provider name (human readable version)
+ title?: string;
+
+ // API link(s), though they are usually redundant because API end point is used to retrieve data
+ api?: string | string[];
+
+ // Links to website
+ links?: APIProviderRawDataLinks;
+
+ // NPM packages for icons, used when showing code samples
+ npm?: APIProviderRawDataNPM;
+
+ // SVG generator URL, including full host name, {prefix} and {name} variables
+ // Example: 'https://api.iconify.design/{prefix}/{name}.svg'
+ svg?: string;
+}
diff --git a/node_modules/@iconify/types/provider.js b/node_modules/@iconify/types/provider.js
new file mode 100644
index 0000000..32027dc
--- /dev/null
+++ b/node_modules/@iconify/types/provider.js
@@ -0,0 +1,3 @@
+/**
+ * Empty file. This repository contains only TypeScript types
+ */
diff --git a/node_modules/@iconify/types/types.d.ts b/node_modules/@iconify/types/types.d.ts
new file mode 100644
index 0000000..df92487
--- /dev/null
+++ b/node_modules/@iconify/types/types.d.ts
@@ -0,0 +1,272 @@
+/**
+ * Icon dimensions.
+ *
+ * Used in:
+ * icon (as is)
+ * alias (overwrite icon's properties)
+ * root of JSON file (default values)
+ */
+export interface IconifyDimenisons {
+ // Left position of viewBox.
+ // Defaults to 0.
+ left?: number;
+
+ // Top position of viewBox.
+ // Defaults to 0.
+ top?: number;
+
+ // Width of viewBox.
+ // Defaults to 16.
+ width?: number;
+
+ // Height of viewBox.
+ // Defaults to 16.
+ height?: number;
+}
+
+/**
+ * Icon transformations.
+ *
+ * Used in:
+ * icon (as is)
+ * alias (merged with icon's properties)
+ */
+export interface IconifyTransformations {
+ // Number of 90 degrees rotations.
+ // 0 = 0, 1 = 90deg and so on.
+ // Defaults to 0.
+ // When merged (such as alias + icon), result is icon.rotation + alias.rotation.
+ rotate?: number;
+
+ // Horizontal flip.
+ // Defaults to false.
+ // When merged, result is icon.hFlip !== alias.hFlip
+ hFlip?: boolean;
+
+ // Vertical flip. (see hFlip comments)
+ vFlip?: boolean;
+}
+
+/**
+ * Combination of dimensions and transformations.
+ */
+export interface IconifyOptional
+ extends IconifyDimenisons,
+ IconifyTransformations {
+ //
+}
+
+/**
+ * Alias.
+ */
+export interface IconifyAlias extends IconifyOptional {
+ // Parent icon index without prefix, required.
+ parent: string;
+
+ // IconifyOptional properties.
+ // Alias should have only properties that it overrides.
+ // Transformations are merged, not overridden. See IconifyTransformations comments.
+}
+
+/**
+ * Icon.
+ */
+export interface IconifyIcon extends IconifyOptional {
+ // Icon body: , required.
+ body: string;
+
+ // IconifyOptional properties.
+ // If property is missing in JSON file, look in root object for default value.
+}
+
+/**
+ * Icon with optional parameters that are provided by API and affect only search
+ */
+interface APIIconAttributes {
+ // True if icon is hidden.
+ // Used in icon sets to keep icons that no longer exist, but should still be accessible
+ // from API, preventing websites from breaking when icon is removed by developer.
+ hidden?: boolean;
+}
+
+export interface ExtendedIconifyIcon extends IconifyIcon, APIIconAttributes {}
+export interface ExtendedIconifyAlias extends IconifyAlias, APIIconAttributes {}
+
+/**
+ * "icons" field of JSON file.
+ */
+export interface IconifyIcons {
+ // Index is name of icon, without prefix. Value is ExtendedIconifyIcon object.
+ [index: string]: ExtendedIconifyIcon;
+}
+
+/**
+ * "aliases" field of JSON file.
+ */
+export interface IconifyAliases {
+ // Index is name of icon, without prefix. Value is ExtendedIconifyAlias object.
+ [index: string]: ExtendedIconifyAlias;
+}
+
+/**
+ * Icon set information block.
+ */
+export interface IconifyInfo {
+ // Icon set name.
+ name: string;
+
+ // Total number of icons.
+ total?: number;
+
+ // Version string.
+ version?: string;
+
+ // Author information.
+ author: {
+ // Author name.
+ name: string;
+
+ // Link to author's website or icon set website.
+ url?: string;
+ };
+
+ // License
+ license: {
+ // Human readable license.
+ title: string;
+
+ // SPDX license identifier.
+ spdx?: string;
+
+ // License URL.
+ url?: string;
+ };
+
+ // Array of icons that should be used for samples in icon sets list.
+ samples?: string[];
+
+ // Icon grid: number or array of numbers.
+ height?: number | number[];
+
+ // Display height for samples: 16 - 24
+ displayHeight?: number;
+
+ // Category on Iconify collections list.
+ category?: string;
+
+ // List of tags to group similar icon sets.
+ tags?: string[];
+
+ // Palette status. True if icons have predefined color scheme, false if icons use currentColor.
+ // Ideally, icon set should not mix icons with and without palette to simplify search.
+ palette?: boolean;
+
+ // If true, icon set should not appear in icon sets list.
+ hidden?: boolean;
+}
+
+/**
+ * Optional themes, old format.
+ *
+ * Deprecated because format is unnecessary complicated. Key is meaningless, suffixes and prefixes are mixed together.
+ */
+export interface LegacyIconifyThemes {
+ // Key is unique string.
+ [index: string]: {
+ // Theme title.
+ title: string;
+
+ // Icon prefix or suffix, including dash. All icons that start with prefix and end with suffix belong to theme.
+ prefix?: string; // Example: 'baseline-'
+ suffix?: string; // Example: '-filled'
+ };
+}
+
+/**
+ * Characters used in font.
+ */
+export interface IconifyChars {
+ // Index is character, such as "f000".
+ // Value is icon name.
+ [index: string]: string;
+}
+
+/**
+ * Icon categories
+ */
+export interface IconifyCategories {
+ // Index is category title, such as "Weather".
+ // Value is array of icons that belong to that category.
+ // Each icon can belong to multiple categories or no categories.
+ [index: string]: string[];
+}
+
+/**
+ * Meta data stored in JSON file, used for browsing icon set.
+ */
+export interface IconifyMetaData {
+ // Icon set information block. Used for public icon sets, can be skipped for private icon sets.
+ info?: IconifyInfo;
+
+ // Characters used in font. Used for searching by character for icon sets imported from font, exporting icon set to font.
+ chars?: IconifyChars;
+
+ // Categories. Used for filtering icons.
+ categories?: IconifyCategories;
+
+ // Optional themes (old format).
+ themes?: LegacyIconifyThemes;
+
+ // Optional themes (new format). Key is prefix or suffix, value is title.
+ prefixes?: Record;
+ suffixes?: Record;
+}
+
+/**
+ * JSON structure, contains only icon data
+ */
+export interface IconifyJSONIconsData extends IconifyDimenisons {
+ // Prefix for icons in JSON file, required.
+ prefix: string;
+
+ // API provider, optional.
+ provider?: string;
+
+ // List of icons, required.
+ icons: IconifyIcons;
+
+ // Optional aliases.
+ aliases?: IconifyAliases;
+
+ // IconifyDimenisons properties that are used as default viewbox for icons when icon is missing value.
+ // If viewbox exists in both icon and root, use value from icon.
+ // This is used to reduce duplication.
+}
+
+/**
+ * JSON structure.
+ *
+ * All optional values can exist in root of JSON file, used as defaults.
+ */
+export interface IconifyJSON extends IconifyJSONIconsData, IconifyMetaData {
+ // Last modification time of icons. Unix time stamp in seconds.
+ // Time is calculated only for icon data, ignoring metadata.
+ // Used to invalidate icons cache in components.
+ lastModified?: number;
+
+ // Optional list of missing icons. Returned by Iconify API when querying for icons that do not exist.
+ not_found?: string[];
+}
+
+/**
+ * Structure of exports '@iconify-json/*' packages.
+ *
+ * These are small packages, one per icon set, that split JSON structure into multiple files to reduce
+ * amount of data imported from package.
+ */
+export interface IconifyJSONPackageExports {
+ info: IconifyInfo;
+ icons: IconifyJSON;
+ metadata: IconifyMetaData;
+ chars: IconifyChars;
+}
diff --git a/node_modules/@iconify/types/types.js b/node_modules/@iconify/types/types.js
new file mode 100644
index 0000000..32027dc
--- /dev/null
+++ b/node_modules/@iconify/types/types.js
@@ -0,0 +1,3 @@
+/**
+ * Empty file. This repository contains only TypeScript types
+ */
diff --git a/node_modules/body-parser/HISTORY.md b/node_modules/body-parser/HISTORY.md
new file mode 100644
index 0000000..b892491
--- /dev/null
+++ b/node_modules/body-parser/HISTORY.md
@@ -0,0 +1,665 @@
+1.20.2 / 2023-02-21
+===================
+
+ * Fix strict json error message on Node.js 19+
+ * deps: content-type@~1.0.5
+ - perf: skip value escaping when unnecessary
+ * deps: raw-body@2.5.2
+
+1.20.1 / 2022-10-06
+===================
+
+ * deps: qs@6.11.0
+ * perf: remove unnecessary object clone
+
+1.20.0 / 2022-04-02
+===================
+
+ * Fix error message for json parse whitespace in `strict`
+ * Fix internal error when inflated body exceeds limit
+ * Prevent loss of async hooks context
+ * Prevent hanging when request already read
+ * deps: depd@2.0.0
+ - Replace internal `eval` usage with `Function` constructor
+ - Use instance methods on `process` to check for listeners
+ * deps: http-errors@2.0.0
+ - deps: depd@2.0.0
+ - deps: statuses@2.0.1
+ * deps: on-finished@2.4.1
+ * deps: qs@6.10.3
+ * deps: raw-body@2.5.1
+ - deps: http-errors@2.0.0
+
+1.19.2 / 2022-02-15
+===================
+
+ * deps: bytes@3.1.2
+ * deps: qs@6.9.7
+ * Fix handling of `__proto__` keys
+ * deps: raw-body@2.4.3
+ - deps: bytes@3.1.2
+
+1.19.1 / 2021-12-10
+===================
+
+ * deps: bytes@3.1.1
+ * deps: http-errors@1.8.1
+ - deps: inherits@2.0.4
+ - deps: toidentifier@1.0.1
+ - deps: setprototypeof@1.2.0
+ * deps: qs@6.9.6
+ * deps: raw-body@2.4.2
+ - deps: bytes@3.1.1
+ - deps: http-errors@1.8.1
+ * deps: safe-buffer@5.2.1
+ * deps: type-is@~1.6.18
+
+1.19.0 / 2019-04-25
+===================
+
+ * deps: bytes@3.1.0
+ - Add petabyte (`pb`) support
+ * deps: http-errors@1.7.2
+ - Set constructor name when possible
+ - deps: setprototypeof@1.1.1
+ - deps: statuses@'>= 1.5.0 < 2'
+ * deps: iconv-lite@0.4.24
+ - Added encoding MIK
+ * deps: qs@6.7.0
+ - Fix parsing array brackets after index
+ * deps: raw-body@2.4.0
+ - deps: bytes@3.1.0
+ - deps: http-errors@1.7.2
+ - deps: iconv-lite@0.4.24
+ * deps: type-is@~1.6.17
+ - deps: mime-types@~2.1.24
+ - perf: prevent internal `throw` on invalid type
+
+1.18.3 / 2018-05-14
+===================
+
+ * Fix stack trace for strict json parse error
+ * deps: depd@~1.1.2
+ - perf: remove argument reassignment
+ * deps: http-errors@~1.6.3
+ - deps: depd@~1.1.2
+ - deps: setprototypeof@1.1.0
+ - deps: statuses@'>= 1.3.1 < 2'
+ * deps: iconv-lite@0.4.23
+ - Fix loading encoding with year appended
+ - Fix deprecation warnings on Node.js 10+
+ * deps: qs@6.5.2
+ * deps: raw-body@2.3.3
+ - deps: http-errors@1.6.3
+ - deps: iconv-lite@0.4.23
+ * deps: type-is@~1.6.16
+ - deps: mime-types@~2.1.18
+
+1.18.2 / 2017-09-22
+===================
+
+ * deps: debug@2.6.9
+ * perf: remove argument reassignment
+
+1.18.1 / 2017-09-12
+===================
+
+ * deps: content-type@~1.0.4
+ - perf: remove argument reassignment
+ - perf: skip parameter parsing when no parameters
+ * deps: iconv-lite@0.4.19
+ - Fix ISO-8859-1 regression
+ - Update Windows-1255
+ * deps: qs@6.5.1
+ - Fix parsing & compacting very deep objects
+ * deps: raw-body@2.3.2
+ - deps: iconv-lite@0.4.19
+
+1.18.0 / 2017-09-08
+===================
+
+ * Fix JSON strict violation error to match native parse error
+ * Include the `body` property on verify errors
+ * Include the `type` property on all generated errors
+ * Use `http-errors` to set status code on errors
+ * deps: bytes@3.0.0
+ * deps: debug@2.6.8
+ * deps: depd@~1.1.1
+ - Remove unnecessary `Buffer` loading
+ * deps: http-errors@~1.6.2
+ - deps: depd@1.1.1
+ * deps: iconv-lite@0.4.18
+ - Add support for React Native
+ - Add a warning if not loaded as utf-8
+ - Fix CESU-8 decoding in Node.js 8
+ - Improve speed of ISO-8859-1 encoding
+ * deps: qs@6.5.0
+ * deps: raw-body@2.3.1
+ - Use `http-errors` for standard emitted errors
+ - deps: bytes@3.0.0
+ - deps: iconv-lite@0.4.18
+ - perf: skip buffer decoding on overage chunk
+ * perf: prevent internal `throw` when missing charset
+
+1.17.2 / 2017-05-17
+===================
+
+ * deps: debug@2.6.7
+ - Fix `DEBUG_MAX_ARRAY_LENGTH`
+ - deps: ms@2.0.0
+ * deps: type-is@~1.6.15
+ - deps: mime-types@~2.1.15
+
+1.17.1 / 2017-03-06
+===================
+
+ * deps: qs@6.4.0
+ - Fix regression parsing keys starting with `[`
+
+1.17.0 / 2017-03-01
+===================
+
+ * deps: http-errors@~1.6.1
+ - Make `message` property enumerable for `HttpError`s
+ - deps: setprototypeof@1.0.3
+ * deps: qs@6.3.1
+ - Fix compacting nested arrays
+
+1.16.1 / 2017-02-10
+===================
+
+ * deps: debug@2.6.1
+ - Fix deprecation messages in WebStorm and other editors
+ - Undeprecate `DEBUG_FD` set to `1` or `2`
+
+1.16.0 / 2017-01-17
+===================
+
+ * deps: debug@2.6.0
+ - Allow colors in workers
+ - Deprecated `DEBUG_FD` environment variable
+ - Fix error when running under React Native
+ - Use same color for same namespace
+ - deps: ms@0.7.2
+ * deps: http-errors@~1.5.1
+ - deps: inherits@2.0.3
+ - deps: setprototypeof@1.0.2
+ - deps: statuses@'>= 1.3.1 < 2'
+ * deps: iconv-lite@0.4.15
+ - Added encoding MS-31J
+ - Added encoding MS-932
+ - Added encoding MS-936
+ - Added encoding MS-949
+ - Added encoding MS-950
+ - Fix GBK/GB18030 handling of Euro character
+ * deps: qs@6.2.1
+ - Fix array parsing from skipping empty values
+ * deps: raw-body@~2.2.0
+ - deps: iconv-lite@0.4.15
+ * deps: type-is@~1.6.14
+ - deps: mime-types@~2.1.13
+
+1.15.2 / 2016-06-19
+===================
+
+ * deps: bytes@2.4.0
+ * deps: content-type@~1.0.2
+ - perf: enable strict mode
+ * deps: http-errors@~1.5.0
+ - Use `setprototypeof` module to replace `__proto__` setting
+ - deps: statuses@'>= 1.3.0 < 2'
+ - perf: enable strict mode
+ * deps: qs@6.2.0
+ * deps: raw-body@~2.1.7
+ - deps: bytes@2.4.0
+ - perf: remove double-cleanup on happy path
+ * deps: type-is@~1.6.13
+ - deps: mime-types@~2.1.11
+
+1.15.1 / 2016-05-05
+===================
+
+ * deps: bytes@2.3.0
+ - Drop partial bytes on all parsed units
+ - Fix parsing byte string that looks like hex
+ * deps: raw-body@~2.1.6
+ - deps: bytes@2.3.0
+ * deps: type-is@~1.6.12
+ - deps: mime-types@~2.1.10
+
+1.15.0 / 2016-02-10
+===================
+
+ * deps: http-errors@~1.4.0
+ - Add `HttpError` export, for `err instanceof createError.HttpError`
+ - deps: inherits@2.0.1
+ - deps: statuses@'>= 1.2.1 < 2'
+ * deps: qs@6.1.0
+ * deps: type-is@~1.6.11
+ - deps: mime-types@~2.1.9
+
+1.14.2 / 2015-12-16
+===================
+
+ * deps: bytes@2.2.0
+ * deps: iconv-lite@0.4.13
+ * deps: qs@5.2.0
+ * deps: raw-body@~2.1.5
+ - deps: bytes@2.2.0
+ - deps: iconv-lite@0.4.13
+ * deps: type-is@~1.6.10
+ - deps: mime-types@~2.1.8
+
+1.14.1 / 2015-09-27
+===================
+
+ * Fix issue where invalid charset results in 400 when `verify` used
+ * deps: iconv-lite@0.4.12
+ - Fix CESU-8 decoding in Node.js 4.x
+ * deps: raw-body@~2.1.4
+ - Fix masking critical errors from `iconv-lite`
+ - deps: iconv-lite@0.4.12
+ * deps: type-is@~1.6.9
+ - deps: mime-types@~2.1.7
+
+1.14.0 / 2015-09-16
+===================
+
+ * Fix JSON strict parse error to match syntax errors
+ * Provide static `require` analysis in `urlencoded` parser
+ * deps: depd@~1.1.0
+ - Support web browser loading
+ * deps: qs@5.1.0
+ * deps: raw-body@~2.1.3
+ - Fix sync callback when attaching data listener causes sync read
+ * deps: type-is@~1.6.8
+ - Fix type error when given invalid type to match against
+ - deps: mime-types@~2.1.6
+
+1.13.3 / 2015-07-31
+===================
+
+ * deps: type-is@~1.6.6
+ - deps: mime-types@~2.1.4
+
+1.13.2 / 2015-07-05
+===================
+
+ * deps: iconv-lite@0.4.11
+ * deps: qs@4.0.0
+ - Fix dropping parameters like `hasOwnProperty`
+ - Fix user-visible incompatibilities from 3.1.0
+ - Fix various parsing edge cases
+ * deps: raw-body@~2.1.2
+ - Fix error stack traces to skip `makeError`
+ - deps: iconv-lite@0.4.11
+ * deps: type-is@~1.6.4
+ - deps: mime-types@~2.1.2
+ - perf: enable strict mode
+ - perf: remove argument reassignment
+
+1.13.1 / 2015-06-16
+===================
+
+ * deps: qs@2.4.2
+ - Downgraded from 3.1.0 because of user-visible incompatibilities
+
+1.13.0 / 2015-06-14
+===================
+
+ * Add `statusCode` property on `Error`s, in addition to `status`
+ * Change `type` default to `application/json` for JSON parser
+ * Change `type` default to `application/x-www-form-urlencoded` for urlencoded parser
+ * Provide static `require` analysis
+ * Use the `http-errors` module to generate errors
+ * deps: bytes@2.1.0
+ - Slight optimizations
+ * deps: iconv-lite@0.4.10
+ - The encoding UTF-16 without BOM now defaults to UTF-16LE when detection fails
+ - Leading BOM is now removed when decoding
+ * deps: on-finished@~2.3.0
+ - Add defined behavior for HTTP `CONNECT` requests
+ - Add defined behavior for HTTP `Upgrade` requests
+ - deps: ee-first@1.1.1
+ * deps: qs@3.1.0
+ - Fix dropping parameters like `hasOwnProperty`
+ - Fix various parsing edge cases
+ - Parsed object now has `null` prototype
+ * deps: raw-body@~2.1.1
+ - Use `unpipe` module for unpiping requests
+ - deps: iconv-lite@0.4.10
+ * deps: type-is@~1.6.3
+ - deps: mime-types@~2.1.1
+ - perf: reduce try block size
+ - perf: remove bitwise operations
+ * perf: enable strict mode
+ * perf: remove argument reassignment
+ * perf: remove delete call
+
+1.12.4 / 2015-05-10
+===================
+
+ * deps: debug@~2.2.0
+ * deps: qs@2.4.2
+ - Fix allowing parameters like `constructor`
+ * deps: on-finished@~2.2.1
+ * deps: raw-body@~2.0.1
+ - Fix a false-positive when unpiping in Node.js 0.8
+ - deps: bytes@2.0.1
+ * deps: type-is@~1.6.2
+ - deps: mime-types@~2.0.11
+
+1.12.3 / 2015-04-15
+===================
+
+ * Slight efficiency improvement when not debugging
+ * deps: depd@~1.0.1
+ * deps: iconv-lite@0.4.8
+ - Add encoding alias UNICODE-1-1-UTF-7
+ * deps: raw-body@1.3.4
+ - Fix hanging callback if request aborts during read
+ - deps: iconv-lite@0.4.8
+
+1.12.2 / 2015-03-16
+===================
+
+ * deps: qs@2.4.1
+ - Fix error when parameter `hasOwnProperty` is present
+
+1.12.1 / 2015-03-15
+===================
+
+ * deps: debug@~2.1.3
+ - Fix high intensity foreground color for bold
+ - deps: ms@0.7.0
+ * deps: type-is@~1.6.1
+ - deps: mime-types@~2.0.10
+
+1.12.0 / 2015-02-13
+===================
+
+ * add `debug` messages
+ * accept a function for the `type` option
+ * use `content-type` to parse `Content-Type` headers
+ * deps: iconv-lite@0.4.7
+ - Gracefully support enumerables on `Object.prototype`
+ * deps: raw-body@1.3.3
+ - deps: iconv-lite@0.4.7
+ * deps: type-is@~1.6.0
+ - fix argument reassignment
+ - fix false-positives in `hasBody` `Transfer-Encoding` check
+ - support wildcard for both type and subtype (`*/*`)
+ - deps: mime-types@~2.0.9
+
+1.11.0 / 2015-01-30
+===================
+
+ * make internal `extended: true` depth limit infinity
+ * deps: type-is@~1.5.6
+ - deps: mime-types@~2.0.8
+
+1.10.2 / 2015-01-20
+===================
+
+ * deps: iconv-lite@0.4.6
+ - Fix rare aliases of single-byte encodings
+ * deps: raw-body@1.3.2
+ - deps: iconv-lite@0.4.6
+
+1.10.1 / 2015-01-01
+===================
+
+ * deps: on-finished@~2.2.0
+ * deps: type-is@~1.5.5
+ - deps: mime-types@~2.0.7
+
+1.10.0 / 2014-12-02
+===================
+
+ * make internal `extended: true` array limit dynamic
+
+1.9.3 / 2014-11-21
+==================
+
+ * deps: iconv-lite@0.4.5
+ - Fix Windows-31J and X-SJIS encoding support
+ * deps: qs@2.3.3
+ - Fix `arrayLimit` behavior
+ * deps: raw-body@1.3.1
+ - deps: iconv-lite@0.4.5
+ * deps: type-is@~1.5.3
+ - deps: mime-types@~2.0.3
+
+1.9.2 / 2014-10-27
+==================
+
+ * deps: qs@2.3.2
+ - Fix parsing of mixed objects and values
+
+1.9.1 / 2014-10-22
+==================
+
+ * deps: on-finished@~2.1.1
+ - Fix handling of pipelined requests
+ * deps: qs@2.3.0
+ - Fix parsing of mixed implicit and explicit arrays
+ * deps: type-is@~1.5.2
+ - deps: mime-types@~2.0.2
+
+1.9.0 / 2014-09-24
+==================
+
+ * include the charset in "unsupported charset" error message
+ * include the encoding in "unsupported content encoding" error message
+ * deps: depd@~1.0.0
+
+1.8.4 / 2014-09-23
+==================
+
+ * fix content encoding to be case-insensitive
+
+1.8.3 / 2014-09-19
+==================
+
+ * deps: qs@2.2.4
+ - Fix issue with object keys starting with numbers truncated
+
+1.8.2 / 2014-09-15
+==================
+
+ * deps: depd@0.4.5
+
+1.8.1 / 2014-09-07
+==================
+
+ * deps: media-typer@0.3.0
+ * deps: type-is@~1.5.1
+
+1.8.0 / 2014-09-05
+==================
+
+ * make empty-body-handling consistent between chunked requests
+ - empty `json` produces `{}`
+ - empty `raw` produces `new Buffer(0)`
+ - empty `text` produces `''`
+ - empty `urlencoded` produces `{}`
+ * deps: qs@2.2.3
+ - Fix issue where first empty value in array is discarded
+ * deps: type-is@~1.5.0
+ - fix `hasbody` to be true for `content-length: 0`
+
+1.7.0 / 2014-09-01
+==================
+
+ * add `parameterLimit` option to `urlencoded` parser
+ * change `urlencoded` extended array limit to 100
+ * respond with 413 when over `parameterLimit` in `urlencoded`
+
+1.6.7 / 2014-08-29
+==================
+
+ * deps: qs@2.2.2
+ - Remove unnecessary cloning
+
+1.6.6 / 2014-08-27
+==================
+
+ * deps: qs@2.2.0
+ - Array parsing fix
+ - Performance improvements
+
+1.6.5 / 2014-08-16
+==================
+
+ * deps: on-finished@2.1.0
+
+1.6.4 / 2014-08-14
+==================
+
+ * deps: qs@1.2.2
+
+1.6.3 / 2014-08-10
+==================
+
+ * deps: qs@1.2.1
+
+1.6.2 / 2014-08-07
+==================
+
+ * deps: qs@1.2.0
+ - Fix parsing array of objects
+
+1.6.1 / 2014-08-06
+==================
+
+ * deps: qs@1.1.0
+ - Accept urlencoded square brackets
+ - Accept empty values in implicit array notation
+
+1.6.0 / 2014-08-05
+==================
+
+ * deps: qs@1.0.2
+ - Complete rewrite
+ - Limits array length to 20
+ - Limits object depth to 5
+ - Limits parameters to 1,000
+
+1.5.2 / 2014-07-27
+==================
+
+ * deps: depd@0.4.4
+ - Work-around v8 generating empty stack traces
+
+1.5.1 / 2014-07-26
+==================
+
+ * deps: depd@0.4.3
+ - Fix exception when global `Error.stackTraceLimit` is too low
+
+1.5.0 / 2014-07-20
+==================
+
+ * deps: depd@0.4.2
+ - Add `TRACE_DEPRECATION` environment variable
+ - Remove non-standard grey color from color output
+ - Support `--no-deprecation` argument
+ - Support `--trace-deprecation` argument
+ * deps: iconv-lite@0.4.4
+ - Added encoding UTF-7
+ * deps: raw-body@1.3.0
+ - deps: iconv-lite@0.4.4
+ - Added encoding UTF-7
+ - Fix `Cannot switch to old mode now` error on Node.js 0.10+
+ * deps: type-is@~1.3.2
+
+1.4.3 / 2014-06-19
+==================
+
+ * deps: type-is@1.3.1
+ - fix global variable leak
+
+1.4.2 / 2014-06-19
+==================
+
+ * deps: type-is@1.3.0
+ - improve type parsing
+
+1.4.1 / 2014-06-19
+==================
+
+ * fix urlencoded extended deprecation message
+
+1.4.0 / 2014-06-19
+==================
+
+ * add `text` parser
+ * add `raw` parser
+ * check accepted charset in content-type (accepts utf-8)
+ * check accepted encoding in content-encoding (accepts identity)
+ * deprecate `bodyParser()` middleware; use `.json()` and `.urlencoded()` as needed
+ * deprecate `urlencoded()` without provided `extended` option
+ * lazy-load urlencoded parsers
+ * parsers split into files for reduced mem usage
+ * support gzip and deflate bodies
+ - set `inflate: false` to turn off
+ * deps: raw-body@1.2.2
+ - Support all encodings from `iconv-lite`
+
+1.3.1 / 2014-06-11
+==================
+
+ * deps: type-is@1.2.1
+ - Switch dependency from mime to mime-types@1.0.0
+
+1.3.0 / 2014-05-31
+==================
+
+ * add `extended` option to urlencoded parser
+
+1.2.2 / 2014-05-27
+==================
+
+ * deps: raw-body@1.1.6
+ - assert stream encoding on node.js 0.8
+ - assert stream encoding on node.js < 0.10.6
+ - deps: bytes@1
+
+1.2.1 / 2014-05-26
+==================
+
+ * invoke `next(err)` after request fully read
+ - prevents hung responses and socket hang ups
+
+1.2.0 / 2014-05-11
+==================
+
+ * add `verify` option
+ * deps: type-is@1.2.0
+ - support suffix matching
+
+1.1.2 / 2014-05-11
+==================
+
+ * improve json parser speed
+
+1.1.1 / 2014-05-11
+==================
+
+ * fix repeated limit parsing with every request
+
+1.1.0 / 2014-05-10
+==================
+
+ * add `type` option
+ * deps: pin for safety and consistency
+
+1.0.2 / 2014-04-14
+==================
+
+ * use `type-is` module
+
+1.0.1 / 2014-03-20
+==================
+
+ * lower default limits to 100kb
diff --git a/node_modules/body-parser/LICENSE b/node_modules/body-parser/LICENSE
new file mode 100644
index 0000000..386b7b6
--- /dev/null
+++ b/node_modules/body-parser/LICENSE
@@ -0,0 +1,23 @@
+(The MIT License)
+
+Copyright (c) 2014 Jonathan Ong
+Copyright (c) 2014-2015 Douglas Christopher Wilson
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/body-parser/README.md b/node_modules/body-parser/README.md
new file mode 100644
index 0000000..38553bf
--- /dev/null
+++ b/node_modules/body-parser/README.md
@@ -0,0 +1,465 @@
+# body-parser
+
+[![NPM Version][npm-version-image]][npm-url]
+[![NPM Downloads][npm-downloads-image]][npm-url]
+[![Build Status][ci-image]][ci-url]
+[![Test Coverage][coveralls-image]][coveralls-url]
+
+Node.js body parsing middleware.
+
+Parse incoming request bodies in a middleware before your handlers, available
+under the `req.body` property.
+
+**Note** As `req.body`'s shape is based on user-controlled input, all
+properties and values in this object are untrusted and should be validated
+before trusting. For example, `req.body.foo.toString()` may fail in multiple
+ways, for example the `foo` property may not be there or may not be a string,
+and `toString` may not be a function and instead a string or other user input.
+
+[Learn about the anatomy of an HTTP transaction in Node.js](https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/).
+
+_This does not handle multipart bodies_, due to their complex and typically
+large nature. For multipart bodies, you may be interested in the following
+modules:
+
+ * [busboy](https://www.npmjs.org/package/busboy#readme) and
+ [connect-busboy](https://www.npmjs.org/package/connect-busboy#readme)
+ * [multiparty](https://www.npmjs.org/package/multiparty#readme) and
+ [connect-multiparty](https://www.npmjs.org/package/connect-multiparty#readme)
+ * [formidable](https://www.npmjs.org/package/formidable#readme)
+ * [multer](https://www.npmjs.org/package/multer#readme)
+
+This module provides the following parsers:
+
+ * [JSON body parser](#bodyparserjsonoptions)
+ * [Raw body parser](#bodyparserrawoptions)
+ * [Text body parser](#bodyparsertextoptions)
+ * [URL-encoded form body parser](#bodyparserurlencodedoptions)
+
+Other body parsers you might be interested in:
+
+- [body](https://www.npmjs.org/package/body#readme)
+- [co-body](https://www.npmjs.org/package/co-body#readme)
+
+## Installation
+
+```sh
+$ npm install body-parser
+```
+
+## API
+
+```js
+var bodyParser = require('body-parser')
+```
+
+The `bodyParser` object exposes various factories to create middlewares. All
+middlewares will populate the `req.body` property with the parsed body when
+the `Content-Type` request header matches the `type` option, or an empty
+object (`{}`) if there was no body to parse, the `Content-Type` was not matched,
+or an error occurred.
+
+The various errors returned by this module are described in the
+[errors section](#errors).
+
+### bodyParser.json([options])
+
+Returns middleware that only parses `json` and only looks at requests where
+the `Content-Type` header matches the `type` option. This parser accepts any
+Unicode encoding of the body and supports automatic inflation of `gzip` and
+`deflate` encodings.
+
+A new `body` object containing the parsed data is populated on the `request`
+object after the middleware (i.e. `req.body`).
+
+#### Options
+
+The `json` function takes an optional `options` object that may contain any of
+the following keys:
+
+##### inflate
+
+When set to `true`, then deflated (compressed) bodies will be inflated; when
+`false`, deflated bodies are rejected. Defaults to `true`.
+
+##### limit
+
+Controls the maximum request body size. If this is a number, then the value
+specifies the number of bytes; if it is a string, the value is passed to the
+[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults
+to `'100kb'`.
+
+##### reviver
+
+The `reviver` option is passed directly to `JSON.parse` as the second
+argument. You can find more information on this argument
+[in the MDN documentation about JSON.parse](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse#Example.3A_Using_the_reviver_parameter).
+
+##### strict
+
+When set to `true`, will only accept arrays and objects; when `false` will
+accept anything `JSON.parse` accepts. Defaults to `true`.
+
+##### type
+
+The `type` option is used to determine what media type the middleware will
+parse. This option can be a string, array of strings, or a function. If not a
+function, `type` option is passed directly to the
+[type-is](https://www.npmjs.org/package/type-is#readme) library and this can
+be an extension name (like `json`), a mime type (like `application/json`), or
+a mime type with a wildcard (like `*/*` or `*/json`). If a function, the `type`
+option is called as `fn(req)` and the request is parsed if it returns a truthy
+value. Defaults to `application/json`.
+
+##### verify
+
+The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`,
+where `buf` is a `Buffer` of the raw request body and `encoding` is the
+encoding of the request. The parsing can be aborted by throwing an error.
+
+### bodyParser.raw([options])
+
+Returns middleware that parses all bodies as a `Buffer` and only looks at
+requests where the `Content-Type` header matches the `type` option. This
+parser supports automatic inflation of `gzip` and `deflate` encodings.
+
+A new `body` object containing the parsed data is populated on the `request`
+object after the middleware (i.e. `req.body`). This will be a `Buffer` object
+of the body.
+
+#### Options
+
+The `raw` function takes an optional `options` object that may contain any of
+the following keys:
+
+##### inflate
+
+When set to `true`, then deflated (compressed) bodies will be inflated; when
+`false`, deflated bodies are rejected. Defaults to `true`.
+
+##### limit
+
+Controls the maximum request body size. If this is a number, then the value
+specifies the number of bytes; if it is a string, the value is passed to the
+[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults
+to `'100kb'`.
+
+##### type
+
+The `type` option is used to determine what media type the middleware will
+parse. This option can be a string, array of strings, or a function.
+If not a function, `type` option is passed directly to the
+[type-is](https://www.npmjs.org/package/type-is#readme) library and this
+can be an extension name (like `bin`), a mime type (like
+`application/octet-stream`), or a mime type with a wildcard (like `*/*` or
+`application/*`). If a function, the `type` option is called as `fn(req)`
+and the request is parsed if it returns a truthy value. Defaults to
+`application/octet-stream`.
+
+##### verify
+
+The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`,
+where `buf` is a `Buffer` of the raw request body and `encoding` is the
+encoding of the request. The parsing can be aborted by throwing an error.
+
+### bodyParser.text([options])
+
+Returns middleware that parses all bodies as a string and only looks at
+requests where the `Content-Type` header matches the `type` option. This
+parser supports automatic inflation of `gzip` and `deflate` encodings.
+
+A new `body` string containing the parsed data is populated on the `request`
+object after the middleware (i.e. `req.body`). This will be a string of the
+body.
+
+#### Options
+
+The `text` function takes an optional `options` object that may contain any of
+the following keys:
+
+##### defaultCharset
+
+Specify the default character set for the text content if the charset is not
+specified in the `Content-Type` header of the request. Defaults to `utf-8`.
+
+##### inflate
+
+When set to `true`, then deflated (compressed) bodies will be inflated; when
+`false`, deflated bodies are rejected. Defaults to `true`.
+
+##### limit
+
+Controls the maximum request body size. If this is a number, then the value
+specifies the number of bytes; if it is a string, the value is passed to the
+[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults
+to `'100kb'`.
+
+##### type
+
+The `type` option is used to determine what media type the middleware will
+parse. This option can be a string, array of strings, or a function. If not
+a function, `type` option is passed directly to the
+[type-is](https://www.npmjs.org/package/type-is#readme) library and this can
+be an extension name (like `txt`), a mime type (like `text/plain`), or a mime
+type with a wildcard (like `*/*` or `text/*`). If a function, the `type`
+option is called as `fn(req)` and the request is parsed if it returns a
+truthy value. Defaults to `text/plain`.
+
+##### verify
+
+The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`,
+where `buf` is a `Buffer` of the raw request body and `encoding` is the
+encoding of the request. The parsing can be aborted by throwing an error.
+
+### bodyParser.urlencoded([options])
+
+Returns middleware that only parses `urlencoded` bodies and only looks at
+requests where the `Content-Type` header matches the `type` option. This
+parser accepts only UTF-8 encoding of the body and supports automatic
+inflation of `gzip` and `deflate` encodings.
+
+A new `body` object containing the parsed data is populated on the `request`
+object after the middleware (i.e. `req.body`). This object will contain
+key-value pairs, where the value can be a string or array (when `extended` is
+`false`), or any type (when `extended` is `true`).
+
+#### Options
+
+The `urlencoded` function takes an optional `options` object that may contain
+any of the following keys:
+
+##### extended
+
+The `extended` option allows to choose between parsing the URL-encoded data
+with the `querystring` library (when `false`) or the `qs` library (when
+`true`). The "extended" syntax allows for rich objects and arrays to be
+encoded into the URL-encoded format, allowing for a JSON-like experience
+with URL-encoded. For more information, please
+[see the qs library](https://www.npmjs.org/package/qs#readme).
+
+Defaults to `true`, but using the default has been deprecated. Please
+research into the difference between `qs` and `querystring` and choose the
+appropriate setting.
+
+##### inflate
+
+When set to `true`, then deflated (compressed) bodies will be inflated; when
+`false`, deflated bodies are rejected. Defaults to `true`.
+
+##### limit
+
+Controls the maximum request body size. If this is a number, then the value
+specifies the number of bytes; if it is a string, the value is passed to the
+[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults
+to `'100kb'`.
+
+##### parameterLimit
+
+The `parameterLimit` option controls the maximum number of parameters that
+are allowed in the URL-encoded data. If a request contains more parameters
+than this value, a 413 will be returned to the client. Defaults to `1000`.
+
+##### type
+
+The `type` option is used to determine what media type the middleware will
+parse. This option can be a string, array of strings, or a function. If not
+a function, `type` option is passed directly to the
+[type-is](https://www.npmjs.org/package/type-is#readme) library and this can
+be an extension name (like `urlencoded`), a mime type (like
+`application/x-www-form-urlencoded`), or a mime type with a wildcard (like
+`*/x-www-form-urlencoded`). If a function, the `type` option is called as
+`fn(req)` and the request is parsed if it returns a truthy value. Defaults
+to `application/x-www-form-urlencoded`.
+
+##### verify
+
+The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`,
+where `buf` is a `Buffer` of the raw request body and `encoding` is the
+encoding of the request. The parsing can be aborted by throwing an error.
+
+## Errors
+
+The middlewares provided by this module create errors using the
+[`http-errors` module](https://www.npmjs.com/package/http-errors). The errors
+will typically have a `status`/`statusCode` property that contains the suggested
+HTTP response code, an `expose` property to determine if the `message` property
+should be displayed to the client, a `type` property to determine the type of
+error without matching against the `message`, and a `body` property containing
+the read body, if available.
+
+The following are the common errors created, though any error can come through
+for various reasons.
+
+### content encoding unsupported
+
+This error will occur when the request had a `Content-Encoding` header that
+contained an encoding but the "inflation" option was set to `false`. The
+`status` property is set to `415`, the `type` property is set to
+`'encoding.unsupported'`, and the `charset` property will be set to the
+encoding that is unsupported.
+
+### entity parse failed
+
+This error will occur when the request contained an entity that could not be
+parsed by the middleware. The `status` property is set to `400`, the `type`
+property is set to `'entity.parse.failed'`, and the `body` property is set to
+the entity value that failed parsing.
+
+### entity verify failed
+
+This error will occur when the request contained an entity that could not be
+failed verification by the defined `verify` option. The `status` property is
+set to `403`, the `type` property is set to `'entity.verify.failed'`, and the
+`body` property is set to the entity value that failed verification.
+
+### request aborted
+
+This error will occur when the request is aborted by the client before reading
+the body has finished. The `received` property will be set to the number of
+bytes received before the request was aborted and the `expected` property is
+set to the number of expected bytes. The `status` property is set to `400`
+and `type` property is set to `'request.aborted'`.
+
+### request entity too large
+
+This error will occur when the request body's size is larger than the "limit"
+option. The `limit` property will be set to the byte limit and the `length`
+property will be set to the request body's length. The `status` property is
+set to `413` and the `type` property is set to `'entity.too.large'`.
+
+### request size did not match content length
+
+This error will occur when the request's length did not match the length from
+the `Content-Length` header. This typically occurs when the request is malformed,
+typically when the `Content-Length` header was calculated based on characters
+instead of bytes. The `status` property is set to `400` and the `type` property
+is set to `'request.size.invalid'`.
+
+### stream encoding should not be set
+
+This error will occur when something called the `req.setEncoding` method prior
+to this middleware. This module operates directly on bytes only and you cannot
+call `req.setEncoding` when using this module. The `status` property is set to
+`500` and the `type` property is set to `'stream.encoding.set'`.
+
+### stream is not readable
+
+This error will occur when the request is no longer readable when this middleware
+attempts to read it. This typically means something other than a middleware from
+this module read the request body already and the middleware was also configured to
+read the same request. The `status` property is set to `500` and the `type`
+property is set to `'stream.not.readable'`.
+
+### too many parameters
+
+This error will occur when the content of the request exceeds the configured
+`parameterLimit` for the `urlencoded` parser. The `status` property is set to
+`413` and the `type` property is set to `'parameters.too.many'`.
+
+### unsupported charset "BOGUS"
+
+This error will occur when the request had a charset parameter in the
+`Content-Type` header, but the `iconv-lite` module does not support it OR the
+parser does not support it. The charset is contained in the message as well
+as in the `charset` property. The `status` property is set to `415`, the
+`type` property is set to `'charset.unsupported'`, and the `charset` property
+is set to the charset that is unsupported.
+
+### unsupported content encoding "bogus"
+
+This error will occur when the request had a `Content-Encoding` header that
+contained an unsupported encoding. The encoding is contained in the message
+as well as in the `encoding` property. The `status` property is set to `415`,
+the `type` property is set to `'encoding.unsupported'`, and the `encoding`
+property is set to the encoding that is unsupported.
+
+## Examples
+
+### Express/Connect top-level generic
+
+This example demonstrates adding a generic JSON and URL-encoded parser as a
+top-level middleware, which will parse the bodies of all incoming requests.
+This is the simplest setup.
+
+```js
+var express = require('express')
+var bodyParser = require('body-parser')
+
+var app = express()
+
+// parse application/x-www-form-urlencoded
+app.use(bodyParser.urlencoded({ extended: false }))
+
+// parse application/json
+app.use(bodyParser.json())
+
+app.use(function (req, res) {
+ res.setHeader('Content-Type', 'text/plain')
+ res.write('you posted:\n')
+ res.end(JSON.stringify(req.body, null, 2))
+})
+```
+
+### Express route-specific
+
+This example demonstrates adding body parsers specifically to the routes that
+need them. In general, this is the most recommended way to use body-parser with
+Express.
+
+```js
+var express = require('express')
+var bodyParser = require('body-parser')
+
+var app = express()
+
+// create application/json parser
+var jsonParser = bodyParser.json()
+
+// create application/x-www-form-urlencoded parser
+var urlencodedParser = bodyParser.urlencoded({ extended: false })
+
+// POST /login gets urlencoded bodies
+app.post('/login', urlencodedParser, function (req, res) {
+ res.send('welcome, ' + req.body.username)
+})
+
+// POST /api/users gets JSON bodies
+app.post('/api/users', jsonParser, function (req, res) {
+ // create user in req.body
+})
+```
+
+### Change accepted type for parsers
+
+All the parsers accept a `type` option which allows you to change the
+`Content-Type` that the middleware will parse.
+
+```js
+var express = require('express')
+var bodyParser = require('body-parser')
+
+var app = express()
+
+// parse various different custom JSON types as JSON
+app.use(bodyParser.json({ type: 'application/*+json' }))
+
+// parse some custom thing into a Buffer
+app.use(bodyParser.raw({ type: 'application/vnd.custom-type' }))
+
+// parse an HTML body into a string
+app.use(bodyParser.text({ type: 'text/html' }))
+```
+
+## License
+
+[MIT](LICENSE)
+
+[ci-image]: https://badgen.net/github/checks/expressjs/body-parser/master?label=ci
+[ci-url]: https://github.com/expressjs/body-parser/actions/workflows/ci.yml
+[coveralls-image]: https://badgen.net/coveralls/c/github/expressjs/body-parser/master
+[coveralls-url]: https://coveralls.io/r/expressjs/body-parser?branch=master
+[node-version-image]: https://badgen.net/npm/node/body-parser
+[node-version-url]: https://nodejs.org/en/download
+[npm-downloads-image]: https://badgen.net/npm/dm/body-parser
+[npm-url]: https://npmjs.org/package/body-parser
+[npm-version-image]: https://badgen.net/npm/v/body-parser
diff --git a/node_modules/body-parser/SECURITY.md b/node_modules/body-parser/SECURITY.md
new file mode 100644
index 0000000..9694d42
--- /dev/null
+++ b/node_modules/body-parser/SECURITY.md
@@ -0,0 +1,25 @@
+# Security Policies and Procedures
+
+## Reporting a Bug
+
+The Express team and community take all security bugs seriously. Thank you
+for improving the security of Express. We appreciate your efforts and
+responsible disclosure and will make every effort to acknowledge your
+contributions.
+
+Report security bugs by emailing the current owner(s) of `body-parser`. This
+information can be found in the npm registry using the command
+`npm owner ls body-parser`.
+If unsure or unable to get the information from the above, open an issue
+in the [project issue tracker](https://github.com/expressjs/body-parser/issues)
+asking for the current contact information.
+
+To ensure the timely response to your report, please ensure that the entirety
+of the report is contained within the email body and not solely behind a web
+link or an attachment.
+
+At least one owner will acknowledge your email within 48 hours, and will send a
+more detailed response within 48 hours indicating the next steps in handling
+your report. After the initial reply to your report, the owners will
+endeavor to keep you informed of the progress towards a fix and full
+announcement, and may ask for additional information or guidance.
diff --git a/node_modules/body-parser/index.js b/node_modules/body-parser/index.js
new file mode 100644
index 0000000..bb24d73
--- /dev/null
+++ b/node_modules/body-parser/index.js
@@ -0,0 +1,156 @@
+/*!
+ * body-parser
+ * Copyright(c) 2014-2015 Douglas Christopher Wilson
+ * MIT Licensed
+ */
+
+'use strict'
+
+/**
+ * Module dependencies.
+ * @private
+ */
+
+var deprecate = require('depd')('body-parser')
+
+/**
+ * Cache of loaded parsers.
+ * @private
+ */
+
+var parsers = Object.create(null)
+
+/**
+ * @typedef Parsers
+ * @type {function}
+ * @property {function} json
+ * @property {function} raw
+ * @property {function} text
+ * @property {function} urlencoded
+ */
+
+/**
+ * Module exports.
+ * @type {Parsers}
+ */
+
+exports = module.exports = deprecate.function(bodyParser,
+ 'bodyParser: use individual json/urlencoded middlewares')
+
+/**
+ * JSON parser.
+ * @public
+ */
+
+Object.defineProperty(exports, 'json', {
+ configurable: true,
+ enumerable: true,
+ get: createParserGetter('json')
+})
+
+/**
+ * Raw parser.
+ * @public
+ */
+
+Object.defineProperty(exports, 'raw', {
+ configurable: true,
+ enumerable: true,
+ get: createParserGetter('raw')
+})
+
+/**
+ * Text parser.
+ * @public
+ */
+
+Object.defineProperty(exports, 'text', {
+ configurable: true,
+ enumerable: true,
+ get: createParserGetter('text')
+})
+
+/**
+ * URL-encoded parser.
+ * @public
+ */
+
+Object.defineProperty(exports, 'urlencoded', {
+ configurable: true,
+ enumerable: true,
+ get: createParserGetter('urlencoded')
+})
+
+/**
+ * Create a middleware to parse json and urlencoded bodies.
+ *
+ * @param {object} [options]
+ * @return {function}
+ * @deprecated
+ * @public
+ */
+
+function bodyParser (options) {
+ // use default type for parsers
+ var opts = Object.create(options || null, {
+ type: {
+ configurable: true,
+ enumerable: true,
+ value: undefined,
+ writable: true
+ }
+ })
+
+ var _urlencoded = exports.urlencoded(opts)
+ var _json = exports.json(opts)
+
+ return function bodyParser (req, res, next) {
+ _json(req, res, function (err) {
+ if (err) return next(err)
+ _urlencoded(req, res, next)
+ })
+ }
+}
+
+/**
+ * Create a getter for loading a parser.
+ * @private
+ */
+
+function createParserGetter (name) {
+ return function get () {
+ return loadParser(name)
+ }
+}
+
+/**
+ * Load a parser module.
+ * @private
+ */
+
+function loadParser (parserName) {
+ var parser = parsers[parserName]
+
+ if (parser !== undefined) {
+ return parser
+ }
+
+ // this uses a switch for static require analysis
+ switch (parserName) {
+ case 'json':
+ parser = require('./lib/types/json')
+ break
+ case 'raw':
+ parser = require('./lib/types/raw')
+ break
+ case 'text':
+ parser = require('./lib/types/text')
+ break
+ case 'urlencoded':
+ parser = require('./lib/types/urlencoded')
+ break
+ }
+
+ // store to prevent invoking require()
+ return (parsers[parserName] = parser)
+}
diff --git a/node_modules/body-parser/lib/read.js b/node_modules/body-parser/lib/read.js
new file mode 100644
index 0000000..fce6283
--- /dev/null
+++ b/node_modules/body-parser/lib/read.js
@@ -0,0 +1,205 @@
+/*!
+ * body-parser
+ * Copyright(c) 2014-2015 Douglas Christopher Wilson
+ * MIT Licensed
+ */
+
+'use strict'
+
+/**
+ * Module dependencies.
+ * @private
+ */
+
+var createError = require('http-errors')
+var destroy = require('destroy')
+var getBody = require('raw-body')
+var iconv = require('iconv-lite')
+var onFinished = require('on-finished')
+var unpipe = require('unpipe')
+var zlib = require('zlib')
+
+/**
+ * Module exports.
+ */
+
+module.exports = read
+
+/**
+ * Read a request into a buffer and parse.
+ *
+ * @param {object} req
+ * @param {object} res
+ * @param {function} next
+ * @param {function} parse
+ * @param {function} debug
+ * @param {object} options
+ * @private
+ */
+
+function read (req, res, next, parse, debug, options) {
+ var length
+ var opts = options
+ var stream
+
+ // flag as parsed
+ req._body = true
+
+ // read options
+ var encoding = opts.encoding !== null
+ ? opts.encoding
+ : null
+ var verify = opts.verify
+
+ try {
+ // get the content stream
+ stream = contentstream(req, debug, opts.inflate)
+ length = stream.length
+ stream.length = undefined
+ } catch (err) {
+ return next(err)
+ }
+
+ // set raw-body options
+ opts.length = length
+ opts.encoding = verify
+ ? null
+ : encoding
+
+ // assert charset is supported
+ if (opts.encoding === null && encoding !== null && !iconv.encodingExists(encoding)) {
+ return next(createError(415, 'unsupported charset "' + encoding.toUpperCase() + '"', {
+ charset: encoding.toLowerCase(),
+ type: 'charset.unsupported'
+ }))
+ }
+
+ // read body
+ debug('read body')
+ getBody(stream, opts, function (error, body) {
+ if (error) {
+ var _error
+
+ if (error.type === 'encoding.unsupported') {
+ // echo back charset
+ _error = createError(415, 'unsupported charset "' + encoding.toUpperCase() + '"', {
+ charset: encoding.toLowerCase(),
+ type: 'charset.unsupported'
+ })
+ } else {
+ // set status code on error
+ _error = createError(400, error)
+ }
+
+ // unpipe from stream and destroy
+ if (stream !== req) {
+ unpipe(req)
+ destroy(stream, true)
+ }
+
+ // read off entire request
+ dump(req, function onfinished () {
+ next(createError(400, _error))
+ })
+ return
+ }
+
+ // verify
+ if (verify) {
+ try {
+ debug('verify body')
+ verify(req, res, body, encoding)
+ } catch (err) {
+ next(createError(403, err, {
+ body: body,
+ type: err.type || 'entity.verify.failed'
+ }))
+ return
+ }
+ }
+
+ // parse
+ var str = body
+ try {
+ debug('parse body')
+ str = typeof body !== 'string' && encoding !== null
+ ? iconv.decode(body, encoding)
+ : body
+ req.body = parse(str)
+ } catch (err) {
+ next(createError(400, err, {
+ body: str,
+ type: err.type || 'entity.parse.failed'
+ }))
+ return
+ }
+
+ next()
+ })
+}
+
+/**
+ * Get the content stream of the request.
+ *
+ * @param {object} req
+ * @param {function} debug
+ * @param {boolean} [inflate=true]
+ * @return {object}
+ * @api private
+ */
+
+function contentstream (req, debug, inflate) {
+ var encoding = (req.headers['content-encoding'] || 'identity').toLowerCase()
+ var length = req.headers['content-length']
+ var stream
+
+ debug('content-encoding "%s"', encoding)
+
+ if (inflate === false && encoding !== 'identity') {
+ throw createError(415, 'content encoding unsupported', {
+ encoding: encoding,
+ type: 'encoding.unsupported'
+ })
+ }
+
+ switch (encoding) {
+ case 'deflate':
+ stream = zlib.createInflate()
+ debug('inflate body')
+ req.pipe(stream)
+ break
+ case 'gzip':
+ stream = zlib.createGunzip()
+ debug('gunzip body')
+ req.pipe(stream)
+ break
+ case 'identity':
+ stream = req
+ stream.length = length
+ break
+ default:
+ throw createError(415, 'unsupported content encoding "' + encoding + '"', {
+ encoding: encoding,
+ type: 'encoding.unsupported'
+ })
+ }
+
+ return stream
+}
+
+/**
+ * Dump the contents of a request.
+ *
+ * @param {object} req
+ * @param {function} callback
+ * @api private
+ */
+
+function dump (req, callback) {
+ if (onFinished.isFinished(req)) {
+ callback(null)
+ } else {
+ onFinished(req, callback)
+ req.resume()
+ }
+}
diff --git a/node_modules/body-parser/lib/types/json.js b/node_modules/body-parser/lib/types/json.js
new file mode 100644
index 0000000..59f3f7e
--- /dev/null
+++ b/node_modules/body-parser/lib/types/json.js
@@ -0,0 +1,247 @@
+/*!
+ * body-parser
+ * Copyright(c) 2014 Jonathan Ong
+ * Copyright(c) 2014-2015 Douglas Christopher Wilson
+ * MIT Licensed
+ */
+
+'use strict'
+
+/**
+ * Module dependencies.
+ * @private
+ */
+
+var bytes = require('bytes')
+var contentType = require('content-type')
+var createError = require('http-errors')
+var debug = require('debug')('body-parser:json')
+var read = require('../read')
+var typeis = require('type-is')
+
+/**
+ * Module exports.
+ */
+
+module.exports = json
+
+/**
+ * RegExp to match the first non-space in a string.
+ *
+ * Allowed whitespace is defined in RFC 7159:
+ *
+ * ws = *(
+ * %x20 / ; Space
+ * %x09 / ; Horizontal tab
+ * %x0A / ; Line feed or New line
+ * %x0D ) ; Carriage return
+ */
+
+var FIRST_CHAR_REGEXP = /^[\x20\x09\x0a\x0d]*([^\x20\x09\x0a\x0d])/ // eslint-disable-line no-control-regex
+
+var JSON_SYNTAX_CHAR = '#'
+var JSON_SYNTAX_REGEXP = /#+/g
+
+/**
+ * Create a middleware to parse JSON bodies.
+ *
+ * @param {object} [options]
+ * @return {function}
+ * @public
+ */
+
+function json (options) {
+ var opts = options || {}
+
+ var limit = typeof opts.limit !== 'number'
+ ? bytes.parse(opts.limit || '100kb')
+ : opts.limit
+ var inflate = opts.inflate !== false
+ var reviver = opts.reviver
+ var strict = opts.strict !== false
+ var type = opts.type || 'application/json'
+ var verify = opts.verify || false
+
+ if (verify !== false && typeof verify !== 'function') {
+ throw new TypeError('option verify must be function')
+ }
+
+ // create the appropriate type checking function
+ var shouldParse = typeof type !== 'function'
+ ? typeChecker(type)
+ : type
+
+ function parse (body) {
+ if (body.length === 0) {
+ // special-case empty json body, as it's a common client-side mistake
+ // TODO: maybe make this configurable or part of "strict" option
+ return {}
+ }
+
+ if (strict) {
+ var first = firstchar(body)
+
+ if (first !== '{' && first !== '[') {
+ debug('strict violation')
+ throw createStrictSyntaxError(body, first)
+ }
+ }
+
+ try {
+ debug('parse json')
+ return JSON.parse(body, reviver)
+ } catch (e) {
+ throw normalizeJsonSyntaxError(e, {
+ message: e.message,
+ stack: e.stack
+ })
+ }
+ }
+
+ return function jsonParser (req, res, next) {
+ if (req._body) {
+ debug('body already parsed')
+ next()
+ return
+ }
+
+ req.body = req.body || {}
+
+ // skip requests without bodies
+ if (!typeis.hasBody(req)) {
+ debug('skip empty body')
+ next()
+ return
+ }
+
+ debug('content-type %j', req.headers['content-type'])
+
+ // determine if request should be parsed
+ if (!shouldParse(req)) {
+ debug('skip parsing')
+ next()
+ return
+ }
+
+ // assert charset per RFC 7159 sec 8.1
+ var charset = getCharset(req) || 'utf-8'
+ if (charset.slice(0, 4) !== 'utf-') {
+ debug('invalid charset')
+ next(createError(415, 'unsupported charset "' + charset.toUpperCase() + '"', {
+ charset: charset,
+ type: 'charset.unsupported'
+ }))
+ return
+ }
+
+ // read
+ read(req, res, next, parse, debug, {
+ encoding: charset,
+ inflate: inflate,
+ limit: limit,
+ verify: verify
+ })
+ }
+}
+
+/**
+ * Create strict violation syntax error matching native error.
+ *
+ * @param {string} str
+ * @param {string} char
+ * @return {Error}
+ * @private
+ */
+
+function createStrictSyntaxError (str, char) {
+ var index = str.indexOf(char)
+ var partial = ''
+
+ if (index !== -1) {
+ partial = str.substring(0, index) + JSON_SYNTAX_CHAR
+
+ for (var i = index + 1; i < str.length; i++) {
+ partial += JSON_SYNTAX_CHAR
+ }
+ }
+
+ try {
+ JSON.parse(partial); /* istanbul ignore next */ throw new SyntaxError('strict violation')
+ } catch (e) {
+ return normalizeJsonSyntaxError(e, {
+ message: e.message.replace(JSON_SYNTAX_REGEXP, function (placeholder) {
+ return str.substring(index, index + placeholder.length)
+ }),
+ stack: e.stack
+ })
+ }
+}
+
+/**
+ * Get the first non-whitespace character in a string.
+ *
+ * @param {string} str
+ * @return {function}
+ * @private
+ */
+
+function firstchar (str) {
+ var match = FIRST_CHAR_REGEXP.exec(str)
+
+ return match
+ ? match[1]
+ : undefined
+}
+
+/**
+ * Get the charset of a request.
+ *
+ * @param {object} req
+ * @api private
+ */
+
+function getCharset (req) {
+ try {
+ return (contentType.parse(req).parameters.charset || '').toLowerCase()
+ } catch (e) {
+ return undefined
+ }
+}
+
+/**
+ * Normalize a SyntaxError for JSON.parse.
+ *
+ * @param {SyntaxError} error
+ * @param {object} obj
+ * @return {SyntaxError}
+ */
+
+function normalizeJsonSyntaxError (error, obj) {
+ var keys = Object.getOwnPropertyNames(error)
+
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i]
+ if (key !== 'stack' && key !== 'message') {
+ delete error[key]
+ }
+ }
+
+ // replace stack before message for Node.js 0.10 and below
+ error.stack = obj.stack.replace(error.message, obj.message)
+ error.message = obj.message
+
+ return error
+}
+
+/**
+ * Get the simple type checker.
+ *
+ * @param {string} type
+ * @return {function}
+ */
+
+function typeChecker (type) {
+ return function checkType (req) {
+ return Boolean(typeis(req, type))
+ }
+}
diff --git a/node_modules/body-parser/lib/types/raw.js b/node_modules/body-parser/lib/types/raw.js
new file mode 100644
index 0000000..f5d1b67
--- /dev/null
+++ b/node_modules/body-parser/lib/types/raw.js
@@ -0,0 +1,101 @@
+/*!
+ * body-parser
+ * Copyright(c) 2014-2015 Douglas Christopher Wilson
+ * MIT Licensed
+ */
+
+'use strict'
+
+/**
+ * Module dependencies.
+ */
+
+var bytes = require('bytes')
+var debug = require('debug')('body-parser:raw')
+var read = require('../read')
+var typeis = require('type-is')
+
+/**
+ * Module exports.
+ */
+
+module.exports = raw
+
+/**
+ * Create a middleware to parse raw bodies.
+ *
+ * @param {object} [options]
+ * @return {function}
+ * @api public
+ */
+
+function raw (options) {
+ var opts = options || {}
+
+ var inflate = opts.inflate !== false
+ var limit = typeof opts.limit !== 'number'
+ ? bytes.parse(opts.limit || '100kb')
+ : opts.limit
+ var type = opts.type || 'application/octet-stream'
+ var verify = opts.verify || false
+
+ if (verify !== false && typeof verify !== 'function') {
+ throw new TypeError('option verify must be function')
+ }
+
+ // create the appropriate type checking function
+ var shouldParse = typeof type !== 'function'
+ ? typeChecker(type)
+ : type
+
+ function parse (buf) {
+ return buf
+ }
+
+ return function rawParser (req, res, next) {
+ if (req._body) {
+ debug('body already parsed')
+ next()
+ return
+ }
+
+ req.body = req.body || {}
+
+ // skip requests without bodies
+ if (!typeis.hasBody(req)) {
+ debug('skip empty body')
+ next()
+ return
+ }
+
+ debug('content-type %j', req.headers['content-type'])
+
+ // determine if request should be parsed
+ if (!shouldParse(req)) {
+ debug('skip parsing')
+ next()
+ return
+ }
+
+ // read
+ read(req, res, next, parse, debug, {
+ encoding: null,
+ inflate: inflate,
+ limit: limit,
+ verify: verify
+ })
+ }
+}
+
+/**
+ * Get the simple type checker.
+ *
+ * @param {string} type
+ * @return {function}
+ */
+
+function typeChecker (type) {
+ return function checkType (req) {
+ return Boolean(typeis(req, type))
+ }
+}
diff --git a/node_modules/body-parser/lib/types/text.js b/node_modules/body-parser/lib/types/text.js
new file mode 100644
index 0000000..083a009
--- /dev/null
+++ b/node_modules/body-parser/lib/types/text.js
@@ -0,0 +1,121 @@
+/*!
+ * body-parser
+ * Copyright(c) 2014-2015 Douglas Christopher Wilson
+ * MIT Licensed
+ */
+
+'use strict'
+
+/**
+ * Module dependencies.
+ */
+
+var bytes = require('bytes')
+var contentType = require('content-type')
+var debug = require('debug')('body-parser:text')
+var read = require('../read')
+var typeis = require('type-is')
+
+/**
+ * Module exports.
+ */
+
+module.exports = text
+
+/**
+ * Create a middleware to parse text bodies.
+ *
+ * @param {object} [options]
+ * @return {function}
+ * @api public
+ */
+
+function text (options) {
+ var opts = options || {}
+
+ var defaultCharset = opts.defaultCharset || 'utf-8'
+ var inflate = opts.inflate !== false
+ var limit = typeof opts.limit !== 'number'
+ ? bytes.parse(opts.limit || '100kb')
+ : opts.limit
+ var type = opts.type || 'text/plain'
+ var verify = opts.verify || false
+
+ if (verify !== false && typeof verify !== 'function') {
+ throw new TypeError('option verify must be function')
+ }
+
+ // create the appropriate type checking function
+ var shouldParse = typeof type !== 'function'
+ ? typeChecker(type)
+ : type
+
+ function parse (buf) {
+ return buf
+ }
+
+ return function textParser (req, res, next) {
+ if (req._body) {
+ debug('body already parsed')
+ next()
+ return
+ }
+
+ req.body = req.body || {}
+
+ // skip requests without bodies
+ if (!typeis.hasBody(req)) {
+ debug('skip empty body')
+ next()
+ return
+ }
+
+ debug('content-type %j', req.headers['content-type'])
+
+ // determine if request should be parsed
+ if (!shouldParse(req)) {
+ debug('skip parsing')
+ next()
+ return
+ }
+
+ // get charset
+ var charset = getCharset(req) || defaultCharset
+
+ // read
+ read(req, res, next, parse, debug, {
+ encoding: charset,
+ inflate: inflate,
+ limit: limit,
+ verify: verify
+ })
+ }
+}
+
+/**
+ * Get the charset of a request.
+ *
+ * @param {object} req
+ * @api private
+ */
+
+function getCharset (req) {
+ try {
+ return (contentType.parse(req).parameters.charset || '').toLowerCase()
+ } catch (e) {
+ return undefined
+ }
+}
+
+/**
+ * Get the simple type checker.
+ *
+ * @param {string} type
+ * @return {function}
+ */
+
+function typeChecker (type) {
+ return function checkType (req) {
+ return Boolean(typeis(req, type))
+ }
+}
diff --git a/node_modules/body-parser/lib/types/urlencoded.js b/node_modules/body-parser/lib/types/urlencoded.js
new file mode 100644
index 0000000..b2ca8f1
--- /dev/null
+++ b/node_modules/body-parser/lib/types/urlencoded.js
@@ -0,0 +1,284 @@
+/*!
+ * body-parser
+ * Copyright(c) 2014 Jonathan Ong
+ * Copyright(c) 2014-2015 Douglas Christopher Wilson
+ * MIT Licensed
+ */
+
+'use strict'
+
+/**
+ * Module dependencies.
+ * @private
+ */
+
+var bytes = require('bytes')
+var contentType = require('content-type')
+var createError = require('http-errors')
+var debug = require('debug')('body-parser:urlencoded')
+var deprecate = require('depd')('body-parser')
+var read = require('../read')
+var typeis = require('type-is')
+
+/**
+ * Module exports.
+ */
+
+module.exports = urlencoded
+
+/**
+ * Cache of parser modules.
+ */
+
+var parsers = Object.create(null)
+
+/**
+ * Create a middleware to parse urlencoded bodies.
+ *
+ * @param {object} [options]
+ * @return {function}
+ * @public
+ */
+
+function urlencoded (options) {
+ var opts = options || {}
+
+ // notice because option default will flip in next major
+ if (opts.extended === undefined) {
+ deprecate('undefined extended: provide extended option')
+ }
+
+ var extended = opts.extended !== false
+ var inflate = opts.inflate !== false
+ var limit = typeof opts.limit !== 'number'
+ ? bytes.parse(opts.limit || '100kb')
+ : opts.limit
+ var type = opts.type || 'application/x-www-form-urlencoded'
+ var verify = opts.verify || false
+
+ if (verify !== false && typeof verify !== 'function') {
+ throw new TypeError('option verify must be function')
+ }
+
+ // create the appropriate query parser
+ var queryparse = extended
+ ? extendedparser(opts)
+ : simpleparser(opts)
+
+ // create the appropriate type checking function
+ var shouldParse = typeof type !== 'function'
+ ? typeChecker(type)
+ : type
+
+ function parse (body) {
+ return body.length
+ ? queryparse(body)
+ : {}
+ }
+
+ return function urlencodedParser (req, res, next) {
+ if (req._body) {
+ debug('body already parsed')
+ next()
+ return
+ }
+
+ req.body = req.body || {}
+
+ // skip requests without bodies
+ if (!typeis.hasBody(req)) {
+ debug('skip empty body')
+ next()
+ return
+ }
+
+ debug('content-type %j', req.headers['content-type'])
+
+ // determine if request should be parsed
+ if (!shouldParse(req)) {
+ debug('skip parsing')
+ next()
+ return
+ }
+
+ // assert charset
+ var charset = getCharset(req) || 'utf-8'
+ if (charset !== 'utf-8') {
+ debug('invalid charset')
+ next(createError(415, 'unsupported charset "' + charset.toUpperCase() + '"', {
+ charset: charset,
+ type: 'charset.unsupported'
+ }))
+ return
+ }
+
+ // read
+ read(req, res, next, parse, debug, {
+ debug: debug,
+ encoding: charset,
+ inflate: inflate,
+ limit: limit,
+ verify: verify
+ })
+ }
+}
+
+/**
+ * Get the extended query parser.
+ *
+ * @param {object} options
+ */
+
+function extendedparser (options) {
+ var parameterLimit = options.parameterLimit !== undefined
+ ? options.parameterLimit
+ : 1000
+ var parse = parser('qs')
+
+ if (isNaN(parameterLimit) || parameterLimit < 1) {
+ throw new TypeError('option parameterLimit must be a positive number')
+ }
+
+ if (isFinite(parameterLimit)) {
+ parameterLimit = parameterLimit | 0
+ }
+
+ return function queryparse (body) {
+ var paramCount = parameterCount(body, parameterLimit)
+
+ if (paramCount === undefined) {
+ debug('too many parameters')
+ throw createError(413, 'too many parameters', {
+ type: 'parameters.too.many'
+ })
+ }
+
+ var arrayLimit = Math.max(100, paramCount)
+
+ debug('parse extended urlencoding')
+ return parse(body, {
+ allowPrototypes: true,
+ arrayLimit: arrayLimit,
+ depth: Infinity,
+ parameterLimit: parameterLimit
+ })
+ }
+}
+
+/**
+ * Get the charset of a request.
+ *
+ * @param {object} req
+ * @api private
+ */
+
+function getCharset (req) {
+ try {
+ return (contentType.parse(req).parameters.charset || '').toLowerCase()
+ } catch (e) {
+ return undefined
+ }
+}
+
+/**
+ * Count the number of parameters, stopping once limit reached
+ *
+ * @param {string} body
+ * @param {number} limit
+ * @api private
+ */
+
+function parameterCount (body, limit) {
+ var count = 0
+ var index = 0
+
+ while ((index = body.indexOf('&', index)) !== -1) {
+ count++
+ index++
+
+ if (count === limit) {
+ return undefined
+ }
+ }
+
+ return count
+}
+
+/**
+ * Get parser for module name dynamically.
+ *
+ * @param {string} name
+ * @return {function}
+ * @api private
+ */
+
+function parser (name) {
+ var mod = parsers[name]
+
+ if (mod !== undefined) {
+ return mod.parse
+ }
+
+ // this uses a switch for static require analysis
+ switch (name) {
+ case 'qs':
+ mod = require('qs')
+ break
+ case 'querystring':
+ mod = require('querystring')
+ break
+ }
+
+ // store to prevent invoking require()
+ parsers[name] = mod
+
+ return mod.parse
+}
+
+/**
+ * Get the simple query parser.
+ *
+ * @param {object} options
+ */
+
+function simpleparser (options) {
+ var parameterLimit = options.parameterLimit !== undefined
+ ? options.parameterLimit
+ : 1000
+ var parse = parser('querystring')
+
+ if (isNaN(parameterLimit) || parameterLimit < 1) {
+ throw new TypeError('option parameterLimit must be a positive number')
+ }
+
+ if (isFinite(parameterLimit)) {
+ parameterLimit = parameterLimit | 0
+ }
+
+ return function queryparse (body) {
+ var paramCount = parameterCount(body, parameterLimit)
+
+ if (paramCount === undefined) {
+ debug('too many parameters')
+ throw createError(413, 'too many parameters', {
+ type: 'parameters.too.many'
+ })
+ }
+
+ debug('parse urlencoding')
+ return parse(body, undefined, undefined, { maxKeys: parameterLimit })
+ }
+}
+
+/**
+ * Get the simple type checker.
+ *
+ * @param {string} type
+ * @return {function}
+ */
+
+function typeChecker (type) {
+ return function checkType (req) {
+ return Boolean(typeis(req, type))
+ }
+}
diff --git a/node_modules/body-parser/package.json b/node_modules/body-parser/package.json
new file mode 100644
index 0000000..4637304
--- /dev/null
+++ b/node_modules/body-parser/package.json
@@ -0,0 +1,56 @@
+{
+ "name": "body-parser",
+ "description": "Node.js body parsing middleware",
+ "version": "1.20.2",
+ "contributors": [
+ "Douglas Christopher Wilson ",
+ "Jonathan Ong (http://jongleberry.com)"
+ ],
+ "license": "MIT",
+ "repository": "expressjs/body-parser",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "content-type": "~1.0.5",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "on-finished": "2.4.1",
+ "qs": "6.11.0",
+ "raw-body": "2.5.2",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
+ },
+ "devDependencies": {
+ "eslint": "8.34.0",
+ "eslint-config-standard": "14.1.1",
+ "eslint-plugin-import": "2.27.5",
+ "eslint-plugin-markdown": "3.0.0",
+ "eslint-plugin-node": "11.1.0",
+ "eslint-plugin-promise": "6.1.1",
+ "eslint-plugin-standard": "4.1.0",
+ "methods": "1.1.2",
+ "mocha": "10.2.0",
+ "nyc": "15.1.0",
+ "safe-buffer": "5.2.1",
+ "supertest": "6.3.3"
+ },
+ "files": [
+ "lib/",
+ "LICENSE",
+ "HISTORY.md",
+ "SECURITY.md",
+ "index.js"
+ ],
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ },
+ "scripts": {
+ "lint": "eslint .",
+ "test": "mocha --require test/support/env --reporter spec --check-leaks --bail test/",
+ "test-ci": "nyc --reporter=lcov --reporter=text npm test",
+ "test-cov": "nyc --reporter=html --reporter=text npm test"
+ }
+}
diff --git a/node_modules/bytes/History.md b/node_modules/bytes/History.md
new file mode 100644
index 0000000..d60ce0e
--- /dev/null
+++ b/node_modules/bytes/History.md
@@ -0,0 +1,97 @@
+3.1.2 / 2022-01-27
+==================
+
+ * Fix return value for un-parsable strings
+
+3.1.1 / 2021-11-15
+==================
+
+ * Fix "thousandsSeparator" incorrecting formatting fractional part
+
+3.1.0 / 2019-01-22
+==================
+
+ * Add petabyte (`pb`) support
+
+3.0.0 / 2017-08-31
+==================
+
+ * Change "kB" to "KB" in format output
+ * Remove support for Node.js 0.6
+ * Remove support for ComponentJS
+
+2.5.0 / 2017-03-24
+==================
+
+ * Add option "unit"
+
+2.4.0 / 2016-06-01
+==================
+
+ * Add option "unitSeparator"
+
+2.3.0 / 2016-02-15
+==================
+
+ * Drop partial bytes on all parsed units
+ * Fix non-finite numbers to `.format` to return `null`
+ * Fix parsing byte string that looks like hex
+ * perf: hoist regular expressions
+
+2.2.0 / 2015-11-13
+==================
+
+ * add option "decimalPlaces"
+ * add option "fixedDecimals"
+
+2.1.0 / 2015-05-21
+==================
+
+ * add `.format` export
+ * add `.parse` export
+
+2.0.2 / 2015-05-20
+==================
+
+ * remove map recreation
+ * remove unnecessary object construction
+
+2.0.1 / 2015-05-07
+==================
+
+ * fix browserify require
+ * remove node.extend dependency
+
+2.0.0 / 2015-04-12
+==================
+
+ * add option "case"
+ * add option "thousandsSeparator"
+ * return "null" on invalid parse input
+ * support proper round-trip: bytes(bytes(num)) === num
+ * units no longer case sensitive when parsing
+
+1.0.0 / 2014-05-05
+==================
+
+ * add negative support. fixes #6
+
+0.3.0 / 2014-03-19
+==================
+
+ * added terabyte support
+
+0.2.1 / 2013-04-01
+==================
+
+ * add .component
+
+0.2.0 / 2012-10-28
+==================
+
+ * bytes(200).should.eql('200b')
+
+0.1.0 / 2012-07-04
+==================
+
+ * add bytes to string conversion [yields]
diff --git a/node_modules/bytes/LICENSE b/node_modules/bytes/LICENSE
new file mode 100644
index 0000000..63e95a9
--- /dev/null
+++ b/node_modules/bytes/LICENSE
@@ -0,0 +1,23 @@
+(The MIT License)
+
+Copyright (c) 2012-2014 TJ Holowaychuk
+Copyright (c) 2015 Jed Watson
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/bytes/Readme.md b/node_modules/bytes/Readme.md
new file mode 100644
index 0000000..5790e23
--- /dev/null
+++ b/node_modules/bytes/Readme.md
@@ -0,0 +1,152 @@
+# Bytes utility
+
+[![NPM Version][npm-image]][npm-url]
+[![NPM Downloads][downloads-image]][downloads-url]
+[![Build Status][ci-image]][ci-url]
+[![Test Coverage][coveralls-image]][coveralls-url]
+
+Utility to parse a string bytes (ex: `1TB`) to bytes (`1099511627776`) and vice-versa.
+
+## Installation
+
+This is a [Node.js](https://nodejs.org/en/) module available through the
+[npm registry](https://www.npmjs.com/). Installation is done using the
+[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
+
+```bash
+$ npm install bytes
+```
+
+## Usage
+
+```js
+var bytes = require('bytes');
+```
+
+#### bytes(number|string value, [options]): number|string|null
+
+Default export function. Delegates to either `bytes.format` or `bytes.parse` based on the type of `value`.
+
+**Arguments**
+
+| Name | Type | Description |
+|---------|----------|--------------------|
+| value | `number`|`string` | Number value to format or string value to parse |
+| options | `Object` | Conversion options for `format` |
+
+**Returns**
+
+| Name | Type | Description |
+|---------|------------------|-------------------------------------------------|
+| results | `string`|`number`|`null` | Return null upon error. Numeric value in bytes, or string value otherwise. |
+
+**Example**
+
+```js
+bytes(1024);
+// output: '1KB'
+
+bytes('1KB');
+// output: 1024
+```
+
+#### bytes.format(number value, [options]): string|null
+
+Format the given value in bytes into a string. If the value is negative, it is kept as such. If it is a float, it is
+ rounded.
+
+**Arguments**
+
+| Name | Type | Description |
+|---------|----------|--------------------|
+| value | `number` | Value in bytes |
+| options | `Object` | Conversion options |
+
+**Options**
+
+| Property | Type | Description |
+|-------------------|--------|-----------------------------------------------------------------------------------------|
+| decimalPlaces | `number`|`null` | Maximum number of decimal places to include in output. Default value to `2`. |
+| fixedDecimals | `boolean`|`null` | Whether to always display the maximum number of decimal places. Default value to `false` |
+| thousandsSeparator | `string`|`null` | Example of values: `' '`, `','` and `'.'`... Default value to `''`. |
+| unit | `string`|`null` | The unit in which the result will be returned (B/KB/MB/GB/TB). Default value to `''` (which means auto detect). |
+| unitSeparator | `string`|`null` | Separator to use between number and unit. Default value to `''`. |
+
+**Returns**
+
+| Name | Type | Description |
+|---------|------------------|-------------------------------------------------|
+| results | `string`|`null` | Return null upon error. String value otherwise. |
+
+**Example**
+
+```js
+bytes.format(1024);
+// output: '1KB'
+
+bytes.format(1000);
+// output: '1000B'
+
+bytes.format(1000, {thousandsSeparator: ' '});
+// output: '1 000B'
+
+bytes.format(1024 * 1.7, {decimalPlaces: 0});
+// output: '2KB'
+
+bytes.format(1024, {unitSeparator: ' '});
+// output: '1 KB'
+```
+
+#### bytes.parse(string|number value): number|null
+
+Parse the string value into an integer in bytes. If no unit is given, or `value`
+is a number, it is assumed the value is in bytes.
+
+Supported units and abbreviations are as follows and are case-insensitive:
+
+ * `b` for bytes
+ * `kb` for kilobytes
+ * `mb` for megabytes
+ * `gb` for gigabytes
+ * `tb` for terabytes
+ * `pb` for petabytes
+
+The units are in powers of two, not ten. This means 1kb = 1024b according to this parser.
+
+**Arguments**
+
+| Name | Type | Description |
+|---------------|--------|--------------------|
+| value | `string`|`number` | String to parse, or number in bytes. |
+
+**Returns**
+
+| Name | Type | Description |
+|---------|-------------|-------------------------|
+| results | `number`|`null` | Return null upon error. Value in bytes otherwise. |
+
+**Example**
+
+```js
+bytes.parse('1KB');
+// output: 1024
+
+bytes.parse('1024');
+// output: 1024
+
+bytes.parse(1024);
+// output: 1024
+```
+
+## License
+
+[MIT](LICENSE)
+
+[ci-image]: https://badgen.net/github/checks/visionmedia/bytes.js/master?label=ci
+[ci-url]: https://github.com/visionmedia/bytes.js/actions?query=workflow%3Aci
+[coveralls-image]: https://badgen.net/coveralls/c/github/visionmedia/bytes.js/master
+[coveralls-url]: https://coveralls.io/r/visionmedia/bytes.js?branch=master
+[downloads-image]: https://badgen.net/npm/dm/bytes
+[downloads-url]: https://npmjs.org/package/bytes
+[npm-image]: https://badgen.net/npm/v/bytes
+[npm-url]: https://npmjs.org/package/bytes
diff --git a/node_modules/bytes/index.js b/node_modules/bytes/index.js
new file mode 100644
index 0000000..6f2d0f8
--- /dev/null
+++ b/node_modules/bytes/index.js
@@ -0,0 +1,170 @@
+/*!
+ * bytes
+ * Copyright(c) 2012-2014 TJ Holowaychuk
+ * Copyright(c) 2015 Jed Watson
+ * MIT Licensed
+ */
+
+'use strict';
+
+/**
+ * Module exports.
+ * @public
+ */
+
+module.exports = bytes;
+module.exports.format = format;
+module.exports.parse = parse;
+
+/**
+ * Module variables.
+ * @private
+ */
+
+var formatThousandsRegExp = /\B(?=(\d{3})+(?!\d))/g;
+
+var formatDecimalsRegExp = /(?:\.0*|(\.[^0]+)0+)$/;
+
+var map = {
+ b: 1,
+ kb: 1 << 10,
+ mb: 1 << 20,
+ gb: 1 << 30,
+ tb: Math.pow(1024, 4),
+ pb: Math.pow(1024, 5),
+};
+
+var parseRegExp = /^((-|\+)?(\d+(?:\.\d+)?)) *(kb|mb|gb|tb|pb)$/i;
+
+/**
+ * Convert the given value in bytes into a string or parse to string to an integer in bytes.
+ *
+ * @param {string|number} value
+ * @param {{
+ * case: [string],
+ * decimalPlaces: [number]
+ * fixedDecimals: [boolean]
+ * thousandsSeparator: [string]
+ * unitSeparator: [string]
+ * }} [options] bytes options.
+ *
+ * @returns {string|number|null}
+ */
+
+function bytes(value, options) {
+ if (typeof value === 'string') {
+ return parse(value);
+ }
+
+ if (typeof value === 'number') {
+ return format(value, options);
+ }
+
+ return null;
+}
+
+/**
+ * Format the given value in bytes into a string.
+ *
+ * If the value is negative, it is kept as such. If it is a float,
+ * it is rounded.
+ *
+ * @param {number} value
+ * @param {object} [options]
+ * @param {number} [options.decimalPlaces=2]
+ * @param {number} [options.fixedDecimals=false]
+ * @param {string} [options.thousandsSeparator=]
+ * @param {string} [options.unit=]
+ * @param {string} [options.unitSeparator=]
+ *
+ * @returns {string|null}
+ * @public
+ */
+
+function format(value, options) {
+ if (!Number.isFinite(value)) {
+ return null;
+ }
+
+ var mag = Math.abs(value);
+ var thousandsSeparator = (options && options.thousandsSeparator) || '';
+ var unitSeparator = (options && options.unitSeparator) || '';
+ var decimalPlaces = (options && options.decimalPlaces !== undefined) ? options.decimalPlaces : 2;
+ var fixedDecimals = Boolean(options && options.fixedDecimals);
+ var unit = (options && options.unit) || '';
+
+ if (!unit || !map[unit.toLowerCase()]) {
+ if (mag >= map.pb) {
+ unit = 'PB';
+ } else if (mag >= map.tb) {
+ unit = 'TB';
+ } else if (mag >= map.gb) {
+ unit = 'GB';
+ } else if (mag >= map.mb) {
+ unit = 'MB';
+ } else if (mag >= map.kb) {
+ unit = 'KB';
+ } else {
+ unit = 'B';
+ }
+ }
+
+ var val = value / map[unit.toLowerCase()];
+ var str = val.toFixed(decimalPlaces);
+
+ if (!fixedDecimals) {
+ str = str.replace(formatDecimalsRegExp, '$1');
+ }
+
+ if (thousandsSeparator) {
+ str = str.split('.').map(function (s, i) {
+ return i === 0
+ ? s.replace(formatThousandsRegExp, thousandsSeparator)
+ : s
+ }).join('.');
+ }
+
+ return str + unitSeparator + unit;
+}
+
+/**
+ * Parse the string value into an integer in bytes.
+ *
+ * If no unit is given, it is assumed the value is in bytes.
+ *
+ * @param {number|string} val
+ *
+ * @returns {number|null}
+ * @public
+ */
+
+function parse(val) {
+ if (typeof val === 'number' && !isNaN(val)) {
+ return val;
+ }
+
+ if (typeof val !== 'string') {
+ return null;
+ }
+
+ // Test if the string passed is valid
+ var results = parseRegExp.exec(val);
+ var floatValue;
+ var unit = 'b';
+
+ if (!results) {
+ // Nothing could be extracted from the given string
+ floatValue = parseInt(val, 10);
+ unit = 'b'
+ } else {
+ // Retrieve the value and the unit
+ floatValue = parseFloat(results[1]);
+ unit = results[4].toLowerCase();
+ }
+
+ if (isNaN(floatValue)) {
+ return null;
+ }
+
+ return Math.floor(map[unit] * floatValue);
+}
diff --git a/node_modules/bytes/package.json b/node_modules/bytes/package.json
new file mode 100644
index 0000000..f2b6a8b
--- /dev/null
+++ b/node_modules/bytes/package.json
@@ -0,0 +1,42 @@
+{
+ "name": "bytes",
+ "description": "Utility to parse a string bytes to bytes and vice-versa",
+ "version": "3.1.2",
+ "author": "TJ Holowaychuk (http://tjholowaychuk.com)",
+ "contributors": [
+ "Jed Watson ",
+ "Théo FIDRY "
+ ],
+ "license": "MIT",
+ "keywords": [
+ "byte",
+ "bytes",
+ "utility",
+ "parse",
+ "parser",
+ "convert",
+ "converter"
+ ],
+ "repository": "visionmedia/bytes.js",
+ "devDependencies": {
+ "eslint": "7.32.0",
+ "eslint-plugin-markdown": "2.2.1",
+ "mocha": "9.2.0",
+ "nyc": "15.1.0"
+ },
+ "files": [
+ "History.md",
+ "LICENSE",
+ "Readme.md",
+ "index.js"
+ ],
+ "engines": {
+ "node": ">= 0.8"
+ },
+ "scripts": {
+ "lint": "eslint .",
+ "test": "mocha --check-leaks --reporter spec",
+ "test-ci": "nyc --reporter=lcov --reporter=text npm test",
+ "test-cov": "nyc --reporter=html --reporter=text npm test"
+ }
+}
diff --git a/node_modules/call-bind/.eslintignore b/node_modules/call-bind/.eslintignore
new file mode 100644
index 0000000..404abb2
--- /dev/null
+++ b/node_modules/call-bind/.eslintignore
@@ -0,0 +1 @@
+coverage/
diff --git a/node_modules/call-bind/.eslintrc b/node_modules/call-bind/.eslintrc
new file mode 100644
index 0000000..dfa9a6c
--- /dev/null
+++ b/node_modules/call-bind/.eslintrc
@@ -0,0 +1,16 @@
+{
+ "root": true,
+
+ "extends": "@ljharb",
+
+ "rules": {
+ "func-name-matching": 0,
+ "id-length": 0,
+ "new-cap": [2, {
+ "capIsNewExceptions": [
+ "GetIntrinsic",
+ ],
+ }],
+ "no-magic-numbers": 0,
+ },
+}
diff --git a/node_modules/call-bind/.github/FUNDING.yml b/node_modules/call-bind/.github/FUNDING.yml
new file mode 100644
index 0000000..c70c2ec
--- /dev/null
+++ b/node_modules/call-bind/.github/FUNDING.yml
@@ -0,0 +1,12 @@
+# These are supported funding model platforms
+
+github: [ljharb]
+patreon: # Replace with a single Patreon username
+open_collective: # Replace with a single Open Collective username
+ko_fi: # Replace with a single Ko-fi username
+tidelift: npm/call-bind
+community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
+liberapay: # Replace with a single Liberapay username
+issuehunt: # Replace with a single IssueHunt username
+otechie: # Replace with a single Otechie username
+custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
diff --git a/node_modules/call-bind/.nycrc b/node_modules/call-bind/.nycrc
new file mode 100644
index 0000000..bdd626c
--- /dev/null
+++ b/node_modules/call-bind/.nycrc
@@ -0,0 +1,9 @@
+{
+ "all": true,
+ "check-coverage": false,
+ "reporter": ["text-summary", "text", "html", "json"],
+ "exclude": [
+ "coverage",
+ "test"
+ ]
+}
diff --git a/node_modules/call-bind/CHANGELOG.md b/node_modules/call-bind/CHANGELOG.md
new file mode 100644
index 0000000..c653f70
--- /dev/null
+++ b/node_modules/call-bind/CHANGELOG.md
@@ -0,0 +1,93 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+## [v1.0.7](https://github.com/ljharb/call-bind/compare/v1.0.6...v1.0.7) - 2024-02-12
+
+### Commits
+
+- [Refactor] use `es-define-property` [`09b76a0`](https://github.com/ljharb/call-bind/commit/09b76a01634440461d44a80c9924ec4b500f3b03)
+- [Deps] update `get-intrinsic`, `set-function-length` [`ad5136d`](https://github.com/ljharb/call-bind/commit/ad5136ddda2a45c590959829ad3dce0c9f4e3590)
+
+## [v1.0.6](https://github.com/ljharb/call-bind/compare/v1.0.5...v1.0.6) - 2024-02-05
+
+### Commits
+
+- [Dev Deps] update `aud`, `npmignore`, `tape` [`d564d5c`](https://github.com/ljharb/call-bind/commit/d564d5ce3e06a19df4d499c77f8d1a9da44e77aa)
+- [Deps] update `get-intrinsic`, `set-function-length` [`cfc2bdc`](https://github.com/ljharb/call-bind/commit/cfc2bdca7b633df0e0e689e6b637f668f1c6792e)
+- [Refactor] use `es-errors`, so things that only need those do not need `get-intrinsic` [`64cd289`](https://github.com/ljharb/call-bind/commit/64cd289ae5862c250a4ca80aa8d461047c166af5)
+- [meta] add missing `engines.node` [`32a4038`](https://github.com/ljharb/call-bind/commit/32a4038857b62179f7f9b7b3df2c5260036be582)
+
+## [v1.0.5](https://github.com/ljharb/call-bind/compare/v1.0.4...v1.0.5) - 2023-10-19
+
+### Commits
+
+- [Fix] throw an error on non-functions as early as possible [`f262408`](https://github.com/ljharb/call-bind/commit/f262408f822c840fbc268080f3ad7c429611066d)
+- [Deps] update `set-function-length` [`3fff271`](https://github.com/ljharb/call-bind/commit/3fff27145a1e3a76a5b74f1d7c3c43d0fa3b9871)
+
+## [v1.0.4](https://github.com/ljharb/call-bind/compare/v1.0.3...v1.0.4) - 2023-10-19
+
+## [v1.0.3](https://github.com/ljharb/call-bind/compare/v1.0.2...v1.0.3) - 2023-10-19
+
+### Commits
+
+- [actions] reuse common workflows [`a994df6`](https://github.com/ljharb/call-bind/commit/a994df69f401f4bf735a4ccd77029b85d1549453)
+- [meta] use `npmignore` to autogenerate an npmignore file [`eef3ef2`](https://github.com/ljharb/call-bind/commit/eef3ef21e1f002790837fedb8af2679c761fbdf5)
+- [readme] flesh out content [`1845ccf`](https://github.com/ljharb/call-bind/commit/1845ccfd9976a607884cfc7157c93192cc16cf22)
+- [actions] use `node/install` instead of `node/run`; use `codecov` action [`5b47d53`](https://github.com/ljharb/call-bind/commit/5b47d53d2fd74af5ea0a44f1d51e503cd42f7a90)
+- [Refactor] use `set-function-length` [`a0e165c`](https://github.com/ljharb/call-bind/commit/a0e165c5dc61db781cbc919b586b1c2b8da0b150)
+- [Dev Deps] update `@ljharb/eslint-config`, `aud`, `tape` [`9c50103`](https://github.com/ljharb/call-bind/commit/9c50103f44137279a817317cf6cc421a658f85b4)
+- [meta] simplify "exports" [`019c6d0`](https://github.com/ljharb/call-bind/commit/019c6d06b0e1246ceed8e579f57e44441cbbf6d9)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `safe-publish-latest`, `tape` [`23bd718`](https://github.com/ljharb/call-bind/commit/23bd718a288d3b03042062b4ef5153b3cea83f11)
+- [actions] update codecov uploader [`62552d7`](https://github.com/ljharb/call-bind/commit/62552d79cc79e05825e99aaba134ae5b37f33da5)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `tape` [`ec81665`](https://github.com/ljharb/call-bind/commit/ec81665b300f87eabff597afdc8b8092adfa7afd)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `safe-publish-latest`, `tape` [`35d67fc`](https://github.com/ljharb/call-bind/commit/35d67fcea883e686650f736f61da5ddca2592de8)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `tape` [`0266d8d`](https://github.com/ljharb/call-bind/commit/0266d8d2a45086a922db366d0c2932fa463662ff)
+- [Dev Deps] update `@ljharb/eslint-config`, `aud`, `tape` [`43a5b28`](https://github.com/ljharb/call-bind/commit/43a5b28a444e710e1bbf92adb8afb5cf7523a223)
+- [Deps] update `define-data-property`, `function-bind`, `get-intrinsic` [`780eb36`](https://github.com/ljharb/call-bind/commit/780eb36552514f8cc99c70821ce698697c2726a5)
+- [Dev Deps] update `aud`, `tape` [`90d50ad`](https://github.com/ljharb/call-bind/commit/90d50ad03b061e0268b3380b0065fcaec183dc05)
+- [meta] use `prepublishOnly` script for npm 7+ [`44c5433`](https://github.com/ljharb/call-bind/commit/44c5433b7980e02b4870007046407cf6fc543329)
+- [Deps] update `get-intrinsic` [`86bfbfc`](https://github.com/ljharb/call-bind/commit/86bfbfcf34afdc6eabc93ce3d408548d0e27d958)
+- [Deps] update `get-intrinsic` [`5c53354`](https://github.com/ljharb/call-bind/commit/5c5335489be0294c18cd7a8bb6e08226ee019ff5)
+- [actions] update checkout action [`4c393a8`](https://github.com/ljharb/call-bind/commit/4c393a8173b3c8e5b30d5b3297b3b94d48bf87f3)
+- [Deps] update `get-intrinsic` [`4e70bde`](https://github.com/ljharb/call-bind/commit/4e70bdec0626acb11616d66250fc14565e716e91)
+- [Deps] update `get-intrinsic` [`55ae803`](https://github.com/ljharb/call-bind/commit/55ae803a920bd93c369cd798c20de31f91e9fc60)
+
+## [v1.0.2](https://github.com/ljharb/call-bind/compare/v1.0.1...v1.0.2) - 2021-01-11
+
+### Commits
+
+- [Fix] properly include the receiver in the bound length [`dbae7bc`](https://github.com/ljharb/call-bind/commit/dbae7bc676c079a0d33c0a43e9ef92cb7b01345d)
+
+## [v1.0.1](https://github.com/ljharb/call-bind/compare/v1.0.0...v1.0.1) - 2021-01-08
+
+### Commits
+
+- [Tests] migrate tests to Github Actions [`b6db284`](https://github.com/ljharb/call-bind/commit/b6db284c36f8ccd195b88a6764fe84b7223a0da1)
+- [meta] do not publish github action workflow files [`ec7fe46`](https://github.com/ljharb/call-bind/commit/ec7fe46e60cfa4764ee943d2755f5e5a366e578e)
+- [Fix] preserve original function’s length when possible [`adbceaa`](https://github.com/ljharb/call-bind/commit/adbceaa3cac4b41ea78bb19d7ccdbaaf7e0bdadb)
+- [Tests] gather coverage data on every job [`d69e23c`](https://github.com/ljharb/call-bind/commit/d69e23cc65f101ba1d4c19bb07fa8eb0ec624be8)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `tape` [`2fd3586`](https://github.com/ljharb/call-bind/commit/2fd3586c5d47b335364c14293114c6b625ae1f71)
+- [Deps] update `get-intrinsic` [`f23e931`](https://github.com/ljharb/call-bind/commit/f23e9318cc271c2add8bb38cfded85ee7baf8eee)
+- [Deps] update `get-intrinsic` [`72d9f44`](https://github.com/ljharb/call-bind/commit/72d9f44e184465ba8dd3fb48260bbcff234985f2)
+- [meta] fix FUNDING.yml [`e723573`](https://github.com/ljharb/call-bind/commit/e723573438c5a68dcec31fb5d96ea6b7e4a93be8)
+- [eslint] ignore coverage output [`15e76d2`](https://github.com/ljharb/call-bind/commit/15e76d28a5f43e504696401e5b31ebb78ee1b532)
+- [meta] add Automatic Rebase and Require Allow Edits workflows [`8fa4dab`](https://github.com/ljharb/call-bind/commit/8fa4dabb23ba3dd7bb92c9571c1241c08b56e4b6)
+
+## v1.0.0 - 2020-10-30
+
+### Commits
+
+- Initial commit [`306cf98`](https://github.com/ljharb/call-bind/commit/306cf98c7ec9e7ef66b653ec152277ac1381eb50)
+- Tests [`e10d0bb`](https://github.com/ljharb/call-bind/commit/e10d0bbdadc7a10ecedc9a1c035112d3e368b8df)
+- Implementation [`43852ed`](https://github.com/ljharb/call-bind/commit/43852eda0f187327b7fad2423ca972149a52bd65)
+- npm init [`408f860`](https://github.com/ljharb/call-bind/commit/408f860b773a2f610805fd3613d0d71bac1b6249)
+- [meta] add Automatic Rebase and Require Allow Edits workflows [`fb349b2`](https://github.com/ljharb/call-bind/commit/fb349b2e48defbec8b5ec8a8395cc8f69f220b13)
+- [meta] add `auto-changelog` [`c4001fc`](https://github.com/ljharb/call-bind/commit/c4001fc43031799ef908211c98d3b0fb2b60fde4)
+- [meta] add "funding"; create `FUNDING.yml` [`d4d6d29`](https://github.com/ljharb/call-bind/commit/d4d6d2974a14bc2e98830468eda7fe6d6a776717)
+- [Tests] add `npm run lint` [`dedfb98`](https://github.com/ljharb/call-bind/commit/dedfb98bd0ecefb08ddb9a94061bd10cde4332af)
+- Only apps should have lockfiles [`54ac776`](https://github.com/ljharb/call-bind/commit/54ac77653db45a7361dc153d2f478e743f110650)
+- [meta] add `safe-publish-latest` [`9ea8e43`](https://github.com/ljharb/call-bind/commit/9ea8e435b950ce9b705559cd651039f9bf40140f)
diff --git a/node_modules/call-bind/LICENSE b/node_modules/call-bind/LICENSE
new file mode 100644
index 0000000..48f05d0
--- /dev/null
+++ b/node_modules/call-bind/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 Jordan Harband
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/call-bind/README.md b/node_modules/call-bind/README.md
new file mode 100644
index 0000000..48e9047
--- /dev/null
+++ b/node_modules/call-bind/README.md
@@ -0,0 +1,64 @@
+# call-bind [![Version Badge][npm-version-svg]][package-url]
+
+[![github actions][actions-image]][actions-url]
+[![coverage][codecov-image]][codecov-url]
+[![dependency status][deps-svg]][deps-url]
+[![dev dependency status][dev-deps-svg]][dev-deps-url]
+[![License][license-image]][license-url]
+[![Downloads][downloads-image]][downloads-url]
+
+[![npm badge][npm-badge-png]][package-url]
+
+Robustly `.call.bind()` a function.
+
+## Getting started
+
+```sh
+npm install --save call-bind
+```
+
+## Usage/Examples
+
+```js
+const assert = require('assert');
+const callBind = require('call-bind');
+const callBound = require('call-bind/callBound');
+
+function f(a, b) {
+ assert.equal(this, 1);
+ assert.equal(a, 2);
+ assert.equal(b, 3);
+ assert.equal(arguments.length, 2);
+}
+
+const fBound = callBind(f);
+
+const slice = callBound('Array.prototype.slice');
+
+delete Function.prototype.call;
+delete Function.prototype.bind;
+
+fBound(1, 2, 3);
+
+assert.deepEqual(slice([1, 2, 3, 4], 1, -1), [2, 3]);
+```
+
+## Tests
+
+Clone the repo, `npm install`, and run `npm test`
+
+[package-url]: https://npmjs.org/package/call-bind
+[npm-version-svg]: https://versionbadg.es/ljharb/call-bind.svg
+[deps-svg]: https://david-dm.org/ljharb/call-bind.svg
+[deps-url]: https://david-dm.org/ljharb/call-bind
+[dev-deps-svg]: https://david-dm.org/ljharb/call-bind/dev-status.svg
+[dev-deps-url]: https://david-dm.org/ljharb/call-bind#info=devDependencies
+[npm-badge-png]: https://nodei.co/npm/call-bind.png?downloads=true&stars=true
+[license-image]: https://img.shields.io/npm/l/call-bind.svg
+[license-url]: LICENSE
+[downloads-image]: https://img.shields.io/npm/dm/call-bind.svg
+[downloads-url]: https://npm-stat.com/charts.html?package=call-bind
+[codecov-image]: https://codecov.io/gh/ljharb/call-bind/branch/main/graphs/badge.svg
+[codecov-url]: https://app.codecov.io/gh/ljharb/call-bind/
+[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/ljharb/call-bind
+[actions-url]: https://github.com/ljharb/call-bind/actions
diff --git a/node_modules/call-bind/callBound.js b/node_modules/call-bind/callBound.js
new file mode 100644
index 0000000..8374adf
--- /dev/null
+++ b/node_modules/call-bind/callBound.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+
+var callBind = require('./');
+
+var $indexOf = callBind(GetIntrinsic('String.prototype.indexOf'));
+
+module.exports = function callBoundIntrinsic(name, allowMissing) {
+ var intrinsic = GetIntrinsic(name, !!allowMissing);
+ if (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) {
+ return callBind(intrinsic);
+ }
+ return intrinsic;
+};
diff --git a/node_modules/call-bind/index.js b/node_modules/call-bind/index.js
new file mode 100644
index 0000000..01c5b3d
--- /dev/null
+++ b/node_modules/call-bind/index.js
@@ -0,0 +1,35 @@
+'use strict';
+
+var bind = require('function-bind');
+var GetIntrinsic = require('get-intrinsic');
+var setFunctionLength = require('set-function-length');
+
+var $TypeError = require('es-errors/type');
+var $apply = GetIntrinsic('%Function.prototype.apply%');
+var $call = GetIntrinsic('%Function.prototype.call%');
+var $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply);
+
+var $defineProperty = require('es-define-property');
+var $max = GetIntrinsic('%Math.max%');
+
+module.exports = function callBind(originalFunction) {
+ if (typeof originalFunction !== 'function') {
+ throw new $TypeError('a function is required');
+ }
+ var func = $reflectApply(bind, $call, arguments);
+ return setFunctionLength(
+ func,
+ 1 + $max(0, originalFunction.length - (arguments.length - 1)),
+ true
+ );
+};
+
+var applyBind = function applyBind() {
+ return $reflectApply(bind, $apply, arguments);
+};
+
+if ($defineProperty) {
+ $defineProperty(module.exports, 'apply', { value: applyBind });
+} else {
+ module.exports.apply = applyBind;
+}
diff --git a/node_modules/call-bind/package.json b/node_modules/call-bind/package.json
new file mode 100644
index 0000000..5ba88ff
--- /dev/null
+++ b/node_modules/call-bind/package.json
@@ -0,0 +1,95 @@
+{
+ "name": "call-bind",
+ "version": "1.0.7",
+ "description": "Robustly `.call.bind()` a function",
+ "main": "index.js",
+ "exports": {
+ ".": "./index.js",
+ "./callBound": "./callBound.js",
+ "./package.json": "./package.json"
+ },
+ "scripts": {
+ "prepack": "npmignore --auto --commentLines=auto",
+ "prepublish": "not-in-publish || npm run prepublishOnly",
+ "prepublishOnly": "safe-publish-latest",
+ "lint": "eslint --ext=.js,.mjs .",
+ "postlint": "evalmd README.md",
+ "pretest": "npm run lint",
+ "tests-only": "nyc tape 'test/**/*.js'",
+ "test": "npm run tests-only",
+ "posttest": "aud --production",
+ "version": "auto-changelog && git add CHANGELOG.md",
+ "postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\""
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/ljharb/call-bind.git"
+ },
+ "keywords": [
+ "javascript",
+ "ecmascript",
+ "es",
+ "js",
+ "callbind",
+ "callbound",
+ "call",
+ "bind",
+ "bound",
+ "call-bind",
+ "call-bound",
+ "function",
+ "es-abstract"
+ ],
+ "author": "Jordan Harband ",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/ljharb/call-bind/issues"
+ },
+ "homepage": "https://github.com/ljharb/call-bind#readme",
+ "devDependencies": {
+ "@ljharb/eslint-config": "^21.1.0",
+ "aud": "^2.0.4",
+ "auto-changelog": "^2.4.0",
+ "es-value-fixtures": "^1.4.2",
+ "eslint": "=8.8.0",
+ "evalmd": "^0.0.19",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-strict-mode": "^1.0.1",
+ "in-publish": "^2.0.1",
+ "npmignore": "^0.3.1",
+ "nyc": "^10.3.2",
+ "object-inspect": "^1.13.1",
+ "safe-publish-latest": "^2.0.0",
+ "tape": "^5.7.4"
+ },
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.1"
+ },
+ "testling": {
+ "files": "test/index.js"
+ },
+ "auto-changelog": {
+ "output": "CHANGELOG.md",
+ "template": "keepachangelog",
+ "unreleased": false,
+ "commitLimit": false,
+ "backfillLimit": false,
+ "hideCredit": true
+ },
+ "publishConfig": {
+ "ignore": [
+ ".github/workflows"
+ ]
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+}
diff --git a/node_modules/call-bind/test/callBound.js b/node_modules/call-bind/test/callBound.js
new file mode 100644
index 0000000..c32319d
--- /dev/null
+++ b/node_modules/call-bind/test/callBound.js
@@ -0,0 +1,54 @@
+'use strict';
+
+var test = require('tape');
+
+var callBound = require('../callBound');
+
+test('callBound', function (t) {
+ // static primitive
+ t.equal(callBound('Array.length'), Array.length, 'Array.length yields itself');
+ t.equal(callBound('%Array.length%'), Array.length, '%Array.length% yields itself');
+
+ // static non-function object
+ t.equal(callBound('Array.prototype'), Array.prototype, 'Array.prototype yields itself');
+ t.equal(callBound('%Array.prototype%'), Array.prototype, '%Array.prototype% yields itself');
+ t.equal(callBound('Array.constructor'), Array.constructor, 'Array.constructor yields itself');
+ t.equal(callBound('%Array.constructor%'), Array.constructor, '%Array.constructor% yields itself');
+
+ // static function
+ t.equal(callBound('Date.parse'), Date.parse, 'Date.parse yields itself');
+ t.equal(callBound('%Date.parse%'), Date.parse, '%Date.parse% yields itself');
+
+ // prototype primitive
+ t.equal(callBound('Error.prototype.message'), Error.prototype.message, 'Error.prototype.message yields itself');
+ t.equal(callBound('%Error.prototype.message%'), Error.prototype.message, '%Error.prototype.message% yields itself');
+
+ // prototype function
+ t.notEqual(callBound('Object.prototype.toString'), Object.prototype.toString, 'Object.prototype.toString does not yield itself');
+ t.notEqual(callBound('%Object.prototype.toString%'), Object.prototype.toString, '%Object.prototype.toString% does not yield itself');
+ t.equal(callBound('Object.prototype.toString')(true), Object.prototype.toString.call(true), 'call-bound Object.prototype.toString calls into the original');
+ t.equal(callBound('%Object.prototype.toString%')(true), Object.prototype.toString.call(true), 'call-bound %Object.prototype.toString% calls into the original');
+
+ t['throws'](
+ function () { callBound('does not exist'); },
+ SyntaxError,
+ 'nonexistent intrinsic throws'
+ );
+ t['throws'](
+ function () { callBound('does not exist', true); },
+ SyntaxError,
+ 'allowMissing arg still throws for unknown intrinsic'
+ );
+
+ t.test('real but absent intrinsic', { skip: typeof WeakRef !== 'undefined' }, function (st) {
+ st['throws'](
+ function () { callBound('WeakRef'); },
+ TypeError,
+ 'real but absent intrinsic throws'
+ );
+ st.equal(callBound('WeakRef', true), undefined, 'allowMissing arg avoids exception');
+ st.end();
+ });
+
+ t.end();
+});
diff --git a/node_modules/call-bind/test/index.js b/node_modules/call-bind/test/index.js
new file mode 100644
index 0000000..1fd4668
--- /dev/null
+++ b/node_modules/call-bind/test/index.js
@@ -0,0 +1,80 @@
+'use strict';
+
+var callBind = require('../');
+var bind = require('function-bind');
+var gOPD = require('gopd');
+var hasStrictMode = require('has-strict-mode')();
+var forEach = require('for-each');
+var inspect = require('object-inspect');
+var v = require('es-value-fixtures');
+
+var test = require('tape');
+
+/*
+ * older engines have length nonconfigurable
+ * in io.js v3, it is configurable except on bound functions, hence the .bind()
+ */
+var functionsHaveConfigurableLengths = !!(
+ gOPD
+ && Object.getOwnPropertyDescriptor
+ && Object.getOwnPropertyDescriptor(bind.call(function () {}), 'length').configurable
+);
+
+test('callBind', function (t) {
+ forEach(v.nonFunctions, function (nonFunction) {
+ t['throws'](
+ function () { callBind(nonFunction); },
+ TypeError,
+ inspect(nonFunction) + ' is not a function'
+ );
+ });
+
+ var sentinel = { sentinel: true };
+ var func = function (a, b) {
+ // eslint-disable-next-line no-invalid-this
+ return [!hasStrictMode && this === global ? undefined : this, a, b];
+ };
+ t.equal(func.length, 2, 'original function length is 2');
+ t.deepEqual(func(), [undefined, undefined, undefined], 'unbound func with too few args');
+ t.deepEqual(func(1, 2), [undefined, 1, 2], 'unbound func with right args');
+ t.deepEqual(func(1, 2, 3), [undefined, 1, 2], 'unbound func with too many args');
+
+ var bound = callBind(func);
+ t.equal(bound.length, func.length + 1, 'function length is preserved', { skip: !functionsHaveConfigurableLengths });
+ t.deepEqual(bound(), [undefined, undefined, undefined], 'bound func with too few args');
+ t.deepEqual(bound(1, 2), [hasStrictMode ? 1 : Object(1), 2, undefined], 'bound func with right args');
+ t.deepEqual(bound(1, 2, 3), [hasStrictMode ? 1 : Object(1), 2, 3], 'bound func with too many args');
+
+ var boundR = callBind(func, sentinel);
+ t.equal(boundR.length, func.length, 'function length is preserved', { skip: !functionsHaveConfigurableLengths });
+ t.deepEqual(boundR(), [sentinel, undefined, undefined], 'bound func with receiver, with too few args');
+ t.deepEqual(boundR(1, 2), [sentinel, 1, 2], 'bound func with receiver, with right args');
+ t.deepEqual(boundR(1, 2, 3), [sentinel, 1, 2], 'bound func with receiver, with too many args');
+
+ var boundArg = callBind(func, sentinel, 1);
+ t.equal(boundArg.length, func.length - 1, 'function length is preserved', { skip: !functionsHaveConfigurableLengths });
+ t.deepEqual(boundArg(), [sentinel, 1, undefined], 'bound func with receiver and arg, with too few args');
+ t.deepEqual(boundArg(2), [sentinel, 1, 2], 'bound func with receiver and arg, with right arg');
+ t.deepEqual(boundArg(2, 3), [sentinel, 1, 2], 'bound func with receiver and arg, with too many args');
+
+ t.test('callBind.apply', function (st) {
+ var aBound = callBind.apply(func);
+ st.deepEqual(aBound(sentinel), [sentinel, undefined, undefined], 'apply-bound func with no args');
+ st.deepEqual(aBound(sentinel, [1], 4), [sentinel, 1, undefined], 'apply-bound func with too few args');
+ st.deepEqual(aBound(sentinel, [1, 2], 4), [sentinel, 1, 2], 'apply-bound func with right args');
+
+ var aBoundArg = callBind.apply(func);
+ st.deepEqual(aBoundArg(sentinel, [1, 2, 3], 4), [sentinel, 1, 2], 'apply-bound func with too many args');
+ st.deepEqual(aBoundArg(sentinel, [1, 2], 4), [sentinel, 1, 2], 'apply-bound func with right args');
+ st.deepEqual(aBoundArg(sentinel, [1], 4), [sentinel, 1, undefined], 'apply-bound func with too few args');
+
+ var aBoundR = callBind.apply(func, sentinel);
+ st.deepEqual(aBoundR([1, 2, 3], 4), [sentinel, 1, 2], 'apply-bound func with receiver and too many args');
+ st.deepEqual(aBoundR([1, 2], 4), [sentinel, 1, 2], 'apply-bound func with receiver and right args');
+ st.deepEqual(aBoundR([1], 4), [sentinel, 1, undefined], 'apply-bound func with receiver and too few args');
+
+ st.end();
+ });
+
+ t.end();
+});
diff --git a/node_modules/clsx/clsx.d.mts b/node_modules/clsx/clsx.d.mts
new file mode 100644
index 0000000..025bb7f
--- /dev/null
+++ b/node_modules/clsx/clsx.d.mts
@@ -0,0 +1,6 @@
+export type ClassValue = ClassArray | ClassDictionary | string | number | bigint | null | boolean | undefined;
+export type ClassDictionary = Record;
+export type ClassArray = ClassValue[];
+
+export function clsx(...inputs: ClassValue[]): string;
+export default clsx;
diff --git a/node_modules/clsx/clsx.d.ts b/node_modules/clsx/clsx.d.ts
new file mode 100644
index 0000000..a4233f5
--- /dev/null
+++ b/node_modules/clsx/clsx.d.ts
@@ -0,0 +1,10 @@
+declare namespace clsx {
+ type ClassValue = ClassArray | ClassDictionary | string | number | bigint | null | boolean | undefined;
+ type ClassDictionary = Record;
+ type ClassArray = ClassValue[];
+ function clsx(...inputs: ClassValue[]): string;
+}
+
+declare function clsx(...inputs: clsx.ClassValue[]): string;
+
+export = clsx;
diff --git a/node_modules/clsx/dist/clsx.js b/node_modules/clsx/dist/clsx.js
new file mode 100644
index 0000000..3dbb4b2
--- /dev/null
+++ b/node_modules/clsx/dist/clsx.js
@@ -0,0 +1 @@
+function r(e){var o,t,f="";if("string"==typeof e||"number"==typeof e)f+=e;else if("object"==typeof e)if(Array.isArray(e)){var n=e.length;for(o=0;o (lukeed.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/clsx/package.json b/node_modules/clsx/package.json
new file mode 100644
index 0000000..69954cb
--- /dev/null
+++ b/node_modules/clsx/package.json
@@ -0,0 +1,60 @@
+{
+ "name": "clsx",
+ "version": "2.1.1",
+ "repository": "lukeed/clsx",
+ "description": "A tiny (239B) utility for constructing className strings conditionally.",
+ "module": "dist/clsx.mjs",
+ "unpkg": "dist/clsx.min.js",
+ "main": "dist/clsx.js",
+ "types": "clsx.d.ts",
+ "license": "MIT",
+ "exports": {
+ ".": {
+ "import": {
+ "types": "./clsx.d.mts",
+ "default": "./dist/clsx.mjs"
+ },
+ "default": {
+ "types": "./clsx.d.ts",
+ "default": "./dist/clsx.js"
+ }
+ },
+ "./lite": {
+ "import": {
+ "types": "./clsx.d.mts",
+ "default": "./dist/lite.mjs"
+ },
+ "default": {
+ "types": "./clsx.d.ts",
+ "default": "./dist/lite.js"
+ }
+ }
+ },
+ "author": {
+ "name": "Luke Edwards",
+ "email": "luke.edwards05@gmail.com",
+ "url": "https://lukeed.com"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "scripts": {
+ "build": "node bin",
+ "test": "uvu -r esm test"
+ },
+ "files": [
+ "*.d.mts",
+ "*.d.ts",
+ "dist"
+ ],
+ "keywords": [
+ "classes",
+ "classname",
+ "classnames"
+ ],
+ "devDependencies": {
+ "esm": "3.2.25",
+ "terser": "4.8.0",
+ "uvu": "0.5.4"
+ }
+}
diff --git a/node_modules/clsx/readme.md b/node_modules/clsx/readme.md
new file mode 100644
index 0000000..b1af2b3
--- /dev/null
+++ b/node_modules/clsx/readme.md
@@ -0,0 +1,154 @@
+# clsx [![CI](https://github.com/lukeed/clsx/workflows/CI/badge.svg)](https://github.com/lukeed/clsx/actions?query=workflow%3ACI) [![codecov](https://badgen.net/codecov/c/github/lukeed/clsx)](https://codecov.io/gh/lukeed/clsx) [![licenses](https://licenses.dev/b/npm/clsx)](https://licenses.dev/npm/clsx)
+
+> A tiny (239B) utility for constructing `className` strings conditionally. Also serves as a [faster](bench) & smaller drop-in replacement for the `classnames` module.
+
+This module is available in three formats:
+
+* **ES Module**: `dist/clsx.mjs`
+* **CommonJS**: `dist/clsx.js`
+* **UMD**: `dist/clsx.min.js`
+
+
+## Install
+
+```
+$ npm install --save clsx
+```
+
+
+## Usage
+
+```js
+import clsx from 'clsx';
+// or
+import { clsx } from 'clsx';
+
+// Strings (variadic)
+clsx('foo', true && 'bar', 'baz');
+//=> 'foo bar baz'
+
+// Objects
+clsx({ foo:true, bar:false, baz:isTrue() });
+//=> 'foo baz'
+
+// Objects (variadic)
+clsx({ foo:true }, { bar:false }, null, { '--foobar':'hello' });
+//=> 'foo --foobar'
+
+// Arrays
+clsx(['foo', 0, false, 'bar']);
+//=> 'foo bar'
+
+// Arrays (variadic)
+clsx(['foo'], ['', 0, false, 'bar'], [['baz', [['hello'], 'there']]]);
+//=> 'foo bar baz hello there'
+
+// Kitchen sink (with nesting)
+clsx('foo', [1 && 'bar', { baz:false, bat:null }, ['hello', ['world']]], 'cya');
+//=> 'foo bar hello world cya'
+```
+
+
+## API
+
+### clsx(...input)
+Returns: `String`
+
+#### input
+Type: `Mixed`
+
+The `clsx` function can take ***any*** number of arguments, each of which can be an Object, Array, Boolean, or String.
+
+> **Important:** _Any_ falsey values are discarded! Standalone Boolean values are discarded as well.
+
+```js
+clsx(true, false, '', null, undefined, 0, NaN);
+//=> ''
+```
+
+## Modes
+
+There are multiple "versions" of `clsx` available, which allows you to bring only the functionality you need!
+
+#### `clsx`
+> **Size (gzip):** 239 bytes
+> **Availability:** CommonJS, ES Module, UMD
+
+The default `clsx` module; see [API](#API) for info.
+
+```js
+import { clsx } from 'clsx';
+// or
+import clsx from 'clsx';
+```
+
+#### `clsx/lite`
+> **Size (gzip):** 140 bytes
+> **Availability:** CommonJS, ES Module
+> **CAUTION:** Accepts **ONLY** string arguments!
+
+Ideal for applications that ***only*** use the string-builder pattern.
+
+Any non-string arguments are ignored!
+
+```js
+import { clsx } from 'clsx/lite';
+// or
+import clsx from 'clsx/lite';
+
+// string
+clsx('hello', true && 'foo', false && 'bar');
+// => "hello foo"
+
+// NOTE: Any non-string input(s) ignored
+clsx({ foo: true });
+//=> ""
+```
+
+## Benchmarks
+
+For snapshots of cross-browser results, check out the [`bench`](bench) directory~!
+
+## Support
+
+All versions of Node.js are supported.
+
+All browsers that support [`Array.isArray`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray#Browser_compatibility) are supported (IE9+).
+
+>**Note:** For IE8 support and older, please install `clsx@1.0.x` and beware of [#17](https://github.com/lukeed/clsx/issues/17).
+
+## Tailwind Support
+
+Here some additional (optional) steps to enable classes autocompletion using `clsx` with Tailwind CSS.
+
+
+
+ Visual Studio Code
+
+
+1. [Install the "Tailwind CSS IntelliSense" Visual Studio Code extension](https://marketplace.visualstudio.com/items?itemName=bradlc.vscode-tailwindcss)
+
+2. Add the following to your [`settings.json`](https://code.visualstudio.com/docs/getstarted/settings):
+
+ ```json
+ {
+ "tailwindCSS.experimental.classRegex": [
+ ["clsx\\(([^)]*)\\)", "(?:'|\"|`)([^']*)(?:'|\"|`)"]
+ ]
+ }
+ ```
+
+
+You may find the [`clsx/lite`](#clsxlite) module useful within Tailwind contexts. This is especially true if/when your application **only** composes classes in this pattern:
+
+```js
+clsx('text-base', props.active && 'text-primary', props.className);
+```
+
+## Related
+
+- [obj-str](https://github.com/lukeed/obj-str) - A smaller (96B) and similiar utility that only works with Objects.
+
+## License
+
+MIT © [Luke Edwards](https://lukeed.com)
diff --git a/node_modules/content-type/HISTORY.md b/node_modules/content-type/HISTORY.md
new file mode 100644
index 0000000..4583671
--- /dev/null
+++ b/node_modules/content-type/HISTORY.md
@@ -0,0 +1,29 @@
+1.0.5 / 2023-01-29
+==================
+
+ * perf: skip value escaping when unnecessary
+
+1.0.4 / 2017-09-11
+==================
+
+ * perf: skip parameter parsing when no parameters
+
+1.0.3 / 2017-09-10
+==================
+
+ * perf: remove argument reassignment
+
+1.0.2 / 2016-05-09
+==================
+
+ * perf: enable strict mode
+
+1.0.1 / 2015-02-13
+==================
+
+ * Improve missing `Content-Type` header error message
+
+1.0.0 / 2015-02-01
+==================
+
+ * Initial implementation, derived from `media-typer@0.3.0`
diff --git a/node_modules/content-type/LICENSE b/node_modules/content-type/LICENSE
new file mode 100644
index 0000000..34b1a2d
--- /dev/null
+++ b/node_modules/content-type/LICENSE
@@ -0,0 +1,22 @@
+(The MIT License)
+
+Copyright (c) 2015 Douglas Christopher Wilson
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/content-type/README.md b/node_modules/content-type/README.md
new file mode 100644
index 0000000..c1a922a
--- /dev/null
+++ b/node_modules/content-type/README.md
@@ -0,0 +1,94 @@
+# content-type
+
+[![NPM Version][npm-version-image]][npm-url]
+[![NPM Downloads][npm-downloads-image]][npm-url]
+[![Node.js Version][node-image]][node-url]
+[![Build Status][ci-image]][ci-url]
+[![Coverage Status][coveralls-image]][coveralls-url]
+
+Create and parse HTTP Content-Type header according to RFC 7231
+
+## Installation
+
+```sh
+$ npm install content-type
+```
+
+## API
+
+```js
+var contentType = require('content-type')
+```
+
+### contentType.parse(string)
+
+```js
+var obj = contentType.parse('image/svg+xml; charset=utf-8')
+```
+
+Parse a `Content-Type` header. This will return an object with the following
+properties (examples are shown for the string `'image/svg+xml; charset=utf-8'`):
+
+ - `type`: The media type (the type and subtype, always lower case).
+ Example: `'image/svg+xml'`
+
+ - `parameters`: An object of the parameters in the media type (name of parameter
+ always lower case). Example: `{charset: 'utf-8'}`
+
+Throws a `TypeError` if the string is missing or invalid.
+
+### contentType.parse(req)
+
+```js
+var obj = contentType.parse(req)
+```
+
+Parse the `Content-Type` header from the given `req`. Short-cut for
+`contentType.parse(req.headers['content-type'])`.
+
+Throws a `TypeError` if the `Content-Type` header is missing or invalid.
+
+### contentType.parse(res)
+
+```js
+var obj = contentType.parse(res)
+```
+
+Parse the `Content-Type` header set on the given `res`. Short-cut for
+`contentType.parse(res.getHeader('content-type'))`.
+
+Throws a `TypeError` if the `Content-Type` header is missing or invalid.
+
+### contentType.format(obj)
+
+```js
+var str = contentType.format({
+ type: 'image/svg+xml',
+ parameters: { charset: 'utf-8' }
+})
+```
+
+Format an object into a `Content-Type` header. This will return a string of the
+content type for the given object with the following properties (examples are
+shown that produce the string `'image/svg+xml; charset=utf-8'`):
+
+ - `type`: The media type (will be lower-cased). Example: `'image/svg+xml'`
+
+ - `parameters`: An object of the parameters in the media type (name of the
+ parameter will be lower-cased). Example: `{charset: 'utf-8'}`
+
+Throws a `TypeError` if the object contains an invalid type or parameter names.
+
+## License
+
+[MIT](LICENSE)
+
+[ci-image]: https://badgen.net/github/checks/jshttp/content-type/master?label=ci
+[ci-url]: https://github.com/jshttp/content-type/actions/workflows/ci.yml
+[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/content-type/master
+[coveralls-url]: https://coveralls.io/r/jshttp/content-type?branch=master
+[node-image]: https://badgen.net/npm/node/content-type
+[node-url]: https://nodejs.org/en/download
+[npm-downloads-image]: https://badgen.net/npm/dm/content-type
+[npm-url]: https://npmjs.org/package/content-type
+[npm-version-image]: https://badgen.net/npm/v/content-type
diff --git a/node_modules/content-type/index.js b/node_modules/content-type/index.js
new file mode 100644
index 0000000..41840e7
--- /dev/null
+++ b/node_modules/content-type/index.js
@@ -0,0 +1,225 @@
+/*!
+ * content-type
+ * Copyright(c) 2015 Douglas Christopher Wilson
+ * MIT Licensed
+ */
+
+'use strict'
+
+/**
+ * RegExp to match *( ";" parameter ) in RFC 7231 sec 3.1.1.1
+ *
+ * parameter = token "=" ( token / quoted-string )
+ * token = 1*tchar
+ * tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*"
+ * / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~"
+ * / DIGIT / ALPHA
+ * ; any VCHAR, except delimiters
+ * quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE
+ * qdtext = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text
+ * obs-text = %x80-FF
+ * quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text )
+ */
+var PARAM_REGEXP = /; *([!#$%&'*+.^_`|~0-9A-Za-z-]+) *= *("(?:[\u000b\u0020\u0021\u0023-\u005b\u005d-\u007e\u0080-\u00ff]|\\[\u000b\u0020-\u00ff])*"|[!#$%&'*+.^_`|~0-9A-Za-z-]+) */g // eslint-disable-line no-control-regex
+var TEXT_REGEXP = /^[\u000b\u0020-\u007e\u0080-\u00ff]+$/ // eslint-disable-line no-control-regex
+var TOKEN_REGEXP = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/
+
+/**
+ * RegExp to match quoted-pair in RFC 7230 sec 3.2.6
+ *
+ * quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text )
+ * obs-text = %x80-FF
+ */
+var QESC_REGEXP = /\\([\u000b\u0020-\u00ff])/g // eslint-disable-line no-control-regex
+
+/**
+ * RegExp to match chars that must be quoted-pair in RFC 7230 sec 3.2.6
+ */
+var QUOTE_REGEXP = /([\\"])/g
+
+/**
+ * RegExp to match type in RFC 7231 sec 3.1.1.1
+ *
+ * media-type = type "/" subtype
+ * type = token
+ * subtype = token
+ */
+var TYPE_REGEXP = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+\/[!#$%&'*+.^_`|~0-9A-Za-z-]+$/
+
+/**
+ * Module exports.
+ * @public
+ */
+
+exports.format = format
+exports.parse = parse
+
+/**
+ * Format object to media type.
+ *
+ * @param {object} obj
+ * @return {string}
+ * @public
+ */
+
+function format (obj) {
+ if (!obj || typeof obj !== 'object') {
+ throw new TypeError('argument obj is required')
+ }
+
+ var parameters = obj.parameters
+ var type = obj.type
+
+ if (!type || !TYPE_REGEXP.test(type)) {
+ throw new TypeError('invalid type')
+ }
+
+ var string = type
+
+ // append parameters
+ if (parameters && typeof parameters === 'object') {
+ var param
+ var params = Object.keys(parameters).sort()
+
+ for (var i = 0; i < params.length; i++) {
+ param = params[i]
+
+ if (!TOKEN_REGEXP.test(param)) {
+ throw new TypeError('invalid parameter name')
+ }
+
+ string += '; ' + param + '=' + qstring(parameters[param])
+ }
+ }
+
+ return string
+}
+
+/**
+ * Parse media type to object.
+ *
+ * @param {string|object} string
+ * @return {Object}
+ * @public
+ */
+
+function parse (string) {
+ if (!string) {
+ throw new TypeError('argument string is required')
+ }
+
+ // support req/res-like objects as argument
+ var header = typeof string === 'object'
+ ? getcontenttype(string)
+ : string
+
+ if (typeof header !== 'string') {
+ throw new TypeError('argument string is required to be a string')
+ }
+
+ var index = header.indexOf(';')
+ var type = index !== -1
+ ? header.slice(0, index).trim()
+ : header.trim()
+
+ if (!TYPE_REGEXP.test(type)) {
+ throw new TypeError('invalid media type')
+ }
+
+ var obj = new ContentType(type.toLowerCase())
+
+ // parse parameters
+ if (index !== -1) {
+ var key
+ var match
+ var value
+
+ PARAM_REGEXP.lastIndex = index
+
+ while ((match = PARAM_REGEXP.exec(header))) {
+ if (match.index !== index) {
+ throw new TypeError('invalid parameter format')
+ }
+
+ index += match[0].length
+ key = match[1].toLowerCase()
+ value = match[2]
+
+ if (value.charCodeAt(0) === 0x22 /* " */) {
+ // remove quotes
+ value = value.slice(1, -1)
+
+ // remove escapes
+ if (value.indexOf('\\') !== -1) {
+ value = value.replace(QESC_REGEXP, '$1')
+ }
+ }
+
+ obj.parameters[key] = value
+ }
+
+ if (index !== header.length) {
+ throw new TypeError('invalid parameter format')
+ }
+ }
+
+ return obj
+}
+
+/**
+ * Get content-type from req/res objects.
+ *
+ * @param {object}
+ * @return {Object}
+ * @private
+ */
+
+function getcontenttype (obj) {
+ var header
+
+ if (typeof obj.getHeader === 'function') {
+ // res-like
+ header = obj.getHeader('content-type')
+ } else if (typeof obj.headers === 'object') {
+ // req-like
+ header = obj.headers && obj.headers['content-type']
+ }
+
+ if (typeof header !== 'string') {
+ throw new TypeError('content-type header is missing from object')
+ }
+
+ return header
+}
+
+/**
+ * Quote a string if necessary.
+ *
+ * @param {string} val
+ * @return {string}
+ * @private
+ */
+
+function qstring (val) {
+ var str = String(val)
+
+ // no need to quote tokens
+ if (TOKEN_REGEXP.test(str)) {
+ return str
+ }
+
+ if (str.length > 0 && !TEXT_REGEXP.test(str)) {
+ throw new TypeError('invalid parameter value')
+ }
+
+ return '"' + str.replace(QUOTE_REGEXP, '\\$1') + '"'
+}
+
+/**
+ * Class to represent a content type.
+ * @private
+ */
+function ContentType (type) {
+ this.parameters = Object.create(null)
+ this.type = type
+}
diff --git a/node_modules/content-type/package.json b/node_modules/content-type/package.json
new file mode 100644
index 0000000..9db19f6
--- /dev/null
+++ b/node_modules/content-type/package.json
@@ -0,0 +1,42 @@
+{
+ "name": "content-type",
+ "description": "Create and parse HTTP Content-Type header",
+ "version": "1.0.5",
+ "author": "Douglas Christopher Wilson ",
+ "license": "MIT",
+ "keywords": [
+ "content-type",
+ "http",
+ "req",
+ "res",
+ "rfc7231"
+ ],
+ "repository": "jshttp/content-type",
+ "devDependencies": {
+ "deep-equal": "1.0.1",
+ "eslint": "8.32.0",
+ "eslint-config-standard": "15.0.1",
+ "eslint-plugin-import": "2.27.5",
+ "eslint-plugin-node": "11.1.0",
+ "eslint-plugin-promise": "6.1.1",
+ "eslint-plugin-standard": "4.1.0",
+ "mocha": "10.2.0",
+ "nyc": "15.1.0"
+ },
+ "files": [
+ "LICENSE",
+ "HISTORY.md",
+ "README.md",
+ "index.js"
+ ],
+ "engines": {
+ "node": ">= 0.6"
+ },
+ "scripts": {
+ "lint": "eslint .",
+ "test": "mocha --reporter spec --check-leaks --bail test/",
+ "test-ci": "nyc --reporter=lcovonly --reporter=text npm test",
+ "test-cov": "nyc --reporter=html --reporter=text npm test",
+ "version": "node scripts/version-history.js && git add HISTORY.md"
+ }
+}
diff --git a/node_modules/cors/CONTRIBUTING.md b/node_modules/cors/CONTRIBUTING.md
new file mode 100644
index 0000000..591b09a
--- /dev/null
+++ b/node_modules/cors/CONTRIBUTING.md
@@ -0,0 +1,33 @@
+# contributing to `cors`
+
+CORS is a node.js package for providing a [connect](http://www.senchalabs.org/connect/)/[express](http://expressjs.com/) middleware that can be used to enable [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing) with various options. Learn more about the project in [the README](README.md).
+
+## The CORS Spec
+
+[http://www.w3.org/TR/cors/](http://www.w3.org/TR/cors/)
+
+## Pull Requests Welcome
+
+* Include `'use strict';` in every javascript file.
+* 2 space indentation.
+* Please run the testing steps below before submitting.
+
+## Testing
+
+```bash
+$ npm install
+$ npm test
+```
+
+## Interactive Testing Harness
+
+[http://node-cors-client.herokuapp.com](http://node-cors-client.herokuapp.com)
+
+Related git repositories:
+
+* [https://github.com/TroyGoode/node-cors-server](https://github.com/TroyGoode/node-cors-server)
+* [https://github.com/TroyGoode/node-cors-client](https://github.com/TroyGoode/node-cors-client)
+
+## License
+
+[MIT License](http://www.opensource.org/licenses/mit-license.php)
diff --git a/node_modules/cors/HISTORY.md b/node_modules/cors/HISTORY.md
new file mode 100644
index 0000000..5762bce
--- /dev/null
+++ b/node_modules/cors/HISTORY.md
@@ -0,0 +1,58 @@
+2.8.5 / 2018-11-04
+==================
+
+ * Fix setting `maxAge` option to `0`
+
+2.8.4 / 2017-07-12
+==================
+
+ * Work-around Safari bug in default pre-flight response
+
+2.8.3 / 2017-03-29
+==================
+
+ * Fix error when options delegate missing `methods` option
+
+2.8.2 / 2017-03-28
+==================
+
+ * Fix error when frozen options are passed
+ * Send "Vary: Origin" when using regular expressions
+ * Send "Vary: Access-Control-Request-Headers" when dynamic `allowedHeaders`
+
+2.8.1 / 2016-09-08
+==================
+
+This release only changed documentation.
+
+2.8.0 / 2016-08-23
+==================
+
+ * Add `optionsSuccessStatus` option
+
+2.7.2 / 2016-08-23
+==================
+
+ * Fix error when Node.js running in strict mode
+
+2.7.1 / 2015-05-28
+==================
+
+ * Move module into expressjs organization
+
+2.7.0 / 2015-05-28
+==================
+
+ * Allow array of matching condition as `origin` option
+ * Allow regular expression as `origin` option
+
+2.6.1 / 2015-05-28
+==================
+
+ * Update `license` in package.json
+
+2.6.0 / 2015-04-27
+==================
+
+ * Add `preflightContinue` option
+ * Fix "Vary: Origin" header added for "*"
diff --git a/node_modules/cors/LICENSE b/node_modules/cors/LICENSE
new file mode 100644
index 0000000..fd10c84
--- /dev/null
+++ b/node_modules/cors/LICENSE
@@ -0,0 +1,22 @@
+(The MIT License)
+
+Copyright (c) 2013 Troy Goode
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/cors/README.md b/node_modules/cors/README.md
new file mode 100644
index 0000000..732b847
--- /dev/null
+++ b/node_modules/cors/README.md
@@ -0,0 +1,243 @@
+# cors
+
+[![NPM Version][npm-image]][npm-url]
+[![NPM Downloads][downloads-image]][downloads-url]
+[![Build Status][travis-image]][travis-url]
+[![Test Coverage][coveralls-image]][coveralls-url]
+
+CORS is a node.js package for providing a [Connect](http://www.senchalabs.org/connect/)/[Express](http://expressjs.com/) middleware that can be used to enable [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing) with various options.
+
+**[Follow me (@troygoode) on Twitter!](https://twitter.com/intent/user?screen_name=troygoode)**
+
+* [Installation](#installation)
+* [Usage](#usage)
+ * [Simple Usage](#simple-usage-enable-all-cors-requests)
+ * [Enable CORS for a Single Route](#enable-cors-for-a-single-route)
+ * [Configuring CORS](#configuring-cors)
+ * [Configuring CORS Asynchronously](#configuring-cors-asynchronously)
+ * [Enabling CORS Pre-Flight](#enabling-cors-pre-flight)
+* [Configuration Options](#configuration-options)
+* [Demo](#demo)
+* [License](#license)
+* [Author](#author)
+
+## Installation
+
+This is a [Node.js](https://nodejs.org/en/) module available through the
+[npm registry](https://www.npmjs.com/). Installation is done using the
+[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
+
+```sh
+$ npm install cors
+```
+
+## Usage
+
+### Simple Usage (Enable *All* CORS Requests)
+
+```javascript
+var express = require('express')
+var cors = require('cors')
+var app = express()
+
+app.use(cors())
+
+app.get('/products/:id', function (req, res, next) {
+ res.json({msg: 'This is CORS-enabled for all origins!'})
+})
+
+app.listen(80, function () {
+ console.log('CORS-enabled web server listening on port 80')
+})
+```
+
+### Enable CORS for a Single Route
+
+```javascript
+var express = require('express')
+var cors = require('cors')
+var app = express()
+
+app.get('/products/:id', cors(), function (req, res, next) {
+ res.json({msg: 'This is CORS-enabled for a Single Route'})
+})
+
+app.listen(80, function () {
+ console.log('CORS-enabled web server listening on port 80')
+})
+```
+
+### Configuring CORS
+
+```javascript
+var express = require('express')
+var cors = require('cors')
+var app = express()
+
+var corsOptions = {
+ origin: 'http://example.com',
+ optionsSuccessStatus: 200 // some legacy browsers (IE11, various SmartTVs) choke on 204
+}
+
+app.get('/products/:id', cors(corsOptions), function (req, res, next) {
+ res.json({msg: 'This is CORS-enabled for only example.com.'})
+})
+
+app.listen(80, function () {
+ console.log('CORS-enabled web server listening on port 80')
+})
+```
+
+### Configuring CORS w/ Dynamic Origin
+
+```javascript
+var express = require('express')
+var cors = require('cors')
+var app = express()
+
+var whitelist = ['http://example1.com', 'http://example2.com']
+var corsOptions = {
+ origin: function (origin, callback) {
+ if (whitelist.indexOf(origin) !== -1) {
+ callback(null, true)
+ } else {
+ callback(new Error('Not allowed by CORS'))
+ }
+ }
+}
+
+app.get('/products/:id', cors(corsOptions), function (req, res, next) {
+ res.json({msg: 'This is CORS-enabled for a whitelisted domain.'})
+})
+
+app.listen(80, function () {
+ console.log('CORS-enabled web server listening on port 80')
+})
+```
+
+If you do not want to block REST tools or server-to-server requests,
+add a `!origin` check in the origin function like so:
+
+```javascript
+var corsOptions = {
+ origin: function (origin, callback) {
+ if (whitelist.indexOf(origin) !== -1 || !origin) {
+ callback(null, true)
+ } else {
+ callback(new Error('Not allowed by CORS'))
+ }
+ }
+}
+```
+
+### Enabling CORS Pre-Flight
+
+Certain CORS requests are considered 'complex' and require an initial
+`OPTIONS` request (called the "pre-flight request"). An example of a
+'complex' CORS request is one that uses an HTTP verb other than
+GET/HEAD/POST (such as DELETE) or that uses custom headers. To enable
+pre-flighting, you must add a new OPTIONS handler for the route you want
+to support:
+
+```javascript
+var express = require('express')
+var cors = require('cors')
+var app = express()
+
+app.options('/products/:id', cors()) // enable pre-flight request for DELETE request
+app.del('/products/:id', cors(), function (req, res, next) {
+ res.json({msg: 'This is CORS-enabled for all origins!'})
+})
+
+app.listen(80, function () {
+ console.log('CORS-enabled web server listening on port 80')
+})
+```
+
+You can also enable pre-flight across-the-board like so:
+
+```javascript
+app.options('*', cors()) // include before other routes
+```
+
+### Configuring CORS Asynchronously
+
+```javascript
+var express = require('express')
+var cors = require('cors')
+var app = express()
+
+var whitelist = ['http://example1.com', 'http://example2.com']
+var corsOptionsDelegate = function (req, callback) {
+ var corsOptions;
+ if (whitelist.indexOf(req.header('Origin')) !== -1) {
+ corsOptions = { origin: true } // reflect (enable) the requested origin in the CORS response
+ } else {
+ corsOptions = { origin: false } // disable CORS for this request
+ }
+ callback(null, corsOptions) // callback expects two parameters: error and options
+}
+
+app.get('/products/:id', cors(corsOptionsDelegate), function (req, res, next) {
+ res.json({msg: 'This is CORS-enabled for a whitelisted domain.'})
+})
+
+app.listen(80, function () {
+ console.log('CORS-enabled web server listening on port 80')
+})
+```
+
+## Configuration Options
+
+* `origin`: Configures the **Access-Control-Allow-Origin** CORS header. Possible values:
+ - `Boolean` - set `origin` to `true` to reflect the [request origin](http://tools.ietf.org/html/draft-abarth-origin-09), as defined by `req.header('Origin')`, or set it to `false` to disable CORS.
+ - `String` - set `origin` to a specific origin. For example if you set it to `"http://example.com"` only requests from "http://example.com" will be allowed.
+ - `RegExp` - set `origin` to a regular expression pattern which will be used to test the request origin. If it's a match, the request origin will be reflected. For example the pattern `/example\.com$/` will reflect any request that is coming from an origin ending with "example.com".
+ - `Array` - set `origin` to an array of valid origins. Each origin can be a `String` or a `RegExp`. For example `["http://example1.com", /\.example2\.com$/]` will accept any request from "http://example1.com" or from a subdomain of "example2.com".
+ - `Function` - set `origin` to a function implementing some custom logic. The function takes the request origin as the first parameter and a callback (which expects the signature `err [object], allow [bool]`) as the second.
+* `methods`: Configures the **Access-Control-Allow-Methods** CORS header. Expects a comma-delimited string (ex: 'GET,PUT,POST') or an array (ex: `['GET', 'PUT', 'POST']`).
+* `allowedHeaders`: Configures the **Access-Control-Allow-Headers** CORS header. Expects a comma-delimited string (ex: 'Content-Type,Authorization') or an array (ex: `['Content-Type', 'Authorization']`). If not specified, defaults to reflecting the headers specified in the request's **Access-Control-Request-Headers** header.
+* `exposedHeaders`: Configures the **Access-Control-Expose-Headers** CORS header. Expects a comma-delimited string (ex: 'Content-Range,X-Content-Range') or an array (ex: `['Content-Range', 'X-Content-Range']`). If not specified, no custom headers are exposed.
+* `credentials`: Configures the **Access-Control-Allow-Credentials** CORS header. Set to `true` to pass the header, otherwise it is omitted.
+* `maxAge`: Configures the **Access-Control-Max-Age** CORS header. Set to an integer to pass the header, otherwise it is omitted.
+* `preflightContinue`: Pass the CORS preflight response to the next handler.
+* `optionsSuccessStatus`: Provides a status code to use for successful `OPTIONS` requests, since some legacy browsers (IE11, various SmartTVs) choke on `204`.
+
+The default configuration is the equivalent of:
+
+```json
+{
+ "origin": "*",
+ "methods": "GET,HEAD,PUT,PATCH,POST,DELETE",
+ "preflightContinue": false,
+ "optionsSuccessStatus": 204
+}
+```
+
+For details on the effect of each CORS header, read [this](http://www.html5rocks.com/en/tutorials/cors/) article on HTML5 Rocks.
+
+## Demo
+
+A demo that illustrates CORS working (and not working) using jQuery is available here: [http://node-cors-client.herokuapp.com/](http://node-cors-client.herokuapp.com/)
+
+Code for that demo can be found here:
+
+* Client: [https://github.com/TroyGoode/node-cors-client](https://github.com/TroyGoode/node-cors-client)
+* Server: [https://github.com/TroyGoode/node-cors-server](https://github.com/TroyGoode/node-cors-server)
+
+## License
+
+[MIT License](http://www.opensource.org/licenses/mit-license.php)
+
+## Author
+
+[Troy Goode](https://github.com/TroyGoode) ([troygoode@gmail.com](mailto:troygoode@gmail.com))
+
+[coveralls-image]: https://img.shields.io/coveralls/expressjs/cors/master.svg
+[coveralls-url]: https://coveralls.io/r/expressjs/cors?branch=master
+[downloads-image]: https://img.shields.io/npm/dm/cors.svg
+[downloads-url]: https://npmjs.org/package/cors
+[npm-image]: https://img.shields.io/npm/v/cors.svg
+[npm-url]: https://npmjs.org/package/cors
+[travis-image]: https://img.shields.io/travis/expressjs/cors/master.svg
+[travis-url]: https://travis-ci.org/expressjs/cors
diff --git a/node_modules/cors/lib/index.js b/node_modules/cors/lib/index.js
new file mode 100644
index 0000000..5475aec
--- /dev/null
+++ b/node_modules/cors/lib/index.js
@@ -0,0 +1,238 @@
+(function () {
+
+ 'use strict';
+
+ var assign = require('object-assign');
+ var vary = require('vary');
+
+ var defaults = {
+ origin: '*',
+ methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',
+ preflightContinue: false,
+ optionsSuccessStatus: 204
+ };
+
+ function isString(s) {
+ return typeof s === 'string' || s instanceof String;
+ }
+
+ function isOriginAllowed(origin, allowedOrigin) {
+ if (Array.isArray(allowedOrigin)) {
+ for (var i = 0; i < allowedOrigin.length; ++i) {
+ if (isOriginAllowed(origin, allowedOrigin[i])) {
+ return true;
+ }
+ }
+ return false;
+ } else if (isString(allowedOrigin)) {
+ return origin === allowedOrigin;
+ } else if (allowedOrigin instanceof RegExp) {
+ return allowedOrigin.test(origin);
+ } else {
+ return !!allowedOrigin;
+ }
+ }
+
+ function configureOrigin(options, req) {
+ var requestOrigin = req.headers.origin,
+ headers = [],
+ isAllowed;
+
+ if (!options.origin || options.origin === '*') {
+ // allow any origin
+ headers.push([{
+ key: 'Access-Control-Allow-Origin',
+ value: '*'
+ }]);
+ } else if (isString(options.origin)) {
+ // fixed origin
+ headers.push([{
+ key: 'Access-Control-Allow-Origin',
+ value: options.origin
+ }]);
+ headers.push([{
+ key: 'Vary',
+ value: 'Origin'
+ }]);
+ } else {
+ isAllowed = isOriginAllowed(requestOrigin, options.origin);
+ // reflect origin
+ headers.push([{
+ key: 'Access-Control-Allow-Origin',
+ value: isAllowed ? requestOrigin : false
+ }]);
+ headers.push([{
+ key: 'Vary',
+ value: 'Origin'
+ }]);
+ }
+
+ return headers;
+ }
+
+ function configureMethods(options) {
+ var methods = options.methods;
+ if (methods.join) {
+ methods = options.methods.join(','); // .methods is an array, so turn it into a string
+ }
+ return {
+ key: 'Access-Control-Allow-Methods',
+ value: methods
+ };
+ }
+
+ function configureCredentials(options) {
+ if (options.credentials === true) {
+ return {
+ key: 'Access-Control-Allow-Credentials',
+ value: 'true'
+ };
+ }
+ return null;
+ }
+
+ function configureAllowedHeaders(options, req) {
+ var allowedHeaders = options.allowedHeaders || options.headers;
+ var headers = [];
+
+ if (!allowedHeaders) {
+ allowedHeaders = req.headers['access-control-request-headers']; // .headers wasn't specified, so reflect the request headers
+ headers.push([{
+ key: 'Vary',
+ value: 'Access-Control-Request-Headers'
+ }]);
+ } else if (allowedHeaders.join) {
+ allowedHeaders = allowedHeaders.join(','); // .headers is an array, so turn it into a string
+ }
+ if (allowedHeaders && allowedHeaders.length) {
+ headers.push([{
+ key: 'Access-Control-Allow-Headers',
+ value: allowedHeaders
+ }]);
+ }
+
+ return headers;
+ }
+
+ function configureExposedHeaders(options) {
+ var headers = options.exposedHeaders;
+ if (!headers) {
+ return null;
+ } else if (headers.join) {
+ headers = headers.join(','); // .headers is an array, so turn it into a string
+ }
+ if (headers && headers.length) {
+ return {
+ key: 'Access-Control-Expose-Headers',
+ value: headers
+ };
+ }
+ return null;
+ }
+
+ function configureMaxAge(options) {
+ var maxAge = (typeof options.maxAge === 'number' || options.maxAge) && options.maxAge.toString()
+ if (maxAge && maxAge.length) {
+ return {
+ key: 'Access-Control-Max-Age',
+ value: maxAge
+ };
+ }
+ return null;
+ }
+
+ function applyHeaders(headers, res) {
+ for (var i = 0, n = headers.length; i < n; i++) {
+ var header = headers[i];
+ if (header) {
+ if (Array.isArray(header)) {
+ applyHeaders(header, res);
+ } else if (header.key === 'Vary' && header.value) {
+ vary(res, header.value);
+ } else if (header.value) {
+ res.setHeader(header.key, header.value);
+ }
+ }
+ }
+ }
+
+ function cors(options, req, res, next) {
+ var headers = [],
+ method = req.method && req.method.toUpperCase && req.method.toUpperCase();
+
+ if (method === 'OPTIONS') {
+ // preflight
+ headers.push(configureOrigin(options, req));
+ headers.push(configureCredentials(options, req));
+ headers.push(configureMethods(options, req));
+ headers.push(configureAllowedHeaders(options, req));
+ headers.push(configureMaxAge(options, req));
+ headers.push(configureExposedHeaders(options, req));
+ applyHeaders(headers, res);
+
+ if (options.preflightContinue) {
+ next();
+ } else {
+ // Safari (and potentially other browsers) need content-length 0,
+ // for 204 or they just hang waiting for a body
+ res.statusCode = options.optionsSuccessStatus;
+ res.setHeader('Content-Length', '0');
+ res.end();
+ }
+ } else {
+ // actual response
+ headers.push(configureOrigin(options, req));
+ headers.push(configureCredentials(options, req));
+ headers.push(configureExposedHeaders(options, req));
+ applyHeaders(headers, res);
+ next();
+ }
+ }
+
+ function middlewareWrapper(o) {
+ // if options are static (either via defaults or custom options passed in), wrap in a function
+ var optionsCallback = null;
+ if (typeof o === 'function') {
+ optionsCallback = o;
+ } else {
+ optionsCallback = function (req, cb) {
+ cb(null, o);
+ };
+ }
+
+ return function corsMiddleware(req, res, next) {
+ optionsCallback(req, function (err, options) {
+ if (err) {
+ next(err);
+ } else {
+ var corsOptions = assign({}, defaults, options);
+ var originCallback = null;
+ if (corsOptions.origin && typeof corsOptions.origin === 'function') {
+ originCallback = corsOptions.origin;
+ } else if (corsOptions.origin) {
+ originCallback = function (origin, cb) {
+ cb(null, corsOptions.origin);
+ };
+ }
+
+ if (originCallback) {
+ originCallback(req.headers.origin, function (err2, origin) {
+ if (err2 || !origin) {
+ next(err2);
+ } else {
+ corsOptions.origin = origin;
+ cors(corsOptions, req, res, next);
+ }
+ });
+ } else {
+ next();
+ }
+ }
+ });
+ };
+ }
+
+ // can pass either an options hash, an options delegate, or nothing
+ module.exports = middlewareWrapper;
+
+}());
diff --git a/node_modules/cors/package.json b/node_modules/cors/package.json
new file mode 100644
index 0000000..ff37d98
--- /dev/null
+++ b/node_modules/cors/package.json
@@ -0,0 +1,41 @@
+{
+ "name": "cors",
+ "description": "Node.js CORS middleware",
+ "version": "2.8.5",
+ "author": "Troy Goode (https://github.com/troygoode/)",
+ "license": "MIT",
+ "keywords": [
+ "cors",
+ "express",
+ "connect",
+ "middleware"
+ ],
+ "repository": "expressjs/cors",
+ "main": "./lib/index.js",
+ "dependencies": {
+ "object-assign": "^4",
+ "vary": "^1"
+ },
+ "devDependencies": {
+ "after": "0.8.2",
+ "eslint": "2.13.1",
+ "express": "4.16.3",
+ "mocha": "5.2.0",
+ "nyc": "13.1.0",
+ "supertest": "3.3.0"
+ },
+ "files": [
+ "lib/index.js",
+ "CONTRIBUTING.md",
+ "HISTORY.md",
+ "LICENSE",
+ "README.md"
+ ],
+ "engines": {
+ "node": ">= 0.10"
+ },
+ "scripts": {
+ "test": "npm run lint && nyc --reporter=html --reporter=text mocha --require test/support/env",
+ "lint": "eslint lib test"
+ }
+}
diff --git a/node_modules/csstype/LICENSE b/node_modules/csstype/LICENSE
new file mode 100644
index 0000000..ac06f62
--- /dev/null
+++ b/node_modules/csstype/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2017-2018 Fredrik Nicol
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/csstype/README.md b/node_modules/csstype/README.md
new file mode 100644
index 0000000..75947e1
--- /dev/null
+++ b/node_modules/csstype/README.md
@@ -0,0 +1,277 @@
+# CSSType
+
+[![npm](https://img.shields.io/npm/v/csstype.svg)](https://www.npmjs.com/package/csstype)
+
+TypeScript and Flow definitions for CSS, generated by [data from MDN](https://github.com/mdn/data). It provides autocompletion and type checking for CSS properties and values.
+
+**TypeScript**
+
+```ts
+import type * as CSS from 'csstype';
+
+const style: CSS.Properties = {
+ colour: 'white', // Type error on property
+ textAlign: 'middle', // Type error on value
+};
+```
+
+**Flow**
+
+```js
+// @flow strict
+import * as CSS from 'csstype';
+
+const style: CSS.Properties<> = {
+ colour: 'white', // Type error on property
+ textAlign: 'middle', // Type error on value
+};
+```
+
+_Further examples below will be in TypeScript!_
+
+## Getting started
+
+```sh
+$ npm install csstype
+```
+
+## Table of content
+
+- [Style types](#style-types)
+- [At-rule types](#at-rule-types)
+- [Pseudo types](#pseudo-types)
+- [Generics](#generics)
+- [Usage](#usage)
+- [What should I do when I get type errors?](#what-should-i-do-when-i-get-type-errors)
+- [Version 3.0](#version-30)
+- [Contributing](#contributing)
+
+## Style types
+
+Properties are categorized in different uses and in several technical variations to provide typings that suits as many as possible.
+
+| | Default | `Hyphen` | `Fallback` | `HyphenFallback` |
+| -------------- | -------------------- | -------------------------- | ---------------------------- | ---------------------------------- |
+| **All** | `Properties` | `PropertiesHyphen` | `PropertiesFallback` | `PropertiesHyphenFallback` |
+| **`Standard`** | `StandardProperties` | `StandardPropertiesHyphen` | `StandardPropertiesFallback` | `StandardPropertiesHyphenFallback` |
+| **`Vendor`** | `VendorProperties` | `VendorPropertiesHyphen` | `VendorPropertiesFallback` | `VendorPropertiesHyphenFallback` |
+| **`Obsolete`** | `ObsoleteProperties` | `ObsoletePropertiesHyphen` | `ObsoletePropertiesFallback` | `ObsoletePropertiesHyphenFallback` |
+| **`Svg`** | `SvgProperties` | `SvgPropertiesHyphen` | `SvgPropertiesFallback` | `SvgPropertiesHyphenFallback` |
+
+Categories:
+
+- **All** - Includes `Standard`, `Vendor`, `Obsolete` and `Svg`
+- **`Standard`** - Current properties and extends subcategories `StandardLonghand` and `StandardShorthand` _(e.g. `StandardShorthandProperties`)_
+- **`Vendor`** - Vendor prefixed properties and extends subcategories `VendorLonghand` and `VendorShorthand` _(e.g. `VendorShorthandProperties`)_
+- **`Obsolete`** - Removed or deprecated properties
+- **`Svg`** - SVG-specific properties
+
+Variations:
+
+- **Default** - JavaScript (camel) cased property names
+- **`Hyphen`** - CSS (kebab) cased property names
+- **`Fallback`** - Also accepts array of values e.g. `string | string[]`
+
+## At-rule types
+
+At-rule interfaces with descriptors.
+
+**TypeScript**: These will be found in the `AtRule` namespace, e.g. `AtRule.Viewport`.
+**Flow**: These will be prefixed with `AtRule$`, e.g. `AtRule$Viewport`.
+
+| | Default | `Hyphen` | `Fallback` | `HyphenFallback` |
+| -------------------- | -------------- | -------------------- | ---------------------- | ---------------------------- |
+| **`@counter-style`** | `CounterStyle` | `CounterStyleHyphen` | `CounterStyleFallback` | `CounterStyleHyphenFallback` |
+| **`@font-face`** | `FontFace` | `FontFaceHyphen` | `FontFaceFallback` | `FontFaceHyphenFallback` |
+| **`@viewport`** | `Viewport` | `ViewportHyphen` | `ViewportFallback` | `ViewportHyphenFallback` |
+
+## Pseudo types
+
+String literals of pseudo classes and pseudo elements
+
+- `Pseudos`
+
+ Extends:
+
+ - `AdvancedPseudos`
+
+ Function-like pseudos e.g. `:not(:first-child)`. The string literal contains the value excluding the parenthesis: `:not`. These are separated because they require an argument that results in infinite number of variations.
+
+ - `SimplePseudos`
+
+ Plain pseudos e.g. `:hover` that can only be **one** variation.
+
+## Generics
+
+All interfaces has two optional generic argument to define length and time: `CSS.Properties`
+
+- **Length** is the first generic parameter and defaults to `string | 0` because `0` is the only [length where the unit identifier is optional](https://drafts.csswg.org/css-values-3/#lengths). You can specify this, e.g. `string | number`, for platforms and libraries that accepts any numeric value as length with a specific unit.
+ ```tsx
+ const style: CSS.Properties = {
+ width: 100,
+ };
+ ```
+- **Time** is the second generic argument and defaults to `string`. You can specify this, e.g. `string | number`, for platforms and libraries that accepts any numeric value as length with a specific unit.
+ ```tsx
+ const style: CSS.Properties = {
+ transitionDuration: 1000,
+ };
+ ```
+
+## Usage
+
+```ts
+import type * as CSS from 'csstype';
+
+const style: CSS.Properties = {
+ width: '10px',
+ margin: '1em',
+};
+```
+
+In some cases, like for CSS-in-JS libraries, an array of values is a way to provide fallback values in CSS. Using `CSS.PropertiesFallback` instead of `CSS.Properties` will add the possibility to use any property value as an array of values.
+
+```ts
+import type * as CSS from 'csstype';
+
+const style: CSS.PropertiesFallback = {
+ display: ['-webkit-flex', 'flex'],
+ color: 'white',
+};
+```
+
+There's even string literals for pseudo selectors and elements.
+
+```ts
+import type * as CSS from 'csstype';
+
+const pseudos: { [P in CSS.SimplePseudos]?: CSS.Properties } = {
+ ':hover': {
+ display: 'flex',
+ },
+};
+```
+
+Hyphen cased (kebab cased) properties are provided in `CSS.PropertiesHyphen` and `CSS.PropertiesHyphenFallback`. It's not **not** added by default in `CSS.Properties`. To allow both of them, you can simply extend with `CSS.PropertiesHyphen` or/and `CSS.PropertiesHyphenFallback`.
+
+```ts
+import type * as CSS from 'csstype';
+
+interface Style extends CSS.Properties, CSS.PropertiesHyphen {}
+
+const style: Style = {
+ 'flex-grow': 1,
+ 'flex-shrink': 0,
+ 'font-weight': 'normal',
+ backgroundColor: 'white',
+};
+```
+
+Adding type checked CSS properties to a `HTMLElement`.
+
+```ts
+import type * as CSS from 'csstype';
+
+const style: CSS.Properties = {
+ color: 'red',
+ margin: '1em',
+};
+
+let button = document.createElement('button');
+
+Object.assign(button.style, style);
+```
+
+## What should I do when I get type errors?
+
+The goal is to have as perfect types as possible and we're trying to do our best. But with CSS Custom Properties, the CSS specification changing frequently and vendors implementing their own specifications with new releases sometimes causes type errors even if it should work. Here's some steps you could take to get it fixed:
+
+_If you're using CSS Custom Properties you can step directly to step 3._
+
+1. **First of all, make sure you're doing it right.** A type error could also indicate that you're not :wink:
+
+ - Some CSS specs that some vendors has implemented could have been officially rejected or haven't yet received any official acceptance and are therefor not included
+ - If you're using TypeScript, [type widening](https://blog.mariusschulz.com/2017/02/04/TypeScript-2-1-literal-type-widening) could be the reason you get `Type 'string' is not assignable to...` errors
+
+2. **Have a look in [issues](https://github.com/frenic/csstype/issues) to see if an issue already has been filed. If not, create a new one.** To help us out, please refer to any information you have found.
+3. Fix the issue locally with **TypeScript** (Flow further down):
+
+ - The recommended way is to use **module augmentation**. Here's a few examples:
+
+ ```ts
+ // My css.d.ts file
+ import type * as CSS from 'csstype';
+
+ declare module 'csstype' {
+ interface Properties {
+ // Add a missing property
+ WebkitRocketLauncher?: string;
+
+ // Add a CSS Custom Property
+ '--theme-color'?: 'black' | 'white';
+
+ // Allow namespaced CSS Custom Properties
+ [index: `--theme-${string}`]: any;
+
+ // Allow any CSS Custom Properties
+ [index: `--${string}`]: any;
+
+ // ...or allow any other property
+ [index: string]: any;
+ }
+ }
+ ```
+
+ - The alternative way is to use **type assertion**. Here's a few examples:
+
+ ```ts
+ const style: CSS.Properties = {
+ // Add a missing property
+ ['WebkitRocketLauncher' as any]: 'launching',
+
+ // Add a CSS Custom Property
+ ['--theme-color' as any]: 'black',
+ };
+ ```
+
+ Fix the issue locally with **Flow**:
+
+ - Use **type assertion**. Here's a few examples:
+
+ ```js
+ const style: $Exact> = {
+ // Add a missing property
+ [('WebkitRocketLauncher': any)]: 'launching',
+
+ // Add a CSS Custom Property
+ [('--theme-color': any)]: 'black',
+ };
+ ```
+
+## Version 3.0
+
+- **All property types are exposed with namespace**
+ TypeScript: `Property.AlignContent` (was `AlignContentProperty` before)
+ Flow: `Property$AlignContent`
+- **All at-rules are exposed with namespace**
+ TypeScript: `AtRule.FontFace` (was `FontFace` before)
+ Flow: `AtRule$FontFace`
+- **Data types are NOT exposed**
+ E.g. `Color` and `Box`. Because the generation of data types may suddenly be removed or renamed.
+- **TypeScript hack for autocompletion**
+ Uses `(string & {})` for literal string unions and `(number & {})` for literal number unions ([related issue](https://github.com/microsoft/TypeScript/issues/29729)). Utilize `PropertyValue` to unpack types from e.g. `(string & {})` to `string`.
+- **New generic for time**
+ Read more on the ["Generics"](#generics) section.
+- **Flow types improvements**
+ Flow Strict enabled and exact types are used.
+
+## Contributing
+
+**Never modify `index.d.ts` and `index.js.flow` directly. They are generated automatically and committed so that we can easily follow any change it results in.** Therefor it's important that you run `$ git config merge.ours.driver true` after you've forked and cloned. That setting prevents merge conflicts when doing rebase.
+
+### Commands
+
+- `npm run build` Generates typings and type checks them
+- `npm run watch` Runs build on each save
+- `npm run test` Runs the tests
+- `npm run lazy` Type checks, lints and formats everything
diff --git a/node_modules/csstype/index.d.ts b/node_modules/csstype/index.d.ts
new file mode 100644
index 0000000..b466d21
--- /dev/null
+++ b/node_modules/csstype/index.d.ts
@@ -0,0 +1,21297 @@
+export {};
+
+export type PropertyValue = TValue extends Array
+ ? Array
+ : TValue extends infer TUnpacked & {}
+ ? TUnpacked
+ : TValue;
+
+export type Fallback = { [P in keyof T]: T[P] | readonly NonNullable[] };
+
+export interface StandardLonghandProperties {
+ /**
+ * The **`accent-color`** CSS property sets the accent color for user-interface controls generated by some elements.
+ *
+ * **Syntax**: `auto | `
+ *
+ * **Initial value**: `auto`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :------: | :--: | :-: |
+ * | **93** | **92** | **15.4** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/accent-color
+ */
+ accentColor?: Property.AccentColor | undefined;
+ /**
+ * The CSS **`align-content`** property sets the distribution of space between and around content items along a flexbox's cross-axis or a grid's block axis.
+ *
+ * **Syntax**: `normal | | | ? `
+ *
+ * **Initial value**: `normal`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :------: | :-----: | :-----: | :----: | :----: |
+ * | **29** | **28** | **9** | **12** | **11** |
+ * | 21 _-x-_ | | 7 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/align-content
+ */
+ alignContent?: Property.AlignContent | undefined;
+ /**
+ * The CSS **`align-items`** property sets the `align-self` value on all direct children as a group. In Flexbox, it controls the alignment of items on the Cross Axis. In Grid Layout, it controls the alignment of items on the Block Axis within their grid area.
+ *
+ * **Syntax**: `normal | stretch | | [ ? ]`
+ *
+ * **Initial value**: `normal`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :------: | :-----: | :-----: | :----: | :----: |
+ * | **29** | **20** | **9** | **12** | **11** |
+ * | 21 _-x-_ | | 7 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/align-items
+ */
+ alignItems?: Property.AlignItems | undefined;
+ /**
+ * The **`align-self`** CSS property overrides a grid or flex item's `align-items` value. In Grid, it aligns the item inside the grid area. In Flexbox, it aligns the item on the cross axis.
+ *
+ * **Syntax**: `auto | normal | stretch | | ? `
+ *
+ * **Initial value**: `auto`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :------: | :-----: | :-----: | :----: | :----: |
+ * | **29** | **20** | **9** | **12** | **10** |
+ * | 21 _-x-_ | | 7 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/align-self
+ */
+ alignSelf?: Property.AlignSelf | undefined;
+ /**
+ * The **`align-tracks`** CSS property sets the alignment in the masonry axis for grid containers that have masonry in their block axis.
+ *
+ * **Syntax**: `[ normal | | | ? ]#`
+ *
+ * **Initial value**: `normal`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :--: | :-: |
+ * | No | n/a | No | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/align-tracks
+ */
+ alignTracks?: Property.AlignTracks | undefined;
+ /**
+ * The **`animation-composition`** CSS property specifies the composite operation to use when multiple animations affect the same property simultaneously.
+ *
+ * **Syntax**: `#`
+ *
+ * **Initial value**: `replace`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :-----: | :-----: | :----: | :--: | :-: |
+ * | **112** | **115** | **16** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/animation-composition
+ */
+ animationComposition?: Property.AnimationComposition | undefined;
+ /**
+ * The **`animation-delay`** CSS property specifies the amount of time to wait from applying the animation to an element before beginning to perform the animation. The animation can start later, immediately from its beginning, or immediately and partway through the animation.
+ *
+ * **Syntax**: `#`
+ *
+ * **Initial value**: `0s`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :-----: | :-----: | :-----: | :----: | :----: |
+ * | **43** | **16** | **9** | **12** | **10** |
+ * | 3 _-x-_ | 5 _-x-_ | 4 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/animation-delay
+ */
+ animationDelay?: Property.AnimationDelay | undefined;
+ /**
+ * The **`animation-direction`** CSS property sets whether an animation should play forward, backward, or alternate back and forth between playing the sequence forward and backward.
+ *
+ * **Syntax**: `#`
+ *
+ * **Initial value**: `normal`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :-----: | :-----: | :-----: | :----: | :----: |
+ * | **43** | **16** | **9** | **12** | **10** |
+ * | 3 _-x-_ | 5 _-x-_ | 4 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/animation-direction
+ */
+ animationDirection?: Property.AnimationDirection | undefined;
+ /**
+ * The **`animation-duration`** CSS property sets the length of time that an animation takes to complete one cycle.
+ *
+ * **Syntax**: `#`
+ *
+ * **Initial value**: `0s`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :-----: | :-----: | :-----: | :----: | :----: |
+ * | **43** | **16** | **9** | **12** | **10** |
+ * | 3 _-x-_ | 5 _-x-_ | 4 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/animation-duration
+ */
+ animationDuration?: Property.AnimationDuration | undefined;
+ /**
+ * The **`animation-fill-mode`** CSS property sets how a CSS animation applies styles to its target before and after its execution.
+ *
+ * **Syntax**: `#`
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :-----: | :-----: | :-----: | :----: | :----: |
+ * | **43** | **16** | **9** | **12** | **10** |
+ * | 3 _-x-_ | 5 _-x-_ | 5 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/animation-fill-mode
+ */
+ animationFillMode?: Property.AnimationFillMode | undefined;
+ /**
+ * The **`animation-iteration-count`** CSS property sets the number of times an animation sequence should be played before stopping.
+ *
+ * **Syntax**: `#`
+ *
+ * **Initial value**: `1`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :-----: | :-----: | :-----: | :----: | :----: |
+ * | **43** | **16** | **9** | **12** | **10** |
+ * | 3 _-x-_ | 5 _-x-_ | 4 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/animation-iteration-count
+ */
+ animationIterationCount?: Property.AnimationIterationCount | undefined;
+ /**
+ * The **`animation-name`** CSS property specifies the names of one or more `@keyframes` at-rules that describe the animation to apply to an element. Multiple `@keyframe` at-rules are specified as a comma-separated list of names. If the specified name does not match any `@keyframe` at-rule, no properties are animated.
+ *
+ * **Syntax**: `[ none | ]#`
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :-----: | :-----: | :-----: | :----: | :----: |
+ * | **43** | **16** | **9** | **12** | **10** |
+ * | 3 _-x-_ | 5 _-x-_ | 4 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/animation-name
+ */
+ animationName?: Property.AnimationName | undefined;
+ /**
+ * The **`animation-play-state`** CSS property sets whether an animation is running or paused.
+ *
+ * **Syntax**: `#`
+ *
+ * **Initial value**: `running`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :-----: | :-----: | :-----: | :----: | :----: |
+ * | **43** | **16** | **9** | **12** | **10** |
+ * | 3 _-x-_ | 5 _-x-_ | 4 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/animation-play-state
+ */
+ animationPlayState?: Property.AnimationPlayState | undefined;
+ /**
+ * The **`animation-range-end`** CSS property is used to set the end of an animation's attachment range along its timeline, i.e. where along the timeline an animation will end.
+ *
+ * **Syntax**: `[ normal | | ? ]#`
+ *
+ * **Initial value**: `normal`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :-----: | :-----: | :----: | :--: | :-: |
+ * | **115** | No | No | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/animation-range-end
+ */
+ animationRangeEnd?: Property.AnimationRangeEnd | undefined;
+ /**
+ * The **`animation-range-start`** CSS property is used to set the start of an animation's attachment range along its timeline, i.e. where along the timeline an animation will start.
+ *
+ * **Syntax**: `[ normal | | ? ]#`
+ *
+ * **Initial value**: `normal`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :-----: | :-----: | :----: | :--: | :-: |
+ * | **115** | No | No | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/animation-range-start
+ */
+ animationRangeStart?: Property.AnimationRangeStart | undefined;
+ /**
+ * The **`animation-timeline`** CSS property specifies the timeline that is used to control the progress of an animation.
+ *
+ * **Syntax**: `#`
+ *
+ * **Initial value**: `auto`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :-----: | :-----: | :----: | :--: | :-: |
+ * | **115** | n/a | No | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/animation-timeline
+ */
+ animationTimeline?: Property.AnimationTimeline | undefined;
+ /**
+ * The **`animation-timing-function`** CSS property sets how an animation progresses through the duration of each cycle.
+ *
+ * **Syntax**: `#`
+ *
+ * **Initial value**: `ease`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :-----: | :-----: | :-----: | :----: | :----: |
+ * | **43** | **16** | **9** | **12** | **10** |
+ * | 3 _-x-_ | 5 _-x-_ | 4 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/animation-timing-function
+ */
+ animationTimingFunction?: Property.AnimationTimingFunction | undefined;
+ /**
+ * The **`appearance`** CSS property is used to control native appearance of UI controls, that are based on operating system's theme.
+ *
+ * **Syntax**: `none | auto | textfield | menulist-button | `
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :-----: | :-----: | :------: | :------: | :-: |
+ * | **84** | **80** | **15.4** | **84** | No |
+ * | 1 _-x-_ | 1 _-x-_ | 3 _-x-_ | 12 _-x-_ | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/appearance
+ */
+ appearance?: Property.Appearance | undefined;
+ /**
+ * The **`aspect-ratio`** CSS property sets a **preferred aspect ratio** for the box, which will be used in the calculation of auto sizes and some other layout functions.
+ *
+ * **Syntax**: `auto | `
+ *
+ * **Initial value**: `auto`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :--: | :-: |
+ * | **88** | **89** | **15** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/aspect-ratio
+ */
+ aspectRatio?: Property.AspectRatio | undefined;
+ /**
+ * The **`backdrop-filter`** CSS property lets you apply graphical effects such as blurring or color shifting to the area behind an element. Because it applies to everything _behind_ the element, to see the effect you must make the element or its background at least partially transparent.
+ *
+ * **Syntax**: `none | `
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :---------: | :----: | :-: |
+ * | **76** | **103** | **9** _-x-_ | **17** | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/backdrop-filter
+ */
+ backdropFilter?: Property.BackdropFilter | undefined;
+ /**
+ * The **`backface-visibility`** CSS property sets whether the back face of an element is visible when turned towards the user.
+ *
+ * **Syntax**: `visible | hidden`
+ *
+ * **Initial value**: `visible`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :------: | :-----: | :-------: | :----: | :----: |
+ * | **36** | **16** | **15.4** | **12** | **10** |
+ * | 12 _-x-_ | | 5.1 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/backface-visibility
+ */
+ backfaceVisibility?: Property.BackfaceVisibility | undefined;
+ /**
+ * The **`background-attachment`** CSS property sets whether a background image's position is fixed within the viewport, or scrolls with its containing block.
+ *
+ * **Syntax**: `#`
+ *
+ * **Initial value**: `scroll`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :---: |
+ * | **1** | **1** | **1** | **12** | **4** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/background-attachment
+ */
+ backgroundAttachment?: Property.BackgroundAttachment | undefined;
+ /**
+ * The **`background-blend-mode`** CSS property sets how an element's background images should blend with each other and with the element's background color.
+ *
+ * **Syntax**: `#`
+ *
+ * **Initial value**: `normal`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :--: | :-: |
+ * | **35** | **30** | **8** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/background-blend-mode
+ */
+ backgroundBlendMode?: Property.BackgroundBlendMode | undefined;
+ /**
+ * The **`background-clip`** CSS property sets whether an element's background extends underneath its border box, padding box, or content box.
+ *
+ * **Syntax**: `#`
+ *
+ * **Initial value**: `border-box`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :-----: | :----: | :---: |
+ * | **1** | **4** | **5** | **12** | **9** |
+ * | | | 3 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/background-clip
+ */
+ backgroundClip?: Property.BackgroundClip | undefined;
+ /**
+ * The **`background-color`** CSS property sets the background color of an element.
+ *
+ * **Syntax**: ``
+ *
+ * **Initial value**: `transparent`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :---: |
+ * | **1** | **1** | **1** | **12** | **4** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/background-color
+ */
+ backgroundColor?: Property.BackgroundColor | undefined;
+ /**
+ * The **`background-image`** CSS property sets one or more background images on an element.
+ *
+ * **Syntax**: `#`
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :---: |
+ * | **1** | **1** | **1** | **12** | **4** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/background-image
+ */
+ backgroundImage?: Property.BackgroundImage | undefined;
+ /**
+ * The **`background-origin`** CSS property sets the background's origin: from the border start, inside the border, or inside the padding.
+ *
+ * **Syntax**: `#`
+ *
+ * **Initial value**: `padding-box`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :---: |
+ * | **1** | **4** | **3** | **12** | **9** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/background-origin
+ */
+ backgroundOrigin?: Property.BackgroundOrigin | undefined;
+ /**
+ * The **`background-position-x`** CSS property sets the initial horizontal position for each background image. The position is relative to the position layer set by `background-origin`.
+ *
+ * **Syntax**: `[ center | [ [ left | right | x-start | x-end ]? ? ]! ]#`
+ *
+ * **Initial value**: `0%`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :---: |
+ * | **1** | **49** | **1** | **12** | **6** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/background-position-x
+ */
+ backgroundPositionX?: Property.BackgroundPositionX | undefined;
+ /**
+ * The **`background-position-y`** CSS property sets the initial vertical position for each background image. The position is relative to the position layer set by `background-origin`.
+ *
+ * **Syntax**: `[ center | [ [ top | bottom | y-start | y-end ]? ? ]! ]#`
+ *
+ * **Initial value**: `0%`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :---: |
+ * | **1** | **49** | **1** | **12** | **6** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/background-position-y
+ */
+ backgroundPositionY?: Property.BackgroundPositionY | undefined;
+ /**
+ * The **`background-repeat`** CSS property sets how background images are repeated. A background image can be repeated along the horizontal and vertical axes, or not repeated at all.
+ *
+ * **Syntax**: `#`
+ *
+ * **Initial value**: `repeat`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :---: |
+ * | **1** | **1** | **1** | **12** | **4** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/background-repeat
+ */
+ backgroundRepeat?: Property.BackgroundRepeat | undefined;
+ /**
+ * The **`background-size`** CSS property sets the size of the element's background image. The image can be left to its natural size, stretched, or constrained to fit the available space.
+ *
+ * **Syntax**: `#`
+ *
+ * **Initial value**: `auto auto`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :-----: | :-----: | :-----: | :----: | :---: |
+ * | **3** | **4** | **5** | **12** | **9** |
+ * | 1 _-x-_ | | 3 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/background-size
+ */
+ backgroundSize?: Property.BackgroundSize | undefined;
+ /**
+ * **Syntax**: `clip | ellipsis | `
+ *
+ * **Initial value**: `clip`
+ */
+ blockOverflow?: Property.BlockOverflow | undefined;
+ /**
+ * The **`block-size`** CSS property defines the horizontal or vertical size of an element's block, depending on its writing mode. It corresponds to either the `width` or the `height` property, depending on the value of `writing-mode`.
+ *
+ * **Syntax**: `<'width'>`
+ *
+ * **Initial value**: `auto`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :------: | :--: | :-: |
+ * | **57** | **41** | **12.1** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/block-size
+ */
+ blockSize?: Property.BlockSize | undefined;
+ /**
+ * The **`border-block-color`** CSS property defines the color of the logical block borders of an element, which maps to a physical border color depending on the element's writing mode, directionality, and text orientation. It corresponds to the `border-top-color` and `border-bottom-color`, or `border-right-color` and `border-left-color` property depending on the values defined for `writing-mode`, `direction`, and `text-orientation`.
+ *
+ * **Syntax**: `<'border-top-color'>{1,2}`
+ *
+ * **Initial value**: `currentcolor`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :------: | :--: | :-: |
+ * | **87** | **66** | **14.1** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-block-color
+ */
+ borderBlockColor?: Property.BorderBlockColor | undefined;
+ /**
+ * The **`border-block-end-color`** CSS property defines the color of the logical block-end border of an element, which maps to a physical border color depending on the element's writing mode, directionality, and text orientation. It corresponds to the `border-top-color`, `border-right-color`, `border-bottom-color`, or `border-left-color` property depending on the values defined for `writing-mode`, `direction`, and `text-orientation`.
+ *
+ * **Syntax**: `<'border-top-color'>`
+ *
+ * **Initial value**: `currentcolor`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :------: | :--: | :-: |
+ * | **69** | **41** | **12.1** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-block-end-color
+ */
+ borderBlockEndColor?: Property.BorderBlockEndColor | undefined;
+ /**
+ * The **`border-block-end-style`** CSS property defines the style of the logical block-end border of an element, which maps to a physical border style depending on the element's writing mode, directionality, and text orientation. It corresponds to the `border-top-style`, `border-right-style`, `border-bottom-style`, or `border-left-style` property depending on the values defined for `writing-mode`, `direction`, and `text-orientation`.
+ *
+ * **Syntax**: `<'border-top-style'>`
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :------: | :--: | :-: |
+ * | **69** | **41** | **12.1** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-block-end-style
+ */
+ borderBlockEndStyle?: Property.BorderBlockEndStyle | undefined;
+ /**
+ * The **`border-block-end-width`** CSS property defines the width of the logical block-end border of an element, which maps to a physical border width depending on the element's writing mode, directionality, and text orientation. It corresponds to the `border-top-width`, `border-right-width`, `border-bottom-width`, or `border-left-width` property depending on the values defined for `writing-mode`, `direction`, and `text-orientation`.
+ *
+ * **Syntax**: `<'border-top-width'>`
+ *
+ * **Initial value**: `medium`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :------: | :--: | :-: |
+ * | **69** | **41** | **12.1** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-block-end-width
+ */
+ borderBlockEndWidth?: Property.BorderBlockEndWidth | undefined;
+ /**
+ * The **`border-block-start-color`** CSS property defines the color of the logical block-start border of an element, which maps to a physical border color depending on the element's writing mode, directionality, and text orientation. It corresponds to the `border-top-color`, `border-right-color`, `border-bottom-color`, or `border-left-color` property depending on the values defined for `writing-mode`, `direction`, and `text-orientation`.
+ *
+ * **Syntax**: `<'border-top-color'>`
+ *
+ * **Initial value**: `currentcolor`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :------: | :--: | :-: |
+ * | **69** | **41** | **12.1** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-block-start-color
+ */
+ borderBlockStartColor?: Property.BorderBlockStartColor | undefined;
+ /**
+ * The **`border-block-start-style`** CSS property defines the style of the logical block start border of an element, which maps to a physical border style depending on the element's writing mode, directionality, and text orientation. It corresponds to the `border-top-style`, `border-right-style`, `border-bottom-style`, or `border-left-style` property depending on the values defined for `writing-mode`, `direction`, and `text-orientation`.
+ *
+ * **Syntax**: `<'border-top-style'>`
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :------: | :--: | :-: |
+ * | **69** | **41** | **12.1** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-block-start-style
+ */
+ borderBlockStartStyle?: Property.BorderBlockStartStyle | undefined;
+ /**
+ * The **`border-block-start-width`** CSS property defines the width of the logical block-start border of an element, which maps to a physical border width depending on the element's writing mode, directionality, and text orientation. It corresponds to the `border-top-width`, `border-right-width`, `border-bottom-width`, or `border-left-width` property depending on the values defined for `writing-mode`, `direction`, and `text-orientation`.
+ *
+ * **Syntax**: `<'border-top-width'>`
+ *
+ * **Initial value**: `medium`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :------: | :--: | :-: |
+ * | **69** | **41** | **12.1** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-block-start-width
+ */
+ borderBlockStartWidth?: Property.BorderBlockStartWidth | undefined;
+ /**
+ * The **`border-block-style`** CSS property defines the style of the logical block borders of an element, which maps to a physical border style depending on the element's writing mode, directionality, and text orientation. It corresponds to the `border-top-style` and `border-bottom-style`, or `border-left-style` and `border-right-style` properties depending on the values defined for `writing-mode`, `direction`, and `text-orientation`.
+ *
+ * **Syntax**: `<'border-top-style'>`
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :------: | :--: | :-: |
+ * | **87** | **66** | **14.1** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-block-style
+ */
+ borderBlockStyle?: Property.BorderBlockStyle | undefined;
+ /**
+ * The **`border-block-width`** CSS property defines the width of the logical block borders of an element, which maps to a physical border width depending on the element's writing mode, directionality, and text orientation. It corresponds to the `border-top-width` and `border-bottom-width`, or `border-left-width`, and `border-right-width` property depending on the values defined for `writing-mode`, `direction`, and `text-orientation`.
+ *
+ * **Syntax**: `<'border-top-width'>`
+ *
+ * **Initial value**: `medium`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :------: | :--: | :-: |
+ * | **87** | **66** | **14.1** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-block-width
+ */
+ borderBlockWidth?: Property.BorderBlockWidth | undefined;
+ /**
+ * The **`border-bottom-color`** CSS property sets the color of an element's bottom border. It can also be set with the shorthand CSS properties `border-color` or `border-bottom`.
+ *
+ * **Syntax**: `<'border-top-color'>`
+ *
+ * **Initial value**: `currentcolor`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :---: |
+ * | **1** | **1** | **1** | **12** | **4** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-bottom-color
+ */
+ borderBottomColor?: Property.BorderBottomColor | undefined;
+ /**
+ * The **`border-bottom-left-radius`** CSS property rounds the bottom-left corner of an element by specifying the radius (or the radius of the semi-major and semi-minor axes) of the ellipse defining the curvature of the corner.
+ *
+ * **Syntax**: `{1,2}`
+ *
+ * **Initial value**: `0`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :-----: | :-----: | :-----: | :----: | :---: |
+ * | **4** | **4** | **5** | **12** | **9** |
+ * | 1 _-x-_ | | 3 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-bottom-left-radius
+ */
+ borderBottomLeftRadius?: Property.BorderBottomLeftRadius | undefined;
+ /**
+ * The **`border-bottom-right-radius`** CSS property rounds the bottom-right corner of an element by specifying the radius (or the radius of the semi-major and semi-minor axes) of the ellipse defining the curvature of the corner.
+ *
+ * **Syntax**: `{1,2}`
+ *
+ * **Initial value**: `0`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :-----: | :-----: | :-----: | :----: | :---: |
+ * | **4** | **4** | **5** | **12** | **9** |
+ * | 1 _-x-_ | | 3 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-bottom-right-radius
+ */
+ borderBottomRightRadius?: Property.BorderBottomRightRadius | undefined;
+ /**
+ * The **`border-bottom-style`** CSS property sets the line style of an element's bottom `border`.
+ *
+ * **Syntax**: ``
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :-----: |
+ * | **1** | **1** | **1** | **12** | **5.5** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-bottom-style
+ */
+ borderBottomStyle?: Property.BorderBottomStyle | undefined;
+ /**
+ * The **`border-bottom-width`** CSS property sets the width of the bottom border of an element.
+ *
+ * **Syntax**: ``
+ *
+ * **Initial value**: `medium`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :---: |
+ * | **1** | **1** | **1** | **12** | **4** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-bottom-width
+ */
+ borderBottomWidth?: Property.BorderBottomWidth | undefined;
+ /**
+ * The **`border-collapse`** CSS property sets whether cells inside a `` have shared or separate borders.
+ *
+ * **Syntax**: `collapse | separate`
+ *
+ * **Initial value**: `separate`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :-----: | :----: | :---: |
+ * | **1** | **1** | **1.2** | **12** | **5** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-collapse
+ */
+ borderCollapse?: Property.BorderCollapse | undefined;
+ /**
+ * The **`border-end-end-radius`** CSS property defines a logical border radius on an element, which maps to a physical border radius that depends on the element's `writing-mode`, `direction`, and `text-orientation`. This is useful when building styles to work regardless of the text orientation and writing mode.
+ *
+ * **Syntax**: `{1,2}`
+ *
+ * **Initial value**: `0`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :--: | :-: |
+ * | **89** | **66** | **15** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-end-end-radius
+ */
+ borderEndEndRadius?: Property.BorderEndEndRadius | undefined;
+ /**
+ * The **`border-end-start-radius`** CSS property defines a logical border radius on an element, which maps to a physical border radius depending on the element's `writing-mode`, `direction`, and `text-orientation`. This is useful when building styles to work regardless of the text orientation and writing mode.
+ *
+ * **Syntax**: `{1,2}`
+ *
+ * **Initial value**: `0`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :--: | :-: |
+ * | **89** | **66** | **15** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-end-start-radius
+ */
+ borderEndStartRadius?: Property.BorderEndStartRadius | undefined;
+ /**
+ * The **`border-image-outset`** CSS property sets the distance by which an element's border image is set out from its border box.
+ *
+ * **Syntax**: `[ | ]{1,4}`
+ *
+ * **Initial value**: `0`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :----: |
+ * | **15** | **15** | **6** | **12** | **11** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-image-outset
+ */
+ borderImageOutset?: Property.BorderImageOutset | undefined;
+ /**
+ * The **`border-image-repeat`** CSS property defines how the edge regions and middle region of a source image are adjusted to fit the dimensions of an element's border image. The middle region can be displayed by using the keyword "fill" in the border-image-slice property.
+ *
+ * **Syntax**: `[ stretch | repeat | round | space ]{1,2}`
+ *
+ * **Initial value**: `stretch`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :----: |
+ * | **15** | **15** | **6** | **12** | **11** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-image-repeat
+ */
+ borderImageRepeat?: Property.BorderImageRepeat | undefined;
+ /**
+ * The **`border-image-slice`** CSS property divides the image specified by `border-image-source` into regions. These regions form the components of an element's border image.
+ *
+ * **Syntax**: `{1,4} && fill?`
+ *
+ * **Initial value**: `100%`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :----: |
+ * | **15** | **15** | **6** | **12** | **11** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-image-slice
+ */
+ borderImageSlice?: Property.BorderImageSlice | undefined;
+ /**
+ * The **`border-image-source`** CSS property sets the source image used to create an element's border image.
+ *
+ * **Syntax**: `none | `
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :----: |
+ * | **15** | **15** | **6** | **12** | **11** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-image-source
+ */
+ borderImageSource?: Property.BorderImageSource | undefined;
+ /**
+ * The **`border-image-width`** CSS property sets the width of an element's border image.
+ *
+ * **Syntax**: `[ | | auto ]{1,4}`
+ *
+ * **Initial value**: `1`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :----: |
+ * | **15** | **13** | **6** | **12** | **11** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-image-width
+ */
+ borderImageWidth?: Property.BorderImageWidth | undefined;
+ /**
+ * The **`border-inline-color`** CSS property defines the color of the logical inline borders of an element, which maps to a physical border color depending on the element's writing mode, directionality, and text orientation. It corresponds to the `border-top-color` and `border-bottom-color`, or `border-right-color` and `border-left-color` property depending on the values defined for `writing-mode`, `direction`, and `text-orientation`.
+ *
+ * **Syntax**: `<'border-top-color'>{1,2}`
+ *
+ * **Initial value**: `currentcolor`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :------: | :--: | :-: |
+ * | **87** | **66** | **14.1** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-inline-color
+ */
+ borderInlineColor?: Property.BorderInlineColor | undefined;
+ /**
+ * The **`border-inline-end-color`** CSS property defines the color of the logical inline-end border of an element, which maps to a physical border color depending on the element's writing mode, directionality, and text orientation. It corresponds to the `border-top-color`, `border-right-color`, `border-bottom-color`, or `border-left-color` property depending on the values defined for `writing-mode`, `direction`, and `text-orientation`.
+ *
+ * **Syntax**: `<'border-top-color'>`
+ *
+ * **Initial value**: `currentcolor`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-------------------------: | :------: | :--: | :-: |
+ * | **69** | **41** | **12.1** | n/a | No |
+ * | | 3 _(-moz-border-end-color)_ | | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-inline-end-color
+ */
+ borderInlineEndColor?: Property.BorderInlineEndColor | undefined;
+ /**
+ * The **`border-inline-end-style`** CSS property defines the style of the logical inline end border of an element, which maps to a physical border style depending on the element's writing mode, directionality, and text orientation. It corresponds to the `border-top-style`, `border-right-style`, `border-bottom-style`, or `border-left-style` property depending on the values defined for `writing-mode`, `direction`, and `text-orientation`.
+ *
+ * **Syntax**: `<'border-top-style'>`
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-------------------------: | :------: | :--: | :-: |
+ * | **69** | **41** | **12.1** | n/a | No |
+ * | | 3 _(-moz-border-end-style)_ | | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-inline-end-style
+ */
+ borderInlineEndStyle?: Property.BorderInlineEndStyle | undefined;
+ /**
+ * The **`border-inline-end-width`** CSS property defines the width of the logical inline-end border of an element, which maps to a physical border width depending on the element's writing mode, directionality, and text orientation. It corresponds to the `border-top-width`, `border-right-width`, `border-bottom-width`, or `border-left-width` property depending on the values defined for `writing-mode`, `direction`, and `text-orientation`.
+ *
+ * **Syntax**: `<'border-top-width'>`
+ *
+ * **Initial value**: `medium`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-------------------------: | :------: | :--: | :-: |
+ * | **69** | **41** | **12.1** | n/a | No |
+ * | | 3 _(-moz-border-end-width)_ | | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-inline-end-width
+ */
+ borderInlineEndWidth?: Property.BorderInlineEndWidth | undefined;
+ /**
+ * The **`border-inline-start-color`** CSS property defines the color of the logical inline start border of an element, which maps to a physical border color depending on the element's writing mode, directionality, and text orientation. It corresponds to the `border-top-color`, `border-right-color`, `border-bottom-color`, or `border-left-color` property depending on the values defined for `writing-mode`, `direction`, and `text-orientation`.
+ *
+ * **Syntax**: `<'border-top-color'>`
+ *
+ * **Initial value**: `currentcolor`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :---------------------------: | :------: | :--: | :-: |
+ * | **69** | **41** | **12.1** | n/a | No |
+ * | | 3 _(-moz-border-start-color)_ | | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-inline-start-color
+ */
+ borderInlineStartColor?: Property.BorderInlineStartColor | undefined;
+ /**
+ * The **`border-inline-start-style`** CSS property defines the style of the logical inline start border of an element, which maps to a physical border style depending on the element's writing mode, directionality, and text orientation. It corresponds to the `border-top-style`, `border-right-style`, `border-bottom-style`, or `border-left-style` property depending on the values defined for `writing-mode`, `direction`, and `text-orientation`.
+ *
+ * **Syntax**: `<'border-top-style'>`
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :---------------------------: | :------: | :--: | :-: |
+ * | **69** | **41** | **12.1** | n/a | No |
+ * | | 3 _(-moz-border-start-style)_ | | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-inline-start-style
+ */
+ borderInlineStartStyle?: Property.BorderInlineStartStyle | undefined;
+ /**
+ * The **`border-inline-start-width`** CSS property defines the width of the logical inline-start border of an element, which maps to a physical border width depending on the element's writing mode, directionality, and text orientation. It corresponds to the `border-top-width`, `border-right-width`, `border-bottom-width`, or `border-left-width` property depending on the values defined for `writing-mode`, `direction`, and `text-orientation`.
+ *
+ * **Syntax**: `<'border-top-width'>`
+ *
+ * **Initial value**: `medium`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :------: | :--: | :-: |
+ * | **69** | **41** | **12.1** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-inline-start-width
+ */
+ borderInlineStartWidth?: Property.BorderInlineStartWidth | undefined;
+ /**
+ * The **`border-inline-style`** CSS property defines the style of the logical inline borders of an element, which maps to a physical border style depending on the element's writing mode, directionality, and text orientation. It corresponds to the `border-top-style` and `border-bottom-style`, or `border-left-style` and `border-right-style` properties depending on the values defined for `writing-mode`, `direction`, and `text-orientation`.
+ *
+ * **Syntax**: `<'border-top-style'>`
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :------: | :--: | :-: |
+ * | **87** | **66** | **14.1** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-inline-style
+ */
+ borderInlineStyle?: Property.BorderInlineStyle | undefined;
+ /**
+ * The **`border-inline-width`** CSS property defines the width of the logical inline borders of an element, which maps to a physical border width depending on the element's writing mode, directionality, and text orientation. It corresponds to the `border-top-width` and `border-bottom-width`, or `border-left-width`, and `border-right-width` property depending on the values defined for `writing-mode`, `direction`, and `text-orientation`.
+ *
+ * **Syntax**: `<'border-top-width'>`
+ *
+ * **Initial value**: `medium`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :------: | :--: | :-: |
+ * | **87** | **66** | **14.1** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-inline-width
+ */
+ borderInlineWidth?: Property.BorderInlineWidth | undefined;
+ /**
+ * The **`border-left-color`** CSS property sets the color of an element's left border. It can also be set with the shorthand CSS properties `border-color` or `border-left`.
+ *
+ * **Syntax**: ``
+ *
+ * **Initial value**: `currentcolor`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :---: |
+ * | **1** | **1** | **1** | **12** | **4** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-left-color
+ */
+ borderLeftColor?: Property.BorderLeftColor | undefined;
+ /**
+ * The **`border-left-style`** CSS property sets the line style of an element's left `border`.
+ *
+ * **Syntax**: ``
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :-----: |
+ * | **1** | **1** | **1** | **12** | **5.5** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-left-style
+ */
+ borderLeftStyle?: Property.BorderLeftStyle | undefined;
+ /**
+ * The **`border-left-width`** CSS property sets the width of the left border of an element.
+ *
+ * **Syntax**: ``
+ *
+ * **Initial value**: `medium`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :---: |
+ * | **1** | **1** | **1** | **12** | **4** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-left-width
+ */
+ borderLeftWidth?: Property.BorderLeftWidth | undefined;
+ /**
+ * The **`border-right-color`** CSS property sets the color of an element's right border. It can also be set with the shorthand CSS properties `border-color` or `border-right`.
+ *
+ * **Syntax**: ``
+ *
+ * **Initial value**: `currentcolor`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :---: |
+ * | **1** | **1** | **1** | **12** | **4** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-right-color
+ */
+ borderRightColor?: Property.BorderRightColor | undefined;
+ /**
+ * The **`border-right-style`** CSS property sets the line style of an element's right `border`.
+ *
+ * **Syntax**: ``
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :-----: |
+ * | **1** | **1** | **1** | **12** | **5.5** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-right-style
+ */
+ borderRightStyle?: Property.BorderRightStyle | undefined;
+ /**
+ * The **`border-right-width`** CSS property sets the width of the right border of an element.
+ *
+ * **Syntax**: ``
+ *
+ * **Initial value**: `medium`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :---: |
+ * | **1** | **1** | **1** | **12** | **4** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-right-width
+ */
+ borderRightWidth?: Property.BorderRightWidth | undefined;
+ /**
+ * The **`border-spacing`** CSS property sets the distance between the borders of adjacent cells in a ``. This property applies only when `border-collapse` is `separate`.
+ *
+ * **Syntax**: ` ?`
+ *
+ * **Initial value**: `0`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :---: |
+ * | **1** | **1** | **1** | **12** | **8** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-spacing
+ */
+ borderSpacing?: Property.BorderSpacing | undefined;
+ /**
+ * The **`border-start-end-radius`** CSS property defines a logical border radius on an element, which maps to a physical border radius depending on the element's `writing-mode`, `direction`, and `text-orientation`. This is useful when building styles to work regardless of the text orientation and writing mode.
+ *
+ * **Syntax**: `{1,2}`
+ *
+ * **Initial value**: `0`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :--: | :-: |
+ * | **89** | **66** | **15** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-start-end-radius
+ */
+ borderStartEndRadius?: Property.BorderStartEndRadius | undefined;
+ /**
+ * The **`border-start-start-radius`** CSS property defines a logical border radius on an element, which maps to a physical border radius that depends on the element's `writing-mode`, `direction`, and `text-orientation`. This is useful when building styles to work regardless of the text orientation and writing mode.
+ *
+ * **Syntax**: `{1,2}`
+ *
+ * **Initial value**: `0`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :--: | :-: |
+ * | **89** | **66** | **15** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-start-start-radius
+ */
+ borderStartStartRadius?: Property.BorderStartStartRadius | undefined;
+ /**
+ * The **`border-top-color`** CSS property sets the color of an element's top border. It can also be set with the shorthand CSS properties `border-color` or `border-top`.
+ *
+ * **Syntax**: ``
+ *
+ * **Initial value**: `currentcolor`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :---: |
+ * | **1** | **1** | **1** | **12** | **4** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-top-color
+ */
+ borderTopColor?: Property.BorderTopColor | undefined;
+ /**
+ * The **`border-top-left-radius`** CSS property rounds the top-left corner of an element by specifying the radius (or the radius of the semi-major and semi-minor axes) of the ellipse defining the curvature of the corner.
+ *
+ * **Syntax**: `{1,2}`
+ *
+ * **Initial value**: `0`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :-----: | :-----: | :-----: | :----: | :---: |
+ * | **4** | **4** | **5** | **12** | **9** |
+ * | 1 _-x-_ | | 3 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-top-left-radius
+ */
+ borderTopLeftRadius?: Property.BorderTopLeftRadius | undefined;
+ /**
+ * The **`border-top-right-radius`** CSS property rounds the top-right corner of an element by specifying the radius (or the radius of the semi-major and semi-minor axes) of the ellipse defining the curvature of the corner.
+ *
+ * **Syntax**: `{1,2}`
+ *
+ * **Initial value**: `0`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :-----: | :-----: | :-----: | :----: | :---: |
+ * | **4** | **4** | **5** | **12** | **9** |
+ * | 1 _-x-_ | | 3 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-top-right-radius
+ */
+ borderTopRightRadius?: Property.BorderTopRightRadius | undefined;
+ /**
+ * The **`border-top-style`** CSS property sets the line style of an element's top `border`.
+ *
+ * **Syntax**: ``
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :-----: |
+ * | **1** | **1** | **1** | **12** | **5.5** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-top-style
+ */
+ borderTopStyle?: Property.BorderTopStyle | undefined;
+ /**
+ * The **`border-top-width`** CSS property sets the width of the top border of an element.
+ *
+ * **Syntax**: ``
+ *
+ * **Initial value**: `medium`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :---: |
+ * | **1** | **1** | **1** | **12** | **4** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/border-top-width
+ */
+ borderTopWidth?: Property.BorderTopWidth | undefined;
+ /**
+ * The **`bottom`** CSS property participates in setting the vertical position of a positioned element. It has no effect on non-positioned elements.
+ *
+ * **Syntax**: ` | | auto`
+ *
+ * **Initial value**: `auto`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :---: |
+ * | **1** | **1** | **1** | **12** | **5** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/bottom
+ */
+ bottom?: Property.Bottom | undefined;
+ /**
+ * The **`box-decoration-break`** CSS property specifies how an element's fragments should be rendered when broken across multiple lines, columns, or pages.
+ *
+ * **Syntax**: `slice | clone`
+ *
+ * **Initial value**: `slice`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----------: | :-----: | :---------: | :--: | :-: |
+ * | **22** _-x-_ | **32** | **7** _-x-_ | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/box-decoration-break
+ */
+ boxDecorationBreak?: Property.BoxDecorationBreak | undefined;
+ /**
+ * The **`box-shadow`** CSS property adds shadow effects around an element's frame. You can set multiple effects separated by commas. A box shadow is described by X and Y offsets relative to the element, blur and spread radius, and color.
+ *
+ * **Syntax**: `none | #`
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :-----: | :-----: | :-----: | :----: | :---: |
+ * | **10** | **4** | **5.1** | **12** | **9** |
+ * | 1 _-x-_ | | 3 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/box-shadow
+ */
+ boxShadow?: Property.BoxShadow | undefined;
+ /**
+ * The **`box-sizing`** CSS property sets how the total width and height of an element is calculated.
+ *
+ * **Syntax**: `content-box | border-box`
+ *
+ * **Initial value**: `content-box`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :-----: | :-----: | :-----: | :----: | :---: |
+ * | **10** | **29** | **5.1** | **12** | **8** |
+ * | 1 _-x-_ | 1 _-x-_ | 3 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/box-sizing
+ */
+ boxSizing?: Property.BoxSizing | undefined;
+ /**
+ * The **`break-after`** CSS property sets how page, column, or region breaks should behave after a generated box. If there is no generated box, the property is ignored.
+ *
+ * **Syntax**: `auto | avoid | always | all | avoid-page | page | left | right | recto | verso | avoid-column | column | avoid-region | region`
+ *
+ * **Initial value**: `auto`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :----: |
+ * | **50** | **65** | **10** | **12** | **10** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/break-after
+ */
+ breakAfter?: Property.BreakAfter | undefined;
+ /**
+ * The **`break-before`** CSS property sets how page, column, or region breaks should behave before a generated box. If there is no generated box, the property is ignored.
+ *
+ * **Syntax**: `auto | avoid | always | all | avoid-page | page | left | right | recto | verso | avoid-column | column | avoid-region | region`
+ *
+ * **Initial value**: `auto`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :----: |
+ * | **50** | **65** | **10** | **12** | **10** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/break-before
+ */
+ breakBefore?: Property.BreakBefore | undefined;
+ /**
+ * The **`break-inside`** CSS property sets how page, column, or region breaks should behave inside a generated box. If there is no generated box, the property is ignored.
+ *
+ * **Syntax**: `auto | avoid | avoid-page | avoid-column | avoid-region`
+ *
+ * **Initial value**: `auto`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :----: |
+ * | **50** | **65** | **10** | **12** | **10** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/break-inside
+ */
+ breakInside?: Property.BreakInside | undefined;
+ /**
+ * The **`caption-side`** CSS property puts the content of a table's `` on the specified side. The values are relative to the `writing-mode` of the table.
+ *
+ * **Syntax**: `top | bottom | block-start | block-end | inline-start | inline-end`
+ *
+ * **Initial value**: `top`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :---: |
+ * | **1** | **1** | **1** | **12** | **8** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/caption-side
+ */
+ captionSide?: Property.CaptionSide | undefined;
+ /**
+ * The **`caret-color`** CSS property sets the color of the **insertion caret**, the visible marker where the next character typed will be inserted. This is sometimes referred to as the **text input cursor**. The caret appears in elements such as ` ` or those with the `contenteditable` attribute. The caret is typically a thin vertical line that flashes to help make it more noticeable. By default, it is black, but its color can be altered with this property.
+ *
+ * **Syntax**: `auto | `
+ *
+ * **Initial value**: `auto`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :------: | :--: | :-: |
+ * | **57** | **53** | **11.1** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/caret-color
+ */
+ caretColor?: Property.CaretColor | undefined;
+ /**
+ * **Syntax**: `auto | bar | block | underscore`
+ *
+ * **Initial value**: `auto`
+ */
+ caretShape?: Property.CaretShape | undefined;
+ /**
+ * The **`clear`** CSS property sets whether an element must be moved below (cleared) floating elements that precede it. The `clear` property applies to floating and non-floating elements.
+ *
+ * **Syntax**: `none | left | right | both | inline-start | inline-end`
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :---: |
+ * | **1** | **1** | **1** | **12** | **4** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/clear
+ */
+ clear?: Property.Clear | undefined;
+ /**
+ * The **`clip-path`** CSS property creates a clipping region that sets what part of an element should be shown. Parts that are inside the region are shown, while those outside are hidden.
+ *
+ * **Syntax**: ` | [ || ] | none`
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :------: | :-----: | :-----: | :----: | :----: |
+ * | **55** | **3.5** | **9.1** | **79** | **10** |
+ * | 23 _-x-_ | | 7 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/clip-path
+ */
+ clipPath?: Property.ClipPath | undefined;
+ /**
+ * The **`color`** CSS property sets the foreground color value of an element's text and text decorations, and sets the `currentcolor` value. `currentcolor` may be used as an indirect value on _other_ properties and is the default for other color properties, such as `border-color`.
+ *
+ * **Syntax**: ``
+ *
+ * **Initial value**: `canvastext`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :---: |
+ * | **1** | **1** | **1** | **12** | **3** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/color
+ */
+ color?: Property.Color | undefined;
+ /**
+ * The **`print-color-adjust`** CSS property sets what, if anything, the user agent may do to optimize the appearance of the element on the output device. By default, the browser is allowed to make any adjustments to the element's appearance it determines to be necessary and prudent given the type and capabilities of the output device.
+ *
+ * **Syntax**: `economy | exact`
+ *
+ * **Initial value**: `economy`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----------: | :-----------------: | :------: | :----------: | :-: |
+ * | **17** _-x-_ | **97** | **15.4** | **79** _-x-_ | No |
+ * | | 48 _(color-adjust)_ | 6 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/print-color-adjust
+ */
+ colorAdjust?: Property.PrintColorAdjust | undefined;
+ /**
+ * The **`color-scheme`** CSS property allows an element to indicate which color schemes it can comfortably be rendered in.
+ *
+ * **Syntax**: `normal | [ light | dark | ]+ && only?`
+ *
+ * **Initial value**: `normal`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :--: | :-: |
+ * | **81** | **96** | **13** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/color-scheme
+ */
+ colorScheme?: Property.ColorScheme | undefined;
+ /**
+ * The **`column-count`** CSS property breaks an element's content into the specified number of columns.
+ *
+ * **Syntax**: ` | auto`
+ *
+ * **Initial value**: `auto`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :-----: | :-----: | :-----: | :----: | :----: |
+ * | **50** | **52** | **9** | **12** | **10** |
+ * | 1 _-x-_ | | 3 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/column-count
+ */
+ columnCount?: Property.ColumnCount | undefined;
+ /**
+ * The **`column-fill`** CSS property controls how an element's contents are balanced when broken into columns.
+ *
+ * **Syntax**: `auto | balance | balance-all`
+ *
+ * **Initial value**: `balance`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :-----: | :----: | :----: |
+ * | **50** | **52** | **9** | **12** | **10** |
+ * | | | 8 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/column-fill
+ */
+ columnFill?: Property.ColumnFill | undefined;
+ /**
+ * The **`column-gap`** CSS property sets the size of the gap (gutter) between an element's columns.
+ *
+ * **Syntax**: `normal | `
+ *
+ * **Initial value**: `normal`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :----: |
+ * | **1** | **1.5** | **3** | **12** | **10** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/column-gap
+ */
+ columnGap?: Property.ColumnGap | undefined;
+ /**
+ * The **`column-rule-color`** CSS property sets the color of the line drawn between columns in a multi-column layout.
+ *
+ * **Syntax**: ``
+ *
+ * **Initial value**: `currentcolor`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :-----: | :-----: | :-----: | :----: | :----: |
+ * | **50** | **52** | **9** | **12** | **10** |
+ * | 1 _-x-_ | | 3 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/column-rule-color
+ */
+ columnRuleColor?: Property.ColumnRuleColor | undefined;
+ /**
+ * The **`column-rule-style`** CSS property sets the style of the line drawn between columns in a multi-column layout.
+ *
+ * **Syntax**: `<'border-style'>`
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :-----: | :-----: | :-----: | :----: | :----: |
+ * | **50** | **52** | **9** | **12** | **10** |
+ * | 1 _-x-_ | | 3 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/column-rule-style
+ */
+ columnRuleStyle?: Property.ColumnRuleStyle | undefined;
+ /**
+ * The **`column-rule-width`** CSS property sets the width of the line drawn between columns in a multi-column layout.
+ *
+ * **Syntax**: `<'border-width'>`
+ *
+ * **Initial value**: `medium`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :-----: | :-----: | :-----: | :----: | :----: |
+ * | **50** | **52** | **9** | **12** | **10** |
+ * | 1 _-x-_ | | 3 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/column-rule-width
+ */
+ columnRuleWidth?: Property.ColumnRuleWidth | undefined;
+ /**
+ * The **`column-span`** CSS property makes it possible for an element to span across all columns when its value is set to `all`.
+ *
+ * **Syntax**: `none | all`
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :-----: | :-----: | :-------: | :----: | :----: |
+ * | **50** | **71** | **9** | **12** | **10** |
+ * | 6 _-x-_ | | 5.1 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/column-span
+ */
+ columnSpan?: Property.ColumnSpan | undefined;
+ /**
+ * The **`column-width`** CSS property sets the ideal column width in a multi-column layout. The container will have as many columns as can fit without any of them having a width less than the `column-width` value. If the width of the container is narrower than the specified value, the single column's width will be smaller than the declared column width.
+ *
+ * **Syntax**: ` | auto`
+ *
+ * **Initial value**: `auto`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :-----: | :-----: | :-----: | :----: | :----: |
+ * | **50** | **50** | **9** | **12** | **10** |
+ * | 1 _-x-_ | | 3 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/column-width
+ */
+ columnWidth?: Property.ColumnWidth | undefined;
+ /**
+ * The **`contain`** CSS property indicates that an element and its contents are, as much as possible, independent from the rest of the document tree. Containment enables isolating a subsection of the DOM, providing performance benefits by limiting calculations of layout, style, paint, size, or any combination to a DOM subtree rather than the entire page. Containment can also be used to scope CSS counters and quotes.
+ *
+ * **Syntax**: `none | strict | content | [ [ size || inline-size ] || layout || style || paint ]`
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :------: | :--: | :-: |
+ * | **52** | **69** | **15.4** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/contain
+ */
+ contain?: Property.Contain | undefined;
+ /**
+ * The **`contain-intrinsic-block-size`** CSS logical property defines the block size of an element that a browser can use for layout when the element is subject to size containment.
+ *
+ * **Syntax**: `auto? [ none | ]`
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :--: | :-: |
+ * | **95** | **107** | **17** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-contain-intrinsic-block-size
+ */
+ containIntrinsicBlockSize?: Property.ContainIntrinsicBlockSize | undefined;
+ /**
+ * The **`contain-intrinsic-length`** CSS property sets the height of an element that a browser can use for layout when the element is subject to size containment.
+ *
+ * **Syntax**: `auto? [ none | ]`
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :--: | :-: |
+ * | **95** | **107** | **17** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-height
+ */
+ containIntrinsicHeight?: Property.ContainIntrinsicHeight | undefined;
+ /**
+ * The **`contain-intrinsic-inline-size`** CSS logical property defines the inline-size of an element that a browser can use for layout when the element is subject to size containment.
+ *
+ * **Syntax**: `auto? [ none | ]`
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :--: | :-: |
+ * | **95** | **107** | **17** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-contain-intrinsic-inline-size
+ */
+ containIntrinsicInlineSize?: Property.ContainIntrinsicInlineSize | undefined;
+ /**
+ * The **`contain-intrinsic-width`** CSS property sets the width of an element that a browser will use for layout when the element is subject to size containment.
+ *
+ * **Syntax**: `auto? [ none | ]`
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :--: | :-: |
+ * | **95** | **107** | **17** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-width
+ */
+ containIntrinsicWidth?: Property.ContainIntrinsicWidth | undefined;
+ /**
+ * The **container-name** CSS property specifies a list of query container names used by the @container at-rule in a container query. A container query will apply styles to elements based on the size of the nearest ancestor with a containment context. When a containment context is given a name, it can be specifically targeted using the `@container` at-rule instead of the nearest ancestor with containment.
+ *
+ * **Syntax**: `none | +`
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :-----: | :-----: | :----: | :--: | :-: |
+ * | **105** | **110** | **16** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/container-name
+ */
+ containerName?: Property.ContainerName | undefined;
+ /**
+ * The **container-type** CSS property is used to define the type of containment used in a container query.
+ *
+ * **Syntax**: `normal | size | inline-size`
+ *
+ * **Initial value**: `normal`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :-----: | :-----: | :----: | :--: | :-: |
+ * | **105** | **110** | **16** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/container-type
+ */
+ containerType?: Property.ContainerType | undefined;
+ /**
+ * The **`content`** CSS property replaces an element with a generated value. Objects inserted using the `content` property are **anonymous replaced elements**.
+ *
+ * **Syntax**: `normal | none | [ | ] [/ [ | ]+ ]?`
+ *
+ * **Initial value**: `normal`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :---: |
+ * | **1** | **1** | **1** | **12** | **8** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/content
+ */
+ content?: Property.Content | undefined;
+ /**
+ * The **`content-visibility`** CSS property controls whether or not an element renders its contents at all, along with forcing a strong set of containments, allowing user agents to potentially omit large swathes of layout and rendering work until it becomes needed. It enables the user agent to skip an element's rendering work (including layout and painting) until it is needed — which makes the initial page load much faster.
+ *
+ * **Syntax**: `visible | auto | hidden`
+ *
+ * **Initial value**: `visible`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :---------: | :----: | :--: | :-: |
+ * | **85** | **preview** | No | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/content-visibility
+ */
+ contentVisibility?: Property.ContentVisibility | undefined;
+ /**
+ * The **`counter-increment`** CSS property increases or decreases the value of a CSS counter by a given value.
+ *
+ * **Syntax**: `[ ? ]+ | none`
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :---: |
+ * | **2** | **1** | **3** | **12** | **8** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/counter-increment
+ */
+ counterIncrement?: Property.CounterIncrement | undefined;
+ /**
+ * The **`counter-reset`** CSS property resets a CSS counter to a given value. This property will create a new counter or reversed counter with the given name on the specified element.
+ *
+ * **Syntax**: `[ ? | ? ]+ | none`
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :---: |
+ * | **2** | **1** | **3** | **12** | **8** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/counter-reset
+ */
+ counterReset?: Property.CounterReset | undefined;
+ /**
+ * The **`counter-set`** CSS property sets a CSS counter to a given value. It manipulates the value of existing counters, and will only create new counters if there isn't already a counter of the given name on the element.
+ *
+ * **Syntax**: `[ ? ]+ | none`
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :------: | :--: | :-: |
+ * | **85** | **68** | **17.2** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/counter-set
+ */
+ counterSet?: Property.CounterSet | undefined;
+ /**
+ * The **`cursor`** CSS property sets the mouse cursor, if any, to show when the mouse pointer is over an element.
+ *
+ * **Syntax**: `[ [ [ ]? , ]* [ auto | default | none | context-menu | help | pointer | progress | wait | cell | crosshair | text | vertical-text | alias | copy | move | no-drop | not-allowed | e-resize | n-resize | ne-resize | nw-resize | s-resize | se-resize | sw-resize | w-resize | ew-resize | ns-resize | nesw-resize | nwse-resize | col-resize | row-resize | all-scroll | zoom-in | zoom-out | grab | grabbing ] ]`
+ *
+ * **Initial value**: `auto`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :-----: | :----: | :---: |
+ * | **1** | **1** | **1.2** | **12** | **4** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/cursor
+ */
+ cursor?: Property.Cursor | undefined;
+ /**
+ * The **`direction`** CSS property sets the direction of text, table columns, and horizontal overflow. Use `rtl` for languages written from right to left (like Hebrew or Arabic), and `ltr` for those written from left to right (like English and most other languages).
+ *
+ * **Syntax**: `ltr | rtl`
+ *
+ * **Initial value**: `ltr`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :-----: |
+ * | **2** | **1** | **1** | **12** | **5.5** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/direction
+ */
+ direction?: Property.Direction | undefined;
+ /**
+ * The **`display`** CSS property sets whether an element is treated as a block or inline element and the layout used for its children, such as flow layout, grid or flex.
+ *
+ * **Syntax**: `[ || ] | | | | `
+ *
+ * **Initial value**: `inline`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :---: |
+ * | **1** | **1** | **1** | **12** | **4** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/display
+ */
+ display?: Property.Display | undefined;
+ /**
+ * The **`empty-cells`** CSS property sets whether borders and backgrounds appear around `` cells that have no visible content.
+ *
+ * **Syntax**: `show | hide`
+ *
+ * **Initial value**: `show`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :-----: | :----: | :---: |
+ * | **1** | **1** | **1.2** | **12** | **8** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/empty-cells
+ */
+ emptyCells?: Property.EmptyCells | undefined;
+ /**
+ * The **`filter`** CSS property applies graphical effects like blur or color shift to an element. Filters are commonly used to adjust the rendering of images, backgrounds, and borders.
+ *
+ * **Syntax**: `none | `
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :------: | :-----: | :-----: | :----: | :-: |
+ * | **53** | **35** | **9.1** | **12** | No |
+ * | 18 _-x-_ | | 6 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/filter
+ */
+ filter?: Property.Filter | undefined;
+ /**
+ * The **`flex-basis`** CSS property sets the initial main size of a flex item. It sets the size of the content box unless otherwise set with `box-sizing`.
+ *
+ * **Syntax**: `content | <'width'>`
+ *
+ * **Initial value**: `auto`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :------: | :-----: | :-----: | :----: | :----: |
+ * | **29** | **22** | **9** | **12** | **11** |
+ * | 22 _-x-_ | | 7 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/flex-basis
+ */
+ flexBasis?: Property.FlexBasis | undefined;
+ /**
+ * The **`flex-direction`** CSS property sets how flex items are placed in the flex container defining the main axis and the direction (normal or reversed).
+ *
+ * **Syntax**: `row | row-reverse | column | column-reverse`
+ *
+ * **Initial value**: `row`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :------: | :------: | :-----: | :----: | :------: |
+ * | **29** | **81** | **9** | **12** | **11** |
+ * | 21 _-x-_ | 49 _-x-_ | 7 _-x-_ | | 10 _-x-_ |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/flex-direction
+ */
+ flexDirection?: Property.FlexDirection | undefined;
+ /**
+ * The **`flex-grow`** CSS property sets the flex grow factor of a flex item's main size.
+ *
+ * **Syntax**: ``
+ *
+ * **Initial value**: `0`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :------: | :-----: | :-----: | :----: | :----------------------: |
+ * | **29** | **20** | **9** | **12** | **11** |
+ * | 22 _-x-_ | | 7 _-x-_ | | 10 _(-ms-flex-positive)_ |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/flex-grow
+ */
+ flexGrow?: Property.FlexGrow | undefined;
+ /**
+ * The **`flex-shrink`** CSS property sets the flex shrink factor of a flex item. If the size of all flex items is larger than the flex container, items shrink to fit according to `flex-shrink`.
+ *
+ * **Syntax**: ``
+ *
+ * **Initial value**: `1`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :------: | :-----: | :-----: | :----: | :----: |
+ * | **29** | **20** | **9** | **12** | **10** |
+ * | 22 _-x-_ | | 8 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/flex-shrink
+ */
+ flexShrink?: Property.FlexShrink | undefined;
+ /**
+ * The **`flex-wrap`** CSS property sets whether flex items are forced onto one line or can wrap onto multiple lines. If wrapping is allowed, it sets the direction that lines are stacked.
+ *
+ * **Syntax**: `nowrap | wrap | wrap-reverse`
+ *
+ * **Initial value**: `nowrap`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :------: | :-----: | :-----: | :----: | :----: |
+ * | **29** | **28** | **9** | **12** | **11** |
+ * | 21 _-x-_ | | 7 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/flex-wrap
+ */
+ flexWrap?: Property.FlexWrap | undefined;
+ /**
+ * The **`float`** CSS property places an element on the left or right side of its container, allowing text and inline elements to wrap around it. The element is removed from the normal flow of the page, though still remaining a part of the flow (in contrast to absolute positioning).
+ *
+ * **Syntax**: `left | right | none | inline-start | inline-end`
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :---: |
+ * | **1** | **1** | **1** | **12** | **4** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/float
+ */
+ float?: Property.Float | undefined;
+ /**
+ * The **`font-family`** CSS property specifies a prioritized list of one or more font family names and/or generic family names for the selected element.
+ *
+ * **Syntax**: `[ | ]#`
+ *
+ * **Initial value**: depends on user agent
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :---: |
+ * | **1** | **1** | **1** | **12** | **3** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/font-family
+ */
+ fontFamily?: Property.FontFamily | undefined;
+ /**
+ * The **`font-feature-settings`** CSS property controls advanced typographic features in OpenType fonts.
+ *
+ * **Syntax**: `normal | #`
+ *
+ * **Initial value**: `normal`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :------: | :------: | :-----: | :----: | :----: |
+ * | **48** | **34** | **9.1** | **15** | **10** |
+ * | 16 _-x-_ | 15 _-x-_ | | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/font-feature-settings
+ */
+ fontFeatureSettings?: Property.FontFeatureSettings | undefined;
+ /**
+ * The **`font-kerning`** CSS property sets the use of the kerning information stored in a font.
+ *
+ * **Syntax**: `auto | normal | none`
+ *
+ * **Initial value**: `auto`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :-----: | :--: | :-: |
+ * | **33** | **32** | **9** | n/a | No |
+ * | | | 6 _-x-_ | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/font-kerning
+ */
+ fontKerning?: Property.FontKerning | undefined;
+ /**
+ * The **`font-language-override`** CSS property controls the use of language-specific glyphs in a typeface.
+ *
+ * **Syntax**: `normal | `
+ *
+ * **Initial value**: `normal`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :--: | :-: |
+ * | No | **34** | No | n/a | No |
+ * | | 4 _-x-_ | | | |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/font-language-override
+ */
+ fontLanguageOverride?: Property.FontLanguageOverride | undefined;
+ /**
+ * The **`font-optical-sizing`** CSS property sets whether text rendering is optimized for viewing at different sizes.
+ *
+ * **Syntax**: `auto | none`
+ *
+ * **Initial value**: `auto`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :-: |
+ * | **79** | **62** | **11** | **17** | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/font-optical-sizing
+ */
+ fontOpticalSizing?: Property.FontOpticalSizing | undefined;
+ /**
+ * **Syntax**: `normal | light | dark | `
+ *
+ * **Initial value**: `normal`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :-----: | :-----: | :------: | :--: | :-: |
+ * | **101** | **107** | **15.4** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/font-palette
+ */
+ fontPalette?: Property.FontPalette | undefined;
+ /**
+ * The **`font-size`** CSS property sets the size of the font. Changing the font size also updates the sizes of the font size-relative `` units, such as `em`, `ex`, and so forth.
+ *
+ * **Syntax**: ` | | `
+ *
+ * **Initial value**: `medium`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :-----: |
+ * | **1** | **1** | **1** | **12** | **5.5** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/font-size
+ */
+ fontSize?: Property.FontSize | undefined;
+ /**
+ * The **`font-size-adjust`** CSS property sets the size of lower-case letters relative to the current font size (which defines the size of upper-case letters).
+ *
+ * **Syntax**: `none | [ ex-height | cap-height | ch-width | ic-width | ic-height ]? [ from-font | ]`
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :------: | :--: | :-: |
+ * | No | **3** | **16.4** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/font-size-adjust
+ */
+ fontSizeAdjust?: Property.FontSizeAdjust | undefined;
+ /**
+ * The **`font-smooth`** CSS property controls the application of anti-aliasing when fonts are rendered.
+ *
+ * **Syntax**: `auto | never | always | | `
+ *
+ * **Initial value**: `auto`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :------------------------------: | :--------------------------------: | :------------------------------: | :--: | :-: |
+ * | **5** _(-webkit-font-smoothing)_ | **25** _(-moz-osx-font-smoothing)_ | **4** _(-webkit-font-smoothing)_ | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/font-smooth
+ */
+ fontSmooth?: Property.FontSmooth | undefined;
+ /**
+ * The **`font-stretch`** CSS property selects a normal, condensed, or expanded face from a font.
+ *
+ * **Syntax**: ``
+ *
+ * **Initial value**: `normal`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :---: |
+ * | **60** | **9** | **11** | **12** | **9** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/font-stretch
+ */
+ fontStretch?: Property.FontStretch | undefined;
+ /**
+ * The **`font-style`** CSS property sets whether a font should be styled with a normal, italic, or oblique face from its `font-family`.
+ *
+ * **Syntax**: `normal | italic | oblique ?`
+ *
+ * **Initial value**: `normal`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :----: | :---: |
+ * | **1** | **1** | **1** | **12** | **4** |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/font-style
+ */
+ fontStyle?: Property.FontStyle | undefined;
+ /**
+ * The **`font-synthesis`** CSS property controls which missing typefaces, bold, italic, or small-caps, may be synthesized by the browser.
+ *
+ * **Syntax**: `none | [ weight || style || small-caps || position]`
+ *
+ * **Initial value**: `weight style small-caps position `
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :--: | :-: |
+ * | **97** | **34** | **9** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/font-synthesis
+ */
+ fontSynthesis?: Property.FontSynthesis | undefined;
+ /**
+ * The **`font-synthesis-position`** CSS property lets you specify whether or not a browser may synthesize the subscript and superscript "position" typefaces when they are missing in a font family, while using `font-variant-position` to set the positions.
+ *
+ * **Syntax**: `auto | none`
+ *
+ * **Initial value**: `none`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :----: | :--: | :-: |
+ * | No | **118** | No | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/font-synthesis-position
+ */
+ fontSynthesisPosition?: Property.FontSynthesisPosition | undefined;
+ /**
+ * The **`font-synthesis-small-caps`** CSS property lets you specify whether or not the browser may synthesize small-caps typeface when it is missing in a font family. Small-caps glyphs typically use the form of uppercase letters but are reduced to the size of lowercase letters.
+ *
+ * **Syntax**: `auto | none`
+ *
+ * **Initial value**: `auto`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :------: | :--: | :-: |
+ * | **97** | **111** | **16.4** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/font-synthesis-small-caps
+ */
+ fontSynthesisSmallCaps?: Property.FontSynthesisSmallCaps | undefined;
+ /**
+ * The **`font-synthesis-style`** CSS property lets you specify whether or not the browser may synthesize the oblique typeface when it is missing in a font family.
+ *
+ * **Syntax**: `auto | none`
+ *
+ * **Initial value**: `auto`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :------: | :--: | :-: |
+ * | **97** | **111** | **16.4** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/font-synthesis-style
+ */
+ fontSynthesisStyle?: Property.FontSynthesisStyle | undefined;
+ /**
+ * The **`font-synthesis-weight`** CSS property lets you specify whether or not the browser may synthesize the bold typeface when it is missing in a font family.
+ *
+ * **Syntax**: `auto | none`
+ *
+ * **Initial value**: `auto`
+ *
+ * | Chrome | Firefox | Safari | Edge | IE |
+ * | :----: | :-----: | :------: | :--: | :-: |
+ * | **97** | **111** | **16.4** | n/a | No |
+ *
+ * @see https://developer.mozilla.org/docs/Web/CSS/font-synthesis-weight
+ */
+ fontSynthesisWeight?: Property.FontSynthesisWeight | undefined;
+ /**
+ * The **`font-variant`** CSS shorthand property allows you to set all the font variants for a font.
+ *
+ * **Syntax**: `normal | none | [ || || || || stylistic( ) || historical-forms || styleset( # ) || character-variant( # ) || swash( ) || ornaments( ) || annotation( ) || [ small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps ] ||