From 835d138cf0ff458f65b1bbd28f505999461647c5 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Tue, 18 Jul 2023 15:41:36 +0200 Subject: [PATCH 001/109] add remote control --- package-lock.json | 65 +++++++++- package.json | 1 + src/components/Settings.tsx | 10 ++ src/components/node/NodeHeaderIcons.tsx | 30 +++++ src/components/node/NodeRenderer.tsx | 29 +++-- src/components/remote/control/index.tsx | 70 +++++++++++ src/components/remote/control/store.ts | 133 +++++++++++++++++++++ src/components/remote/index.tsx | 132 ++++++++++++++++++++ src/components/remote/message.ts | 49 ++++++++ src/components/settings/RemoteSettings.tsx | 47 ++++++++ src/engine/node.ts | 1 + src/engine/store.ts | 19 ++- src/index.tsx | 15 ++- src/nodes/ButtonNode.tsx | 3 +- src/nodes/Display.tsx | 1 + src/nodes/SliderNode.tsx | 3 +- src/nodes/category.ts | 4 + 17 files changed, 595 insertions(+), 17 deletions(-) create mode 100644 src/components/remote/control/index.tsx create mode 100644 src/components/remote/control/store.ts create mode 100644 src/components/remote/index.tsx create mode 100644 src/components/remote/message.ts create mode 100644 src/components/settings/RemoteSettings.tsx diff --git a/package-lock.json b/package-lock.json index 20baf1d..7540cab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "beadi", - "version": "0.0.2", + "version": "0.0.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "beadi", - "version": "0.0.2", + "version": "0.0.3", "dependencies": { "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", @@ -28,6 +28,7 @@ "react-dom": "^18.2.0", "react-icons": "^4.7.1", "react-markdown": "^8.0.4", + "react-router-dom": "^6.14.1", "react-scripts": "5.0.1", "reactflow": "^11.3.2", "swr": "^2.1.0", @@ -3247,6 +3248,14 @@ "react-dom": ">=17" } }, + "node_modules/@remix-run/router": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.7.1.tgz", + "integrity": "sha512-bgVQM4ZJ2u2CM8k1ey70o1ePFXsEzYVZoWghh6WjM8p59jQ7HxzbHW4SbnWFG7V9ig9chLawQxDTZ3xzOF8MkQ==", + "engines": { + "node": ">=14" + } + }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -15551,6 +15560,36 @@ "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.14.1.tgz", + "integrity": "sha512-U4PfgvG55LdvbQjg5Y9QRWyVxIdO1LlpYT7x+tMAxd9/vmiPuJhIwdxZuIQLN/9e3O4KFDHYfR9gzGeYMasW8g==", + "dependencies": { + "@remix-run/router": "1.7.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.14.1.tgz", + "integrity": "sha512-ssF6M5UkQjHK70fgukCJyjlda0Dgono2QGwqGvuk7D+EDGHdacEN3Yke2LTMjkrpHuFwBfDFsEjGVXBDmL+bWw==", + "dependencies": { + "@remix-run/router": "1.7.1", + "react-router": "6.14.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/react-scripts": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", @@ -21099,6 +21138,11 @@ "zustand": "^4.1.1" } }, + "@remix-run/router": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.7.1.tgz", + "integrity": "sha512-bgVQM4ZJ2u2CM8k1ey70o1ePFXsEzYVZoWghh6WjM8p59jQ7HxzbHW4SbnWFG7V9ig9chLawQxDTZ3xzOF8MkQ==" + }, "@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -29856,6 +29900,23 @@ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==" }, + "react-router": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.14.1.tgz", + "integrity": "sha512-U4PfgvG55LdvbQjg5Y9QRWyVxIdO1LlpYT7x+tMAxd9/vmiPuJhIwdxZuIQLN/9e3O4KFDHYfR9gzGeYMasW8g==", + "requires": { + "@remix-run/router": "1.7.1" + } + }, + "react-router-dom": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.14.1.tgz", + "integrity": "sha512-ssF6M5UkQjHK70fgukCJyjlda0Dgono2QGwqGvuk7D+EDGHdacEN3Yke2LTMjkrpHuFwBfDFsEjGVXBDmL+bWw==", + "requires": { + "@remix-run/router": "1.7.1", + "react-router": "6.14.1" + } + }, "react-scripts": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", diff --git a/package.json b/package.json index d94cc18..f279328 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "react-dom": "^18.2.0", "react-icons": "^4.7.1", "react-markdown": "^8.0.4", + "react-router-dom": "^6.14.1", "react-scripts": "5.0.1", "reactflow": "^11.3.2", "swr": "^2.1.0", diff --git a/src/components/Settings.tsx b/src/components/Settings.tsx index 8515de9..dc6669a 100644 --- a/src/components/Settings.tsx +++ b/src/components/Settings.tsx @@ -15,6 +15,8 @@ import { import { ButtplugSettings } from "./settings/ButtplugSettings"; import { FileSettings } from "./settings/FileSettings"; import { MobileInterfaceTab } from "./settings/MobileInterface"; +import { MdOutlineSettingsRemote, MdSettingsRemote } from "react-icons/md"; +import { RemoteSettings } from "./settings/RemoteSettings"; type Tab = { name: string; @@ -42,6 +44,14 @@ const tabs: Record = { icon: , tab: MobileInterfaceTab, }, + remote: { + name: "remote", + label: "Remote Control", + icon: ( + + ), + tab: RemoteSettings, + }, }; export const Settings: FunctionComponent<{}> = () => { diff --git a/src/components/node/NodeHeaderIcons.tsx b/src/components/node/NodeHeaderIcons.tsx index 9bfc63f..c67d4ec 100644 --- a/src/components/node/NodeHeaderIcons.tsx +++ b/src/components/node/NodeHeaderIcons.tsx @@ -1,6 +1,7 @@ import { FunctionComponent } from "react"; import { useDisplayStore, useMergeNodeData } from "../../engine/store"; import { MdMobileFriendly, MdMobileOff } from "react-icons/md"; +import { BsWifi, BsWifiOff } from "react-icons/bs"; type MobileVisibleSwitchProps = { nodeId: string; @@ -29,3 +30,32 @@ export const MobileVisibleSwitch: FunctionComponent< ); } }; + +type PublishedSwitchProps = { + nodeId: string; + published: boolean | undefined; +}; +export const PublishedSwitch: FunctionComponent = ({ + nodeId, + published, +}) => { + const mergeSettings = useMergeNodeData(nodeId); + + if (published !== true) { + return ( + mergeSettings({ published: true })} + > + ); + } else { + return ( + mergeSettings({ published: false })} + > + ); + } +}; diff --git a/src/components/node/NodeRenderer.tsx b/src/components/node/NodeRenderer.tsx index 2c9eb73..0df7f22 100644 --- a/src/components/node/NodeRenderer.tsx +++ b/src/components/node/NodeRenderer.tsx @@ -4,8 +4,8 @@ import NumberInput from "../input/NumberInput"; import NodeHandleLine from "./NodeHandleLine"; import NodeShell from "./NodeShell"; import { InputHandleDef, NodeDef } from "../../engine/node"; -import { useInputHandleData } from "../../engine/store"; -import { MobileVisibleSwitch } from "./NodeHeaderIcons"; +import { NodeData, useInputHandleData } from "../../engine/store"; +import { MobileVisibleSwitch, PublishedSwitch } from "./NodeHeaderIcons"; import { NODE_HANDLE_INPUT_TYPES } from "./nodeInputs"; export type HandleInputProps = { input: InputHandleDef; @@ -24,7 +24,9 @@ function getHandleInput({ type, input, nodeId }: HandleInputCProps) { return undefined; } -export function makeNodeRenderer(def: NodeDef): ComponentType> { +export function makeNodeRenderer( + def: NodeDef +): ComponentType> { const HeaderComponent = def.header; const inputs = def.inputs.filter((it) => it.hidden !== true); @@ -33,6 +35,7 @@ export function makeNodeRenderer(def: NodeDef): ComponentType> { } const canBeMobile = def.mobileView !== undefined; + const publishable = def.publishable && canBeMobile; return ({ id, data }) => { const edges = useEdges(); @@ -51,12 +54,20 @@ export function makeNodeRenderer(def: NodeDef): ComponentType> { title={def.label} color={def.category.color} headerIcons={ - canBeMobile ? ( - - ) : undefined +
+ {canBeMobile && ( + + )} + {publishable && ( + + )} +
} > {HeaderComponent && ( diff --git a/src/components/remote/control/index.tsx b/src/components/remote/control/index.tsx new file mode 100644 index 0000000..2764947 --- /dev/null +++ b/src/components/remote/control/index.tsx @@ -0,0 +1,70 @@ +import { FunctionComponent, useCallback, useEffect, useState } from "react"; +import { useParams } from "react-router-dom"; +import { useRemoteControlStore } from "./store"; +import { RemoteControlEndpoint } from "../message"; + +type RemoteControlProps = { + endpoint: RemoteControlEndpoint; +}; +export const RemoteControlSlider: FunctionComponent = ({ + endpoint, +}) => { + const setValue = useRemoteControlStore((s) => s.setEndpointValue); + + const [state, setRawState] = useState(endpoint.value); + + const id = endpoint.id; + const setState = useCallback( + (value: number) => { + setValue(id, value); + setRawState(value); + }, + [setRawState, setValue, id] + ); + + return ( +
+

+ {endpoint.id} ({endpoint.type}) = {endpoint.value} +

+ setState(parseFloat(e.target.value))} + > +
+ ); +}; + +export const RemoteControlPage: FunctionComponent<{}> = ({}) => { + const { connect, disconnect, state } = useRemoteControlStore(); + const { id } = useParams(); + + //The store connect method debounces the id so this is fine... yet yucky + useEffect(() => { + if (id !== undefined) { + connect(id); + } else { + disconnect(); + } + }, [id, connect, disconnect]); + + if (state.state === "connecting") { + return

Connecting to {state.id}

; + } else if (state.state === "connected") { + return ( +
+

Remote Control for {state.id}

+
    + {Object.values(state.endpoints).map((endpoint) => ( + + ))} +
+
+ ); + } + return

Disconnected.

; +}; diff --git a/src/components/remote/control/store.ts b/src/components/remote/control/store.ts new file mode 100644 index 0000000..c598a3c --- /dev/null +++ b/src/components/remote/control/store.ts @@ -0,0 +1,133 @@ +import create from "zustand"; +import { + BeadiMessage, + RemoteControlEndpoint, + handleMessage, + sendMessage, +} from "../message"; +import produce from "immer"; + +type RemoteControlStoreState = + | { + state: "disconnected"; + } + | { + state: "connecting"; + socket: WebSocket; + id: string; + } + | { + state: "connected"; + socket: WebSocket; + id: string; + endpoints: Record; + }; +type RemoteControlStore = { + state: RemoteControlStoreState; + + connect: (id: string) => void; + disconnect: () => void; + setEndpointValue: (endpointId: string, value: number) => void; +}; + +export const useRemoteControlStore = create()( + (set, get) => ({ + state: { + state: "disconnected", + }, + endpoints: [], + connect: (id) => { + //If i'm connecting to another id, cancel the old id + { + const state = get().state; + if (state.state !== "disconnected") { + if (state.id === id) { + return; + } else { + get().disconnect(); + } + } + } + + console.log("Connecting to new websocket."); + const socket = new WebSocket(`ws://localhost:6969/control/${id}`); + set({ state: { state: "connecting", socket, id } }); + + socket.addEventListener("open", (event) => { + console.log("WebSocket Opened: ", event); + }); + socket.addEventListener("close", (event) => { + console.log("WebSocket closed: ", event); + set({ state: { state: "disconnected" } }); + }); + socket.addEventListener("message", (event) => { + console.log("WebSocket message: ", event); + try { + const data: BeadiMessage = JSON.parse(event.data); + handleMessage(data, { + WelcomeController: (payload) => { + set({ + state: { + state: "connected", + id: payload.id, + socket: socket, + endpoints: Object.assign( + {}, + ...payload.endpoints.map((it) => ({ + [it.id]: it, + })) + ), + }, + }); + }, + PublishEndpoints: (payload) => { + set((it) => + produce(it, (draft) => { + if (draft.state.state === "connected") { + draft.state.endpoints = Object.assign( + {}, + ...payload.endpoints.map((it) => ({ + [it.id]: it, + })) + ); + } + }) + ); + }, + ValueChanged: ({ endpoint, value }) => { + set((it) => + produce(it, (draft) => { + if (draft.state.state === "connected") { + if (endpoint in draft.state.endpoints) { + draft.state.endpoints[endpoint].value = value; + } + } + }) + ); + }, + }); + } catch (e) { + console.error("Unreadable message: ", event); + } + }); + }, + disconnect: () => { + const state = get().state; + if (state.state !== "disconnected") { + console.log("Disconnecting from websocket."); + state.socket.close(0, "Generic disconnect message from beadi."); + } + }, + setEndpointValue: (endpoint, value) => { + const state = get().state; + if (state.state === "connected") { + sendMessage(state.socket, { + ValueChanged: { + endpoint: endpoint, + value: value, + }, + }); + } + }, + }) +); diff --git a/src/components/remote/index.tsx b/src/components/remote/index.tsx new file mode 100644 index 0000000..ec33a98 --- /dev/null +++ b/src/components/remote/index.tsx @@ -0,0 +1,132 @@ +import create, { useStore } from "zustand"; +import { + BeadiMessage, + RemoteControlEndpoint, + handleMessage, + sendMessage, +} from "./message"; +import _ from "lodash"; +import produce from "immer"; +import { useDisplayStore } from "../../engine/store"; +import { nodeDefs } from "../../nodes/nodes"; + +type RemotePublishStoreState = + | { + state: "disconnected"; + } + | { + state: "connecting"; + socket: WebSocket; + } + | { + state: "connected"; + socket: WebSocket; + id: string; + }; +type RemotePublishStore = { + state: RemotePublishStoreState; + + endpoints: RemoteControlEndpoint[]; + + connect: () => void; + disconnect: () => void; + setEndpoints: (endpoints: RemoteControlEndpoint[]) => void; +}; + +export const useRemotePublishStore = create()( + (set, get) => ({ + state: { + state: "disconnected", + }, + endpoints: [], + connect: () => { + const socket = new WebSocket("ws://localhost:6969/publish"); + set({ state: { state: "connecting", socket } }); + + socket.addEventListener("open", (event) => { + console.log("WebSocket Opened: ", event); + }); + socket.addEventListener("close", (event) => { + console.log("WebSocket closed: ", event); + set({ state: { state: "disconnected" } }); + }); + socket.addEventListener("message", (event) => { + console.log("WebSocket message: ", event); + try { + const data: BeadiMessage = JSON.parse(event.data); + handleMessage(data, { + Welcome: (payload) => { + set({ + state: { + state: "connected", + id: payload.id, + socket: socket, + }, + }); + sendMessage(socket, { + PublishEndpoints: { endpoints: get().endpoints }, + }); + }, + PublishEndpoints: (payload) => { + set({ endpoints: payload.endpoints }); + }, + ValueChanged: ({ endpoint, value }) => { + console.log("Set ", endpoint, " to ", value); + set((it) => + produce(it, (draft) => { + const ep = draft.endpoints.find((it) => it.id === endpoint); + if (ep !== undefined) { + ep.value = value; + } + }) + ); + useDisplayStore + .getState() + .setHandle(endpoint, "input__value", value); + }, + }); + } catch (e) { + console.error("Unreadable message: ", event); + } + }); + }, + disconnect: () => { + const state = get().state; + if (state.state !== "disconnected") { + state.socket.close(1000, "Generic disconnect message from beadi."); + } + }, + setEndpoints: (endpoints) => { + console.log(get().endpoints, endpoints); + if (!_.isEqual(get().endpoints, endpoints)) { + const state = get().state; + if (state.state === "connected") { + sendMessage(state.socket, { + PublishEndpoints: { endpoints: endpoints }, + }); + //Update the state in handlemessage + } else { + set({ endpoints: endpoints }); + } + } + }, + }) +); + +useDisplayStore.subscribe((state, prevState) => { + const publishedEndpoints = state.nodes + .filter((node) => { + if (node.type !== undefined) { + return ( + (nodeDefs[node.type]?.publishable ?? false) && + (node.data.published ?? false) + ); + } + return false; + }) + .map((node) => { + const val = state.getHandle(node.id, "input__value"); + return { id: node.id, type: node.type!!, value: val }; + }); + useRemotePublishStore.getState().setEndpoints(publishedEndpoints); +}); diff --git a/src/components/remote/message.ts b/src/components/remote/message.ts new file mode 100644 index 0000000..4a193be --- /dev/null +++ b/src/components/remote/message.ts @@ -0,0 +1,49 @@ +export type RemoteControlEndpoint = { + id: string; + type: string; + value: number; +}; + +export type BeadiMessage = { + Welcome?: { + id: string; + }; + PublishEndpoints?: { + endpoints: RemoteControlEndpoint[]; + }; + WelcomeController?: { + endpoints: RemoteControlEndpoint[]; + id: string; + }; + ValueChanged?: { + endpoint: string; + value: number; + }; +}; + +type BeadiMessageHandlers = { + [k in keyof BeadiMessage]?: (data: Required[k]) => void; +}; + +export function handleMessage( + message: BeadiMessage, + handlers: BeadiMessageHandlers +) { + for (const key in message) { + const k = key as keyof BeadiMessage; + if (k in handlers) { + const handler = handlers[k]; + if (handler !== undefined) { + handler(message[k] as any); + } + } + } +} + +export function sendMessage(socket: WebSocket, message: BeadiMessage) { + Object.entries(message).forEach(([key, payload]) => { + const data = JSON.stringify({ [key]: payload }); + console.log("Sending ", socket, data); + socket.send(data); + }); +} diff --git a/src/components/settings/RemoteSettings.tsx b/src/components/settings/RemoteSettings.tsx new file mode 100644 index 0000000..b3429c1 --- /dev/null +++ b/src/components/settings/RemoteSettings.tsx @@ -0,0 +1,47 @@ +import { FunctionComponent } from "react"; +import { Typo } from "../Typo"; +import _ from "lodash"; +import { Button } from "../input/Button"; +import { useRemotePublishStore } from "../remote"; +import { Link } from "react-router-dom"; + +export const RemoteSettings: FunctionComponent<{}> = () => { + const state = useRemotePublishStore((s) => s.state); + const funcs = useRemotePublishStore((s) => ({ + connect: s.connect, + disconnect: s.disconnect, + })); + + return ( +
+ Remote Control + {state.state === "connected" ? ( + <> + +

+ Remote Control is active via code:{" "} + + {state.id} + +

+ + ) : ( + <> + + + )} +
+ ); +}; diff --git a/src/engine/node.ts b/src/engine/node.ts index 4ea73d3..9e2bf8d 100644 --- a/src/engine/node.ts +++ b/src/engine/node.ts @@ -35,6 +35,7 @@ export type MobileViewProps = { id: string; data: any }; export type NodeDef = { nodeComponent?: ComponentType; label: string; + publishable?: boolean; category: Category; type: string; header?: ComponentType; diff --git a/src/engine/store.ts b/src/engine/store.ts index 2da3544..1fe3690 100644 --- a/src/engine/store.ts +++ b/src/engine/store.ts @@ -19,12 +19,21 @@ type NodeId = string; type AddNode = (type: string, pos: XYPosition) => NodeId; type AddEdge = (edge: Edge) => void; +export interface NodeData { + mobileVisible?: boolean; + published?: boolean; + name?: string; +} + export interface DisplayStore { - nodes: Node[]; + nodes: Node[]; edges: Edge[]; handles: Record; setHandle: (nodeId: string, handleId: string, data: any) => void; - mergeNodeData: (nodeId: string, data: any) => void; + getHandle: (nodeId: string, handleId: string) => any; + + //TODO Change this to a immer recipe instead of merging + mergeNodeData: (nodeId: string, data: Partial) => void; onNodesChange: OnNodesChange; onEdgesChange: OnEdgesChange; onConnect: OnConnect; @@ -88,6 +97,10 @@ export const useDisplayStore = create()( [`${nodeId}__${handleId}`]: data, }, })), + getHandle: (nodeId, handleId) => { + console.log(get().handles); + return get().handles[`${nodeId}__${handleId}`]; + }, onConnect: (connection) => { set({ edges: addEdge( @@ -268,7 +281,7 @@ export function useSetNodeName(nodeId: string) { export function useMergeNodeData(nodeId: string) { const mergeNodeData = useDisplayStore((state) => state.mergeNodeData); return useCallback( - (data: Record) => { + (data: Partial) => { mergeNodeData(nodeId, data); }, [nodeId, mergeNodeData] diff --git a/src/index.tsx b/src/index.tsx index 4a764ad..0163191 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -5,16 +5,29 @@ import "reactflow/dist/style.css"; import App from "./App"; import reportWebVitals from "./reportWebVitals"; import { enableAllPlugins } from "immer"; +import { RouterProvider, createBrowserRouter } from "react-router-dom"; +import { RemoteControlPage } from "./components/remote/control"; // import { setButtplugInstance } from "./adapters/store"; // enableAllPlugins(); +const router = createBrowserRouter([ + { + path: "/", + element: , + }, + { + path: "/remote/:id", + element: , + }, +]); + const root = ReactDOM.createRoot( document.getElementById("root") as HTMLElement ); root.render( - + ); diff --git a/src/nodes/ButtonNode.tsx b/src/nodes/ButtonNode.tsx index 9ff6571..f609f9e 100644 --- a/src/nodes/ButtonNode.tsx +++ b/src/nodes/ButtonNode.tsx @@ -36,7 +36,8 @@ const ButtonNode: FunctionComponent = ({ id, data }) => { export const BUTTON_NODE_TYPE = "button"; export const buttonNodeDef: NodeDef = { label: "Button", - category: categories["control"], + category: categories["ui"], + publishable: true, type: BUTTON_NODE_TYPE, header: ButtonNode, mobileView: ButtonMobile, diff --git a/src/nodes/Display.tsx b/src/nodes/Display.tsx index f70d0ac..cf3b448 100644 --- a/src/nodes/Display.tsx +++ b/src/nodes/Display.tsx @@ -154,6 +154,7 @@ export const displayNodeDef: NodeDef = { type: "display", // component: DisplayNode, header: DisplayNode, + publishable: true, outputs: [], mobileView: DisplayMobileView, inputs: [ diff --git a/src/nodes/SliderNode.tsx b/src/nodes/SliderNode.tsx index 50c5cc4..08d6b8d 100644 --- a/src/nodes/SliderNode.tsx +++ b/src/nodes/SliderNode.tsx @@ -49,7 +49,8 @@ const SliderNode: FunctionComponent = ({ id, data }) => { export const SLIDER_NODE_TYPE = "slider"; export const sliderNodeDef: NodeDef = { label: "Slider", - category: categories["control"], + category: categories["ui"], + publishable: true, type: SLIDER_NODE_TYPE, header: SliderNode, mobileView: SliderMobile, diff --git a/src/nodes/category.ts b/src/nodes/category.ts index c5e55ce..b487442 100644 --- a/src/nodes/category.ts +++ b/src/nodes/category.ts @@ -9,6 +9,10 @@ export const categories: Record = { label: "Control", color: "#FFaDa2", }, + ui: { + label: "User Interface", + color: "#3B60E4", + }, generators: { label: "Generators", color: "#FF9B71", From 0ee4d93e572cf8a5f7bc48930f320c17f97ba5f8 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Tue, 18 Jul 2023 23:08:37 +0200 Subject: [PATCH 002/109] mid-rewrite commit --- .prettierrc | 3 + .vscode/settings.json | 8 + src/App.tsx | 4 - src/components/Viewport.tsx | 129 ++--- src/components/mobile/ProgramInterface.tsx | 4 +- src/components/node/NodeHandleLine.tsx | 4 +- ...eaderIcons.tsx => NodeHeaderIcons.tsx.off} | 2 +- src/components/node/NodeRenderer.tsx | 69 +-- src/components/node/nodeInputs.tsx | 31 +- src/components/remote/index.tsx | 166 +++---- src/components/settings/FileSettings.tsx | 70 +-- src/components/settings/JsonExport.tsx | 54 ++- src/components/settings/Litterbox.tsx | 47 +- src/engine/compiler.ts | 237 ++++++++++ src/engine/evaluate.ts | 46 -- src/engine/index.ts | 108 ----- src/engine/node.ts | 89 +++- src/engine/nodeDriverStore.ts | 30 ++ src/engine/runner.ts | 109 ++--- src/engine/signal.ts | 52 ++ src/engine/store.ts | 443 ++++++++---------- src/engine/store.ts.off | 257 ++++++++++ src/nodes/{AddNode.tsx => AddNode.tsx.off} | 0 .../{ButtonNode.tsx => ButtonNode.tsx.off} | 0 ...{ButtplugNode.tsx => ButtplugNode.tsx.off} | 0 .../{ClampNode.tsx => ClampNode.tsx.off} | 0 .../{CommentNode.tsx => CommentNode.tsx.off} | 0 ...alueNode.tsx => ConstantValueNode.tsx.off} | 0 .../{CurveNode.tsx => CurveNode.tsx.off} | 0 .../{DelayNode.tsx => DelayNode.tsx.off} | 0 src/nodes/{Display.tsx => Display.tsx.off} | 0 ...{EdgeDetector.tsx => EdgeDetector.tsx.off} | 0 ...teresisNode.tsx => HysteresisNode.tsx.off} | 0 .../{MediaFurry.tsx => MediaFurry.tsx.off} | 0 .../{MemoryNode.tsx => MemoryNode.tsx.off} | 0 src/nodes/{MixNode.tsx => MixNode.tsx.off} | 0 ...{PositiveWave.tsx => PositiveWave.tsx.off} | 0 .../{RandomNode.tsx => RandomNode.tsx.off} | 0 .../{SensorNode.tsx => SensorNode.tsx.off} | 0 .../{SliderNode.tsx => SliderNode.tsx.off} | 0 src/nodes/TimerNode.tsx | 103 ++-- src/nodes/ToggleNode.tsx | 65 ++- src/nodes/WelcomeNode.tsx | 63 +-- src/nodes/nodes.ts | 101 ++-- 44 files changed, 1277 insertions(+), 1017 deletions(-) create mode 100644 .prettierrc create mode 100644 .vscode/settings.json rename src/components/node/{NodeHeaderIcons.tsx => NodeHeaderIcons.tsx.off} (95%) create mode 100644 src/engine/compiler.ts delete mode 100644 src/engine/evaluate.ts create mode 100644 src/engine/nodeDriverStore.ts create mode 100644 src/engine/signal.ts create mode 100644 src/engine/store.ts.off rename src/nodes/{AddNode.tsx => AddNode.tsx.off} (100%) rename src/nodes/{ButtonNode.tsx => ButtonNode.tsx.off} (100%) rename src/nodes/{ButtplugNode.tsx => ButtplugNode.tsx.off} (100%) rename src/nodes/{ClampNode.tsx => ClampNode.tsx.off} (100%) rename src/nodes/{CommentNode.tsx => CommentNode.tsx.off} (100%) rename src/nodes/{ConstantValueNode.tsx => ConstantValueNode.tsx.off} (100%) rename src/nodes/{CurveNode.tsx => CurveNode.tsx.off} (100%) rename src/nodes/{DelayNode.tsx => DelayNode.tsx.off} (100%) rename src/nodes/{Display.tsx => Display.tsx.off} (100%) rename src/nodes/{EdgeDetector.tsx => EdgeDetector.tsx.off} (100%) rename src/nodes/{HysteresisNode.tsx => HysteresisNode.tsx.off} (100%) rename src/nodes/{MediaFurry.tsx => MediaFurry.tsx.off} (100%) rename src/nodes/{MemoryNode.tsx => MemoryNode.tsx.off} (100%) rename src/nodes/{MixNode.tsx => MixNode.tsx.off} (100%) rename src/nodes/{PositiveWave.tsx => PositiveWave.tsx.off} (100%) rename src/nodes/{RandomNode.tsx => RandomNode.tsx.off} (100%) rename src/nodes/{SensorNode.tsx => SensorNode.tsx.off} (100%) rename src/nodes/{SliderNode.tsx => SliderNode.tsx.off} (100%) diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..e7740ff --- /dev/null +++ b/.prettierrc @@ -0,0 +1,3 @@ +{ + "printWidth": 140 +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..cf205bf --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "auto-close-tag.disableOnLanguage": [ + "php", + "javascript", + "typescript", + "plaintext" + ] +} diff --git a/src/App.tsx b/src/App.tsx index 3c6174d..6fa6a75 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,4 +1,3 @@ -import { useState } from "react"; import { DndProvider } from "react-dnd"; import { HTML5Backend } from "react-dnd-html5-backend"; import create from "zustand"; @@ -7,7 +6,6 @@ import Drawer from "./components/Drawer"; import { MobileView } from "./components/mobile/MobileView"; import { Settings } from "./components/Settings"; import Viewport from "./components/Viewport"; -import { runEngineLoop } from "./engine/runner"; type GlobalSettings = { mobileView: boolean; @@ -44,5 +42,3 @@ function App() { } export default App; - -runEngineLoop(); diff --git a/src/components/Viewport.tsx b/src/components/Viewport.tsx index 390db60..dd5b03a 100644 --- a/src/components/Viewport.tsx +++ b/src/components/Viewport.tsx @@ -1,12 +1,4 @@ -import { - FunctionComponent, - ReactNode, - RefObject, - useCallback, - useMemo, - useRef, - useState, -} from "react"; +import { FunctionComponent, ReactNode, RefObject, useCallback, useMemo, useRef, useState } from "react"; import ReactFlow, { Controls, Background, @@ -19,7 +11,7 @@ import ReactFlow, { OnConnectStartParams, } from "reactflow"; import _ from "lodash"; -import { DisplayStore, useDisplayStore } from "../engine/store"; +import { FileStore, useFileStore } from "../engine/store"; import { makeNodeRenderer } from "./node/NodeRenderer"; import shallow from "zustand/shallow"; import { useDrop } from "react-dnd"; @@ -48,11 +40,7 @@ type ViewportDropTargetDrop = { wrapper: RefObject; onNodeDrop?: (pos: XYPosition, type: string) => void; }; -const ViewportDropTarget: FunctionComponent = ({ - children, - onNodeDrop, - wrapper, -}) => { +const ViewportDropTarget: FunctionComponent = ({ children, onNodeDrop, wrapper }) => { const { project } = useReactFlow(); //eslint-disable-next-line @@ -85,9 +73,9 @@ const nodeTypes: NodeTypes = { welcome: WelcomeNode, }; -const selector = (state: DisplayStore) => ({ - nodes: state.nodes, - edges: state.edges, +const selector = (state: FileStore) => ({ + nodes: Object.values(state.data.nodes), + edges: Object.values(state.data.edges), onNodesChange: state.onNodesChange, onEdgesChange: state.onEdgesChange, onConnect: state.onConnect, @@ -105,36 +93,32 @@ type NewNodeDropDownProps = { data: NodeDropdownData; onClose: () => void; }; -const NewNodeDropdown: FunctionComponent = ({ - data, - onClose, -}) => { - const { addNode, addEdge, nodes } = useDisplayStore( - (s) => ({ addNode: s.addNode, addEdge: s.addEdge, nodes: s.nodes }), - shallow - ); +const NewNodeDropdown: FunctionComponent = ({ data, onClose }) => { + const { addNode, addEdge, nodes } = useFileStore((s) => ({ addNode: s.addNode, addEdge: s.addEdge, nodes: s.data.nodes }), shallow); const handles = useMemo(() => { - const sourceNodeType = nodes.find((it) => it.id === data.source)?.type; + const sourceNodeType = nodes[data.source].type; if (sourceNodeType !== undefined) { let fromOutput = true; - let handleType: OutputHandleDef | InputHandleDef = nodeDefs[ - sourceNodeType - ].outputs.find((output) => output.id === data.sourceHandle)!!; + let handleType: OutputHandleDef | InputHandleDef = nodeDefs[sourceNodeType].outputs[data.sourceHandle]; if (handleType === undefined) { fromOutput = false; - handleType = nodeDefs[sourceNodeType].inputs.find( - (input) => input.id === data.sourceHandle - )!!; + handleType = nodeDefs[sourceNodeType].inputs[data.sourceHandle]; } - + return Object.values(nodeDefs) - .flatMap((def) => (fromOutput ? def.inputs : def.outputs).map((it) => ({ node: def, handle: it, output: !fromOutput }))) + .flatMap((def) => + Object.entries(fromOutput ? def.inputs : def.outputs).map(([handleId, handle]) => ({ + node: def, + handle: handle, + handleId, + output: !fromOutput, + })) + ) .filter( (it) => - (it.output ? - handlesCompatible(it.handle.type, handleType.type) : handlesCompatible(handleType.type, it.handle.type)) && - ((it.handle as any)["hidden"] !== true) + (it.output ? handlesCompatible(it.handle.type, handleType.type) : handlesCompatible(handleType.type, it.handle.type)) && + (it.handle as any)["hidden"] !== true ); } else { return []; @@ -144,28 +128,29 @@ const NewNodeDropdown: FunctionComponent = ({ const complete = useCallback( (type: string, handle: string, toOutput: boolean) => { const newId = addNode(type, data.pos); - - const fromTo = toOutput ? { - source: { - id: newId, - handle: handle - }, - target: { - id: data.source, - handle: data.sourceHandle - } - }:{ - target: { - id: newId, - handle: handle - }, - source: { - id: data.source, - handle: data.sourceHandle - } - } + + const fromTo = toOutput + ? { + source: { + id: newId, + handle: handle, + }, + target: { + id: data.source, + handle: data.sourceHandle, + }, + } + : { + target: { + id: newId, + handle: handle, + }, + source: { + id: data.source, + handle: data.sourceHandle, + }, + }; addEdge({ - id: `reactflow__edge-${fromTo.source.id}${fromTo.source.handle}-${fromTo.target.id}${fromTo.target.handle}`, source: fromTo.source.id, target: fromTo.target.id, sourceHandle: fromTo.source.handle, @@ -184,7 +169,7 @@ const NewNodeDropdown: FunctionComponent = ({
    {handles.map((it) => (
  • complete(it.node.type, it.handle.id, it.output)} + onClick={() => complete(it.node.type, it.handleId, it.output)} className="flex flex-row items-center gap-2 px-2 hover:bg-primary-800" > @@ -200,8 +185,7 @@ const NewNodeDropdown: FunctionComponent = ({ const Viewport: FunctionComponent<{ wrapper: RefObject; }> = ({ wrapper }) => { - const { nodes, edges, onNodesChange, onEdgesChange, onConnect } = - useDisplayStore(selector, shallow); + const { nodes, edges, onNodesChange, onEdgesChange, onConnect } = useFileStore(selector, shallow); const { project } = useReactFlow(); const connectingNode = useRef(null); @@ -210,8 +194,7 @@ const Viewport: FunctionComponent<{ connectingNode.current = start; }, []); - const [nodeDropdownData, setNodeDropdownData] = - useState(null); + const [nodeDropdownData, setNodeDropdownData] = useState(null); const closeDropdown = useCallback(() => { setNodeDropdownData(null); @@ -219,9 +202,7 @@ const Viewport: FunctionComponent<{ const onConnectEnd: OnConnectEnd = useCallback( (event) => { - const targetIsPane = (event.target as any).classList.contains( - "react-flow__pane" - ); + const targetIsPane = (event.target as any).classList.contains("react-flow__pane"); if (targetIsPane) { const rect = wrapper.current?.getBoundingClientRect(); @@ -263,27 +244,19 @@ const Viewport: FunctionComponent<{ - {nodeDropdownData && ( - - )} + {nodeDropdownData && } ); }; const ViewportWrapper: FunctionComponent<{}> = (props) => { - const addNode = useDisplayStore((s) => s.addNode, shallow); + const addNode = useFileStore((s) => s.addNode, shallow); const wrapper = useRef(null); return (
    - addNode(type, pos)} - wrapper={wrapper} - > + addNode(type, pos)} wrapper={wrapper}> diff --git a/src/components/mobile/ProgramInterface.tsx b/src/components/mobile/ProgramInterface.tsx index 4d72230..bfab1b9 100644 --- a/src/components/mobile/ProgramInterface.tsx +++ b/src/components/mobile/ProgramInterface.tsx @@ -1,6 +1,6 @@ import { FunctionComponent, ReactNode, useMemo } from "react"; import shallow from "zustand/shallow"; -import { useDisplayStore, usePushEphermalData } from "../../engine/store"; +import { useFileStore, usePushEphermalData } from "../../engine/store"; import { BUTTON_NODE_TYPE } from "../../nodes/ButtonNode"; import { Node } from "reactflow"; import { MobileWelcome } from "./Welcome"; @@ -42,7 +42,7 @@ const MOBILE_NODE_TYPES = new Set( ); export const ProgramInterface: FunctionComponent<{}> = () => { - const nodes = useDisplayStore((store) => store.nodes, shallow); + const nodes = useFileStore((store) => store.nodes, shallow); const mobileNodes = useMemo(() => { return nodes.filter( diff --git a/src/components/node/NodeHandleLine.tsx b/src/components/node/NodeHandleLine.tsx index c3fcf95..992544c 100644 --- a/src/components/node/NodeHandleLine.tsx +++ b/src/components/node/NodeHandleLine.tsx @@ -1,7 +1,7 @@ import { FunctionComponent, ReactNode, useCallback } from "react"; import { Connection, Handle, Position } from "reactflow"; import clsx from "clsx"; -import { useDisplayStore } from "../../engine/store"; +import { useFileStore } from "../../engine/store"; import { handlesCompatible } from "../../engine/handles"; import { NodeHandleDisplay } from "./NodeHandle"; import { nodeDefs } from "../../nodes/nodes"; @@ -23,7 +23,7 @@ const NodeHandleLine: FunctionComponent = ({ id, connected, }) => { - const nodes = useDisplayStore((store) => store.nodes); + const nodes = useFileStore((store) => store.nodes); const isValidConnection = useCallback( (connection: Connection) => { diff --git a/src/components/node/NodeHeaderIcons.tsx b/src/components/node/NodeHeaderIcons.tsx.off similarity index 95% rename from src/components/node/NodeHeaderIcons.tsx rename to src/components/node/NodeHeaderIcons.tsx.off index c67d4ec..3f3999e 100644 --- a/src/components/node/NodeHeaderIcons.tsx +++ b/src/components/node/NodeHeaderIcons.tsx.off @@ -1,5 +1,5 @@ import { FunctionComponent } from "react"; -import { useDisplayStore, useMergeNodeData } from "../../engine/store"; +import { useFileStore, useMergeNodeData } from "../../engine/store"; import { MdMobileFriendly, MdMobileOff } from "react-icons/md"; import { BsWifi, BsWifiOff } from "react-icons/bs"; diff --git a/src/components/node/NodeRenderer.tsx b/src/components/node/NodeRenderer.tsx index 0df7f22..4749a11 100644 --- a/src/components/node/NodeRenderer.tsx +++ b/src/components/node/NodeRenderer.tsx @@ -3,99 +3,64 @@ import { NodeProps, useEdges } from "reactflow"; import NumberInput from "../input/NumberInput"; import NodeHandleLine from "./NodeHandleLine"; import NodeShell from "./NodeShell"; -import { InputHandleDef, NodeDef } from "../../engine/node"; -import { NodeData, useInputHandleData } from "../../engine/store"; -import { MobileVisibleSwitch, PublishedSwitch } from "./NodeHeaderIcons"; +import { AnyNodeDef, InputHandleDef, NodeDef } from "../../engine/node"; +import { NodeData } from "../../engine/store"; import { NODE_HANDLE_INPUT_TYPES } from "./nodeInputs"; export type HandleInputProps = { input: InputHandleDef; + handleId: string; nodeId: string; }; type HandleInputCProps = { type: string; input: InputHandleDef; nodeId: string; + handleId: string; }; -function getHandleInput({ type, input, nodeId }: HandleInputCProps) { +function getHandleInput({ type, input, nodeId, handleId }: HandleInputCProps) { const Component = NODE_HANDLE_INPUT_TYPES[type]; if (Component !== undefined) { - return ; + return ; } return undefined; } -export function makeNodeRenderer( - def: NodeDef -): ComponentType> { +export function makeNodeRenderer(def: AnyNodeDef): ComponentType> { const HeaderComponent = def.header; - const inputs = def.inputs.filter((it) => it.hidden !== true); + const inputs = Object.entries(def.inputs).filter(([inputId, it]) => it.hidden !== true); if (def.nodeComponent) { return def.nodeComponent; } - const canBeMobile = def.mobileView !== undefined; - const publishable = def.publishable && canBeMobile; - return ({ id, data }) => { const edges = useEdges(); const connections = useMemo(() => { - return inputs.map( - (input) => - edges.findIndex( - (it) => it.target === id && it.targetHandle === input.id - ) >= 0 - ); + return inputs.map(([inputId, input]) => edges.findIndex((it) => it.target === id && it.targetHandle === inputId) >= 0); }, [edges, id]); return ( - - {canBeMobile && ( - - )} - {publishable && ( - - )} -
    - } - > - {HeaderComponent && ( - - )} - {inputs.map((input, index) => ( + + {HeaderComponent && } + {inputs.map(([inputId, input], index) => ( ))} - {def.outputs.map((output) => ( - + {Object.entries(def.outputs).map(([outputId, output]) => ( + ))} ); diff --git a/src/components/node/nodeInputs.tsx b/src/components/node/nodeInputs.tsx index 6dd99d9..4ff13d6 100644 --- a/src/components/node/nodeInputs.tsx +++ b/src/components/node/nodeInputs.tsx @@ -4,16 +4,13 @@ import NumberInput from "../input/NumberInput"; import { TextInput } from "../input/TextInput"; import { HandleInputProps } from "./NodeRenderer"; -const NumberHandleInput: FunctionComponent = ({ - nodeId, - input, -}) => { - const [value, setValue] = useInputHandleData(nodeId, input.id); +const NumberHandleInput: FunctionComponent = ({ nodeId, handleId, input }) => { + const [value, setValue] = useInputHandleData(nodeId, handleId); return ( = ({ ); }; -const StringHandleInput: FunctionComponent = ({ - nodeId, - input, -}) => { - const [value, setValue] = useInputHandleData(nodeId, input.id); +const StringHandleInput: FunctionComponent = ({ handleId, nodeId, input }) => { + const [value, setValue] = useInputHandleData(nodeId, handleId); return ( - setValue(e)} - > + setValue(e)}> ); }; -export const NODE_HANDLE_INPUT_TYPES: Record< - string, - FunctionComponent -> = { +export const NODE_HANDLE_INPUT_TYPES: Record> = { number: NumberHandleInput, string: StringHandleInput, }; diff --git a/src/components/remote/index.tsx b/src/components/remote/index.tsx index ec33a98..1f0845d 100644 --- a/src/components/remote/index.tsx +++ b/src/components/remote/index.tsx @@ -1,13 +1,8 @@ import create, { useStore } from "zustand"; -import { - BeadiMessage, - RemoteControlEndpoint, - handleMessage, - sendMessage, -} from "./message"; +import { BeadiMessage, RemoteControlEndpoint, handleMessage, sendMessage } from "./message"; import _ from "lodash"; import produce from "immer"; -import { useDisplayStore } from "../../engine/store"; +import { useFileStore } from "../../engine/store"; import { nodeDefs } from "../../nodes/nodes"; type RemotePublishStoreState = @@ -33,94 +28,87 @@ type RemotePublishStore = { setEndpoints: (endpoints: RemoteControlEndpoint[]) => void; }; -export const useRemotePublishStore = create()( - (set, get) => ({ - state: { - state: "disconnected", - }, - endpoints: [], - connect: () => { - const socket = new WebSocket("ws://localhost:6969/publish"); - set({ state: { state: "connecting", socket } }); +export const useRemotePublishStore = create()((set, get) => ({ + state: { + state: "disconnected", + }, + endpoints: [], + connect: () => { + const socket = new WebSocket("ws://localhost:6969/publish"); + set({ state: { state: "connecting", socket } }); - socket.addEventListener("open", (event) => { - console.log("WebSocket Opened: ", event); - }); - socket.addEventListener("close", (event) => { - console.log("WebSocket closed: ", event); - set({ state: { state: "disconnected" } }); - }); - socket.addEventListener("message", (event) => { - console.log("WebSocket message: ", event); - try { - const data: BeadiMessage = JSON.parse(event.data); - handleMessage(data, { - Welcome: (payload) => { - set({ - state: { - state: "connected", - id: payload.id, - socket: socket, - }, - }); - sendMessage(socket, { - PublishEndpoints: { endpoints: get().endpoints }, - }); - }, - PublishEndpoints: (payload) => { - set({ endpoints: payload.endpoints }); - }, - ValueChanged: ({ endpoint, value }) => { - console.log("Set ", endpoint, " to ", value); - set((it) => - produce(it, (draft) => { - const ep = draft.endpoints.find((it) => it.id === endpoint); - if (ep !== undefined) { - ep.value = value; - } - }) - ); - useDisplayStore - .getState() - .setHandle(endpoint, "input__value", value); - }, - }); - } catch (e) { - console.error("Unreadable message: ", event); - } - }); - }, - disconnect: () => { - const state = get().state; - if (state.state !== "disconnected") { - state.socket.close(1000, "Generic disconnect message from beadi."); + socket.addEventListener("open", (event) => { + console.log("WebSocket Opened: ", event); + }); + socket.addEventListener("close", (event) => { + console.log("WebSocket closed: ", event); + set({ state: { state: "disconnected" } }); + }); + socket.addEventListener("message", (event) => { + console.log("WebSocket message: ", event); + try { + const data: BeadiMessage = JSON.parse(event.data); + handleMessage(data, { + Welcome: (payload) => { + set({ + state: { + state: "connected", + id: payload.id, + socket: socket, + }, + }); + sendMessage(socket, { + PublishEndpoints: { endpoints: get().endpoints }, + }); + }, + PublishEndpoints: (payload) => { + set({ endpoints: payload.endpoints }); + }, + ValueChanged: ({ endpoint, value }) => { + console.log("Set ", endpoint, " to ", value); + set((it) => + produce(it, (draft) => { + const ep = draft.endpoints.find((it) => it.id === endpoint); + if (ep !== undefined) { + ep.value = value; + } + }) + ); + useFileStore.getState().setHandle(endpoint, "input__value", value); + }, + }); + } catch (e) { + console.error("Unreadable message: ", event); } - }, - setEndpoints: (endpoints) => { - console.log(get().endpoints, endpoints); - if (!_.isEqual(get().endpoints, endpoints)) { - const state = get().state; - if (state.state === "connected") { - sendMessage(state.socket, { - PublishEndpoints: { endpoints: endpoints }, - }); - //Update the state in handlemessage - } else { - set({ endpoints: endpoints }); - } + }); + }, + disconnect: () => { + const state = get().state; + if (state.state !== "disconnected") { + state.socket.close(1000, "Generic disconnect message from beadi."); + } + }, + setEndpoints: (endpoints) => { + console.log(get().endpoints, endpoints); + if (!_.isEqual(get().endpoints, endpoints)) { + const state = get().state; + if (state.state === "connected") { + sendMessage(state.socket, { + PublishEndpoints: { endpoints: endpoints }, + }); + //Update the state in handlemessage + } else { + set({ endpoints: endpoints }); } - }, - }) -); + } + }, +})); -useDisplayStore.subscribe((state, prevState) => { - const publishedEndpoints = state.nodes +useFileStore.subscribe((state, prevState) => { + const publishedEndpoints = Object.values(state.data.nodes) .filter((node) => { if (node.type !== undefined) { - return ( - (nodeDefs[node.type]?.publishable ?? false) && - (node.data.published ?? false) - ); + return (nodeDefs[node.type]?.publishable ?? false) && ((node.data.displaySettings as any).published ?? false); } return false; }) diff --git a/src/components/settings/FileSettings.tsx b/src/components/settings/FileSettings.tsx index e13db34..7bf0e58 100644 --- a/src/components/settings/FileSettings.tsx +++ b/src/components/settings/FileSettings.tsx @@ -1,15 +1,9 @@ -import { - FunctionComponent, - useCallback, - useEffect, - useMemo, - useState, -} from "react"; +import { FunctionComponent, useCallback, useEffect, useMemo, useState } from "react"; import { Button } from "../input/Button"; import { TextInput } from "../input/TextInput"; import { Typo } from "../Typo"; import { DateTime } from "luxon"; -import { useDisplayStore } from "../../engine/store"; +import { ResetDocument, useFileStore } from "../../engine/store"; import _ from "lodash"; import FileSaver from "file-saver"; import { IDBPDatabase, openDB } from "idb"; @@ -117,25 +111,17 @@ export const FileSettings: FunctionComponent<{}> = () => { const [name, setName] = useState(getNewFileName()); const openDb = useDatabaseStore((store) => store.open); - const [save, loadFromDb, removeInDb] = useDatabaseStore((store) => [ - store.save, - store.load, - store.remove, - ]); + const [save, loadFromDb, removeInDb] = useDatabaseStore((store) => [store.save, store.load, store.remove]); useEffect(() => { openDb(); }, [openDb]); const saves = useDatabaseStore((store) => store.files); - const overwriteStoreData = useDisplayStore((store) => store.overwrite); - const resetStoreData = useDisplayStore((store) => store.reset); - const data = useDisplayStore((store) => ({ - nodes: store.nodes.map((node) => - _.pick(node, ["data", "id", "position", "type", "width", "height"]) - ), - edges: store.edges, - handles: store.handles, + const importJson = useFileStore((store) => store.importJson); + const data = useFileStore((store) => ({ + nodes: store.data.nodes, + edges: store.data.edges, })); const exp = useCallback(() => { @@ -156,10 +142,10 @@ export const FileSettings: FunctionComponent<{}> = () => { async (name: string) => { const it = await loadFromDb(name); console.log(it); - overwriteStoreData(it.nodes, it.edges, it.handles); + importJson(it); setName(it.fileName); }, - [loadFromDb, overwriteStoreData, setName] + [loadFromDb, importJson, setName] ); const remove = useCallback( @@ -176,33 +162,20 @@ export const FileSettings: FunctionComponent<{}> = () => { return (
    File - - + + Save Local Saves -
      {saves.map((it) => ( -
    • +
    • {it.fileName}
      @@ -211,22 +184,15 @@ export const FileSettings: FunctionComponent<{}> = () => {
    • ))}
    -

    - Yes, I know this saving thingy is a bit wonky at the moment, but it - works for now... -

    +

    Yes, I know this saving thingy is a bit wonky at the moment, but it works for now...

    Litterbox

    Upload this beadi to{" "} - + litterbox.catbox.moe - . The uploaded Link will become invalid after an hour. This can be used - to quickly share generated Beadis, or transfer them to your smartphone. + . The uploaded Link will become invalid after an hour. This can be used to quickly share generated Beadis, or transfer them to your + smartphone.

    Import from Litterbox diff --git a/src/components/settings/JsonExport.tsx b/src/components/settings/JsonExport.tsx index c43cdba..912d502 100644 --- a/src/components/settings/JsonExport.tsx +++ b/src/components/settings/JsonExport.tsx @@ -1,31 +1,37 @@ import { FunctionComponent, useCallback, useRef } from "react"; -import { useDisplayStore } from "../../engine/store"; +import { useFileStore } from "../../engine/store"; import { Button } from "../input/Button"; -export type ImportFromJsonProps = { - -} +export type ImportFromJsonProps = {}; export const ImportFromJson: FunctionComponent = () => { - const overwriteStoreData = useDisplayStore((store) => store.overwrite); + const importJson = useFileStore((store) => store.importJson); const pickerRef = useRef(null); - - const onFileChanged: React.ChangeEventHandler = useCallback((e) => { - console.log("On File Changed: ", e.target.files); - if(e.target.files?.length == 1){ - const file = e.target.files.item(0) - file?.text().then(text => JSON.parse(text)).then(result => { - overwriteStoreData(result.nodes, result.edges, result.handles); - if(pickerRef.current){ - pickerRef.current.value = ""; - } - }) - } - }, [overwriteStoreData]); - return <> - + const onFileChanged: React.ChangeEventHandler = useCallback( + (e) => { + console.log("On File Changed: ", e.target.files); + if (e.target.files?.length == 1) { + const file = e.target.files.item(0); + file + ?.text() + .then((text) => JSON.parse(text)) + .then((result) => { + importJson(result); + if (pickerRef.current) { + pickerRef.current.value = ""; + } + }); + } + }, + [importJson] + ); + + return ( + <> + -} \ No newline at end of file + ); +}; diff --git a/src/components/settings/Litterbox.tsx b/src/components/settings/Litterbox.tsx index 7b42b96..ab24477 100644 --- a/src/components/settings/Litterbox.tsx +++ b/src/components/settings/Litterbox.tsx @@ -1,26 +1,20 @@ import FileSaver from "file-saver"; import _ from "lodash"; import { FunctionComponent, useCallback, useState } from "react"; -import { useDisplayStore } from "../../engine/store"; +import { useFileStore } from "../../engine/store"; import { Button } from "../input/Button"; import { TextInput } from "../input/TextInput"; const LITTERBOX_URL = "https://litter.catbox.moe/"; export const UploadToLitterbox: FunctionComponent<{}> = () => { - const data = useDisplayStore((store) => ({ - nodes: store.nodes.map((node) => - _.pick(node, ["data", "id", "position", "type", "width", "height"]) - ), - edges: store.edges, - handles: store.handles, - })); + const exportJson = useFileStore((store) => store.exportJson); const [code, setCode] = useState(""); const [link, setLink] = useState(""); const exp = useCallback(() => { - const blob = new Blob([JSON.stringify(data, undefined, 2)], { + const blob = new Blob([JSON.stringify(exportJson(), undefined, 2)], { type: "text/plain;charset=utf-8", }); let formdata = new FormData(); @@ -37,48 +31,41 @@ export const UploadToLitterbox: FunctionComponent<{}> = () => { setLink(response); setCode(response.replace(LITTERBOX_URL, "")); }); - }, [data]); + }, [exportJson]); return ( <> - - {code && -

    - Litterbox Code:{" "} - - {code} - -

    - } + + {code && ( +

    + Litterbox Code:{" "} + + {code} + +

    + )} ); }; export const ImportFromLitterbox: FunctionComponent<{}> = () => { const [text, setText] = useState(""); - const overwriteStoreData = useDisplayStore((store) => store.overwrite); + const overwriteStoreData = useFileStore((store) => store.importJson); const imp = useCallback(() => { fetch(`${LITTERBOX_URL}${text}`) .then((result) => result.json()) .then((result) => { console.log(result); - overwriteStoreData(result.nodes, result.edges, result.handles); - setText("") + overwriteStoreData(result); + setText(""); //TODO VALIDATE THE RESULT }); }, [text, overwriteStoreData, setText]); return ( <> - + diff --git a/src/engine/compiler.ts b/src/engine/compiler.ts new file mode 100644 index 0000000..12eedbd --- /dev/null +++ b/src/engine/compiler.ts @@ -0,0 +1,237 @@ +import _ from "lodash"; +import { useFileStore } from "./store"; +import create from "zustand"; +import { AnyNodeExecutorDef } from "./node"; +import { nodeDefs } from "../nodes/nodes"; +import { getConversionFunction } from "./handles"; + +export type RecipeDependency = { + nodeId: string; + handleId: string; + convert?: (it: any) => any; +}; +export type Recipe = { + dependencies: Record; + nodeId: string; + type: string; + // executor: AnyNodeExecutorDef; +}; + +export type Model = { + executionPlan: Recipe[]; +}; + +export function buildModel({ nodes, edges }: ModelSources): Model { + //Find all terminating handles + console.log("Rebuilding Model"); + + let terminals = []; + let nodeDict: Record = {}; + + for (const node of nodes) { + nodeDict[node.id] = node; + let nodeType = nodeDefs[node.type!!]; + if (nodeType !== undefined) { + for (const inputId in nodeType.inputs) { + const input = nodeType.inputs[inputId]; + if (input.terminal) { + terminals.push({ + node: node.id, + handle: inputId, + }); + } + } + } + } + + let executedNodes = new Set([]); + let executionPlan: Recipe[] = []; + + function resolveInputHandles(nodeId: string) { + if (!executedNodes.has(nodeId)) { + // console.group("Resolving ", nodeId); + const nodeType = nodeDefs[nodeDict[nodeId].type!!]; + let suppliers = edges.filter((edge) => edge.target === nodeId); + let outputForInput: Record = {}; + for (const edge of suppliers) { + const supplierNode = edge.source; + + const supplierType = nodeDefs[nodeDict[supplierNode].type].outputs[edge.sourceHandle]?.type; + + outputForInput[edge.targetHandle || "??"] = { + convert: getConversionFunction(supplierType, nodeType.inputs[edge.targetHandle].type), + nodeId: edge.source, + handleId: edge.sourceHandle, + }; + //Resolve the supplier Node + resolveInputHandles(supplierNode); + } + + executionPlan.push({ + dependencies: _.mapValues(nodeType.inputs, (handle, handleId) => { + if (handleId in outputForInput) { + return outputForInput[handleId]; + } else { + return null; + } + }), + nodeId: nodeId, + type: nodeType.type, + }); + executedNodes.add(nodeId); + + // console.groupEnd(); + } + } + + for (const handle of terminals) { + resolveInputHandles(handle.node); + } + + return { + executionPlan: executionPlan, + }; +} + +/* + +Constant 2 ---> Add 1 --\ + \-> -> Add 4 ---> Display 5 + -> + Constant 3 -----/ + + +//Execution Plan +[ + 2, + 1, + 3, + 4, + 5 +] + +//Nodes +{ + 1: { + inputs: [2_value, 2_value], + exec: [FUNCTION, adds both inputs and writes 1_sum] + } + 2: { + inputs: [2_ivalue], + exec: [FUNCTION, forwards input to 2_value] + } + 3: { + inputs: [2_ivalue], + exec: [FUNCTION, forwards input to 2_value] + } + 4: { + inputs: [1_sum, 3_value], + exec: [FUNCTION, adds both inputs and writes 4_sum] + } + 5: { + inputs: [4_sum], + exec: [FUNCTION, displays 4_sum] + } +} + +//Datas +{ + 2_ivalue: 1, + 3_ivalue: 2 +} + + +*/ + +// function revalidateModel() { +// const { nodes, edges } = useFileStore.getState(); +// const nodeTypeData: NodeTypeData[] = nodes.map((it) => ({ +// type: it.type, +// id: it.id, +// data: undefined, +// })); +// const edgeData: EdgeData[] = edges.map((it) => ({ +// source: it.source, +// target: it.target, +// sourceHandle: it.sourceHandle, +// targetHandle: it.targetHandle, +// })); + +// if ( +// !_.isEqual(edgeData, modelState?.edges) || +// !_.isEqual(nodeTypeData, modelState?.nodes) +// ) { +// console.log( +// "Rebuilding Model", +// edgeData, +// modelState?.edges, +// nodeTypeData, +// modelState?.nodes +// ); +// modelState = { +// nodes: nodeTypeData, +// edges: edgeData, +// model: buildModel(nodeTypeData, edges), +// }; +// } +// } + +export type ModelNode = { + id: string; + type: string; + settings: any; +}; +export type ModelEdge = { + id: string; + source: string; + target: string; + sourceHandle: string; + targetHandle: string; +}; +export type ModelSources = { + nodes: ModelNode[]; + edges: ModelEdge[]; +}; +export type ModelStore = { + sources: ModelSources; + model: Model | null; +}; + +export const modelState = create()(() => ({ + sources: { + nodes: [], + edges: [], + }, + model: null, +})); + +useFileStore.subscribe((store) => { + const newNodes = _.sortBy( + Object.values(store.data.nodes).map((it) => ({ + id: it.id, + type: it.type, + settings: it.data.settings, + })), + (it) => it.id + ); + const newEdges = _.sortBy( + Object.values(store.data.edges).map((it) => ({ + id: it.id, + source: it.source, + target: it.target, + sourceHandle: it.sourceHandle, + targetHandle: it.targetHandle, + })), + (it) => it.id + ); + const newState: ModelSources = { + nodes: newNodes, + edges: newEdges, + }; + if (!_.isEqual(newState, modelState.getState().sources)) { + modelState.setState({ + sources: newState, + model: buildModel(newState), + }); + } +}); diff --git a/src/engine/evaluate.ts b/src/engine/evaluate.ts deleted file mode 100644 index 0a439cf..0000000 --- a/src/engine/evaluate.ts +++ /dev/null @@ -1,46 +0,0 @@ -import _ from "lodash"; -import { Model } from "."; - -export type EvaluateResult = { - toCommit: Record>; -}; - -export function evaluate( - model: Model, - data: Record, - committedData: Record>, - ephermalData: Record> -): EvaluateResult { - if (model === null) { - return { toCommit: {} }; - } - - let commit: Record> = {}; - - for (const step of model.executionPlan) { - const inputs = step.dependencies.map((it) => - it.convert ? it.convert(data[it.id]) : data[it.id] - ); - - let nodeCommit: Record = {}; - const doCommit = (handle: string, value: any) => { - nodeCommit[handle] = value; - }; - // const committedData = - const outputs = step.func(inputs, { - commit: doCommit, - committed: committedData[step.nodeId] || {}, - ephermal: ephermalData[step.nodeId] || {}, - }); - for (let i = 0; i < step.outpus.length; i++) { - data[step.outpus[i]] = outputs[i]; - } - - if (!_.isEmpty(nodeCommit)) { - commit[step.nodeId] = nodeCommit; - } - } - return { - toCommit: commit, - }; -} diff --git a/src/engine/index.ts b/src/engine/index.ts index 62b77de..d20373f 100644 --- a/src/engine/index.ts +++ b/src/engine/index.ts @@ -2,114 +2,6 @@ import { Node, Edge } from "reactflow"; import { nodeDefs } from "../nodes/nodes"; import { getConversionFunction } from "./handles"; import { NodeExecutor } from "./node"; - -export type NodeTypeData = Pick, "data" | "id" | "type">; -export type EdgeData = Pick< - Edge, - "source" | "target" | "sourceHandle" | "targetHandle" ->; - -export type RecipeDependency = { - id: string; - convert?: (it: any) => any; -}; -export type Recipe = { - dependencies: RecipeDependency[]; - outpus: string[]; - nodeId: string; - func: NodeExecutor; -}; - -export type Model = { - executionPlan: Recipe[]; -}; - -function handleId(nodeId: string, handleId: string) { - return `${nodeId}__${handleId}`; -} - -type OutputDataEntry = { - id: string; - type: string; -}; - -export function buildModel(nodes: NodeTypeData[], edges: EdgeData[]): Model { - //Find all terminating handles - console.log("Rebuilding Model"); - - let terminals = []; - let nodeDict: Record = {}; - - for (const node of nodes) { - nodeDict[node.id] = node; - let nodeType = nodeDefs[node.type!!]; - if (nodeType !== undefined) { - for (const input of nodeType.inputs) { - if (input.terminal) { - terminals.push({ - node: node.id, - handle: input.id, - }); - } - } - } - } - - let executedNodes = new Set([]); - let executionPlan: Recipe[] = []; - - function resolveInputHandles(nodeId: string) { - if (!executedNodes.has(nodeId)) { - // console.group("Resolving ", nodeId); - const nodeType = nodeDefs[nodeDict[nodeId].type!!]; - let suppliers = edges.filter((edge) => edge.target === nodeId); - let outputForInput: Record = {}; - for (const edge of suppliers) { - const supplierNode = edge.source; - - const supplierType = nodeDefs[ - nodeDict[supplierNode].type!! - ].outputs.find((it) => it.id === edge.sourceHandle)?.type; - - outputForInput[edge.targetHandle || "??"] = { - type: supplierType!!, - id: handleId(edge.source, edge.sourceHandle || "??"), - }; - //Resolve the supplier Node - resolveInputHandles(supplierNode); - } - - executionPlan.push({ - dependencies: nodeType.inputs.map((inputHandle) => ({ - convert: getConversionFunction( - outputForInput[inputHandle.id]?.type || inputHandle.type, - inputHandle.type - ), - id: - outputForInput[inputHandle.id]?.id || - `${nodeId}__input__${inputHandle.id}`, - })), - outpus: nodeType.outputs.map((outputHandle) => - handleId(nodeId, outputHandle.id) - ), - nodeId: nodeId, - func: nodeType.executor, - }); - executedNodes.add(nodeId); - - // console.groupEnd(); - } - } - - for (const handle of terminals) { - resolveInputHandles(handle.node); - } - - return { - executionPlan: executionPlan, - }; -} - /* Constant 2 ---> Add 1 --\ diff --git a/src/engine/node.ts b/src/engine/node.ts index 9e2bf8d..7cb9eef 100644 --- a/src/engine/node.ts +++ b/src/engine/node.ts @@ -1,14 +1,16 @@ import { ComponentType } from "react"; import { NodeProps } from "reactflow"; +import { ImpulseEmissions } from "./signal"; export type Category = { label: string; color: string; }; +export type HandleType = "number" | "boolean" | "impulse"; export interface HandleDef { - id: string; + // id: string; label: string; - type: string; + type: HandleType; } export interface InputHandleDef extends HandleDef { @@ -21,26 +23,87 @@ export interface InputHandleDef extends HandleDef { export interface OutputHandleDef extends HandleDef {} -export type NodeExecutorProps = { - committed: Record; - ephermal: Record; - commit: (handle: string, value: any) => void; +export type AnyNodeExecutor = NodeExecutor, OutputHandleDefs, Record, any>; +export type NodeExecutor = ( + input: TInputs, + persistentData: TPersistence, + driverInputs: TDriverInputs +) => { + outputs: TOutputs; + persistentData: TPersistence; + driverOutputs: TDriverOutputs; }; -export type NodeExecutor = (input: any[], props: NodeExecutorProps) => any[]; +export type InputHandleDefs = Record; +export type OutputHandleDefs = Record; export type NodeHeaderProps = { id: string; data: any }; export type MobileViewProps = { id: string; data: any }; -export type NodeDef = { - nodeComponent?: ComponentType; +export type DriverProps = { + nodePersistence: Record; +}; +export type InputDriver = () => TDriverInputs; +export type OutputDriver = (outputs: TDriverOutputs) => void; + +export type InputTypeOf = THandleDef extends { type: "number" } + ? number + : THandleDef extends { type: "boolean" } + ? boolean + : THandleDef extends { type: "impulse" } + ? ImpulseEmissions + : unknown; + +export type OutputTypeOf = THandleDef extends { type: "impulse" } ? number : InputTypeOf; + +export type InputTypesOf> = { + [Key in keyof THandleDefs]: InputTypeOf; +}; +export type OutputTypesOf> = { + [Key in keyof THandleDefs]: OutputTypeOf; +}; + +export type AnyNodeExecutorDef = NodeExecutorDef, OutputHandleDefs, Record, any>; +type NodeExecutorDef< + TInputHandleDefs extends InputHandleDefs, + TDriverInputs extends Record, + TOutputHandleDefs extends OutputHandleDefs, + TDriverOutputs extends Record, + TPersistence +> = { + initialPersistence: TPersistence; + executor: NodeExecutor, TDriverInputs, OutputTypesOf, TDriverOutputs, TPersistence>; + inputDriver?: InputDriver; + outputDriver?: OutputDriver; +}; + +export function nodeDef< + TInputHandleDefs extends InputHandleDefs, + TDriverInputs extends Record, + TOutputHandleDefs extends OutputHandleDefs, + TDriverOutputs extends Record, + TPersistence +>(n: NodeDef) { + return n; +} + +export type AnyNodeDef = NodeDef, OutputHandleDefs, Record, any>; +export type NodeDef< + TInputHandleDefs extends InputHandleDefs, + TDriverInputs extends Record, + TOutputHandleDefs extends OutputHandleDefs, + TDriverOutputs extends Record, + TPersistence +> = { label: string; publishable?: boolean; category: Category; type: string; + /** Specifies what should be rendered above the handles */ header?: ComponentType; - mobileView?: ComponentType; - inputs: InputHandleDef[]; - outputs: OutputHandleDef[]; - executor: NodeExecutor; + /** Overrides the how the entire node is rendered. Default to the node-shell */ + nodeComponent?: ComponentType; + inputs: TInputHandleDefs; + outputs: TOutputHandleDefs; + executor: NodeExecutorDef; }; diff --git a/src/engine/nodeDriverStore.ts b/src/engine/nodeDriverStore.ts new file mode 100644 index 0000000..cb0da43 --- /dev/null +++ b/src/engine/nodeDriverStore.ts @@ -0,0 +1,30 @@ +import create from "zustand"; + +type NodeDriverStore = { + nodes: Record; + setValue: (nodeId: string, value: T) => void; + getValue: (nodeId: string) => T; +}; + +export function createNodeDriverStore(defaultValue: T) { + const useStore = create>()((set, get) => ({ + nodes: {}, + setValue: (node, value) => { + set((it) => ({ + ...it, + [node]: value, + })); + }, + getValue: (node) => { + return get().nodes[node] ?? defaultValue; + }, + })); + + const useNodeDriverStoreValue = (nodeId: string) => { + return useStore((it) => it.nodes[nodeId] ?? defaultValue); + }; + + useNodeDriverStoreValue.store = useStore; + + return useNodeDriverStoreValue; +} diff --git a/src/engine/runner.ts b/src/engine/runner.ts index ae4aa7c..aab1556 100644 --- a/src/engine/runner.ts +++ b/src/engine/runner.ts @@ -1,75 +1,76 @@ import _ from "lodash"; -import { buildModel, EdgeData, Model, NodeTypeData } from "."; -import { evaluate } from "./evaluate"; -import { useDataStore, useDisplayStore } from "./store"; +import { Model, modelState } from "./compiler"; +import { useFileStore } from "./store"; +import { useSignalBus } from "./signal"; +import { OutputTypeOf, nodeDef } from "./node"; +import { nodeDefs } from "../nodes/nodes"; + +/** NodeId -> HandleId -> Value */ +type HandleValues = Record>; +/** NodeId -> Data */ +type NodePersistData = Record; const timestep = 1000 / 60; let timeout: number | null = null; -let modelState: { - nodes: NodeTypeData[]; - edges: EdgeData[]; - model: Model; -} | null = null; -function revalidateModel() { - const { nodes, edges } = useDisplayStore.getState(); - const nodeTypeData: NodeTypeData[] = nodes.map((it) => ({ - type: it.type, - id: it.id, - data: undefined, - })); - const edgeData: EdgeData[] = edges.map((it) => ({ - source: it.source, - target: it.target, - sourceHandle: it.sourceHandle, - targetHandle: it.targetHandle, - })); +function runEngineLoop(model: Model) { + // let last = Date.now(); - if ( - !_.isEqual(edgeData, modelState?.edges) || - !_.isEqual(nodeTypeData, modelState?.nodes) - ) { - console.log( - "Rebuilding Model", - edgeData, - modelState?.edges, - nodeTypeData, - modelState?.nodes - ); - modelState = { - nodes: nodeTypeData, - edges: edgeData, - model: buildModel(nodeTypeData, edges), - }; - } -} + const persistentData: NodePersistData = Object.assign( + {}, + ...model.executionPlan.map((it) => ({ [it.nodeId]: nodeDefs[it.type].executor.initialPersistence })) + ); -export function runEngineLoop() { - // let last = Date.now(); function update() { + //Prepopulate HandleValues Dictionary with signal data + const handleValues: HandleValues = useSignalBus.getState().popAll(); + // const delta = Date.now() - last; // last = Date.now(); // console.log(1000 / delta); // - const ephermal = useDataStore.getState().popEphermalData(); - const data = useDisplayStore.getState().handles; - const committedData = useDataStore.getState().committed; - const commit = useDataStore.getState().commitData; + for (const step of model.executionPlan) { + const nodeType = nodeDefs[step.type]; + // const inputs = step.dependencies.map((it) => (it.convert ? it.convert(data[it.id]) : data[it.id])); + const inputs = _.mapValues(step.dependencies, (dependency, handleId) => { + if (dependency !== null) { + return handleValues[dependency.nodeId][dependency.handleId]; + } else { + return useFileStore.getState().getHandle(step.nodeId, handleId); + } + }); + + const persistent = persistentData[step.nodeId]; + const driverInputs = nodeType.executor.inputDriver?.(); + // const committedData = + const outputs = nodeType.executor.executor(inputs, persistent, driverInputs ?? {}); - if (modelState !== null) { - const result = evaluate(modelState.model, data, committedData, ephermal); - commit(result.toCommit); - } else { - console.warn("Couldn't evaluate as there was no model built."); + for (const outputId in nodeType.outputs) { + if (nodeType.outputs[outputId].type === "impulse") { + for (let i = 0; i < (outputs.outputs[outputId] as number); i++) { + useSignalBus.getState().emit(step.nodeId, outputId); + } + delete outputs.outputs[outputId]; + } + } + + handleValues[step.nodeId] = outputs.outputs; + persistentData[step.nodeId] = outputs.persistentData; + nodeType.executor.outputDriver?.(outputs.driverOutputs); } timeout = setTimeout(update, timestep) as any; - revalidateModel(); } + timeout = setTimeout(update, timestep) as any; +} + +modelState.subscribe((state) => { if (timeout !== null) { - console.log("Restarting Engine Loop"); + console.log("Stopping old Engine Loop"); clearTimeout(timeout); } - timeout = setTimeout(update, timestep) as any; -} + if (state.model !== null) { + runEngineLoop(state.model); + } +}); diff --git a/src/engine/signal.ts b/src/engine/signal.ts new file mode 100644 index 0000000..8680fa8 --- /dev/null +++ b/src/engine/signal.ts @@ -0,0 +1,52 @@ +import create from "zustand"; + +export type SignalEmission = { + timestamp: Date; + arguments: T; +}; +export type SignalEmissions = SignalEmission[]; +export type ImpulseEmissions = SignalEmissions[]; + +type SignalBus = { + /** NodeId -> HandleId -> SignalEmissions */ + nodeSignals: Record>>; + + emit: (nodeId: string, handleId: string, data?: any) => void; + // pop: (nodeId: string, handleId: string) => SignalEmissions; + popAll: () => Record>>; +}; + +export const useSignalBus = create()((set, get) => ({ + nodeSignals: {}, + emit: (nodeId, handleId, data) => { + set((signals) => ({ + nodeSignals: { + ...signals.nodeSignals, + [nodeId]: { + ...signals.nodeSignals[nodeId], + [handleId]: [...signals.nodeSignals[nodeId]?.[handleId], data], + }, + }, + })); + }, + popAll: () => { + const signals = get().nodeSignals; + set({ + nodeSignals: {}, + }); + return signals; + }, + // pop: (nodeId, handleId) => { + // const signals = get().nodeSignals[nodeId]?.[handleId]; + // set((signals) => ({ + // nodeSignals: { + // ...signals.nodeSignals, + // [nodeId]: { + // ...signals.nodeSignals[nodeId], + // [handleId]: [], + // }, + // }, + // })); + // return signals; + // }, +})); diff --git a/src/engine/store.ts b/src/engine/store.ts index 1fe3690..21d6439 100644 --- a/src/engine/store.ts +++ b/src/engine/store.ts @@ -1,23 +1,11 @@ -import { useCallback } from "react"; -import { - addEdge, - applyEdgeChanges, - applyNodeChanges, - Edge, - Node, - OnConnect, - OnEdgesChange, - OnNodesChange, - XYPosition, -} from "reactflow"; +import { Draft } from "immer"; +import { Edge, Node, OnConnect, OnEdgesChange, OnNodesChange, XYPosition, applyNodeChanges } from "reactflow"; import create from "zustand"; import { persist } from "zustand/middleware"; +import { immer } from "zustand/middleware/immer"; import { nodeDefs } from "../nodes/nodes"; - -type NodeId = string; - -type AddNode = (type: string, pos: XYPosition) => NodeId; -type AddEdge = (edge: Edge) => void; +import _ from "lodash"; +import { useCallback } from "react"; export interface NodeData { mobileVisible?: boolean; @@ -25,265 +13,208 @@ export interface NodeData { name?: string; } -export interface DisplayStore { - nodes: Node[]; - edges: Edge[]; - handles: Record; +export type BeadiNode> = { + id: Node["id"]; + position: Node["position"]; + type: NonNullable["type"]>; + data: { + displaySettings: TDisplaySettings; + settings: TSettings; + handles: THandles; + }; +}; + +export type UnknownBeadiNode = BeadiNode>; + +export type BeadiEdge = { + id: Edge["id"]; + sourceHandle: NonNullable; + targetHandle: NonNullable; + source: Edge["source"]; + target: Edge["target"]; +}; + +export type BeadiFileData = { + nodes: Record; + edges: Record; +}; + +export type FileStore = { + data: BeadiFileData; + setHandle: (nodeId: string, handleId: string, data: any) => void; getHandle: (nodeId: string, handleId: string) => any; + updateNode: (nodeId: string, recipe: (node: Draft) => void) => void; + overwrite: (file: BeadiFileData) => void; //TODO Change this to a immer recipe instead of merging - mergeNodeData: (nodeId: string, data: Partial) => void; + // mergeNodeData: (nodeId: string, data: Partial) => void; onNodesChange: OnNodesChange; onEdgesChange: OnEdgesChange; onConnect: OnConnect; - addNode: AddNode; - addEdge: AddEdge; - reset: () => void; - overwrite: ( - nodes: Node[], - edges: Edge[], - handles: Record - ) => void; -} + addEdge: (edge: Omit) => string; + addNode: (type: string, pos: XYPosition) => string; -const initialNodes: Node[] = [ - { - id: "welcome", - type: "welcome", - position: { - x: 0, - y: 0, - }, - data: {}, - }, -]; -const initialEdges: Edge[] = []; + exportJson: () => any; + importJson: (data: any) => void; + // reset: () => void; +}; +export const useFileStore = create()( + immer( + persist((set, get) => ({ + data: { + nodes: {} as BeadiFileData["nodes"], + edges: {} as BeadiFileData["edges"], + }, -export const useDisplayStore = create()( - persist((set, get) => ({ - nodes: initialNodes, - edges: initialEdges, - handles: {}, - mergeNodeData: (node, data) => { - //TODO This is hella slow... Maybe I should rethink the handling for node data? - set(({ nodes }) => ({ - nodes: nodes.map((it) => { - if (it.id === node) { - return { - ...it, - data: { - ...it.data, - ...data, - }, - }; - } else { - return it; - } - }), - })); - }, - overwrite: (nodes, edges, handles) => { - set(() => ({ - nodes, - edges, - handles, - })); - }, - setHandle: (nodeId, handleId, data) => - set((state) => ({ - handles: { - ...state.handles, - [`${nodeId}__${handleId}`]: data, - }, - })), - getHandle: (nodeId, handleId) => { - console.log(get().handles); - return get().handles[`${nodeId}__${handleId}`]; - }, - onConnect: (connection) => { - set({ - edges: addEdge( - connection, - get().edges.filter( - (edge) => - !( - edge.target === connection.target && - edge.targetHandle === connection.targetHandle - ) - ) - ), - }); - }, - onNodesChange: (changes) => - set({ nodes: applyNodeChanges(changes, get().nodes) }), - onEdgesChange: (changes) => - set({ edges: applyEdgeChanges(changes, get().edges) }), - addEdge: (edge) => { - set({ - edges: addEdge(edge, get().edges), - }); - }, - reset: () => { - set(() => ({ - nodes: initialNodes, - edges: initialEdges, - handles: [], - })); - }, - addNode: (type, pos) => { - const id = "" + Date.now(); - nodeDefs[type].inputs.forEach((input) => { - get().setHandle(id, `input__${input.id}`, input.default); - }); - set({ - nodes: get().nodes.concat([ - { - data: {}, + addNode: (type, pos) => { + const id = "" + Date.now(); + const nodeType = nodeDefs[type]; + set((draft) => { + draft.data.nodes[id] = { id: id, - position: { - x: pos.x, - y: pos.y, - }, + position: pos, type: type, - }, - ]), - }); - return id; - }, - })) -); + data: { + displaySettings: {}, + handles: _.mapValues(nodeType.inputs, (handle) => handle.default), + settings: {}, + }, + }; + }); + return id; + }, + addEdge: (edge) => { + const id = `${edge.source}${edge.sourceHandle}=${edge.target}${edge.targetHandle}`; + set((draft) => { + draft.data.edges[id] = { + ...edge, + id: id, + }; + }); + return id; + }, + onConnect: (connection) => { + if ( + connection.source !== null && + connection.sourceHandle !== null && + connection.target !== null && + connection.targetHandle !== null + ) { + get().addEdge(connection as any); + } else { + console.warn("onConnect with null values is not supported."); + } + }, + onNodesChange: (changes) => { + set((draft) => { + for (const c of changes) { + if (c.type === "add") { + console.warn("Add is not yet handled."); + } else if (c.type === "dimensions") { + console.warn("Dimensions is not yet handled."); + } else if (c.type === "position") { + if (c.position !== undefined) { + draft.data.nodes[c.id].position = c.position; + } else { + console.warn("Position without position is not yet handled."); + } + } else if (c.type === "remove") { + delete draft.data.nodes[c.id]; + } else if (c.type === "reset") { + console.warn("Reset is not yet handled."); + } else if (c.type === "select") { + console.warn("Select is not yet handled."); + } + } + }); + }, + onEdgesChange: (changes) => {}, -export interface DataStore { - committed: Record>; - ephermal: Record>; - commitData: (data: Record>) => void; - pushEphermalData: (nodeId: string, handleId: string, data: any) => void; - popEphermalData: () => Record>; -} -export const useDataStore = create()((set, get) => ({ - committed: {}, - ephermal: {}, - popEphermalData: () => { - const values = get().ephermal; - set(() => ({ ephermal: {} })); - return values; - }, - pushEphermalData: (nodeId, handleId, data) => { - set((state) => { - const newState = { - ephermal: { - ...state.ephermal, - [nodeId]: { - ...state.ephermal[nodeId], - [handleId]: data, - }, - }, - }; - return newState; - }); - }, - commitData: (data) => { - set((state) => { - const newState = { - committed: { - ...state.committed, - ...Object.assign( - {}, - ...Object.entries(data).map(([key, value]) => ({ - [key]: { - ...state.committed[key], - ...value, - }, - })) - ), - }, - }; - return newState; - }); - }, -})); + setHandle: (nodeId, handleId, data) => { + set((store) => { + const node = store.data.nodes[nodeId]; + if (node !== undefined) { + node.data.handles[handleId] = data; + } else { + console.trace("Tried to set handle of node, but node '", nodeId, "' does not exist."); + } + }); + }, + + getHandle: (nodeId, handleId) => { + const node = get().data.nodes[nodeId]; + if (node !== undefined) { + return node.data.handles[handleId]; + } else { + return null; + } + }, + + overwrite: (file) => { + set((store) => (store.data = file)); + }, + updateNode: (nodeId, recipe) => { + set((store) => { + const node = store.data.nodes[nodeId]; + if (node !== undefined) { + recipe(node); + } else { + console.trace("Tried to update nonexisting node '", nodeId, "'"); + } + }); + }, + exportJson: () => { + return { + version: 2, + data: get().data, + }; + }, + importJson: (data: any) => { + //TODO Sanitize input + + //Crude cleaning of possibly weird javascript objects. + const cleanData = JSON.parse(JSON.stringify(data)); + console.warn("TODO importing unsanitized input data:", data, " => ", cleanData); + set({ + data: cleanData, + }); + }, + })) + ) +); -export type HandleData = [T, (value: T) => void]; -export function useHandleData( - handleType: string, - nodeId: string, - handleId: string -): HandleData { - const value = useDisplayStore((state) => { - return state.handles[`${nodeId}__input__${handleId}`]; +export type UseInputHandleData = [T, (value: T) => void]; +export function useInputHandleData(nodeId: string, handleId: string): UseInputHandleData { + const value = useFileStore((state) => { + return state.data.nodes[nodeId].data.handles[handleId]; }); - const setHandle = useDisplayStore((state) => state.setHandle); + const setHandle = useFileStore((state) => state.setHandle); const setValue = useCallback( (value: T) => { - setHandle(nodeId, `${handleType}__${handleId}`, value); + setHandle(nodeId, handleId, value); }, - [setHandle, nodeId, handleId, handleType] + [setHandle, nodeId, handleId] ); return [value as T, setValue]; } -export function useInputHandleData( - nodeId: string, - handleId: string -): HandleData { - return useHandleData("input", nodeId, handleId); -} -export function useCommittedData(nodeId: string, handleId: string): T { - const value = useDataStore((state) => { - return state.committed[nodeId]?.[handleId]; - }); - return value as T; -} -export function useCommitData( - nodeId: string, - handleId: string -): (v: number) => void { - const commitData = useDataStore((state) => { - return state.commitData; - }); - const doIt = useCallback( - (value: number) => { - commitData({ - [nodeId]: { - [handleId]: value, - }, - }); +export const ResetDocument: BeadiFileData = { + edges: {}, + nodes: { + welcome: { + id: "welcome", + type: "welcome", + position: { + x: 0, + y: 0, + }, + data: { + displaySettings: {}, + handles: {}, + settings: {}, + }, }, - [nodeId, handleId, commitData] - ); - return doIt; -} -export function usePushEphermalData(nodeId: string, handleId: string) { - const push = useDataStore((state) => state.pushEphermalData); - - return useCallback( - (data: T) => { - push(nodeId, handleId, data); - }, - [push, nodeId, handleId] - ); -} -export function useSetNodeName(nodeId: string) { - const mergeNodeData = useDisplayStore((state) => state.mergeNodeData); - return useCallback( - (name: string) => { - if (name.trim() === "") { - mergeNodeData(nodeId, { name: undefined }); - } else { - mergeNodeData(nodeId, { name }); - } - }, - [nodeId, mergeNodeData] - ); -} -export function useMergeNodeData(nodeId: string) { - const mergeNodeData = useDisplayStore((state) => state.mergeNodeData); - return useCallback( - (data: Partial) => { - mergeNodeData(nodeId, data); - }, - [nodeId, mergeNodeData] - ); -} + }, +}; diff --git a/src/engine/store.ts.off b/src/engine/store.ts.off new file mode 100644 index 0000000..f0bb628 --- /dev/null +++ b/src/engine/store.ts.off @@ -0,0 +1,257 @@ +import { useCallback } from "react"; +import { addEdge, applyEdgeChanges, applyNodeChanges, Edge, Node, OnConnect, OnEdgesChange, OnNodesChange, XYPosition } from "reactflow"; +import create from "zustand"; +import { persist } from "zustand/middleware"; +import { nodeDefs } from "../nodes/nodes"; + +type NodeId = string; + +type AddNode = (type: string, pos: XYPosition) => NodeId; +type AddEdge = (edge: Edge) => void; + +export interface NodeData { + mobileVisible?: boolean; + published?: boolean; + name?: string; +} + +export interface DisplayStore { + nodes: Node[]; + edges: Edge[]; + handles: Record; + setHandle: (nodeId: string, handleId: string, data: any) => void; + getHandle: (nodeId: string, handleId: string) => any; + + //TODO Change this to a immer recipe instead of merging + mergeNodeData: (nodeId: string, data: Partial) => void; + onNodesChange: OnNodesChange; + onEdgesChange: OnEdgesChange; + onConnect: OnConnect; + addNode: AddNode; + addEdge: AddEdge; + reset: () => void; + overwrite: (nodes: Node[], edges: Edge[], handles: Record) => void; +} + +const initialNodes: Node[] = [ + { + id: "welcome", + type: "welcome", + position: { + x: 0, + y: 0, + }, + data: {}, + }, +]; +const initialEdges: Edge[] = []; + +export const useFileStore = create()( + persist((set, get) => ({ + nodes: initialNodes, + edges: initialEdges, + handles: {}, + mergeNodeData: (node, data) => { + //TODO This is hella slow... Maybe I should rethink the handling for node data? + set(({ nodes }) => ({ + nodes: nodes.map((it) => { + if (it.id === node) { + return { + ...it, + data: { + ...it.data, + ...data, + }, + }; + } else { + return it; + } + }), + })); + }, + overwrite: (nodes, edges, handles) => { + set(() => ({ + nodes, + edges, + handles, + })); + }, + setHandle: (nodeId, handleId, data) => + set((state) => ({ + handles: { + ...state.handles, + [`${nodeId}__${handleId}`]: data, + }, + })), + getHandle: (nodeId, handleId) => { + console.log(get().handles); + return get().handles[`${nodeId}__${handleId}`]; + }, + onConnect: (connection) => { + set({ + edges: addEdge( + connection, + get().edges.filter((edge) => !(edge.target === connection.target && edge.targetHandle === connection.targetHandle)) + ), + }); + }, + onNodesChange: (changes) => set({ nodes: applyNodeChanges(changes, get().nodes) }), + onEdgesChange: (changes) => set({ edges: applyEdgeChanges(changes, get().edges) }), + addEdge: (edge) => { + set({ + edges: addEdge(edge, get().edges), + }); + }, + reset: () => { + set(() => ({ + nodes: initialNodes, + edges: initialEdges, + handles: [], + })); + }, + addNode: (type, pos) => { + const id = "" + Date.now(); + nodeDefs[type].inputs.forEach((input) => { + get().setHandle(id, `input__${input.id}`, input.default); + }); + set({ + nodes: get().nodes.concat([ + { + data: {}, + id: id, + position: { + x: pos.x, + y: pos.y, + }, + type: type, + }, + ]), + }); + return id; + }, + })) +); + +export interface DataStore { + committed: Record>; + ephermal: Record>; + commitData: (data: Record>) => void; + pushEphermalData: (nodeId: string, handleId: string, data: any) => void; + popEphermalData: () => Record>; +} +export const useDataStore = create()((set, get) => ({ + committed: {}, + ephermal: {}, + popEphermalData: () => { + const values = get().ephermal; + set(() => ({ ephermal: {} })); + return values; + }, + pushEphermalData: (nodeId, handleId, data) => { + set((state) => { + const newState = { + ephermal: { + ...state.ephermal, + [nodeId]: { + ...state.ephermal[nodeId], + [handleId]: data, + }, + }, + }; + return newState; + }); + }, + commitData: (data) => { + set((state) => { + const newState = { + committed: { + ...state.committed, + ...Object.assign( + {}, + ...Object.entries(data).map(([key, value]) => ({ + [key]: { + ...state.committed[key], + ...value, + }, + })) + ), + }, + }; + return newState; + }); + }, +})); + +export type HandleData = [T, (value: T) => void]; +export function useHandleData(handleType: string, nodeId: string, handleId: string): HandleData { + const value = useFileStore((state) => { + return state.handles[`${nodeId}__input__${handleId}`]; + }); + const setHandle = useFileStore((state) => state.setHandle); + const setValue = useCallback( + (value: T) => { + setHandle(nodeId, `${handleType}__${handleId}`, value); + }, + [setHandle, nodeId, handleId, handleType] + ); + + return [value as T, setValue]; +} + +export function useInputHandleData(nodeId: string, handleId: string): HandleData { + return useHandleData("input", nodeId, handleId); +} +export function useCommittedData(nodeId: string, handleId: string): T { + const value = useDataStore((state) => { + return state.committed[nodeId]?.[handleId]; + }); + return value as T; +} +export function useCommitData(nodeId: string, handleId: string): (v: number) => void { + const commitData = useDataStore((state) => { + return state.commitData; + }); + const doIt = useCallback( + (value: number) => { + commitData({ + [nodeId]: { + [handleId]: value, + }, + }); + }, + [nodeId, handleId, commitData] + ); + return doIt; +} +export function usePushEphermalData(nodeId: string, handleId: string) { + const push = useDataStore((state) => state.pushEphermalData); + + return useCallback( + (data: T) => { + push(nodeId, handleId, data); + }, + [push, nodeId, handleId] + ); +} +export function useSetNodeName(nodeId: string) { + const mergeNodeData = useFileStore((state) => state.mergeNodeData); + return useCallback( + (name: string) => { + if (name.trim() === "") { + mergeNodeData(nodeId, { name: undefined }); + } else { + mergeNodeData(nodeId, { name }); + } + }, + [nodeId, mergeNodeData] + ); +} +export function useMergeNodeData(nodeId: string) { + const mergeNodeData = useFileStore((state) => state.mergeNodeData); + return useCallback( + (data: Partial) => { + mergeNodeData(nodeId, data); + }, + [nodeId, mergeNodeData] + ); +} diff --git a/src/nodes/AddNode.tsx b/src/nodes/AddNode.tsx.off similarity index 100% rename from src/nodes/AddNode.tsx rename to src/nodes/AddNode.tsx.off diff --git a/src/nodes/ButtonNode.tsx b/src/nodes/ButtonNode.tsx.off similarity index 100% rename from src/nodes/ButtonNode.tsx rename to src/nodes/ButtonNode.tsx.off diff --git a/src/nodes/ButtplugNode.tsx b/src/nodes/ButtplugNode.tsx.off similarity index 100% rename from src/nodes/ButtplugNode.tsx rename to src/nodes/ButtplugNode.tsx.off diff --git a/src/nodes/ClampNode.tsx b/src/nodes/ClampNode.tsx.off similarity index 100% rename from src/nodes/ClampNode.tsx rename to src/nodes/ClampNode.tsx.off diff --git a/src/nodes/CommentNode.tsx b/src/nodes/CommentNode.tsx.off similarity index 100% rename from src/nodes/CommentNode.tsx rename to src/nodes/CommentNode.tsx.off diff --git a/src/nodes/ConstantValueNode.tsx b/src/nodes/ConstantValueNode.tsx.off similarity index 100% rename from src/nodes/ConstantValueNode.tsx rename to src/nodes/ConstantValueNode.tsx.off diff --git a/src/nodes/CurveNode.tsx b/src/nodes/CurveNode.tsx.off similarity index 100% rename from src/nodes/CurveNode.tsx rename to src/nodes/CurveNode.tsx.off diff --git a/src/nodes/DelayNode.tsx b/src/nodes/DelayNode.tsx.off similarity index 100% rename from src/nodes/DelayNode.tsx rename to src/nodes/DelayNode.tsx.off diff --git a/src/nodes/Display.tsx b/src/nodes/Display.tsx.off similarity index 100% rename from src/nodes/Display.tsx rename to src/nodes/Display.tsx.off diff --git a/src/nodes/EdgeDetector.tsx b/src/nodes/EdgeDetector.tsx.off similarity index 100% rename from src/nodes/EdgeDetector.tsx rename to src/nodes/EdgeDetector.tsx.off diff --git a/src/nodes/HysteresisNode.tsx b/src/nodes/HysteresisNode.tsx.off similarity index 100% rename from src/nodes/HysteresisNode.tsx rename to src/nodes/HysteresisNode.tsx.off diff --git a/src/nodes/MediaFurry.tsx b/src/nodes/MediaFurry.tsx.off similarity index 100% rename from src/nodes/MediaFurry.tsx rename to src/nodes/MediaFurry.tsx.off diff --git a/src/nodes/MemoryNode.tsx b/src/nodes/MemoryNode.tsx.off similarity index 100% rename from src/nodes/MemoryNode.tsx rename to src/nodes/MemoryNode.tsx.off diff --git a/src/nodes/MixNode.tsx b/src/nodes/MixNode.tsx.off similarity index 100% rename from src/nodes/MixNode.tsx rename to src/nodes/MixNode.tsx.off diff --git a/src/nodes/PositiveWave.tsx b/src/nodes/PositiveWave.tsx.off similarity index 100% rename from src/nodes/PositiveWave.tsx rename to src/nodes/PositiveWave.tsx.off diff --git a/src/nodes/RandomNode.tsx b/src/nodes/RandomNode.tsx.off similarity index 100% rename from src/nodes/RandomNode.tsx rename to src/nodes/RandomNode.tsx.off diff --git a/src/nodes/SensorNode.tsx b/src/nodes/SensorNode.tsx.off similarity index 100% rename from src/nodes/SensorNode.tsx rename to src/nodes/SensorNode.tsx.off diff --git a/src/nodes/SliderNode.tsx b/src/nodes/SliderNode.tsx.off similarity index 100% rename from src/nodes/SliderNode.tsx rename to src/nodes/SliderNode.tsx.off diff --git a/src/nodes/TimerNode.tsx b/src/nodes/TimerNode.tsx index 8854657..c06b0e4 100644 --- a/src/nodes/TimerNode.tsx +++ b/src/nodes/TimerNode.tsx @@ -1,7 +1,10 @@ import { FunctionComponent } from "react"; -import { NodeDef, NodeHeaderProps } from "../engine/node"; -import { useCommittedData } from "../engine/store"; +import { NodeDef, NodeHeaderProps, nodeDef } from "../engine/node"; import { categories } from "./category"; +import create from "zustand"; +import { createNodeDriverStore } from "../engine/nodeDriverStore"; + +const useTimerNodeProgressStore = createNodeDriverStore(0); export function gaussianRandom(mean = 0, stdev = 1) { let u = 1 - Math.random(); //Converting [0,1) to (0,1) @@ -12,95 +15,95 @@ export function gaussianRandom(mean = 0, stdev = 1) { } const TimerNode: FunctionComponent = ({ id }) => { - const progress = useCommittedData(id, "progress") || 0.0; + const progress = useTimerNodeProgressStore(id); return (
    -
    +
    ); }; -export const timerNodeDef: NodeDef = { +export const timerNodeDef = nodeDef({ label: "Random Timer Node", category: categories["generators"], type: "timer", header: TimerNode, - outputs: [ - { - id: "value", + outputs: { + value: { label: "Value", type: "boolean", }, - { - id: "progress", + progress: { label: "Progress", type: "number", }, - ], - inputs: [ - { - id: "onTime", + }, + inputs: { + onTime: { label: "On Time", type: "number", default: 1.0, }, - { - id: "onTimeDeviation", + onTimeDeviation: { label: "On Time Dev", type: "number", default: 0.0, min: 0.0, max: 1.0, }, - { - id: "offTime", + offTime: { label: "Off Time", type: "number", default: 1.0, }, - { - id: "offTimeDeviation", + offTimeDeviation: { label: "Off Time Dev", type: "number", default: 0.0, min: 0.0, max: 1.0, }, - ], - executor: ( - [onTime, onTimeDev, offTime, offTimeDev], - { commit, committed } - ) => { - const last = committed["last"] || false; - const toggle = committed["toggleTime"] || new Date().getTime(); - const lastTime = committed["lastTime"] || new Date().getTime(); + }, + executor: { + initialPersistence: { + toggleTime: new Date(), + lastTime: new Date(), + last: false, + progress: 0, + }, - if (new Date().getTime() >= toggle) { - //Toggle + executor: ({ onTime, onTimeDeviation, offTime, offTimeDeviation }, persistent) => { + if (new Date().getTime() >= persistent.toggleTime.getTime()) { + //Toggle - if (last === false) { - const dev = gaussianRandom(0, onTimeDev * onTime); - commit("toggleTime", new Date().getTime() + (onTime + dev) * 1000); - commit("lastTime", toggle); - commit("last", true); - } else { - const dev = gaussianRandom(0, offTimeDev * offTime); - commit("toggleTime", new Date().getTime() + (offTime + dev) * 1000); - commit("lastTime", toggle); - commit("last", false); + if (persistent.last === false) { + const dev = gaussianRandom(0, onTimeDeviation * onTime); + persistent.lastTime = persistent.toggleTime; + persistent.toggleTime = new Date(new Date().getTime() + (onTime + dev) * 1000); + persistent.last = true; + } else { + const dev = gaussianRandom(0, offTimeDeviation * offTime); + persistent.lastTime = persistent.toggleTime; + persistent.toggleTime = new Date(new Date().getTime() + (offTime + dev) * 1000); + persistent.last = false; + } } - } - const duration = toggle - lastTime; - const elapsed = new Date().getTime() - lastTime; - const progress = elapsed / duration; + const duration = persistent.toggleTime.getTime() - persistent.toggleTime.getTime(); + const elapsed = new Date().getTime() - persistent.lastTime.getTime(); + const progress = elapsed / duration; - commit("progress", progress); + persistent.progress = progress; - return [last, progress]; + return { + outputs: { + value: persistent.last, + progress: progress, + }, + driverOutputs: {}, + persistentData: persistent, + }; + }, }, -}; +}); diff --git a/src/nodes/ToggleNode.tsx b/src/nodes/ToggleNode.tsx index b127391..cdf600e 100644 --- a/src/nodes/ToggleNode.tsx +++ b/src/nodes/ToggleNode.tsx @@ -1,62 +1,61 @@ -import { NodeDef } from "../engine/node"; +import { nodeDef } from "../engine/node"; import { categories } from "./category"; -export const toggleNodeDef: NodeDef = { +export const toggleNodeDef = nodeDef({ label: "Toggle", category: categories["control"], type: "toggle", - outputs: [ - { - id: "value", + outputs: { + value: { label: "Value", type: "number", }, - ], - inputs: [ - { - id: "a", + }, + inputs: { + a: { label: "Off Value", type: "number", default: 0.0, }, - { - id: "b", + b: { label: "On Value", type: "number", default: 0.0, }, - { - id: "toggle", + toggle: { label: "Toggle", type: "impulse", default: false, }, - { - id: "on", + on: { label: "On", type: "impulse", default: false, }, - { - id: "off", + off: { label: "Off", type: "impulse", default: false, }, - ], - executor: ([a, b, toggle, on, off], { commit, committed }) => { - const out = committed["switch"] || false; - - if (toggle) { - commit("switch", !out); - } - if (on) { - commit("switch", true); - } - if (off) { - commit("switch", false); - } - - return [out ? b : a]; }, -}; + executor: { + inputDriver: () => ({}), + outputDriver: () => {}, + initialPersistence: false, + executor: ({ a, b, toggle, on, off }, switchOn: boolean) => { + //If we got an odd amount of toggle commands, then flip the switch (!== is XOR) + let nextValue = switchOn !== (toggle.length % 2 !== 0); + if (on) { + nextValue = true; + } + if (off) { + nextValue = false; + } + return { + outputs: { value: switchOn ? b : a }, + driverOutputs: {}, + persistentData: nextValue, + }; + }, + }, +}); diff --git a/src/nodes/WelcomeNode.tsx b/src/nodes/WelcomeNode.tsx index 639842d..de3414b 100644 --- a/src/nodes/WelcomeNode.tsx +++ b/src/nodes/WelcomeNode.tsx @@ -2,7 +2,7 @@ import { FunctionComponent, useCallback } from "react"; import { NodeProps } from "reactflow"; import NodeShell from "../components/node/NodeShell"; import { Typo } from "../components/Typo"; -import { useDisplayStore } from "../engine/store"; +import { BeadiFileData, useFileStore } from "../engine/store"; import { ReactMarkdown } from "react-markdown/lib/react-markdown"; import { Button } from "../components/input/Button"; @@ -27,10 +27,10 @@ function importAll(r: any) { importAll((require as any).context("../../examples", false, /\.json$/)); export const ExampleList: FunctionComponent<{}> = () => { - const overwriteStore = useDisplayStore((it) => it.overwrite); + const overwriteStore = useFileStore((it) => it.overwrite); const loadExample = useCallback( - (data: any) => { - overwriteStore(data.nodes, data.edges, data.handles); + (data: BeadiFileData) => { + overwriteStore(data); }, [overwriteStore] ); @@ -39,10 +39,7 @@ export const ExampleList: FunctionComponent<{}> = () => {
      {Object.entries(examples).map(([key, value]) => (
    • -
    • @@ -58,67 +55,37 @@ export const WelcomeNodeContent: FunctionComponent<{}> = () => {
      Hello!

      - I am Luna the bat, and this is Beadi, a platform for visual, node-based, - programming for{" "} - + I am Luna the bat, and this is Beadi, a platform for visual, node-based, programming for{" "} + Buttplug.io {" "} compatible Sextoys.

      Getting Started

      - You can get started by taking a look at some of the examples below or - just dragging in some nodes from the drawer on the left, but don't - forget to connect your toys or a server in the server tab on the right. - You can delete this message, by selecting the node and pressing{" "} - Backspace, and if you want to view it again, go to the File - tab on the right, and discard your current File. + You can get started by taking a look at some of the examples below or just dragging in some nodes from the drawer on the left, but + don't forget to connect your toys or a server in the server tab on the right. You can delete this message, by selecting the node and + pressing Backspace, and if you want to view it again, go to the File tab on the right, and discard your current File.

      Examples Project

      This project is open-source, the development happens at{" "} - + the github repository. {" "} - If you have problems or ideas i would be very happy to hear from you, - either via{" "} - + If you have problems or ideas i would be very happy to hear from you, either via{" "} + Issues {" "} or on{" "} - + Social Media

      - + Changelog diff --git a/src/nodes/nodes.ts b/src/nodes/nodes.ts index b9a3156..a4872b9 100644 --- a/src/nodes/nodes.ts +++ b/src/nodes/nodes.ts @@ -1,58 +1,55 @@ -import { NodeDef } from "../engine/node"; +import { AnyNodeDef, NodeDef } from "../engine/node"; -import { - addNodeDef, - divideNodeDef, - multiplyNodeDef, - subtractNodeDef, -} from "../nodes/AddNode"; -import { buttonNodeDef } from "../nodes/ButtonNode"; -import { buttplugNodeDef } from "../nodes/ButtplugNode"; -import { constantValueNodeDef } from "../nodes/ConstantValueNode"; -import { displayNodeDef } from "../nodes/Display"; -import { hysteresisNodeDef } from "../nodes/HysteresisNode"; -import { memoryNodeDef } from "../nodes/MemoryNode"; -import { mixNodeDef } from "../nodes/MixNode"; -import { positiveWaveNodeDef } from "../nodes/PositiveWave"; -import { randomNodeDef } from "../nodes/RandomNode"; +// import { +// addNodeDef, +// divideNodeDef, +// multiplyNodeDef, +// subtractNodeDef, +// } from "../nodes/AddNode"; +// import { buttonNodeDef } from "../nodes/ButtonNode"; +// import { buttplugNodeDef } from "../nodes/ButtplugNode"; +// import { constantValueNodeDef } from "../nodes/ConstantValueNode"; +// import { displayNodeDef } from "../nodes/Display"; +// import { hysteresisNodeDef } from "../nodes/HysteresisNode"; +// import { memoryNodeDef } from "../nodes/MemoryNode"; +// import { mixNodeDef } from "../nodes/MixNode"; +// import { positiveWaveNodeDef } from "../nodes/PositiveWave"; +// import { randomNodeDef } from "../nodes/RandomNode"; import { timerNodeDef } from "../nodes/TimerNode"; -import { clampNodeDef } from "./ClampNode"; -import { commentNodeDef } from "./CommentNode"; -import { curveNodeDef } from "./CurveNode"; -import { delayNodeDef } from "./DelayNode"; -import { edgeDetectorNodeDef } from "./EdgeDetector"; -import { mediaFurryNodeDef } from "./MediaFurry"; -import { sensorNodeDef } from "./SensorNode"; -import { sliderNodeDef } from "./SliderNode"; +// import { clampNodeDef } from "./ClampNode"; +// import { commentNodeDef } from "./CommentNode"; +// import { curveNodeDef } from "./CurveNode"; +// import { delayNodeDef } from "./DelayNode"; +// import { edgeDetectorNodeDef } from "./EdgeDetector"; +// import { mediaFurryNodeDef } from "./MediaFurry"; +// import { sensorNodeDef } from "./SensorNode"; +// import { sliderNodeDef } from "./SliderNode"; import { toggleNodeDef } from "./ToggleNode"; -const nodeDefList: NodeDef[] = [ - displayNodeDef, - constantValueNodeDef, - positiveWaveNodeDef, - addNodeDef, - subtractNodeDef, - divideNodeDef, - multiplyNodeDef, - buttplugNodeDef, - mixNodeDef, - hysteresisNodeDef, - memoryNodeDef, - randomNodeDef, - timerNodeDef, - buttonNodeDef, - sliderNodeDef, - toggleNodeDef, - clampNodeDef, - curveNodeDef, - delayNodeDef, - commentNodeDef, - sensorNodeDef, - mediaFurryNodeDef, - edgeDetectorNodeDef, +const nodeDefList: AnyNodeDef[] = [ + // displayNodeDef, + // constantValueNodeDef, + // positiveWaveNodeDef, + // addNodeDef, + // subtractNodeDef, + // divideNodeDef, + // multiplyNodeDef, + // buttplugNodeDef, + // mixNodeDef, + // hysteresisNodeDef, + // memoryNodeDef, + // randomNodeDef, + timerNodeDef as any, + // buttonNodeDef, + // sliderNodeDef, + toggleNodeDef as any, + // clampNodeDef, + // curveNodeDef, + // delayNodeDef, + // commentNodeDef, + // sensorNodeDef, + // mediaFurryNodeDef, + // edgeDetectorNodeDef, ]; -export const nodeDefs: Record = Object.assign( - {}, - ...nodeDefList.map((it) => ({ [it.type]: it })) -); +export const nodeDefs: Record = Object.assign({}, ...nodeDefList.map((it) => ({ [it.type]: it }))); From 3ec5bfaf7f8e27ebc0f1bf8babeb99bab5f96222 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Tue, 18 Jul 2023 23:24:13 +0200 Subject: [PATCH 003/109] fix errors after rework --- src/components/Viewport.tsx | 3 +- src/components/drawer/Entry.tsx | 4 +- src/components/mobile/ProgramInterface.tsx | 66 ++++++++++------------ src/components/node/NodeHandleLine.tsx | 31 +++++----- src/components/remote/index.tsx | 2 +- src/engine/compiler.ts | 31 ---------- src/engine/index.ts | 42 ++++++++++++++ src/engine/runner.ts | 8 +-- src/engine/store.ts | 16 +++++- src/index.tsx | 7 ++- 10 files changed, 115 insertions(+), 95 deletions(-) diff --git a/src/components/Viewport.tsx b/src/components/Viewport.tsx index dd5b03a..9fac9c6 100644 --- a/src/components/Viewport.tsx +++ b/src/components/Viewport.tsx @@ -167,8 +167,9 @@ const NewNodeDropdown: FunctionComponent = ({ data, onClos style={{ top: data.screenPos.y, left: data.screenPos.x }} >
        - {handles.map((it) => ( + {handles.map((it, index) => (
      • complete(it.node.type, it.handleId, it.output)} className="flex flex-row items-center gap-2 px-2 hover:bg-primary-800" > diff --git a/src/components/drawer/Entry.tsx b/src/components/drawer/Entry.tsx index f7d2bfd..e71b771 100644 --- a/src/components/drawer/Entry.tsx +++ b/src/components/drawer/Entry.tsx @@ -1,9 +1,9 @@ import { FunctionComponent } from "react"; import { useDrag } from "react-dnd"; -import { NodeDef } from "../../engine/node"; +import { AnyNodeDef, NodeDef } from "../../engine/node"; type EntryProps = { - nodeDef: NodeDef; + nodeDef: AnyNodeDef; }; export const Entry: FunctionComponent = ({ nodeDef }) => { //eslint-disable-next-line diff --git a/src/components/mobile/ProgramInterface.tsx b/src/components/mobile/ProgramInterface.tsx index bfab1b9..29b51e1 100644 --- a/src/components/mobile/ProgramInterface.tsx +++ b/src/components/mobile/ProgramInterface.tsx @@ -1,7 +1,4 @@ import { FunctionComponent, ReactNode, useMemo } from "react"; -import shallow from "zustand/shallow"; -import { useFileStore, usePushEphermalData } from "../../engine/store"; -import { BUTTON_NODE_TYPE } from "../../nodes/ButtonNode"; import { Node } from "reactflow"; import { MobileWelcome } from "./Welcome"; import { nodeDefs } from "../../nodes/nodes"; @@ -9,49 +6,48 @@ import { nodeDefs } from "../../nodes/nodes"; type MobileNodeRendererProps = { node: Node; }; -const MobileNodeRenderer: FunctionComponent = ({ - node, -}) => { - const View = nodeDefs[node.type!!].mobileView; - if (View === undefined) { - return

        Cannot display node of type {node.type} in mobile.

        ; - } else { - return ( - - - - ); - } +const MobileNodeRenderer: FunctionComponent = ({ node }) => { + return

        MobileNodeRenderer not available

        ; + // const View = nodeDefs[node.type!!].mobileView; + // if (View === undefined) { + // return

        Cannot display node of type {node.type} in mobile.

        ; + // } else { + // return ( + // + // + // + // ); + // } }; type InterfaceWrapperProps = { children?: ReactNode; }; -export const InterfaceWrapper: FunctionComponent = ({ - children, -}) => { +export const InterfaceWrapper: FunctionComponent = ({ children }) => { return
        {children}
        ; }; -const MOBILE_NODE_TYPES = new Set( - Object.entries(nodeDefs) - .filter(([_, def]) => { - return def.mobileView !== undefined; - }) - .map(([key, _]) => key) -); +// const MOBILE_NODE_TYPES = new Set( +// Object.entries(nodeDefs) +// .filter(([_, def]) => { +// return def.mobileView !== undefined; +// }) +// .map(([key, _]) => key) +// ); export const ProgramInterface: FunctionComponent<{}> = () => { - const nodes = useFileStore((store) => store.nodes, shallow); + // const nodes = useFileStore((store) => store.nodes, shallow); - const mobileNodes = useMemo(() => { - return nodes.filter( - (it) => - it.type !== undefined && - MOBILE_NODE_TYPES.has(it.type) && - it.data.mobileVisible !== false //TODO Make ui for mobileVisible - ); - }, [nodes]); + const mobileNodes: Node[] = []; + + // const mobileNodes = useMemo(() => { + // return nodes.filter( + // (it) => + // it.type !== undefined && + // MOBILE_NODE_TYPES.has(it.type) && + // it.data.mobileVisible !== false //TODO Make ui for mobileVisible + // ); + // }, [nodes]); // const buttons = useMemo(() => { // return nodes.filter((it) => it.type === BUTTON_NODE_TYPE); diff --git a/src/components/node/NodeHandleLine.tsx b/src/components/node/NodeHandleLine.tsx index 992544c..b75cc30 100644 --- a/src/components/node/NodeHandleLine.tsx +++ b/src/components/node/NodeHandleLine.tsx @@ -15,31 +15,28 @@ type NodeHandleLineProps = { id: string; }; -const NodeHandleLine: FunctionComponent = ({ - input, - kind, - type, - label, - id, - connected, -}) => { - const nodes = useFileStore((store) => store.nodes); +const NodeHandleLine: FunctionComponent = ({ input, kind, type, label, id, connected }) => { + const nodes = useFileStore((store) => store.data.nodes); const isValidConnection = useCallback( (connection: Connection) => { - const targetType = nodes.find((it) => it.id === connection.target)?.type; - const sourceType = nodes.find((it) => it.id === connection.source)?.type; + if ( + connection.source === null || + connection.target === null || + connection.sourceHandle === null || + connection.targetHandle === null + ) { + return false; + } + const targetType = nodes[connection.target].type; + const sourceType = nodes[connection.source].type; console.log(connection, targetType, sourceType, nodes); if (targetType !== undefined && sourceType !== undefined) { return ( connection.source !== connection.target && handlesCompatible( - nodeDefs[sourceType].outputs.find( - (output) => output.id === connection.sourceHandle - )?.type || "", - nodeDefs[targetType].inputs.find( - (input) => input.id === connection.targetHandle - )?.type || "" + nodeDefs[sourceType].outputs[connection.sourceHandle].type, + nodeDefs[targetType].inputs[connection.targetHandle].type ) ); } diff --git a/src/components/remote/index.tsx b/src/components/remote/index.tsx index 1f0845d..0f5805d 100644 --- a/src/components/remote/index.tsx +++ b/src/components/remote/index.tsx @@ -89,7 +89,7 @@ export const useRemotePublishStore = create()((set, get) => } }, setEndpoints: (endpoints) => { - console.log(get().endpoints, endpoints); + // console.log(get().endpoints, endpoints); if (!_.isEqual(get().endpoints, endpoints)) { const state = get().state; if (state.state === "connected") { diff --git a/src/engine/compiler.ts b/src/engine/compiler.ts index 12eedbd..4f0aaa1 100644 --- a/src/engine/compiler.ts +++ b/src/engine/compiler.ts @@ -204,34 +204,3 @@ export const modelState = create()(() => ({ }, model: null, })); - -useFileStore.subscribe((store) => { - const newNodes = _.sortBy( - Object.values(store.data.nodes).map((it) => ({ - id: it.id, - type: it.type, - settings: it.data.settings, - })), - (it) => it.id - ); - const newEdges = _.sortBy( - Object.values(store.data.edges).map((it) => ({ - id: it.id, - source: it.source, - target: it.target, - sourceHandle: it.sourceHandle, - targetHandle: it.targetHandle, - })), - (it) => it.id - ); - const newState: ModelSources = { - nodes: newNodes, - edges: newEdges, - }; - if (!_.isEqual(newState, modelState.getState().sources)) { - modelState.setState({ - sources: newState, - model: buildModel(newState), - }); - } -}); diff --git a/src/engine/index.ts b/src/engine/index.ts index d20373f..22f6dda 100644 --- a/src/engine/index.ts +++ b/src/engine/index.ts @@ -2,6 +2,48 @@ import { Node, Edge } from "reactflow"; import { nodeDefs } from "../nodes/nodes"; import { getConversionFunction } from "./handles"; import { NodeExecutor } from "./node"; +import { useFileStore } from "./store"; +import _ from "lodash"; +import { ModelSources, buildModel, modelState } from "./compiler"; +import { restartLoopWithModel } from "./runner"; + +export function watchForChanges() { + useFileStore.subscribe((store) => { + const newNodes = _.sortBy( + Object.values(store.data.nodes).map((it) => ({ + id: it.id, + type: it.type, + settings: it.data.settings, + })), + (it) => it.id + ); + const newEdges = _.sortBy( + Object.values(store.data.edges).map((it) => ({ + id: it.id, + source: it.source, + target: it.target, + sourceHandle: it.sourceHandle, + targetHandle: it.targetHandle, + })), + (it) => it.id + ); + const newState: ModelSources = { + nodes: newNodes, + edges: newEdges, + }; + if (!_.isEqual(newState, modelState.getState().sources)) { + modelState.setState({ + sources: newState, + model: buildModel(newState), + }); + } + }); + + modelState.subscribe((state) => { + restartLoopWithModel(state.model); + }); +} + /* Constant 2 ---> Add 1 --\ diff --git a/src/engine/runner.ts b/src/engine/runner.ts index aab1556..d5a40d6 100644 --- a/src/engine/runner.ts +++ b/src/engine/runner.ts @@ -65,12 +65,12 @@ function runEngineLoop(model: Model) { timeout = setTimeout(update, timestep) as any; } -modelState.subscribe((state) => { +export function restartLoopWithModel(model: Model | null) { if (timeout !== null) { console.log("Stopping old Engine Loop"); clearTimeout(timeout); } - if (state.model !== null) { - runEngineLoop(state.model); + if (model !== null) { + runEngineLoop(model); } -}); +} diff --git a/src/engine/store.ts b/src/engine/store.ts index 21d6439..1e62b98 100644 --- a/src/engine/store.ts +++ b/src/engine/store.ts @@ -129,7 +129,21 @@ export const useFileStore = create()( } }); }, - onEdgesChange: (changes) => {}, + onEdgesChange: (changes) => { + set((draft) => { + for (const c of changes) { + if (c.type === "add") { + console.warn("Add is not yet handled."); + } else if (c.type === "remove") { + delete draft.data.edges[c.id]; + } else if (c.type === "reset") { + console.warn("Reset is not yet handled."); + } else if (c.type === "select") { + console.warn("Select is not yet handled."); + } + } + }); + }, setHandle: (nodeId, handleId, data) => { set((store) => { diff --git a/src/index.tsx b/src/index.tsx index 0163191..2d8f600 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -7,6 +7,7 @@ import reportWebVitals from "./reportWebVitals"; import { enableAllPlugins } from "immer"; import { RouterProvider, createBrowserRouter } from "react-router-dom"; import { RemoteControlPage } from "./components/remote/control"; +import { watchForChanges } from "./engine"; // import { setButtplugInstance } from "./adapters/store"; // enableAllPlugins(); @@ -22,15 +23,15 @@ const router = createBrowserRouter([ }, ]); -const root = ReactDOM.createRoot( - document.getElementById("root") as HTMLElement -); +const root = ReactDOM.createRoot(document.getElementById("root") as HTMLElement); root.render( ); +watchForChanges(); + // const bpscript = document.createElement("script"); // bpscript.src = // "https://cdn.jsdelivr.net/npm/buttplug@1.0.1/dist/web/buttplug.min.js"; From 62ee72db9118a08a6e6493bc6ea95c20991a7ff6 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Wed, 19 Jul 2023 00:11:50 +0200 Subject: [PATCH 004/109] add input and output adapters --- src/components/Drawer.tsx | 11 ++-- src/components/Viewport.tsx | 2 +- src/components/mobile/ProgramInterface.tsx | 2 +- src/components/node/NodeHandleLine.tsx | 2 +- src/components/remote/index.tsx | 2 +- src/engine/adapter.ts | 13 +++++ src/engine/compiler.ts | 11 ++-- src/engine/index.ts | 15 +++--- src/engine/node.ts | 52 +++++++++++++----- src/engine/runner.ts | 13 +++-- src/engine/store.ts | 2 +- src/engine/store.ts.off | 2 +- src/nodes/InputAdapterNode.tsx | 57 ++++++++++++++++++++ src/nodes/OutputAdapterNode.tsx | 61 ++++++++++++++++++++++ src/nodes/TimerNode.tsx | 2 +- src/nodes/ToggleNode.tsx | 2 +- src/nodes/category.ts | 4 ++ src/{nodes/nodes.ts => registries.ts} | 27 ++++++++-- src/remotePlugin/inputAdapter.ts | 17 ++++++ src/remotePlugin/outputAdapter.ts | 17 ++++++ 20 files changed, 266 insertions(+), 48 deletions(-) create mode 100644 src/engine/adapter.ts create mode 100644 src/nodes/InputAdapterNode.tsx create mode 100644 src/nodes/OutputAdapterNode.tsx rename src/{nodes/nodes.ts => registries.ts} (60%) create mode 100644 src/remotePlugin/inputAdapter.ts create mode 100644 src/remotePlugin/outputAdapter.ts diff --git a/src/components/Drawer.tsx b/src/components/Drawer.tsx index 002423e..cefd98d 100644 --- a/src/components/Drawer.tsx +++ b/src/components/Drawer.tsx @@ -1,6 +1,6 @@ import _ from "lodash"; import { FunctionComponent, useMemo } from "react"; -import { nodeDefs } from "../nodes/nodes"; +import { nodeDefs } from "../registries"; import { Entry } from "./drawer/Entry"; import Logo from "./Logo"; @@ -24,10 +24,7 @@ const Drawer: FunctionComponent<{}> = (a) => {
          {nodes.map((category, index) => (
        • -

          +

          {category.name}

            @@ -38,9 +35,7 @@ const Drawer: FunctionComponent<{}> = (a) => { ))}
          -
          - ©Mona Mayrhofer, 2023 Linz, Austria -
          +
          ©Mona Mayrhofer, 2023 Linz, Austria
      ); }; diff --git a/src/components/Viewport.tsx b/src/components/Viewport.tsx index 9fac9c6..eeadfd4 100644 --- a/src/components/Viewport.tsx +++ b/src/components/Viewport.tsx @@ -18,7 +18,7 @@ import { useDrop } from "react-dnd"; import { handlesCompatible } from "../engine/handles"; import { NodeHandleDisplay } from "./node/NodeHandle"; import { WelcomeNode } from "../nodes/WelcomeNode"; -import { nodeDefs } from "../nodes/nodes"; +import { nodeDefs } from "../registries"; import { InputHandleDef, OutputHandleDef } from "../engine/node"; function position(e: HTMLElement) { diff --git a/src/components/mobile/ProgramInterface.tsx b/src/components/mobile/ProgramInterface.tsx index 29b51e1..48f7965 100644 --- a/src/components/mobile/ProgramInterface.tsx +++ b/src/components/mobile/ProgramInterface.tsx @@ -1,7 +1,7 @@ import { FunctionComponent, ReactNode, useMemo } from "react"; import { Node } from "reactflow"; import { MobileWelcome } from "./Welcome"; -import { nodeDefs } from "../../nodes/nodes"; +import { nodeDefs } from "../../registries"; type MobileNodeRendererProps = { node: Node; diff --git a/src/components/node/NodeHandleLine.tsx b/src/components/node/NodeHandleLine.tsx index b75cc30..91cf293 100644 --- a/src/components/node/NodeHandleLine.tsx +++ b/src/components/node/NodeHandleLine.tsx @@ -4,7 +4,7 @@ import clsx from "clsx"; import { useFileStore } from "../../engine/store"; import { handlesCompatible } from "../../engine/handles"; import { NodeHandleDisplay } from "./NodeHandle"; -import { nodeDefs } from "../../nodes/nodes"; +import { nodeDefs } from "../../registries"; type NodeHandleLineProps = { input?: ReactNode; diff --git a/src/components/remote/index.tsx b/src/components/remote/index.tsx index 0f5805d..648aa8d 100644 --- a/src/components/remote/index.tsx +++ b/src/components/remote/index.tsx @@ -3,7 +3,7 @@ import { BeadiMessage, RemoteControlEndpoint, handleMessage, sendMessage } from import _ from "lodash"; import produce from "immer"; import { useFileStore } from "../../engine/store"; -import { nodeDefs } from "../../nodes/nodes"; +import { nodeDefs } from "../../registries"; type RemotePublishStoreState = | { diff --git a/src/engine/adapter.ts b/src/engine/adapter.ts new file mode 100644 index 0000000..e5d1a09 --- /dev/null +++ b/src/engine/adapter.ts @@ -0,0 +1,13 @@ +export type AnyInputAdapterDef = InputAdapterDef; +export type InputAdapterDef = { + id: string; + label: string; + getData: (nodeId: string) => T; +}; + +export type AnyOutputAdapterDef = OutputAdapterDef; +export type OutputAdapterDef = { + id: string; + label: string; + pushData: (nodeId: string, data: T) => void; +}; diff --git a/src/engine/compiler.ts b/src/engine/compiler.ts index 4f0aaa1..8fd3b60 100644 --- a/src/engine/compiler.ts +++ b/src/engine/compiler.ts @@ -2,7 +2,7 @@ import _ from "lodash"; import { useFileStore } from "./store"; import create from "zustand"; import { AnyNodeExecutorDef } from "./node"; -import { nodeDefs } from "../nodes/nodes"; +import { nodeDefs } from "../registries"; import { getConversionFunction } from "./handles"; export type RecipeDependency = { @@ -12,6 +12,7 @@ export type RecipeDependency = { }; export type Recipe = { dependencies: Record; + settings: any; nodeId: string; type: string; // executor: AnyNodeExecutorDef; @@ -28,7 +29,8 @@ export function buildModel({ nodes, edges }: ModelSources): Model { let terminals = []; let nodeDict: Record = {}; - for (const node of nodes) { + for (const nodeId in nodes) { + const node = nodes[nodeId]; nodeDict[node.id] = node; let nodeType = nodeDefs[node.type!!]; if (nodeType !== undefined) { @@ -75,6 +77,7 @@ export function buildModel({ nodes, edges }: ModelSources): Model { return null; } }), + settings: nodes[nodeId].settings, nodeId: nodeId, type: nodeType.type, }); @@ -189,7 +192,7 @@ export type ModelEdge = { targetHandle: string; }; export type ModelSources = { - nodes: ModelNode[]; + nodes: Record; edges: ModelEdge[]; }; export type ModelStore = { @@ -199,7 +202,7 @@ export type ModelStore = { export const modelState = create()(() => ({ sources: { - nodes: [], + nodes: {}, edges: [], }, model: null, diff --git a/src/engine/index.ts b/src/engine/index.ts index 22f6dda..1664c66 100644 --- a/src/engine/index.ts +++ b/src/engine/index.ts @@ -1,5 +1,5 @@ import { Node, Edge } from "reactflow"; -import { nodeDefs } from "../nodes/nodes"; +import { nodeDefs } from "../registries"; import { getConversionFunction } from "./handles"; import { NodeExecutor } from "./node"; import { useFileStore } from "./store"; @@ -9,14 +9,11 @@ import { restartLoopWithModel } from "./runner"; export function watchForChanges() { useFileStore.subscribe((store) => { - const newNodes = _.sortBy( - Object.values(store.data.nodes).map((it) => ({ - id: it.id, - type: it.type, - settings: it.data.settings, - })), - (it) => it.id - ); + const newNodes = _.mapValues(store.data.nodes, (it) => ({ + id: it.id, + type: it.type, + settings: it.data.settings, + })); const newEdges = _.sortBy( Object.values(store.data.edges).map((it) => ({ id: it.id, diff --git a/src/engine/node.ts b/src/engine/node.ts index 7cb9eef..c822a3f 100644 --- a/src/engine/node.ts +++ b/src/engine/node.ts @@ -40,11 +40,16 @@ export type OutputHandleDefs = Record; export type NodeHeaderProps = { id: string; data: any }; export type MobileViewProps = { id: string; data: any }; +export type NodeContext = { + id: string; + settings: TSettings; +}; + export type DriverProps = { nodePersistence: Record; }; -export type InputDriver = () => TDriverInputs; -export type OutputDriver = (outputs: TDriverOutputs) => void; +export type InputDriver = (context: NodeContext) => TDriverInputs; +export type OutputDriver = (outputs: TDriverOutputs, context: NodeContext) => void; export type InputTypeOf = THandleDef extends { type: "number" } ? number @@ -63,37 +68,60 @@ export type OutputTypesOf> = [Key in keyof THandleDefs]: OutputTypeOf; }; -export type AnyNodeExecutorDef = NodeExecutorDef, OutputHandleDefs, Record, any>; +export type AnyNodeExecutorDef = NodeExecutorDef< + InputHandleDefs, + Record, + OutputHandleDefs, + Record, + any, + any +>; type NodeExecutorDef< TInputHandleDefs extends InputHandleDefs, TDriverInputs extends Record, TOutputHandleDefs extends OutputHandleDefs, TDriverOutputs extends Record, - TPersistence + TPersistence, + TSettings > = { initialPersistence: TPersistence; executor: NodeExecutor, TDriverInputs, OutputTypesOf, TDriverOutputs, TPersistence>; - inputDriver?: InputDriver; - outputDriver?: OutputDriver; + inputDriver?: InputDriver; + outputDriver?: OutputDriver; }; -export function nodeDef< +export function nodeDef() { + return < + TInputHandleDefs extends InputHandleDefs, + TDriverInputs extends Record, + TOutputHandleDefs extends OutputHandleDefs, + TDriverOutputs extends Record, + TPersistence + >( + n: NodeDef + ) => { + return n; + }; +} +function innerNodeDef< TInputHandleDefs extends InputHandleDefs, TDriverInputs extends Record, TOutputHandleDefs extends OutputHandleDefs, TDriverOutputs extends Record, - TPersistence ->(n: NodeDef) { + TPersistence, + TSettings +>(n: NodeDef) { return n; } -export type AnyNodeDef = NodeDef, OutputHandleDefs, Record, any>; +export type AnyNodeDef = NodeDef, OutputHandleDefs, Record, any, any>; export type NodeDef< TInputHandleDefs extends InputHandleDefs, TDriverInputs extends Record, TOutputHandleDefs extends OutputHandleDefs, TDriverOutputs extends Record, - TPersistence + TPersistence, + TSettings > = { label: string; publishable?: boolean; @@ -105,5 +133,5 @@ export type NodeDef< nodeComponent?: ComponentType; inputs: TInputHandleDefs; outputs: TOutputHandleDefs; - executor: NodeExecutorDef; + executor: NodeExecutorDef; }; diff --git a/src/engine/runner.ts b/src/engine/runner.ts index d5a40d6..9a998e1 100644 --- a/src/engine/runner.ts +++ b/src/engine/runner.ts @@ -2,8 +2,8 @@ import _ from "lodash"; import { Model, modelState } from "./compiler"; import { useFileStore } from "./store"; import { useSignalBus } from "./signal"; -import { OutputTypeOf, nodeDef } from "./node"; -import { nodeDefs } from "../nodes/nodes"; +import { NodeContext, OutputTypeOf, nodeDef } from "./node"; +import { nodeDefs } from "../registries"; /** NodeId -> HandleId -> Value */ type HandleValues = Record>; @@ -31,6 +31,11 @@ function runEngineLoop(model: Model) { // console.log(1000 / delta); // for (const step of model.executionPlan) { + const nodeContext: NodeContext = { + id: step.nodeId, + settings: step.settings, + }; + const nodeType = nodeDefs[step.type]; // const inputs = step.dependencies.map((it) => (it.convert ? it.convert(data[it.id]) : data[it.id])); const inputs = _.mapValues(step.dependencies, (dependency, handleId) => { @@ -42,7 +47,7 @@ function runEngineLoop(model: Model) { }); const persistent = persistentData[step.nodeId]; - const driverInputs = nodeType.executor.inputDriver?.(); + const driverInputs = nodeType.executor.inputDriver?.(nodeContext); // const committedData = const outputs = nodeType.executor.executor(inputs, persistent, driverInputs ?? {}); @@ -57,7 +62,7 @@ function runEngineLoop(model: Model) { handleValues[step.nodeId] = outputs.outputs; persistentData[step.nodeId] = outputs.persistentData; - nodeType.executor.outputDriver?.(outputs.driverOutputs); + nodeType.executor.outputDriver?.(outputs.driverOutputs, nodeContext); } timeout = setTimeout(update, timestep) as any; diff --git a/src/engine/store.ts b/src/engine/store.ts index 1e62b98..57ef6cb 100644 --- a/src/engine/store.ts +++ b/src/engine/store.ts @@ -3,7 +3,7 @@ import { Edge, Node, OnConnect, OnEdgesChange, OnNodesChange, XYPosition, applyN import create from "zustand"; import { persist } from "zustand/middleware"; import { immer } from "zustand/middleware/immer"; -import { nodeDefs } from "../nodes/nodes"; +import { nodeDefs } from "../registries"; import _ from "lodash"; import { useCallback } from "react"; diff --git a/src/engine/store.ts.off b/src/engine/store.ts.off index f0bb628..e245937 100644 --- a/src/engine/store.ts.off +++ b/src/engine/store.ts.off @@ -2,7 +2,7 @@ import { useCallback } from "react"; import { addEdge, applyEdgeChanges, applyNodeChanges, Edge, Node, OnConnect, OnEdgesChange, OnNodesChange, XYPosition } from "reactflow"; import create from "zustand"; import { persist } from "zustand/middleware"; -import { nodeDefs } from "../nodes/nodes"; +import { nodeDefs } from "../registries"; type NodeId = string; diff --git a/src/nodes/InputAdapterNode.tsx b/src/nodes/InputAdapterNode.tsx new file mode 100644 index 0000000..9d36e8f --- /dev/null +++ b/src/nodes/InputAdapterNode.tsx @@ -0,0 +1,57 @@ +import { FunctionComponent } from "react"; +import { NodeHeaderProps, nodeDef } from "../engine/node"; +import { categories } from "./category"; +import { inputAdapterDefs } from "../registries"; +import { useFileStore } from "../engine/store"; + +type InputAdapterNodeSettings = { + adapterId: string; +}; + +const InputAdapterNodeHeader: FunctionComponent = ({ id }) => { + const [updateNode, adapter] = useFileStore((s) => [s.updateNode, s.data.nodes[id].data.settings as InputAdapterNodeSettings]); + + return ( + + ); +}; + +export const inputAdapterNode = nodeDef()({ + label: "Input", + category: categories["inout"], + type: "inputAdapter", + header: InputAdapterNodeHeader, + outputs: { + value: { + label: "Value", + type: "number", + }, + }, + inputs: {}, + executor: { + inputDriver: (context) => { + const adapter = inputAdapterDefs[context.settings.adapterId]; + return { value: adapter.getData(context.id) }; + }, + outputDriver: () => {}, + initialPersistence: undefined, + executor: (_a, _b, { value }) => { + return { + outputs: { + value, + }, + driverOutputs: {}, + persistentData: undefined, + }; + }, + }, +}); diff --git a/src/nodes/OutputAdapterNode.tsx b/src/nodes/OutputAdapterNode.tsx new file mode 100644 index 0000000..edd0f91 --- /dev/null +++ b/src/nodes/OutputAdapterNode.tsx @@ -0,0 +1,61 @@ +import { FunctionComponent } from "react"; +import { NodeHeaderProps, nodeDef } from "../engine/node"; +import { categories } from "./category"; +import { inputAdapterDefs, outputAdapterDefs } from "../registries"; +import { useFileStore } from "../engine/store"; + +type OutputAdapterNodeSettings = { + adapterId: string; +}; + +const OutputAdapterNodeHeader: FunctionComponent = ({ id }) => { + const [updateNode, settings] = useFileStore((s) => [s.updateNode, s.data.nodes[id].data.settings as OutputAdapterNodeSettings]); + + return ( +
      + +
      + ); +}; + +export const outputAdapterNode = nodeDef()({ + label: "Output", + category: categories["inout"], + type: "outputAdapter", + header: OutputAdapterNodeHeader, + inputs: { + value: { + label: "Value", + type: "number", + default: 0.0, + terminal: true, + }, + }, + outputs: {}, + executor: { + inputDriver: undefined, + outputDriver: ({ value }, context) => { + const adapter = outputAdapterDefs[context.settings.adapterId]; + return { value: adapter.pushData(context.id, value) }; + }, + initialPersistence: undefined, + executor: ({ value }) => { + return { + outputs: {}, + driverOutputs: { + value, + }, + persistentData: undefined, + }; + }, + }, +}); diff --git a/src/nodes/TimerNode.tsx b/src/nodes/TimerNode.tsx index c06b0e4..3c84b3f 100644 --- a/src/nodes/TimerNode.tsx +++ b/src/nodes/TimerNode.tsx @@ -24,7 +24,7 @@ const TimerNode: FunctionComponent = ({ id }) => { ); }; -export const timerNodeDef = nodeDef({ +export const timerNodeDef = nodeDef()({ label: "Random Timer Node", category: categories["generators"], type: "timer", diff --git a/src/nodes/ToggleNode.tsx b/src/nodes/ToggleNode.tsx index cdf600e..20506ce 100644 --- a/src/nodes/ToggleNode.tsx +++ b/src/nodes/ToggleNode.tsx @@ -1,7 +1,7 @@ import { nodeDef } from "../engine/node"; import { categories } from "./category"; -export const toggleNodeDef = nodeDef({ +export const toggleNodeDef = nodeDef()({ label: "Toggle", category: categories["control"], type: "toggle", diff --git a/src/nodes/category.ts b/src/nodes/category.ts index b487442..8b9ecec 100644 --- a/src/nodes/category.ts +++ b/src/nodes/category.ts @@ -1,6 +1,10 @@ import { Category } from "../engine/node"; export const categories: Record = { + inout: { + label: "InOut", + color: "#28FD82", + }, math: { label: "Math", color: "#FFFD82", diff --git a/src/nodes/nodes.ts b/src/registries.ts similarity index 60% rename from src/nodes/nodes.ts rename to src/registries.ts index a4872b9..08f1b9e 100644 --- a/src/nodes/nodes.ts +++ b/src/registries.ts @@ -1,4 +1,4 @@ -import { AnyNodeDef, NodeDef } from "../engine/node"; +import { AnyNodeDef, NodeDef } from "./engine/node"; // import { // addNodeDef, @@ -15,7 +15,8 @@ import { AnyNodeDef, NodeDef } from "../engine/node"; // import { mixNodeDef } from "../nodes/MixNode"; // import { positiveWaveNodeDef } from "../nodes/PositiveWave"; // import { randomNodeDef } from "../nodes/RandomNode"; -import { timerNodeDef } from "../nodes/TimerNode"; +import { timerNodeDef } from "./nodes/TimerNode"; +import { inputAdapterNode } from "./nodes/InputAdapterNode"; // import { clampNodeDef } from "./ClampNode"; // import { commentNodeDef } from "./CommentNode"; // import { curveNodeDef } from "./CurveNode"; @@ -24,7 +25,11 @@ import { timerNodeDef } from "../nodes/TimerNode"; // import { mediaFurryNodeDef } from "./MediaFurry"; // import { sensorNodeDef } from "./SensorNode"; // import { sliderNodeDef } from "./SliderNode"; -import { toggleNodeDef } from "./ToggleNode"; +import { toggleNodeDef } from "./nodes/ToggleNode"; +import { AnyInputAdapterDef, AnyOutputAdapterDef, InputAdapterDef } from "./engine/adapter"; +import { remoteInputAdapter, testRemoteInputAdapter } from "./remotePlugin/inputAdapter"; +import { remoteOutputAdapter, testRemoteOutputAdapter } from "./remotePlugin/outputAdapter"; +import { outputAdapterNode } from "./nodes/OutputAdapterNode"; const nodeDefList: AnyNodeDef[] = [ // displayNodeDef, @@ -43,6 +48,8 @@ const nodeDefList: AnyNodeDef[] = [ // buttonNodeDef, // sliderNodeDef, toggleNodeDef as any, + inputAdapterNode as any, + outputAdapterNode as any, // clampNodeDef, // curveNodeDef, // delayNodeDef, @@ -53,3 +60,17 @@ const nodeDefList: AnyNodeDef[] = [ ]; export const nodeDefs: Record = Object.assign({}, ...nodeDefList.map((it) => ({ [it.type]: it }))); + +const inputAdapterDefList: AnyInputAdapterDef[] = [remoteInputAdapter, testRemoteInputAdapter]; + +export const inputAdapterDefs: Record = Object.assign( + {}, + ...inputAdapterDefList.map((it) => ({ [it.id]: it })) +); + +const outputAdapterDefList: AnyOutputAdapterDef[] = [remoteOutputAdapter, testRemoteOutputAdapter]; + +export const outputAdapterDefs: Record = Object.assign( + {}, + ...outputAdapterDefList.map((it) => ({ [it.id]: it })) +); diff --git a/src/remotePlugin/inputAdapter.ts b/src/remotePlugin/inputAdapter.ts new file mode 100644 index 0000000..e9fb24a --- /dev/null +++ b/src/remotePlugin/inputAdapter.ts @@ -0,0 +1,17 @@ +import { InputAdapterDef } from "../engine/adapter"; + +export const remoteInputAdapter: InputAdapterDef = { + id: "remoteInput", + getData: (nodeId: string) => { + return 82; + }, + label: "Remote", +}; + +export const testRemoteInputAdapter: InputAdapterDef = { + id: "remoteInput2", + getData: (nodeId: string) => { + return 83; + }, + label: "Remote2", +}; diff --git a/src/remotePlugin/outputAdapter.ts b/src/remotePlugin/outputAdapter.ts new file mode 100644 index 0000000..a0b9f3b --- /dev/null +++ b/src/remotePlugin/outputAdapter.ts @@ -0,0 +1,17 @@ +import { InputAdapterDef, OutputAdapterDef } from "../engine/adapter"; + +export const remoteOutputAdapter: OutputAdapterDef = { + id: "remoteInput", + pushData: (nodeId, data) => { + console.log("Output: ", data); + }, + label: "Remote", +}; + +export const testRemoteOutputAdapter: OutputAdapterDef = { + id: "remoteInput2", + pushData: (nodeId, data) => { + console.log("Output2: ", data); + }, + label: "Remote2", +}; From 3ecfa6b05e87fd07eae1a92d31cbd566537e775a Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Wed, 19 Jul 2023 20:59:25 +0200 Subject: [PATCH 005/109] Fix some errors --- src/components/Viewport.tsx | 1 + src/components/node/NodeRenderer.tsx | 4 +- src/engine/node.ts | 28 ++++---- src/engine/store.ts | 104 +++++++++++++-------------- src/index.tsx | 3 + src/nodes/InputAdapterNode.tsx | 10 ++- src/nodes/OutputAdapterNode.tsx | 7 +- src/nodes/TimerNode.tsx | 2 +- src/remotePlugin/outputAdapter.ts | 4 +- 9 files changed, 85 insertions(+), 78 deletions(-) diff --git a/src/components/Viewport.tsx b/src/components/Viewport.tsx index eeadfd4..fc6f20d 100644 --- a/src/components/Viewport.tsx +++ b/src/components/Viewport.tsx @@ -230,6 +230,7 @@ const Viewport: FunctionComponent<{ [project, wrapper, connectingNode, setNodeDropdownData] ); + console.log("Viewport rerendered: ", nodes); return ( <> > { +export function makeNodeRenderer(def: AnyNodeDef): ComponentType> { const HeaderComponent = def.header; const inputs = Object.entries(def.inputs).filter(([inputId, it]) => it.hidden !== true); diff --git a/src/engine/node.ts b/src/engine/node.ts index c822a3f..cfe2087 100644 --- a/src/engine/node.ts +++ b/src/engine/node.ts @@ -1,6 +1,7 @@ import { ComponentType } from "react"; import { NodeProps } from "reactflow"; import { ImpulseEmissions } from "./signal"; +import { BeadiNodeData } from "./store"; export type Category = { label: string; @@ -37,7 +38,10 @@ export type NodeExecutor; export type OutputHandleDefs = Record; -export type NodeHeaderProps = { id: string; data: any }; +export type NodeHeaderProps> = { + id: string; + data: BeadiNodeData; +}; export type MobileViewProps = { id: string; data: any }; export type NodeContext = { @@ -96,39 +100,31 @@ export function nodeDef() { TDriverInputs extends Record, TOutputHandleDefs extends OutputHandleDefs, TDriverOutputs extends Record, - TPersistence + TPersistence, + THeaderProps extends NodeHeaderProps> >( - n: NodeDef + n: NodeDef ) => { return n; }; } -function innerNodeDef< - TInputHandleDefs extends InputHandleDefs, - TDriverInputs extends Record, - TOutputHandleDefs extends OutputHandleDefs, - TDriverOutputs extends Record, - TPersistence, - TSettings ->(n: NodeDef) { - return n; -} -export type AnyNodeDef = NodeDef, OutputHandleDefs, Record, any, any>; +export type AnyNodeDef = NodeDef, OutputHandleDefs, Record, any, any, any>; export type NodeDef< TInputHandleDefs extends InputHandleDefs, TDriverInputs extends Record, TOutputHandleDefs extends OutputHandleDefs, TDriverOutputs extends Record, TPersistence, - TSettings + TSettings, + THeaderProps extends NodeHeaderProps> > = { label: string; publishable?: boolean; category: Category; type: string; /** Specifies what should be rendered above the handles */ - header?: ComponentType; + header?: ComponentType; /** Overrides the how the entire node is rendered. Default to the node-shell */ nodeComponent?: ComponentType; inputs: TInputHandleDefs; diff --git a/src/engine/store.ts b/src/engine/store.ts index 57ef6cb..68b8f38 100644 --- a/src/engine/store.ts +++ b/src/engine/store.ts @@ -1,5 +1,5 @@ import { Draft } from "immer"; -import { Edge, Node, OnConnect, OnEdgesChange, OnNodesChange, XYPosition, applyNodeChanges } from "reactflow"; +import { Edge, Node, OnConnect, OnEdgesChange, OnNodesChange, XYPosition, applyEdgeChanges, applyNodeChanges } from "reactflow"; import create from "zustand"; import { persist } from "zustand/middleware"; import { immer } from "zustand/middleware/immer"; @@ -7,31 +7,23 @@ import { nodeDefs } from "../registries"; import _ from "lodash"; import { useCallback } from "react"; -export interface NodeData { - mobileVisible?: boolean; - published?: boolean; - name?: string; -} - -export type BeadiNode> = { - id: Node["id"]; - position: Node["position"]; - type: NonNullable["type"]>; - data: { - displaySettings: TDisplaySettings; - settings: TSettings; - handles: THandles; - }; +export type UnknownBeadiNode = BeadiNode>; +export type BeadiNode> = Node< + BeadiNodeData +> & { + type: NonNullable>["type"]>; }; -export type UnknownBeadiNode = BeadiNode>; +export type UnknownBeadiNodeData = BeadiNodeData>; +export type BeadiNodeData> = { + displaySettings: TDisplaySettings; + settings: TSettings; + handles: THandles; +}; -export type BeadiEdge = { - id: Edge["id"]; +export type BeadiEdge = Edge & { sourceHandle: NonNullable; targetHandle: NonNullable; - source: Edge["source"]; - target: Edge["target"]; }; export type BeadiFileData = { @@ -107,41 +99,49 @@ export const useFileStore = create()( } }, onNodesChange: (changes) => { + const newNodes = _.keyBy(applyNodeChanges(changes, Object.values(get().data.nodes)), (it) => it.id) as Record< + string, + UnknownBeadiNode + >; set((draft) => { - for (const c of changes) { - if (c.type === "add") { - console.warn("Add is not yet handled."); - } else if (c.type === "dimensions") { - console.warn("Dimensions is not yet handled."); - } else if (c.type === "position") { - if (c.position !== undefined) { - draft.data.nodes[c.id].position = c.position; - } else { - console.warn("Position without position is not yet handled."); - } - } else if (c.type === "remove") { - delete draft.data.nodes[c.id]; - } else if (c.type === "reset") { - console.warn("Reset is not yet handled."); - } else if (c.type === "select") { - console.warn("Select is not yet handled."); - } - } + draft.data.nodes = newNodes; }); + // set((draft) => { + // for (const c of changes) { + // if (c.type === "add") { + // console.warn("Add is not yet handled."); + // } else if (c.type === "dimensions") { + // console.warn("Dimensions is not yet handled."); + // } else if (c.type === "position") { + // if (c.position !== undefined) { + // draft.data.nodes[c.id].position = c.position; + + // const doDelete = []; + // for (const eId in draft.data.edges) { + // if (draft.data.edges[eId].target == c.id || draft.data.edges[eId].source == c.id) { + // doDelete.push(eId); + // } + // } + // for (const eId of doDelete) { + // delete draft.data.edges[eId]; + // } + // } else { + // console.warn("Position without position is not yet handled."); + // } + // } else if (c.type === "remove") { + // delete draft.data.nodes[c.id]; + // } else if (c.type === "reset") { + // console.warn("Reset is not yet handled."); + // } else if (c.type === "select") { + // console.warn("Select is not yet handled."); + // } + // } + // }); }, onEdgesChange: (changes) => { + const newEdges = _.keyBy(applyEdgeChanges(changes, Object.values(get().data.edges)), (it) => it.id) as Record; set((draft) => { - for (const c of changes) { - if (c.type === "add") { - console.warn("Add is not yet handled."); - } else if (c.type === "remove") { - delete draft.data.edges[c.id]; - } else if (c.type === "reset") { - console.warn("Reset is not yet handled."); - } else if (c.type === "select") { - console.warn("Select is not yet handled."); - } - } + draft.data.edges = newEdges; }); }, @@ -201,7 +201,7 @@ export const useFileStore = create()( export type UseInputHandleData = [T, (value: T) => void]; export function useInputHandleData(nodeId: string, handleId: string): UseInputHandleData { const value = useFileStore((state) => { - return state.data.nodes[nodeId].data.handles[handleId]; + return state.data.nodes[nodeId]?.data?.handles?.[handleId]; }); const setHandle = useFileStore((state) => state.setHandle); const setValue = useCallback( diff --git a/src/index.tsx b/src/index.tsx index 2d8f600..fa3525f 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -8,6 +8,7 @@ import { enableAllPlugins } from "immer"; import { RouterProvider, createBrowserRouter } from "react-router-dom"; import { RemoteControlPage } from "./components/remote/control"; import { watchForChanges } from "./engine"; +import { useFileStore } from "./engine/store"; // import { setButtplugInstance } from "./adapters/store"; // enableAllPlugins(); @@ -32,6 +33,8 @@ root.render( watchForChanges(); +useFileStore.subscribe((it) => console.log(it.data)); + // const bpscript = document.createElement("script"); // bpscript.src = // "https://cdn.jsdelivr.net/npm/buttplug@1.0.1/dist/web/buttplug.min.js"; diff --git a/src/nodes/InputAdapterNode.tsx b/src/nodes/InputAdapterNode.tsx index 9d36e8f..c3de32b 100644 --- a/src/nodes/InputAdapterNode.tsx +++ b/src/nodes/InputAdapterNode.tsx @@ -8,13 +8,14 @@ type InputAdapterNodeSettings = { adapterId: string; }; -const InputAdapterNodeHeader: FunctionComponent = ({ id }) => { - const [updateNode, adapter] = useFileStore((s) => [s.updateNode, s.data.nodes[id].data.settings as InputAdapterNodeSettings]); +const InputAdapterNodeHeader: FunctionComponent> = ({ id, data }) => { + const updateNode = useFileStore((s) => s.updateNode); + const adapterId = data.settings.adapterId; return ( setFocused(true)} + onBlur={() => setFocused(false)} + onChange={(e) => setValue(parseFloat(e.target.value))} + /> + +
    + ); +}; + +export const SliderWidgetSettingsEditor: FunctionComponent> = ({ settings, widgetId }) => { + const values = useRemoteValueStore((it) => + Object.entries(it.sources).flatMap(([sourceId, source]) => + Object.keys(source.values).map((valueId) => ({ + sourceId, + valueId, + })) + ) + ); + const save = useRemoteFileStore((it) => it.updateWidget); + + const onChange = useCallback( + (e: ValuePath | null) => { + if (e !== null) { + save(widgetId, (widget) => { + widget.settings = { + valuePath: e, + }; + }); + } + }, + [save, widgetId] + ); + + return ( +
    + +
    + ); +}; + +export const sliderWidgetDef: RemoteWidgetDef = { + id: "slider", + display: SliderWidget, + settings: SliderWidgetSettingsEditor, + defaultSettings: null, +}; From 64533ecc712efdb8ad513ff09bac2d55468916b8 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Sun, 23 Jul 2023 17:50:49 +0200 Subject: [PATCH 014/109] refactored to seperate iostore and interface store --- src/index.tsx | 4 +- src/remotePlugin/RemoteDrawerPage.tsx | 21 +++- src/remotePlugin/builder/index.tsx | 70 ++++++----- src/remotePlugin/builder/store.ts | 51 -------- src/remotePlugin/builder/widget.ts | 31 +++-- src/remotePlugin/inputAdapter.ts | 4 +- src/remotePlugin/inputOutputStore.ts | 66 ++++++++++ src/remotePlugin/interface.ts | 113 ++++++++++++++++++ ...eValueStore.ts => remoteValueStore.ts.off} | 2 +- src/remotePlugin/widgets/SliderWidget.tsx | 86 +++++++------ 10 files changed, 301 insertions(+), 147 deletions(-) delete mode 100644 src/remotePlugin/builder/store.ts create mode 100644 src/remotePlugin/inputOutputStore.ts create mode 100644 src/remotePlugin/interface.ts rename src/remotePlugin/{remoteValueStore.ts => remoteValueStore.ts.off} (99%) diff --git a/src/index.tsx b/src/index.tsx index 6134575..7559b0e 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -9,7 +9,7 @@ import { RouterProvider, createBrowserRouter } from "react-router-dom"; import { RemoteControlPage } from "./components/remote/control"; import { watchForChanges } from "./engine"; import { useFileStore } from "./engine/store"; -import { addLocalSource, tempStartLocalSourceWatcher } from "./remotePlugin/remoteValueStore"; +import { tempSyncIOValueStore } from "./remotePlugin/inputOutputStore"; // import { setButtplugInstance } from "./adapters/store"; // enableAllPlugins(); @@ -33,7 +33,6 @@ root.render( ); watchForChanges(); -addLocalSource(); useFileStore.subscribe((it) => console.log(it.data)); @@ -54,3 +53,4 @@ useFileStore.subscribe((it) => console.log(it.data)); // to log results (for example: reportWebVitals(console.log)) // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals reportWebVitals(); +tempSyncIOValueStore(); diff --git a/src/remotePlugin/RemoteDrawerPage.tsx b/src/remotePlugin/RemoteDrawerPage.tsx index d6525f7..a1d59ff 100644 --- a/src/remotePlugin/RemoteDrawerPage.tsx +++ b/src/remotePlugin/RemoteDrawerPage.tsx @@ -4,16 +4,25 @@ import { MdSettingsRemote } from "react-icons/md"; import { FunctionComponent } from "react"; import { Typo } from "../components/Typo"; import { RemoteInterfaceBuilder } from "./builder"; - -const Builder: FunctionComponent<{}> = () => { - return ; -}; +import { useInterfaceStore } from "./interface"; +import { Button } from "../components/input/Button"; const RemoteSettingsTab: FunctionComponent<{}> = () => { + const interfaceIds = useInterfaceStore((s) => Object.keys(s.interfaces)); + const addInterface = useInterfaceStore((s) => s.addInterface); + return (
    - Interface - +
      + {interfaceIds.map((it) => ( +
    • + Interface {it} + +
    • + ))} +
    + +
    ); }; diff --git a/src/remotePlugin/builder/index.tsx b/src/remotePlugin/builder/index.tsx index ae19d77..93d565e 100644 --- a/src/remotePlugin/builder/index.tsx +++ b/src/remotePlugin/builder/index.tsx @@ -1,14 +1,14 @@ import { FunctionComponent, useCallback } from "react"; -import { WidgetInstance, useRemoteFileStore } from "./store"; import { remoteWidgets } from "../registry"; -import { useRemoteValueStore } from "../remoteValueStore"; import _ from "lodash"; import { Button } from "../../components/input/Button"; +import { RemoteInterfaceWidget, useInterfaceStore } from "../interface"; type WidgetDisplayProps = { - instance: WidgetInstance; + instance: RemoteInterfaceWidget; + interfaceId: string; }; -const WidgetDisplay: FunctionComponent> = ({ instance }) => { +const WidgetDisplay: FunctionComponent> = ({ instance, interfaceId }) => { const widgetDef = remoteWidgets[instance.type]; if (widgetDef === undefined) { @@ -17,46 +17,58 @@ const WidgetDisplay: FunctionComponent> = ({ instance }) if (instance.settings === null) { const Display = widgetDef.settings; - return ; + return ; } else { const Display = widgetDef.display; - return ; + return ; } }; -export const RemoteInterfaceBuilder: FunctionComponent<{}> = () => { - const widgets = useRemoteFileStore((s) => s.data.widgets); +type RemoteInterfaceBuilderProps = { + interfaceId: string; +}; +export const RemoteInterfaceBuilder: FunctionComponent = ({ interfaceId }) => { + const widgets = useInterfaceStore((s) => s.interfaces[interfaceId].widgets); + const updateWidgets = useInterfaceStore((s) => { + const source = s.interfaces[interfaceId].source; + return source.canUpdateWidgets ? source.updateWidgets : null; + }); + // const widgets = useRemoteFileStore((s) => s.data.widgets); - const addWidget = useRemoteFileStore((s) => s.addWidget); + // const addWidget = useRemoteFileStore((s) => s.addWidget); - const makeWidget = useCallback( - (id: string) => { - const widgetId = new Date().getTime(); - addWidget({ - id: `${id}_${widgetId}`, - type: id, - settings: _.cloneDeep(remoteWidgets[id].defaultSettings), - }); - }, - [addWidget] - ); + const makeWidget = + updateWidgets === null + ? null + : (widgetType: string) => { + const id = `${widgetType}_${new Date().getTime()}`; + updateWidgets((draft) => { + draft.push({ + widgetId: id, + type: widgetType, + settings: _.cloneDeep(remoteWidgets[widgetType].defaultSettings), + }); + }); + }; return (
      {widgets.map((it) => ( -
    • - -
    • - ))} -
    -
      - {Object.entries(remoteWidgets).map(([id, def]) => ( -
    • - +
    • +
    • ))}
    + {makeWidget && ( +
      + {Object.entries(remoteWidgets).map(([id, def]) => ( +
    • + +
    • + ))} +
    + )}
    ); }; diff --git a/src/remotePlugin/builder/store.ts b/src/remotePlugin/builder/store.ts deleted file mode 100644 index ee1e254..0000000 --- a/src/remotePlugin/builder/store.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { Draft } from "immer"; -import create from "zustand"; -import { persist } from "zustand/middleware"; -import { immer } from "zustand/middleware/immer"; - -export type WidgetInstance = { - type: string; - id: string; - settings: TSettings | null; -}; -export type RemoteFileData = { - widgets: WidgetInstance[]; -}; -export type RemoteFileStore = { - data: RemoteFileData; - - addWidget: (widget: WidgetInstance) => void; - updateWidget: (id: string, recipe: (draft: Draft>) => void) => void; - - exportJson: () => any; - importJson: (data: any) => void; - // reset: () => void; -}; -export const useRemoteFileStore = create()( - immer( - // persist( - (set, get) => ({ - data: { - widgets: [], - }, - addWidget: (instance) => { - set((draft) => { - draft.data.widgets.push(instance); - }); - }, - updateWidget: (id, recipe) => { - set((draft) => { - const index = draft.data.widgets.findIndex((it) => it.id === id); - recipe(draft.data.widgets[index]); - }); - }, - exportJson: () => {}, - importJson: (data) => {}, - }) - // { - // name: "remotePlugin", - - // } - // ) - ) -); diff --git a/src/remotePlugin/builder/widget.ts b/src/remotePlugin/builder/widget.ts index 1183cbb..2696694 100644 --- a/src/remotePlugin/builder/widget.ts +++ b/src/remotePlugin/builder/widget.ts @@ -1,13 +1,15 @@ import { ComponentType, FunctionComponent, useCallback } from "react"; -import { ValuePath, useRemoteValueStore } from "../remoteValueStore"; +import { useInterfaceStore } from "../interface"; export type RemoteWidgetProps = { settings: TSettings; + interfaceId: string; widgetId: string; }; export type RemoteWidgetSettingsProps = { settings: TSettings | null; widgetId: string; + interfaceId: string; // onSave: (settings: TSettings) => void; }; @@ -19,26 +21,31 @@ export type RemoteWidgetDef = { settings: ComponentType>; }; -type WidgetValueHandle = { +type WidgetValueHandle = null | { value: T; localValue: T; onChange: (value: T) => void; }; -export function useWidgetValueHandle(valuePath: ValuePath): WidgetValueHandle { - const value = useRemoteValueStore((s) => s.sources[valuePath.sourceId]?.values[valuePath.valueId]); +export function useWidgetValueHandle(valueId: string, interfaceId: string): WidgetValueHandle { + const value = useInterfaceStore((s) => s.interfaces[interfaceId]?.values?.[valueId]); + // const value = useRemoteValueStore((s) => s.sources[valuePath.sourceId]?.values[valuePath.valueId]); - const updateValue = useRemoteValueStore((s) => s.updateValue); + const updateValue = useInterfaceStore((s) => s.interfaces[interfaceId]?.source?.updateValue); const onChange = useCallback( (value: any) => { - updateValue(valuePath, value); + updateValue(valueId, value); }, - [updateValue, valuePath] + [updateValue, valueId] ); - return { - onChange, - value: value.value, - localValue: value.localValue, - }; + if (value !== undefined) { + return { + onChange, + value: value.value, + localValue: value.localValue, + }; + } else { + return null; + } } diff --git a/src/remotePlugin/inputAdapter.ts b/src/remotePlugin/inputAdapter.ts index 98abb39..1dc10fa 100644 --- a/src/remotePlugin/inputAdapter.ts +++ b/src/remotePlugin/inputAdapter.ts @@ -1,10 +1,10 @@ import { InputAdapterDef } from "../engine/adapter"; -import { useRemoteValueStore } from "./remoteValueStore"; +import { useIOValueStore } from "./inputOutputStore"; export const remoteInputAdapter: InputAdapterDef = { id: "remoteInput", getData: (nodeId: string) => { - const value = useRemoteValueStore.getState().sources["local"].values[nodeId].value; + const value = useIOValueStore.getState().values[nodeId]?.value; return value ?? 0.0; }, label: "Remote", diff --git a/src/remotePlugin/inputOutputStore.ts b/src/remotePlugin/inputOutputStore.ts new file mode 100644 index 0000000..d3da664 --- /dev/null +++ b/src/remotePlugin/inputOutputStore.ts @@ -0,0 +1,66 @@ +import create from "zustand"; +import { useFileStore } from "../engine/store"; +import produce from "immer"; +import _ from "lodash"; +import { InputAdapterNodeSettings } from "../nodes/InputAdapterNode"; + +type IOValueState = { + valueId: string; + value: T; +}; + +type IOValueStore = { + // values: Record>; + values: Record>; + + /** Send value update request */ + updateValue: (valueId: string, value: any) => void; +}; + +/** Used by all input-/outputAdapters to push/pull their values from/to */ +export const useIOValueStore = create()((set, get) => ({ + values: {}, + updateValue: (id, value) => { + set((s) => + produce(s, (draft) => { + draft.values[id].value = value; + }) + ); + }, +})); + +export function tempSyncIOValueStore() { + useFileStore.subscribe((state) => { + const inputAdapterNodes = Object.values(state.data.nodes).filter((it) => { + if (it.type === "inputAdapter") { + const settings = it.data.settings as InputAdapterNodeSettings; + return settings.adapterId === "remoteInput"; + // }else if(it.type === "outputAdapter") { + // const settings = it.data.settings as OutputAdapterNodeSettings; + // return settings.adapterId === "remoteOutput"; + } + return false; + }); + + useIOValueStore.setState((state) => { + const localValues = Object.values(state.values); + + const missingValues = _.differenceWith(inputAdapterNodes, localValues, (node, value) => node.id === value.valueId); + const extraValues = _.differenceWith(localValues, inputAdapterNodes, (value, node) => node.id === value.valueId); + + return produce(state, (draft) => { + for (const extra of extraValues) { + delete draft.values[extra.valueId]; + } + for (const missing of missingValues) { + draft.values[missing.id] = { + // type: "number", //TODO Real type here + // source: "local", + value: 0, + valueId: missing.id, + }; + } + }); + }); + }); +} diff --git a/src/remotePlugin/interface.ts b/src/remotePlugin/interface.ts new file mode 100644 index 0000000..862d345 --- /dev/null +++ b/src/remotePlugin/interface.ts @@ -0,0 +1,113 @@ +import produce, { Draft } from "immer"; +import create from "zustand"; +import { useIOValueStore } from "./inputOutputStore"; +import _ from "lodash"; + +// ==== INTERFACE SOURCE ==== +type RemoteInterfaceSource = { + destroy: () => void; + updateValue: (valueId: string, value: any) => void; +} & ( + | { + canUpdateWidgets: true; + updateWidgets: (recipe: (draft: Draft) => void) => void; + publish: () => void; + } + | { + canUpdateWidgets: false; + } +); + +type RemoteInterfaceSourceFactory = (updateInterface: (recipe: (draft: Draft) => void) => void) => RemoteInterfaceSource; + +const interfaceSources: Record = { + local: (updateInterface) => { + useIOValueStore.subscribe((state) => { + updateInterface((draft) => { + draft.values = _.mapValues(state.values, (val) => ({ + value: val.value, + localValue: val.value, + valueId: val.valueId, + })); + }); + }); + + return { + canUpdateWidgets: true, + updateWidgets: (recipe) => { + updateInterface((draft) => { + recipe(draft.widgets); + }); + }, + updateValue: (valueId, value) => { + useIOValueStore.getState().updateValue(valueId, value); + }, + publish: () => {}, + destroy: () => {}, + }; + }, + remote: () => { + return { + canUpdateWidgets: false, + destroy: () => {}, + updateValue: (valueId, value) => {}, + }; + }, +}; + +// ===== INTERFACE STORE ==== + +type RemoteInterfaceValue = { + valueId: string; + value: T; + localValue: T; +}; +export type RemoteInterfaceWidget = { + widgetId: string; + type: string; + settings: any; +}; +export interface RemoteInterface { + id: string; + //=== VALUES === + values: Record>; + + // === WIDGETS === + widgets: RemoteInterfaceWidget[]; + + source: RemoteInterfaceSource; +} + +type InterfaceStore = { + interfaces: Record; + + addInterface: (sourceType: string) => string; +}; + +export const useInterfaceStore = create()((set, get) => ({ + interfaces: {}, + + addInterface: (sourceType) => { + const id = `${new Date().getTime()}`; + + const source = interfaceSources[sourceType]((recipe) => { + set((s) => + produce(s, (draft) => { + recipe(draft.interfaces[id]); + }) + ); + }); + + set((s) => + produce(s, (draft) => { + draft.interfaces[id] = { + id, + values: {}, + widgets: [], + source, + }; + }) + ); + return id; + }, +})); diff --git a/src/remotePlugin/remoteValueStore.ts b/src/remotePlugin/remoteValueStore.ts.off similarity index 99% rename from src/remotePlugin/remoteValueStore.ts rename to src/remotePlugin/remoteValueStore.ts.off index 5bc237e..06fe7cf 100644 --- a/src/remotePlugin/remoteValueStore.ts +++ b/src/remotePlugin/remoteValueStore.ts.off @@ -6,7 +6,7 @@ import { OutputAdapterNodeSettings } from "../nodes/OutputAdapterNode"; import _ from "lodash"; export type ValuePath = { - sourceId: string; + interfaceId: string; valueId: string; }; type RemoteValueState = { diff --git a/src/remotePlugin/widgets/SliderWidget.tsx b/src/remotePlugin/widgets/SliderWidget.tsx index 827b084..317ce56 100644 --- a/src/remotePlugin/widgets/SliderWidget.tsx +++ b/src/remotePlugin/widgets/SliderWidget.tsx @@ -1,29 +1,27 @@ import { ChangeEventHandler, FunctionComponent, useCallback, useState } from "react"; import { RemoteWidgetDef, RemoteWidgetProps, RemoteWidgetSettingsProps, useWidgetValueHandle } from "../builder/widget"; -import { ValuePath, useRemoteValueStore } from "../remoteValueStore"; -import { useRemoteFileStore } from "../builder/store"; import { Select } from "../../components/input/Select"; +import { useInterfaceStore } from "../interface"; type SliderWidgetSettings = { - valuePath: ValuePath; + valueId: string; }; -export const SliderWidget: FunctionComponent> = ({ settings }) => { - const { onChange, value, localValue } = useWidgetValueHandle(settings.valuePath); - - const [interactiveValue, setInteractiveValue] = useState(localValue); +export const SliderWidget: FunctionComponent> = ({ settings, interfaceId }) => { + const handle = useWidgetValueHandle(settings.valueId, interfaceId); + const [interactiveValue, setInteractiveValue] = useState(handle?.localValue ?? 0.0); const [focused, setFocused] = useState(false); - const setValue = useCallback( - (e: number) => { - onChange(e); - setInteractiveValue(e); - }, - [onChange] - ); + const setValue = (e: number) => { + handle?.onChange(e); + setInteractiveValue(e); + }; - const displayValue = focused ? interactiveValue : localValue; + const displayValue = focused ? interactiveValue : handle?.localValue ?? 0.0; + if (handle === null) { + return

    Invalid widget

    ; + } return (
    setFocused(false)} onChange={(e) => setValue(parseFloat(e.target.value))} /> - +
    ); }; -export const SliderWidgetSettingsEditor: FunctionComponent> = ({ settings, widgetId }) => { - const values = useRemoteValueStore((it) => - Object.entries(it.sources).flatMap(([sourceId, source]) => - Object.keys(source.values).map((valueId) => ({ - sourceId, - valueId, - })) - ) - ); - const save = useRemoteFileStore((it) => it.updateWidget); +export const SliderWidgetSettingsEditor: FunctionComponent> = ({ + settings, + interfaceId, + widgetId, +}) => { + const values = useInterfaceStore((it) => Object.keys(it.interfaces[interfaceId].values).map((valueId) => valueId)); + const save = useInterfaceStore((it) => { + const source = it.interfaces[interfaceId].source; + return source.canUpdateWidgets ? source.updateWidgets : null; + }); - const onChange = useCallback( - (e: ValuePath | null) => { - if (e !== null) { - save(widgetId, (widget) => { - widget.settings = { - valuePath: e, - }; - }); - } - }, - [save, widgetId] - ); + const onChange = + save === null + ? null + : (e: string | null) => { + if (e !== null) { + save((draft) => { + const index = draft.findIndex((it) => it.widgetId === widgetId); + draft[index].settings = { + valueId: e, + } satisfies SliderWidgetSettings; + }); + } + }; + if (onChange === null) { + return
    Invalid Widget
    ; + } return (
    From 6c1f1a56c39a040778b640da8d93d087db9f52dc Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Sun, 23 Jul 2023 17:56:25 +0200 Subject: [PATCH 015/109] renames and cleanup --- src/remotePlugin/RemoteDrawerPage.tsx | 6 +- .../index.tsx => interface/Display.tsx} | 4 +- .../{interface.ts => interface/store.ts} | 2 +- .../{builder => interface}/widget.ts | 2 +- src/remotePlugin/registry.ts | 2 +- src/remotePlugin/remoteValueStore.ts.off | 139 ------------------ src/remotePlugin/widgets/SliderWidget.tsx | 4 +- 7 files changed, 10 insertions(+), 149 deletions(-) rename src/remotePlugin/{builder/index.tsx => interface/Display.tsx} (94%) rename src/remotePlugin/{interface.ts => interface/store.ts} (97%) rename src/remotePlugin/{builder => interface}/widget.ts (96%) delete mode 100644 src/remotePlugin/remoteValueStore.ts.off diff --git a/src/remotePlugin/RemoteDrawerPage.tsx b/src/remotePlugin/RemoteDrawerPage.tsx index a1d59ff..a09d4e9 100644 --- a/src/remotePlugin/RemoteDrawerPage.tsx +++ b/src/remotePlugin/RemoteDrawerPage.tsx @@ -3,8 +3,8 @@ import { Tab } from "../components/Settings"; import { MdSettingsRemote } from "react-icons/md"; import { FunctionComponent } from "react"; import { Typo } from "../components/Typo"; -import { RemoteInterfaceBuilder } from "./builder"; -import { useInterfaceStore } from "./interface"; +import { RemoteInterfaceDisplay } from "./interface/Display"; +import { useInterfaceStore } from "./interface/store"; import { Button } from "../components/input/Button"; const RemoteSettingsTab: FunctionComponent<{}> = () => { @@ -17,7 +17,7 @@ const RemoteSettingsTab: FunctionComponent<{}> = () => { {interfaceIds.map((it) => (
  • Interface {it} - +
  • ))}
diff --git a/src/remotePlugin/builder/index.tsx b/src/remotePlugin/interface/Display.tsx similarity index 94% rename from src/remotePlugin/builder/index.tsx rename to src/remotePlugin/interface/Display.tsx index 93d565e..352e32b 100644 --- a/src/remotePlugin/builder/index.tsx +++ b/src/remotePlugin/interface/Display.tsx @@ -2,7 +2,7 @@ import { FunctionComponent, useCallback } from "react"; import { remoteWidgets } from "../registry"; import _ from "lodash"; import { Button } from "../../components/input/Button"; -import { RemoteInterfaceWidget, useInterfaceStore } from "../interface"; +import { RemoteInterfaceWidget, useInterfaceStore } from "./store"; type WidgetDisplayProps = { instance: RemoteInterfaceWidget; @@ -27,7 +27,7 @@ const WidgetDisplay: FunctionComponent> = ({ instance, i type RemoteInterfaceBuilderProps = { interfaceId: string; }; -export const RemoteInterfaceBuilder: FunctionComponent = ({ interfaceId }) => { +export const RemoteInterfaceDisplay: FunctionComponent = ({ interfaceId }) => { const widgets = useInterfaceStore((s) => s.interfaces[interfaceId].widgets); const updateWidgets = useInterfaceStore((s) => { const source = s.interfaces[interfaceId].source; diff --git a/src/remotePlugin/interface.ts b/src/remotePlugin/interface/store.ts similarity index 97% rename from src/remotePlugin/interface.ts rename to src/remotePlugin/interface/store.ts index 862d345..8348a30 100644 --- a/src/remotePlugin/interface.ts +++ b/src/remotePlugin/interface/store.ts @@ -1,6 +1,6 @@ import produce, { Draft } from "immer"; import create from "zustand"; -import { useIOValueStore } from "./inputOutputStore"; +import { useIOValueStore } from "../inputOutputStore"; import _ from "lodash"; // ==== INTERFACE SOURCE ==== diff --git a/src/remotePlugin/builder/widget.ts b/src/remotePlugin/interface/widget.ts similarity index 96% rename from src/remotePlugin/builder/widget.ts rename to src/remotePlugin/interface/widget.ts index 2696694..a81a998 100644 --- a/src/remotePlugin/builder/widget.ts +++ b/src/remotePlugin/interface/widget.ts @@ -1,5 +1,5 @@ import { ComponentType, FunctionComponent, useCallback } from "react"; -import { useInterfaceStore } from "../interface"; +import { useInterfaceStore } from "./store"; export type RemoteWidgetProps = { settings: TSettings; diff --git a/src/remotePlugin/registry.ts b/src/remotePlugin/registry.ts index 1da01f8..adaa295 100644 --- a/src/remotePlugin/registry.ts +++ b/src/remotePlugin/registry.ts @@ -1,4 +1,4 @@ -import { AnyRemoteWidgetDef, RemoteWidgetDef } from "./builder/widget"; +import { AnyRemoteWidgetDef, RemoteWidgetDef } from "./interface/widget"; import { sliderWidgetDef } from "./widgets/SliderWidget"; const remoteWidgetsList: AnyRemoteWidgetDef[] = [sliderWidgetDef]; diff --git a/src/remotePlugin/remoteValueStore.ts.off b/src/remotePlugin/remoteValueStore.ts.off deleted file mode 100644 index 06fe7cf..0000000 --- a/src/remotePlugin/remoteValueStore.ts.off +++ /dev/null @@ -1,139 +0,0 @@ -import produce, { Draft } from "immer"; -import create from "zustand"; -import { useFileStore } from "../engine/store"; -import { InputAdapterNodeSettings } from "../nodes/InputAdapterNode"; -import { OutputAdapterNodeSettings } from "../nodes/OutputAdapterNode"; -import _ from "lodash"; - -export type ValuePath = { - interfaceId: string; - valueId: string; -}; -type RemoteValueState = { - valueId: string; - source: string; - value: T; - localValue: T; -}; -type RemoteValueSourceData = { - values: Record>; - close: () => void; - updateValue: (valueId: string, value: any) => void; -}; - -type RemoteValueSourceValueDef = { - valueId: string; - type: string; -}; - -type RemoteValueSourceDef = { - sourceId: string; - /** Subscribe to changes, and return an unsubscriber */ - subscribe: ( - updateState: (recipe: (draft: Record>>) => void) => void - ) => () => void; - updateValue: (valueId: string, value: any) => void; - // close: () => void; -}; - -type RemoteValueStore = { - // values: Record>; - sources: Record; - - /** Send value update request */ - updateValue: (valueId: ValuePath, value: any) => void; - addRemoteValueSource: (source: RemoteValueSourceDef) => void; -}; - -export const useRemoteValueStore = create()((set, get) => ({ - values: {}, - sources: {}, - updateValue: (id, value) => { - set((it) => - produce(it, (draft) => { - draft.sources[id.sourceId].values[id.valueId].localValue = value; - }) - ); - console.log("Updating: ", id, " to ", value); - - get().sources[id.sourceId].updateValue(id.valueId, value); - }, - addRemoteValueSource: (source) => { - if (source.sourceId in get().sources) { - console.error("Tried to double-register source ", source); - } - const unsubscriber = source.subscribe((recipe) => { - set((it) => - produce(it, (draft) => { - recipe(draft.sources[source.sourceId].values); - }) - ); - }); - set((it) => - produce(it, (draft) => { - draft.sources[source.sourceId] = { - close: unsubscriber, - updateValue: source.updateValue, - values: {}, - }; - }) - ); - }, -})); - -export function addLocalSource() { - useRemoteValueStore.getState().addRemoteValueSource({ - sourceId: "local", - subscribe: (update) => { - const unsubscriber = useFileStore.subscribe((state) => { - const inputAdapterNodes = Object.values(state.data.nodes).filter((it) => { - if (it.type === "inputAdapter") { - const settings = it.data.settings as InputAdapterNodeSettings; - return settings.adapterId === "remoteInput"; - // }else if(it.type === "outputAdapter") { - // const settings = it.data.settings as OutputAdapterNodeSettings; - // return settings.adapterId === "remoteOutput"; - } - return false; - }); - - update((valuesDraft) => { - const localValues = Object.values(valuesDraft).filter((it) => it.source === "local"); - - const missingValues = _.differenceWith(inputAdapterNodes, localValues, (node, value) => node.id === value.valueId); - const extraValues = _.differenceWith(localValues, inputAdapterNodes, (value, node) => node.id === value.valueId); - - return produce(state, (draft) => { - for (const extra of extraValues) { - delete valuesDraft[extra.valueId]; - } - for (const missing of missingValues) { - valuesDraft[missing.id] = { - localValue: 0, - type: "number", //TODO Real type here - source: "local", - value: 0, - valueId: missing.id, - }; - } - }); - }); - }); - return unsubscriber; - }, - updateValue: (id, value) => { - setTimeout(() => { - useRemoteValueStore.setState((it) => - produce(it, (draft) => { - draft.sources["local"].values[id].value = value; - draft.sources["local"].values[id].localValue = value; - }) - ); - }, 80); - }, - }); -} - -export function tempStartLocalSourceWatcher() { - useFileStore.subscribe((state) => {}); -} diff --git a/src/remotePlugin/widgets/SliderWidget.tsx b/src/remotePlugin/widgets/SliderWidget.tsx index 317ce56..f1b6f4e 100644 --- a/src/remotePlugin/widgets/SliderWidget.tsx +++ b/src/remotePlugin/widgets/SliderWidget.tsx @@ -1,7 +1,7 @@ import { ChangeEventHandler, FunctionComponent, useCallback, useState } from "react"; -import { RemoteWidgetDef, RemoteWidgetProps, RemoteWidgetSettingsProps, useWidgetValueHandle } from "../builder/widget"; +import { RemoteWidgetDef, RemoteWidgetProps, RemoteWidgetSettingsProps, useWidgetValueHandle } from "../interface/widget"; import { Select } from "../../components/input/Select"; -import { useInterfaceStore } from "../interface"; +import { useInterfaceStore } from "../interface/store"; type SliderWidgetSettings = { valueId: string; From c6560a6d1dc6de74c5de764a6aa0c541425d6409 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Sun, 23 Jul 2023 18:58:15 +0200 Subject: [PATCH 016/109] publish value changes --- src/remotePlugin/interface/Display.tsx | 5 +- src/remotePlugin/interface/localSource.tsx | 151 +++++++++++++++++++++ src/remotePlugin/interface/store.ts | 88 +++++------- src/remotePlugin/message.ts | 49 +++++++ src/remotePlugin/widgets/SliderWidget.tsx | 2 +- 5 files changed, 239 insertions(+), 56 deletions(-) create mode 100644 src/remotePlugin/interface/localSource.tsx create mode 100644 src/remotePlugin/message.ts diff --git a/src/remotePlugin/interface/Display.tsx b/src/remotePlugin/interface/Display.tsx index 352e32b..578fdb7 100644 --- a/src/remotePlugin/interface/Display.tsx +++ b/src/remotePlugin/interface/Display.tsx @@ -3,6 +3,7 @@ import { remoteWidgets } from "../registry"; import _ from "lodash"; import { Button } from "../../components/input/Button"; import { RemoteInterfaceWidget, useInterfaceStore } from "./store"; +import { LocalSourceDisplay } from "./localSource"; type WidgetDisplayProps = { instance: RemoteInterfaceWidget; @@ -31,8 +32,9 @@ export const RemoteInterfaceDisplay: FunctionComponent s.interfaces[interfaceId].widgets); const updateWidgets = useInterfaceStore((s) => { const source = s.interfaces[interfaceId].source; - return source.canUpdateWidgets ? source.updateWidgets : null; + return source.type === "local" ? source.updateWidgets : null; }); + const interfaceType = useInterfaceStore((s) => s.interfaces[interfaceId].source.type); // const widgets = useRemoteFileStore((s) => s.data.widgets); // const addWidget = useRemoteFileStore((s) => s.addWidget); @@ -53,6 +55,7 @@ export const RemoteInterfaceDisplay: FunctionComponent + {interfaceType === "local" && }
    {widgets.map((it) => (
  • diff --git a/src/remotePlugin/interface/localSource.tsx b/src/remotePlugin/interface/localSource.tsx new file mode 100644 index 0000000..fda5ddb --- /dev/null +++ b/src/remotePlugin/interface/localSource.tsx @@ -0,0 +1,151 @@ +import _ from "lodash"; +import { useIOValueStore } from "../inputOutputStore"; +import { BeadiMessage, handleMessage, sendMessage } from "../message"; +import { CommonRemoteInterfaceSource, RemoteInterfaceSourceFactory, RemoteInterfaceWidget, useInterfaceStore } from "./store"; +import { Draft } from "immer"; +import { FunctionComponent } from "react"; +import { Button } from "../../components/input/Button"; + +type RemotePublishStoreState = + | { + state: "disconnected"; + } + | { + state: "connecting"; + socket: WebSocket; + } + | { + state: "connected"; + socket: WebSocket; + id: string; + }; + +export type LocalSourceState = { + connection: RemotePublishStoreState; +}; + +export type LocalRemoteInterfaceSource = CommonRemoteInterfaceSource<"local"> & { + updateWidgets: (recipe: (draft: Draft) => void) => void; + publish: () => void; + state: LocalSourceState; +}; + +export const localSourceFactory: RemoteInterfaceSourceFactory = (updateInterface, getInterface) => { + const unsubscribe = useIOValueStore.subscribe((state) => { + updateInterface((draft) => { + draft.values = _.mapValues(state.values, (val) => ({ + value: val.value, + localValue: val.value, + valueId: val.valueId, + })); + }); + }); + + return { + state: { + connection: { state: "disconnected" }, + }, + type: "local", + updateWidgets: (recipe) => { + updateInterface((draft) => { + recipe(draft.widgets); + }); + const connection = getInterface().source.state.connection; + if (connection.state === "connected") { + sendMessage(connection.socket, { + PublishEndpoints: { + endpoints: getInterface() + .widgets.filter((it) => "valueId" in it.settings) + .map((widget) => ({ + id: widget.settings["valueId"], + type: "number", + value: 0.0, + })), + }, + }); + } + }, + updateValue: (valueId, value) => { + const connection = getInterface().source.state.connection; + if (connection.state === "connected") { + sendMessage(connection.socket, { + ValueChanged: { + endpoint: valueId, + value: value, + }, + }); + } else { + useIOValueStore.getState().updateValue(valueId, value); + } + }, + publish: () => { + const socket = new WebSocket("ws://localhost:6969/publish"); + // set({ state: { state: "connecting", socket } }); + updateInterface((draft) => { + draft.source.state.connection = { state: "connecting", socket }; + }); + + socket.addEventListener("open", (event) => { + console.log("WebSocket Opened: ", event); + }); + socket.addEventListener("close", (event) => { + console.log("WebSocket closed: ", event); + // set({ state: { state: "disconnected" } }); + updateInterface((draft) => { + draft.source.state.connection = { state: "disconnected" }; + }); + }); + socket.addEventListener("message", (event) => { + console.log("WebSocket message: ", event); + try { + const data: BeadiMessage = JSON.parse(event.data); + handleMessage(data, { + Welcome: (payload) => { + updateInterface((draft) => { + draft.source.state.connection = { state: "connected", id: payload.id, socket }; + }); + sendMessage(socket, { + PublishEndpoints: { + endpoints: getInterface() + .widgets.filter((it) => "valueId" in it.settings) + .map((widget) => ({ + id: widget.settings["valueId"], + type: "number", + value: 0.0, + })), + }, + }); + }, + PublishEndpoints: (payload) => { + console.log("ENdpoints:", payload); + }, + ValueChanged: ({ endpoint, value }) => { + console.log("Set ", endpoint, " to ", value); + useIOValueStore.getState().updateValue(endpoint, value); + }, + }); + } catch (e) { + console.error("Unreadable message: ", event); + } + }); + }, + destroy: () => { + unsubscribe(); + }, + }; +}; + +type LocalSourceDisplayProps = { + interfaceId: string; +}; +export const LocalSourceDisplay: FunctionComponent = ({ interfaceId }) => { + const state = useInterfaceStore((s) => s.interfaces[interfaceId].source.state); + const publish = useInterfaceStore((s) => (s.interfaces[interfaceId].source as LocalRemoteInterfaceSource).publish); + + return ( +
    +

    Local {JSON.stringify(state)}

    + +
    + ); +}; diff --git a/src/remotePlugin/interface/store.ts b/src/remotePlugin/interface/store.ts index 8348a30..32b4d2e 100644 --- a/src/remotePlugin/interface/store.ts +++ b/src/remotePlugin/interface/store.ts @@ -1,59 +1,34 @@ import produce, { Draft } from "immer"; import create from "zustand"; -import { useIOValueStore } from "../inputOutputStore"; -import _ from "lodash"; +import { LocalRemoteInterfaceSource, localSourceFactory } from "./localSource"; // ==== INTERFACE SOURCE ==== -type RemoteInterfaceSource = { +export type CommonRemoteInterfaceSource = { destroy: () => void; updateValue: (valueId: string, value: any) => void; -} & ( - | { - canUpdateWidgets: true; - updateWidgets: (recipe: (draft: Draft) => void) => void; - publish: () => void; - } - | { - canUpdateWidgets: false; - } -); - -type RemoteInterfaceSourceFactory = (updateInterface: (recipe: (draft: Draft) => void) => void) => RemoteInterfaceSource; + type: TType; +}; +export type RemoteRemoteInterfaceSource = CommonRemoteInterfaceSource<"remote"> & { + state: {}; +}; -const interfaceSources: Record = { - local: (updateInterface) => { - useIOValueStore.subscribe((state) => { - updateInterface((draft) => { - draft.values = _.mapValues(state.values, (val) => ({ - value: val.value, - localValue: val.value, - valueId: val.valueId, - })); - }); - }); +export type RemoteInterfaceSourceFactory> = ( + updateInterface: (recipe: (draft: Draft>) => void) => void, + getInterface: () => RemoteInterface +) => T; +const interfaceSources = { + local: localSourceFactory, + remote: (() => { return { - canUpdateWidgets: true, - updateWidgets: (recipe) => { - updateInterface((draft) => { - recipe(draft.widgets); - }); - }, - updateValue: (valueId, value) => { - useIOValueStore.getState().updateValue(valueId, value); - }, - publish: () => {}, - destroy: () => {}, - }; - }, - remote: () => { - return { - canUpdateWidgets: false, + type: "remote", destroy: () => {}, updateValue: (valueId, value) => {}, + state: {}, }; - }, -}; + }) satisfies RemoteInterfaceSourceFactory, +} as const; +type AnyRemoteInterfaceSource = ReturnType<(typeof interfaceSources)[keyof typeof interfaceSources]>; // ===== INTERFACE STORE ==== @@ -67,7 +42,7 @@ export type RemoteInterfaceWidget = { type: string; settings: any; }; -export interface RemoteInterface { +export interface RemoteInterface> { id: string; //=== VALUES === values: Record>; @@ -75,11 +50,11 @@ export interface RemoteInterface { // === WIDGETS === widgets: RemoteInterfaceWidget[]; - source: RemoteInterfaceSource; + source: TSource; } type InterfaceStore = { - interfaces: Record; + interfaces: Record>; addInterface: (sourceType: string) => string; }; @@ -90,13 +65,18 @@ export const useInterfaceStore = create()((set, get) => ({ addInterface: (sourceType) => { const id = `${new Date().getTime()}`; - const source = interfaceSources[sourceType]((recipe) => { - set((s) => - produce(s, (draft) => { - recipe(draft.interfaces[id]); - }) - ); - }); + const source = interfaceSources[sourceType as keyof typeof interfaceSources]( + (recipe) => { + set((s) => + produce(s, (draft) => { + //Any cast because we know that draft.interfaces[id] has the right type because we are just setting it down below + recipe(draft.interfaces[id] as any); + }) + ); + }, + //Any cast because we know that draft.interfaces[id] has the right type because we are just setting it down below + () => get().interfaces[id] as any + ); set((s) => produce(s, (draft) => { diff --git a/src/remotePlugin/message.ts b/src/remotePlugin/message.ts new file mode 100644 index 0000000..4a193be --- /dev/null +++ b/src/remotePlugin/message.ts @@ -0,0 +1,49 @@ +export type RemoteControlEndpoint = { + id: string; + type: string; + value: number; +}; + +export type BeadiMessage = { + Welcome?: { + id: string; + }; + PublishEndpoints?: { + endpoints: RemoteControlEndpoint[]; + }; + WelcomeController?: { + endpoints: RemoteControlEndpoint[]; + id: string; + }; + ValueChanged?: { + endpoint: string; + value: number; + }; +}; + +type BeadiMessageHandlers = { + [k in keyof BeadiMessage]?: (data: Required[k]) => void; +}; + +export function handleMessage( + message: BeadiMessage, + handlers: BeadiMessageHandlers +) { + for (const key in message) { + const k = key as keyof BeadiMessage; + if (k in handlers) { + const handler = handlers[k]; + if (handler !== undefined) { + handler(message[k] as any); + } + } + } +} + +export function sendMessage(socket: WebSocket, message: BeadiMessage) { + Object.entries(message).forEach(([key, payload]) => { + const data = JSON.stringify({ [key]: payload }); + console.log("Sending ", socket, data); + socket.send(data); + }); +} diff --git a/src/remotePlugin/widgets/SliderWidget.tsx b/src/remotePlugin/widgets/SliderWidget.tsx index f1b6f4e..70ac5c8 100644 --- a/src/remotePlugin/widgets/SliderWidget.tsx +++ b/src/remotePlugin/widgets/SliderWidget.tsx @@ -47,7 +47,7 @@ export const SliderWidgetSettingsEditor: FunctionComponent Object.keys(it.interfaces[interfaceId].values).map((valueId) => valueId)); const save = useInterfaceStore((it) => { const source = it.interfaces[interfaceId].source; - return source.canUpdateWidgets ? source.updateWidgets : null; + return source.type === "local" ? source.updateWidgets : null; }); const onChange = From 73a9feb75897875be7d6e9d2e72ac957d4f7e31c Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Mon, 24 Jul 2023 15:10:26 +0200 Subject: [PATCH 017/109] draft for remoteSource --- src/remotePlugin/RemoteDrawerPage.tsx | 4 +- src/remotePlugin/inputOutputStore.ts | 13 +- src/remotePlugin/interface/localSource.tsx | 8 +- src/remotePlugin/interface/remoteSource.tsx | 141 ++++++++++++++++++++ src/remotePlugin/interface/store.ts | 27 ++-- src/remotePlugin/widgets/SliderWidget.tsx | 9 +- 6 files changed, 179 insertions(+), 23 deletions(-) create mode 100644 src/remotePlugin/interface/remoteSource.tsx diff --git a/src/remotePlugin/RemoteDrawerPage.tsx b/src/remotePlugin/RemoteDrawerPage.tsx index a09d4e9..bb197ad 100644 --- a/src/remotePlugin/RemoteDrawerPage.tsx +++ b/src/remotePlugin/RemoteDrawerPage.tsx @@ -21,8 +21,8 @@ const RemoteSettingsTab: FunctionComponent<{}> = () => {
  • ))}
- - + + ); }; diff --git a/src/remotePlugin/inputOutputStore.ts b/src/remotePlugin/inputOutputStore.ts index d3da664..365f12d 100644 --- a/src/remotePlugin/inputOutputStore.ts +++ b/src/remotePlugin/inputOutputStore.ts @@ -1,5 +1,5 @@ import create from "zustand"; -import { useFileStore } from "../engine/store"; +import { FileStore, useFileStore } from "../engine/store"; import produce from "immer"; import _ from "lodash"; import { InputAdapterNodeSettings } from "../nodes/InputAdapterNode"; @@ -30,7 +30,7 @@ export const useIOValueStore = create()((set, get) => ({ })); export function tempSyncIOValueStore() { - useFileStore.subscribe((state) => { + const func = (state: FileStore) => { const inputAdapterNodes = Object.values(state.data.nodes).filter((it) => { if (it.type === "inputAdapter") { const settings = it.data.settings as InputAdapterNodeSettings; @@ -41,6 +41,7 @@ export function tempSyncIOValueStore() { } return false; }); + console.log("inputAdapterNodes: ", inputAdapterNodes); useIOValueStore.setState((state) => { const localValues = Object.values(state.values); @@ -48,6 +49,8 @@ export function tempSyncIOValueStore() { const missingValues = _.differenceWith(inputAdapterNodes, localValues, (node, value) => node.id === value.valueId); const extraValues = _.differenceWith(localValues, inputAdapterNodes, (value, node) => node.id === value.valueId); + console.log("useIOValueStore setState: ", localValues, "+", missingValues, " -", extraValues); + return produce(state, (draft) => { for (const extra of extraValues) { delete draft.values[extra.valueId]; @@ -62,5 +65,9 @@ export function tempSyncIOValueStore() { } }); }); - }); + }; + + useFileStore.subscribe(func); + + func(useFileStore.getState()); } diff --git a/src/remotePlugin/interface/localSource.tsx b/src/remotePlugin/interface/localSource.tsx index fda5ddb..6a60790 100644 --- a/src/remotePlugin/interface/localSource.tsx +++ b/src/remotePlugin/interface/localSource.tsx @@ -30,7 +30,13 @@ export type LocalRemoteInterfaceSource = CommonRemoteInterfaceSource<"local"> & state: LocalSourceState; }; -export const localSourceFactory: RemoteInterfaceSourceFactory = (updateInterface, getInterface) => { +type LocalFactoryProps = {}; + +export const localSourceFactory: RemoteInterfaceSourceFactory = ( + props, + updateInterface, + getInterface +) => { const unsubscribe = useIOValueStore.subscribe((state) => { updateInterface((draft) => { draft.values = _.mapValues(state.values, (val) => ({ diff --git a/src/remotePlugin/interface/remoteSource.tsx b/src/remotePlugin/interface/remoteSource.tsx new file mode 100644 index 0000000..fd5502b --- /dev/null +++ b/src/remotePlugin/interface/remoteSource.tsx @@ -0,0 +1,141 @@ +import { FunctionComponent } from "react"; +import { CommonRemoteInterfaceSource, RemoteInterfaceSourceFactory } from "./store"; +import { BeadiMessage, handleMessage, sendMessage } from "../message"; +import _ from "lodash"; + +type RemoteControlStoreState = + | { + state: "disconnected"; + } + | { + state: "connecting"; + socket: WebSocket; + code: string; + } + | { + state: "connected"; + socket: WebSocket; + code: string; + // endpoints: Record; + }; + +export type RemoteRemoteInterfaceSource = CommonRemoteInterfaceSource<"remote"> & { + state: RemoteControlStoreState; +}; +type RemoteFactoryProps = { + code: string; +}; +export const remoteSourceFactory: RemoteInterfaceSourceFactory = ( + props, + updateInterface, + getInterface +) => { + const socket = new WebSocket(`ws://localhost:6969/control/${props.code}`); + + socket.addEventListener("open", (event) => { + console.log("WebSocket Opened: ", event); + }); + socket.addEventListener("close", (event) => { + console.log("WebSocket closed: ", event); + + updateInterface((draft) => { + draft.source.state = { state: "disconnected" }; + }); + }); + socket.addEventListener("message", (event) => { + console.log("WebSocket message: ", event); + try { + const data: BeadiMessage = JSON.parse(event.data); + handleMessage(data, { + WelcomeController: (payload) => { + updateInterface((draft) => { + draft.source.state = { + state: "connected", + code: props.code, + socket: socket, + }; + draft.values = _.keyBy( + payload.endpoints.map((endp) => ({ + valueId: endp.id, + value: endp.value, + localValue: endp.value, + })), + (e) => e.valueId + ); + draft.widgets = payload.endpoints.map((endp) => ({ + settings: { + valueId: endp.id, + }, + type: "slider", + widgetId: `${new Date().getTime()}`, + })); + }); + }, + PublishEndpoints: (payload) => { + console.log("PublishEndpoints: ", payload); + updateInterface((draft) => { + draft.values = _.keyBy( + payload.endpoints.map((endp) => ({ + valueId: endp.id, + value: endp.value, + localValue: endp.value, + })), + (e) => e.valueId + ); + draft.widgets = payload.endpoints.map((endp) => ({ + settings: { + valueId: endp.id, + }, + type: "slider", + widgetId: `${new Date().getTime()}`, + })); + }); + }, + ValueChanged: ({ endpoint, value }) => { + updateInterface((draft) => { + draft.values[endpoint].localValue = value; + draft.values[endpoint].value = value; + }); + }, + }); + } catch (e) { + console.error(e); + console.error("Error occurred while reading message: ", event); + } + }); + + return { + type: "remote", + destroy: () => { + if (getInterface().source.state.state === "connected") { + socket.close(); + } + }, + updateValue: (valueId, value) => { + if (getInterface().source.state.state === "connected") { + sendMessage(socket, { + ValueChanged: { + endpoint: valueId, + value: value, + }, + }); + } + }, + state: { + state: "connecting", + socket, + code: props.code, + }, + }; +}; + +type RemoteSourceDisplayProps = { + interfaceId: string; +}; +export const RemoteSourceDisplay: FunctionComponent = ({ interfaceId }) => { + return ( +
+

Remote

+
+ ); +}; diff --git a/src/remotePlugin/interface/store.ts b/src/remotePlugin/interface/store.ts index 32b4d2e..34a6210 100644 --- a/src/remotePlugin/interface/store.ts +++ b/src/remotePlugin/interface/store.ts @@ -1,6 +1,7 @@ import produce, { Draft } from "immer"; import create from "zustand"; import { LocalRemoteInterfaceSource, localSourceFactory } from "./localSource"; +import { remoteSourceFactory } from "./remoteSource"; // ==== INTERFACE SOURCE ==== export type CommonRemoteInterfaceSource = { @@ -8,25 +9,16 @@ export type CommonRemoteInterfaceSource = { updateValue: (valueId: string, value: any) => void; type: TType; }; -export type RemoteRemoteInterfaceSource = CommonRemoteInterfaceSource<"remote"> & { - state: {}; -}; -export type RemoteInterfaceSourceFactory> = ( +export type RemoteInterfaceSourceFactory> = ( + props: TProps, updateInterface: (recipe: (draft: Draft>) => void) => void, getInterface: () => RemoteInterface ) => T; const interfaceSources = { local: localSourceFactory, - remote: (() => { - return { - type: "remote", - destroy: () => {}, - updateValue: (valueId, value) => {}, - state: {}, - }; - }) satisfies RemoteInterfaceSourceFactory, + remote: remoteSourceFactory, } as const; type AnyRemoteInterfaceSource = ReturnType<(typeof interfaceSources)[keyof typeof interfaceSources]>; @@ -56,16 +48,21 @@ export interface RemoteInterface>; - addInterface: (sourceType: string) => string; + addInterface: ( + sourceType: TSourceType, + props: Parameters<(typeof interfaceSources)[TSourceType]>[0] + ) => string; }; export const useInterfaceStore = create()((set, get) => ({ interfaces: {}, - addInterface: (sourceType) => { + addInterface: (sourceType, props) => { const id = `${new Date().getTime()}`; - const source = interfaceSources[sourceType as keyof typeof interfaceSources]( + const source = interfaceSources[sourceType]( + //Any case because this is ensured through the generics of this function + props as any, (recipe) => { set((s) => produce(s, (draft) => { diff --git a/src/remotePlugin/widgets/SliderWidget.tsx b/src/remotePlugin/widgets/SliderWidget.tsx index 70ac5c8..f8d8f91 100644 --- a/src/remotePlugin/widgets/SliderWidget.tsx +++ b/src/remotePlugin/widgets/SliderWidget.tsx @@ -2,6 +2,7 @@ import { ChangeEventHandler, FunctionComponent, useCallback, useState } from "re import { RemoteWidgetDef, RemoteWidgetProps, RemoteWidgetSettingsProps, useWidgetValueHandle } from "../interface/widget"; import { Select } from "../../components/input/Select"; import { useInterfaceStore } from "../interface/store"; +import { useIOValueStore } from "../inputOutputStore"; type SliderWidgetSettings = { valueId: string; @@ -30,7 +31,10 @@ export const SliderWidget: FunctionComponent setFocused(true)} + onFocus={() => { + setFocused(true); + setInteractiveValue(handle?.localValue); + }} onBlur={() => setFocused(false)} onChange={(e) => setValue(parseFloat(e.target.value))} /> @@ -44,7 +48,8 @@ export const SliderWidgetSettingsEditor: FunctionComponent { - const values = useInterfaceStore((it) => Object.keys(it.interfaces[interfaceId].values).map((valueId) => valueId)); + const values = useIOValueStore((store) => Object.keys(store.values)); + // const values = useInterfaceStore((it) => Object.keys(it.interfaces[interfaceId].values).map((valueId) => valueId)); const save = useInterfaceStore((it) => { const source = it.interfaces[interfaceId].source; return source.type === "local" ? source.updateWidgets : null; From bc425fbad850e10e26ec345cf08cd54b7d9deca1 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Thu, 27 Jul 2023 12:55:17 +0200 Subject: [PATCH 018/109] Add remote connection manager --- src/remotePlugin/RemoteDrawerPage.tsx | 31 ++-- src/remotePlugin/inputOutputStore.ts | 5 +- src/remotePlugin/interface/Display.tsx | 77 -------- src/remotePlugin/interface/Interface.tsx | 11 ++ .../interface/InterfaceEditor.tsx | 12 ++ src/remotePlugin/interface/InterfaceList.tsx | 49 +++++ src/remotePlugin/interface/localSource.tsx | 157 ---------------- src/remotePlugin/interface/remoteSource.tsx | 141 -------------- src/remotePlugin/interface/store.ts | 90 --------- src/remotePlugin/interface/stores.ts | 155 ++++++++++++++++ src/remotePlugin/interface/widget.ts | 24 --- src/remotePlugin/registry.ts | 4 +- src/remotePlugin/remote/ConnectionManager.tsx | 57 ++++++ src/remotePlugin/remote/store.ts | 173 ++++++++++++++++++ ...{SliderWidget.tsx => SliderWidget.tsx.off} | 0 src/utils/diffBy.ts | 41 +++++ 16 files changed, 518 insertions(+), 509 deletions(-) delete mode 100644 src/remotePlugin/interface/Display.tsx create mode 100644 src/remotePlugin/interface/Interface.tsx create mode 100644 src/remotePlugin/interface/InterfaceEditor.tsx create mode 100644 src/remotePlugin/interface/InterfaceList.tsx delete mode 100644 src/remotePlugin/interface/localSource.tsx delete mode 100644 src/remotePlugin/interface/remoteSource.tsx delete mode 100644 src/remotePlugin/interface/store.ts create mode 100644 src/remotePlugin/interface/stores.ts create mode 100644 src/remotePlugin/remote/ConnectionManager.tsx create mode 100644 src/remotePlugin/remote/store.ts rename src/remotePlugin/widgets/{SliderWidget.tsx => SliderWidget.tsx.off} (100%) create mode 100644 src/utils/diffBy.ts diff --git a/src/remotePlugin/RemoteDrawerPage.tsx b/src/remotePlugin/RemoteDrawerPage.tsx index bb197ad..21b2dd0 100644 --- a/src/remotePlugin/RemoteDrawerPage.tsx +++ b/src/remotePlugin/RemoteDrawerPage.tsx @@ -3,27 +3,26 @@ import { Tab } from "../components/Settings"; import { MdSettingsRemote } from "react-icons/md"; import { FunctionComponent } from "react"; import { Typo } from "../components/Typo"; -import { RemoteInterfaceDisplay } from "./interface/Display"; -import { useInterfaceStore } from "./interface/store"; import { Button } from "../components/input/Button"; +import { InterfaceList } from "./interface/InterfaceList"; +import { useInterfaceDisplayStore, useInterfaceFileStore } from "./interface/stores"; +import { ConnectionManager } from "./remote/ConnectionManager"; const RemoteSettingsTab: FunctionComponent<{}> = () => { - const interfaceIds = useInterfaceStore((s) => Object.keys(s.interfaces)); - const addInterface = useInterfaceStore((s) => s.addInterface); + const addRemoteInterface = useInterfaceDisplayStore((s) => s.addRemoteInterface); + const addLocalInterface = useInterfaceFileStore((s) => s.addInterface); return ( -
-
    - {interfaceIds.map((it) => ( -
  • - Interface {it} - -
  • - ))} -
- - -
+ <> +
+ + + +
+
+ +
+ ); }; diff --git a/src/remotePlugin/inputOutputStore.ts b/src/remotePlugin/inputOutputStore.ts index 365f12d..95455ea 100644 --- a/src/remotePlugin/inputOutputStore.ts +++ b/src/remotePlugin/inputOutputStore.ts @@ -7,6 +7,8 @@ import { InputAdapterNodeSettings } from "../nodes/InputAdapterNode"; type IOValueState = { valueId: string; value: T; + type: string; + //And additional metadata }; type IOValueStore = { @@ -57,8 +59,7 @@ export function tempSyncIOValueStore() { } for (const missing of missingValues) { draft.values[missing.id] = { - // type: "number", //TODO Real type here - // source: "local", + type: "number", //TODO Real type here value: 0, valueId: missing.id, }; diff --git a/src/remotePlugin/interface/Display.tsx b/src/remotePlugin/interface/Display.tsx deleted file mode 100644 index 578fdb7..0000000 --- a/src/remotePlugin/interface/Display.tsx +++ /dev/null @@ -1,77 +0,0 @@ -import { FunctionComponent, useCallback } from "react"; -import { remoteWidgets } from "../registry"; -import _ from "lodash"; -import { Button } from "../../components/input/Button"; -import { RemoteInterfaceWidget, useInterfaceStore } from "./store"; -import { LocalSourceDisplay } from "./localSource"; - -type WidgetDisplayProps = { - instance: RemoteInterfaceWidget; - interfaceId: string; -}; -const WidgetDisplay: FunctionComponent> = ({ instance, interfaceId }) => { - const widgetDef = remoteWidgets[instance.type]; - - if (widgetDef === undefined) { - return

Unknown widget {instance.type}

; - } - - if (instance.settings === null) { - const Display = widgetDef.settings; - return ; - } else { - const Display = widgetDef.display; - return ; - } -}; - -type RemoteInterfaceBuilderProps = { - interfaceId: string; -}; -export const RemoteInterfaceDisplay: FunctionComponent = ({ interfaceId }) => { - const widgets = useInterfaceStore((s) => s.interfaces[interfaceId].widgets); - const updateWidgets = useInterfaceStore((s) => { - const source = s.interfaces[interfaceId].source; - return source.type === "local" ? source.updateWidgets : null; - }); - const interfaceType = useInterfaceStore((s) => s.interfaces[interfaceId].source.type); - // const widgets = useRemoteFileStore((s) => s.data.widgets); - - // const addWidget = useRemoteFileStore((s) => s.addWidget); - - const makeWidget = - updateWidgets === null - ? null - : (widgetType: string) => { - const id = `${widgetType}_${new Date().getTime()}`; - updateWidgets((draft) => { - draft.push({ - widgetId: id, - type: widgetType, - settings: _.cloneDeep(remoteWidgets[widgetType].defaultSettings), - }); - }); - }; - - return ( -
- {interfaceType === "local" && } -
    - {widgets.map((it) => ( -
  • - -
  • - ))} -
- {makeWidget && ( -
    - {Object.entries(remoteWidgets).map(([id, def]) => ( -
  • - -
  • - ))} -
- )} -
- ); -}; diff --git a/src/remotePlugin/interface/Interface.tsx b/src/remotePlugin/interface/Interface.tsx new file mode 100644 index 0000000..06238a7 --- /dev/null +++ b/src/remotePlugin/interface/Interface.tsx @@ -0,0 +1,11 @@ +import { FunctionComponent } from "react"; +import { useInterfaceDisplayStateStore } from "./stores"; + +type InterfaceProps = { + interfaceId: string; +}; +export const Interface: FunctionComponent = ({ interfaceId }) => { + const interfaceState = useInterfaceDisplayStateStore((s) => s.interfaces[interfaceId]); + + return
{JSON.stringify(interfaceState)}
; +}; diff --git a/src/remotePlugin/interface/InterfaceEditor.tsx b/src/remotePlugin/interface/InterfaceEditor.tsx new file mode 100644 index 0000000..a18f80f --- /dev/null +++ b/src/remotePlugin/interface/InterfaceEditor.tsx @@ -0,0 +1,12 @@ +import { FunctionComponent } from "react"; +import { useInterfaceFileStore } from "./stores"; + +type InterfaceEditorProps = { + interfaceId: string; +}; + +export const InterfaceEditor: FunctionComponent = ({ interfaceId }) => { + const iface = useInterfaceFileStore((s) => s.interfaces[interfaceId]); + + return
Editor for "{iface.name}"
; +}; diff --git a/src/remotePlugin/interface/InterfaceList.tsx b/src/remotePlugin/interface/InterfaceList.tsx new file mode 100644 index 0000000..6055c3f --- /dev/null +++ b/src/remotePlugin/interface/InterfaceList.tsx @@ -0,0 +1,49 @@ +import { FunctionComponent, useState } from "react"; +import { useInterfaceDisplayStateStore } from "./stores"; +import { Interface } from "./Interface"; +import { InterfaceEditor } from "./InterfaceEditor"; +import { Button } from "../../components/input/Button"; + +type InterfaceListEntryProps = { + interfaceId: string; + brokerType: string; +}; +export const InterfaceListEntry: FunctionComponent = ({ interfaceId, brokerType }) => { + const [editing, setEditing] = useState(false); + const canEdit = brokerType === "local"; + if (editing && canEdit) { + return ( +
+ + ; +
+ ); + } else { + return ( +
+ {canEdit && } + +
+ ); + } +}; + +type InterfaceListProps = {}; +export const InterfaceList: FunctionComponent = ({}) => { + const interfaces = useInterfaceDisplayStateStore((s) => + Object.entries(s.interfaces).map(([interfaceId, iface]) => ({ + interfaceId, + brokerType: iface.brokerType, + })) + ); + + return ( +
    + {interfaces.map(({ interfaceId, brokerType }) => ( +
  • + +
  • + ))} +
+ ); +}; diff --git a/src/remotePlugin/interface/localSource.tsx b/src/remotePlugin/interface/localSource.tsx deleted file mode 100644 index 6a60790..0000000 --- a/src/remotePlugin/interface/localSource.tsx +++ /dev/null @@ -1,157 +0,0 @@ -import _ from "lodash"; -import { useIOValueStore } from "../inputOutputStore"; -import { BeadiMessage, handleMessage, sendMessage } from "../message"; -import { CommonRemoteInterfaceSource, RemoteInterfaceSourceFactory, RemoteInterfaceWidget, useInterfaceStore } from "./store"; -import { Draft } from "immer"; -import { FunctionComponent } from "react"; -import { Button } from "../../components/input/Button"; - -type RemotePublishStoreState = - | { - state: "disconnected"; - } - | { - state: "connecting"; - socket: WebSocket; - } - | { - state: "connected"; - socket: WebSocket; - id: string; - }; - -export type LocalSourceState = { - connection: RemotePublishStoreState; -}; - -export type LocalRemoteInterfaceSource = CommonRemoteInterfaceSource<"local"> & { - updateWidgets: (recipe: (draft: Draft) => void) => void; - publish: () => void; - state: LocalSourceState; -}; - -type LocalFactoryProps = {}; - -export const localSourceFactory: RemoteInterfaceSourceFactory = ( - props, - updateInterface, - getInterface -) => { - const unsubscribe = useIOValueStore.subscribe((state) => { - updateInterface((draft) => { - draft.values = _.mapValues(state.values, (val) => ({ - value: val.value, - localValue: val.value, - valueId: val.valueId, - })); - }); - }); - - return { - state: { - connection: { state: "disconnected" }, - }, - type: "local", - updateWidgets: (recipe) => { - updateInterface((draft) => { - recipe(draft.widgets); - }); - const connection = getInterface().source.state.connection; - if (connection.state === "connected") { - sendMessage(connection.socket, { - PublishEndpoints: { - endpoints: getInterface() - .widgets.filter((it) => "valueId" in it.settings) - .map((widget) => ({ - id: widget.settings["valueId"], - type: "number", - value: 0.0, - })), - }, - }); - } - }, - updateValue: (valueId, value) => { - const connection = getInterface().source.state.connection; - if (connection.state === "connected") { - sendMessage(connection.socket, { - ValueChanged: { - endpoint: valueId, - value: value, - }, - }); - } else { - useIOValueStore.getState().updateValue(valueId, value); - } - }, - publish: () => { - const socket = new WebSocket("ws://localhost:6969/publish"); - // set({ state: { state: "connecting", socket } }); - updateInterface((draft) => { - draft.source.state.connection = { state: "connecting", socket }; - }); - - socket.addEventListener("open", (event) => { - console.log("WebSocket Opened: ", event); - }); - socket.addEventListener("close", (event) => { - console.log("WebSocket closed: ", event); - // set({ state: { state: "disconnected" } }); - updateInterface((draft) => { - draft.source.state.connection = { state: "disconnected" }; - }); - }); - socket.addEventListener("message", (event) => { - console.log("WebSocket message: ", event); - try { - const data: BeadiMessage = JSON.parse(event.data); - handleMessage(data, { - Welcome: (payload) => { - updateInterface((draft) => { - draft.source.state.connection = { state: "connected", id: payload.id, socket }; - }); - sendMessage(socket, { - PublishEndpoints: { - endpoints: getInterface() - .widgets.filter((it) => "valueId" in it.settings) - .map((widget) => ({ - id: widget.settings["valueId"], - type: "number", - value: 0.0, - })), - }, - }); - }, - PublishEndpoints: (payload) => { - console.log("ENdpoints:", payload); - }, - ValueChanged: ({ endpoint, value }) => { - console.log("Set ", endpoint, " to ", value); - useIOValueStore.getState().updateValue(endpoint, value); - }, - }); - } catch (e) { - console.error("Unreadable message: ", event); - } - }); - }, - destroy: () => { - unsubscribe(); - }, - }; -}; - -type LocalSourceDisplayProps = { - interfaceId: string; -}; -export const LocalSourceDisplay: FunctionComponent = ({ interfaceId }) => { - const state = useInterfaceStore((s) => s.interfaces[interfaceId].source.state); - const publish = useInterfaceStore((s) => (s.interfaces[interfaceId].source as LocalRemoteInterfaceSource).publish); - - return ( -
-

Local {JSON.stringify(state)}

- -
- ); -}; diff --git a/src/remotePlugin/interface/remoteSource.tsx b/src/remotePlugin/interface/remoteSource.tsx deleted file mode 100644 index fd5502b..0000000 --- a/src/remotePlugin/interface/remoteSource.tsx +++ /dev/null @@ -1,141 +0,0 @@ -import { FunctionComponent } from "react"; -import { CommonRemoteInterfaceSource, RemoteInterfaceSourceFactory } from "./store"; -import { BeadiMessage, handleMessage, sendMessage } from "../message"; -import _ from "lodash"; - -type RemoteControlStoreState = - | { - state: "disconnected"; - } - | { - state: "connecting"; - socket: WebSocket; - code: string; - } - | { - state: "connected"; - socket: WebSocket; - code: string; - // endpoints: Record; - }; - -export type RemoteRemoteInterfaceSource = CommonRemoteInterfaceSource<"remote"> & { - state: RemoteControlStoreState; -}; -type RemoteFactoryProps = { - code: string; -}; -export const remoteSourceFactory: RemoteInterfaceSourceFactory = ( - props, - updateInterface, - getInterface -) => { - const socket = new WebSocket(`ws://localhost:6969/control/${props.code}`); - - socket.addEventListener("open", (event) => { - console.log("WebSocket Opened: ", event); - }); - socket.addEventListener("close", (event) => { - console.log("WebSocket closed: ", event); - - updateInterface((draft) => { - draft.source.state = { state: "disconnected" }; - }); - }); - socket.addEventListener("message", (event) => { - console.log("WebSocket message: ", event); - try { - const data: BeadiMessage = JSON.parse(event.data); - handleMessage(data, { - WelcomeController: (payload) => { - updateInterface((draft) => { - draft.source.state = { - state: "connected", - code: props.code, - socket: socket, - }; - draft.values = _.keyBy( - payload.endpoints.map((endp) => ({ - valueId: endp.id, - value: endp.value, - localValue: endp.value, - })), - (e) => e.valueId - ); - draft.widgets = payload.endpoints.map((endp) => ({ - settings: { - valueId: endp.id, - }, - type: "slider", - widgetId: `${new Date().getTime()}`, - })); - }); - }, - PublishEndpoints: (payload) => { - console.log("PublishEndpoints: ", payload); - updateInterface((draft) => { - draft.values = _.keyBy( - payload.endpoints.map((endp) => ({ - valueId: endp.id, - value: endp.value, - localValue: endp.value, - })), - (e) => e.valueId - ); - draft.widgets = payload.endpoints.map((endp) => ({ - settings: { - valueId: endp.id, - }, - type: "slider", - widgetId: `${new Date().getTime()}`, - })); - }); - }, - ValueChanged: ({ endpoint, value }) => { - updateInterface((draft) => { - draft.values[endpoint].localValue = value; - draft.values[endpoint].value = value; - }); - }, - }); - } catch (e) { - console.error(e); - console.error("Error occurred while reading message: ", event); - } - }); - - return { - type: "remote", - destroy: () => { - if (getInterface().source.state.state === "connected") { - socket.close(); - } - }, - updateValue: (valueId, value) => { - if (getInterface().source.state.state === "connected") { - sendMessage(socket, { - ValueChanged: { - endpoint: valueId, - value: value, - }, - }); - } - }, - state: { - state: "connecting", - socket, - code: props.code, - }, - }; -}; - -type RemoteSourceDisplayProps = { - interfaceId: string; -}; -export const RemoteSourceDisplay: FunctionComponent = ({ interfaceId }) => { - return ( -
-

Remote

-
- ); -}; diff --git a/src/remotePlugin/interface/store.ts b/src/remotePlugin/interface/store.ts deleted file mode 100644 index 34a6210..0000000 --- a/src/remotePlugin/interface/store.ts +++ /dev/null @@ -1,90 +0,0 @@ -import produce, { Draft } from "immer"; -import create from "zustand"; -import { LocalRemoteInterfaceSource, localSourceFactory } from "./localSource"; -import { remoteSourceFactory } from "./remoteSource"; - -// ==== INTERFACE SOURCE ==== -export type CommonRemoteInterfaceSource = { - destroy: () => void; - updateValue: (valueId: string, value: any) => void; - type: TType; -}; - -export type RemoteInterfaceSourceFactory> = ( - props: TProps, - updateInterface: (recipe: (draft: Draft>) => void) => void, - getInterface: () => RemoteInterface -) => T; - -const interfaceSources = { - local: localSourceFactory, - remote: remoteSourceFactory, -} as const; -type AnyRemoteInterfaceSource = ReturnType<(typeof interfaceSources)[keyof typeof interfaceSources]>; - -// ===== INTERFACE STORE ==== - -type RemoteInterfaceValue = { - valueId: string; - value: T; - localValue: T; -}; -export type RemoteInterfaceWidget = { - widgetId: string; - type: string; - settings: any; -}; -export interface RemoteInterface> { - id: string; - //=== VALUES === - values: Record>; - - // === WIDGETS === - widgets: RemoteInterfaceWidget[]; - - source: TSource; -} - -type InterfaceStore = { - interfaces: Record>; - - addInterface: ( - sourceType: TSourceType, - props: Parameters<(typeof interfaceSources)[TSourceType]>[0] - ) => string; -}; - -export const useInterfaceStore = create()((set, get) => ({ - interfaces: {}, - - addInterface: (sourceType, props) => { - const id = `${new Date().getTime()}`; - - const source = interfaceSources[sourceType]( - //Any case because this is ensured through the generics of this function - props as any, - (recipe) => { - set((s) => - produce(s, (draft) => { - //Any cast because we know that draft.interfaces[id] has the right type because we are just setting it down below - recipe(draft.interfaces[id] as any); - }) - ); - }, - //Any cast because we know that draft.interfaces[id] has the right type because we are just setting it down below - () => get().interfaces[id] as any - ); - - set((s) => - produce(s, (draft) => { - draft.interfaces[id] = { - id, - values: {}, - widgets: [], - source, - }; - }) - ); - return id; - }, -})); diff --git a/src/remotePlugin/interface/stores.ts b/src/remotePlugin/interface/stores.ts new file mode 100644 index 0000000..5f6a040 --- /dev/null +++ b/src/remotePlugin/interface/stores.ts @@ -0,0 +1,155 @@ +import produce from "immer"; +import create from "zustand"; +import { persist } from "zustand/middleware"; +import { diffBy } from "../../utils/diffBy"; +import _ from "lodash"; + +type InterfaceDisplayDef = { + interfaceId: string; + brokerType: string; + brokerSettings: any; +}; +type InterfaceDisplayStore = { + interfaces: Record; + + /** Local Interfaces are synced from the files tore */ + addRemoteInterface: (brokerSettings?: any) => void; +}; +/** Make mutations to the displayed interfaces on this store, that gets synced into useInterfaceDisplayStateStore, read from there */ +export const useInterfaceDisplayStore = create()( + persist( + (set, get) => ({ + interfaces: {}, + + addRemoteInterface: (settings) => { + const interfaceId = `${new Date().getTime()}`; + set((s) => + produce(s, (draft) => { + draft.interfaces[interfaceId] = { + interfaceId: interfaceId, + brokerType: "remote", + brokerSettings: settings ?? {}, + }; + }) + ); + }, + }), + { + name: "interfaceDisplay", + getStorage: () => window.sessionStorage, + version: 1, + } + ) +); + +type Widget = { + widgetId: string; + widgetType: string; +}; +type Interface = { + name: string; + interfaceId: string; + layout: Widget[]; +}; +//TODO This has to be merged into the save file +type InterfaceFileStore = { + interfaces: Record; + addInterface: () => void; +}; +export const useInterfaceFileStore = create()( + persist( + (set, get) => ({ + interfaces: {}, + addInterface: () => { + const interfaceId = `${new Date().getTime()}`; + set((s) => + produce(s, (draft) => { + draft.interfaces[interfaceId] = { + interfaceId: interfaceId, + layout: [], + name: "New Interface", + }; + }) + ); + }, + }), + { + name: "interfaceFile", + getStorage: () => window.localStorage, + version: 1, + } + ) +); + +type InterfaceDisplayValueState = { + valueId: string; + value: any; +}; +type InterfaceDisplayState = { + interfaceId: string; + layout: Widget[]; + values: Record; + brokerState: any; + brokerType: string; +}; +type InterfaceDisplayStateStore = { + interfaces: Record; +}; +export const useInterfaceDisplayStateStore = create()((set, get) => ({ + interfaces: {}, +})); + +export function setupInterfaceListeners() { + console.log("Setup Interface Listeners"); + + const syncInterfaceDisplayStateStore = (state: InterfaceDisplayStore) => { + const oldStateStore = useInterfaceDisplayStateStore.getState(); + const { extra, missing } = diffBy(Object.keys(oldStateStore.interfaces), Object.keys(state.interfaces)); + + useInterfaceDisplayStateStore.setState((s) => + produce(s, (draft) => { + for (const extraKey in extra) { + //TODO Close up the broker. + delete draft.interfaces[extraKey]; + } + for (const missingKey in missing) { + const interfaceDef = state.interfaces[missingKey]; + //TODO Open up the broker. + draft.interfaces[missingKey] = { + brokerType: interfaceDef.brokerType, + brokerState: {}, + interfaceId: missingKey, + layout: [], + values: {}, + }; + } + }) + ); + }; + useInterfaceDisplayStore.subscribe(syncInterfaceDisplayStateStore); + syncInterfaceDisplayStateStore(useInterfaceDisplayStore.getState()); + + const syncLocalInterfacesFromFileStore = (state: InterfaceFileStore) => { + const existingLocalInterfaces = _.pickBy(useInterfaceDisplayStore.getState().interfaces, (s) => s.brokerType === "local"); + const { extra, missing } = diffBy(Object.keys(existingLocalInterfaces), Object.keys(state.interfaces)); + + useInterfaceDisplayStore.setState((s) => + produce(s, (draft) => { + for (const extraKey in extra) { + delete draft.interfaces[extraKey]; + } + for (const missingKey in missing) { + draft.interfaces[missingKey] = { + brokerSettings: {}, + brokerType: "local", + interfaceId: missingKey, + }; + } + }) + ); + }; + useInterfaceFileStore.subscribe(syncLocalInterfacesFromFileStore); + syncLocalInterfacesFromFileStore(useInterfaceFileStore.getState()); +} + +setupInterfaceListeners(); diff --git a/src/remotePlugin/interface/widget.ts b/src/remotePlugin/interface/widget.ts index a81a998..26d2c67 100644 --- a/src/remotePlugin/interface/widget.ts +++ b/src/remotePlugin/interface/widget.ts @@ -1,5 +1,4 @@ import { ComponentType, FunctionComponent, useCallback } from "react"; -import { useInterfaceStore } from "./store"; export type RemoteWidgetProps = { settings: TSettings; @@ -26,26 +25,3 @@ type WidgetValueHandle = null | { localValue: T; onChange: (value: T) => void; }; -export function useWidgetValueHandle(valueId: string, interfaceId: string): WidgetValueHandle { - const value = useInterfaceStore((s) => s.interfaces[interfaceId]?.values?.[valueId]); - // const value = useRemoteValueStore((s) => s.sources[valuePath.sourceId]?.values[valuePath.valueId]); - - const updateValue = useInterfaceStore((s) => s.interfaces[interfaceId]?.source?.updateValue); - - const onChange = useCallback( - (value: any) => { - updateValue(valueId, value); - }, - [updateValue, valueId] - ); - - if (value !== undefined) { - return { - onChange, - value: value.value, - localValue: value.localValue, - }; - } else { - return null; - } -} diff --git a/src/remotePlugin/registry.ts b/src/remotePlugin/registry.ts index adaa295..a0a3562 100644 --- a/src/remotePlugin/registry.ts +++ b/src/remotePlugin/registry.ts @@ -1,6 +1,6 @@ import { AnyRemoteWidgetDef, RemoteWidgetDef } from "./interface/widget"; -import { sliderWidgetDef } from "./widgets/SliderWidget"; +// import { sliderWidgetDef } from "./widgets/SliderWidget"; -const remoteWidgetsList: AnyRemoteWidgetDef[] = [sliderWidgetDef]; +const remoteWidgetsList: AnyRemoteWidgetDef[] = []; export const remoteWidgets: Record = Object.assign({}, ...remoteWidgetsList.map((it) => ({ [it.id]: it }))); diff --git a/src/remotePlugin/remote/ConnectionManager.tsx b/src/remotePlugin/remote/ConnectionManager.tsx new file mode 100644 index 0000000..a4b80bd --- /dev/null +++ b/src/remotePlugin/remote/ConnectionManager.tsx @@ -0,0 +1,57 @@ +import { FunctionComponent, useState } from "react"; +import { useRemoteStateStore, useRemoteStore } from "./store"; +import { TextInput } from "../../components/input/TextInput"; +import { Button } from "../../components/input/Button"; + +type RemoteConnectionDisplayProps = { + remoteConnectionId: string; +}; +export const RemoteConnectionDisplay: FunctionComponent = ({ remoteConnectionId }) => { + const connectionState = useRemoteStateStore((s) => s.remotes[remoteConnectionId]); + + return
{JSON.stringify(connectionState)}
; +}; + +type RemoteConnectionFormProps = {}; +export const RemoteConnectionForm: FunctionComponent = ({}) => { + const addConnection = useRemoteStore((s) => s.addConnection); + const [code, setCode] = useState(""); + + const connect = () => { + addConnection({ + code: code.trim(), + }); + setCode(""); + }; + + return ( +
+ + +
+ ); +}; + +type ConnectionManagerProps = {}; +export const ConnectionManager: FunctionComponent = ({}) => { + const remoteStore = useRemoteStateStore((s) => Object.values(s.remotes)); + + const removeConnection = useRemoteStore((s) => s.removeConnection); + + return ( +
+
    + {remoteStore.map((s) => ( +
  • + Connection to {s.definition.code} + + {JSON.stringify(s.state)} +
  • + ))} +
+ +
+ ); +}; diff --git a/src/remotePlugin/remote/store.ts b/src/remotePlugin/remote/store.ts new file mode 100644 index 0000000..e64df2e --- /dev/null +++ b/src/remotePlugin/remote/store.ts @@ -0,0 +1,173 @@ +import create from "zustand"; +import { diffBy, diffByKeys } from "../../utils/diffBy"; +import produce, { Draft } from "immer"; +import { BeadiMessage, handleMessage } from "../message"; +import { immer } from "zustand/middleware/immer"; +import { persist } from "zustand/middleware"; + +type RemoteConnection = { + remoteConnectionId: string; + code: string; +}; +export type RemoteStore = { + remotes: Record; + addConnection: (connection: Omit) => void; + removeConnection: (connectionId: string) => void; +}; +export const useRemoteStore = create( + persist( + immer((set, get) => ({ + remotes: {}, + addConnection: (connection) => { + const id = `${new Date().getTime()}`; + set((draft) => { + draft.remotes[id] = { + ...connection, + remoteConnectionId: id, + }; + }); + }, + removeConnection: (id) => { + set((draft) => { + delete draft.remotes[id]; + }); + }, + })), + { + name: "remoteConnections", + getStorage: () => window.sessionStorage, + } + ) +); + +type RemoteConnectionValue = { + valueId: string; + value: any; +}; +type RemoteConnectionState = + | { + state: "disconnected"; + } + | { + state: "connecting"; + socket: WebSocket; + id: string; + } + | { + state: "connected"; + socket: WebSocket; + id: string; + values: Record; + }; + +export type RemoteConnectionHandle = { + state: RemoteConnectionState; + definition: RemoteConnection; + close: () => void; +}; + +export type RemoteStateStore = { + remotes: Record; +}; +export const useRemoteStateStore = create()((set, get) => ({ + remotes: {}, +})); + +type Setter = (recipe: (draft: Draft) => void | RemoteConnectionState) => void; +function openRemoteConnection(connection: RemoteConnection, set: Setter): RemoteConnectionHandle { + console.log("Opening Remote Socket ", connection.code); + const socket = new WebSocket(`ws://localhost:6969/control/${connection.code}`); + + socket.addEventListener("open", (event) => { + console.log("WebSocket Opened: ", event); + }); + socket.addEventListener("close", (event) => { + console.log("WebSocket closed: ", event); + set((s) => ({ state: "disconnected" })); + }); + socket.addEventListener("message", (event) => { + console.log("WebSocket message: ", event); + try { + const data: BeadiMessage = JSON.parse(event.data); + handleMessage(data, { + WelcomeController: (payload) => { + set((s) => ({ + state: "connected", + id: payload.id, + socket: socket, + values: Object.assign( + {}, + ...payload.endpoints.map((it) => ({ + [it.id]: it, + })) + ), + })); + }, + PublishEndpoints: (payload) => { + set((draft) => { + if (draft.state === "connected") { + draft.values = Object.assign( + {}, + ...payload.endpoints.map((it) => ({ + [it.id]: it, + })) + ); + } + }); + }, + ValueChanged: ({ endpoint, value }) => { + set((draft) => { + if (draft.state === "connected") { + if (endpoint in draft.values) { + draft.values[endpoint].value = value; + } + } + }); + }, + }); + } catch (e) { + console.error("Unreadable message: ", event); + } + }); + + return { + state: { state: "connecting", socket, id: connection.code }, + definition: connection, + close: () => { + console.log("Closing Remote Socket ", connection.code); + socket.close(); + }, + }; +} + +function startSyncRemoteStateStore() { + console.log("Start syncRemoteStateStore"); + const syncRemoteStateStore = (state: RemoteStore) => { + const oldRemotes = useRemoteStateStore.getState().remotes; + const { missing, extra } = diffByKeys(oldRemotes, state.remotes); + + useRemoteStateStore.setState((s) => + produce(s, (draft) => { + for (const extraKey in extra) { + draft.remotes[extraKey].close(); + delete draft.remotes[extraKey]; + } + for (const missingKey in missing) { + draft.remotes[missingKey] = openRemoteConnection(missing[missingKey], (recipe) => { + useRemoteStateStore.setState((s) => + produce(s, (draft) => { + const result = recipe(draft.remotes[missingKey].state); + if (result !== undefined) { + draft.remotes[missingKey].state = result; + } + }) + ); + }); + } + }) + ); + }; + useRemoteStore.subscribe(syncRemoteStateStore); + syncRemoteStateStore(useRemoteStore.getState()); +} +startSyncRemoteStateStore(); diff --git a/src/remotePlugin/widgets/SliderWidget.tsx b/src/remotePlugin/widgets/SliderWidget.tsx.off similarity index 100% rename from src/remotePlugin/widgets/SliderWidget.tsx rename to src/remotePlugin/widgets/SliderWidget.tsx.off diff --git a/src/utils/diffBy.ts b/src/utils/diffBy.ts new file mode 100644 index 0000000..ec63a76 --- /dev/null +++ b/src/utils/diffBy.ts @@ -0,0 +1,41 @@ +import _ from "lodash"; + +type DiffByResult = { + extra: TKey[]; + missing: TKey[]; +}; +/** + * Creates a two way difference of base and changed. + * + * See the following Venn-Diagram + * BASE CHANGED + * / X \ + * ( ( ) ) + * | | + * extra missing + * @param baseKeys + * @param changedKeys + * @returns + */ +export function diffBy(baseKeys: TKey[], changedKeys: TKey[]): DiffByResult { + console.log("Diffing: Base ", baseKeys, " Changed ", changedKeys); + const inBaseNotInChanged = _.difference(baseKeys, changedKeys); + const inChangedNotInBase = _.difference(changedKeys, baseKeys); + return { + extra: inBaseNotInChanged, + missing: inChangedNotInBase, + }; +} + +type DiffByKeysResult = { + extra: Record; + missing: Record; +}; +export function diffByKeys(base: Record, changed: Record): DiffByKeysResult { + console.log("Diffing: Base ", base, " Changed ", changed); + const { extra, missing } = diffBy(Object.keys(base), Object.keys(changed)); + return { + extra: _.pick(base, extra) as Record, + missing: _.pick(changed, missing) as Record, + }; +} From 4a9883033ee9f1f4ebe7a18418bf5b3d442e9596 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Thu, 27 Jul 2023 13:51:50 +0200 Subject: [PATCH 019/109] replaced publish store with state-machine --- src/remotePlugin/RemoteDrawerPage.tsx | 4 + src/remotePlugin/inputOutputStore.ts | 4 +- src/remotePlugin/publish/PublishManager.tsx | 27 ++++ src/remotePlugin/publish/store.ts | 152 ++++++++++++++++++++ 4 files changed, 185 insertions(+), 2 deletions(-) create mode 100644 src/remotePlugin/publish/PublishManager.tsx create mode 100644 src/remotePlugin/publish/store.ts diff --git a/src/remotePlugin/RemoteDrawerPage.tsx b/src/remotePlugin/RemoteDrawerPage.tsx index 21b2dd0..3b10d73 100644 --- a/src/remotePlugin/RemoteDrawerPage.tsx +++ b/src/remotePlugin/RemoteDrawerPage.tsx @@ -7,6 +7,7 @@ import { Button } from "../components/input/Button"; import { InterfaceList } from "./interface/InterfaceList"; import { useInterfaceDisplayStore, useInterfaceFileStore } from "./interface/stores"; import { ConnectionManager } from "./remote/ConnectionManager"; +import { PublishManager } from "./publish/PublishManager"; const RemoteSettingsTab: FunctionComponent<{}> = () => { const addRemoteInterface = useInterfaceDisplayStore((s) => s.addRemoteInterface); @@ -14,6 +15,9 @@ const RemoteSettingsTab: FunctionComponent<{}> = () => { return ( <> +
+ +
diff --git a/src/remotePlugin/inputOutputStore.ts b/src/remotePlugin/inputOutputStore.ts index 95455ea..a60b346 100644 --- a/src/remotePlugin/inputOutputStore.ts +++ b/src/remotePlugin/inputOutputStore.ts @@ -16,13 +16,13 @@ type IOValueStore = { values: Record>; /** Send value update request */ - updateValue: (valueId: string, value: any) => void; + setValue: (valueId: string, value: any) => void; }; /** Used by all input-/outputAdapters to push/pull their values from/to */ export const useIOValueStore = create()((set, get) => ({ values: {}, - updateValue: (id, value) => { + setValue: (id, value) => { set((s) => produce(s, (draft) => { draft.values[id].value = value; diff --git a/src/remotePlugin/publish/PublishManager.tsx b/src/remotePlugin/publish/PublishManager.tsx new file mode 100644 index 0000000..4456725 --- /dev/null +++ b/src/remotePlugin/publish/PublishManager.tsx @@ -0,0 +1,27 @@ +import { FunctionComponent } from "react"; +import { usePublishStateStore } from "./store"; +import { Button } from "../../components/input/Button"; + +type PublishManagerProps = {}; +export const PublishManager: FunctionComponent = ({}) => { + const state = usePublishStateStore((s) => s.state); + + return ( +
+
+ {state.state} {state.state === "connected" && {state.id}} +
+ {state.state !== "disconnected" ? ( + + ) : ( + + )} +
+ ); +}; diff --git a/src/remotePlugin/publish/store.ts b/src/remotePlugin/publish/store.ts new file mode 100644 index 0000000..279ad8e --- /dev/null +++ b/src/remotePlugin/publish/store.ts @@ -0,0 +1,152 @@ +import produce, { Draft } from "immer"; +import create from "zustand"; +import { persist } from "zustand/middleware"; +import { immer } from "zustand/middleware/immer"; +import { BeadiMessage, handleMessage, sendMessage } from "../message"; +import { useIOValueStore } from "../inputOutputStore"; + +function makeDisconnectedState(set: Setter, get: Getter): PublishConnectionState & { state: "disconnected" } { + return { + state: "disconnected", + updateValue: (valueId, value) => { + console.log("Updating value ", valueId, " to ", value, " on disconnected socket"); + }, + publish: () => { + publish(set, get); + }, + }; +} +function makeConnectingState(socket: WebSocket): PublishConnectionState & { state: "connecting" } { + return { + state: "connecting", + close: () => { + socket.close(); + }, + socket, + updateValue: (valueId, value) => { + console.log("Updating value ", valueId, " to ", value, " on connecting socket"); + }, + }; +} +function makeConnectedState(socket: WebSocket, id: string): PublishConnectionState & { state: "connected" } { + return { + state: "connected", + close: () => { + socket.close(); + }, + id, + socket, + updateValue: (valueId, value) => { + console.log("Updating value ", valueId, " to ", value, " on connected socket"); + }, + }; +} + +type PublishConnectionState = + | { + state: "disconnected"; + updateValue: (valueId: string, value: any) => void; + publish: () => void; + } + | { + state: "connecting"; + socket: WebSocket; + close: () => void; + updateValue: (valueId: string, value: any) => void; + } + | { + state: "connected"; + socket: WebSocket; + id: string; + close: () => void; + updateValue: (valueId: string, value: any) => void; + }; +type PublishStateStore = { + state: PublishConnectionState; +}; +export const usePublishStateStore = create()((set, get) => ({ + state: makeDisconnectedState((recipe) => set((s) => produce(s, recipe)), get), + close: () => {}, +})); + +type Setter = (recipe: (draft: Draft) => void | PublishStateStore) => void; +type Getter = () => PublishStateStore; +function publish(set: Setter, get: Getter): void { + const socket = new WebSocket("ws://localhost:6969/publish"); + + socket.addEventListener("open", (event) => { + console.log("WebSocket Opened: ", event); + }); + socket.addEventListener("close", (event) => { + console.log("WebSocket closed: ", event); + + const old = get().state; + set((s) => { + s.state = makeDisconnectedState(set, get); + }); + if (old.state !== "disconnected") { + old.close(); + } + }); + socket.addEventListener("message", (event) => { + console.log("WebSocket message: ", event); + try { + const data: BeadiMessage = JSON.parse(event.data); + handleMessage(data, { + Welcome: (payload) => { + set((s) => { + s.state = makeConnectedState(socket, payload.id); + }); + sendMessage(socket, { + PublishEndpoints: { + endpoints: Object.values(useIOValueStore.getState().values).map((v) => ({ + id: v.valueId, + type: v.type, + value: v.value, + })), + }, + }); + }, + PublishEndpoints: (payload) => { + console.log("TODO Compare payload endpoints to actually published endpoints and warn if they diverge"); + }, + ValueChanged: ({ endpoint, value }) => { + console.log("ValueChanged request got to Set ", endpoint, " to ", value); + + useIOValueStore.getState().setValue(endpoint, value); + }, + }); + } catch (e) { + console.error("Unreadable message: ", event); + } + }); + + set((s) => { + s.state = makeConnectingState(socket); + }); +} + +// export function startSyncPublishConnectionState() { +// const syncToState = (state: PublishStore) => { +// const oldState = usePublishStateStore.getState(); + +// const oldConnectionState = oldState.state; +// const oldIsConnected = oldConnectionState.state === "connecting" || oldConnectionState.state === "connected"; +// if (oldIsConnected && !state.published) { +// //Disconnect +// oldConnectionState.close(); +// } +// if (!oldIsConnected && state.published) { +// //Connect +// usePublishStateStore.setState( +// publish((recipe) => { +// usePublishStateStore.setState((s) => produce(s, recipe)); +// }, usePublishStateStore.getState) +// ); +// } +// }; + +// usePublishStore.subscribe(syncToState); +// syncToState(usePublishStore.getState()); +// } +// startSyncPublishConnectionState(); From e9dd95a24fd7f140e9f6043e4eaecbe56cbd8731 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Thu, 27 Jul 2023 15:26:21 +0200 Subject: [PATCH 020/109] add interface editor --- src/remotePlugin/interface/Interface.tsx | 15 +- .../interface/InterfaceEditor.tsx | 32 +++- src/remotePlugin/interface/stores.ts | 141 +++++++++++++++--- src/remotePlugin/publish/store.ts | 2 + src/remotePlugin/remote/store.ts | 3 +- ...{SliderWidget.tsx.off => SliderWidget.tsx} | 43 +++--- src/utils/diffBy.ts | 23 ++- 7 files changed, 212 insertions(+), 47 deletions(-) rename src/remotePlugin/widgets/{SliderWidget.tsx.off => SliderWidget.tsx} (68%) diff --git a/src/remotePlugin/interface/Interface.tsx b/src/remotePlugin/interface/Interface.tsx index 06238a7..275c772 100644 --- a/src/remotePlugin/interface/Interface.tsx +++ b/src/remotePlugin/interface/Interface.tsx @@ -1,5 +1,6 @@ import { FunctionComponent } from "react"; import { useInterfaceDisplayStateStore } from "./stores"; +import { SliderWidget } from "../widgets/SliderWidget"; type InterfaceProps = { interfaceId: string; @@ -7,5 +8,17 @@ type InterfaceProps = { export const Interface: FunctionComponent = ({ interfaceId }) => { const interfaceState = useInterfaceDisplayStateStore((s) => s.interfaces[interfaceId]); - return
{JSON.stringify(interfaceState)}
; + return ( +
+ {JSON.stringify(interfaceState)} + +
    + {interfaceState.layout.map((it) => ( +
  • + +
  • + ))} +
+
+ ); }; diff --git a/src/remotePlugin/interface/InterfaceEditor.tsx b/src/remotePlugin/interface/InterfaceEditor.tsx index a18f80f..144ee0c 100644 --- a/src/remotePlugin/interface/InterfaceEditor.tsx +++ b/src/remotePlugin/interface/InterfaceEditor.tsx @@ -1,5 +1,7 @@ import { FunctionComponent } from "react"; import { useInterfaceFileStore } from "./stores"; +import { Button } from "../../components/input/Button"; +import { SliderWidget, SliderWidgetSettingsEditor } from "../widgets/SliderWidget"; type InterfaceEditorProps = { interfaceId: string; @@ -7,6 +9,34 @@ type InterfaceEditorProps = { export const InterfaceEditor: FunctionComponent = ({ interfaceId }) => { const iface = useInterfaceFileStore((s) => s.interfaces[interfaceId]); + const updateInterface = useInterfaceFileStore((s) => s.updateInterface); - return
Editor for "{iface.name}"
; + const addSlider = () => { + const id = `${new Date().getTime()}`; + updateInterface(interfaceId, (draft) => { + draft.layout.push({ + settings: {}, + widgetId: id, + widgetType: "slider", + }); + }); + }; + + return ( +
+
Editor for "{iface.name}"
; +
    + {iface.layout.map((it) => ( +
  • + +
  • + ))} +
+ +
+ ); }; diff --git a/src/remotePlugin/interface/stores.ts b/src/remotePlugin/interface/stores.ts index 5f6a040..42e5fbd 100644 --- a/src/remotePlugin/interface/stores.ts +++ b/src/remotePlugin/interface/stores.ts @@ -1,14 +1,28 @@ -import produce from "immer"; +import produce, { Draft } from "immer"; import create from "zustand"; import { persist } from "zustand/middleware"; -import { diffBy } from "../../utils/diffBy"; +import { diffBy, diffByKeys } from "../../utils/diffBy"; import _ from "lodash"; +import { useCallback } from "react"; +import { usePublishStateStore } from "../publish/store"; +import { useIOValueStore } from "../inputOutputStore"; +import { useRemoteStateStore } from "../remote/store"; +import { remoteInputAdapter } from "../inputAdapter"; type InterfaceDisplayDef = { interfaceId: string; - brokerType: string; - brokerSettings: any; -}; +} & ( + | { + brokerType: "remote"; + brokerSettings: { + remoteId: string; + }; + } + | { + brokerType: "local"; + brokerSettings: {}; + } +); type InterfaceDisplayStore = { interfaces: Record; @@ -16,8 +30,8 @@ type InterfaceDisplayStore = { addRemoteInterface: (brokerSettings?: any) => void; }; /** Make mutations to the displayed interfaces on this store, that gets synced into useInterfaceDisplayStateStore, read from there */ -export const useInterfaceDisplayStore = create()( - persist( +export const useInterfaceDisplayStore = create( + persist( (set, get) => ({ interfaces: {}, @@ -45,6 +59,7 @@ export const useInterfaceDisplayStore = create()( type Widget = { widgetId: string; widgetType: string; + settings: any; }; type Interface = { name: string; @@ -55,6 +70,7 @@ type Interface = { type InterfaceFileStore = { interfaces: Record; addInterface: () => void; + updateInterface: (interfaceId: string, recipe: (draft: Draft) => void) => void; }; export const useInterfaceFileStore = create()( persist( @@ -72,6 +88,13 @@ export const useInterfaceFileStore = create()( }) ); }, + updateInterface: (interfaceId, recipe) => { + set((s) => + produce(s, (draft) => { + recipe(draft.interfaces[interfaceId]); + }) + ); + }, }), { name: "interfaceFile", @@ -91,6 +114,8 @@ type InterfaceDisplayState = { values: Record; brokerState: any; brokerType: string; + updateValue: (valueId: string, value: any) => void; + closeBroker: () => void; }; type InterfaceDisplayStateStore = { interfaces: Record; @@ -99,29 +124,92 @@ export const useInterfaceDisplayStateStore = create( interfaces: {}, })); +type Setter = (recipe: (draft: Draft) => void) => void; +type Getter = () => InterfaceDisplayState; +function createRemoteBrokeredInterface( + def: InterfaceDisplayDef & { brokerType: "remote" }, + set: Setter +): InterfaceDisplayState & { brokerType: "remote" } { + const unsubscribeIO = useRemoteStateStore.subscribe((s) => { + const remoteState = s.remotes[def.brokerSettings.remoteId].state; + if (remoteState.state === "connected") { + set((draft) => { + draft.values = remoteState.values; + }); + } + }); + return { + brokerType: "remote", + brokerState: {}, + interfaceId: def.interfaceId, + layout: [], + values: {}, + updateValue: (valueId, value) => { + console.log("Remotely updating ", valueId, " to ", value); + }, + closeBroker: () => { + unsubscribeIO(); + }, + }; +} +function createLocalBrokeredInterface( + def: InterfaceDisplayDef & { brokerType: "local" }, + set: Setter +): InterfaceDisplayState & { brokerType: "local" } { + const unsubscribeIO = useIOValueStore.subscribe((s) => { + set((draft) => { + draft.values = s.values; + }); + }); + const unsubscribeInterfaceFile = useInterfaceFileStore.subscribe((s) => { + set((draft) => { + draft.layout = s.interfaces[def.interfaceId].layout; + }); + }); + + return { + brokerType: "local", + brokerState: {}, + interfaceId: def.interfaceId, + layout: useInterfaceFileStore.getState().interfaces[def.interfaceId].layout, + values: useIOValueStore.getState().values, + updateValue: (valueId, value) => { + console.log("Locally udpating ", valueId, " to ", value); + usePublishStateStore.getState().state.updateValue(valueId, value); + }, + closeBroker: () => { + unsubscribeIO(); + unsubscribeInterfaceFile(); + }, + }; +} + export function setupInterfaceListeners() { console.log("Setup Interface Listeners"); const syncInterfaceDisplayStateStore = (state: InterfaceDisplayStore) => { const oldStateStore = useInterfaceDisplayStateStore.getState(); - const { extra, missing } = diffBy(Object.keys(oldStateStore.interfaces), Object.keys(state.interfaces)); + const { extra, missing } = diffByKeys(oldStateStore.interfaces, state.interfaces); useInterfaceDisplayStateStore.setState((s) => produce(s, (draft) => { for (const extraKey in extra) { //TODO Close up the broker. + draft.interfaces[extraKey].closeBroker(); delete draft.interfaces[extraKey]; } for (const missingKey in missing) { - const interfaceDef = state.interfaces[missingKey]; - //TODO Open up the broker. - draft.interfaces[missingKey] = { - brokerType: interfaceDef.brokerType, - brokerState: {}, - interfaceId: missingKey, - layout: [], - values: {}, + const interfaceDef = missing[missingKey]; + + const set: Setter = (recipe) => { + useInterfaceDisplayStateStore.setState((s) => produce(s, (draft) => recipe(draft.interfaces[missingKey]))); }; + //TODO Open up the broker. + if (interfaceDef.brokerType === "local") { + draft.interfaces[missingKey] = createLocalBrokeredInterface(interfaceDef, set); + } else { + draft.interfaces[missingKey] = createRemoteBrokeredInterface(interfaceDef, set); + } } }) ); @@ -131,7 +219,7 @@ export function setupInterfaceListeners() { const syncLocalInterfacesFromFileStore = (state: InterfaceFileStore) => { const existingLocalInterfaces = _.pickBy(useInterfaceDisplayStore.getState().interfaces, (s) => s.brokerType === "local"); - const { extra, missing } = diffBy(Object.keys(existingLocalInterfaces), Object.keys(state.interfaces)); + const { extra, missing } = diffByKeys(existingLocalInterfaces, state.interfaces); useInterfaceDisplayStore.setState((s) => produce(s, (draft) => { @@ -153,3 +241,22 @@ export function setupInterfaceListeners() { } setupInterfaceListeners(); + +type WidgetValueHandle = { + value: T; + setValue: (n: T) => void; +}; +export function useWidgetValueHandle(valueId: string, interfaceId: string): WidgetValueHandle { + const iface = useInterfaceDisplayStateStore((s) => s.interfaces[interfaceId]); + const updateValue = iface.updateValue; + const setValue = useCallback( + (v: T) => { + updateValue(valueId, v); + }, + [valueId, updateValue] + ); + return { + value: iface.values[valueId].value, + setValue, + }; +} diff --git a/src/remotePlugin/publish/store.ts b/src/remotePlugin/publish/store.ts index 279ad8e..e14a420 100644 --- a/src/remotePlugin/publish/store.ts +++ b/src/remotePlugin/publish/store.ts @@ -10,6 +10,7 @@ function makeDisconnectedState(set: Setter, get: Getter): PublishConnectionState state: "disconnected", updateValue: (valueId, value) => { console.log("Updating value ", valueId, " to ", value, " on disconnected socket"); + useIOValueStore.getState().setValue(valueId, value); }, publish: () => { publish(set, get); @@ -25,6 +26,7 @@ function makeConnectingState(socket: WebSocket): PublishConnectionState & { stat socket, updateValue: (valueId, value) => { console.log("Updating value ", valueId, " to ", value, " on connecting socket"); + useIOValueStore.getState().setValue(valueId, value); }, }; } diff --git a/src/remotePlugin/remote/store.ts b/src/remotePlugin/remote/store.ts index e64df2e..5d77120 100644 --- a/src/remotePlugin/remote/store.ts +++ b/src/remotePlugin/remote/store.ts @@ -4,6 +4,7 @@ import produce, { Draft } from "immer"; import { BeadiMessage, handleMessage } from "../message"; import { immer } from "zustand/middleware/immer"; import { persist } from "zustand/middleware"; +import _ from "lodash"; type RemoteConnection = { remoteConnectionId: string; @@ -144,7 +145,7 @@ function startSyncRemoteStateStore() { console.log("Start syncRemoteStateStore"); const syncRemoteStateStore = (state: RemoteStore) => { const oldRemotes = useRemoteStateStore.getState().remotes; - const { missing, extra } = diffByKeys(oldRemotes, state.remotes); + const { missing, extra } = diffByKeys(oldRemotes, state.remotes, (a, b) => _.isEqual(a.definition, b)); useRemoteStateStore.setState((s) => produce(s, (draft) => { diff --git a/src/remotePlugin/widgets/SliderWidget.tsx.off b/src/remotePlugin/widgets/SliderWidget.tsx similarity index 68% rename from src/remotePlugin/widgets/SliderWidget.tsx.off rename to src/remotePlugin/widgets/SliderWidget.tsx index f8d8f91..1a771e4 100644 --- a/src/remotePlugin/widgets/SliderWidget.tsx.off +++ b/src/remotePlugin/widgets/SliderWidget.tsx @@ -1,8 +1,8 @@ import { ChangeEventHandler, FunctionComponent, useCallback, useState } from "react"; -import { RemoteWidgetDef, RemoteWidgetProps, RemoteWidgetSettingsProps, useWidgetValueHandle } from "../interface/widget"; +import { RemoteWidgetDef, RemoteWidgetProps, RemoteWidgetSettingsProps } from "../interface/widget"; import { Select } from "../../components/input/Select"; -import { useInterfaceStore } from "../interface/store"; import { useIOValueStore } from "../inputOutputStore"; +import { useInterfaceFileStore, useWidgetValueHandle } from "../interface/stores"; type SliderWidgetSettings = { valueId: string; @@ -10,15 +10,15 @@ type SliderWidgetSettings = { export const SliderWidget: FunctionComponent> = ({ settings, interfaceId }) => { const handle = useWidgetValueHandle(settings.valueId, interfaceId); - const [interactiveValue, setInteractiveValue] = useState(handle?.localValue ?? 0.0); + const [interactiveValue, setInteractiveValue] = useState(handle.value ?? 0.0); const [focused, setFocused] = useState(false); const setValue = (e: number) => { - handle?.onChange(e); + handle.setValue(e); setInteractiveValue(e); }; - const displayValue = focused ? interactiveValue : handle?.localValue ?? 0.0; + const displayValue = focused ? interactiveValue : handle.value ?? 0.0; if (handle === null) { return

Invalid widget

; @@ -33,7 +33,7 @@ export const SliderWidget: FunctionComponent { setFocused(true); - setInteractiveValue(handle?.localValue); + setInteractiveValue(handle.value); }} onBlur={() => setFocused(false)} onChange={(e) => setValue(parseFloat(e.target.value))} @@ -50,28 +50,19 @@ export const SliderWidgetSettingsEditor: FunctionComponent { const values = useIOValueStore((store) => Object.keys(store.values)); // const values = useInterfaceStore((it) => Object.keys(it.interfaces[interfaceId].values).map((valueId) => valueId)); - const save = useInterfaceStore((it) => { - const source = it.interfaces[interfaceId].source; - return source.type === "local" ? source.updateWidgets : null; - }); + const save = useInterfaceFileStore((it) => it.updateInterface); - const onChange = - save === null - ? null - : (e: string | null) => { - if (e !== null) { - save((draft) => { - const index = draft.findIndex((it) => it.widgetId === widgetId); - draft[index].settings = { - valueId: e, - } satisfies SliderWidgetSettings; - }); - } - }; + const onChange = (e: string | null) => { + if (e !== null) { + save(interfaceId, (draft) => { + const index = draft.layout.findIndex((it) => it.widgetId === widgetId); + draft.layout[index].settings = { + valueId: e, + } satisfies SliderWidgetSettings; + }); + } + }; - if (onChange === null) { - return
Invalid Widget
; - } return (
setState(parseFloat(e.target.value))} - > -
- ); -}; - -export const RemoteControlPage: FunctionComponent<{}> = ({}) => { - const { connect, disconnect, state } = useRemoteControlStore(); - const { id } = useParams(); - - //The store connect method debounces the id so this is fine... yet yucky - useEffect(() => { - if (id !== undefined) { - connect(id); - } else { - disconnect(); - } - }, [id, connect, disconnect]); - - if (state.state === "connecting") { - return

Connecting to {state.id}

; - } else if (state.state === "connected") { - return ( -
-

Remote Control for {state.id}

-
    - {Object.values(state.endpoints).map((endpoint) => ( - - ))} -
-
- ); - } - return

Disconnected.

; -}; diff --git a/src/components/remote/control/store.ts b/src/components/remote/control/store.ts deleted file mode 100644 index 275595a..0000000 --- a/src/components/remote/control/store.ts +++ /dev/null @@ -1,126 +0,0 @@ -import create from "zustand"; -import { BeadiMessage, RemoteControlEndpoint, handleMessage, sendMessage } from "../message"; -import produce from "immer"; - -type RemoteControlStoreState = - | { - state: "disconnected"; - } - | { - state: "connecting"; - socket: WebSocket; - id: string; - } - | { - state: "connected"; - socket: WebSocket; - id: string; - endpoints: Record; - }; -type RemoteControlStore = { - state: RemoteControlStoreState; - - connect: (id: string) => void; - disconnect: () => void; - setEndpointValue: (endpointId: string, value: number) => void; -}; - -export const useRemoteControlStore = create()((set, get) => ({ - state: { - state: "disconnected", - }, - endpoints: [], - connect: (id) => { - //If i'm connecting to another id, cancel the old id - { - const state = get().state; - if (state.state !== "disconnected") { - if (state.id === id) { - return; - } else { - get().disconnect(); - } - } - } - - console.log("Connecting to new websocket."); - const socket = new WebSocket(`ws://localhost:6969/control/${id}`); - set({ state: { state: "connecting", socket, id } }); - - socket.addEventListener("open", (event) => { - console.log("WebSocket Opened: ", event); - }); - socket.addEventListener("close", (event) => { - console.log("WebSocket closed: ", event); - set({ state: { state: "disconnected" } }); - }); - socket.addEventListener("message", (event) => { - console.log("WebSocket message: ", event); - try { - const data: BeadiMessage = JSON.parse(event.data); - handleMessage(data, { - WelcomeController: (payload) => { - set({ - state: { - state: "connected", - id: payload.id, - socket: socket, - endpoints: Object.assign( - {}, - ...payload.endpoints.map((it) => ({ - [it.id]: it, - })) - ), - }, - }); - }, - PublishEndpoints: (payload) => { - set((it) => - produce(it, (draft) => { - if (draft.state.state === "connected") { - draft.state.endpoints = Object.assign( - {}, - ...payload.endpoints.map((it) => ({ - [it.id]: it, - })) - ); - } - }) - ); - }, - ValueChanged: ({ endpoint, value }) => { - set((it) => - produce(it, (draft) => { - if (draft.state.state === "connected") { - if (endpoint in draft.state.endpoints) { - draft.state.endpoints[endpoint].value = value; - } - } - }) - ); - }, - }); - } catch (e) { - console.error("Unreadable message: ", event); - } - }); - }, - disconnect: () => { - const state = get().state; - if (state.state !== "disconnected") { - console.log("Disconnecting from websocket."); - state.socket.close(0, "Generic disconnect message from beadi."); - } - }, - setEndpointValue: (endpoint, value) => { - const state = get().state; - if (state.state === "connected") { - sendMessage(state.socket, { - ValueChanged: { - endpoint: endpoint, - value: value, - }, - }); - } - }, -})); diff --git a/src/components/remote/index.tsx b/src/components/remote/index.tsx deleted file mode 100644 index 9696d14..0000000 --- a/src/components/remote/index.tsx +++ /dev/null @@ -1,120 +0,0 @@ -import create, { useStore } from "zustand"; -import { BeadiMessage, RemoteControlEndpoint, handleMessage, sendMessage } from "./message"; -import _ from "lodash"; -import produce from "immer"; -import { useFileStore } from "../../engine/store"; -import { nodeDefs } from "../../registries"; - -type RemotePublishStoreState = - | { - state: "disconnected"; - } - | { - state: "connecting"; - socket: WebSocket; - } - | { - state: "connected"; - socket: WebSocket; - id: string; - }; -type RemotePublishStore = { - state: RemotePublishStoreState; - - endpoints: RemoteControlEndpoint[]; - - connect: () => void; - disconnect: () => void; - setEndpoints: (endpoints: RemoteControlEndpoint[]) => void; -}; - -export const useRemotePublishStore = create()((set, get) => ({ - state: { - state: "disconnected", - }, - endpoints: [], - connect: () => { - const socket = new WebSocket(`${process.env.REACT_APP_REMOTE_SERVER_URL}/publish`); - set({ state: { state: "connecting", socket } }); - - socket.addEventListener("open", (event) => { - console.log("WebSocket Opened: ", event); - }); - socket.addEventListener("close", (event) => { - console.log("WebSocket closed: ", event); - set({ state: { state: "disconnected" } }); - }); - socket.addEventListener("message", (event) => { - console.log("WebSocket message: ", event); - try { - const data: BeadiMessage = JSON.parse(event.data); - handleMessage(data, { - Welcome: (payload) => { - set({ - state: { - state: "connected", - id: payload.id, - socket: socket, - }, - }); - sendMessage(socket, { - PublishEndpoints: { endpoints: get().endpoints }, - }); - }, - PublishEndpoints: (payload) => { - set({ endpoints: payload.endpoints }); - }, - ValueChanged: ({ endpoint, value }) => { - console.log("Set ", endpoint, " to ", value); - set((it) => - produce(it, (draft) => { - const ep = draft.endpoints.find((it) => it.id === endpoint); - if (ep !== undefined) { - ep.value = value; - } - }) - ); - useFileStore.getState().setHandle(endpoint, "input__value", value); - }, - }); - } catch (e) { - console.error("Unreadable message: ", event); - } - }); - }, - disconnect: () => { - const state = get().state; - if (state.state !== "disconnected") { - state.socket.close(1000, "Generic disconnect message from beadi."); - } - }, - setEndpoints: (endpoints) => { - // console.log(get().endpoints, endpoints); - if (!_.isEqual(get().endpoints, endpoints)) { - const state = get().state; - if (state.state === "connected") { - sendMessage(state.socket, { - PublishEndpoints: { endpoints: endpoints }, - }); - //Update the state in handlemessage - } else { - set({ endpoints: endpoints }); - } - } - }, -})); - -useFileStore.subscribe((state, prevState) => { - const publishedEndpoints = Object.values(state.data.nodes) - .filter((node) => { - if (node.type !== undefined) { - return (nodeDefs[node.type]?.publishable ?? false) && ((node.data.displaySettings as any).published ?? false); - } - return false; - }) - .map((node) => { - const val = state.getHandle(node.id, "input__value"); - return { id: node.id, type: node.type!!, value: val }; - }); - useRemotePublishStore.getState().setEndpoints(publishedEndpoints); -}); diff --git a/src/components/remote/message.ts b/src/components/remote/message.ts deleted file mode 100644 index 4a193be..0000000 --- a/src/components/remote/message.ts +++ /dev/null @@ -1,49 +0,0 @@ -export type RemoteControlEndpoint = { - id: string; - type: string; - value: number; -}; - -export type BeadiMessage = { - Welcome?: { - id: string; - }; - PublishEndpoints?: { - endpoints: RemoteControlEndpoint[]; - }; - WelcomeController?: { - endpoints: RemoteControlEndpoint[]; - id: string; - }; - ValueChanged?: { - endpoint: string; - value: number; - }; -}; - -type BeadiMessageHandlers = { - [k in keyof BeadiMessage]?: (data: Required[k]) => void; -}; - -export function handleMessage( - message: BeadiMessage, - handlers: BeadiMessageHandlers -) { - for (const key in message) { - const k = key as keyof BeadiMessage; - if (k in handlers) { - const handler = handlers[k]; - if (handler !== undefined) { - handler(message[k] as any); - } - } - } -} - -export function sendMessage(socket: WebSocket, message: BeadiMessage) { - Object.entries(message).forEach(([key, payload]) => { - const data = JSON.stringify({ [key]: payload }); - console.log("Sending ", socket, data); - socket.send(data); - }); -} diff --git a/src/components/settings/RemoteSettings.tsx b/src/components/settings/RemoteSettings.tsx deleted file mode 100644 index b3429c1..0000000 --- a/src/components/settings/RemoteSettings.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { FunctionComponent } from "react"; -import { Typo } from "../Typo"; -import _ from "lodash"; -import { Button } from "../input/Button"; -import { useRemotePublishStore } from "../remote"; -import { Link } from "react-router-dom"; - -export const RemoteSettings: FunctionComponent<{}> = () => { - const state = useRemotePublishStore((s) => s.state); - const funcs = useRemotePublishStore((s) => ({ - connect: s.connect, - disconnect: s.disconnect, - })); - - return ( -
- Remote Control - {state.state === "connected" ? ( - <> - -

- Remote Control is active via code:{" "} - - {state.id} - -

- - ) : ( - <> - - - )} -
- ); -}; diff --git a/src/index.tsx b/src/index.tsx index 7559b0e..8e2890c 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -6,7 +6,6 @@ import App from "./App"; import reportWebVitals from "./reportWebVitals"; import { enableAllPlugins } from "immer"; import { RouterProvider, createBrowserRouter } from "react-router-dom"; -import { RemoteControlPage } from "./components/remote/control"; import { watchForChanges } from "./engine"; import { useFileStore } from "./engine/store"; import { tempSyncIOValueStore } from "./remotePlugin/inputOutputStore"; @@ -19,10 +18,6 @@ const router = createBrowserRouter([ path: "/", element: , }, - { - path: "/remote/:id", - element: , - }, ]); const root = ReactDOM.createRoot(document.getElementById("root") as HTMLElement); From 763bf4ff047982e6c30873a9c61d0d11a9c9eecc Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Thu, 27 Jul 2023 22:07:44 +0200 Subject: [PATCH 025/109] select in inputadapternode --- src/nodes/InputAdapterNode.tsx | 23 ++++++++++++----------- src/remotePlugin/RemoteDrawerPage.tsx | 5 +---- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/nodes/InputAdapterNode.tsx b/src/nodes/InputAdapterNode.tsx index 447d3f2..dd66ebb 100644 --- a/src/nodes/InputAdapterNode.tsx +++ b/src/nodes/InputAdapterNode.tsx @@ -3,9 +3,10 @@ import { NodeHeaderProps, nodeDef } from "../engine/node"; import { categories } from "./category"; import { inputAdapterDefs } from "../registries"; import { useFileStore } from "../engine/store"; +import { Select } from "../components/input/Select"; export type InputAdapterNodeSettings = { - adapterId: string; + adapterId: string | null; }; const InputAdapterNodeHeader: FunctionComponent> = ({ id, data }) => { @@ -13,16 +14,13 @@ const InputAdapterNodeHeader: FunctionComponent updateNode(id, (draft) => ((draft.data.settings as InputAdapterNodeSettings)["adapterId"] = e.target.value))} - value={adapterId} - > - {Object.values(inputAdapterDefs).map((it) => ( - - ))} - + ); }; @@ -40,6 +38,9 @@ export const inputAdapterNode = nodeDef()({ inputs: {}, executor: { inputDriver: (context) => { + if (context.settings.adapterId === null) { + return { value: 0 }; + } const adapter = inputAdapterDefs[context.settings.adapterId]; if (context.settings.adapterId === undefined) { return { value: 0 }; diff --git a/src/remotePlugin/RemoteDrawerPage.tsx b/src/remotePlugin/RemoteDrawerPage.tsx index 3961a26..54f7cd4 100644 --- a/src/remotePlugin/RemoteDrawerPage.tsx +++ b/src/remotePlugin/RemoteDrawerPage.tsx @@ -1,16 +1,13 @@ -import { BsController } from "react-icons/bs"; import { Tab } from "../components/Settings"; import { MdSettingsRemote } from "react-icons/md"; import { FunctionComponent } from "react"; -import { Typo } from "../components/Typo"; import { Button } from "../components/input/Button"; import { InterfaceList } from "./interface/InterfaceList"; -import { useInterfaceDisplayStore, useInterfaceFileStore } from "./interface/stores"; +import { useInterfaceFileStore } from "./interface/stores"; import { ConnectionManager } from "./remote/ConnectionManager"; import { PublishManager } from "./publish/PublishManager"; const RemoteSettingsTab: FunctionComponent<{}> = () => { - const addRemoteInterface = useInterfaceDisplayStore((s) => s.addRemoteInterface); const addLocalInterface = useInterfaceFileStore((s) => s.addInterface); return ( From c99b05f976cc93631f5aa049480bd65dabcaf357 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Thu, 27 Jul 2023 22:19:04 +0200 Subject: [PATCH 026/109] add devtools to stores --- src/remotePlugin/interface/InterfaceList.tsx | 4 + src/remotePlugin/interface/stores.ts | 115 +++++++++++-------- src/remotePlugin/publish/store.ts | 15 ++- src/remotePlugin/remote/store.ts | 47 ++++---- 4 files changed, 104 insertions(+), 77 deletions(-) diff --git a/src/remotePlugin/interface/InterfaceList.tsx b/src/remotePlugin/interface/InterfaceList.tsx index 6055c3f..30cc273 100644 --- a/src/remotePlugin/interface/InterfaceList.tsx +++ b/src/remotePlugin/interface/InterfaceList.tsx @@ -11,6 +11,9 @@ type InterfaceListEntryProps = { export const InterfaceListEntry: FunctionComponent = ({ interfaceId, brokerType }) => { const [editing, setEditing] = useState(false); const canEdit = brokerType === "local"; + + const deleteInterface = () => {}; + if (editing && canEdit) { return (
@@ -22,6 +25,7 @@ export const InterfaceListEntry: FunctionComponent = ({ return (
{canEdit && } +
); diff --git a/src/remotePlugin/interface/stores.ts b/src/remotePlugin/interface/stores.ts index d753db4..becc3b0 100644 --- a/src/remotePlugin/interface/stores.ts +++ b/src/remotePlugin/interface/stores.ts @@ -1,7 +1,7 @@ import produce, { Draft } from "immer"; import create from "zustand"; -import { persist } from "zustand/middleware"; -import { diffBy, diffByKeys } from "../../utils/diffBy"; +import { devtools, persist } from "zustand/middleware"; +import { diffByKeys } from "../../utils/diffBy"; import _ from "lodash"; import { useCallback } from "react"; import { usePublishStateStore } from "../publish/store"; @@ -32,26 +32,31 @@ type InterfaceDisplayStore = { }; /** Make mutations to the displayed interfaces on this store, that gets synced into useInterfaceDisplayStateStore, read from there */ export const useInterfaceDisplayStore = create( - persist( - (set, get) => ({ - interfaces: {}, + devtools( + persist( + (set, get) => ({ + interfaces: {}, - addRemoteInterface: (interfaceId, settings) => { - set((s) => - produce(s, (draft) => { - draft.interfaces[interfaceId] = { - interfaceId: interfaceId, - brokerType: "remote", - brokerSettings: settings, - }; - }) - ); - }, - }), + addRemoteInterface: (interfaceId, settings) => { + set((s) => + produce(s, (draft) => { + draft.interfaces[interfaceId] = { + interfaceId: interfaceId, + brokerType: "remote", + brokerSettings: settings, + }; + }) + ); + }, + }), + { + name: "interfaceDisplay", + getStorage: () => window.sessionStorage, + version: 1, + } + ), { - name: "interfaceDisplay", - getStorage: () => window.sessionStorage, - version: 1, + name: "useInterfaceDisplayStore", } ) ); @@ -73,34 +78,37 @@ type InterfaceFileStore = { updateInterface: (interfaceId: string, recipe: (draft: Draft) => void) => void; }; export const useInterfaceFileStore = create()( - persist( - (set, get) => ({ - interfaces: {}, - addInterface: () => { - const interfaceId = `${new Date().getTime()}`; - set((s) => - produce(s, (draft) => { - draft.interfaces[interfaceId] = { - interfaceId: interfaceId, - layout: [], - name: "New Interface", - }; - }) - ); - }, - updateInterface: (interfaceId, recipe) => { - set((s) => - produce(s, (draft) => { - recipe(draft.interfaces[interfaceId]); - }) - ); - }, - }), - { - name: "interfaceFile", - getStorage: () => window.localStorage, - version: 1, - } + devtools( + persist( + (set, get) => ({ + interfaces: {}, + addInterface: () => { + const interfaceId = `${new Date().getTime()}`; + set((s) => + produce(s, (draft) => { + draft.interfaces[interfaceId] = { + interfaceId: interfaceId, + layout: [], + name: "New Interface", + }; + }) + ); + }, + updateInterface: (interfaceId, recipe) => { + set((s) => + produce(s, (draft) => { + recipe(draft.interfaces[interfaceId]); + }) + ); + }, + }), + { + name: "interfaceFile", + getStorage: () => window.localStorage, + version: 1, + } + ), + { name: "useInterfaceFileStore" } ) ); @@ -120,9 +128,14 @@ type InterfaceDisplayState = { type InterfaceDisplayStateStore = { interfaces: Record; }; -export const useInterfaceDisplayStateStore = create()((set, get) => ({ - interfaces: {}, -})); +export const useInterfaceDisplayStateStore = create()( + devtools( + (set, get) => ({ + interfaces: {}, + }), + { name: "useInterfaceDisplayStateStore" } + ) +); type Setter = (recipe: (draft: Draft) => void) => void; type Getter = () => InterfaceDisplayState; diff --git a/src/remotePlugin/publish/store.ts b/src/remotePlugin/publish/store.ts index 40ce0cf..d1ddb5b 100644 --- a/src/remotePlugin/publish/store.ts +++ b/src/remotePlugin/publish/store.ts @@ -1,6 +1,6 @@ import produce, { Draft } from "immer"; import create from "zustand"; -import { persist } from "zustand/middleware"; +import { devtools, persist } from "zustand/middleware"; import { immer } from "zustand/middleware/immer"; import { BeadiMessage, handleMessage, sendMessage } from "../message"; import { useIOValueStore } from "../inputOutputStore"; @@ -85,10 +85,15 @@ type PublishConnectionState = type PublishStateStore = { state: PublishConnectionState; }; -export const usePublishStateStore = create()((set, get) => ({ - state: makeDisconnectedState((recipe) => set((s) => produce(s, recipe)), get), - close: () => {}, -})); +export const usePublishStateStore = create()( + devtools( + (set, get) => ({ + state: makeDisconnectedState((recipe) => set((s) => produce(s, recipe)), get), + close: () => {}, + }), + { name: "usePublishStateStore" } + ) +); type Setter = (recipe: (draft: Draft) => void | PublishStateStore) => void; type Getter = () => PublishStateStore; diff --git a/src/remotePlugin/remote/store.ts b/src/remotePlugin/remote/store.ts index f419e27..174f2ca 100644 --- a/src/remotePlugin/remote/store.ts +++ b/src/remotePlugin/remote/store.ts @@ -3,7 +3,7 @@ import { diffBy, diffByKeys } from "../../utils/diffBy"; import produce, { Draft } from "immer"; import { BeadiMessage, handleMessage } from "../message"; import { immer } from "zustand/middleware/immer"; -import { persist } from "zustand/middleware"; +import { devtools, persist } from "zustand/middleware"; import _ from "lodash"; import { Interface } from "../interface/stores"; @@ -17,27 +17,32 @@ export type RemoteStore = { removeConnection: (connectionId: string) => void; }; export const useRemoteStore = create( - persist( - immer((set, get) => ({ - remotes: {}, - addConnection: (connection) => { - const id = `${new Date().getTime()}`; - set((draft) => { - draft.remotes[id] = { - ...connection, - remoteConnectionId: id, - }; - }); - }, - removeConnection: (id) => { - set((draft) => { - delete draft.remotes[id]; - }); - }, - })), + devtools( + persist( + immer((set, get) => ({ + remotes: {}, + addConnection: (connection) => { + const id = `${new Date().getTime()}`; + set((draft) => { + draft.remotes[id] = { + ...connection, + remoteConnectionId: id, + }; + }); + }, + removeConnection: (id) => { + set((draft) => { + delete draft.remotes[id]; + }); + }, + })), + { + name: "remoteConnections", + getStorage: () => window.sessionStorage, + } + ), { - name: "remoteConnections", - getStorage: () => window.sessionStorage, + name: "useRemoteStore", } ) ); From 3164e0f259fa1418a6a46a942c5089458c396580 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Thu, 27 Jul 2023 22:39:10 +0200 Subject: [PATCH 027/109] style PublishManager --- src/remotePlugin/RemoteDrawerPage.tsx | 8 +++- src/remotePlugin/interface/InterfaceList.tsx | 3 -- src/remotePlugin/publish/PublishManager.tsx | 44 +++++++++++++------- 3 files changed, 36 insertions(+), 19 deletions(-) diff --git a/src/remotePlugin/RemoteDrawerPage.tsx b/src/remotePlugin/RemoteDrawerPage.tsx index 54f7cd4..d474fad 100644 --- a/src/remotePlugin/RemoteDrawerPage.tsx +++ b/src/remotePlugin/RemoteDrawerPage.tsx @@ -6,20 +6,24 @@ import { InterfaceList } from "./interface/InterfaceList"; import { useInterfaceFileStore } from "./interface/stores"; import { ConnectionManager } from "./remote/ConnectionManager"; import { PublishManager } from "./publish/PublishManager"; +import { Typo } from "../components/Typo"; const RemoteSettingsTab: FunctionComponent<{}> = () => { const addLocalInterface = useInterfaceFileStore((s) => s.addInterface); return ( <> -
+
+ Publish
+ Control
-
+
+ Remote Connections
diff --git a/src/remotePlugin/interface/InterfaceList.tsx b/src/remotePlugin/interface/InterfaceList.tsx index 30cc273..c326483 100644 --- a/src/remotePlugin/interface/InterfaceList.tsx +++ b/src/remotePlugin/interface/InterfaceList.tsx @@ -12,8 +12,6 @@ export const InterfaceListEntry: FunctionComponent = ({ const [editing, setEditing] = useState(false); const canEdit = brokerType === "local"; - const deleteInterface = () => {}; - if (editing && canEdit) { return (
@@ -25,7 +23,6 @@ export const InterfaceListEntry: FunctionComponent = ({ return (
{canEdit && } -
); diff --git a/src/remotePlugin/publish/PublishManager.tsx b/src/remotePlugin/publish/PublishManager.tsx index 4456725..27d029c 100644 --- a/src/remotePlugin/publish/PublishManager.tsx +++ b/src/remotePlugin/publish/PublishManager.tsx @@ -1,27 +1,43 @@ import { FunctionComponent } from "react"; import { usePublishStateStore } from "./store"; import { Button } from "../../components/input/Button"; +import clsx from "clsx"; type PublishManagerProps = {}; export const PublishManager: FunctionComponent = ({}) => { const state = usePublishStateStore((s) => s.state); return ( -
-
- {state.state} {state.state === "connected" && {state.id}} -
- {state.state !== "disconnected" ? ( - - ) : ( - +
+ {state.state === "disconnected" &&
Ready to start Remote Control
} + {state.state === "connecting" &&
Connecting...
} + {state.state === "connected" && ( +
+
Remote Control published at
+ {state.id} +
)} + {state.state === "disconnected" && } + {state.state !== "disconnected" && }
); + + // return ( + //
+ //
+ // {state.state} {state.state === "connected" && {state.id}} + //
+ // {state.state !== "disconnected" ? ( + // + // ) : ( + // + // )} + //
+ // ); }; From 364e895432b1f57b7bf3056bece4a7d88243ffa1 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Fri, 28 Jul 2023 14:04:57 +0200 Subject: [PATCH 028/109] Style Interface Control --- src/remotePlugin/interface/Interface.tsx | 2 -- src/remotePlugin/interface/InterfaceList.tsx | 15 ++++++++++++--- src/remotePlugin/widgets/SliderWidget.tsx | 19 +++++++++++++------ 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/remotePlugin/interface/Interface.tsx b/src/remotePlugin/interface/Interface.tsx index 275c772..96e69fa 100644 --- a/src/remotePlugin/interface/Interface.tsx +++ b/src/remotePlugin/interface/Interface.tsx @@ -10,8 +10,6 @@ export const Interface: FunctionComponent = ({ interfaceId }) => return (
- {JSON.stringify(interfaceState)} -
    {interfaceState.layout.map((it) => (
  • diff --git a/src/remotePlugin/interface/InterfaceList.tsx b/src/remotePlugin/interface/InterfaceList.tsx index c326483..851b187 100644 --- a/src/remotePlugin/interface/InterfaceList.tsx +++ b/src/remotePlugin/interface/InterfaceList.tsx @@ -3,6 +3,7 @@ import { useInterfaceDisplayStateStore } from "./stores"; import { Interface } from "./Interface"; import { InterfaceEditor } from "./InterfaceEditor"; import { Button } from "../../components/input/Button"; +import { MdDeviceHub, MdEdit, MdExpandLess, MdExpandMore, MdMore } from "react-icons/md"; type InterfaceListEntryProps = { interfaceId: string; @@ -10,6 +11,7 @@ type InterfaceListEntryProps = { }; export const InterfaceListEntry: FunctionComponent = ({ interfaceId, brokerType }) => { const [editing, setEditing] = useState(false); + const [expanded, setExpanded] = useState(true); const canEdit = brokerType === "local"; if (editing && canEdit) { @@ -21,9 +23,16 @@ export const InterfaceListEntry: FunctionComponent = ({ ); } else { return ( -
    - {canEdit && } - +
    +
    + {!canEdit && } + {canEdit && L} +
    + {canEdit && } + {!expanded && } + {expanded && } +
    + {expanded && }
    ); } diff --git a/src/remotePlugin/widgets/SliderWidget.tsx b/src/remotePlugin/widgets/SliderWidget.tsx index 6ccbbb4..0ce7445 100644 --- a/src/remotePlugin/widgets/SliderWidget.tsx +++ b/src/remotePlugin/widgets/SliderWidget.tsx @@ -20,12 +20,10 @@ export const SliderWidget: FunctionComponentInvalid widget: {handle.error}

    ; - } return ( -
    +
    { setFocused(true); - setInteractiveValue(handle.value); + setInteractiveValue(handle.value ?? 0.0); }} onBlur={() => setFocused(false)} onChange={(e) => setValue(parseFloat(e.target.value))} /> - + + {handle.error !== undefined &&
    {handle.error}
    }
    ); }; From 2cf55492be8102eb061110487110d2c3d17a8373 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Wed, 2 Aug 2023 19:54:59 +0200 Subject: [PATCH 029/109] remote connections style --- .env | 3 +- src/components/CollapsibleCard.tsx | 24 +++++++ src/components/mobile/BottomBar.tsx | 15 ++--- src/components/mobile/MobileView.tsx | 63 +++++++++---------- .../interface/InterfaceEditor.tsx | 14 ++++- src/remotePlugin/interface/InterfaceList.tsx | 29 ++++++--- src/remotePlugin/interface/stores.ts | 34 ++++++++-- src/remotePlugin/publish/PublishManager.tsx | 7 ++- src/remotePlugin/publish/store.ts | 6 +- src/remotePlugin/remote/ConnectionManager.tsx | 31 +++++++-- src/remotePlugin/remote/store.ts | 5 +- 11 files changed, 160 insertions(+), 71 deletions(-) create mode 100644 src/components/CollapsibleCard.tsx diff --git a/.env b/.env index 129ff96..4c523c2 100644 --- a/.env +++ b/.env @@ -1,4 +1,5 @@ -REACT_APP_REMOTE_SERVER_URL="wss://stagingbeadi.onrender.com:6969/" +REACT_APP_REMOTE_SERVER_URL="wss://beadi-serve.onrender.com:6969/" +# REACT_APP_REMOTE_SERVER_URL="wss://stagingbeadi.onrender.com:6969/" REACT_APP_PUBLIC_URL="https://beadi.onrender.com/" REACT_APP_BETA_PUBLIC_URL="https://stagingbeadi.onrender.com/" # Will be overwritten in production diff --git a/src/components/CollapsibleCard.tsx b/src/components/CollapsibleCard.tsx new file mode 100644 index 0000000..9a95c06 --- /dev/null +++ b/src/components/CollapsibleCard.tsx @@ -0,0 +1,24 @@ +import { FunctionComponent, ReactNode, useState } from "react"; +import { Button } from "./input/Button"; +import { MdExpandLess, MdExpandMore } from "react-icons/md"; +import clsx from "clsx"; + +type CollapsibleCardProps = { + header?: ReactNode; + children?: ReactNode; + startExpanded?: boolean; +}; +export const CollapsibleCard: FunctionComponent = ({ header, children, startExpanded }) => { + const [expanded, setExpanded] = useState(startExpanded ?? true); + return ( +
    +
    + {header} + + {!expanded && } + {expanded && } +
    + {expanded &&
    {children}
    } +
    + ); +}; diff --git a/src/components/mobile/BottomBar.tsx b/src/components/mobile/BottomBar.tsx index 6630f7c..e1fe58c 100644 --- a/src/components/mobile/BottomBar.tsx +++ b/src/components/mobile/BottomBar.tsx @@ -4,10 +4,7 @@ type BottomBarContainerProps = { children?: ReactNode; onClick: () => void; }; -const BottomBarContainer: FunctionComponent = ({ - children, - onClick, -}) => { +const BottomBarContainer: FunctionComponent = ({ children, onClick }) => { return ( = ({ interfaceId, brokerType }) => { const [editing, setEditing] = useState(false); const [expanded, setExpanded] = useState(true); - const canEdit = brokerType === "local"; + const deleteLocalInterface = useInterfaceFileStore((s) => s.deleteInterface); + const deleteRemoteInterface = useInterfaceDisplayStore((s) => s.removeRemoteInterface); + const isLocal = brokerType === "local"; - if (editing && canEdit) { + if (editing && isLocal) { return ( -
    - - ; +
    +
    + {!isLocal && } + {isLocal && L} +
    + + +
    +
    ); } else { return (
    - {!canEdit && } - {canEdit && L} + {!isLocal && } + {isLocal && L}
    - {canEdit && } + + {isLocal && } {!expanded && } {expanded && }
    diff --git a/src/remotePlugin/interface/stores.ts b/src/remotePlugin/interface/stores.ts index becc3b0..3cc1692 100644 --- a/src/remotePlugin/interface/stores.ts +++ b/src/remotePlugin/interface/stores.ts @@ -6,7 +6,7 @@ import _ from "lodash"; import { useCallback } from "react"; import { usePublishStateStore } from "../publish/store"; import { useIOValueStore } from "../inputOutputStore"; -import { useRemoteStateStore } from "../remote/store"; +import { RemoteStateStore, useRemoteStateStore } from "../remote/store"; import { sendMessage } from "../message"; type RemoteBrokerSettings = { @@ -29,6 +29,7 @@ type InterfaceDisplayStore = { /** Local Interfaces are synced from the files tore */ addRemoteInterface: (interfaceId: string, brokerSettings: RemoteBrokerSettings) => void; + removeRemoteInterface: (interfaceId: string) => void; }; /** Make mutations to the displayed interfaces on this store, that gets synced into useInterfaceDisplayStateStore, read from there */ export const useInterfaceDisplayStore = create( @@ -48,6 +49,13 @@ export const useInterfaceDisplayStore = create( }) ); }, + removeRemoteInterface: (interfaceId) => { + set((s) => + produce(s, (draft) => { + delete draft.interfaces[interfaceId]; + }) + ); + }, }), { name: "interfaceDisplay", @@ -76,6 +84,7 @@ type InterfaceFileStore = { interfaces: Record; addInterface: () => void; updateInterface: (interfaceId: string, recipe: (draft: Draft) => void) => void; + deleteInterface: (interfaceId: string) => void; }; export const useInterfaceFileStore = create()( devtools( @@ -101,6 +110,13 @@ export const useInterfaceFileStore = create()( }) ); }, + deleteInterface: (interfaceId) => { + set((s) => + produce(s, (draft) => { + delete draft.interfaces[interfaceId]; + }) + ); + }, }), { name: "interfaceFile", @@ -143,7 +159,7 @@ function createRemoteBrokeredInterface( def: InterfaceDisplayDef & { brokerType: "remote" }, set: Setter ): InterfaceDisplayState & { brokerType: "remote" } { - const unsubscribeIO = useRemoteStateStore.subscribe((s) => { + const syncRemoteStateStore = (s: RemoteStateStore) => { const remoteState = s.remotes[def.brokerSettings.remoteId].state; if (remoteState.state === "connected") { set((draft) => { @@ -151,14 +167,18 @@ function createRemoteBrokeredInterface( draft.layout = remoteState.interfaces[def.interfaceId].layout; }); } - }); + }; + + const unsubscribeIO = useRemoteStateStore.subscribe(syncRemoteStateStore); + + const remoteState = useRemoteStateStore.getState().remotes[def.brokerSettings.remoteId].state; return { brokerType: "remote", brokerState: {}, interfaceId: def.interfaceId, - layout: [], - values: {}, + layout: remoteState.state === "connected" ? _.cloneDeep(remoteState.interfaces[def.interfaceId].layout) : [], + values: remoteState.state === "connected" ? _.cloneDeep(remoteState.values) : {}, updateValue: (valueId, value) => { console.log("Remotely updating ", valueId, " to ", value); const state = useRemoteStateStore.getState().remotes[def.brokerSettings.remoteId].state; @@ -187,6 +207,10 @@ function createLocalBrokeredInterface( }); const unsubscribeInterfaceFile = useInterfaceFileStore.subscribe((s) => { set((draft) => { + if (s.interfaces[def.interfaceId] === undefined) { + console.warn("Tried to update interface broker for nonexisting interface.", def.interfaceId); + return; + } draft.layout = s.interfaces[def.interfaceId].layout; }); }); diff --git a/src/remotePlugin/publish/PublishManager.tsx b/src/remotePlugin/publish/PublishManager.tsx index 27d029c..acf88c9 100644 --- a/src/remotePlugin/publish/PublishManager.tsx +++ b/src/remotePlugin/publish/PublishManager.tsx @@ -9,7 +9,12 @@ export const PublishManager: FunctionComponent = ({}) => { return (
    - {state.state === "disconnected" &&
    Ready to start Remote Control
    } + {state.state === "disconnected" && ( +
    +

    Ready to start Remote Control

    +

    {state.error}

    +
    + )} {state.state === "connecting" &&
    Connecting...
    } {state.state === "connected" && (
    diff --git a/src/remotePlugin/publish/store.ts b/src/remotePlugin/publish/store.ts index d1ddb5b..eb8b3e7 100644 --- a/src/remotePlugin/publish/store.ts +++ b/src/remotePlugin/publish/store.ts @@ -6,8 +6,9 @@ import { BeadiMessage, handleMessage, sendMessage } from "../message"; import { useIOValueStore } from "../inputOutputStore"; import { useInterfaceFileStore } from "../interface/stores"; -function makeDisconnectedState(set: Setter, get: Getter): PublishConnectionState & { state: "disconnected" } { +function makeDisconnectedState(set: Setter, get: Getter, error?: string): PublishConnectionState & { state: "disconnected" } { return { + error, state: "disconnected", updateValue: (valueId, value) => { console.log("Updating value ", valueId, " to ", value, " on disconnected socket"); @@ -66,6 +67,7 @@ function makeConnectedState(socket: WebSocket, id: string): PublishConnectionSta type PublishConnectionState = | { state: "disconnected"; + error?: string; updateValue: (valueId: string, value: any) => void; publish: () => void; } @@ -108,7 +110,7 @@ function publish(set: Setter, get: Getter): void { const old = get().state; set((s) => { - s.state = makeDisconnectedState(set, get); + s.state = makeDisconnectedState(set, get, `Socket closed: ${event.reason} (${event.code})`); }); if (old.state !== "disconnected") { old.close(); diff --git a/src/remotePlugin/remote/ConnectionManager.tsx b/src/remotePlugin/remote/ConnectionManager.tsx index f98236e..b43a843 100644 --- a/src/remotePlugin/remote/ConnectionManager.tsx +++ b/src/remotePlugin/remote/ConnectionManager.tsx @@ -3,6 +3,9 @@ import { useRemoteStateStore, useRemoteStore } from "./store"; import { TextInput } from "../../components/input/TextInput"; import { Button } from "../../components/input/Button"; import { useInterfaceDisplayStore } from "../interface/stores"; +import { MdDelete, MdWifi, MdWifiOff } from "react-icons/md"; +import { CollapsibleCard } from "../../components/CollapsibleCard"; +import { Typo } from "../../components/Typo"; type RemoteConnectionDisplayProps = { remoteConnectionId: string; @@ -21,12 +24,22 @@ const RemoteConnectionDisplay: FunctionComponent = const state = connectionState.state; return ( -
    - Connection to {connectionState.definition.code} - - {JSON.stringify(state)} + + {state.state === "connected" && } + {state.state === "connecting" && } + {state.state === "disconnected" && } +
    {connectionState.definition.code}
    +
    + + + } + > {state.state === "connected" && ( <> + {JSON.stringify(state.values)} + Interfaces
      {Object.entries(state.interfaces).map(([key, iface]) => (
    • @@ -35,9 +48,15 @@ const RemoteConnectionDisplay: FunctionComponent =
    • ))}
    + Values +
      + {Object.entries(state.values).map(([key, value]) => ( +
    • {value.valueId}
    • + ))} +
    )} -
    + ); }; @@ -71,7 +90,7 @@ export const ConnectionManager: FunctionComponent = ({})
      {remoteStore.map((s) => ( -
    • +
    • ))} diff --git a/src/remotePlugin/remote/store.ts b/src/remotePlugin/remote/store.ts index 174f2ca..e8a0ccc 100644 --- a/src/remotePlugin/remote/store.ts +++ b/src/remotePlugin/remote/store.ts @@ -107,7 +107,10 @@ function openRemoteConnection(connection: RemoteConnection, set: Setter): Remote values: Object.assign( {}, ...payload.endpoints.map((it) => ({ - [it.id]: it, + [it.id]: { + value: it.value, + valueId: it.id, + } satisfies RemoteConnectionValue, })) ), })); From 4b460123a6cc4076d26e215b51eefeb6e4e86003 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Wed, 2 Aug 2023 20:31:33 +0200 Subject: [PATCH 030/109] Icon Button --- src/components/input/Button.tsx | 28 +++++++------------ src/remotePlugin/remote/ConnectionManager.tsx | 8 ++---- src/remotePlugin/remote/store.ts | 13 +++++++-- 3 files changed, 22 insertions(+), 27 deletions(-) diff --git a/src/components/input/Button.tsx b/src/components/input/Button.tsx index 8b4e0e6..74b1142 100644 --- a/src/components/input/Button.tsx +++ b/src/components/input/Button.tsx @@ -1,53 +1,45 @@ import clsx from "clsx"; -import { - ButtonHTMLAttributes, - DetailedHTMLProps, - FunctionComponent, - PropsWithChildren, - ReactNode, -} from "react"; +import { ButtonHTMLAttributes, DetailedHTMLProps, FunctionComponent, PropsWithChildren, ReactNode } from "react"; - -type ButtonElementProps = { -} & ButtonHTMLAttributes +type ButtonElementProps = {} & ButtonHTMLAttributes; type ButtonProps = { variant?: "normal" | "big"; children?: ReactNode; disabledNotice?: string; icon?: ReactNode; + endIcon?: ReactNode; Element?: React.ComponentType>; -} & DetailedHTMLProps< - ButtonHTMLAttributes, - HTMLButtonElement ->; +} & DetailedHTMLProps, HTMLButtonElement>; export const Button: FunctionComponent = ({ children, disabled, icon, + endIcon, variant = "normal", disabledNotice, className, Element = "button", ...buttonProps }) => { - const isIcon = icon !== undefined; + const isIcon = icon !== undefined || endIcon !== undefined; const big = variant === "big"; return ( {icon} - {children &&
      {children}
      } + {children &&
      {children}
      } + {endIcon}
      ); }; diff --git a/src/remotePlugin/remote/ConnectionManager.tsx b/src/remotePlugin/remote/ConnectionManager.tsx index b43a843..242faaf 100644 --- a/src/remotePlugin/remote/ConnectionManager.tsx +++ b/src/remotePlugin/remote/ConnectionManager.tsx @@ -3,7 +3,7 @@ import { useRemoteStateStore, useRemoteStore } from "./store"; import { TextInput } from "../../components/input/TextInput"; import { Button } from "../../components/input/Button"; import { useInterfaceDisplayStore } from "../interface/stores"; -import { MdDelete, MdWifi, MdWifiOff } from "react-icons/md"; +import { MdDelete, MdOpenInNew, MdWifi, MdWifiOff } from "react-icons/md"; import { CollapsibleCard } from "../../components/CollapsibleCard"; import { Typo } from "../../components/Typo"; @@ -38,14 +38,10 @@ const RemoteConnectionDisplay: FunctionComponent = > {state.state === "connected" && ( <> - {JSON.stringify(state.values)} Interfaces
        {Object.entries(state.interfaces).map(([key, iface]) => ( -
      • - {iface.name} - -
      • +
      • {iface.name}
      • ))}
      Values diff --git a/src/remotePlugin/remote/store.ts b/src/remotePlugin/remote/store.ts index e8a0ccc..0271f16 100644 --- a/src/remotePlugin/remote/store.ts +++ b/src/remotePlugin/remote/store.ts @@ -77,9 +77,16 @@ export type RemoteConnectionHandle = { export type RemoteStateStore = { remotes: Record; }; -export const useRemoteStateStore = create()((set, get) => ({ - remotes: {}, -})); +export const useRemoteStateStore = create( + devtools( + (set, get) => ({ + remotes: {}, + }), + { + name: "useRemoteStateStore", + } + ) +); type Setter = (recipe: (draft: Draft) => void | RemoteConnectionState) => void; function openRemoteConnection(connection: RemoteConnection, set: Setter): RemoteConnectionHandle { From 39d09bbce5ecc8a875327e3b1eef4cc1154781b9 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Wed, 2 Aug 2023 21:00:01 +0200 Subject: [PATCH 031/109] Remove InterfaceDisplayStore --- src/remotePlugin/interface/InterfaceList.tsx | 6 +- src/remotePlugin/interface/stores.ts | 198 ++++++++++++------ src/remotePlugin/remote/ConnectionManager.tsx | 13 +- src/remotePlugin/remote/store.ts | 82 ++++---- 4 files changed, 182 insertions(+), 117 deletions(-) diff --git a/src/remotePlugin/interface/InterfaceList.tsx b/src/remotePlugin/interface/InterfaceList.tsx index fe5eeb1..70efa0e 100644 --- a/src/remotePlugin/interface/InterfaceList.tsx +++ b/src/remotePlugin/interface/InterfaceList.tsx @@ -1,5 +1,5 @@ import { FunctionComponent, useState } from "react"; -import { useInterfaceDisplayStateStore, useInterfaceDisplayStore, useInterfaceFileStore } from "./stores"; +import { useInterfaceDisplayStateStore, useInterfaceFileStore } from "./stores"; import { Interface } from "./Interface"; import { InterfaceEditor } from "./InterfaceEditor"; import { Button } from "../../components/input/Button"; @@ -13,7 +13,7 @@ export const InterfaceListEntry: FunctionComponent = ({ const [editing, setEditing] = useState(false); const [expanded, setExpanded] = useState(true); const deleteLocalInterface = useInterfaceFileStore((s) => s.deleteInterface); - const deleteRemoteInterface = useInterfaceDisplayStore((s) => s.removeRemoteInterface); + // const deleteRemoteInterface = useInterfaceDisplayStore((s) => s.removeRemoteInterface); const isLocal = brokerType === "local"; if (editing && isLocal) { @@ -36,7 +36,7 @@ export const InterfaceListEntry: FunctionComponent = ({ {!isLocal && } {isLocal && L}
      - + {/* */} {isLocal && } {!expanded && } {expanded && } diff --git a/src/remotePlugin/interface/stores.ts b/src/remotePlugin/interface/stores.ts index 3cc1692..7f015dc 100644 --- a/src/remotePlugin/interface/stores.ts +++ b/src/remotePlugin/interface/stores.ts @@ -6,7 +6,7 @@ import _ from "lodash"; import { useCallback } from "react"; import { usePublishStateStore } from "../publish/store"; import { useIOValueStore } from "../inputOutputStore"; -import { RemoteStateStore, useRemoteStateStore } from "../remote/store"; +import { RemoteStateStore, useRemoteStateStore, useRemoteStore } from "../remote/store"; import { sendMessage } from "../message"; type RemoteBrokerSettings = { @@ -24,50 +24,50 @@ type InterfaceDisplayDef = { brokerSettings: {}; } ); -type InterfaceDisplayStore = { - interfaces: Record; +// type InterfaceDisplayStore = { +// interfaces: Record; - /** Local Interfaces are synced from the files tore */ - addRemoteInterface: (interfaceId: string, brokerSettings: RemoteBrokerSettings) => void; - removeRemoteInterface: (interfaceId: string) => void; -}; +// /** Local Interfaces are synced from the files tore */ +// addRemoteInterface: (interfaceId: string, brokerSettings: RemoteBrokerSettings) => void; +// removeRemoteInterface: (interfaceId: string) => void; +// }; /** Make mutations to the displayed interfaces on this store, that gets synced into useInterfaceDisplayStateStore, read from there */ -export const useInterfaceDisplayStore = create( - devtools( - persist( - (set, get) => ({ - interfaces: {}, +// export const useInterfaceDisplayStore = create( +// devtools( +// persist( +// (set, get) => ({ +// interfaces: {}, - addRemoteInterface: (interfaceId, settings) => { - set((s) => - produce(s, (draft) => { - draft.interfaces[interfaceId] = { - interfaceId: interfaceId, - brokerType: "remote", - brokerSettings: settings, - }; - }) - ); - }, - removeRemoteInterface: (interfaceId) => { - set((s) => - produce(s, (draft) => { - delete draft.interfaces[interfaceId]; - }) - ); - }, - }), - { - name: "interfaceDisplay", - getStorage: () => window.sessionStorage, - version: 1, - } - ), - { - name: "useInterfaceDisplayStore", - } - ) -); +// addRemoteInterface: (interfaceId, settings) => { +// set((s) => +// produce(s, (draft) => { +// draft.interfaces[interfaceId] = { +// interfaceId: interfaceId, +// brokerType: "remote", +// brokerSettings: settings, +// }; +// }) +// ); +// }, +// removeRemoteInterface: (interfaceId) => { +// set((s) => +// produce(s, (draft) => { +// delete draft.interfaces[interfaceId]; +// }) +// ); +// }, +// }), +// { +// name: "interfaceDisplay", +// getStorage: () => window.sessionStorage, +// version: 1, +// } +// ), +// { +// name: "useInterfaceDisplayStore", +// } +// ) +// ); type Widget = { widgetId: string; @@ -171,6 +171,7 @@ function createRemoteBrokeredInterface( const unsubscribeIO = useRemoteStateStore.subscribe(syncRemoteStateStore); + console.log(def.brokerSettings); const remoteState = useRemoteStateStore.getState().remotes[def.brokerSettings.remoteId].state; return { @@ -235,57 +236,120 @@ function createLocalBrokeredInterface( export function setupInterfaceListeners() { console.log("Setup Interface Listeners"); - const syncInterfaceDisplayStateStore = (state: InterfaceDisplayStore) => { - const oldStateStore = useInterfaceDisplayStateStore.getState(); - const { extra, missing } = diffByKeys(oldStateStore.interfaces, state.interfaces); + // const syncInterfaceDisplayStateStore = (state: InterfaceDisplayStore) => { + // const oldStateStore = useInterfaceDisplayStateStore.getState(); + // const { extra, missing } = diffByKeys(oldStateStore.interfaces, state.interfaces); + + // useInterfaceDisplayStateStore.setState((s) => + // produce(s, (draft) => { + // for (const extraKey in extra) { + // //TODO Close up the broker. + // draft.interfaces[extraKey].closeBroker(); + // delete draft.interfaces[extraKey]; + // } + // for (const missingKey in missing) { + // const interfaceDef = missing[missingKey]; + + // const set: Setter = (recipe) => { + // useInterfaceDisplayStateStore.setState((s) => produce(s, (draft) => recipe(draft.interfaces[missingKey]))); + // }; + // //TODO Open up the broker. + // if (interfaceDef.brokerType === "local") { + // draft.interfaces[missingKey] = createLocalBrokeredInterface(interfaceDef, set); + // } else { + // draft.interfaces[missingKey] = createRemoteBrokeredInterface(interfaceDef, set); + // } + // } + // }) + // ); + // }; + // useInterfaceDisplayStore.subscribe(syncInterfaceDisplayStateStore); + // syncInterfaceDisplayStateStore(useInterfaceDisplayStore.getState()); + + const syncLocalInterfacesFromFileStore = (state: InterfaceFileStore) => { + const existingLocalInterfaces = _.pickBy(useInterfaceDisplayStateStore.getState().interfaces, (s) => s.brokerType === "local"); + const { extra, missing } = diffByKeys(existingLocalInterfaces, state.interfaces); useInterfaceDisplayStateStore.setState((s) => produce(s, (draft) => { for (const extraKey in extra) { - //TODO Close up the broker. - draft.interfaces[extraKey].closeBroker(); delete draft.interfaces[extraKey]; } for (const missingKey in missing) { - const interfaceDef = missing[missingKey]; - const set: Setter = (recipe) => { useInterfaceDisplayStateStore.setState((s) => produce(s, (draft) => recipe(draft.interfaces[missingKey]))); }; - //TODO Open up the broker. - if (interfaceDef.brokerType === "local") { - draft.interfaces[missingKey] = createLocalBrokeredInterface(interfaceDef, set); - } else { - draft.interfaces[missingKey] = createRemoteBrokeredInterface(interfaceDef, set); - } + draft.interfaces[missingKey] = createLocalBrokeredInterface( + { + brokerSettings: {}, + brokerType: "local", + interfaceId: missingKey, + }, + set + ); + // draft.interfaces[missingKey] = { + // brokerSettings: {}, + // brokerType: "local", + // interfaceId: missingKey, + // }; } }) ); }; - useInterfaceDisplayStore.subscribe(syncInterfaceDisplayStateStore); - syncInterfaceDisplayStateStore(useInterfaceDisplayStore.getState()); + useInterfaceFileStore.subscribe(syncLocalInterfacesFromFileStore); + syncLocalInterfacesFromFileStore(useInterfaceFileStore.getState()); - const syncLocalInterfacesFromFileStore = (state: InterfaceFileStore) => { - const existingLocalInterfaces = _.pickBy(useInterfaceDisplayStore.getState().interfaces, (s) => s.brokerType === "local"); - const { extra, missing } = diffByKeys(existingLocalInterfaces, state.interfaces); + const syncRemoteInterfacesFromRemoteStore = (state: RemoteStateStore) => { + console.log("SSS", state); + const existingLocalInterfaces = _.pickBy(useInterfaceDisplayStateStore.getState().interfaces, (s) => s.brokerType === "remote"); + const allRemoteInterfaces: Record = Object.assign( + {}, + ...Object.entries(state.remotes).flatMap(([remoteId, remote]) => { + const state = remote.state; + if (state.state === "connected") { + return Object.values(state.interfaces).map((iface) => ({ [iface.interfaceId]: { interface: iface, remoteId: remoteId } })); + } else { + return []; + } + }) + ); + const { extra, missing, changed } = diffByKeys(existingLocalInterfaces, allRemoteInterfaces); - useInterfaceDisplayStore.setState((s) => + useInterfaceDisplayStateStore.setState((s) => produce(s, (draft) => { + console.log("Extra: ", extra, "Missing: ", missing, "Changed: ", changed); for (const extraKey in extra) { delete draft.interfaces[extraKey]; } for (const missingKey in missing) { - draft.interfaces[missingKey] = { - brokerSettings: {}, - brokerType: "local", - interfaceId: missingKey, + console.log("ADDING: ", missingKey); + // draft.interfaces[missingKey] = { + // brokerSettings: { + // remoteId: missing[missingKey].remoteId, + // }, + // brokerType: "remote", + // interfaceId: missingKey, + // }; + const set: Setter = (recipe) => { + useInterfaceDisplayStateStore.setState((s) => produce(s, (draft) => recipe(draft.interfaces[missingKey]))); }; + draft.interfaces[missingKey] = createRemoteBrokeredInterface( + { + brokerSettings: { + remoteId: missing[missingKey].remoteId, + }, + brokerType: "remote", + interfaceId: missingKey, + }, + set + ); + console.log(draft.interfaces); } }) ); }; - useInterfaceFileStore.subscribe(syncLocalInterfacesFromFileStore); - syncLocalInterfacesFromFileStore(useInterfaceFileStore.getState()); + useRemoteStateStore.subscribe(syncRemoteInterfacesFromRemoteStore); + syncRemoteInterfacesFromRemoteStore(useRemoteStateStore.getState()); } setupInterfaceListeners(); diff --git a/src/remotePlugin/remote/ConnectionManager.tsx b/src/remotePlugin/remote/ConnectionManager.tsx index 242faaf..f158b8a 100644 --- a/src/remotePlugin/remote/ConnectionManager.tsx +++ b/src/remotePlugin/remote/ConnectionManager.tsx @@ -2,7 +2,6 @@ import { FunctionComponent, useState } from "react"; import { useRemoteStateStore, useRemoteStore } from "./store"; import { TextInput } from "../../components/input/TextInput"; import { Button } from "../../components/input/Button"; -import { useInterfaceDisplayStore } from "../interface/stores"; import { MdDelete, MdOpenInNew, MdWifi, MdWifiOff } from "react-icons/md"; import { CollapsibleCard } from "../../components/CollapsibleCard"; import { Typo } from "../../components/Typo"; @@ -14,13 +13,13 @@ const RemoteConnectionDisplay: FunctionComponent = const connectionState = useRemoteStateStore((s) => s.remotes[remoteConnectionId]); const removeConnection = useRemoteStore((s) => s.removeConnection); - const addRemoteInterface = useInterfaceDisplayStore((s) => s.addRemoteInterface); + // const addRemoteInterface = useInterfaceDisplayStore((s) => s.addRemoteInterface); - const openRemoteInterface = (interfaceId: string) => { - addRemoteInterface(interfaceId, { - remoteId: remoteConnectionId, - }); - }; + // const openRemoteInterface = (interfaceId: string) => { + // addRemoteInterface(interfaceId, { + // remoteId: remoteConnectionId, + // }); + // }; const state = connectionState.state; return ( diff --git a/src/remotePlugin/remote/store.ts b/src/remotePlugin/remote/store.ts index 0271f16..790696b 100644 --- a/src/remotePlugin/remote/store.ts +++ b/src/remotePlugin/remote/store.ts @@ -102,51 +102,53 @@ function openRemoteConnection(connection: RemoteConnection, set: Setter): Remote }); socket.addEventListener("message", (event) => { console.log("WebSocket message: ", event); + let data: BeadiMessage; try { - const data: BeadiMessage = JSON.parse(event.data); - handleMessage(data, { - WelcomeController: (payload) => { - set((s) => ({ - state: "connected", - id: payload.id, - socket: socket, - interfaces: _.keyBy(payload.interfaces, (i) => i.interfaceId), - values: Object.assign( + data = JSON.parse(event.data); + } catch (e) { + console.error("Unparsable message: ", event, e); + return; + } + handleMessage(data, { + WelcomeController: (payload) => { + set((s) => ({ + state: "connected", + id: payload.id, + socket: socket, + interfaces: _.keyBy(payload.interfaces, (i) => i.interfaceId), + values: Object.assign( + {}, + ...payload.endpoints.map((it) => ({ + [it.id]: { + value: it.value, + valueId: it.id, + } satisfies RemoteConnectionValue, + })) + ), + })); + }, + PublishEndpoints: (payload) => { + set((draft) => { + if (draft.state === "connected") { + draft.values = Object.assign( {}, ...payload.endpoints.map((it) => ({ - [it.id]: { - value: it.value, - valueId: it.id, - } satisfies RemoteConnectionValue, + [it.id]: it, })) - ), - })); - }, - PublishEndpoints: (payload) => { - set((draft) => { - if (draft.state === "connected") { - draft.values = Object.assign( - {}, - ...payload.endpoints.map((it) => ({ - [it.id]: it, - })) - ); - } - }); - }, - ValueChanged: ({ endpoint, value }) => { - set((draft) => { - if (draft.state === "connected") { - if (endpoint in draft.values) { - draft.values[endpoint].value = value; - } + ); + } + }); + }, + ValueChanged: ({ endpoint, value }) => { + set((draft) => { + if (draft.state === "connected") { + if (endpoint in draft.values) { + draft.values[endpoint].value = value; } - }); - }, - }); - } catch (e) { - console.error("Unreadable message: ", event); - } + } + }); + }, + }); }); return { From 007d694d91074c9735968e6facf742bac792a7b1 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Wed, 2 Aug 2023 21:18:07 +0200 Subject: [PATCH 032/109] Fixup remote closing error --- src/remotePlugin/interface/stores.ts | 4 +- src/remotePlugin/remote/ConnectionManager.tsx | 1 + src/remotePlugin/remote/store.ts | 38 +++++++++++++++---- 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/remotePlugin/interface/stores.ts b/src/remotePlugin/interface/stores.ts index 7f015dc..e88411c 100644 --- a/src/remotePlugin/interface/stores.ts +++ b/src/remotePlugin/interface/stores.ts @@ -160,8 +160,8 @@ function createRemoteBrokeredInterface( set: Setter ): InterfaceDisplayState & { brokerType: "remote" } { const syncRemoteStateStore = (s: RemoteStateStore) => { - const remoteState = s.remotes[def.brokerSettings.remoteId].state; - if (remoteState.state === "connected") { + const remoteState = s.remotes[def.brokerSettings.remoteId]?.state; + if (remoteState !== undefined && remoteState.state === "connected") { set((draft) => { draft.values = remoteState.values; draft.layout = remoteState.interfaces[def.interfaceId].layout; diff --git a/src/remotePlugin/remote/ConnectionManager.tsx b/src/remotePlugin/remote/ConnectionManager.tsx index f158b8a..e2a4b2a 100644 --- a/src/remotePlugin/remote/ConnectionManager.tsx +++ b/src/remotePlugin/remote/ConnectionManager.tsx @@ -29,6 +29,7 @@ const RemoteConnectionDisplay: FunctionComponent = {state.state === "connected" && } {state.state === "connecting" && } {state.state === "disconnected" && } + {state.state === "closing" && }
      {connectionState.definition.code}
      diff --git a/src/remotePlugin/remote/store.ts b/src/remotePlugin/remote/store.ts index 790696b..d5ab406 100644 --- a/src/remotePlugin/remote/store.ts +++ b/src/remotePlugin/remote/store.ts @@ -66,12 +66,18 @@ type RemoteConnectionState = id: string; values: Record; interfaces: Record; + } + | { + state: "closing"; + socket: WebSocket; + id: string; + values: Record; + interfaces: Record; }; - export type RemoteConnectionHandle = { state: RemoteConnectionState; definition: RemoteConnection; - close: () => void; + close: () => Promise; }; export type RemoteStateStore = { @@ -155,8 +161,17 @@ function openRemoteConnection(connection: RemoteConnection, set: Setter): Remote state: { state: "connecting", socket, id: connection.code }, definition: connection, close: () => { + set((draft) => { + draft.state = "closing"; + }); console.log("Closing Remote Socket ", connection.code); - socket.close(); + const promise = new Promise((resolve) => { + socket.addEventListener("close", () => { + resolve(); + }); + socket.close(); + }); + return promise; }, }; } @@ -166,14 +181,23 @@ function startSyncRemoteStateStore() { const syncRemoteStateStore = (state: RemoteStore) => { const oldRemotes = useRemoteStateStore.getState().remotes; const { missing, extra } = diffByKeys(oldRemotes, state.remotes, (a, b) => _.isEqual(a.definition, b)); + console.log("syncRemoteStateStore: ", missing, extra); + for (const extraKey in extra) { + console.log("Closing Remote: ", extraKey); + oldRemotes[extraKey].close().then(() => { + useRemoteStateStore.setState((s) => + produce(s, (draft) => { + console.log("Closed Remote: ", extraKey); + delete draft.remotes[extraKey]; + }) + ); + }); + } useRemoteStateStore.setState((s) => produce(s, (draft) => { - for (const extraKey in extra) { - draft.remotes[extraKey].close(); - delete draft.remotes[extraKey]; - } for (const missingKey in missing) { + console.log("Missing: ", missing, missingKey); draft.remotes[missingKey] = openRemoteConnection(missing[missingKey], (recipe) => { useRemoteStateStore.setState((s) => produce(s, (draft) => { From 96ebcea660fa3a1bded31e47ae1253e0d76afcfa Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Wed, 2 Aug 2023 21:26:43 +0200 Subject: [PATCH 033/109] Fix remote interface sync --- src/remotePlugin/interface/stores.ts | 2 +- src/remotePlugin/remote/store.ts | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/remotePlugin/interface/stores.ts b/src/remotePlugin/interface/stores.ts index e88411c..55d603c 100644 --- a/src/remotePlugin/interface/stores.ts +++ b/src/remotePlugin/interface/stores.ts @@ -161,7 +161,7 @@ function createRemoteBrokeredInterface( ): InterfaceDisplayState & { brokerType: "remote" } { const syncRemoteStateStore = (s: RemoteStateStore) => { const remoteState = s.remotes[def.brokerSettings.remoteId]?.state; - if (remoteState !== undefined && remoteState.state === "connected") { + if (remoteState !== undefined && remoteState.state === "connected" && remoteState.interfaces[def.interfaceId] !== undefined) { set((draft) => { draft.values = remoteState.values; draft.layout = remoteState.interfaces[def.interfaceId].layout; diff --git a/src/remotePlugin/remote/store.ts b/src/remotePlugin/remote/store.ts index d5ab406..1545226 100644 --- a/src/remotePlugin/remote/store.ts +++ b/src/remotePlugin/remote/store.ts @@ -145,6 +145,13 @@ function openRemoteConnection(connection: RemoteConnection, set: Setter): Remote } }); }, + PublishInterfaces: (payload) => { + set((draft) => { + if (draft.state === "connected") { + draft.interfaces = _.keyBy(payload.interfaces, (i) => i.interfaceId); + } + }); + }, ValueChanged: ({ endpoint, value }) => { set((draft) => { if (draft.state === "connected") { From 9375f97ed8d9170239e4960afd7d67e0321071a1 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Wed, 2 Aug 2023 21:35:47 +0200 Subject: [PATCH 034/109] reduce try-catch to necessary area --- src/remotePlugin/publish/store.ts | 64 ++++++++++++++++--------------- 1 file changed, 33 insertions(+), 31 deletions(-) diff --git a/src/remotePlugin/publish/store.ts b/src/remotePlugin/publish/store.ts index eb8b3e7..e7b7ee4 100644 --- a/src/remotePlugin/publish/store.ts +++ b/src/remotePlugin/publish/store.ts @@ -118,40 +118,42 @@ function publish(set: Setter, get: Getter): void { }); socket.addEventListener("message", (event) => { console.log("WebSocket message: ", event); + let data: BeadiMessage; try { - const data: BeadiMessage = JSON.parse(event.data); - handleMessage(data, { - Welcome: (payload) => { - set((s) => { - s.state = makeConnectedState(socket, payload.id); - }); - sendMessage(socket, { - PublishEndpoints: { - endpoints: Object.values(useIOValueStore.getState().values).map((v) => ({ - id: v.valueId, - type: v.type, - value: v.value, - })), - }, - }); - sendMessage(socket, { - PublishInterfaces: { - interfaces: Object.values(useInterfaceFileStore.getState().interfaces), - }, - }); - }, - PublishEndpoints: (payload) => { - console.log("TODO Compare payload endpoints to actually published endpoints and warn if they diverge"); - }, - ValueChanged: ({ endpoint, value }) => { - console.log("ValueChanged request got to Set ", endpoint, " to ", value); - - useIOValueStore.getState().setValue(endpoint, value); - }, - }); + data = JSON.parse(event.data); } catch (e) { - console.error("Unreadable message: ", event); + console.error("Unreadable message: ", event, e); + return; } + handleMessage(data, { + Welcome: (payload) => { + set((s) => { + s.state = makeConnectedState(socket, payload.id); + }); + sendMessage(socket, { + PublishEndpoints: { + endpoints: Object.values(useIOValueStore.getState().values).map((v) => ({ + id: v.valueId, + type: v.type, + value: v.value, + })), + }, + }); + sendMessage(socket, { + PublishInterfaces: { + interfaces: Object.values(useInterfaceFileStore.getState().interfaces), + }, + }); + }, + PublishEndpoints: (payload) => { + console.log("TODO Compare payload endpoints to actually published endpoints and warn if they diverge"); + }, + ValueChanged: ({ endpoint, value }) => { + console.log("ValueChanged request got to Set ", endpoint, " to ", value); + + useIOValueStore.getState().setValue(endpoint, value); + }, + }); }); set((s) => { From d7ea73dd6386835293d77d76d45e461aeb1bf7c4 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Wed, 2 Aug 2023 21:40:03 +0200 Subject: [PATCH 035/109] Cleanups --- src/components/mobile/MobileView.tsx | 35 +------- src/registries.ts | 4 +- src/remotePlugin/interface/InterfaceList.tsx | 4 +- src/remotePlugin/interface/stores.ts | 84 +------------------ src/remotePlugin/publish/PublishManager.tsx | 22 +---- src/remotePlugin/publish/store.ts | 28 +------ src/remotePlugin/remote/ConnectionManager.tsx | 14 +--- src/remotePlugin/remote/store.ts | 2 +- 8 files changed, 13 insertions(+), 180 deletions(-) diff --git a/src/components/mobile/MobileView.tsx b/src/components/mobile/MobileView.tsx index f548da3..8a84faf 100644 --- a/src/components/mobile/MobileView.tsx +++ b/src/components/mobile/MobileView.tsx @@ -1,40 +1,7 @@ -import { ComponentType, FunctionComponent, useState } from "react"; -import { BsController, BsFile, BsGear } from "react-icons/bs"; +import { FunctionComponent, useState } from "react"; import { BottomBar } from "./BottomBar"; -import { FilesTab } from "./FilesTab"; -import { ProgramInterface } from "./ProgramInterface"; -import { SettingsTab } from "./SettingsTab"; -import { MobileWelcome } from "./Welcome"; import { settingsTabs } from "../../registries"; -// const TABS = [ -// { -// label: "Interface", -// icon: , -// }, -// { -// label: "Files", -// icon: , -// }, -// { -// label: "Settings", -// icon: , -// }, -// ]; - -// const InterfaceTab: FunctionComponent<{}> = () => { -// return ( -// <> -// -// -// ); -// }; -// const TAB_COMPONENTS: Record> = { -// Interface: InterfaceTab, -// Files: FilesTab, -// Settings: SettingsTab, -// }; - export const MobileView: FunctionComponent<{}> = () => { const [tabId, setTabId] = useState(Object.keys(settingsTabs)[0]); diff --git a/src/registries.ts b/src/registries.ts index 0ec4f25..e08edac 100644 --- a/src/registries.ts +++ b/src/registries.ts @@ -1,4 +1,4 @@ -import { AnyNodeDef, NodeDef } from "./engine/node"; +import { AnyNodeDef } from "./engine/node"; // import { // addNodeDef, @@ -10,7 +10,7 @@ import { buttonNodeDef } from "./nodes/ButtonNode"; import { timerNodeDef } from "./nodes/TimerNode"; import { inputAdapterNode } from "./nodes/InputAdapterNode"; import { toggleNodeDef } from "./nodes/ToggleNode"; -import { AnyInputAdapterDef, AnyOutputAdapterDef, InputAdapterDef } from "./engine/adapter"; +import { AnyInputAdapterDef, AnyOutputAdapterDef } from "./engine/adapter"; import { remoteInputAdapter, remoteInputFromOutputAdapter, testRemoteInputAdapter } from "./remotePlugin/inputAdapter"; import { remoteOutputAdapter, remoteOutputToInputAdapter, testRemoteOutputAdapter } from "./remotePlugin/outputAdapter"; import { outputAdapterNode } from "./nodes/OutputAdapterNode"; diff --git a/src/remotePlugin/interface/InterfaceList.tsx b/src/remotePlugin/interface/InterfaceList.tsx index 70efa0e..ce3cad0 100644 --- a/src/remotePlugin/interface/InterfaceList.tsx +++ b/src/remotePlugin/interface/InterfaceList.tsx @@ -3,7 +3,7 @@ import { useInterfaceDisplayStateStore, useInterfaceFileStore } from "./stores"; import { Interface } from "./Interface"; import { InterfaceEditor } from "./InterfaceEditor"; import { Button } from "../../components/input/Button"; -import { MdDelete, MdDeviceHub, MdEdit, MdEditOff, MdExpandLess, MdExpandMore, MdMore } from "react-icons/md"; +import { MdDelete, MdDeviceHub, MdEdit, MdEditOff, MdExpandLess, MdExpandMore } from "react-icons/md"; type InterfaceListEntryProps = { interfaceId: string; @@ -48,7 +48,7 @@ export const InterfaceListEntry: FunctionComponent = ({ }; type InterfaceListProps = {}; -export const InterfaceList: FunctionComponent = ({}) => { +export const InterfaceList: FunctionComponent = () => { const interfaces = useInterfaceDisplayStateStore((s) => Object.entries(s.interfaces).map(([interfaceId, iface]) => ({ interfaceId, diff --git a/src/remotePlugin/interface/stores.ts b/src/remotePlugin/interface/stores.ts index 55d603c..ffe4429 100644 --- a/src/remotePlugin/interface/stores.ts +++ b/src/remotePlugin/interface/stores.ts @@ -6,7 +6,7 @@ import _ from "lodash"; import { useCallback } from "react"; import { usePublishStateStore } from "../publish/store"; import { useIOValueStore } from "../inputOutputStore"; -import { RemoteStateStore, useRemoteStateStore, useRemoteStore } from "../remote/store"; +import { RemoteStateStore, useRemoteStateStore } from "../remote/store"; import { sendMessage } from "../message"; type RemoteBrokerSettings = { @@ -24,51 +24,6 @@ type InterfaceDisplayDef = { brokerSettings: {}; } ); -// type InterfaceDisplayStore = { -// interfaces: Record; - -// /** Local Interfaces are synced from the files tore */ -// addRemoteInterface: (interfaceId: string, brokerSettings: RemoteBrokerSettings) => void; -// removeRemoteInterface: (interfaceId: string) => void; -// }; -/** Make mutations to the displayed interfaces on this store, that gets synced into useInterfaceDisplayStateStore, read from there */ -// export const useInterfaceDisplayStore = create( -// devtools( -// persist( -// (set, get) => ({ -// interfaces: {}, - -// addRemoteInterface: (interfaceId, settings) => { -// set((s) => -// produce(s, (draft) => { -// draft.interfaces[interfaceId] = { -// interfaceId: interfaceId, -// brokerType: "remote", -// brokerSettings: settings, -// }; -// }) -// ); -// }, -// removeRemoteInterface: (interfaceId) => { -// set((s) => -// produce(s, (draft) => { -// delete draft.interfaces[interfaceId]; -// }) -// ); -// }, -// }), -// { -// name: "interfaceDisplay", -// getStorage: () => window.sessionStorage, -// version: 1, -// } -// ), -// { -// name: "useInterfaceDisplayStore", -// } -// ) -// ); - type Widget = { widgetId: string; widgetType: string; @@ -154,7 +109,7 @@ export const useInterfaceDisplayStateStore = create( ); type Setter = (recipe: (draft: Draft) => void) => void; -type Getter = () => InterfaceDisplayState; +// type Getter = () => InterfaceDisplayState; function createRemoteBrokeredInterface( def: InterfaceDisplayDef & { brokerType: "remote" }, set: Setter @@ -236,36 +191,6 @@ function createLocalBrokeredInterface( export function setupInterfaceListeners() { console.log("Setup Interface Listeners"); - // const syncInterfaceDisplayStateStore = (state: InterfaceDisplayStore) => { - // const oldStateStore = useInterfaceDisplayStateStore.getState(); - // const { extra, missing } = diffByKeys(oldStateStore.interfaces, state.interfaces); - - // useInterfaceDisplayStateStore.setState((s) => - // produce(s, (draft) => { - // for (const extraKey in extra) { - // //TODO Close up the broker. - // draft.interfaces[extraKey].closeBroker(); - // delete draft.interfaces[extraKey]; - // } - // for (const missingKey in missing) { - // const interfaceDef = missing[missingKey]; - - // const set: Setter = (recipe) => { - // useInterfaceDisplayStateStore.setState((s) => produce(s, (draft) => recipe(draft.interfaces[missingKey]))); - // }; - // //TODO Open up the broker. - // if (interfaceDef.brokerType === "local") { - // draft.interfaces[missingKey] = createLocalBrokeredInterface(interfaceDef, set); - // } else { - // draft.interfaces[missingKey] = createRemoteBrokeredInterface(interfaceDef, set); - // } - // } - // }) - // ); - // }; - // useInterfaceDisplayStore.subscribe(syncInterfaceDisplayStateStore); - // syncInterfaceDisplayStateStore(useInterfaceDisplayStore.getState()); - const syncLocalInterfacesFromFileStore = (state: InterfaceFileStore) => { const existingLocalInterfaces = _.pickBy(useInterfaceDisplayStateStore.getState().interfaces, (s) => s.brokerType === "local"); const { extra, missing } = diffByKeys(existingLocalInterfaces, state.interfaces); @@ -287,11 +212,6 @@ export function setupInterfaceListeners() { }, set ); - // draft.interfaces[missingKey] = { - // brokerSettings: {}, - // brokerType: "local", - // interfaceId: missingKey, - // }; } }) ); diff --git a/src/remotePlugin/publish/PublishManager.tsx b/src/remotePlugin/publish/PublishManager.tsx index acf88c9..e449ae8 100644 --- a/src/remotePlugin/publish/PublishManager.tsx +++ b/src/remotePlugin/publish/PublishManager.tsx @@ -1,10 +1,9 @@ import { FunctionComponent } from "react"; import { usePublishStateStore } from "./store"; import { Button } from "../../components/input/Button"; -import clsx from "clsx"; type PublishManagerProps = {}; -export const PublishManager: FunctionComponent = ({}) => { +export const PublishManager: FunctionComponent = () => { const state = usePublishStateStore((s) => s.state); return ( @@ -26,23 +25,4 @@ export const PublishManager: FunctionComponent = ({}) => { {state.state !== "disconnected" && }
    ); - - // return ( - //
    - //
    - // {state.state} {state.state === "connected" && {state.id}} - //
    - // {state.state !== "disconnected" ? ( - // - // ) : ( - // - // )} - //
    - // ); }; diff --git a/src/remotePlugin/publish/store.ts b/src/remotePlugin/publish/store.ts index e7b7ee4..ba84490 100644 --- a/src/remotePlugin/publish/store.ts +++ b/src/remotePlugin/publish/store.ts @@ -1,7 +1,6 @@ import produce, { Draft } from "immer"; import create from "zustand"; -import { devtools, persist } from "zustand/middleware"; -import { immer } from "zustand/middleware/immer"; +import { devtools } from "zustand/middleware"; import { BeadiMessage, handleMessage, sendMessage } from "../message"; import { useIOValueStore } from "../inputOutputStore"; import { useInterfaceFileStore } from "../interface/stores"; @@ -160,28 +159,3 @@ function publish(set: Setter, get: Getter): void { s.state = makeConnectingState(socket); }); } - -// export function startSyncPublishConnectionState() { -// const syncToState = (state: PublishStore) => { -// const oldState = usePublishStateStore.getState(); - -// const oldConnectionState = oldState.state; -// const oldIsConnected = oldConnectionState.state === "connecting" || oldConnectionState.state === "connected"; -// if (oldIsConnected && !state.published) { -// //Disconnect -// oldConnectionState.close(); -// } -// if (!oldIsConnected && state.published) { -// //Connect -// usePublishStateStore.setState( -// publish((recipe) => { -// usePublishStateStore.setState((s) => produce(s, recipe)); -// }, usePublishStateStore.getState) -// ); -// } -// }; - -// usePublishStore.subscribe(syncToState); -// syncToState(usePublishStore.getState()); -// } -// startSyncPublishConnectionState(); diff --git a/src/remotePlugin/remote/ConnectionManager.tsx b/src/remotePlugin/remote/ConnectionManager.tsx index e2a4b2a..662dd97 100644 --- a/src/remotePlugin/remote/ConnectionManager.tsx +++ b/src/remotePlugin/remote/ConnectionManager.tsx @@ -2,7 +2,7 @@ import { FunctionComponent, useState } from "react"; import { useRemoteStateStore, useRemoteStore } from "./store"; import { TextInput } from "../../components/input/TextInput"; import { Button } from "../../components/input/Button"; -import { MdDelete, MdOpenInNew, MdWifi, MdWifiOff } from "react-icons/md"; +import { MdDelete, MdWifi, MdWifiOff } from "react-icons/md"; import { CollapsibleCard } from "../../components/CollapsibleCard"; import { Typo } from "../../components/Typo"; @@ -13,14 +13,6 @@ const RemoteConnectionDisplay: FunctionComponent = const connectionState = useRemoteStateStore((s) => s.remotes[remoteConnectionId]); const removeConnection = useRemoteStore((s) => s.removeConnection); - // const addRemoteInterface = useInterfaceDisplayStore((s) => s.addRemoteInterface); - - // const openRemoteInterface = (interfaceId: string) => { - // addRemoteInterface(interfaceId, { - // remoteId: remoteConnectionId, - // }); - // }; - const state = connectionState.state; return ( = }; type RemoteConnectionFormProps = {}; -export const RemoteConnectionForm: FunctionComponent = ({}) => { +export const RemoteConnectionForm: FunctionComponent = () => { const addConnection = useRemoteStore((s) => s.addConnection); const [code, setCode] = useState(""); @@ -79,7 +71,7 @@ export const RemoteConnectionForm: FunctionComponent }; type ConnectionManagerProps = {}; -export const ConnectionManager: FunctionComponent = ({}) => { +export const ConnectionManager: FunctionComponent = () => { const remoteStore = useRemoteStateStore((s) => Object.values(s.remotes)); return ( diff --git a/src/remotePlugin/remote/store.ts b/src/remotePlugin/remote/store.ts index 1545226..5012ba6 100644 --- a/src/remotePlugin/remote/store.ts +++ b/src/remotePlugin/remote/store.ts @@ -1,5 +1,5 @@ import create from "zustand"; -import { diffBy, diffByKeys } from "../../utils/diffBy"; +import { diffByKeys } from "../../utils/diffBy"; import produce, { Draft } from "immer"; import { BeadiMessage, handleMessage } from "../message"; import { immer } from "zustand/middleware/immer"; From c758697c4b573d4fad54525a02f298d767719b57 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Thu, 3 Aug 2023 14:04:32 +0200 Subject: [PATCH 036/109] Edit Interface Names --- src/components/CollapsibleCard.tsx | 12 ++-- src/components/Settings.tsx | 3 +- src/components/input/TextInput.tsx | 19 +++--- src/remotePlugin/interface/Interface.tsx | 2 +- src/remotePlugin/interface/InterfaceList.tsx | 64 +++++++++++++------- src/remotePlugin/interface/stores.ts | 22 ++++--- 6 files changed, 71 insertions(+), 51 deletions(-) diff --git a/src/components/CollapsibleCard.tsx b/src/components/CollapsibleCard.tsx index 9a95c06..443aa40 100644 --- a/src/components/CollapsibleCard.tsx +++ b/src/components/CollapsibleCard.tsx @@ -4,21 +4,21 @@ import { MdExpandLess, MdExpandMore } from "react-icons/md"; import clsx from "clsx"; type CollapsibleCardProps = { - header?: ReactNode; - children?: ReactNode; + header?: ReactNode | FunctionComponent<{}>; + children?: ReactNode | FunctionComponent<{}>; startExpanded?: boolean; }; -export const CollapsibleCard: FunctionComponent = ({ header, children, startExpanded }) => { +export const CollapsibleCard: FunctionComponent = ({ header: Header, children: Children, startExpanded }) => { const [expanded, setExpanded] = useState(startExpanded ?? true); return ( -
    +
    - {header} + {typeof Header === "function" ?
    : Header} {!expanded && } {expanded && }
    - {expanded &&
    {children}
    } + {expanded &&
    {typeof Children === "function" ? : Children}
    }
    ); }; diff --git a/src/components/Settings.tsx b/src/components/Settings.tsx index 51d1d72..451d566 100644 --- a/src/components/Settings.tsx +++ b/src/components/Settings.tsx @@ -3,6 +3,7 @@ import { ComponentType, FunctionComponent, ReactNode, useMemo, useState } from " import { BsChevronBarRight, BsFile } from "react-icons/bs"; import { FileSettings } from "./settings/FileSettings"; import { settingsTabs } from "../registries"; +import { MdInsertDriveFile } from "react-icons/md"; export type Tab = { id: string; @@ -14,7 +15,7 @@ export type Tab = { export const fileTab: Tab = { id: "file", label: "File", - icon: , + icon: , tab: FileSettings, }; diff --git a/src/components/input/TextInput.tsx b/src/components/input/TextInput.tsx index 9d6820b..c1032ab 100644 --- a/src/components/input/TextInput.tsx +++ b/src/components/input/TextInput.tsx @@ -2,38 +2,33 @@ import clsx from "clsx"; import { FunctionComponent, useState } from "react"; type TextInputProps = { - label: string; + label?: string; value: string; name?: string; id: string; onChange?: (value: string) => void; }; -export const TextInput: FunctionComponent = ({ - label, - value, - name, - id, - onChange, -}) => { +export const TextInput: FunctionComponent = ({ label, value, name, id, onChange }) => { const [editing, setEditing] = useState(false); return (
    - {!editing && ( + {!editing && label && ( )} + {!label &&
    }
    onChange?.(e.target.value)} diff --git a/src/remotePlugin/interface/Interface.tsx b/src/remotePlugin/interface/Interface.tsx index 96e69fa..d3b1c3f 100644 --- a/src/remotePlugin/interface/Interface.tsx +++ b/src/remotePlugin/interface/Interface.tsx @@ -11,7 +11,7 @@ export const Interface: FunctionComponent = ({ interfaceId }) => return (
      - {interfaceState.layout.map((it) => ( + {interfaceState.def.layout.map((it) => (
    • diff --git a/src/remotePlugin/interface/InterfaceList.tsx b/src/remotePlugin/interface/InterfaceList.tsx index ce3cad0..0fb2e83 100644 --- a/src/remotePlugin/interface/InterfaceList.tsx +++ b/src/remotePlugin/interface/InterfaceList.tsx @@ -4,6 +4,8 @@ import { Interface } from "./Interface"; import { InterfaceEditor } from "./InterfaceEditor"; import { Button } from "../../components/input/Button"; import { MdDelete, MdDeviceHub, MdEdit, MdEditOff, MdExpandLess, MdExpandMore } from "react-icons/md"; +import { CollapsibleCard } from "../../components/CollapsibleCard"; +import { TextInput } from "../../components/input/TextInput"; type InterfaceListEntryProps = { interfaceId: string; @@ -11,38 +13,54 @@ type InterfaceListEntryProps = { }; export const InterfaceListEntry: FunctionComponent = ({ interfaceId, brokerType }) => { const [editing, setEditing] = useState(false); - const [expanded, setExpanded] = useState(true); const deleteLocalInterface = useInterfaceFileStore((s) => s.deleteInterface); // const deleteRemoteInterface = useInterfaceDisplayStore((s) => s.removeRemoteInterface); const isLocal = brokerType === "local"; + const iface = useInterfaceDisplayStateStore((s) => s.interfaces[interfaceId]); + const updateInterface = useInterfaceFileStore((s) => s.updateInterface); if (editing && isLocal) { return ( -
      -
      - {!isLocal && } - {isLocal && L} -
      - - -
      + + {!isLocal && } + {isLocal && L} +
      + + updateInterface(interfaceId, (d) => { + d.name = e; + }) + } + id={`name_${interfaceId}`} + > +
      + + + + } + > -
      + ); } else { return ( -
      -
      - {!isLocal && } - {isLocal && L} -
      - {/* */} - {isLocal && } - {!expanded && } - {expanded && } -
      - {expanded && } -
      + + {!isLocal && } + {isLocal && L} + {iface.def.name} +
      + {/* */} + {isLocal && } + + } + > + +
      ); } }; @@ -59,7 +77,7 @@ export const InterfaceList: FunctionComponent = () => { return (
        {interfaces.map(({ interfaceId, brokerType }) => ( -
      • +
      • ))} diff --git a/src/remotePlugin/interface/stores.ts b/src/remotePlugin/interface/stores.ts index ffe4429..b9d15b0 100644 --- a/src/remotePlugin/interface/stores.ts +++ b/src/remotePlugin/interface/stores.ts @@ -88,8 +88,9 @@ type InterfaceDisplayValueState = { value: any; }; type InterfaceDisplayState = { - interfaceId: string; - layout: Widget[]; + // interfaceId: string; + // layout: Widget[]; + def: Interface; values: Record; brokerState: any; brokerType: string; @@ -119,7 +120,7 @@ function createRemoteBrokeredInterface( if (remoteState !== undefined && remoteState.state === "connected" && remoteState.interfaces[def.interfaceId] !== undefined) { set((draft) => { draft.values = remoteState.values; - draft.layout = remoteState.interfaces[def.interfaceId].layout; + draft.def = remoteState.interfaces[def.interfaceId]; }); } }; @@ -132,8 +133,14 @@ function createRemoteBrokeredInterface( return { brokerType: "remote", brokerState: {}, - interfaceId: def.interfaceId, - layout: remoteState.state === "connected" ? _.cloneDeep(remoteState.interfaces[def.interfaceId].layout) : [], + def: + remoteState.state === "connected" + ? _.cloneDeep(remoteState.interfaces[def.interfaceId]) + : { + interfaceId: def.interfaceId, + layout: [], + name: "...", + }, values: remoteState.state === "connected" ? _.cloneDeep(remoteState.values) : {}, updateValue: (valueId, value) => { console.log("Remotely updating ", valueId, " to ", value); @@ -167,15 +174,14 @@ function createLocalBrokeredInterface( console.warn("Tried to update interface broker for nonexisting interface.", def.interfaceId); return; } - draft.layout = s.interfaces[def.interfaceId].layout; + draft.def = _.cloneDeep(s.interfaces[def.interfaceId]); }); }); return { brokerType: "local", brokerState: {}, - interfaceId: def.interfaceId, - layout: useInterfaceFileStore.getState().interfaces[def.interfaceId].layout, + def: _.cloneDeep(useInterfaceFileStore.getState().interfaces[def.interfaceId]), values: useIOValueStore.getState().values, updateValue: (valueId, value) => { console.log("Locally udpating ", valueId, " to ", value); From adda878e13768fad0d25c8bf7b554dbf9524cf5a Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Thu, 3 Aug 2023 17:59:52 +0200 Subject: [PATCH 037/109] RemoteSettings polishing --- src/components/CollapsibleCard.tsx | 19 ++++++++++--- src/components/mobile/BottomBar.tsx | 21 ++++++++------ src/components/mobile/MobileView.tsx | 2 +- src/remotePlugin/RemoteDrawerPage.tsx | 28 ++++++++++++++++++- src/remotePlugin/remote/ConnectionManager.tsx | 22 +++++++++++---- 5 files changed, 73 insertions(+), 19 deletions(-) diff --git a/src/components/CollapsibleCard.tsx b/src/components/CollapsibleCard.tsx index 443aa40..308cd79 100644 --- a/src/components/CollapsibleCard.tsx +++ b/src/components/CollapsibleCard.tsx @@ -6,19 +6,30 @@ import clsx from "clsx"; type CollapsibleCardProps = { header?: ReactNode | FunctionComponent<{}>; children?: ReactNode | FunctionComponent<{}>; + forceExpanded?: boolean | undefined; startExpanded?: boolean; }; -export const CollapsibleCard: FunctionComponent = ({ header: Header, children: Children, startExpanded }) => { +export const CollapsibleCard: FunctionComponent = ({ + header: Header, + children: Children, + startExpanded, + forceExpanded, +}) => { const [expanded, setExpanded] = useState(startExpanded ?? true); + + const actuallyExpanded = expanded || forceExpanded; + return (
        {typeof Header === "function" ?
        : Header} - {!expanded && } - {expanded && } + {!expanded && forceExpanded === undefined && } + {expanded && forceExpanded === undefined && }
        - {expanded &&
        {typeof Children === "function" ? : Children}
        } + {actuallyExpanded && ( +
        {typeof Children === "function" ? : Children}
        + )}
        ); }; diff --git a/src/components/mobile/BottomBar.tsx b/src/components/mobile/BottomBar.tsx index e1fe58c..510b4f8 100644 --- a/src/components/mobile/BottomBar.tsx +++ b/src/components/mobile/BottomBar.tsx @@ -1,13 +1,17 @@ +import clsx from "clsx"; import { FunctionComponent, ReactNode } from "react"; type BottomBarContainerProps = { children?: ReactNode; + active: boolean; onClick: () => void; }; -const BottomBarContainer: FunctionComponent = ({ children, onClick }) => { +const BottomBarContainer: FunctionComponent = ({ children, onClick, active }) => { return ( - ); }; @@ -18,16 +22,17 @@ type TabDef = { icon: ReactNode; }; type BottomBarProps = { + activeTabId: string; tabs: TabDef[]; onTabChange: (id: string) => void; }; -export const BottomBar: FunctionComponent = ({ tabs, onTabChange }) => { +export const BottomBar: FunctionComponent = ({ activeTabId, tabs, onTabChange }) => { return ( -
        +
        {tabs.map((it, index) => ( - onTabChange(it.id)} key={it.label}> - {it.icon} -
        {it.label}
        + onTabChange(it.id)} key={it.label} active={activeTabId === it.id}> +
        {it.icon}
        +
        {it.label}
        ))}
        diff --git a/src/components/mobile/MobileView.tsx b/src/components/mobile/MobileView.tsx index 8a84faf..8bc6a0b 100644 --- a/src/components/mobile/MobileView.tsx +++ b/src/components/mobile/MobileView.tsx @@ -13,7 +13,7 @@ export const MobileView: FunctionComponent<{}> = () => {
        - setTabId(tab)}> + setTabId(tab)} activeTabId={tabId}>
        ); }; diff --git a/src/remotePlugin/RemoteDrawerPage.tsx b/src/remotePlugin/RemoteDrawerPage.tsx index d474fad..0f1cf8a 100644 --- a/src/remotePlugin/RemoteDrawerPage.tsx +++ b/src/remotePlugin/RemoteDrawerPage.tsx @@ -7,6 +7,10 @@ import { useInterfaceFileStore } from "./interface/stores"; import { ConnectionManager } from "./remote/ConnectionManager"; import { PublishManager } from "./publish/PublishManager"; import { Typo } from "../components/Typo"; +import { useRemoteStateStore } from "./remote/store"; +import _ from "lodash"; +import { usePublishStateStore } from "./publish/store"; +import clsx from "clsx"; const RemoteSettingsTab: FunctionComponent<{}> = () => { const addLocalInterface = useInterfaceFileStore((s) => s.addInterface); @@ -30,9 +34,31 @@ const RemoteSettingsTab: FunctionComponent<{}> = () => { ); }; +type RemoteSettingsIconProps = {}; +export const RemoteSettingsIcon: FunctionComponent = ({}) => { + const publishState = usePublishStateStore((s) => s.state.state); + const remotes = useRemoteStateStore((s) => _.values(s.remotes).filter((s) => s.state.state === "connected").length); + + return ( +
        + + {publishState !== "disconnected" && ( +
        + )} + {remotes > 0 && ( +
        + {remotes} +
        + )} +
        + ); +}; + export const remoteSettingsTab: Tab = { id: "remote", - icon: , + icon: , label: "Remote", tab: RemoteSettingsTab, }; diff --git a/src/remotePlugin/remote/ConnectionManager.tsx b/src/remotePlugin/remote/ConnectionManager.tsx index 662dd97..770c80a 100644 --- a/src/remotePlugin/remote/ConnectionManager.tsx +++ b/src/remotePlugin/remote/ConnectionManager.tsx @@ -61,12 +61,14 @@ export const RemoteConnectionForm: FunctionComponent }; return ( -
        - - -
        + ); }; @@ -83,7 +85,17 @@ export const ConnectionManager: FunctionComponent = () = ))}
      - + +
      Add Remote Connection
      +
      + + } + > + +
    ); }; From d702f94a4533bf4ff6654abda84a10aacc201b6f Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Thu, 3 Aug 2023 19:02:55 +0200 Subject: [PATCH 038/109] Move tabs and mobile view to router --- src/components/Settings.tsx | 53 +++++++++++++++------------ src/components/mobile/BottomBar.tsx | 29 ++++++++------- src/components/mobile/MobileView.tsx | 11 +++--- src/index.tsx | 7 ++++ src/remotePlugin/RemoteDrawerPage.tsx | 2 +- 5 files changed, 59 insertions(+), 43 deletions(-) diff --git a/src/components/Settings.tsx b/src/components/Settings.tsx index 451d566..335c213 100644 --- a/src/components/Settings.tsx +++ b/src/components/Settings.tsx @@ -4,60 +4,67 @@ import { BsChevronBarRight, BsFile } from "react-icons/bs"; import { FileSettings } from "./settings/FileSettings"; import { settingsTabs } from "../registries"; import { MdInsertDriveFile } from "react-icons/md"; +import { NavLink, Outlet, useLocation, useMatch } from "react-router-dom"; export type Tab = { id: string; label: string; icon: ReactNode; - tab: ComponentType<{}>; + tab: ReactNode; }; export const fileTab: Tab = { id: "file", label: "File", icon: , - tab: FileSettings, + tab: , }; export const Settings: FunctionComponent<{}> = () => { - const [tab, setTab] = useState(Object.keys(settingsTabs)[0]); + // const [tab, setTab] = useState(Object.keys(settingsTabs)[0]); - const Component = useMemo(() => { - if (tab == null) { - return null; - } else { - return settingsTabs[tab].tab; - } - }, [tab]); + // const Component = useMemo(() => { + // if (tab == null) { + // return null; + // } else { + // return settingsTabs[tab].tab; + // } + // }, [tab]); + const isRoot = useLocation(); + const expanded = isRoot.pathname !== "/"; return (
      {Object.entries(settingsTabs).map(([key, value]) => ( -
    • setTab(key)} - className={clsx("w-10 h-10 p-2 rounded-l-md cursor-pointer", tab === key ? "bg-primary-900" : "bg-primary-1000")} + to={value.id} + className={({ isActive }) => clsx("w-10 h-10 p-2 rounded-l-md cursor-pointer", isActive ? "bg-primary-900" : "bg-primary-1000")} > {value.icon} -
    • + ))} -
    • setTab(null)} + + clsx("w-10 h-10 p-2 mt-auto cursor-pointer transition-all", { + "opacity-0": isActive, + }) + } + to="/" > -
    • +
    -
    {Component && }
    +
    + +
    ); diff --git a/src/components/mobile/BottomBar.tsx b/src/components/mobile/BottomBar.tsx index 510b4f8..059877b 100644 --- a/src/components/mobile/BottomBar.tsx +++ b/src/components/mobile/BottomBar.tsx @@ -1,18 +1,22 @@ import clsx from "clsx"; import { FunctionComponent, ReactNode } from "react"; +import { Link, NavLink, To, useMatch } from "react-router-dom"; type BottomBarContainerProps = { - children?: ReactNode; - active: boolean; - onClick: () => void; + tab: TabDef; + + // active: boolean; + // onClick: () => void; }; -const BottomBarContainer: FunctionComponent = ({ children, onClick, active }) => { +const BottomBarContainer: FunctionComponent = ({ tab }) => { + const active = useMatch(tab.id); return ( - + ); }; @@ -22,18 +26,15 @@ type TabDef = { icon: ReactNode; }; type BottomBarProps = { - activeTabId: string; + // activeTabId: string; tabs: TabDef[]; - onTabChange: (id: string) => void; + // onTabChange: (id: string) => void; }; -export const BottomBar: FunctionComponent = ({ activeTabId, tabs, onTabChange }) => { +export const BottomBar: FunctionComponent = ({ tabs }) => { return (
    {tabs.map((it, index) => ( - onTabChange(it.id)} key={it.label} active={activeTabId === it.id}> -
    {it.icon}
    -
    {it.label}
    -
    + ))}
    ); diff --git a/src/components/mobile/MobileView.tsx b/src/components/mobile/MobileView.tsx index 8bc6a0b..4edf3c3 100644 --- a/src/components/mobile/MobileView.tsx +++ b/src/components/mobile/MobileView.tsx @@ -1,19 +1,20 @@ import { FunctionComponent, useState } from "react"; import { BottomBar } from "./BottomBar"; import { settingsTabs } from "../../registries"; +import { Outlet } from "react-router-dom"; export const MobileView: FunctionComponent<{}> = () => { - const [tabId, setTabId] = useState(Object.keys(settingsTabs)[0]); + // const [tabId, setTabId] = useState(Object.keys(settingsTabs)[0]); - const tabDef = settingsTabs[tabId]; - const Content = tabDef.tab; + // const tabDef = settingsTabs[tabId]; + // const Content = tabDef.tab; return (
    - +
    - setTabId(tab)} activeTabId={tabId}> +
    ); }; diff --git a/src/index.tsx b/src/index.tsx index 8e2890c..340cac4 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -9,6 +9,7 @@ import { RouterProvider, createBrowserRouter } from "react-router-dom"; import { watchForChanges } from "./engine"; import { useFileStore } from "./engine/store"; import { tempSyncIOValueStore } from "./remotePlugin/inputOutputStore"; +import { settingsTabs } from "./registries"; // import { setButtplugInstance } from "./adapters/store"; // enableAllPlugins(); @@ -17,6 +18,12 @@ const router = createBrowserRouter([ { path: "/", element: , + children: [ + ...Object.values(settingsTabs).map((it) => ({ + path: it.id, + element: it.tab, + })), + ], }, ]); diff --git a/src/remotePlugin/RemoteDrawerPage.tsx b/src/remotePlugin/RemoteDrawerPage.tsx index 0f1cf8a..e21ede1 100644 --- a/src/remotePlugin/RemoteDrawerPage.tsx +++ b/src/remotePlugin/RemoteDrawerPage.tsx @@ -60,5 +60,5 @@ export const remoteSettingsTab: Tab = { id: "remote", icon: , label: "Remote", - tab: RemoteSettingsTab, + tab: , }; From 9d55ec7b95af2b14308f9fd89bb261d05cd9c5f6 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Thu, 3 Aug 2023 19:26:51 +0200 Subject: [PATCH 039/109] use md icons --- src/components/Settings.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Settings.tsx b/src/components/Settings.tsx index 335c213..6aed541 100644 --- a/src/components/Settings.tsx +++ b/src/components/Settings.tsx @@ -3,7 +3,7 @@ import { ComponentType, FunctionComponent, ReactNode, useMemo, useState } from " import { BsChevronBarRight, BsFile } from "react-icons/bs"; import { FileSettings } from "./settings/FileSettings"; import { settingsTabs } from "../registries"; -import { MdInsertDriveFile } from "react-icons/md"; +import { MdChevronRight, MdInsertDriveFile } from "react-icons/md"; import { NavLink, Outlet, useLocation, useMatch } from "react-router-dom"; export type Tab = { @@ -53,7 +53,7 @@ export const Settings: FunctionComponent<{}> = () => { } to="/" > - +
Date: Thu, 3 Aug 2023 19:39:32 +0200 Subject: [PATCH 040/109] Fix publish endpoints --- src/remotePlugin/publish/store.ts | 24 ++++++++++++++++++++++-- src/remotePlugin/remote/store.ts | 5 ++++- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/remotePlugin/publish/store.ts b/src/remotePlugin/publish/store.ts index ba84490..d0cdaed 100644 --- a/src/remotePlugin/publish/store.ts +++ b/src/remotePlugin/publish/store.ts @@ -4,6 +4,8 @@ import { devtools } from "zustand/middleware"; import { BeadiMessage, handleMessage, sendMessage } from "../message"; import { useIOValueStore } from "../inputOutputStore"; import { useInterfaceFileStore } from "../interface/stores"; +import { useFileStore } from "../../engine/store"; +import _ from "lodash"; function makeDisconnectedState(set: Setter, get: Getter, error?: string): PublishConnectionState & { state: "disconnected" } { return { @@ -32,8 +34,6 @@ function makeConnectingState(socket: WebSocket): PublishConnectionState & { stat }; } function makeConnectedState(socket: WebSocket, id: string): PublishConnectionState & { state: "connected" } { - const unsubscribeValueChanges = useIOValueStore.subscribe((it) => {}); - const unsubscribeInterfaceChanges = useInterfaceFileStore.subscribe((state) => { sendMessage(socket, { PublishInterfaces: { @@ -42,6 +42,26 @@ function makeConnectedState(socket: WebSocket, id: string): PublishConnectionSta }); }); + let lastPublishedEndpointDefs: { id: string; type: string }[] = []; + const unsubscribeValueChanges = useIOValueStore.subscribe((state) => { + const endpointDefs = Object.values(state.values).map((v) => ({ + id: v.valueId, + type: v.type, + })); + if (!_.isEqual(endpointDefs, lastPublishedEndpointDefs)) { + lastPublishedEndpointDefs = endpointDefs; + sendMessage(socket, { + PublishEndpoints: { + endpoints: Object.values(state.values).map((v) => ({ + id: v.valueId, + type: v.type, + value: v.value, + })), + }, + }); + } + }); + return { state: "connected", close: () => { diff --git a/src/remotePlugin/remote/store.ts b/src/remotePlugin/remote/store.ts index 5012ba6..5faaf7a 100644 --- a/src/remotePlugin/remote/store.ts +++ b/src/remotePlugin/remote/store.ts @@ -139,7 +139,10 @@ function openRemoteConnection(connection: RemoteConnection, set: Setter): Remote draft.values = Object.assign( {}, ...payload.endpoints.map((it) => ({ - [it.id]: it, + [it.id]: { + value: it.value, + valueId: it.id, + } satisfies RemoteConnectionValue, })) ); } From 7d67a4810c5cacd3e91b3d45a0b07fb48aa23a37 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Thu, 3 Aug 2023 19:51:18 +0200 Subject: [PATCH 041/109] Reorder publish --- src/remotePlugin/RemoteDrawerPage.tsx | 8 ++++---- src/remotePlugin/inputAdapter.ts | 2 +- src/remotePlugin/publish/PublishManager.tsx | 3 ++- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/remotePlugin/RemoteDrawerPage.tsx b/src/remotePlugin/RemoteDrawerPage.tsx index e21ede1..6bb4ce1 100644 --- a/src/remotePlugin/RemoteDrawerPage.tsx +++ b/src/remotePlugin/RemoteDrawerPage.tsx @@ -17,10 +17,6 @@ const RemoteSettingsTab: FunctionComponent<{}> = () => { return ( <> -
- Publish - -
Control @@ -30,6 +26,10 @@ const RemoteSettingsTab: FunctionComponent<{}> = () => { Remote Connections
+
+ Open to Controllers + +
); }; diff --git a/src/remotePlugin/inputAdapter.ts b/src/remotePlugin/inputAdapter.ts index 1dc10fa..76f1362 100644 --- a/src/remotePlugin/inputAdapter.ts +++ b/src/remotePlugin/inputAdapter.ts @@ -16,7 +16,7 @@ export const remoteInputFromOutputAdapter: InputAdapterDef = { // console.log("RemoteOutputToRemoteInput", data); return 0.0; }, - label: "Set Remote Input", + label: "Read Remote Output", }; export const testRemoteInputAdapter: InputAdapterDef = { diff --git a/src/remotePlugin/publish/PublishManager.tsx b/src/remotePlugin/publish/PublishManager.tsx index e449ae8..73c0943 100644 --- a/src/remotePlugin/publish/PublishManager.tsx +++ b/src/remotePlugin/publish/PublishManager.tsx @@ -17,8 +17,9 @@ export const PublishManager: FunctionComponent = () => { {state.state === "connecting" &&
Connecting...
} {state.state === "connected" && (
-
Remote Control published at
+
Remote Control published at code
{state.id} +
Others can enter that code to connect to published Values / Interfaces
)} {state.state === "disconnected" && } From 21ca15163ac885f89d21ce3823a26854b494dad4 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Thu, 3 Aug 2023 20:13:37 +0200 Subject: [PATCH 042/109] Cleanups --- src/components/Settings.tsx | 14 +--- src/components/mobile/BottomBar.tsx | 7 +- src/components/mobile/FilesTab.tsx | 22 ------ src/components/mobile/MobileView.tsx | 2 +- src/components/mobile/ProgramInterface.tsx | 76 --------------------- src/components/mobile/SettingsTab.tsx | 23 ------- src/components/settings/MobileInterface.tsx | 20 ------ src/remotePlugin/RemoteDrawerPage.tsx | 2 +- src/remotePlugin/publish/store.ts | 1 - 9 files changed, 5 insertions(+), 162 deletions(-) delete mode 100644 src/components/mobile/FilesTab.tsx delete mode 100644 src/components/mobile/ProgramInterface.tsx delete mode 100644 src/components/mobile/SettingsTab.tsx delete mode 100644 src/components/settings/MobileInterface.tsx diff --git a/src/components/Settings.tsx b/src/components/Settings.tsx index 6aed541..78eda0d 100644 --- a/src/components/Settings.tsx +++ b/src/components/Settings.tsx @@ -1,10 +1,9 @@ import clsx from "clsx"; -import { ComponentType, FunctionComponent, ReactNode, useMemo, useState } from "react"; -import { BsChevronBarRight, BsFile } from "react-icons/bs"; +import { FunctionComponent, ReactNode } from "react"; import { FileSettings } from "./settings/FileSettings"; import { settingsTabs } from "../registries"; import { MdChevronRight, MdInsertDriveFile } from "react-icons/md"; -import { NavLink, Outlet, useLocation, useMatch } from "react-router-dom"; +import { NavLink, Outlet, useLocation } from "react-router-dom"; export type Tab = { id: string; @@ -21,15 +20,6 @@ export const fileTab: Tab = { }; export const Settings: FunctionComponent<{}> = () => { - // const [tab, setTab] = useState(Object.keys(settingsTabs)[0]); - - // const Component = useMemo(() => { - // if (tab == null) { - // return null; - // } else { - // return settingsTabs[tab].tab; - // } - // }, [tab]); const isRoot = useLocation(); const expanded = isRoot.pathname !== "/"; diff --git a/src/components/mobile/BottomBar.tsx b/src/components/mobile/BottomBar.tsx index 059877b..7d000ef 100644 --- a/src/components/mobile/BottomBar.tsx +++ b/src/components/mobile/BottomBar.tsx @@ -1,12 +1,9 @@ import clsx from "clsx"; import { FunctionComponent, ReactNode } from "react"; -import { Link, NavLink, To, useMatch } from "react-router-dom"; +import { NavLink, useMatch } from "react-router-dom"; type BottomBarContainerProps = { tab: TabDef; - - // active: boolean; - // onClick: () => void; }; const BottomBarContainer: FunctionComponent = ({ tab }) => { const active = useMatch(tab.id); @@ -26,9 +23,7 @@ type TabDef = { icon: ReactNode; }; type BottomBarProps = { - // activeTabId: string; tabs: TabDef[]; - // onTabChange: (id: string) => void; }; export const BottomBar: FunctionComponent = ({ tabs }) => { return ( diff --git a/src/components/mobile/FilesTab.tsx b/src/components/mobile/FilesTab.tsx deleted file mode 100644 index 48c93dd..0000000 --- a/src/components/mobile/FilesTab.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { FunctionComponent } from "react"; -import { ExampleList } from "../../nodes/WelcomeNode"; -import { Button } from "../input/Button"; -import { FileSettings } from "../settings/FileSettings"; -import { Typo } from "../Typo"; - -export const FilesTab: FunctionComponent<{}> = () => { - return ( -
- - Files - - - - Examples - -
- -
-
- ); -}; diff --git a/src/components/mobile/MobileView.tsx b/src/components/mobile/MobileView.tsx index 4edf3c3..9e8e68f 100644 --- a/src/components/mobile/MobileView.tsx +++ b/src/components/mobile/MobileView.tsx @@ -1,4 +1,4 @@ -import { FunctionComponent, useState } from "react"; +import { FunctionComponent } from "react"; import { BottomBar } from "./BottomBar"; import { settingsTabs } from "../../registries"; import { Outlet } from "react-router-dom"; diff --git a/src/components/mobile/ProgramInterface.tsx b/src/components/mobile/ProgramInterface.tsx deleted file mode 100644 index 48f7965..0000000 --- a/src/components/mobile/ProgramInterface.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import { FunctionComponent, ReactNode, useMemo } from "react"; -import { Node } from "reactflow"; -import { MobileWelcome } from "./Welcome"; -import { nodeDefs } from "../../registries"; - -type MobileNodeRendererProps = { - node: Node; -}; -const MobileNodeRenderer: FunctionComponent = ({ node }) => { - return

MobileNodeRenderer not available

; - // const View = nodeDefs[node.type!!].mobileView; - // if (View === undefined) { - // return

Cannot display node of type {node.type} in mobile.

; - // } else { - // return ( - // - // - // - // ); - // } -}; - -type InterfaceWrapperProps = { - children?: ReactNode; -}; -export const InterfaceWrapper: FunctionComponent = ({ children }) => { - return
{children}
; -}; - -// const MOBILE_NODE_TYPES = new Set( -// Object.entries(nodeDefs) -// .filter(([_, def]) => { -// return def.mobileView !== undefined; -// }) -// .map(([key, _]) => key) -// ); - -export const ProgramInterface: FunctionComponent<{}> = () => { - // const nodes = useFileStore((store) => store.nodes, shallow); - - const mobileNodes: Node[] = []; - - // const mobileNodes = useMemo(() => { - // return nodes.filter( - // (it) => - // it.type !== undefined && - // MOBILE_NODE_TYPES.has(it.type) && - // it.data.mobileVisible !== false //TODO Make ui for mobileVisible - // ); - // }, [nodes]); - - // const buttons = useMemo(() => { - // return nodes.filter((it) => it.type === BUTTON_NODE_TYPE); - // }, [nodes]); - // const outputs = useMemo(() => { - // return nodes.filter((it) => it.type === BUTTPLUG_NODE_TYPE); - // }, [nodes]); - - const empty = mobileNodes.length === 0; - - if (empty) { - return ( - <> - - - ); - } - - return ( -
    - {mobileNodes.map((it, index) => ( - - ))} -
- ); -}; diff --git a/src/components/mobile/SettingsTab.tsx b/src/components/mobile/SettingsTab.tsx deleted file mode 100644 index aa22cf7..0000000 --- a/src/components/mobile/SettingsTab.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { FunctionComponent } from "react"; -import { useGlobalSettings } from "../../App"; -import { Button } from "../input/Button"; -import { ButtplugSettings } from "../settings/ButtplugSettings"; -import { Typo } from "../Typo"; - -export const SettingsTab: FunctionComponent<{}> = () => { - const open = useGlobalSettings((s) => s.setMobileView); - return ( -
- - Connection Settings - - - - Desktop Mode - -
- -
-
- ); -}; diff --git a/src/components/settings/MobileInterface.tsx b/src/components/settings/MobileInterface.tsx deleted file mode 100644 index 969008e..0000000 --- a/src/components/settings/MobileInterface.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { FunctionComponent } from "react"; -import { useGlobalSettings } from "../../App"; -import { Button } from "../input/Button"; -import { ProgramInterface } from "../mobile/ProgramInterface"; -import { Typo } from "../Typo"; - -export const MobileInterfaceTab: FunctionComponent<{}> = () => { - const open = useGlobalSettings((s) => s.setMobileView); - return ( -
- Mobile Interface - -

- If you open this Beadi file on your mobile phone - this is the interface - that you will get. -

- -
- ); -}; diff --git a/src/remotePlugin/RemoteDrawerPage.tsx b/src/remotePlugin/RemoteDrawerPage.tsx index 6bb4ce1..4c43229 100644 --- a/src/remotePlugin/RemoteDrawerPage.tsx +++ b/src/remotePlugin/RemoteDrawerPage.tsx @@ -35,7 +35,7 @@ const RemoteSettingsTab: FunctionComponent<{}> = () => { }; type RemoteSettingsIconProps = {}; -export const RemoteSettingsIcon: FunctionComponent = ({}) => { +export const RemoteSettingsIcon: FunctionComponent = () => { const publishState = usePublishStateStore((s) => s.state.state); const remotes = useRemoteStateStore((s) => _.values(s.remotes).filter((s) => s.state.state === "connected").length); diff --git a/src/remotePlugin/publish/store.ts b/src/remotePlugin/publish/store.ts index d0cdaed..2f74ec1 100644 --- a/src/remotePlugin/publish/store.ts +++ b/src/remotePlugin/publish/store.ts @@ -4,7 +4,6 @@ import { devtools } from "zustand/middleware"; import { BeadiMessage, handleMessage, sendMessage } from "../message"; import { useIOValueStore } from "../inputOutputStore"; import { useInterfaceFileStore } from "../interface/stores"; -import { useFileStore } from "../../engine/store"; import _ from "lodash"; function makeDisconnectedState(set: Setter, get: Getter, error?: string): PublishConnectionState & { state: "disconnected" } { From 014efd449407526651ce8db395f474adaddd3a2c Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Thu, 3 Aug 2023 23:45:56 +0200 Subject: [PATCH 043/109] draft for dynamic type of remote input adapter --- src/components/Viewport.tsx | 10 ++-- src/components/input/Select.tsx | 18 ++----- src/components/node/NodeHandleLine.tsx | 3 +- src/components/node/NodeRenderer.tsx | 6 ++- src/engine/adapter.ts | 19 ++++--- src/engine/compiler.ts | 18 ++++--- src/engine/node.ts | 50 ++++++++++++++---- src/engine/runner.ts | 9 ++-- src/nodes/InputAdapterNode.tsx | 73 +++++++++++++++++++------- src/remotePlugin/inputAdapter.ts | 28 ---------- src/remotePlugin/inputAdapter.tsx | 67 +++++++++++++++++++++++ src/remotePlugin/outputAdapter.ts | 9 ++-- 12 files changed, 213 insertions(+), 97 deletions(-) delete mode 100644 src/remotePlugin/inputAdapter.ts create mode 100644 src/remotePlugin/inputAdapter.tsx diff --git a/src/components/Viewport.tsx b/src/components/Viewport.tsx index fc6f20d..be92aa8 100644 --- a/src/components/Viewport.tsx +++ b/src/components/Viewport.tsx @@ -19,7 +19,7 @@ import { handlesCompatible } from "../engine/handles"; import { NodeHandleDisplay } from "./node/NodeHandle"; import { WelcomeNode } from "../nodes/WelcomeNode"; import { nodeDefs } from "../registries"; -import { InputHandleDef, OutputHandleDef } from "../engine/node"; +import { InputHandleDef, OutputHandleDef, getNodeOutputs } from "../engine/node"; function position(e: HTMLElement) { let element: HTMLElement | null = e; @@ -100,7 +100,9 @@ const NewNodeDropdown: FunctionComponent = ({ data, onClos const sourceNodeType = nodes[data.source].type; if (sourceNodeType !== undefined) { let fromOutput = true; - let handleType: OutputHandleDef | InputHandleDef = nodeDefs[sourceNodeType].outputs[data.sourceHandle]; + let handleType: OutputHandleDef | InputHandleDef = getNodeOutputs(sourceNodeType, nodes[data.source].data.settings)[ + data.sourceHandle + ]; if (handleType === undefined) { fromOutput = false; handleType = nodeDefs[sourceNodeType].inputs[data.sourceHandle]; @@ -108,7 +110,9 @@ const NewNodeDropdown: FunctionComponent = ({ data, onClos return Object.values(nodeDefs) .flatMap((def) => - Object.entries(fromOutput ? def.inputs : def.outputs).map(([handleId, handle]) => ({ + Object.entries( + fromOutput ? (typeof def.inputs !== "function" ? def.inputs : []) : typeof def.outputs !== "function" ? def.outputs : [] + ).map(([handleId, handle]) => ({ node: def, handle: handle, handleId, diff --git a/src/components/input/Select.tsx b/src/components/input/Select.tsx index ffeeb36..cd2f7f8 100644 --- a/src/components/input/Select.tsx +++ b/src/components/input/Select.tsx @@ -8,13 +8,7 @@ type SelectProps = { renderOption: (value: T) => ReactNode; onSelect?: (value: T | null) => void; }; -export function Select({ - options, - selected, - onSelect, - renderOption, - allowUnselect, -}: SelectProps) { +export function Select({ options, selected, onSelect, renderOption, allowUnselect }: SelectProps) { const optionMap = useMemo(() => { return _.chain(options) .map((it, index) => [index, it]) @@ -46,14 +40,8 @@ export function Select({ }, [optionMap, selected]); return ( - + {(isSelected(null) || allowUnselect === true) && } {Object.entries(optionMap).map(([key, value]) => (
+ ); +}; + +export const buttonWidgetDef: RemoteWidgetDef = { + id: "button", + display: ButtonWidget, + settings: ButtonWidgetSettingsEditor, + defaultSettings: null, +}; From 2281c75877b3527a310441b35ab0cb6c6e05dc37 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Fri, 4 Aug 2023 15:16:43 +0200 Subject: [PATCH 049/109] add signal support for remote control --- src/remotePlugin/interface/stores.ts | 11 ++++++++++- src/remotePlugin/publish/store.ts | 6 +++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/remotePlugin/interface/stores.ts b/src/remotePlugin/interface/stores.ts index c97f426..9ae3901 100644 --- a/src/remotePlugin/interface/stores.ts +++ b/src/remotePlugin/interface/stores.ts @@ -158,7 +158,16 @@ function createRemoteBrokeredInterface( } }, emitSignal: (valueId, data) => { - console.log("TODO Remotely emitting signal (not yet implemented)", valueId, data); + console.log("Remotely emitting signal", valueId, data); + const state = useRemoteStateStore.getState().remotes[def.brokerSettings.remoteId].state; + if (state.state === "connected") { + sendMessage(state.socket, { + EmitSignal: { + endpoint: valueId, + value: data ?? null, + }, + }); + } }, closeBroker: () => { unsubscribeIO(); diff --git a/src/remotePlugin/publish/store.ts b/src/remotePlugin/publish/store.ts index 29de937..df673c1 100644 --- a/src/remotePlugin/publish/store.ts +++ b/src/remotePlugin/publish/store.ts @@ -92,7 +92,7 @@ function makeConnectedState(socket: WebSocket, id: string): PublishConnectionSta sendMessage(socket, { EmitSignal: { endpoint: valueId, - value: data, + value: data ?? null, }, }); }, @@ -191,6 +191,10 @@ function publish(set: Setter, get: Getter): void { useIOValueStore.getState().setValue(endpoint, value); }, + EmitSignal: ({ endpoint, value }) => { + console.log("EmitSignal request got to ", endpoint, " with ", value); + useIOValueStore.getState().emitSignal(endpoint, value); + }, }); }); From cc43e492829fefff8e8ebcbae510c743c375ea72 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Sat, 5 Aug 2023 19:27:38 +0200 Subject: [PATCH 050/109] cude implementation for output adapters --- src/components/Viewport.tsx | 4 +- src/components/graph/Graph.tsx | 76 ++++++++++++++++ src/components/node/NodeHandleLine.tsx | 4 +- src/components/node/NodeRenderer.tsx | 7 +- .../node/preview/GraphNodeValuePreview.tsx | 77 +--------------- src/engine/adapter.ts | 4 +- src/engine/compiler.ts | 4 +- src/engine/node.ts | 11 ++- src/engine/runner.ts | 4 +- src/engine/store.ts | 5 +- src/nodes/InputAdapterNode.tsx | 3 +- src/nodes/OutputAdapterNode.tsx | 88 ++++++++++++++----- src/remotePlugin/inputOutputStore.ts | 67 +++++++++----- .../interface/InterfaceEditor.tsx | 32 ++----- src/remotePlugin/interface/stores.ts | 25 +++++- src/remotePlugin/message.ts | 2 + src/remotePlugin/outputAdapter.ts | 28 ------ src/remotePlugin/outputAdapter.tsx | 69 +++++++++++++++ src/remotePlugin/publish/store.ts | 4 + src/remotePlugin/registry.ts | 3 +- src/remotePlugin/remote/store.ts | 6 +- src/remotePlugin/widgets/GraphWidget.tsx | 87 ++++++++++++++++++ 22 files changed, 415 insertions(+), 195 deletions(-) create mode 100644 src/components/graph/Graph.tsx delete mode 100644 src/remotePlugin/outputAdapter.ts create mode 100644 src/remotePlugin/outputAdapter.tsx create mode 100644 src/remotePlugin/widgets/GraphWidget.tsx diff --git a/src/components/Viewport.tsx b/src/components/Viewport.tsx index be92aa8..0117bdd 100644 --- a/src/components/Viewport.tsx +++ b/src/components/Viewport.tsx @@ -19,7 +19,7 @@ import { handlesCompatible } from "../engine/handles"; import { NodeHandleDisplay } from "./node/NodeHandle"; import { WelcomeNode } from "../nodes/WelcomeNode"; import { nodeDefs } from "../registries"; -import { InputHandleDef, OutputHandleDef, getNodeOutputs } from "../engine/node"; +import { InputHandleDef, OutputHandleDef, getNodeInputs, getNodeOutputs } from "../engine/node"; function position(e: HTMLElement) { let element: HTMLElement | null = e; @@ -105,7 +105,7 @@ const NewNodeDropdown: FunctionComponent = ({ data, onClos ]; if (handleType === undefined) { fromOutput = false; - handleType = nodeDefs[sourceNodeType].inputs[data.sourceHandle]; + handleType = getNodeInputs(nodes[data.source].type, nodes[data.source].data.settings)[data.sourceHandle]; } return Object.values(nodeDefs) diff --git a/src/components/graph/Graph.tsx b/src/components/graph/Graph.tsx new file mode 100644 index 0000000..87da9dd --- /dev/null +++ b/src/components/graph/Graph.tsx @@ -0,0 +1,76 @@ +import { FunctionComponent } from "react"; + +type GraphProps = { + history: (number | undefined)[]; + index: number; + fixed: boolean; + height: number; + minHeight: number; +}; +export const Graph: FunctionComponent = ({ history, index, fixed, minHeight, height }) => { + let min = 0; + let max = 0; + + const tmpHistory = history.map((it) => { + const val = it || 0.0; + if (val < min) { + min = val; + } + if (val > max) { + max = val; + } + return val; + }); + + if (fixed) { + min = 0.0; + max = 1.0; + } else { + const mean = (max + min) / 2; + if (max - min < minHeight) { + max = mean + minHeight / 2.0; + min = mean - minHeight / 2.0; + } + } + + const offset = -(min + max) / 2; + const scale = height / 2 / Math.max(0.001, Math.abs(max + offset)); + + const correctedHistory = tmpHistory.map((it) => (it + offset) * scale); + + const parts = new Array(history.length) + .fill("") + .map((_, i) => { + const realIndex = (i + index) % history.length; + const point = correctedHistory[realIndex] || 0; + + const coords = -point; + return `L${i} ${coords.toFixed(4)}`; + }) + .join(" "); + + const start = correctedHistory[index]; + + const zero = (0 + offset) * scale; + const maxLine = (max + offset) * scale; + const minLine = (min + offset) * scale; + + return ( + + + + + + {" "} + 0 + + + {max.toFixed(2)} + + + {min.toFixed(2)} + + + + ); +}; diff --git a/src/components/node/NodeHandleLine.tsx b/src/components/node/NodeHandleLine.tsx index ba9db0f..f8c3dc5 100644 --- a/src/components/node/NodeHandleLine.tsx +++ b/src/components/node/NodeHandleLine.tsx @@ -7,7 +7,7 @@ import { NodeHandleDisplay } from "./NodeHandle"; import { nodeDefs } from "../../registries"; import { nodeHandleValuePreviews } from "./NodeHandleValuePreview"; import { MdExpandLess, MdExpandMore } from "react-icons/md"; -import { HandleType, getNodeOutputs } from "../../engine/node"; +import { HandleType, getNodeInputs, getNodeOutputs } from "../../engine/node"; type NodeHandleLineProps = { input?: ReactNode; @@ -42,7 +42,7 @@ const NodeHandleLine: FunctionComponent = ({ input, kind, t connection.source !== connection.target && handlesCompatible( getNodeOutputs(nodes[connection.source].type, nodes[connection.source].data.settings)[connection.sourceHandle].type, - nodeDefs[targetType].inputs[connection.targetHandle].type + getNodeInputs(nodes[connection.target].type, nodes[connection.target].data.settings)[connection.targetHandle].type ) ); } diff --git a/src/components/node/NodeRenderer.tsx b/src/components/node/NodeRenderer.tsx index ddb0116..115eb29 100644 --- a/src/components/node/NodeRenderer.tsx +++ b/src/components/node/NodeRenderer.tsx @@ -3,7 +3,7 @@ import { NodeProps, useEdges } from "reactflow"; import NumberInput from "../input/NumberInput"; import NodeHandleLine from "./NodeHandleLine"; import NodeShell from "./NodeShell"; -import { AnyNodeDef, InputHandleDef, NodeDef, getNodeOutputs } from "../../engine/node"; +import { AnyNodeDef, InputHandleDef, NodeDef, getNodeInputs, getNodeOutputs } from "../../engine/node"; import { NODE_HANDLE_INPUT_TYPES } from "./nodeInputs"; import { UnknownBeadiNodeData } from "../../engine/store"; import { useModelState } from "../../engine/compiler"; @@ -28,7 +28,6 @@ function getHandleInput({ type, input, nodeId, handleId }: HandleInputCProps) { export function makeNodeRenderer(def: AnyNodeDef): ComponentType> { const HeaderComponent = def.header; - const inputs = Object.entries(def.inputs).filter(([inputId, it]) => it.hidden !== true); if (def.nodeComponent) { return def.nodeComponent; @@ -38,9 +37,11 @@ export function makeNodeRenderer(def: AnyNodeDef): ComponentType s.model?.errors?.[id]); + const nodeInputs = getNodeInputs(def.type, data.settings); + const inputs = Object.entries(nodeInputs).filter(([inputId, it]) => it.hidden !== true); const connections = useMemo(() => { return inputs.map(([inputId, input]) => edges.findIndex((it) => it.target === id && it.targetHandle === inputId) >= 0); - }, [edges, id]); + }, [edges, id, inputs]); const nodeOutputs = getNodeOutputs(def.type, data.settings); diff --git a/src/components/node/preview/GraphNodeValuePreview.tsx b/src/components/node/preview/GraphNodeValuePreview.tsx index 288882b..6e5887c 100644 --- a/src/components/node/preview/GraphNodeValuePreview.tsx +++ b/src/components/node/preview/GraphNodeValuePreview.tsx @@ -3,84 +3,11 @@ import { usePreviewStore } from "../../../engine/preview"; import { NodeHandleValuePreviewProps } from "../NodeHandleValuePreview"; import { timerNodeDef } from "../../../nodes/TimerNode"; import produce from "immer"; +import { Graph } from "../../graph/Graph"; const HISTORY_LENGTH = 3 * 60; const HEIGHT = 100; const MIN_HEIGHT = 1.0; - -type GraphProps = { - history: (number | undefined)[]; - index: number; - fixed: boolean; -}; -const Graph: FunctionComponent = ({ history, index, fixed }) => { - let min = 0; - let max = 0; - - const tmpHistory = history.map((it) => { - const val = it || 0.0; - if (val < min) { - min = val; - } - if (val > max) { - max = val; - } - return val; - }); - - if (fixed) { - min = 0.0; - max = 1.0; - } else { - const mean = (max + min) / 2; - if (max - min < MIN_HEIGHT) { - max = mean + MIN_HEIGHT / 2.0; - min = mean - MIN_HEIGHT / 2.0; - } - } - - const offset = -(min + max) / 2; - const scale = HEIGHT / 2 / Math.max(0.001, Math.abs(max + offset)); - - const correctedHistory = tmpHistory.map((it) => (it + offset) * scale); - - const parts = new Array(HISTORY_LENGTH) - .fill("") - .map((_, i) => { - const realIndex = (i + index) % HISTORY_LENGTH; - const point = correctedHistory[realIndex] || 0; - - const coords = -point; - return `L${i} ${coords.toFixed(4)}`; - }) - .join(" "); - - const start = correctedHistory[index]; - - const zero = (0 + offset) * scale; - const maxLine = (max + offset) * scale; - const minLine = (min + offset) * scale; - - return ( - - - - - - {" "} - 0 - - - {max.toFixed(2)} - - - {min.toFixed(2)} - - - - ); -}; - const SAMPLE_RATE = 60; export const GraphNodeValuePreview: FunctionComponent = (props) => { const [preview, setPreview] = useState({ index: 0, history: new Array(HISTORY_LENGTH).fill(0) }); @@ -101,7 +28,7 @@ export const GraphNodeValuePreview: FunctionComponent - +
); }; diff --git a/src/engine/adapter.ts b/src/engine/adapter.ts index f8c4507..764a4b5 100644 --- a/src/engine/adapter.ts +++ b/src/engine/adapter.ts @@ -15,6 +15,6 @@ export type OutputAdapterDef = { id: string; label: string; getType: (settings: TSettings) => HandleType; - pushData: (nodeId: string, data: TData) => void; - settingsEditor?: FunctionComponent<{}>; + pushData: (nodeId: string, data: TData, settings: TSettings) => void; + settingsEditor?: FunctionComponent<{ nodeId: string; settings: TSettings; updateSettings: (s: TSettings) => void }>; }; diff --git a/src/engine/compiler.ts b/src/engine/compiler.ts index c309862..7f94967 100644 --- a/src/engine/compiler.ts +++ b/src/engine/compiler.ts @@ -1,6 +1,6 @@ import _ from "lodash"; import create from "zustand"; -import { getNodeOutputs } from "./node"; +import { getNodeInputs, getNodeOutputs } from "./node"; import { nodeDefs } from "../registries"; import { getConversionFunction } from "./handles"; @@ -88,7 +88,7 @@ export function buildModel({ nodes: rawNodes, edges }: ModelSources): Model { type: node.type, nodeId: node.id, settings: node.settings, - dependencies: _.mapValues(nodeDefs[node.type].inputs, (inputDef, handleId) => { + dependencies: _.mapValues(getNodeInputs(node.type, node.settings), (inputDef, handleId) => { if (handleId in node.originalIncomingEdges) { const sourceNode = nodes[node.originalIncomingEdges[handleId].source]; const sourceNodeOutputs = getNodeOutputs(sourceNode.type, sourceNode.settings); diff --git a/src/engine/node.ts b/src/engine/node.ts index 5b7540d..c9d49db 100644 --- a/src/engine/node.ts +++ b/src/engine/node.ts @@ -181,7 +181,7 @@ export type NodeDef< header?: ComponentType; /** Overrides the how the entire node is rendered. Default to the node-shell */ nodeComponent?: ComponentType; - inputs: TInputHandleDefs; + inputs: TInputHandleDefs | ((settins: TSettings) => TInputHandleDefs); outputs: TOutputHandleDefs | ((settings: TSettings) => TOutputHandleDefs); executor: NodeExecutorDef; }; @@ -194,3 +194,12 @@ export function getNodeOutputs(nodeType: UnknownBeadiNode["type"], se return outputs; } } + +export function getNodeInputs(nodeType: UnknownBeadiNode["type"], settings: TSettings): InputHandleDefs { + const inputs = nodeDefs[nodeType]?.inputs; + if (typeof inputs === "function") { + return inputs(settings); + } else { + return inputs; + } +} diff --git a/src/engine/runner.ts b/src/engine/runner.ts index b4cf4f0..08b2f6c 100644 --- a/src/engine/runner.ts +++ b/src/engine/runner.ts @@ -2,7 +2,7 @@ import _ from "lodash"; import { Model } from "./compiler"; import { useFileStore } from "./store"; import { useSignalBus } from "./signal"; -import { NodeContext, getNodeOutputs } from "./node"; +import { NodeContext, getNodeInputs, getNodeOutputs } from "./node"; import { nodeDefs } from "../registries"; import { usePreviewStore } from "./preview"; import { tempPopSignalBuffer } from "../remotePlugin/inputOutputStore"; @@ -58,7 +58,7 @@ function runEngineLoop(model: Model) { const nodeType = nodeDefs[step.type]; // const inputs = step.dependencies.map((it) => (it.convert ? it.convert(data[it.id]) : data[it.id])); const inputs = _.mapValues(step.dependencies, (dependency, handleId) => { - if (nodeType.inputs[handleId].type === "impulse") { + if (getNodeInputs(step.type, step.settings)[handleId].type === "impulse") { if (dependency !== null) { return signals[dependency.nodeId]?.[dependency.handleId] || []; } else { diff --git a/src/engine/store.ts b/src/engine/store.ts index 9741c6d..d045b45 100644 --- a/src/engine/store.ts +++ b/src/engine/store.ts @@ -6,6 +6,7 @@ import { immer } from "zustand/middleware/immer"; import { nodeDefs } from "../registries"; import _ from "lodash"; import { useCallback } from "react"; +import { getNodeInputs } from "./node"; export type UnknownBeadiNode = BeadiNode>; export type BeadiNode> = Node< @@ -63,7 +64,7 @@ export const useFileStore = create()( addNode: (type, pos) => { const id = "" + Date.now(); - const nodeType = nodeDefs[type]; + const nodeDef = nodeDefs[type]; set((draft) => { draft.data.nodes[id] = { id: id, @@ -71,7 +72,7 @@ export const useFileStore = create()( type: type, data: { displaySettings: {}, - handles: _.mapValues(nodeType.inputs, (handle) => handle.default), + handles: _.mapValues(getNodeInputs(nodeDef.type, {}), (handle) => handle.default), settings: {}, }, }; diff --git a/src/nodes/InputAdapterNode.tsx b/src/nodes/InputAdapterNode.tsx index 9b7a0ef..ffc6c68 100644 --- a/src/nodes/InputAdapterNode.tsx +++ b/src/nodes/InputAdapterNode.tsx @@ -44,10 +44,11 @@ const InputAdapterNodeHeader: FunctionComponent()({ label: "Input", category: categories["inout"], - type: "inputAdapter", + type: INPUT_ADAPTER_NODE_ID, header: InputAdapterNodeHeader, outputs: (s) => { if (s.adapterId === null) { diff --git a/src/nodes/OutputAdapterNode.tsx b/src/nodes/OutputAdapterNode.tsx index 71a1e58..499e76d 100644 --- a/src/nodes/OutputAdapterNode.tsx +++ b/src/nodes/OutputAdapterNode.tsx @@ -1,53 +1,93 @@ import { FunctionComponent } from "react"; -import { NodeHeaderProps, nodeDef } from "../engine/node"; +import { InputHandleDefs, NodeHeaderProps, nodeDef } from "../engine/node"; import { categories } from "./category"; import { inputAdapterDefs, outputAdapterDefs } from "../registries"; import { useFileStore } from "../engine/store"; +import { Select } from "../components/input/Select"; export type OutputAdapterNodeSettings = { - adapterId: string; + adapterId: string | null; + adapterSettings: Record; }; -const OutputAdapterNodeHeader: FunctionComponent> = ({ id }) => { - const [updateNode, settings] = useFileStore((s) => [s.updateNode, s.data.nodes[id].data.settings as OutputAdapterNodeSettings]); +const OutputAdapterNodeHeader: FunctionComponent> = ({ id, data }) => { + const updateNode = useFileStore((s) => s.updateNode); + const adapterId = data.settings.adapterId; + const adapterSettings = data.settings.adapterId == null ? undefined : data.settings.adapterSettings?.[data.settings.adapterId]; + const AdapterSettingsEditor = adapterId != null ? outputAdapterDefs[adapterId]?.settingsEditor : undefined; + + const updateNodeSettings = (s: any) => { + if (adapterId !== null) { + updateNode(id, (d) => { + (d.data.settings as OutputAdapterNodeSettings).adapterSettings = { + [adapterId]: s, + }; + }); + } + }; return ( -
- +
+ + {AdapterSettingsEditor && ( +
+ +
+ )}
); }; +export const OUTPUT_ADAPTER_NODE_ID = "outputAdapter"; export const outputAdapterNode = nodeDef()({ label: "Output", category: categories["inout"], - type: "outputAdapter", + type: OUTPUT_ADAPTER_NODE_ID, header: OutputAdapterNodeHeader, - inputs: { - value: { - label: "Value", - type: "number", - default: 0.0, - }, + inputs: (s) => { + if (s.adapterId === null) { + return {} as InputHandleDefs; + } + const outputAdatperDef = outputAdapterDefs[s.adapterId]; + if (outputAdatperDef === undefined) { + return {} as InputHandleDefs; + } + if (s.adapterSettings?.[s.adapterId] === undefined) { + return {} as InputHandleDefs; + } + const type = outputAdatperDef.getType(s.adapterSettings[s.adapterId]); + if (type === undefined) { + return {} as InputHandleDefs; + } + return { + value: { + label: "Value", + type: type, + default: 0.0, //TODO Typesafe defaults + }, + }; }, outputs: {}, executor: { inputDriver: undefined, outputDriver: ({ value }, context) => { + if (context.settings.adapterId === null) { + return {}; + } const adapter = outputAdapterDefs[context.settings.adapterId]; - if (adapter === undefined) { + if (context.settings.adapterId === undefined) { + return {}; + } + const settings = context.settings.adapterSettings?.[context.settings.adapterId]; + if (settings === undefined) { return {}; } - adapter.pushData(context.id, value); + adapter.pushData(context.id, value, settings); }, initialPersistence: undefined, executor: ({ value }) => { diff --git a/src/remotePlugin/inputOutputStore.ts b/src/remotePlugin/inputOutputStore.ts index 41f17ee..0203de6 100644 --- a/src/remotePlugin/inputOutputStore.ts +++ b/src/remotePlugin/inputOutputStore.ts @@ -1,21 +1,26 @@ import create from "zustand"; -import { BeadiNode, FileStore, useFileStore } from "../engine/store"; +import { FileStore, useFileStore } from "../engine/store"; import produce from "immer"; import _ from "lodash"; -import { InputAdapterNodeSettings } from "../nodes/InputAdapterNode"; +import { INPUT_ADAPTER_NODE_ID, InputAdapterNodeSettings } from "../nodes/InputAdapterNode"; import { REMOTE_INPUT_ADAPTER_ID, RemoteInputAdapterSettings } from "./inputAdapter"; import { devtools } from "zustand/middleware"; import { diffByKeys } from "../utils/diffBy"; import { HandleType } from "../engine/node"; import { SignalEmissions } from "../engine/signal"; +import { OUTPUT_ADAPTER_NODE_ID, OutputAdapterNodeSettings } from "../nodes/OutputAdapterNode"; +import { REMOTE_OUTPUT_ADAPTER_ID, RemoteOutputAdapterSettings } from "./outputAdapter"; -export type IOValueState = { +export type IOValueDef = { valueId: string; - value: T; type: HandleType; name: string; + writeable: boolean; //And additional metadata }; +export type IOValueState = { + value: T; +} & IOValueDef; type IOValueStore = { // values: Record>; @@ -69,6 +74,7 @@ export function tempPopSignalBuffer() { name: "Todo name", type: "impulse", value: draft.signalBuffer[valueId], + writeable: draft.values[valueId].writeable ?? true, }; draft.signalBuffer[valueId] = []; } @@ -78,9 +84,9 @@ export function tempPopSignalBuffer() { export function tempSyncIOValueStore() { const func = (state: FileStore) => { - const inputAdapterNodes = _.mapValues( + const adapterNodes: Record> = _.mapValues( _.pickBy(state.data.nodes, (it) => { - if (it.type === "inputAdapter") { + if (it.type === INPUT_ADAPTER_NODE_ID) { const settings = it.data.settings as InputAdapterNodeSettings | undefined; if (settings?.adapterId === REMOTE_INPUT_ADAPTER_ID) { const adapterSettings = settings.adapterSettings?.[REMOTE_INPUT_ADAPTER_ID] as RemoteInputAdapterSettings | undefined; @@ -89,21 +95,42 @@ export function tempSyncIOValueStore() { // }else if(it.type === "outputAdapter") { // const settings = it.data.settings as OutputAdapterNodeSettings; // return settings.adapterId === "remoteOutput"; + } else if (it.type === OUTPUT_ADAPTER_NODE_ID) { + const settings = it.data.settings as OutputAdapterNodeSettings | undefined; + if (settings?.adapterId === REMOTE_OUTPUT_ADAPTER_ID) { + const adapterSettings = settings.adapterSettings?.[REMOTE_OUTPUT_ADAPTER_ID] as RemoteInputAdapterSettings | undefined; + return adapterSettings != null; + } } return false; }), (node) => { - const adapterSettings = (node.data.settings as InputAdapterNodeSettings).adapterSettings[ - REMOTE_INPUT_ADAPTER_ID - ] as RemoteInputAdapterSettings; - return { - type: adapterSettings.type, - valueId: node.id, - name: node.data.name ?? node.id, - }; + if (node.type === INPUT_ADAPTER_NODE_ID) { + const adapterSettings = (node.data.settings as InputAdapterNodeSettings).adapterSettings[ + REMOTE_INPUT_ADAPTER_ID + ] as RemoteInputAdapterSettings; + return { + type: adapterSettings.type, + valueId: node.id, + name: node.data.name ?? node.id, + writeable: true, + } satisfies IOValueDef; + } else if (node.type === OUTPUT_ADAPTER_NODE_ID) { + const adapterSettings = (node.data.settings as OutputAdapterNodeSettings).adapterSettings[ + REMOTE_OUTPUT_ADAPTER_ID + ] as RemoteOutputAdapterSettings; + return { + type: adapterSettings.type, + valueId: node.id, + name: node.data.name ?? node.id, + writeable: false, + } satisfies IOValueDef; + } else { + throw new Error("Unknown nodeType was exposed to the ioStore"); + } } ); - console.log("inputAdapterNodes: ", inputAdapterNodes); + console.log("adapterNodes: ", adapterNodes); useIOValueStore.setState((state) => { const localValues = Object.values(state.values); @@ -111,7 +138,7 @@ export function tempSyncIOValueStore() { // const missingValues = _.differenceWith(inputAdapterNodes, localValues, (node, value) => node.id === value.valueId); // const extraValues = _.differenceWith(localValues, inputAdapterNodes, (value, node) => node.id === value.valueId); - const { extra, missing, changed } = diffByKeys(state.values, inputAdapterNodes, (a, b) => a.type === b.type && a.name === b.name); + const { extra, missing, changed } = diffByKeys(state.values, adapterNodes, (a, b) => a.type === b.type && a.name === b.name); console.log("useIOValueStore setState: ", localValues, "+", missing, " -", extra); return produce(state, (draft) => { @@ -120,19 +147,15 @@ export function tempSyncIOValueStore() { } for (const missingKey in missing) { draft.values[missingKey] = { - type: missing[missingKey].type, value: 0.0, - valueId: missingKey, - name: missing[missingKey].name, + ...missing[missingKey], }; } console.log("CCC: ", changed); for (const changedKey in changed) { draft.values[changedKey] = { - type: changed[changedKey][1].type, - name: changed[changedKey][1].name, value: 0.0, - valueId: changedKey, + ...changed[changedKey][1], }; } }); diff --git a/src/remotePlugin/interface/InterfaceEditor.tsx b/src/remotePlugin/interface/InterfaceEditor.tsx index ea2b3d9..137f3d6 100644 --- a/src/remotePlugin/interface/InterfaceEditor.tsx +++ b/src/remotePlugin/interface/InterfaceEditor.tsx @@ -38,33 +38,13 @@ export const InterfaceEditor: FunctionComponent = ({ inter const iface = useInterfaceFileStore((s) => s.interfaces[interfaceId]); const updateInterface = useInterfaceFileStore((s) => s.updateInterface); - const addSlider = () => { + const addWidget = (type: string) => { const id = `${new Date().getTime()}`; updateInterface(interfaceId, (draft) => { draft.layout.push({ settings: {}, widgetId: id, - widgetType: "slider", - }); - }); - }; - const addSwitch = () => { - const id = `${new Date().getTime()}`; - updateInterface(interfaceId, (draft) => { - draft.layout.push({ - settings: {}, - widgetId: id, - widgetType: "switch", - }); - }); - }; - const addButton = () => { - const id = `${new Date().getTime()}`; - updateInterface(interfaceId, (draft) => { - draft.layout.push({ - settings: {}, - widgetId: id, - widgetType: "button", + widgetType: type, }); }); }; @@ -78,9 +58,11 @@ export const InterfaceEditor: FunctionComponent = ({ inter ))} - - - + {Object.values(remoteWidgetDefs).map((value, index) => ( + + ))}
); }; diff --git a/src/remotePlugin/interface/stores.ts b/src/remotePlugin/interface/stores.ts index 9ae3901..4380f0f 100644 --- a/src/remotePlugin/interface/stores.ts +++ b/src/remotePlugin/interface/stores.ts @@ -180,6 +180,7 @@ function createLocalBrokeredInterface( ): InterfaceDisplayState & { brokerType: "local" } { const unsubscribeIO = useIOValueStore.subscribe((s) => { set((draft) => { + //TODO sometimes draft is undefined (i think after deleting some nodes)... draft.values = s.values; }); }); @@ -302,15 +303,21 @@ setupInterfaceListeners(); const NULL_SET_VALUE = (value: any) => { console.log("Tried to setValue on an invalid widget"); }; +const NULL_GET_VALUE = () => { + console.log("Tried to getValue on an invalid widget"); + return null; +}; type WidgetValueHandle = | { value: T; setValue: (n: T) => void; + getValue: () => T; error: undefined; } | { value: null; setValue: (n: T) => void; + getValue: () => null; error: string; }; export function useWidgetValueHandle( @@ -320,6 +327,18 @@ export function useWidgetValueHandle( ): WidgetValueHandle> { const iface = useInterfaceDisplayStateStore((s) => s.interfaces[interfaceId]); + const getValue = useCallback(() => { + const iface = useInterfaceDisplayStateStore.getState().interfaces[interfaceId]; + if (iface === undefined) { + return null; + } + const value = iface.values[valueId]; + if (value?.type !== type) { + return null; + } + return value.value; + }, [interfaceId, valueId, type]); + const updateValue = iface.updateValue; const setValue = useCallback( (v: TypeOfHandleType) => { @@ -331,7 +350,8 @@ export function useWidgetValueHandle( if (iface === undefined) { return { value: null, - setValue: () => NULL_SET_VALUE, + getValue: NULL_GET_VALUE, + setValue: NULL_SET_VALUE, error: `Invalid Interface ${interfaceId}`, }; } @@ -340,6 +360,7 @@ export function useWidgetValueHandle( return { value: null, setValue: () => NULL_SET_VALUE, + getValue: NULL_GET_VALUE, error: `Value ${valueId} does not exist in Interface ${interfaceId}`, }; } @@ -349,12 +370,14 @@ export function useWidgetValueHandle( return { value: null, setValue: () => NULL_SET_VALUE, + getValue: NULL_GET_VALUE, error: `Value ${valueId} in Interface ${interfaceId} has wrong type: ${value.type} (${type} was expected)`, }; } return { value: value.value, + getValue, setValue, error: undefined, }; diff --git a/src/remotePlugin/message.ts b/src/remotePlugin/message.ts index 7ee0403..7b531b2 100644 --- a/src/remotePlugin/message.ts +++ b/src/remotePlugin/message.ts @@ -15,6 +15,8 @@ export type RemoteControlEndpoint = { id: string; type: HandleType; value: number; + writeable: boolean; + name: string; }; export type BeadiMessage = { diff --git a/src/remotePlugin/outputAdapter.ts b/src/remotePlugin/outputAdapter.ts deleted file mode 100644 index 2b00a7a..0000000 --- a/src/remotePlugin/outputAdapter.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { InputAdapterDef, OutputAdapterDef } from "../engine/adapter"; - -export const remoteOutputAdapter: OutputAdapterDef = { - id: "remoteOutput", - getType: () => "number", - pushData: (nodeId, data) => { - console.log("Output: ", data); - }, - label: "Remote", -}; - -export const remoteOutputToInputAdapter: OutputAdapterDef = { - id: "remoteOutputToInput", - getType: () => "number", - pushData: (nodeId, data) => { - console.log("RemoteOutputToRemoteInput", data); - }, - label: "Set Remote Input", -}; - -export const testRemoteOutputAdapter: OutputAdapterDef = { - id: "remoteOutput2", - getType: () => "number", - pushData: (nodeId, data) => { - // console.log("Output2: ", data); - }, - label: "Remote2", -}; diff --git a/src/remotePlugin/outputAdapter.tsx b/src/remotePlugin/outputAdapter.tsx new file mode 100644 index 0000000..81c5df6 --- /dev/null +++ b/src/remotePlugin/outputAdapter.tsx @@ -0,0 +1,69 @@ +import { FunctionComponent } from "react"; +import { InputAdapterDef, OutputAdapterDef } from "../engine/adapter"; +import { HandleType, asHandleType } from "../engine/node"; +import { Select } from "../components/input/Select"; +import { useIOValueStore } from "./inputOutputStore"; + +export type RemoteOutputAdapterSettings = { + type: HandleType; +}; + +type RemoteOutputSettingsEditorProps = { + settings: RemoteOutputAdapterSettings; + updateSettings: (s: RemoteOutputAdapterSettings) => void; +}; +export const RemoteOutputSettingsEditor: FunctionComponent = ({ settings, updateSettings }) => { + const updateType = (type: HandleType | null) => { + updateSettings({ + ...settings, + type: type ?? "number", + }); + }; + + return ( +
+ <>{valueId}} + allowUnselect={true} + onSelect={onChange} + > +
+ ); +}; + +export const graphWidgetDef: RemoteWidgetDef = { + id: "graph", + display: GraphWidget, + settings: GraphWidgetSettingsEditor, + defaultSettings: null, +}; From 3fff05655db358ab92795bb6ddad67526c2f6a1f Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Sat, 5 Aug 2023 20:08:00 +0200 Subject: [PATCH 051/109] basic draft for output adapter --- src/remotePlugin/RemoteDrawerPage.tsx | 6 +- src/remotePlugin/inputOutputStore.ts | 18 ++++-- src/remotePlugin/interface/Interface.tsx | 2 +- .../interface/InterfaceEditor.tsx | 2 +- src/remotePlugin/interface/InterfaceList.tsx | 2 +- .../{stores.ts => interfaceStores.ts} | 4 +- src/remotePlugin/message.ts | 15 +++-- src/remotePlugin/outputAdapter.tsx | 6 +- src/remotePlugin/publish/PublishManager.tsx | 2 +- .../publish/{store.ts => publishStore.ts} | 59 +++++++++++-------- src/remotePlugin/remote/ConnectionManager.tsx | 2 +- .../remote/{store.ts => remoteStore.ts} | 19 ++---- src/remotePlugin/widgets/ButtonWidget.tsx | 4 +- src/remotePlugin/widgets/GraphWidget.tsx | 4 +- src/remotePlugin/widgets/SliderWidget.tsx | 4 +- src/remotePlugin/widgets/SwitchWidget.tsx | 4 +- 16 files changed, 85 insertions(+), 68 deletions(-) rename src/remotePlugin/interface/{stores.ts => interfaceStores.ts} (99%) rename src/remotePlugin/publish/{store.ts => publishStore.ts} (78%) rename src/remotePlugin/remote/{store.ts => remoteStore.ts} (93%) diff --git a/src/remotePlugin/RemoteDrawerPage.tsx b/src/remotePlugin/RemoteDrawerPage.tsx index 4c43229..587960b 100644 --- a/src/remotePlugin/RemoteDrawerPage.tsx +++ b/src/remotePlugin/RemoteDrawerPage.tsx @@ -3,13 +3,13 @@ import { MdSettingsRemote } from "react-icons/md"; import { FunctionComponent } from "react"; import { Button } from "../components/input/Button"; import { InterfaceList } from "./interface/InterfaceList"; -import { useInterfaceFileStore } from "./interface/stores"; +import { useInterfaceFileStore } from "./interface/interfaceStores"; import { ConnectionManager } from "./remote/ConnectionManager"; import { PublishManager } from "./publish/PublishManager"; import { Typo } from "../components/Typo"; -import { useRemoteStateStore } from "./remote/store"; +import { useRemoteStateStore } from "./remote/remoteStore"; import _ from "lodash"; -import { usePublishStateStore } from "./publish/store"; +import { usePublishStateStore } from "./publish/publishStore"; import clsx from "clsx"; const RemoteSettingsTab: FunctionComponent<{}> = () => { diff --git a/src/remotePlugin/inputOutputStore.ts b/src/remotePlugin/inputOutputStore.ts index 0203de6..db1f700 100644 --- a/src/remotePlugin/inputOutputStore.ts +++ b/src/remotePlugin/inputOutputStore.ts @@ -2,14 +2,17 @@ import create from "zustand"; import { FileStore, useFileStore } from "../engine/store"; import produce from "immer"; import _ from "lodash"; -import { INPUT_ADAPTER_NODE_ID, InputAdapterNodeSettings } from "../nodes/InputAdapterNode"; -import { REMOTE_INPUT_ADAPTER_ID, RemoteInputAdapterSettings } from "./inputAdapter"; import { devtools } from "zustand/middleware"; import { diffByKeys } from "../utils/diffBy"; import { HandleType } from "../engine/node"; import { SignalEmissions } from "../engine/signal"; +import { INPUT_ADAPTER_NODE_ID, InputAdapterNodeSettings } from "../nodes/InputAdapterNode"; +import { REMOTE_INPUT_ADAPTER_ID, RemoteInputAdapterSettings } from "./inputAdapter"; import { OUTPUT_ADAPTER_NODE_ID, OutputAdapterNodeSettings } from "../nodes/OutputAdapterNode"; -import { REMOTE_OUTPUT_ADAPTER_ID, RemoteOutputAdapterSettings } from "./outputAdapter"; +// import { REMOTE_OUTPUT_ADAPTER_ID, RemoteOutputAdapterSettings } from "./outputAdapter"; + +type RemoteOutputAdapterSettings = any; +const REMOTE_OUTPUT_ADAPTER_ID = "remoteOutput"; export type IOValueDef = { valueId: string; @@ -27,7 +30,7 @@ type IOValueStore = { values: Record>; /** Set value in IOValueStore*/ - setValue: (valueId: string, value: any) => void; + setValue: (valueId: string, value: any, writeUnwriteable?: boolean) => void; /** Will collect all signal emissions between two runs */ signalBuffer: Record>; @@ -41,7 +44,12 @@ export const useIOValueStore = create( devtools( (set, get) => ({ values: {}, - setValue: (id, value) => { + setValue: (id, value, writeUnwriteable = false) => { + if (!writeUnwriteable) { + if (!get().values[id]?.writeable) { + return; + } + } set((s) => produce(s, (draft) => { draft.values[id].value = value; diff --git a/src/remotePlugin/interface/Interface.tsx b/src/remotePlugin/interface/Interface.tsx index 5ec51da..3601bde 100644 --- a/src/remotePlugin/interface/Interface.tsx +++ b/src/remotePlugin/interface/Interface.tsx @@ -1,5 +1,5 @@ import { FunctionComponent } from "react"; -import { Widget, useInterfaceDisplayStateStore } from "./stores"; +import { Widget, useInterfaceDisplayStateStore } from "./interfaceStores"; import { SliderWidget } from "../widgets/SliderWidget"; import { remoteWidgetDefs } from "../registry"; diff --git a/src/remotePlugin/interface/InterfaceEditor.tsx b/src/remotePlugin/interface/InterfaceEditor.tsx index 137f3d6..4c7e670 100644 --- a/src/remotePlugin/interface/InterfaceEditor.tsx +++ b/src/remotePlugin/interface/InterfaceEditor.tsx @@ -1,5 +1,5 @@ import { FunctionComponent } from "react"; -import { Widget, useInterfaceFileStore } from "./stores"; +import { Widget, useInterfaceFileStore } from "./interfaceStores"; import { Button } from "../../components/input/Button"; import { SliderWidget, SliderWidgetSettingsEditor } from "../widgets/SliderWidget"; import { MdRemove } from "react-icons/md"; diff --git a/src/remotePlugin/interface/InterfaceList.tsx b/src/remotePlugin/interface/InterfaceList.tsx index 0fb2e83..a7d9fb4 100644 --- a/src/remotePlugin/interface/InterfaceList.tsx +++ b/src/remotePlugin/interface/InterfaceList.tsx @@ -1,5 +1,5 @@ import { FunctionComponent, useState } from "react"; -import { useInterfaceDisplayStateStore, useInterfaceFileStore } from "./stores"; +import { useInterfaceDisplayStateStore, useInterfaceFileStore } from "./interfaceStores"; import { Interface } from "./Interface"; import { InterfaceEditor } from "./InterfaceEditor"; import { Button } from "../../components/input/Button"; diff --git a/src/remotePlugin/interface/stores.ts b/src/remotePlugin/interface/interfaceStores.ts similarity index 99% rename from src/remotePlugin/interface/stores.ts rename to src/remotePlugin/interface/interfaceStores.ts index 4380f0f..2a48de0 100644 --- a/src/remotePlugin/interface/stores.ts +++ b/src/remotePlugin/interface/interfaceStores.ts @@ -4,9 +4,9 @@ import { devtools, persist } from "zustand/middleware"; import { diffByKeys } from "../../utils/diffBy"; import _ from "lodash"; import { useCallback } from "react"; -import { usePublishStateStore } from "../publish/store"; +import { usePublishStateStore } from "../publish/publishStore"; import { useIOValueStore } from "../inputOutputStore"; -import { RemoteStateStore, useRemoteStateStore } from "../remote/store"; +import { RemoteStateStore, useRemoteStateStore } from "../remote/remoteStore"; import { sendMessage } from "../message"; import { HandleType, TypeOfHandleType } from "../../engine/node"; diff --git a/src/remotePlugin/message.ts b/src/remotePlugin/message.ts index 7b531b2..3ac2a2a 100644 --- a/src/remotePlugin/message.ts +++ b/src/remotePlugin/message.ts @@ -1,5 +1,5 @@ import { HandleType } from "../engine/node"; -import { Interface } from "./interface/stores"; +import { Interface } from "./interface/interfaceStores"; type RemoteControlWidget = { widgetId: string; @@ -11,12 +11,15 @@ export type RemoteControlInterface = { interfaceId: string; layout: RemoteControlWidget[]; }; -export type RemoteControlEndpoint = { - id: string; +export type RemoteControlEndpointDef = { + valueId: string; type: HandleType; - value: number; - writeable: boolean; name: string; + writeable: boolean; +}; +export type RemoteControlEndpoint = { + value: number; + def: RemoteControlEndpointDef; }; export type BeadiMessage = { @@ -63,7 +66,7 @@ export function handleMessage(message: BeadiMessage, handlers: BeadiMessageHandl export function sendMessage(socket: WebSocket, message: BeadiMessage) { Object.entries(message).forEach(([key, payload]) => { const data = JSON.stringify({ [key]: payload }); - console.log("Sending ", socket, data); + // console.log("Sending ", socket, data); socket.send(data); }); } diff --git a/src/remotePlugin/outputAdapter.tsx b/src/remotePlugin/outputAdapter.tsx index 81c5df6..c56e530 100644 --- a/src/remotePlugin/outputAdapter.tsx +++ b/src/remotePlugin/outputAdapter.tsx @@ -1,8 +1,8 @@ import { FunctionComponent } from "react"; -import { InputAdapterDef, OutputAdapterDef } from "../engine/adapter"; +import { OutputAdapterDef } from "../engine/adapter"; import { HandleType, asHandleType } from "../engine/node"; import { Select } from "../components/input/Select"; -import { useIOValueStore } from "./inputOutputStore"; +import { usePublishStateStore } from "./publish/publishStore"; export type RemoteOutputAdapterSettings = { type: HandleType; @@ -43,7 +43,7 @@ export const remoteOutputAdapter: OutputAdapterDef { console.log("Updating value ", valueId, " to ", value, " on disconnected socket"); - useIOValueStore.getState().setValue(valueId, value); + useIOValueStore.getState().setValue(valueId, value, true); }, emitSignal: (valueId, data) => { console.log("Emitting Signal at ", valueId, " with ", data, " on disconnected socket"); @@ -32,7 +32,7 @@ function makeConnectingState(socket: WebSocket): PublishConnectionState & { stat socket, updateValue: (valueId, value) => { console.log("Updating value ", valueId, " to ", value, " on connecting socket"); - useIOValueStore.getState().setValue(valueId, value); + useIOValueStore.getState().setValue(valueId, value, true); }, emitSignal: (valueId, data) => { console.log("Emitting Signal at ", valueId, " with ", data, " on connecting socket"); @@ -59,13 +59,18 @@ function makeConnectedState(socket: WebSocket, id: string): PublishConnectionSta lastPublishedEndpointDefs = endpointDefs; sendMessage(socket, { PublishEndpoints: { - endpoints: Object.values(state.values).map((v) => ({ - id: v.valueId, - type: v.type, - value: v.value, - name: v.name, - writeable: v.writeable, - })), + endpoints: Object.values(state.values).map( + (v) => + ({ + def: { + valueId: v.valueId, + type: v.type, + name: v.name, + writeable: v.writeable, + }, + value: v.value, + } satisfies RemoteControlEndpoint) + ), }, }); } @@ -80,8 +85,11 @@ function makeConnectedState(socket: WebSocket, id: string): PublishConnectionSta }, id, socket, - updateValue: (valueId, value) => { + updateValue: (valueId, value, immediateWriteLocal = false) => { console.log("Updating value ", valueId, " to ", value, " on connected socket"); + if (immediateWriteLocal) { + useIOValueStore.getState().setValue(valueId, value, true); + } sendMessage(socket, { ValueChanged: { endpoint: valueId, @@ -105,7 +113,7 @@ type PublishConnectionState = | { state: "disconnected"; error?: string; - updateValue: (valueId: string, value: any) => void; + updateValue: (valueId: string, value: any, immediateWriteLocal?: boolean) => void; emitSignal: (valueId: string, data: any) => void; publish: () => void; } @@ -113,7 +121,7 @@ type PublishConnectionState = state: "connecting"; socket: WebSocket; close: () => void; - updateValue: (valueId: string, value: any) => void; + updateValue: (valueId: string, value: any, immediateWriteLocal?: boolean) => void; emitSignal: (valueId: string, data: any) => void; } | { @@ -121,7 +129,7 @@ type PublishConnectionState = socket: WebSocket; id: string; close: () => void; - updateValue: (valueId: string, value: any) => void; + updateValue: (valueId: string, value: any, immediateWriteLocal?: boolean) => void; emitSignal: (valueId: string, data: any) => void; }; type PublishStateStore = { @@ -157,7 +165,7 @@ function publish(set: Setter, get: Getter): void { } }); socket.addEventListener("message", (event) => { - console.log("WebSocket message: ", event); + // console.log("WebSocket message: ", event); let data: BeadiMessage; try { data = JSON.parse(event.data); @@ -172,13 +180,18 @@ function publish(set: Setter, get: Getter): void { }); sendMessage(socket, { PublishEndpoints: { - endpoints: Object.values(useIOValueStore.getState().values).map((v) => ({ - id: v.valueId, - type: v.type, - value: v.value, - name: v.name, - writeable: v.writeable, - })), + endpoints: Object.values(useIOValueStore.getState().values).map( + (v) => + ({ + def: { + valueId: v.valueId, + type: v.type, + name: v.name, + writeable: v.writeable, + }, + value: v.value, + } satisfies RemoteControlEndpoint) + ), }, }); sendMessage(socket, { diff --git a/src/remotePlugin/remote/ConnectionManager.tsx b/src/remotePlugin/remote/ConnectionManager.tsx index 770c80a..c174711 100644 --- a/src/remotePlugin/remote/ConnectionManager.tsx +++ b/src/remotePlugin/remote/ConnectionManager.tsx @@ -1,5 +1,5 @@ import { FunctionComponent, useState } from "react"; -import { useRemoteStateStore, useRemoteStore } from "./store"; +import { useRemoteStateStore, useRemoteStore } from "./remoteStore"; import { TextInput } from "../../components/input/TextInput"; import { Button } from "../../components/input/Button"; import { MdDelete, MdWifi, MdWifiOff } from "react-icons/md"; diff --git a/src/remotePlugin/remote/store.ts b/src/remotePlugin/remote/remoteStore.ts similarity index 93% rename from src/remotePlugin/remote/store.ts rename to src/remotePlugin/remote/remoteStore.ts index 69a5ce1..037b9f6 100644 --- a/src/remotePlugin/remote/store.ts +++ b/src/remotePlugin/remote/remoteStore.ts @@ -5,8 +5,7 @@ import { BeadiMessage, handleMessage } from "../message"; import { immer } from "zustand/middleware/immer"; import { devtools, persist } from "zustand/middleware"; import _ from "lodash"; -import { Interface } from "../interface/stores"; -import { HandleType } from "reactflow"; +import { Interface } from "../interface/interfaceStores"; import { IOValueState } from "../inputOutputStore"; type RemoteConnection = { @@ -111,7 +110,7 @@ function openRemoteConnection(connection: RemoteConnection, set: Setter): Remote set((s) => ({ state: "disconnected" })); }); socket.addEventListener("message", (event) => { - console.log("WebSocket message: ", event); + // console.log("WebSocket message: ", event); let data: BeadiMessage; try { data = JSON.parse(event.data); @@ -129,12 +128,9 @@ function openRemoteConnection(connection: RemoteConnection, set: Setter): Remote values: Object.assign( {}, ...payload.endpoints.map((it) => ({ - [it.id]: { + [it.def.valueId]: { value: it.value, - valueId: it.id, - type: it.type, - writeable: it.writeable, - name: it.name, + ...it.def, } satisfies RemoteConnectionValue, })) ), @@ -146,12 +142,9 @@ function openRemoteConnection(connection: RemoteConnection, set: Setter): Remote draft.values = Object.assign( {}, ...payload.endpoints.map((it) => ({ - [it.id]: { + [it.def.valueId]: { value: it.value, - valueId: it.id, - type: it.type, - writeable: it.writeable, - name: it.name, + ...it.def, } satisfies RemoteConnectionValue, })) ); diff --git a/src/remotePlugin/widgets/ButtonWidget.tsx b/src/remotePlugin/widgets/ButtonWidget.tsx index 1b58080..e763497 100644 --- a/src/remotePlugin/widgets/ButtonWidget.tsx +++ b/src/remotePlugin/widgets/ButtonWidget.tsx @@ -1,8 +1,8 @@ -import { ChangeEventHandler, FunctionComponent, useCallback, useState } from "react"; +import { FunctionComponent } from "react"; import { RemoteWidgetDef, RemoteWidgetProps, RemoteWidgetSettingsProps } from "../interface/widget"; import { Select } from "../../components/input/Select"; import { useIOValueStore } from "../inputOutputStore"; -import { useInterfaceFileStore, useWidgetSignalHandle, useWidgetValueHandle } from "../interface/stores"; +import { useInterfaceFileStore, useWidgetSignalHandle } from "../interface/interfaceStores"; import { Button } from "../../components/input/Button"; type ButtonWidgetSettings = { diff --git a/src/remotePlugin/widgets/GraphWidget.tsx b/src/remotePlugin/widgets/GraphWidget.tsx index f5aa217..338771f 100644 --- a/src/remotePlugin/widgets/GraphWidget.tsx +++ b/src/remotePlugin/widgets/GraphWidget.tsx @@ -1,8 +1,8 @@ -import { ChangeEventHandler, FunctionComponent, useCallback, useEffect, useState } from "react"; +import { FunctionComponent, useEffect, useState } from "react"; import { RemoteWidgetDef, RemoteWidgetProps, RemoteWidgetSettingsProps } from "../interface/widget"; import { Select } from "../../components/input/Select"; import { useIOValueStore } from "../inputOutputStore"; -import { useInterfaceFileStore, useWidgetValueHandle } from "../interface/stores"; +import { useInterfaceFileStore, useWidgetValueHandle } from "../interface/interfaceStores"; import { Graph } from "../../components/graph/Graph"; import produce from "immer"; diff --git a/src/remotePlugin/widgets/SliderWidget.tsx b/src/remotePlugin/widgets/SliderWidget.tsx index 77e1e3e..e5eb7eb 100644 --- a/src/remotePlugin/widgets/SliderWidget.tsx +++ b/src/remotePlugin/widgets/SliderWidget.tsx @@ -1,8 +1,8 @@ -import { ChangeEventHandler, FunctionComponent, useCallback, useState } from "react"; +import { FunctionComponent, useState } from "react"; import { RemoteWidgetDef, RemoteWidgetProps, RemoteWidgetSettingsProps } from "../interface/widget"; import { Select } from "../../components/input/Select"; import { useIOValueStore } from "../inputOutputStore"; -import { useInterfaceFileStore, useWidgetValueHandle } from "../interface/stores"; +import { useInterfaceFileStore, useWidgetValueHandle } from "../interface/interfaceStores"; type SliderWidgetSettings = { valueId: string; diff --git a/src/remotePlugin/widgets/SwitchWidget.tsx b/src/remotePlugin/widgets/SwitchWidget.tsx index 9cb5285..64cccc6 100644 --- a/src/remotePlugin/widgets/SwitchWidget.tsx +++ b/src/remotePlugin/widgets/SwitchWidget.tsx @@ -1,8 +1,8 @@ -import { ChangeEventHandler, FunctionComponent, useCallback, useState } from "react"; +import { FunctionComponent, useState } from "react"; import { RemoteWidgetDef, RemoteWidgetProps, RemoteWidgetSettingsProps } from "../interface/widget"; import { Select } from "../../components/input/Select"; import { useIOValueStore } from "../inputOutputStore"; -import { useInterfaceFileStore, useWidgetValueHandle } from "../interface/stores"; +import { useInterfaceFileStore, useWidgetValueHandle } from "../interface/interfaceStores"; type SwitchWidgetSettings = { valueId: string; From e8a0ae6560377beb2e141a96f4d089db730a3b18 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Sun, 6 Aug 2023 16:27:56 +0200 Subject: [PATCH 052/109] Some cleanups to prevent rerenders --- src/nodes/PositiveWave.tsx.off | 104 ----------------- src/nodes/WaveNode.tsx | 113 +++++++++++++++++++ src/registries.ts | 2 + src/remotePlugin/interface/Interface.tsx | 5 +- src/remotePlugin/interface/InterfaceList.tsx | 21 ++-- 5 files changed, 131 insertions(+), 114 deletions(-) delete mode 100644 src/nodes/PositiveWave.tsx.off create mode 100644 src/nodes/WaveNode.tsx diff --git a/src/nodes/PositiveWave.tsx.off b/src/nodes/PositiveWave.tsx.off deleted file mode 100644 index 9080d55..0000000 --- a/src/nodes/PositiveWave.tsx.off +++ /dev/null @@ -1,104 +0,0 @@ -import { FunctionComponent } from "react"; -import { NodeDef, NodeHeaderProps } from "../engine/node"; -import { useInputHandleData } from "../engine/store"; -import { categories } from "./category"; - -const PositiveWaveNode: FunctionComponent = ({ id }) => { - const [positive, setPositive] = useInputHandleData(id, "positive"); - - return ( -
- -
- ); -}; - -export const positiveWaveNodeDef: NodeDef = { - label: "Wave Generator", - category: categories["generators"], - type: "wave", - header: PositiveWaveNode, - // component: WaveNode, - outputs: [ - { - id: "value", - label: "Value", - type: "number", - }, - ], - inputs: [ - { - id: "positive", - label: "Positive", - type: "boolean", - default: true, - hidden: true, - }, - { - id: "amplitude", - label: "Height", - type: "number", - default: 1.0, - min: 0.0, - }, - - { - id: "frequency", - label: "Frequency", - type: "number", - default: 1.0, - min: 0.0, - }, - { - id: "phase", - label: "Phase Shift", - type: "number", - default: 0.0, - min: 0.0, - max: Math.PI * 2, - }, - ], - executor: ( - [positive, amplitude, frequency, phaseShift], - { commit, committed } - ) => { - const seconds = Date.now() / 1000; - const committedFreq = committed["frequency"]; - let offset = committed["offset"] || 0; - const phase = seconds * 2 * Math.PI; - - if (committedFreq !== frequency) { - const oldFreq = committedFreq || frequency; - - let newOffset = - Math.asin(Math.sin(phase * oldFreq + offset)) - frequency * phase; - - const oldDir = Math.sign(oldFreq * Math.cos(phase * oldFreq + offset)); - const newDir = Math.sign( - frequency * Math.cos(phase * frequency + newOffset) - ); - if (oldDir !== newDir) { - newOffset = Math.PI - 2 * frequency * phase - newOffset; - } - - commit("offset", newOffset); - commit("frequency", frequency); - offset = newOffset; - } - - const sine = Math.sin(phase * frequency + offset + phaseShift) * amplitude; - - if (positive) { - return [sine / 2.0 + amplitude / 2.0]; - } else { - return [sine]; - } - }, -}; diff --git a/src/nodes/WaveNode.tsx b/src/nodes/WaveNode.tsx new file mode 100644 index 0000000..484a985 --- /dev/null +++ b/src/nodes/WaveNode.tsx @@ -0,0 +1,113 @@ +import { FunctionComponent } from "react"; +import { NodeDef, NodeHeaderProps, nodeDef } from "../engine/node"; +import { useInputHandleData } from "../engine/store"; +import { categories } from "./category"; + +const PositiveWaveNode: FunctionComponent> = ({ id }) => { + const [positive, setPositive] = useInputHandleData(id, "positive"); + + return ( +
+ +
+ ); +}; + +export const positiveWaveNodeDef = nodeDef()({ + label: "Wave Generator", + category: categories["generators"], + type: "wave", + header: PositiveWaveNode, + // component: WaveNode, + outputs: { + value: { + label: "Value", + type: "number", + }, + }, + inputs: { + positive: { + id: "positive", + label: "Positive", + type: "boolean", + default: true, + hidden: true, + }, + amplitude: { + id: "amplitude", + label: "Height", + type: "number", + default: 1.0, + min: 0.0, + }, + + frequency: { + id: "frequency", + label: "Frequency", + type: "number", + default: 1.0, + min: 0.0, + }, + phase: { + id: "phase", + label: "Phase Shift", + type: "number", + default: 0.0, + min: 0.0, + max: Math.PI * 2, + }, + }, + executor: { + initialPersistence: { + frequency: 0.0, + offset: 0.0, + }, + executor: ({ positive, amplitude, frequency, phase: phaseShift }, persistent) => { + const seconds = Date.now() / 1000; + const committedFreq = persistent.frequency; + let offset = persistent.offset; + const phase = seconds * 2 * Math.PI; + + if (committedFreq !== frequency) { + const oldFreq = committedFreq || frequency; + + let newOffset = Math.asin(Math.sin(phase * oldFreq + offset)) - frequency * phase; + + const oldDir = Math.sign(oldFreq * Math.cos(phase * oldFreq + offset)); + const newDir = Math.sign(frequency * Math.cos(phase * frequency + newOffset)); + if (oldDir !== newDir) { + newOffset = Math.PI - 2 * frequency * phase - newOffset; + } + + persistent.offset = newOffset; + persistent.frequency = frequency; + // commit("offset", newOffset); + // commit("frequency", frequency); + offset = newOffset; + } + + const sine = Math.sin(phase * frequency + offset + phaseShift) * amplitude; + + if (positive) { + return { + outputs: { + value: sine / 2.0 + amplitude / 2.0, + }, + driverOutputs: {}, + persistentData: persistent, + }; + } else { + return { + outputs: { + value: sine / 2.0 + amplitude / 2.0, + }, + driverOutputs: {}, + persistentData: persistent, + }; + } + }, + }, +}); diff --git a/src/registries.ts b/src/registries.ts index 9cef714..c16fe6d 100644 --- a/src/registries.ts +++ b/src/registries.ts @@ -20,6 +20,7 @@ import { addNodeDef, divideNodeDef, multiplyNodeDef, subtractNodeDef } from "./n import { Tab, fileTab as fileTabDef } from "./components/Settings"; import { remoteSettingsTab as remoteSettingsTabDef } from "./remotePlugin/RemoteDrawerPage"; import { switchNodeDef } from "./nodes/SwitchNode"; +import { positiveWaveNodeDef } from "./nodes/WaveNode"; const nodeDefList: AnyNodeDef[] = [ // displayNodeDef, @@ -41,6 +42,7 @@ const nodeDefList: AnyNodeDef[] = [ inputAdapterNode as any, outputAdapterNode as any, switchNodeDef as any, + positiveWaveNodeDef as any, // clampNodeDef, // curveNodeDef, // delayNodeDef, diff --git a/src/remotePlugin/interface/Interface.tsx b/src/remotePlugin/interface/Interface.tsx index 3601bde..4508eef 100644 --- a/src/remotePlugin/interface/Interface.tsx +++ b/src/remotePlugin/interface/Interface.tsx @@ -2,6 +2,7 @@ import { FunctionComponent } from "react"; import { Widget, useInterfaceDisplayStateStore } from "./interfaceStores"; import { SliderWidget } from "../widgets/SliderWidget"; import { remoteWidgetDefs } from "../registry"; +import _ from "lodash"; type InterfaceEntryProps = { widget: Widget; @@ -19,12 +20,12 @@ type InterfaceProps = { interfaceId: string; }; export const Interface: FunctionComponent = ({ interfaceId }) => { - const interfaceState = useInterfaceDisplayStateStore((s) => s.interfaces[interfaceId]); + const interfaceStateDefLayout = useInterfaceDisplayStateStore((s) => s.interfaces[interfaceId].def.layout, _.isEqual); return (
    - {interfaceState.def.layout.map((it) => ( + {interfaceStateDefLayout.map((it) => (
  • diff --git a/src/remotePlugin/interface/InterfaceList.tsx b/src/remotePlugin/interface/InterfaceList.tsx index a7d9fb4..f09874e 100644 --- a/src/remotePlugin/interface/InterfaceList.tsx +++ b/src/remotePlugin/interface/InterfaceList.tsx @@ -6,6 +6,7 @@ import { Button } from "../../components/input/Button"; import { MdDelete, MdDeviceHub, MdEdit, MdEditOff, MdExpandLess, MdExpandMore } from "react-icons/md"; import { CollapsibleCard } from "../../components/CollapsibleCard"; import { TextInput } from "../../components/input/TextInput"; +import _ from "lodash"; type InterfaceListEntryProps = { interfaceId: string; @@ -16,7 +17,7 @@ export const InterfaceListEntry: FunctionComponent = ({ const deleteLocalInterface = useInterfaceFileStore((s) => s.deleteInterface); // const deleteRemoteInterface = useInterfaceDisplayStore((s) => s.removeRemoteInterface); const isLocal = brokerType === "local"; - const iface = useInterfaceDisplayStateStore((s) => s.interfaces[interfaceId]); + const ifaceDef = useInterfaceDisplayStateStore((s) => s.interfaces[interfaceId].def, _.isEqual); const updateInterface = useInterfaceFileStore((s) => s.updateInterface); if (editing && isLocal) { @@ -28,7 +29,7 @@ export const InterfaceListEntry: FunctionComponent = ({ {isLocal && L}
    updateInterface(interfaceId, (d) => { d.name = e; @@ -52,7 +53,7 @@ export const InterfaceListEntry: FunctionComponent = ({ <> {!isLocal && } {isLocal && L} - {iface.def.name} + {ifaceDef.name}
    {/* */} {isLocal && } @@ -67,13 +68,17 @@ export const InterfaceListEntry: FunctionComponent = ({ type InterfaceListProps = {}; export const InterfaceList: FunctionComponent = () => { - const interfaces = useInterfaceDisplayStateStore((s) => - Object.entries(s.interfaces).map(([interfaceId, iface]) => ({ - interfaceId, - brokerType: iface.brokerType, - })) + const interfaces = useInterfaceDisplayStateStore( + (s) => + Object.entries(s.interfaces).map(([interfaceId, iface]) => ({ + interfaceId, + brokerType: iface.brokerType, + })), + _.isEqual ); + console.log(interfaces); + return (
      {interfaces.map(({ interfaceId, brokerType }) => ( From 641ff69017a7f069b8365ad33132a45f987dce12 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Sun, 6 Aug 2023 17:35:25 +0200 Subject: [PATCH 053/109] cleanups and fixes --- src/engine/runner.ts | 2 +- src/nodes/WaveNode.tsx | 1 + src/remotePlugin/interface/interfaceStores.ts | 8 ++++---- src/remotePlugin/publish/publishStore.ts | 8 ++++---- src/remotePlugin/widgets/SliderWidget.tsx | 4 ++-- src/utils/diffBy.ts | 4 ++-- 6 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/engine/runner.ts b/src/engine/runner.ts index 08b2f6c..2ce09fc 100644 --- a/src/engine/runner.ts +++ b/src/engine/runner.ts @@ -76,7 +76,7 @@ function runEngineLoop(model: Model) { const persistent = persistentData[step.nodeId]; const driverInputs = nodeType.executor.inputDriver?.(nodeContext); // const committedData = - const outputs = nodeType.executor.executor(inputs, persistent, driverInputs ?? {}); + const outputs = nodeType.executor.executor(inputs, _.cloneDeep(persistent), driverInputs ?? {}); const nodeTypeOutputs = getNodeOutputs(step.type, step.settings); for (const outputId in nodeTypeOutputs) { diff --git a/src/nodes/WaveNode.tsx b/src/nodes/WaveNode.tsx index 484a985..01e54eb 100644 --- a/src/nodes/WaveNode.tsx +++ b/src/nodes/WaveNode.tsx @@ -2,6 +2,7 @@ import { FunctionComponent } from "react"; import { NodeDef, NodeHeaderProps, nodeDef } from "../engine/node"; import { useInputHandleData } from "../engine/store"; import { categories } from "./category"; +import _ from "lodash"; const PositiveWaveNode: FunctionComponent> = ({ id }) => { const [positive, setPositive] = useInputHandleData(id, "positive"); diff --git a/src/remotePlugin/interface/interfaceStores.ts b/src/remotePlugin/interface/interfaceStores.ts index 2a48de0..1e57830 100644 --- a/src/remotePlugin/interface/interfaceStores.ts +++ b/src/remotePlugin/interface/interfaceStores.ts @@ -200,11 +200,11 @@ function createLocalBrokeredInterface( def: _.cloneDeep(useInterfaceFileStore.getState().interfaces[def.interfaceId]), values: useIOValueStore.getState().values, updateValue: (valueId, value) => { - console.log("Locally udpating ", valueId, " to ", value); + // console.log("Locally udpating ", valueId, " to ", value); usePublishStateStore.getState().state.updateValue(valueId, value); }, emitSignal: (valueId, data) => { - console.log("Locally emitting signal", valueId, data); + // console.log("Locally emitting signal", valueId, data); usePublishStateStore.getState().state.emitSignal(valueId, data); }, closeBroker: () => { @@ -246,7 +246,7 @@ export function setupInterfaceListeners() { syncLocalInterfacesFromFileStore(useInterfaceFileStore.getState()); const syncRemoteInterfacesFromRemoteStore = (state: RemoteStateStore) => { - console.log("SSS", state); + // console.log("SSS", state); const existingLocalInterfaces = _.pickBy(useInterfaceDisplayStateStore.getState().interfaces, (s) => s.brokerType === "remote"); const allRemoteInterfaces: Record = Object.assign( {}, @@ -263,7 +263,7 @@ export function setupInterfaceListeners() { useInterfaceDisplayStateStore.setState((s) => produce(s, (draft) => { - console.log("Extra: ", extra, "Missing: ", missing, "Changed: ", changed); + // console.log("Extra: ", extra, "Missing: ", missing, "Changed: ", changed); for (const extraKey in extra) { delete draft.interfaces[extraKey]; } diff --git a/src/remotePlugin/publish/publishStore.ts b/src/remotePlugin/publish/publishStore.ts index 87471a0..d6ab19c 100644 --- a/src/remotePlugin/publish/publishStore.ts +++ b/src/remotePlugin/publish/publishStore.ts @@ -11,7 +11,7 @@ function makeDisconnectedState(set: Setter, get: Getter, error?: string): Publis error, state: "disconnected", updateValue: (valueId, value) => { - console.log("Updating value ", valueId, " to ", value, " on disconnected socket"); + // console.log("Updating value ", valueId, " to ", value, " on disconnected socket"); useIOValueStore.getState().setValue(valueId, value, true); }, emitSignal: (valueId, data) => { @@ -31,7 +31,7 @@ function makeConnectingState(socket: WebSocket): PublishConnectionState & { stat }, socket, updateValue: (valueId, value) => { - console.log("Updating value ", valueId, " to ", value, " on connecting socket"); + // console.log("Updating value ", valueId, " to ", value, " on connecting socket"); useIOValueStore.getState().setValue(valueId, value, true); }, emitSignal: (valueId, data) => { @@ -86,7 +86,7 @@ function makeConnectedState(socket: WebSocket, id: string): PublishConnectionSta id, socket, updateValue: (valueId, value, immediateWriteLocal = false) => { - console.log("Updating value ", valueId, " to ", value, " on connected socket"); + // console.log("Updating value ", valueId, " to ", value, " on connected socket"); if (immediateWriteLocal) { useIOValueStore.getState().setValue(valueId, value, true); } @@ -204,7 +204,7 @@ function publish(set: Setter, get: Getter): void { console.log("TODO Compare payload endpoints to actually published endpoints and warn if they diverge"); }, ValueChanged: ({ endpoint, value }) => { - console.log("ValueChanged request got to Set ", endpoint, " to ", value); + // console.log("ValueChanged request got to Set ", endpoint, " to ", value); useIOValueStore.getState().setValue(endpoint, value); }, diff --git a/src/remotePlugin/widgets/SliderWidget.tsx b/src/remotePlugin/widgets/SliderWidget.tsx index e5eb7eb..5186ea6 100644 --- a/src/remotePlugin/widgets/SliderWidget.tsx +++ b/src/remotePlugin/widgets/SliderWidget.tsx @@ -27,7 +27,7 @@ export const SliderWidget: FunctionComponent { setFocused(true); @@ -41,7 +41,7 @@ export const SliderWidget: FunctionComponent diff --git a/src/utils/diffBy.ts b/src/utils/diffBy.ts index 6eb1c69..6404a69 100644 --- a/src/utils/diffBy.ts +++ b/src/utils/diffBy.ts @@ -18,7 +18,7 @@ type DiffByResult = { * @returns */ export function diffBy(baseKeys: TKey[], changedKeys: TKey[]): DiffByResult { - console.log("Diffing: Base ", baseKeys, " Changed ", changedKeys); + // console.log("Diffing: Base ", baseKeys, " Changed ", changedKeys); const inBaseNotInChanged = _.difference(baseKeys, changedKeys); const inChangedNotInBase = _.difference(changedKeys, baseKeys); return { @@ -37,7 +37,7 @@ export function diffByKeys( changed: Record, isEqual?: (a: TA, b: TB) => boolean ): DiffByKeysResult { - console.log("Diffing: Base ", base, " Changed ", changed); + // console.log("Diffing: Base ", base, " Changed ", changed); const { extra, missing } = diffBy(Object.keys(base), Object.keys(changed)); const changedEntries = isEqual === undefined From e641539661785a7c0b8f03063639a4576e346acc Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Sun, 6 Aug 2023 19:23:59 +0200 Subject: [PATCH 054/109] remove interfacedisplaystatestore --- src/hooks/useDeepDebounced.ts | 10 + src/hooks/useDynamicStore.ts | 19 + src/remotePlugin/inputOutputStore.ts | 2 +- src/remotePlugin/interface/Interface.tsx | 19 +- .../interface/InterfaceEditor.tsx | 12 +- src/remotePlugin/interface/InterfaceList.tsx | 145 ++++++-- src/remotePlugin/interface/interfaceStores.ts | 332 +++--------------- src/remotePlugin/interface/widget.ts | 3 +- src/remotePlugin/message.ts | 6 +- src/remotePlugin/remote/remoteStore.ts | 6 +- src/remotePlugin/widgets/ButtonWidget.tsx | 4 +- src/remotePlugin/widgets/GraphWidget.tsx | 4 +- src/remotePlugin/widgets/SliderWidget.tsx | 4 +- src/remotePlugin/widgets/SwitchWidget.tsx | 4 +- src/utils/notNull.ts | 3 + 15 files changed, 233 insertions(+), 340 deletions(-) create mode 100644 src/hooks/useDynamicStore.ts create mode 100644 src/utils/notNull.ts diff --git a/src/hooks/useDeepDebounced.ts b/src/hooks/useDeepDebounced.ts index 4431de2..0a4f760 100644 --- a/src/hooks/useDeepDebounced.ts +++ b/src/hooks/useDeepDebounced.ts @@ -10,3 +10,13 @@ export function useDeepDebounced(value: T) { return data.current; } + +export function useDebouncedWith(value: T, isEqual: (a: T, b: T) => boolean) { + const data = useRef(value); + + if (!isEqual(data.current, value)) { + data.current = value; + } + + return data.current; +} diff --git a/src/hooks/useDynamicStore.ts b/src/hooks/useDynamicStore.ts new file mode 100644 index 0000000..59214bd --- /dev/null +++ b/src/hooks/useDynamicStore.ts @@ -0,0 +1,19 @@ +import { useSyncExternalStore } from "react"; +import { useDebouncedWith } from "./useDeepDebounced"; + +export type AnyStoreHandleSelecting = StoreHandle; + +export type StoreHandle = { + subscribe: (listener: () => void) => () => void; + getState: () => TStore; + selectData: (store: TStore) => TSelectedData; +}; +export function useDynamicStore( + handle: StoreHandle, + select: (store: TSelectedData) => TData, + isEqual: (a: TData, b: TData) => boolean = (a, b) => a === b +) { + const storeState = useSyncExternalStore(handle.subscribe, handle.getState); + const data = select(handle.selectData(storeState)); + return useDebouncedWith(data, isEqual); +} diff --git a/src/remotePlugin/inputOutputStore.ts b/src/remotePlugin/inputOutputStore.ts index db1f700..da04c58 100644 --- a/src/remotePlugin/inputOutputStore.ts +++ b/src/remotePlugin/inputOutputStore.ts @@ -25,7 +25,7 @@ export type IOValueState = { value: T; } & IOValueDef; -type IOValueStore = { +export type IOValueStore = { // values: Record>; values: Record>; diff --git a/src/remotePlugin/interface/Interface.tsx b/src/remotePlugin/interface/Interface.tsx index 4508eef..4aae131 100644 --- a/src/remotePlugin/interface/Interface.tsx +++ b/src/remotePlugin/interface/Interface.tsx @@ -1,33 +1,32 @@ import { FunctionComponent } from "react"; -import { Widget, useInterfaceDisplayStateStore } from "./interfaceStores"; +import { InterfaceDef, Widget } from "./interfaceStores"; import { SliderWidget } from "../widgets/SliderWidget"; import { remoteWidgetDefs } from "../registry"; import _ from "lodash"; +import { InterfaceHandle } from "./InterfaceList"; type InterfaceEntryProps = { widget: Widget; - interfaceId: string; + interfaceHandle: InterfaceHandle; }; -export const InterfaceEntry: FunctionComponent = ({ widget, interfaceId }) => { +export const InterfaceEntry: FunctionComponent = ({ widget, interfaceHandle }) => { const WidgetComponent = remoteWidgetDefs[widget.widgetType].display; if (WidgetComponent === undefined) { return

      Invalid widget {widget.widgetType}

      ; } - return ; + return ; }; type InterfaceProps = { - interfaceId: string; + interfaceHandle: InterfaceHandle; }; -export const Interface: FunctionComponent = ({ interfaceId }) => { - const interfaceStateDefLayout = useInterfaceDisplayStateStore((s) => s.interfaces[interfaceId].def.layout, _.isEqual); - +export const Interface: FunctionComponent = ({ interfaceHandle }) => { return (
        - {interfaceStateDefLayout.map((it) => ( + {interfaceHandle.interfaceDef.layout.map((it) => (
      • - +
      • ))}
      diff --git a/src/remotePlugin/interface/InterfaceEditor.tsx b/src/remotePlugin/interface/InterfaceEditor.tsx index 4c7e670..bd875e3 100644 --- a/src/remotePlugin/interface/InterfaceEditor.tsx +++ b/src/remotePlugin/interface/InterfaceEditor.tsx @@ -1,5 +1,5 @@ import { FunctionComponent } from "react"; -import { Widget, useInterfaceFileStore } from "./interfaceStores"; +import { InterfaceDef, Widget, useInterfaceFileStore } from "./interfaceStores"; import { Button } from "../../components/input/Button"; import { SliderWidget, SliderWidgetSettingsEditor } from "../widgets/SliderWidget"; import { MdRemove } from "react-icons/md"; @@ -31,16 +31,16 @@ export const InterfaceEditorEntry: FunctionComponent }; type InterfaceEditorProps = { - interfaceId: string; + interfaceDef: InterfaceDef; }; -export const InterfaceEditor: FunctionComponent = ({ interfaceId }) => { - const iface = useInterfaceFileStore((s) => s.interfaces[interfaceId]); +export const InterfaceEditor: FunctionComponent = ({ interfaceDef }) => { + const iface = useInterfaceFileStore((s) => s.interfaces[interfaceDef.interfaceId]); const updateInterface = useInterfaceFileStore((s) => s.updateInterface); const addWidget = (type: string) => { const id = `${new Date().getTime()}`; - updateInterface(interfaceId, (draft) => { + updateInterface(interfaceDef.interfaceId, (draft) => { draft.layout.push({ settings: {}, widgetId: id, @@ -54,7 +54,7 @@ export const InterfaceEditor: FunctionComponent = ({ inter
        {iface.layout.map((it) => (
      • - +
      • ))}
      diff --git a/src/remotePlugin/interface/InterfaceList.tsx b/src/remotePlugin/interface/InterfaceList.tsx index f09874e..8ae6a52 100644 --- a/src/remotePlugin/interface/InterfaceList.tsx +++ b/src/remotePlugin/interface/InterfaceList.tsx @@ -1,23 +1,27 @@ import { FunctionComponent, useState } from "react"; -import { useInterfaceDisplayStateStore, useInterfaceFileStore } from "./interfaceStores"; -import { Interface } from "./Interface"; +import { InterfaceDef, useInterfaceFileStore } from "./interfaceStores"; import { InterfaceEditor } from "./InterfaceEditor"; import { Button } from "../../components/input/Button"; -import { MdDelete, MdDeviceHub, MdEdit, MdEditOff, MdExpandLess, MdExpandMore } from "react-icons/md"; +import { MdDelete, MdDeviceHub, MdEdit, MdEditOff } from "react-icons/md"; import { CollapsibleCard } from "../../components/CollapsibleCard"; import { TextInput } from "../../components/input/TextInput"; import _ from "lodash"; +import { RemoteStateStore, useRemoteStateStore } from "../remote/remoteStore"; +import { notNull } from "../../utils/notNull"; +import { Interface } from "./Interface"; +import { StoreHandle } from "../../hooks/useDynamicStore"; +import { IOValueState, IOValueStore, useIOValueStore } from "../inputOutputStore"; +import { usePublishStateStore } from "../publish/publishStore"; +import { sendMessage } from "../message"; type InterfaceListEntryProps = { - interfaceId: string; - brokerType: string; + interfaceHandle: InterfaceHandle; }; -export const InterfaceListEntry: FunctionComponent = ({ interfaceId, brokerType }) => { +export const InterfaceListEntry: FunctionComponent = ({ interfaceHandle }) => { const [editing, setEditing] = useState(false); const deleteLocalInterface = useInterfaceFileStore((s) => s.deleteInterface); // const deleteRemoteInterface = useInterfaceDisplayStore((s) => s.removeRemoteInterface); - const isLocal = brokerType === "local"; - const ifaceDef = useInterfaceDisplayStateStore((s) => s.interfaces[interfaceId].def, _.isEqual); + const isLocal = interfaceHandle.brokerType === "local"; const updateInterface = useInterfaceFileStore((s) => s.updateInterface); if (editing && isLocal) { @@ -29,21 +33,21 @@ export const InterfaceListEntry: FunctionComponent = ({ {isLocal && L}
      - updateInterface(interfaceId, (d) => { + updateInterface(interfaceHandle.interfaceDef.interfaceId, (d) => { d.name = e; }) } - id={`name_${interfaceId}`} + id={`name_${interfaceHandle.interfaceDef.interfaceId}`} >
      - + } > - + ); } else { @@ -53,37 +57,126 @@ export const InterfaceListEntry: FunctionComponent = ({ <> {!isLocal && } {isLocal && L} - {ifaceDef.name} + {interfaceHandle.interfaceDef.name}
      {/* */} {isLocal && } } > - + ); } }; +export type InterfaceHandle = { + interfaceDef: InterfaceDef; + brokerType: "local" | "remote"; + valueStoreHandle: StoreHandle> | null>; + updateValue: (valueId: string, value: any) => void; + emitSignal: (valueId: string, data: any) => void; +}; + type InterfaceListProps = {}; export const InterfaceList: FunctionComponent = () => { - const interfaces = useInterfaceDisplayStateStore( - (s) => - Object.entries(s.interfaces).map(([interfaceId, iface]) => ({ - interfaceId, - brokerType: iface.brokerType, - })), - _.isEqual + const localInterfaces = useInterfaceFileStore((s) => + Object.values(s.interfaces).map( + (it) => + ({ + interfaceDef: it, + brokerType: "local", + valueStoreHandle: { + getState: () => useIOValueStore.getState(), + subscribe: (listener) => useIOValueStore.subscribe(listener), + selectData: (store) => store.values, + }, + updateValue: (valueId, value) => { + // console.log("Local Update Value: ", valueId, value); + usePublishStateStore.getState().state.updateValue(valueId, value); + }, + emitSignal: (valueId, data) => { + // console.log("Local Emit Signal: ", valueId, data); + usePublishStateStore.getState().state.emitSignal(valueId, data); + }, + } satisfies InterfaceHandle) + ) ); + const remoteInterfaces = useRemoteStateStore((s) => + Object.values(s.remotes) + .flatMap((remote) => { + if (remote.state.state === "connected") { + return Object.values(remote.state.interfaces).map( + (it) => + ({ + interfaceDef: it, + brokerType: "remote", + valueStoreHandle: { + getState: () => useRemoteStateStore.getState(), + subscribe: (listener) => useRemoteStateStore.subscribe(listener), + selectData: (store) => { + const r = store.remotes[remote.definition.remoteConnectionId]; + if (r.state.state === "connected") { + return r.state.values; + } else { + return null; + } + }, + }, + updateValue: (valueId, value) => { + // console.log("Remote Update Value: ", valueId, value); + const r = useRemoteStateStore.getState().remotes[remote.definition.remoteConnectionId]; + if (r.state.state === "connected") { + sendMessage(r.state.socket, { + ValueChanged: { + endpoint: valueId, + value: value, + }, + }); + } + }, + emitSignal: (valueId, data) => { + console.log("Remote Emit Signal: ", valueId, data); + const r = useRemoteStateStore.getState().remotes[remote.definition.remoteConnectionId]; + if (r.state.state === "connected") { + sendMessage(r.state.socket, { + EmitSignal: { + endpoint: valueId, + value: data ?? null, + }, + }); + } + }, + } satisfies InterfaceHandle) + ); + } else { + return null; + } + }) + .filter(notNull) + ); + + // const interfaces = useInterfaceDisplayStateStore( + // (s) => + // Object.entries(s.interfaces).map(([interfaceId, iface]) => ({ + // interfaceId, + // brokerType: iface.brokerType, + // })), + // _.isEqual + // ); - console.log(interfaces); + // console.log(interfaces); return (
        - {interfaces.map(({ interfaceId, brokerType }) => ( -
      • - + {localInterfaces.map((handle) => ( +
      • + +
      • + ))} + {remoteInterfaces.map((handle) => ( +
      • +
      • ))}
      diff --git a/src/remotePlugin/interface/interfaceStores.ts b/src/remotePlugin/interface/interfaceStores.ts index 1e57830..085fc16 100644 --- a/src/remotePlugin/interface/interfaceStores.ts +++ b/src/remotePlugin/interface/interfaceStores.ts @@ -1,45 +1,27 @@ import produce, { Draft } from "immer"; import create from "zustand"; import { devtools, persist } from "zustand/middleware"; -import { diffByKeys } from "../../utils/diffBy"; import _ from "lodash"; import { useCallback } from "react"; -import { usePublishStateStore } from "../publish/publishStore"; -import { useIOValueStore } from "../inputOutputStore"; -import { RemoteStateStore, useRemoteStateStore } from "../remote/remoteStore"; -import { sendMessage } from "../message"; import { HandleType, TypeOfHandleType } from "../../engine/node"; +import { useDynamicStore } from "../../hooks/useDynamicStore"; +import { InterfaceHandle } from "./InterfaceList"; -type RemoteBrokerSettings = { - remoteId: string; -}; -type InterfaceDisplayDef = { - interfaceId: string; -} & ( - | { - brokerType: "remote"; - brokerSettings: RemoteBrokerSettings; - } - | { - brokerType: "local"; - brokerSettings: {}; - } -); export type Widget = { widgetId: string; widgetType: string; settings: any; }; -export type Interface = { +export type InterfaceDef = { name: string; interfaceId: string; layout: Widget[]; }; //TODO This has to be merged into the save file type InterfaceFileStore = { - interfaces: Record; + interfaces: Record; addInterface: () => void; - updateInterface: (interfaceId: string, recipe: (draft: Draft) => void) => void; + updateInterface: (interfaceId: string, recipe: (draft: Draft) => void) => void; deleteInterface: (interfaceId: string) => void; }; export const useInterfaceFileStore = create()( @@ -84,222 +66,6 @@ export const useInterfaceFileStore = create()( ) ); -type InterfaceDisplayValueState = { - valueId: string; - value: any; - type: HandleType; -}; -type InterfaceDisplayState = { - // interfaceId: string; - // layout: Widget[]; - def: Interface; - values: Record; - brokerState: any; - brokerType: string; - updateValue: (valueId: string, value: any) => void; - emitSignal: (valueId: string, data: any) => void; - closeBroker: () => void; -}; -type InterfaceDisplayStateStore = { - interfaces: Record; -}; -export const useInterfaceDisplayStateStore = create()( - devtools( - (set, get) => ({ - interfaces: {}, - }), - { name: "useInterfaceDisplayStateStore" } - ) -); - -type Setter = (recipe: (draft: Draft) => void) => void; -// type Getter = () => InterfaceDisplayState; -function createRemoteBrokeredInterface( - def: InterfaceDisplayDef & { brokerType: "remote" }, - set: Setter -): InterfaceDisplayState & { brokerType: "remote" } { - const syncRemoteStateStore = (s: RemoteStateStore) => { - const remoteState = s.remotes[def.brokerSettings.remoteId]?.state; - if (remoteState !== undefined && remoteState.state === "connected" && remoteState.interfaces[def.interfaceId] !== undefined) { - set((draft) => { - draft.values = remoteState.values; - draft.def = remoteState.interfaces[def.interfaceId]; - }); - } - }; - - const unsubscribeIO = useRemoteStateStore.subscribe(syncRemoteStateStore); - - console.log(def.brokerSettings); - const remoteState = useRemoteStateStore.getState().remotes[def.brokerSettings.remoteId].state; - - return { - brokerType: "remote", - brokerState: {}, - def: - remoteState.state === "connected" - ? _.cloneDeep(remoteState.interfaces[def.interfaceId]) - : { - interfaceId: def.interfaceId, - layout: [], - name: "...", - }, - values: remoteState.state === "connected" ? _.cloneDeep(remoteState.values) : {}, - updateValue: (valueId, value) => { - console.log("Remotely updating ", valueId, " to ", value); - const state = useRemoteStateStore.getState().remotes[def.brokerSettings.remoteId].state; - if (state.state === "connected") { - sendMessage(state.socket, { - ValueChanged: { - endpoint: valueId, - value: value, - }, - }); - } - }, - emitSignal: (valueId, data) => { - console.log("Remotely emitting signal", valueId, data); - const state = useRemoteStateStore.getState().remotes[def.brokerSettings.remoteId].state; - if (state.state === "connected") { - sendMessage(state.socket, { - EmitSignal: { - endpoint: valueId, - value: data ?? null, - }, - }); - } - }, - closeBroker: () => { - unsubscribeIO(); - }, - }; -} -function createLocalBrokeredInterface( - def: InterfaceDisplayDef & { brokerType: "local" }, - set: Setter -): InterfaceDisplayState & { brokerType: "local" } { - const unsubscribeIO = useIOValueStore.subscribe((s) => { - set((draft) => { - //TODO sometimes draft is undefined (i think after deleting some nodes)... - draft.values = s.values; - }); - }); - const unsubscribeInterfaceFile = useInterfaceFileStore.subscribe((s) => { - set((draft) => { - if (s.interfaces[def.interfaceId] === undefined) { - console.warn("Tried to update interface broker for nonexisting interface.", def.interfaceId); - return; - } - draft.def = _.cloneDeep(s.interfaces[def.interfaceId]); - }); - }); - - return { - brokerType: "local", - brokerState: {}, - def: _.cloneDeep(useInterfaceFileStore.getState().interfaces[def.interfaceId]), - values: useIOValueStore.getState().values, - updateValue: (valueId, value) => { - // console.log("Locally udpating ", valueId, " to ", value); - usePublishStateStore.getState().state.updateValue(valueId, value); - }, - emitSignal: (valueId, data) => { - // console.log("Locally emitting signal", valueId, data); - usePublishStateStore.getState().state.emitSignal(valueId, data); - }, - closeBroker: () => { - unsubscribeIO(); - unsubscribeInterfaceFile(); - }, - }; -} - -export function setupInterfaceListeners() { - console.log("Setup Interface Listeners"); - - const syncLocalInterfacesFromFileStore = (state: InterfaceFileStore) => { - const existingLocalInterfaces = _.pickBy(useInterfaceDisplayStateStore.getState().interfaces, (s) => s.brokerType === "local"); - const { extra, missing } = diffByKeys(existingLocalInterfaces, state.interfaces); - - useInterfaceDisplayStateStore.setState((s) => - produce(s, (draft) => { - for (const extraKey in extra) { - delete draft.interfaces[extraKey]; - } - for (const missingKey in missing) { - const set: Setter = (recipe) => { - useInterfaceDisplayStateStore.setState((s) => produce(s, (draft) => recipe(draft.interfaces[missingKey]))); - }; - draft.interfaces[missingKey] = createLocalBrokeredInterface( - { - brokerSettings: {}, - brokerType: "local", - interfaceId: missingKey, - }, - set - ); - } - }) - ); - }; - useInterfaceFileStore.subscribe(syncLocalInterfacesFromFileStore); - syncLocalInterfacesFromFileStore(useInterfaceFileStore.getState()); - - const syncRemoteInterfacesFromRemoteStore = (state: RemoteStateStore) => { - // console.log("SSS", state); - const existingLocalInterfaces = _.pickBy(useInterfaceDisplayStateStore.getState().interfaces, (s) => s.brokerType === "remote"); - const allRemoteInterfaces: Record = Object.assign( - {}, - ...Object.entries(state.remotes).flatMap(([remoteId, remote]) => { - const state = remote.state; - if (state.state === "connected") { - return Object.values(state.interfaces).map((iface) => ({ [iface.interfaceId]: { interface: iface, remoteId: remoteId } })); - } else { - return []; - } - }) - ); - const { extra, missing, changed } = diffByKeys(existingLocalInterfaces, allRemoteInterfaces); - - useInterfaceDisplayStateStore.setState((s) => - produce(s, (draft) => { - // console.log("Extra: ", extra, "Missing: ", missing, "Changed: ", changed); - for (const extraKey in extra) { - delete draft.interfaces[extraKey]; - } - for (const missingKey in missing) { - console.log("ADDING: ", missingKey); - // draft.interfaces[missingKey] = { - // brokerSettings: { - // remoteId: missing[missingKey].remoteId, - // }, - // brokerType: "remote", - // interfaceId: missingKey, - // }; - const set: Setter = (recipe) => { - useInterfaceDisplayStateStore.setState((s) => produce(s, (draft) => recipe(draft.interfaces[missingKey]))); - }; - draft.interfaces[missingKey] = createRemoteBrokeredInterface( - { - brokerSettings: { - remoteId: missing[missingKey].remoteId, - }, - brokerType: "remote", - interfaceId: missingKey, - }, - set - ); - console.log(draft.interfaces); - } - }) - ); - }; - useRemoteStateStore.subscribe(syncRemoteInterfacesFromRemoteStore); - syncRemoteInterfacesFromRemoteStore(useRemoteStateStore.getState()); -} - -setupInterfaceListeners(); - const NULL_SET_VALUE = (value: any) => { console.log("Tried to setValue on an invalid widget"); }; @@ -321,25 +87,27 @@ type WidgetValueHandle = error: string; }; export function useWidgetValueHandle( + // interfacesStoreHandle: AnyStoreHandleSelecting>, + interfaceHandle: InterfaceHandle, valueId: string, - interfaceId: string, type: T ): WidgetValueHandle> { - const iface = useInterfaceDisplayStateStore((s) => s.interfaces[interfaceId]); - + const getValues = interfaceHandle.valueStoreHandle.getState; + const selectValues = interfaceHandle.valueStoreHandle.selectData; const getValue = useCallback(() => { - const iface = useInterfaceDisplayStateStore.getState().interfaces[interfaceId]; - if (iface === undefined) { + // const iface = useInterfaceDisplayStateStore.getState().interfaces[interfaceId]; + const values = selectValues(getValues()); + if (values === null) { return null; } - const value = iface.values[valueId]; + const value = values[valueId]; if (value?.type !== type) { return null; } return value.value; - }, [interfaceId, valueId, type]); + }, [getValues, selectValues, valueId, type]); - const updateValue = iface.updateValue; + const updateValue = interfaceHandle.updateValue; const setValue = useCallback( (v: TypeOfHandleType) => { updateValue(valueId, v); @@ -347,31 +115,31 @@ export function useWidgetValueHandle( [valueId, updateValue] ); - if (iface === undefined) { + const values = useDynamicStore(interfaceHandle.valueStoreHandle, (s) => s); + if (values === null) { return { value: null, + setValue: () => NULL_SET_VALUE, getValue: NULL_GET_VALUE, - setValue: NULL_SET_VALUE, - error: `Invalid Interface ${interfaceId}`, + error: `Invalid store for interface ${interfaceHandle.interfaceDef.interfaceId}`, }; } - - if (iface.values[valueId] === undefined) { + if (values[valueId] === undefined) { return { value: null, setValue: () => NULL_SET_VALUE, getValue: NULL_GET_VALUE, - error: `Value ${valueId} does not exist in Interface ${interfaceId}`, + error: `Value ${valueId} does not exist in Interface ${interfaceHandle.interfaceDef.interfaceId}`, }; } - const value = iface.values[valueId]; + const value = values[valueId]; if (value.type !== type) { return { value: null, setValue: () => NULL_SET_VALUE, getValue: NULL_GET_VALUE, - error: `Value ${valueId} in Interface ${interfaceId} has wrong type: ${value.type} (${type} was expected)`, + error: `Value ${valueId} in Interface ${interfaceHandle.interfaceDef.interfaceId} has wrong type: ${value.type} (${type} was expected)`, }; } @@ -392,33 +160,33 @@ type WidgetSignalHandle = emitSignal: (n: T) => void; error: string; }; -export function useWidgetSignalHandle(valueId: string, interfaceId: string): WidgetSignalHandle { - const iface = useInterfaceDisplayStateStore((s) => s.interfaces[interfaceId]); - - const ifaceEmitSignal = iface.emitSignal; - const emitSignal = useCallback( - (v: T) => { - ifaceEmitSignal(valueId, v); - }, - [valueId, ifaceEmitSignal] - ); - - if (iface === undefined) { - return { - emitSignal: () => NULL_SET_VALUE, - error: `Invalid Interface ${interfaceId}`, - }; - } - - if (iface.values[valueId] === undefined) { - return { - emitSignal: () => NULL_SET_VALUE, - error: `Value ${valueId} does not exist in Interface ${interfaceId}`, - }; - } - +export function useWidgetSignalHandle(interfaceHandle: InterfaceHandle, valueId: string): WidgetSignalHandle { + // const iface = useInterfaceDisplayStateStore((s) => s.interfaces[interfaceId]); + + // const ifaceEmitSignal = iface.emitSignal; + // const emitSignal = useCallback( + // (v: T) => { + // ifaceEmitSignal(valueId, v); + // }, + // [valueId, ifaceEmitSignal] + // ); + + // if (iface === undefined) { return { - emitSignal, - error: undefined, + emitSignal: () => NULL_SET_VALUE, + error: `Invalid Interface ${interfaceHandle.interfaceDef.interfaceId}`, }; + // } + + // if (iface.values[valueId] === undefined) { + // return { + // emitSignal: () => NULL_SET_VALUE, + // error: `Value ${valueId} does not exist in Interface ${interfaceId}`, + // }; + // } + + // return { + // emitSignal, + // error: undefined, + // }; } diff --git a/src/remotePlugin/interface/widget.ts b/src/remotePlugin/interface/widget.ts index 26d2c67..b306f1b 100644 --- a/src/remotePlugin/interface/widget.ts +++ b/src/remotePlugin/interface/widget.ts @@ -1,8 +1,9 @@ import { ComponentType, FunctionComponent, useCallback } from "react"; +import { InterfaceHandle } from "./InterfaceList"; export type RemoteWidgetProps = { settings: TSettings; - interfaceId: string; + interfaceHandle: InterfaceHandle; widgetId: string; }; export type RemoteWidgetSettingsProps = { diff --git a/src/remotePlugin/message.ts b/src/remotePlugin/message.ts index 3ac2a2a..e95c180 100644 --- a/src/remotePlugin/message.ts +++ b/src/remotePlugin/message.ts @@ -1,5 +1,5 @@ import { HandleType } from "../engine/node"; -import { Interface } from "./interface/interfaceStores"; +import { InterfaceDef } from "./interface/interfaceStores"; type RemoteControlWidget = { widgetId: string; @@ -30,11 +30,11 @@ export type BeadiMessage = { endpoints: RemoteControlEndpoint[]; }; PublishInterfaces?: { - interfaces: Interface[]; + interfaces: InterfaceDef[]; }; WelcomeController?: { endpoints: RemoteControlEndpoint[]; - interfaces: Interface[]; + interfaces: InterfaceDef[]; id: string; }; ValueChanged?: { diff --git a/src/remotePlugin/remote/remoteStore.ts b/src/remotePlugin/remote/remoteStore.ts index 037b9f6..6587305 100644 --- a/src/remotePlugin/remote/remoteStore.ts +++ b/src/remotePlugin/remote/remoteStore.ts @@ -5,7 +5,7 @@ import { BeadiMessage, handleMessage } from "../message"; import { immer } from "zustand/middleware/immer"; import { devtools, persist } from "zustand/middleware"; import _ from "lodash"; -import { Interface } from "../interface/interfaceStores"; +import { InterfaceDef } from "../interface/interfaceStores"; import { IOValueState } from "../inputOutputStore"; type RemoteConnection = { @@ -68,14 +68,14 @@ type RemoteConnectionState = socket: WebSocket; id: string; values: Record; - interfaces: Record; + interfaces: Record; } | { state: "closing"; socket: WebSocket; id: string; values: Record; - interfaces: Record; + interfaces: Record; }; export type RemoteConnectionHandle = { state: RemoteConnectionState; diff --git a/src/remotePlugin/widgets/ButtonWidget.tsx b/src/remotePlugin/widgets/ButtonWidget.tsx index e763497..5d38586 100644 --- a/src/remotePlugin/widgets/ButtonWidget.tsx +++ b/src/remotePlugin/widgets/ButtonWidget.tsx @@ -9,8 +9,8 @@ type ButtonWidgetSettings = { valueId: string; }; -export const ButtonWidget: FunctionComponent> = ({ settings, interfaceId }) => { - const handle = useWidgetSignalHandle(settings.valueId, interfaceId); +export const ButtonWidget: FunctionComponent> = ({ settings, interfaceHandle }) => { + const handle = useWidgetSignalHandle(interfaceHandle, settings.valueId); return (
      diff --git a/src/remotePlugin/widgets/GraphWidget.tsx b/src/remotePlugin/widgets/GraphWidget.tsx index 338771f..f72a286 100644 --- a/src/remotePlugin/widgets/GraphWidget.tsx +++ b/src/remotePlugin/widgets/GraphWidget.tsx @@ -14,8 +14,8 @@ const HISTORY_LENGTH = 3 * 60; const HEIGHT = 100; const MIN_HEIGHT = 1.0; const SAMPLE_RATE = 60; -export const GraphWidget: FunctionComponent> = ({ settings, interfaceId }) => { - const handle = useWidgetValueHandle(settings.valueId, interfaceId, "number"); +export const GraphWidget: FunctionComponent> = ({ settings, interfaceHandle }) => { + const handle = useWidgetValueHandle(interfaceHandle, settings.valueId, "number"); const [preview, setPreview] = useState({ index: 0, history: new Array(HISTORY_LENGTH).fill(0) }); diff --git a/src/remotePlugin/widgets/SliderWidget.tsx b/src/remotePlugin/widgets/SliderWidget.tsx index 5186ea6..386ee98 100644 --- a/src/remotePlugin/widgets/SliderWidget.tsx +++ b/src/remotePlugin/widgets/SliderWidget.tsx @@ -8,8 +8,8 @@ type SliderWidgetSettings = { valueId: string; }; -export const SliderWidget: FunctionComponent> = ({ settings, interfaceId }) => { - const handle = useWidgetValueHandle(settings.valueId, interfaceId, "number"); +export const SliderWidget: FunctionComponent> = ({ settings, interfaceHandle }) => { + const handle = useWidgetValueHandle(interfaceHandle, settings.valueId, "number"); const [interactiveValue, setInteractiveValue] = useState(handle.value ?? 0.0); const [focused, setFocused] = useState(false); diff --git a/src/remotePlugin/widgets/SwitchWidget.tsx b/src/remotePlugin/widgets/SwitchWidget.tsx index 64cccc6..2cdd5eb 100644 --- a/src/remotePlugin/widgets/SwitchWidget.tsx +++ b/src/remotePlugin/widgets/SwitchWidget.tsx @@ -8,8 +8,8 @@ type SwitchWidgetSettings = { valueId: string; }; -export const SwitchWidget: FunctionComponent> = ({ settings, interfaceId }) => { - const handle = useWidgetValueHandle(settings.valueId, interfaceId, "boolean"); +export const SwitchWidget: FunctionComponent> = ({ settings, interfaceHandle }) => { + const handle = useWidgetValueHandle(interfaceHandle, settings.valueId, "boolean"); const [interactiveValue, setInteractiveValue] = useState(handle.value ?? false); const [focused, setFocused] = useState(false); diff --git a/src/utils/notNull.ts b/src/utils/notNull.ts new file mode 100644 index 0000000..e1eeae0 --- /dev/null +++ b/src/utils/notNull.ts @@ -0,0 +1,3 @@ +export function notNull(t: T | null): t is T { + return t !== null; +} From ae1850f821acfd5d145bfcffc72fd7f244b8a185 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Mon, 7 Aug 2023 10:37:20 +0200 Subject: [PATCH 055/109] fix rerender bug in interfacelist --- src/remotePlugin/interface/InterfaceList.tsx | 145 ++++++++++--------- 1 file changed, 76 insertions(+), 69 deletions(-) diff --git a/src/remotePlugin/interface/InterfaceList.tsx b/src/remotePlugin/interface/InterfaceList.tsx index 8ae6a52..b86c316 100644 --- a/src/remotePlugin/interface/InterfaceList.tsx +++ b/src/remotePlugin/interface/InterfaceList.tsx @@ -1,4 +1,4 @@ -import { FunctionComponent, useState } from "react"; +import { FunctionComponent, useMemo, useState } from "react"; import { InterfaceDef, useInterfaceFileStore } from "./interfaceStores"; import { InterfaceEditor } from "./InterfaceEditor"; import { Button } from "../../components/input/Button"; @@ -80,11 +80,19 @@ export type InterfaceHandle = { type InterfaceListProps = {}; export const InterfaceList: FunctionComponent = () => { - const localInterfaces = useInterfaceFileStore((s) => - Object.values(s.interfaces).map( + const localInterfaces = useInterfaceFileStore( + (s) => + Object.values(s.interfaces).map((it) => ({ + interfaceDef: it, + })), + _.isEqual + ); + + const localInterfaceHandles = useMemo(() => { + return localInterfaces.map( (it) => ({ - interfaceDef: it, + interfaceDef: it.interfaceDef, brokerType: "local", valueStoreHandle: { getState: () => useIOValueStore.getState(), @@ -100,81 +108,80 @@ export const InterfaceList: FunctionComponent = () => { usePublishStateStore.getState().state.emitSignal(valueId, data); }, } satisfies InterfaceHandle) - ) + ); + }, [localInterfaces]); + + const remoteInterfaces = useRemoteStateStore( + (s) => + Object.values(s.remotes) + .flatMap((remote) => { + if (remote.state.state === "connected") { + return Object.values(remote.state.interfaces).map((it) => ({ + interfaceDef: it, + remoteId: remote.definition.remoteConnectionId, + })); + } else { + return null; + } + }) + .filter(notNull), + _.isEqual ); - const remoteInterfaces = useRemoteStateStore((s) => - Object.values(s.remotes) - .flatMap((remote) => { - if (remote.state.state === "connected") { - return Object.values(remote.state.interfaces).map( - (it) => - ({ - interfaceDef: it, - brokerType: "remote", - valueStoreHandle: { - getState: () => useRemoteStateStore.getState(), - subscribe: (listener) => useRemoteStateStore.subscribe(listener), - selectData: (store) => { - const r = store.remotes[remote.definition.remoteConnectionId]; - if (r.state.state === "connected") { - return r.state.values; - } else { - return null; - } - }, - }, - updateValue: (valueId, value) => { - // console.log("Remote Update Value: ", valueId, value); - const r = useRemoteStateStore.getState().remotes[remote.definition.remoteConnectionId]; - if (r.state.state === "connected") { - sendMessage(r.state.socket, { - ValueChanged: { - endpoint: valueId, - value: value, - }, - }); - } + + const remoteInterfaceHandles = useMemo(() => { + return remoteInterfaces.map( + (it) => + ({ + interfaceDef: it.interfaceDef, + brokerType: "remote", + valueStoreHandle: { + getState: () => useRemoteStateStore.getState(), + subscribe: (listener) => useRemoteStateStore.subscribe(listener), + selectData: (store) => { + const r = store.remotes[it.remoteId]; + if (r.state.state === "connected") { + return r.state.values; + } else { + return null; + } + }, + }, + updateValue: (valueId, value) => { + // console.log("Remote Update Value: ", valueId, value); + const r = useRemoteStateStore.getState().remotes[it.remoteId]; + if (r.state.state === "connected") { + sendMessage(r.state.socket, { + ValueChanged: { + endpoint: valueId, + value: value, }, - emitSignal: (valueId, data) => { - console.log("Remote Emit Signal: ", valueId, data); - const r = useRemoteStateStore.getState().remotes[remote.definition.remoteConnectionId]; - if (r.state.state === "connected") { - sendMessage(r.state.socket, { - EmitSignal: { - endpoint: valueId, - value: data ?? null, - }, - }); - } + }); + } + }, + emitSignal: (valueId, data) => { + console.log("Remote Emit Signal: ", valueId, data); + const r = useRemoteStateStore.getState().remotes[it.remoteId]; + if (r.state.state === "connected") { + sendMessage(r.state.socket, { + EmitSignal: { + endpoint: valueId, + value: data ?? null, }, - } satisfies InterfaceHandle) - ); - } else { - return null; - } - }) - .filter(notNull) - ); - - // const interfaces = useInterfaceDisplayStateStore( - // (s) => - // Object.entries(s.interfaces).map(([interfaceId, iface]) => ({ - // interfaceId, - // brokerType: iface.brokerType, - // })), - // _.isEqual - // ); - - // console.log(interfaces); + }); + } + }, + } satisfies InterfaceHandle) + ); + }, [remoteInterfaces]); return (
        - {localInterfaces.map((handle) => ( + {localInterfaceHandles.map((handle) => (
      • ))} - {remoteInterfaces.map((handle) => ( + {remoteInterfaceHandles.map((handle) => (
      • From 969bd2ed49a1823c93df45fb0ca0c828353487bb Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Mon, 7 Aug 2023 11:28:03 +0200 Subject: [PATCH 056/109] implement useWidgetSignalHandle --- src/nodes/DelayNode.tsx | 127 ++++++++++++++++++ src/nodes/DelayNode.tsx.off | 94 ------------- src/registries.ts | 3 +- src/remotePlugin/interface/interfaceStores.ts | 54 ++++---- 4 files changed, 160 insertions(+), 118 deletions(-) create mode 100644 src/nodes/DelayNode.tsx delete mode 100644 src/nodes/DelayNode.tsx.off diff --git a/src/nodes/DelayNode.tsx b/src/nodes/DelayNode.tsx new file mode 100644 index 0000000..6577a6d --- /dev/null +++ b/src/nodes/DelayNode.tsx @@ -0,0 +1,127 @@ +import { FunctionComponent } from "react"; +import { NodeDef, NodeHeaderProps, nodeDef } from "../engine/node"; +import { categories } from "./category"; +import { gaussianRandom } from "./TimerNode"; +import { emitImpulse } from "../engine/signal"; +import { usePreviewStore } from "../engine/preview"; + +const DelayNode: FunctionComponent> = ({ id }) => { + // const progress = useCommittedData(id, "progress") || 0.0; + const progress = usePreviewStore((s) => s.outputHandlePreviews[id]?.["progress"]); + + return ( +
        +
        +
        + ); +}; + +export const delayNodeDef = nodeDef()({ + label: "Delay", + category: categories["control"], + type: "delay", + header: DelayNode, + outputs: { + signal: { + id: "signal", + label: "Elapsed", + type: "impulse", + }, + progress: { + id: "progress", + label: "Progress", + type: "number", + }, + running: { + id: "running", + label: "Running", + type: "boolean", + }, + }, + inputs: { + delayTime: { + id: "delayTime", + label: "Delay", + type: "number", + default: 1.0, + }, + delayTimeDeviation: { + id: "delayTimeDeviation", + label: "Delay Dev", + type: "number", + default: 0.0, + min: 0.0, + max: 1.0, + }, + signal: { + id: "signal", + label: "Signal", + type: "impulse", + default: false, + }, + }, + executor: { + initialPersistence: { + delay: null as null | { start: number; end: number }, + }, + executor: ({ delayTime, delayTimeDeviation, signal }, persistent) => { + const time = new Date().getTime(); + + let delay = persistent.delay; + + if (signal.length > 0) { + const dev = gaussianRandom(0, delayTimeDeviation * delayTime); + + delay = { + end: time + (delayTime + dev) * 1000, + start: time, + }; + } + + let progress = 0; + let running = false; + if (delay != null) { + if (time > delay.end) { + return { + outputs: { + progress: 1.0, + running: true, + signal: emitImpulse(1), + }, + persistentData: { + delay: null, + }, + driverOutputs: {}, + }; + } else { + const elapsed = time - delay.start; + progress = elapsed / (delay.end - delay.start); + running = true; + return { + outputs: { + progress, + running, + signal: emitImpulse(0), + }, + persistentData: { + delay, + }, + driverOutputs: {}, + }; + } + } else { + return { + outputs: { + progress: 0.0, + running: false, + signal: emitImpulse(0), + }, + persistentData: { + delay, + }, + driverOutputs: {}, + }; + } + }, + }, +}); diff --git a/src/nodes/DelayNode.tsx.off b/src/nodes/DelayNode.tsx.off deleted file mode 100644 index a8cde77..0000000 --- a/src/nodes/DelayNode.tsx.off +++ /dev/null @@ -1,94 +0,0 @@ -import { FunctionComponent } from "react"; -import { NodeDef, NodeHeaderProps } from "../engine/node"; -import { useCommittedData } from "../engine/store"; -import { categories } from "./category"; -import { gaussianRandom } from "./TimerNode"; - -const DelayNode: FunctionComponent = ({ id }) => { - const progress = useCommittedData(id, "progress") || 0.0; - - return ( -
        -
        -
        - ); -}; - -export const delayNodeDef: NodeDef = { - label: "Delay", - category: categories["control"], - type: "delay", - header: DelayNode, - outputs: [ - { - id: "signal", - label: "Signal", - type: "impulse", - }, - { - id: "progress", - label: "Progress", - type: "number", - }, - { - id: "running", - label: "Running", - type: "boolean", - }, - ], - inputs: [ - { - id: "delayTime", - label: "Delay", - type: "number", - default: 1.0, - }, - { - id: "delayTimeDeviation", - label: "Delay Dev", - type: "number", - default: 0.0, - min: 0.0, - max: 1.0, - }, - { - id: "signal", - label: "Signal", - type: "impulse", - default: false, - }, - ], - executor: ([delayTime, delayTimeDev, signal], { commit, committed }) => { - const time = new Date().getTime(); - - const delayEnd = committed["delayEnd"] || null; - const delayStart = committed["delayStart"] || null; - - if (signal) { - //Toggle - const dev = gaussianRandom(0, delayTimeDev * delayTime); - commit("delayEnd", time + (delayTime + dev) * 1000); - commit("delayStart", time); - } - - let progress = 0; - let running = delayEnd !== null && delayStart !== null; - if (running) { - const elapsed = time - delayStart; - progress = elapsed / (delayEnd - delayStart); - running = true; - } - commit("progress", progress); - - if (delayEnd !== null && time > delayEnd) { - commit("delayEnd", null); - commit("delayStart", null); - return [true, progress, running]; - } else { - return [false, progress, running]; - } - }, -}; diff --git a/src/registries.ts b/src/registries.ts index c16fe6d..40f9ce0 100644 --- a/src/registries.ts +++ b/src/registries.ts @@ -21,6 +21,7 @@ import { Tab, fileTab as fileTabDef } from "./components/Settings"; import { remoteSettingsTab as remoteSettingsTabDef } from "./remotePlugin/RemoteDrawerPage"; import { switchNodeDef } from "./nodes/SwitchNode"; import { positiveWaveNodeDef } from "./nodes/WaveNode"; +import { delayNodeDef } from "./nodes/DelayNode"; const nodeDefList: AnyNodeDef[] = [ // displayNodeDef, @@ -45,7 +46,7 @@ const nodeDefList: AnyNodeDef[] = [ positiveWaveNodeDef as any, // clampNodeDef, // curveNodeDef, - // delayNodeDef, + delayNodeDef as any, // commentNodeDef, // sensorNodeDef, // mediaFurryNodeDef, diff --git a/src/remotePlugin/interface/interfaceStores.ts b/src/remotePlugin/interface/interfaceStores.ts index 085fc16..ec30a5c 100644 --- a/src/remotePlugin/interface/interfaceStores.ts +++ b/src/remotePlugin/interface/interfaceStores.ts @@ -163,30 +163,38 @@ type WidgetSignalHandle = export function useWidgetSignalHandle(interfaceHandle: InterfaceHandle, valueId: string): WidgetSignalHandle { // const iface = useInterfaceDisplayStateStore((s) => s.interfaces[interfaceId]); - // const ifaceEmitSignal = iface.emitSignal; - // const emitSignal = useCallback( - // (v: T) => { - // ifaceEmitSignal(valueId, v); - // }, - // [valueId, ifaceEmitSignal] - // ); + const ifaceEmitSignal = interfaceHandle.emitSignal; + const emitSignal = useCallback( + (v: T) => { + ifaceEmitSignal(valueId, v); + }, + [valueId, ifaceEmitSignal] + ); - // if (iface === undefined) { - return { - emitSignal: () => NULL_SET_VALUE, - error: `Invalid Interface ${interfaceHandle.interfaceDef.interfaceId}`, - }; - // } + const values = useDynamicStore(interfaceHandle.valueStoreHandle, (s) => s); + if (values === null) { + return { + emitSignal: () => NULL_SET_VALUE, + error: `Invalid store for interface ${interfaceHandle.interfaceDef.interfaceId}`, + }; + } + if (values[valueId] === undefined) { + return { + emitSignal: () => NULL_SET_VALUE, + error: `Value ${valueId} does not exist in Interface ${interfaceHandle.interfaceDef.interfaceId}`, + }; + } - // if (iface.values[valueId] === undefined) { - // return { - // emitSignal: () => NULL_SET_VALUE, - // error: `Value ${valueId} does not exist in Interface ${interfaceId}`, - // }; - // } + const value = values[valueId]; + if (value.type !== "impulse") { + return { + emitSignal: () => NULL_SET_VALUE, + error: `Value ${valueId} in Interface ${interfaceHandle.interfaceDef.interfaceId} has wrong type: ${value.type} ('impulse' was expected)`, + }; + } - // return { - // emitSignal, - // error: undefined, - // }; + return { + emitSignal, + error: undefined, + }; } From 0932dd6bdf4af93e131fa6d52ee36a31018535e6 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Mon, 7 Aug 2023 11:58:11 +0200 Subject: [PATCH 057/109] Node name editing --- src/components/node/EditableNodeTitle.tsx | 35 ++++++++++++ src/components/node/NodeRenderer.tsx | 23 +++++++- src/components/node/NodeShell.tsx | 7 +-- src/remotePlugin/interface/interfaceStores.ts | 5 +- src/remotePlugin/widgets/SliderWidget.tsx | 53 ++++++++++--------- src/remotePlugin/widgets/SwitchWidget.tsx | 13 +++-- 6 files changed, 100 insertions(+), 36 deletions(-) create mode 100644 src/components/node/EditableNodeTitle.tsx diff --git a/src/components/node/EditableNodeTitle.tsx b/src/components/node/EditableNodeTitle.tsx new file mode 100644 index 0000000..42a3f81 --- /dev/null +++ b/src/components/node/EditableNodeTitle.tsx @@ -0,0 +1,35 @@ +import { FunctionComponent, useState } from "react"; +import { MdDriveFileRenameOutline } from "react-icons/md"; + +type EditableNodeTitleProps = { + title: string | undefined; + emptyLabel: string; + onChange: (s: string) => void; +}; +export const EditableNodeTitle: FunctionComponent = ({ title, emptyLabel, onChange }) => { + const [edit, setEdit] = useState(false); + return ( +

        setEdit(true)} + onBlur={() => setEdit(false)} + onMouseDownCapture={(e) => edit && e.stopPropagation()} + > + {edit ? ( + onChange(e.target.value)} + value={title} + autoFocus={true} + placeholder="Node Name" + /> + ) : ( +
        + {title ?? emptyLabel} + +
        + )} +

        + ); +}; diff --git a/src/components/node/NodeRenderer.tsx b/src/components/node/NodeRenderer.tsx index 115eb29..500d6ba 100644 --- a/src/components/node/NodeRenderer.tsx +++ b/src/components/node/NodeRenderer.tsx @@ -5,8 +5,9 @@ import NodeHandleLine from "./NodeHandleLine"; import NodeShell from "./NodeShell"; import { AnyNodeDef, InputHandleDef, NodeDef, getNodeInputs, getNodeOutputs } from "../../engine/node"; import { NODE_HANDLE_INPUT_TYPES } from "./nodeInputs"; -import { UnknownBeadiNodeData } from "../../engine/store"; +import { UnknownBeadiNodeData, useFileStore } from "../../engine/store"; import { useModelState } from "../../engine/compiler"; +import { EditableNodeTitle } from "./EditableNodeTitle"; export type HandleInputProps = { input: InputHandleDef; handleId: string; @@ -45,8 +46,26 @@ export function makeNodeRenderer(def: AnyNodeDef): ComponentType s.updateNode); + const setNodeName = (s: string) => { + let name = s.trim(); + if (name.length === 0) { + updateNode(id, (n) => { + n.data.name = undefined; + }); + } else { + updateNode(id, (n) => { + n.data.name = s; + }); + } + }; + return ( - + } + color={def.category.color} + errors={errors} + > {HeaderComponent && } {inputs.map(([inputId, input], index) => ( = ({ children, title, style, color, headerIcons, errors }) => { return (
        -
        -

        {title}

        +
        + {/*

        {title}

        */} + {title}
        {headerIcons}
        diff --git a/src/remotePlugin/interface/interfaceStores.ts b/src/remotePlugin/interface/interfaceStores.ts index ec30a5c..8b55346 100644 --- a/src/remotePlugin/interface/interfaceStores.ts +++ b/src/remotePlugin/interface/interfaceStores.ts @@ -6,6 +6,7 @@ import { useCallback } from "react"; import { HandleType, TypeOfHandleType } from "../../engine/node"; import { useDynamicStore } from "../../hooks/useDynamicStore"; import { InterfaceHandle } from "./InterfaceList"; +import { IOValueState } from "../inputOutputStore"; export type Widget = { widgetId: string; @@ -75,7 +76,7 @@ const NULL_GET_VALUE = () => { }; type WidgetValueHandle = | { - value: T; + value: IOValueState; setValue: (n: T) => void; getValue: () => T; error: undefined; @@ -144,7 +145,7 @@ export function useWidgetValueHandle( } return { - value: value.value, + value: value, getValue, setValue, error: undefined, diff --git a/src/remotePlugin/widgets/SliderWidget.tsx b/src/remotePlugin/widgets/SliderWidget.tsx index 386ee98..19ba5d8 100644 --- a/src/remotePlugin/widgets/SliderWidget.tsx +++ b/src/remotePlugin/widgets/SliderWidget.tsx @@ -10,7 +10,7 @@ type SliderWidgetSettings = { export const SliderWidget: FunctionComponent> = ({ settings, interfaceHandle }) => { const handle = useWidgetValueHandle(interfaceHandle, settings.valueId, "number"); - const [interactiveValue, setInteractiveValue] = useState(handle.value ?? 0.0); + const [interactiveValue, setInteractiveValue] = useState(handle.value?.value ?? 0.0); const [focused, setFocused] = useState(false); const setValue = (e: number) => { @@ -18,33 +18,36 @@ export const SliderWidget: FunctionComponent - { - setFocused(true); - setInteractiveValue(handle.value ?? 0.0); - }} - onBlur={() => setFocused(false)} - onChange={(e) => setValue(parseFloat(e.target.value))} - /> - +
        {handle.value?.name}
        +
        + { + setFocused(true); + setInteractiveValue(handle.value?.value ?? 0.0); + }} + onBlur={() => setFocused(false)} + onChange={(e) => setValue(parseFloat(e.target.value))} + /> + +
        {handle.error !== undefined &&
        {handle.error}
        }
        ); diff --git a/src/remotePlugin/widgets/SwitchWidget.tsx b/src/remotePlugin/widgets/SwitchWidget.tsx index 2cdd5eb..4e8d7bb 100644 --- a/src/remotePlugin/widgets/SwitchWidget.tsx +++ b/src/remotePlugin/widgets/SwitchWidget.tsx @@ -10,7 +10,7 @@ type SwitchWidgetSettings = { export const SwitchWidget: FunctionComponent> = ({ settings, interfaceHandle }) => { const handle = useWidgetValueHandle(interfaceHandle, settings.valueId, "boolean"); - const [interactiveValue, setInteractiveValue] = useState(handle.value ?? false); + const [interactiveValue, setInteractiveValue] = useState(handle.value?.value ?? false); const [focused, setFocused] = useState(false); const setValue = (e: boolean) => { @@ -18,7 +18,7 @@ export const SwitchWidget: FunctionComponent @@ -28,12 +28,17 @@ export const SwitchWidget: FunctionComponent { setFocused(true); - setInteractiveValue(handle.value ?? false); + setInteractiveValue(handle.value?.value ?? false); }} onBlur={() => setFocused(false)} onChange={(e) => setValue(e.target.checked)} /> - + {handle.error !== undefined &&
        {handle.error}
        }
        ); From 8712eb6db8cbb1f5b42b3ccd759dc9024f137c63 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Mon, 7 Aug 2023 15:21:51 +0200 Subject: [PATCH 058/109] cleanups and fixes --- src/components/input/Select.tsx | 13 +- src/components/node/EditableNodeTitle.tsx | 2 +- src/components/settings/FileSettings.tsx | 1 - src/engine/store.ts | 2 - src/engine/store.ts.off | 257 ---------------------- src/nodes/InputAdapterNode.tsx | 2 +- src/nodes/OutputAdapterNode.tsx | 2 +- src/remotePlugin/inputOutputStore.ts | 3 - 8 files changed, 13 insertions(+), 269 deletions(-) delete mode 100644 src/engine/store.ts.off diff --git a/src/components/input/Select.tsx b/src/components/input/Select.tsx index cd2f7f8..0c8d9ce 100644 --- a/src/components/input/Select.tsx +++ b/src/components/input/Select.tsx @@ -1,6 +1,8 @@ import _ from "lodash"; import { ChangeEventHandler, ReactNode, useCallback, useMemo } from "react"; +const NULL_TEXT = "unselect"; + type SelectProps = { options: T[]; selected: T | null; @@ -9,6 +11,7 @@ type SelectProps = { onSelect?: (value: T | null) => void; }; export function Select({ options, selected, onSelect, renderOption, allowUnselect }: SelectProps) { + console.log("Select: ", options, selected); const optionMap = useMemo(() => { return _.chain(options) .map((it, index) => [index, it]) @@ -18,7 +21,11 @@ export function Select({ options, selected, onSelect, renderOption, allowUnse const onChange: ChangeEventHandler = useCallback( (e) => { - onSelect?.(optionMap[e.target.value]); + if (e.target.value === NULL_TEXT) { + onSelect?.(null); + } else { + onSelect?.(optionMap[e.target.value]); + } }, [onSelect, optionMap] ); @@ -40,8 +47,8 @@ export function Select({ options, selected, onSelect, renderOption, allowUnse }, [optionMap, selected]); return ( - + {(isSelected(null) || allowUnselect === true) && } {Object.entries(optionMap).map(([key, value]) => (
      diff --git a/src/components/node/NodeHandle.tsx b/src/components/node/NodeHandle.tsx index 16dd6dd..a5376d4 100644 --- a/src/components/node/NodeHandle.tsx +++ b/src/components/node/NodeHandle.tsx @@ -2,41 +2,29 @@ import { FunctionComponent } from "react"; const ImpulseHandle: FunctionComponent<{}> = () => { return ( - + ); }; const NumberHandle: FunctionComponent<{}> = () => { - return ( -
      - ); + return
      ; }; const BooleanHandle: FunctionComponent<{}> = () => { - return ( -
      - ); + return
      ; }; +const classNames: Record> = { + impulse: ImpulseHandle, + number: NumberHandle, + boolean: BooleanHandle, +}; type NodeHandleDisplayProps = { type: string; }; -export const NodeHandleDisplay: FunctionComponent = ({ - type, -}) => { - const classNames: Record> = { - impulse: ImpulseHandle, - number: NumberHandle, - boolean: BooleanHandle, - }; - +export const NodeHandleDisplay: FunctionComponent = ({ type }) => { const HandleDisplay = classNames[type] || NumberHandle; return ; diff --git a/src/components/node/nodeInputs.tsx b/src/components/node/nodeInputs.tsx index 4ff13d6..1695e7a 100644 --- a/src/components/node/nodeInputs.tsx +++ b/src/components/node/nodeInputs.tsx @@ -3,6 +3,9 @@ import { useInputHandleData } from "../../engine/store"; import NumberInput from "../input/NumberInput"; import { TextInput } from "../input/TextInput"; import { HandleInputProps } from "./NodeRenderer"; +import { Button } from "../input/Button"; +import { useSignalBus } from "../../engine/signal"; +import { Checkbox } from "../input/Checkbox"; const NumberHandleInput: FunctionComponent = ({ nodeId, handleId, input }) => { const [value, setValue] = useInputHandleData(nodeId, handleId); @@ -28,7 +31,30 @@ const StringHandleInput: FunctionComponent = ({ handleId, node ); }; +const BooleanHandleInput: FunctionComponent = ({ handleId, nodeId, input }) => { + //TODO GUI STUB + const [value, setValue] = useInputHandleData(nodeId, handleId); + + return ( +
      e.stopPropagation()}> + setValue(c)} label={input.label}> +
      + ); +}; + +const ImpulseHandleInput: FunctionComponent = ({ handleId, nodeId, input }) => { + const emit = useSignalBus((s) => s.emit); + + return ( +
      e.stopPropagation()}> + +
      + ); +}; + export const NODE_HANDLE_INPUT_TYPES: Record> = { number: NumberHandleInput, string: StringHandleInput, + boolean: BooleanHandleInput, + impulse: ImpulseHandleInput, }; diff --git a/src/engine/runner.ts b/src/engine/runner.ts index 2ce09fc..a236c3d 100644 --- a/src/engine/runner.ts +++ b/src/engine/runner.ts @@ -62,7 +62,8 @@ function runEngineLoop(model: Model) { if (dependency !== null) { return signals[dependency.nodeId]?.[dependency.handleId] || []; } else { - return []; + //There can be signals fired directly to handle inputs (e.g through the ImpulseHandleInput) + return signals[step.nodeId]?.[handleId] || []; } } else { if (dependency !== null) { diff --git a/src/remotePlugin/inputAdapter.tsx b/src/remotePlugin/inputAdapter.tsx index e37b3e1..5edd22e 100644 --- a/src/remotePlugin/inputAdapter.tsx +++ b/src/remotePlugin/inputAdapter.tsx @@ -54,7 +54,7 @@ export const remoteInputAdapter: InputAdapterDef, R const safeValue = asHandleType(settings.type, value); return safeValue ?? 0.0; }, - label: "Remote", + label: "Remote Control", settingsEditor: RemoteInputSettingsEditor, }; diff --git a/src/remotePlugin/outputAdapter.tsx b/src/remotePlugin/outputAdapter.tsx index 12786b4..98bf426 100644 --- a/src/remotePlugin/outputAdapter.tsx +++ b/src/remotePlugin/outputAdapter.tsx @@ -51,7 +51,7 @@ export const remoteOutputAdapter: OutputAdapterDef Date: Mon, 7 Aug 2023 18:41:12 +0200 Subject: [PATCH 062/109] Blenderlike Math Node --- src/components/input/NumberInput.tsx | 33 ++-- src/components/input/Select.tsx | 2 +- src/components/settings/FileSettings.tsx | 1 - src/components/settings/Litterbox.tsx | 2 - src/index.tsx | 2 - src/nodes/MathNode.tsx | 183 +++++++++++++++++++++++ src/registries.ts | 6 +- 7 files changed, 197 insertions(+), 32 deletions(-) create mode 100644 src/nodes/MathNode.tsx diff --git a/src/components/input/NumberInput.tsx b/src/components/input/NumberInput.tsx index bbb7dd3..8724273 100644 --- a/src/components/input/NumberInput.tsx +++ b/src/components/input/NumberInput.tsx @@ -35,23 +35,12 @@ const NumberInput: FunctionComponent = ({ id, name, onChange, const [textEdit, setTextEdit] = useState(false); const setValue = useCallback( - (v: number | ((v: number) => number)) => { - if (typeof v === "function") { - setValueState((s) => { - const nextVal = v(s); - onChange?.({ - intermediate: true, - value: nextVal, - }); - return nextVal; - }); - } else { - setValueState(v); - onChange?.({ - intermediate: true, - value: v, - }); - } + (v: number) => { + setValueState(v); + onChange?.({ + intermediate: true, + value: v, + }); }, [onChange, setValueState] ); @@ -117,8 +106,8 @@ const NumberInput: FunctionComponent = ({ id, name, onChange, e.stopPropagation(); - setValue((old) => { - let num = old + e.movementX * multiplier; + { + let num = value + e.movementX * multiplier; if (min !== undefined) { num = Math.max(num, min); @@ -127,11 +116,11 @@ const NumberInput: FunctionComponent = ({ id, name, onChange, num = Math.min(num, max); } - return Number(num.toFixed(3)); - }); + setValue(Number(num.toFixed(3))); + } } }, - [setValue, sliding, textEdit, min, max] + [setValue, sliding, textEdit, value, min, max] ); const onBlur: FocusEventHandler = (e) => { diff --git a/src/components/input/Select.tsx b/src/components/input/Select.tsx index bf2bd3b..43919fb 100644 --- a/src/components/input/Select.tsx +++ b/src/components/input/Select.tsx @@ -4,7 +4,7 @@ import { ChangeEventHandler, ReactNode, useCallback, useMemo } from "react"; const NULL_TEXT = "unselect"; type SelectProps = { - options: T[]; + readonly options: readonly T[]; selected: T | null; allowUnselect?: boolean; renderOption: (value: T) => ReactNode; diff --git a/src/components/settings/FileSettings.tsx b/src/components/settings/FileSettings.tsx index a55ecf8..53e30f8 100644 --- a/src/components/settings/FileSettings.tsx +++ b/src/components/settings/FileSettings.tsx @@ -140,7 +140,6 @@ export const FileSettings: FunctionComponent<{}> = () => { const load = useCallback( async (name: string) => { const it = await loadFromDb(name); - console.log(it); importJson(it); setName(it.fileName); }, diff --git a/src/components/settings/Litterbox.tsx b/src/components/settings/Litterbox.tsx index ab24477..c7f91d3 100644 --- a/src/components/settings/Litterbox.tsx +++ b/src/components/settings/Litterbox.tsx @@ -27,7 +27,6 @@ export const UploadToLitterbox: FunctionComponent<{}> = () => { }) .then((r) => r.text()) .then((response) => { - console.log(response); setLink(response); setCode(response.replace(LITTERBOX_URL, "")); }); @@ -56,7 +55,6 @@ export const ImportFromLitterbox: FunctionComponent<{}> = () => { fetch(`${LITTERBOX_URL}${text}`) .then((result) => result.json()) .then((result) => { - console.log(result); overwriteStoreData(result); setText(""); //TODO VALIDATE THE RESULT diff --git a/src/index.tsx b/src/index.tsx index 340cac4..a742380 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -36,8 +36,6 @@ root.render( watchForChanges(); -useFileStore.subscribe((it) => console.log(it.data)); - // const bpscript = document.createElement("script"); // bpscript.src = // "https://cdn.jsdelivr.net/npm/buttplug@1.0.1/dist/web/buttplug.min.js"; diff --git a/src/nodes/MathNode.tsx b/src/nodes/MathNode.tsx new file mode 100644 index 0000000..ad7e150 --- /dev/null +++ b/src/nodes/MathNode.tsx @@ -0,0 +1,183 @@ +import { FunctionComponent } from "react"; +import { InputHandleDef, InputHandleDefs, InputTypesOf, NodeDef, NodeHeaderProps, nodeDef } from "../engine/node"; +import { categories } from "./category"; +import { useFileStore } from "../engine/store"; +import { Select } from "../components/input/Select"; + +const operations = [ + "add", + "multiply", + "divide", + "subtract", + "multiplyAdd", + "power", + "logarithm", + "squareRoot", + "invSquareRoot", + "absolute", + "exponent", + "min", + "max", + "smoothMin", + "smoothMax", + "sign", +] as const; +type Operator = (typeof operations)[number]; + +type MathNodeSettings = { + operation: Operator; +}; + +export const MathNodeHeader: FunctionComponent> = ({ id, data }) => { + const updateNode = useFileStore((s) => s.updateNode); + + const setOperation = (s: Operator | null) => { + if (s !== null) { + updateNode(id, (r) => { + (r.data.settings as MathNodeSettings).operation = s; + }); + } + }; + + return ( +
      + +
      + ); +}; + +function oneCompMath( + label: string, + execute: (i: { a: number }) => number, + inputLabels: [string] = ["Value"] +): MathNodeFuncDef<{ a: InputHandleDef; b: InputHandleDef }> { + return { + execute: execute as any, + label: label, + inputs: { + a: { + label: inputLabels[0], + type: "number", + default: 0.0, + }, + }, + }; +} +function twoCompMath( + label: string, + execute: (i: { a: number; b: number }) => number, + inputLabels: [string, string] = ["Value a", "Value b"] +): MathNodeFuncDef<{ a: InputHandleDef; b: InputHandleDef }> { + return { + execute: execute as any, + label: label, + inputs: { + a: { + label: inputLabels[0], + type: "number", + default: 0.0, + }, + b: { + label: inputLabels[1], + type: "number", + default: 0.0, + }, + }, + }; +} +function threeCompMath( + label: string, + execute: (i: { a: number; b: number; c: number }) => number, + inputLabels: [string, string, string] +): MathNodeFuncDef<{ a: InputHandleDef; b: InputHandleDef; c: InputHandleDef }> { + return { + execute: execute as any, + label: label, + inputs: { + a: { + label: inputLabels[0], + type: "number", + default: 0.0, + }, + b: { + label: inputLabels[1], + type: "number", + default: 0.0, + }, + c: { + label: inputLabels[2], + type: "number", + default: 0.0, + }, + }, + }; +} + +function smoothMin(a: number, b: number, c: number): number { + if (Math.abs(c) < 0.000001) { + return Math.min(a, b); + } else { + const h = Math.max(c - Math.abs(a - b), 0.0) / c; + return Math.min(a, b) - h * h * h * c * (1 / 6); + } +} + +type MathNodeFuncDef = { + execute: (inputs: Record) => number; + label: string; + inputs: InputHandleDefs; +}; +const funcs: Record> = { + add: twoCompMath("Add", ({ a, b }) => a + b), + multiply: twoCompMath("Multiply", ({ a, b }) => a + b), + subtract: twoCompMath("Subtract", ({ a, b }) => a + b), + divide: twoCompMath("Divide", ({ a, b }) => a + b), + + multiplyAdd: threeCompMath("Multiply Add", ({ a, b, c }) => a * b + c, ["Value", "Multiplier", "Addend"]), + power: twoCompMath("Power", ({ a, b }) => Math.pow(a, b), ["Base", "Exponent"]), + logarithm: twoCompMath("Logarithm", ({ a, b }) => Math.log(a) / Math.log(b), ["Value", "Base"]), + squareRoot: oneCompMath("Square Root", ({ a }) => Math.sqrt(a)), + invSquareRoot: oneCompMath("Inverse Square Root", ({ a }) => 1.0 / Math.sqrt(a)), + absolute: oneCompMath("Absolute", ({ a }) => Math.abs(a)), + exponent: oneCompMath("Exp", ({ a }) => Math.exp(a)), + min: twoCompMath("Minimum", ({ a, b }) => Math.min(a, b)), + max: twoCompMath("Maximum", ({ a, b }) => Math.max(a, b)), + smoothMin: threeCompMath("Smooth Minimum", ({ a, b, c }) => smoothMin(a, b, c), ["Value", "Value", "Distance"]), + smoothMax: threeCompMath("Smooth Maximum", ({ a, b, c }) => -smoothMin(-a, -b, c), ["Value", "Value", "Distance"]), + sign: oneCompMath("Sign", ({ a }) => Math.sign(a)), +} as const; + +export const mathNodeDef = nodeDef()({ + label: "Math", + category: categories["math"], + type: "math", + // component: makeNodeRenderer, + outputs: { + result: { + label: "Result", + type: "number", + }, + }, + inputs: (settings: MathNodeSettings) => funcs[settings?.operation ?? "add"].inputs, + executor: { + initialPersistence: undefined, + inputDriver: (context) => { + return { + operation: context.settings.operation ?? "add", + }; + }, + executor: (inputs, _a, { operation }) => { + return { + outputs: { result: funcs[operation].execute(inputs) }, + driverOutputs: {}, + persistentData: undefined, + }; + }, + }, + header: MathNodeHeader, +}); diff --git a/src/registries.ts b/src/registries.ts index 725bf4e..f7d37c8 100644 --- a/src/registries.ts +++ b/src/registries.ts @@ -22,15 +22,13 @@ import { remoteSettingsTab as remoteSettingsTabDef } from "./remotePlugin/Remote import { switchNodeDef } from "./nodes/SwitchNode"; import { positiveWaveNodeDef } from "./nodes/WaveNode"; import { delayNodeDef } from "./nodes/DelayNode"; +import { mathNodeDef } from "./nodes/MathNode"; const nodeDefList: AnyNodeDef[] = [ // displayNodeDef, // constantValueNodeDef, // positiveWaveNodeDef, - addNodeDef, - subtractNodeDef, - divideNodeDef, - multiplyNodeDef, + mathNodeDef as any, // buttplugNodeDef, // mixNodeDef, // hysteresisNodeDef, From a94abcac4c69d6f68f637f640fe0bb3c37987fdf Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Mon, 7 Aug 2023 18:44:05 +0200 Subject: [PATCH 063/109] Clamp to math node --- src/nodes/MathNode.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/nodes/MathNode.tsx b/src/nodes/MathNode.tsx index ad7e150..0fd049e 100644 --- a/src/nodes/MathNode.tsx +++ b/src/nodes/MathNode.tsx @@ -18,6 +18,7 @@ const operations = [ "exponent", "min", "max", + "clamp", "smoothMin", "smoothMax", "sign", @@ -147,6 +148,7 @@ const funcs: Record> = { exponent: oneCompMath("Exp", ({ a }) => Math.exp(a)), min: twoCompMath("Minimum", ({ a, b }) => Math.min(a, b)), max: twoCompMath("Maximum", ({ a, b }) => Math.max(a, b)), + clamp: threeCompMath("Clamp", ({ a, b, c }) => Math.max(b, Math.min(c, a)), ["Value", "Minimum", "Maximum"]), smoothMin: threeCompMath("Smooth Minimum", ({ a, b, c }) => smoothMin(a, b, c), ["Value", "Value", "Distance"]), smoothMax: threeCompMath("Smooth Maximum", ({ a, b, c }) => -smoothMin(-a, -b, c), ["Value", "Value", "Distance"]), sign: oneCompMath("Sign", ({ a }) => Math.sign(a)), From e9b25eee1088bdb22799b44cdf00f6503a5c73c0 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Mon, 7 Aug 2023 18:46:28 +0200 Subject: [PATCH 064/109] ConstantValueNode --- src/nodes/ClampNode.tsx.off | 39 ----------------------------- src/nodes/ConstantValueNode.tsx | 36 ++++++++++++++++++++++++++ src/nodes/ConstantValueNode.tsx.off | 27 -------------------- 3 files changed, 36 insertions(+), 66 deletions(-) delete mode 100644 src/nodes/ClampNode.tsx.off create mode 100644 src/nodes/ConstantValueNode.tsx delete mode 100644 src/nodes/ConstantValueNode.tsx.off diff --git a/src/nodes/ClampNode.tsx.off b/src/nodes/ClampNode.tsx.off deleted file mode 100644 index 142f799..0000000 --- a/src/nodes/ClampNode.tsx.off +++ /dev/null @@ -1,39 +0,0 @@ -import { NodeDef } from "../engine/node"; -import { categories } from "./category"; - -export const clampNodeDef: NodeDef = { - label: "Clamp", - category: categories["math"], - type: "clamp", - // component: WaveNode, - outputs: [ - { - id: "value", - label: "Value", - type: "number", - }, - ], - inputs: [ - { - id: "max", - label: "Max", - type: "number", - default: 1.0, - }, - { - id: "min", - label: "Min", - type: "number", - default: 0.0, - }, - { - id: "value", - label: "Value", - type: "number", - default: 0.0, - }, - ], - executor: ([max, min, value]) => { - return [Math.min(max, Math.max(min, value))]; - }, -}; diff --git a/src/nodes/ConstantValueNode.tsx b/src/nodes/ConstantValueNode.tsx new file mode 100644 index 0000000..831d40c --- /dev/null +++ b/src/nodes/ConstantValueNode.tsx @@ -0,0 +1,36 @@ +import { nodeDef } from "../engine/node"; +import { categories } from "./category"; + +export const constantValueNodeDef = nodeDef()({ + label: "Value", + category: categories["generators"], + type: "constantValue", + // component: ConstantValueNode, + outputs: { + value: { + id: "value", + label: "Value", + type: "number", + }, + }, + inputs: { + value: { + id: "value", + label: "Value", + type: "number", + default: 0.0, + }, + }, + executor: { + initialPersistence: {}, + executor: ({ value }) => { + return { + driverOutputs: {}, + persistentData: {}, + outputs: { + value: value, + }, + }; + }, + }, +}); diff --git a/src/nodes/ConstantValueNode.tsx.off b/src/nodes/ConstantValueNode.tsx.off deleted file mode 100644 index f64a835..0000000 --- a/src/nodes/ConstantValueNode.tsx.off +++ /dev/null @@ -1,27 +0,0 @@ -import { NodeDef } from "../engine/node"; -import { categories } from "./category"; - -export const constantValueNodeDef: NodeDef = { - label: "Value", - category: categories["generators"], - type: "constantValue", - // component: ConstantValueNode, - outputs: [ - { - id: "value", - label: "Value", - type: "number", - }, - ], - inputs: [ - { - id: "value", - label: "Value", - type: "number", - default: 0.0, - }, - ], - executor: (i) => { - return i; - }, -}; From 285caecf6db20c3de950e6d7d1abae7eb4d7ad0f Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Mon, 7 Aug 2023 19:05:32 +0200 Subject: [PATCH 065/109] Curve Node --- src/nodes/AddNode.tsx | 60 ---------- src/nodes/CurveNode.tsx | 207 +++++++++++++++++++++++++++++++++ src/nodes/CurveNode.tsx.off | 226 ------------------------------------ src/nodes/DelayNode.tsx | 10 +- src/registries.ts | 9 +- 5 files changed, 216 insertions(+), 296 deletions(-) delete mode 100644 src/nodes/AddNode.tsx create mode 100644 src/nodes/CurveNode.tsx delete mode 100644 src/nodes/CurveNode.tsx.off diff --git a/src/nodes/AddNode.tsx b/src/nodes/AddNode.tsx deleted file mode 100644 index ea3ce6d..0000000 --- a/src/nodes/AddNode.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { NodeDef, nodeDef } from "../engine/node"; -import { categories } from "./category"; - -function makeMathNodeDef(it: { label: string; type: string; function: (a: number, b: number) => number }) { - return nodeDef()({ - label: it.label, - category: categories["math"], - type: it.type, - // component: makeNodeRenderer, - outputs: { - result: { - label: "Result", - type: "number", - }, - }, - inputs: { - a: { - label: "Value", - type: "number", - default: 0.0, - }, - b: { - label: "Value", - type: "number", - default: 0.0, - }, - }, - executor: { - initialPersistence: undefined, - executor: ({ a, b }) => { - return { - outputs: { result: it.function(a, b) }, - driverOutputs: {}, - persistentData: undefined, - }; - }, - }, - }); -} - -export const addNodeDef = makeMathNodeDef({ - label: "Add", - type: "add", - function: (a, b) => a + b, -}); -export const subtractNodeDef = makeMathNodeDef({ - label: "Subtract", - type: "subtract", - function: (a, b) => a - b, -}); -export const multiplyNodeDef = makeMathNodeDef({ - label: "Multiply", - type: "multiply", - function: (a, b) => a * b, -}); -export const divideNodeDef = makeMathNodeDef({ - label: "Divide", - type: "divide", - function: (a, b) => (b === 0 ? 0.0 : a / b), -}); diff --git a/src/nodes/CurveNode.tsx b/src/nodes/CurveNode.tsx new file mode 100644 index 0000000..b6ef0e5 --- /dev/null +++ b/src/nodes/CurveNode.tsx @@ -0,0 +1,207 @@ +import _ from "lodash"; +import React, { FunctionComponent, MouseEventHandler, PointerEventHandler, useCallback, useMemo, useRef, useState } from "react"; +import { NodeDef, NodeHeaderProps, nodeDef } from "../engine/node"; +import { useFileStore, useInputHandleData } from "../engine/store"; +import { categories } from "./category"; +import { usePreviewStore } from "../engine/preview"; + +type CurvePoint = { + x: number; + y: number; +}; + +type CurveNodeSettings = { + points: CurvePoint[] | undefined; +}; + +const CurveNode: FunctionComponent> = ({ id, data }) => { + const updateNode = useFileStore((s) => s.updateNode); + const editor = useRef(null); + // const value = usePreviewStore(s => s.outputHandlePreviews[id][""]) + const value = 0.0; //TODO Value + const points = data.settings.points; + + const setPoints = useCallback( + (points: CurvePoint[]) => { + updateNode(id, (r) => { + (r.data.settings as CurveNodeSettings).points = points; + }); + }, + [updateNode, id] + ); + + const [dragIndex, setDragIndex] = useState(null); + + const addPoint = useCallback( + (e: React.PointerEvent) => { + if (dragIndex === null) { + const rect = editor.current?.getBoundingClientRect()!!; + const x = (e.clientX - rect.left) / rect.width; + const y = (e.clientY - rect.top) / rect.height; + + const newPointsSorted = _.sortBy([...(points ?? []), { x, y: 1.0 - y }], (it) => it.x); + setDragIndex(newPointsSorted.findIndex((it) => it.x === x && it.y === 1.0 - y)); + setPoints(newPointsSorted); + (e.target as HTMLElement).setPointerCapture(e.pointerId); + e.stopPropagation(); + } + }, + [setPoints, editor, points, dragIndex] + ); + + const beginDrag = useCallback( + (e: React.PointerEvent, index: number) => { + (e.target as HTMLElement).setPointerCapture(e.pointerId); + setDragIndex(index); + e.stopPropagation(); + }, + [setDragIndex] + ); + + const doDrag: MouseEventHandler = useCallback( + (e) => { + if (dragIndex !== null) { + const newPoints = [...(points ?? [])]; + e.stopPropagation(); + + const rect = editor.current?.getBoundingClientRect()!!; + const x = Math.min(1.0, Math.max(0.0, (e.clientX - rect.left) / rect.width)); + const y = Math.min(1.0, Math.max(0.0, (e.clientY - rect.top) / rect.height)); + + newPoints[dragIndex] = { x, y: 1.0 - y }; + const newPointsSorted = _.uniqWith( + _.sortBy(newPoints, (it) => it.x), + _.isEqual + ); + + setDragIndex(newPointsSorted.findIndex((it) => it.x === newPoints[dragIndex].x && it.y === newPoints[dragIndex].y)); + setPoints(newPointsSorted); + } + }, + [dragIndex, points, setPoints] + ); + + const endDrag: PointerEventHandler = useCallback( + (e) => { + (e.target as HTMLElement).setPointerCapture(e.pointerId); + setDragIndex(null); + }, + [setDragIndex] + ); + + return ( +
      + addPoint(e)} + ref={editor} + className="stroke-white stroke_[0.01] cursor-crosshair" + onPointerUp={endDrag} + onPointerMoveCapture={(e) => doDrag(e)} + onMouseMoveCapture={(e) => e.stopPropagation()} + onMouseDownCapture={(e) => e.stopPropagation()} + > + + {points?.[0] !== undefined && ( + + )} + {points?.map((point, index) => { + let next = points?.[index + 1] || { + y: point.y, + x: 1.0, + }; + return ; + })} + {points?.map((point, index) => ( + beginDrag(e, index)} + > + ))} + +
      + ); +}; + +export const curveNodeDef = nodeDef()({ + label: "Curve", + category: categories["math"], + type: "curve", + header: CurveNode, + outputs: { + value: { + id: "value", + label: "Value", + type: "number", + }, + }, + inputs: { + value: { + id: "value", + label: "Value", + type: "number", + default: 1.0, + min: 0.0, + max: 1.0, + }, + }, + executor: { + initialPersistence: {}, + inputDriver: (context) => { + return { + curve: context.settings.points, + }; + }, + + executor: ({ value }, _, { curve }) => { + if (isNaN(value)) { + return { + driverOutputs: {}, + persistentData: {}, + outputs: { value: 0.0 }, + }; + } + if (curve === undefined || curve.length === 0) { + return { + driverOutputs: {}, + persistentData: {}, + outputs: { value: 0.0 }, + }; + } + let a: CurvePoint | null = null; + let b: CurvePoint | null = null; + + for (const point of curve) { + if (point.x < value) { + a = point; + } + if (point.x >= value) { + b = point; + break; + } + } + if (a === null) { + a = { x: 0.0, y: b!!.y }; + } + if (b === null) { + b = { x: 1.0, y: a.y }; + } + + let amount = (value - a.x) / (b.x - a.x); + if (b.x - a.x === 0) { + amount = 0; + } + + let out = a.y + (b.y - a.y) * amount; + return { + driverOutputs: {}, + persistentData: {}, + outputs: { value: out }, + }; + }, + }, +}); diff --git a/src/nodes/CurveNode.tsx.off b/src/nodes/CurveNode.tsx.off deleted file mode 100644 index 01b000d..0000000 --- a/src/nodes/CurveNode.tsx.off +++ /dev/null @@ -1,226 +0,0 @@ -import _ from "lodash"; -import React, { - FunctionComponent, - MouseEventHandler, - PointerEventHandler, - useCallback, - useMemo, - useRef, - useState, -} from "react"; -import { NodeDef, NodeHeaderProps } from "../engine/node"; -import { useCommittedData, useInputHandleData } from "../engine/store"; -import { categories } from "./category"; - -type CurvePoint = { - x: number; - y: number; -}; - -const CurveNode: FunctionComponent = ({ id }) => { - const editor = useRef(null); - const value = useCommittedData(id, "value") || 0.0; - const [pts, setPoints] = useInputHandleData(id, "curve"); - const points = useMemo(() => pts || [], [pts]); - - const [dragIndex, setDragIndex] = useState(null); - - const addPoint = useCallback( - (e: React.PointerEvent) => { - if (dragIndex === null) { - const rect = editor.current?.getBoundingClientRect()!!; - const x = (e.clientX - rect.left) / rect.width; - const y = (e.clientY - rect.top) / rect.height; - - const newPointsSorted = _.sortBy( - [...(points || []), { x, y: 1.0 - y }], - (it) => it.x - ); - setDragIndex( - newPointsSorted.findIndex((it) => it.x === x && it.y === 1.0 - y) - ); - setPoints(newPointsSorted); - (e.target as HTMLElement).setPointerCapture(e.pointerId); - e.stopPropagation(); - } - }, - [setPoints, editor, points, dragIndex] - ); - - const beginDrag = useCallback( - (e: React.PointerEvent, index: number) => { - (e.target as HTMLElement).setPointerCapture(e.pointerId); - setDragIndex(index); - e.stopPropagation(); - }, - [setDragIndex] - ); - - const doDrag: MouseEventHandler = useCallback( - (e) => { - if (dragIndex !== null) { - const newPoints = [...points]; - e.stopPropagation(); - - const rect = editor.current?.getBoundingClientRect()!!; - const x = Math.min( - 1.0, - Math.max(0.0, (e.clientX - rect.left) / rect.width) - ); - const y = Math.min( - 1.0, - Math.max(0.0, (e.clientY - rect.top) / rect.height) - ); - - newPoints[dragIndex] = { x, y: 1.0 - y }; - const newPointsSorted = _.uniqWith( - _.sortBy(newPoints, (it) => it.x), - _.isEqual - ); - - setDragIndex( - newPointsSorted.findIndex( - (it) => - it.x === newPoints[dragIndex].x && it.y === newPoints[dragIndex].y - ) - ); - setPoints(newPointsSorted); - } - }, - [dragIndex, points, setPoints] - ); - - const endDrag: PointerEventHandler = useCallback( - (e) => { - (e.target as HTMLElement).setPointerCapture(e.pointerId); - setDragIndex(null); - }, - [setDragIndex] - ); - - return ( -
      - addPoint(e)} - ref={editor} - className="stroke-white stroke_[0.01] cursor-crosshair" - onPointerUp={endDrag} - onPointerMoveCapture={(e) => doDrag(e)} - onMouseMoveCapture={(e) => e.stopPropagation()} - onMouseDownCapture={(e) => e.stopPropagation()} - > - - {points[0] !== undefined && ( - - )} - {points?.map((point, index) => { - let next = points?.[index + 1] || { - y: point.y, - x: 1.0, - }; - return ( - - ); - })} - {points?.map((point, index) => ( - beginDrag(e, index)} - > - ))} - -
      - ); -}; - -export const curveNodeDef: NodeDef = { - label: "Curve", - category: categories["math"], - type: "curve", - header: CurveNode, - outputs: [ - { - id: "value", - label: "Value", - type: "number", - }, - ], - inputs: [ - { - id: "curve", - label: "Curve", - type: "object", - hidden: true, - default: [], - }, - { - id: "value", - label: "Value", - type: "number", - default: 1.0, - min: 0.0, - max: 1.0, - }, - ], - executor: ([crv, val], { commit }) => { - const curve = crv as CurvePoint[]; - const value = val as number; - - if (isNaN(value)) { - return [0]; - } - commit("value", value); - - if (curve.length === 0) { - return [value]; - } - let a: CurvePoint | null = null; - let b: CurvePoint | null = null; - - for (const point of curve) { - if (point.x < value) { - a = point; - } - if (point.x >= value) { - b = point; - break; - } - } - if (a === null) { - a = { x: 0.0, y: b!!.y }; - } - if (b === null) { - b = { x: 1.0, y: a.y }; - } - - let amount = (value - a.x) / (b.x - a.x); - if (b.x - a.x === 0) { - amount = 0; - } - - let out = a.y + (b.y - a.y) * amount; - return [out]; - }, -}; diff --git a/src/nodes/DelayNode.tsx b/src/nodes/DelayNode.tsx index 6577a6d..0b16a13 100644 --- a/src/nodes/DelayNode.tsx +++ b/src/nodes/DelayNode.tsx @@ -22,8 +22,8 @@ export const delayNodeDef = nodeDef()({ type: "delay", header: DelayNode, outputs: { - signal: { - id: "signal", + elapsed: { + id: "elapsed", label: "Elapsed", type: "impulse", }, @@ -86,7 +86,7 @@ export const delayNodeDef = nodeDef()({ outputs: { progress: 1.0, running: true, - signal: emitImpulse(1), + elapsed: emitImpulse(1), }, persistentData: { delay: null, @@ -101,7 +101,7 @@ export const delayNodeDef = nodeDef()({ outputs: { progress, running, - signal: emitImpulse(0), + elapsed: emitImpulse(0), }, persistentData: { delay, @@ -114,7 +114,7 @@ export const delayNodeDef = nodeDef()({ outputs: { progress: 0.0, running: false, - signal: emitImpulse(0), + elapsed: emitImpulse(0), }, persistentData: { delay, diff --git a/src/registries.ts b/src/registries.ts index f7d37c8..a811b4e 100644 --- a/src/registries.ts +++ b/src/registries.ts @@ -16,18 +16,18 @@ import { remoteOutputAdapter, remoteOutputToInputAdapter } from "./remotePlugin/ import { outputAdapterNode } from "./nodes/OutputAdapterNode"; import { randomNodeDef } from "./nodes/RandomNode"; import { memoryNodeDef } from "./nodes/MemoryNode"; -import { addNodeDef, divideNodeDef, multiplyNodeDef, subtractNodeDef } from "./nodes/AddNode"; import { Tab, fileTab as fileTabDef } from "./components/Settings"; import { remoteSettingsTab as remoteSettingsTabDef } from "./remotePlugin/RemoteDrawerPage"; import { switchNodeDef } from "./nodes/SwitchNode"; import { positiveWaveNodeDef } from "./nodes/WaveNode"; import { delayNodeDef } from "./nodes/DelayNode"; import { mathNodeDef } from "./nodes/MathNode"; +import { constantValueNodeDef } from "./nodes/ConstantValueNode"; +import { curveNodeDef } from "./nodes/CurveNode"; const nodeDefList: AnyNodeDef[] = [ // displayNodeDef, - // constantValueNodeDef, - // positiveWaveNodeDef, + constantValueNodeDef as any, mathNodeDef as any, // buttplugNodeDef, // mixNodeDef, @@ -42,8 +42,7 @@ const nodeDefList: AnyNodeDef[] = [ outputAdapterNode as any, switchNodeDef as any, positiveWaveNodeDef as any, - // clampNodeDef, - // curveNodeDef, + curveNodeDef as any, delayNodeDef as any, // commentNodeDef, // sensorNodeDef, From 954ba3dbf4c0401e8cc94e75f52ac050bbcb3afb Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Mon, 7 Aug 2023 19:09:59 +0200 Subject: [PATCH 066/109] Mix into Math node --- src/nodes/CurveNode.tsx | 1 + src/nodes/Display.tsx.off | 186 ----------------------------------- src/nodes/MathNode.tsx | 3 +- src/nodes/MixNode.tsx.off | 40 -------- src/nodes/SliderNode.tsx.off | 77 --------------- 5 files changed, 3 insertions(+), 304 deletions(-) delete mode 100644 src/nodes/Display.tsx.off delete mode 100644 src/nodes/MixNode.tsx.off delete mode 100644 src/nodes/SliderNode.tsx.off diff --git a/src/nodes/CurveNode.tsx b/src/nodes/CurveNode.tsx index b6ef0e5..9c11179 100644 --- a/src/nodes/CurveNode.tsx +++ b/src/nodes/CurveNode.tsx @@ -18,6 +18,7 @@ const CurveNode: FunctionComponent> const updateNode = useFileStore((s) => s.updateNode); const editor = useRef(null); // const value = usePreviewStore(s => s.outputHandlePreviews[id][""]) + // TODO Reimplement some way to view the current progress of the curvenode const value = 0.0; //TODO Value const points = data.settings.points; diff --git a/src/nodes/Display.tsx.off b/src/nodes/Display.tsx.off deleted file mode 100644 index 6405268..0000000 --- a/src/nodes/Display.tsx.off +++ /dev/null @@ -1,186 +0,0 @@ -import { FunctionComponent } from "react"; -import NodeLine from "../components/node/NodeLine"; -import { MobileViewProps, NodeDef, NodeHeaderProps } from "../engine/node"; -import { useCommittedData, useHandleData } from "../engine/store"; -import { categories } from "./category"; - -const HEIGHT = 100; - -type GraphProps = { - history: (number | undefined)[]; - index: number; - fixed: boolean; -}; -const Graph: FunctionComponent = ({ history, index, fixed }) => { - let min = 0; - let max = 0; - - const tmpHistory = history.map((it) => { - const val = it || 0.0; - if (val < min) { - min = val; - } - if (val > max) { - max = val; - } - return val; - }); - - if (fixed) { - min = 0.0; - max = 1.0; - } - - const offset = -(min + max) / 2; - const scale = HEIGHT / 2 / Math.max(0.001, Math.abs(max + offset)); - - const correctedHistory = tmpHistory.map((it) => (it + offset) * scale); - - const parts = new Array(HISTORY_LENGTH) - .fill("") - .map((_, i) => { - const realIndex = (i + index) % HISTORY_LENGTH; - const point = correctedHistory[realIndex] || 0; - - const coords = -point; - return `L${i} ${coords.toFixed(4)}`; - }) - .join(" "); - - const start = correctedHistory[index]; - - const zero = (0 + offset) * scale; - const maxLine = (max + offset) * scale; - const minLine = (min + offset) * scale; - - return ( - - - - - - {" "} - 0 - - - {max.toFixed(2)} - - - {min.toFixed(2)} - - - - ); -}; - -const DisplayMobileView: FunctionComponent = ({ - id, - data, -}) => { - const history = useCommittedData<(number | undefined)[]>(id, "history"); - const index = useCommittedData(id, "index"); - const [fixed, _] = useHandleData("input", id, "fixed"); - - if (history === undefined) { - return <>; - } - - // -min/2 + max/2 * (HEIGHT / 2 / (max - offset)) - - return ( -
      - -
      - ); -}; - -const DisplayNode: FunctionComponent = ({ id }) => { - const history = useCommittedData<(number | undefined)[]>(id, "history"); - const index = useCommittedData(id, "index"); - - const [fixed, setFixed] = useHandleData("input", id, "fixed"); - - if (history === undefined) { - return ; - } - - // -min/2 + max/2 * (HEIGHT / 2 / (max - offset)) - - return ( - <> - - - - - - - - ); -}; - -const HISTORY_LENGTH = 3 * 60; - -export const displayNodeDef: NodeDef = { - label: "Display", - category: categories["display"], - type: "display", - // component: DisplayNode, - header: DisplayNode, - publishable: true, - outputs: [], - mobileView: DisplayMobileView, - inputs: [ - { - id: "value", - label: "Value", - type: "number", - default: 0.0, - }, - { - id: "fixed", - label: "Fixed", - type: "boolean", - default: false, - hidden: true, - }, - ], - executor: ([v], { commit, committed }) => { - const history = committed["history"] || new Array(HISTORY_LENGTH); - const index = committed["index"] || 0; - - history[index] = v; - - commit("history", history); - commit("index", (index + 1) % HISTORY_LENGTH); - - return []; - }, -}; diff --git a/src/nodes/MathNode.tsx b/src/nodes/MathNode.tsx index 0fd049e..ee604dd 100644 --- a/src/nodes/MathNode.tsx +++ b/src/nodes/MathNode.tsx @@ -10,6 +10,7 @@ const operations = [ "divide", "subtract", "multiplyAdd", + "mix", "power", "logarithm", "squareRoot", @@ -138,8 +139,8 @@ const funcs: Record> = { multiply: twoCompMath("Multiply", ({ a, b }) => a + b), subtract: twoCompMath("Subtract", ({ a, b }) => a + b), divide: twoCompMath("Divide", ({ a, b }) => a + b), - multiplyAdd: threeCompMath("Multiply Add", ({ a, b, c }) => a * b + c, ["Value", "Multiplier", "Addend"]), + mix: threeCompMath("Mix", ({ a, b, c: amount }) => b * amount + a * (1 - amount), ["Value 0", "Value 1", "Mix Amount"]), power: twoCompMath("Power", ({ a, b }) => Math.pow(a, b), ["Base", "Exponent"]), logarithm: twoCompMath("Logarithm", ({ a, b }) => Math.log(a) / Math.log(b), ["Value", "Base"]), squareRoot: oneCompMath("Square Root", ({ a }) => Math.sqrt(a)), diff --git a/src/nodes/MixNode.tsx.off b/src/nodes/MixNode.tsx.off deleted file mode 100644 index 3428a34..0000000 --- a/src/nodes/MixNode.tsx.off +++ /dev/null @@ -1,40 +0,0 @@ -import { NodeDef } from "../engine/node"; -import { categories } from "./category"; - -export const mixNodeDef: NodeDef = { - label: "Mix", - category: categories["math"], - type: "mix", - outputs: [ - { - id: "value", - label: "Value", - type: "number", - }, - ], - inputs: [ - { - id: "a", - label: "Value 0", - type: "number", - default: 0.0, - }, - { - id: "b", - label: "Value 1", - type: "number", - default: 0.0, - }, - { - id: "amount", - label: "Amount", - type: "number", - default: 1.0, - min: 0.0, - max: 1.0, - }, - ], - executor: ([a, b, amount]) => { - return [b * amount + a * (1 - amount)]; - }, -}; diff --git a/src/nodes/SliderNode.tsx.off b/src/nodes/SliderNode.tsx.off deleted file mode 100644 index 08d6b8d..0000000 --- a/src/nodes/SliderNode.tsx.off +++ /dev/null @@ -1,77 +0,0 @@ -import { FunctionComponent, useCallback } from "react"; -import { useDebouncedCallback } from "use-debounce"; -import { TextInput } from "../components/input/TextInput"; -import { MobileViewProps, NodeDef, NodeHeaderProps } from "../engine/node"; -import { - useInputHandleData, - usePushEphermalData, - useSetNodeName, -} from "../engine/store"; -import { categories } from "./category"; - -const SliderMobile: FunctionComponent = ({ id, data }) => { - const [value, setValue] = useInputHandleData(id, "value"); - - return ( - setValue(+e.target.value)} - value={value} - > - // push(true)} className="w-full text-lg"> - // {data.name || "Slider"} - // - ); -}; - -const SliderNode: FunctionComponent = ({ id, data }) => { - const push = usePushEphermalData(id, "signal"); - - const setNodeName = useSetNodeName(id); - - return ( -
      - - {/* push(true)}>Send Signal */} -
      - ); -}; - -export const SLIDER_NODE_TYPE = "slider"; -export const sliderNodeDef: NodeDef = { - label: "Slider", - category: categories["ui"], - publishable: true, - type: SLIDER_NODE_TYPE, - header: SliderNode, - mobileView: SliderMobile, - inputs: [ - { - id: "value", - label: "Value", - type: "number", - default: 1.0, - min: 0.0, - max: 1.0, - }, - ], - outputs: [ - { - id: "value", - label: "Value", - type: "number", - }, - ], - executor: ([v]) => { - return [v]; - }, -}; From 276f311110f27df0b5481e28b777bbba8889954b Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Mon, 7 Aug 2023 19:15:08 +0200 Subject: [PATCH 067/109] hysteresis node --- .../ButtplugNode.tsx.off | 0 src/{nodes => mediaPlugin}/MediaFurry.tsx.off | 0 src/nodes/HysteresisNode.tsx | 58 +++++++++++++++++++ src/nodes/HysteresisNode.tsx.off | 47 --------------- .../SensorNode.tsx.off | 0 src/registries.ts | 9 +-- 6 files changed, 60 insertions(+), 54 deletions(-) rename src/{nodes => buttplugPlugin}/ButtplugNode.tsx.off (100%) rename src/{nodes => mediaPlugin}/MediaFurry.tsx.off (100%) create mode 100644 src/nodes/HysteresisNode.tsx delete mode 100644 src/nodes/HysteresisNode.tsx.off rename src/{nodes => phoneSensorPlugin}/SensorNode.tsx.off (100%) diff --git a/src/nodes/ButtplugNode.tsx.off b/src/buttplugPlugin/ButtplugNode.tsx.off similarity index 100% rename from src/nodes/ButtplugNode.tsx.off rename to src/buttplugPlugin/ButtplugNode.tsx.off diff --git a/src/nodes/MediaFurry.tsx.off b/src/mediaPlugin/MediaFurry.tsx.off similarity index 100% rename from src/nodes/MediaFurry.tsx.off rename to src/mediaPlugin/MediaFurry.tsx.off diff --git a/src/nodes/HysteresisNode.tsx b/src/nodes/HysteresisNode.tsx new file mode 100644 index 0000000..2625319 --- /dev/null +++ b/src/nodes/HysteresisNode.tsx @@ -0,0 +1,58 @@ +import { NodeDef, nodeDef } from "../engine/node"; +import { categories } from "./category"; + +export const hysteresisNodeDef = nodeDef()({ + label: "Hysteresis", + category: categories["control"], + type: "hysteresis", + outputs: { + value: { + id: "value", + label: "Value", + type: "boolean", + }, + }, + inputs: { + value: { + id: "value", + label: "Value", + type: "number", + default: 0.0, + }, + highThreshold: { + id: "highThreshold", + label: "High Threshold", + type: "number", + default: 1.0, + }, + lowThreshold: { + id: "lowThreshold", + label: "Low Threshold", + type: "number", + default: 0.0, + }, + }, + executor: { + initialPersistence: { + high: false, + }, + executor: ({ value, highThreshold, lowThreshold }, { high }) => { + if (value >= highThreshold) { + high = true; + } + if (value <= lowThreshold) { + high = false; + } + + return { + outputs: { + value: high, + }, + persistentData: { + high, + }, + driverOutputs: {}, + }; + }, + }, +}); diff --git a/src/nodes/HysteresisNode.tsx.off b/src/nodes/HysteresisNode.tsx.off deleted file mode 100644 index ff59bd2..0000000 --- a/src/nodes/HysteresisNode.tsx.off +++ /dev/null @@ -1,47 +0,0 @@ -import { NodeDef } from "../engine/node"; -import { categories } from "./category"; - -export const hysteresisNodeDef: NodeDef = { - label: "Hysteresis", - category: categories["control"], - type: "hysteresis", - outputs: [ - { - id: "value", - label: "Value", - type: "number", - }, - ], - inputs: [ - { - id: "value", - label: "Value", - type: "number", - default: 0.0, - }, - { - id: "high", - label: "High Threshold", - type: "number", - default: 1.0, - }, - { - id: "low", - label: "Low Threshold", - type: "number", - default: 0.0, - }, - ], - executor: ([value, high, low], { commit, committed }) => { - const out = committed["value"] || 0; - - if (value >= high) { - commit("value", 1.0); - } - if (value <= low) { - commit("value", 0.0); - } - - return [out]; - }, -}; diff --git a/src/nodes/SensorNode.tsx.off b/src/phoneSensorPlugin/SensorNode.tsx.off similarity index 100% rename from src/nodes/SensorNode.tsx.off rename to src/phoneSensorPlugin/SensorNode.tsx.off diff --git a/src/registries.ts b/src/registries.ts index a811b4e..43bbee3 100644 --- a/src/registries.ts +++ b/src/registries.ts @@ -24,19 +24,16 @@ import { delayNodeDef } from "./nodes/DelayNode"; import { mathNodeDef } from "./nodes/MathNode"; import { constantValueNodeDef } from "./nodes/ConstantValueNode"; import { curveNodeDef } from "./nodes/CurveNode"; +import { hysteresisNodeDef } from "./nodes/HysteresisNode"; const nodeDefList: AnyNodeDef[] = [ - // displayNodeDef, constantValueNodeDef as any, mathNodeDef as any, - // buttplugNodeDef, - // mixNodeDef, - // hysteresisNodeDef, + hysteresisNodeDef as any, memoryNodeDef as any, randomNodeDef as any, timerNodeDef as any, buttonNodeDef as any, - // sliderNodeDef, toggleNodeDef as any, inputAdapterNode as any, outputAdapterNode as any, @@ -45,8 +42,6 @@ const nodeDefList: AnyNodeDef[] = [ curveNodeDef as any, delayNodeDef as any, // commentNodeDef, - // sensorNodeDef, - // mediaFurryNodeDef, // edgeDetectorNodeDef, ]; From 8a4abbeaf674747f215ad5ceb0047834e42d8a50 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Mon, 7 Aug 2023 19:28:36 +0200 Subject: [PATCH 068/109] reduce viewport rerenders --- src/components/Viewport.tsx | 25 +++++++------ src/components/node/NodeHandleLine.tsx | 49 +++++++++++--------------- 2 files changed, 35 insertions(+), 39 deletions(-) diff --git a/src/components/Viewport.tsx b/src/components/Viewport.tsx index 0117bdd..491a951 100644 --- a/src/components/Viewport.tsx +++ b/src/components/Viewport.tsx @@ -73,16 +73,6 @@ const nodeTypes: NodeTypes = { welcome: WelcomeNode, }; -const selector = (state: FileStore) => ({ - nodes: Object.values(state.data.nodes), - edges: Object.values(state.data.edges), - onNodesChange: state.onNodesChange, - onEdgesChange: state.onEdgesChange, - onConnect: state.onConnect, - addNode: state.addNode, - addEdge: state.addEdge, -}); - type NodeDropdownData = { source: string; sourceHandle: string; @@ -187,10 +177,23 @@ const NewNodeDropdown: FunctionComponent = ({ data, onClos ); }; +const selector = (state: FileStore) => ({ + nodes: Object.values(state.data.nodes).map((node) => ({ + ...node, + data: _.omit(node.data, "handles"), + })), + edges: Object.values(state.data.edges), + onNodesChange: state.onNodesChange, + onEdgesChange: state.onEdgesChange, + onConnect: state.onConnect, + addNode: state.addNode, + addEdge: state.addEdge, +}); + const Viewport: FunctionComponent<{ wrapper: RefObject; }> = ({ wrapper }) => { - const { nodes, edges, onNodesChange, onEdgesChange, onConnect } = useFileStore(selector, shallow); + const { nodes, edges, onNodesChange, onEdgesChange, onConnect } = useFileStore(selector, _.isEqual); const { project } = useReactFlow(); const connectingNode = useRef(null); diff --git a/src/components/node/NodeHandleLine.tsx b/src/components/node/NodeHandleLine.tsx index f8c3dc5..20f181b 100644 --- a/src/components/node/NodeHandleLine.tsx +++ b/src/components/node/NodeHandleLine.tsx @@ -20,36 +20,27 @@ type NodeHandleLineProps = { }; const NodeHandleLine: FunctionComponent = ({ input, kind, type, label, handleId, connected, nodeId }) => { - const nodes = useFileStore((store) => store.data.nodes); - const [open, setOpen] = useState(false); - const isValidConnection = useCallback( - (connection: Connection) => { - if ( - connection.source === null || - connection.target === null || - connection.sourceHandle === null || - connection.targetHandle === null - ) { - return false; - } - const targetType = nodes[connection.target].type; - const sourceType = nodes[connection.source].type; - console.log(connection, targetType, sourceType, nodes); - if (targetType !== undefined && sourceType !== undefined) { - return ( - connection.source !== connection.target && - handlesCompatible( - getNodeOutputs(nodes[connection.source].type, nodes[connection.source].data.settings)[connection.sourceHandle].type, - getNodeInputs(nodes[connection.target].type, nodes[connection.target].data.settings)[connection.targetHandle].type - ) - ); - } + const isValidConnection = useCallback((connection: Connection) => { + if (connection.source === null || connection.target === null || connection.sourceHandle === null || connection.targetHandle === null) { return false; - }, - [nodes] - ); + } + const nodes = useFileStore.getState().data.nodes; + const targetType = nodes[connection.target].type; + const sourceType = nodes[connection.source].type; + console.log(connection, targetType, sourceType, nodes); + if (targetType !== undefined && sourceType !== undefined) { + return ( + connection.source !== connection.target && + handlesCompatible( + getNodeOutputs(nodes[connection.source].type, nodes[connection.source].data.settings)[connection.sourceHandle].type, + getNodeInputs(nodes[connection.target].type, nodes[connection.target].data.settings)[connection.targetHandle].type + ) + ); + } + return false; + }, []); const NodeHandleValuePreview = nodeHandleValuePreviews[type]; @@ -86,7 +77,9 @@ const NodeHandleLine: FunctionComponent = ({ input, kind, t )} {kind === "output" && NodeHandleValuePreview !== undefined && ( - + )}
      From 5642c49d4c3a7f29bea52b45c1749d7b4adc5164 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Mon, 7 Aug 2023 20:28:48 +0200 Subject: [PATCH 069/109] boolean node value preview --- src/components/node/preview/BooleanSnake.tsx | 93 +++++++++++++++---- .../node/preview/GraphNodeValuePreview.tsx | 2 +- src/remotePlugin/publish/publishStore.ts | 1 - 3 files changed, 77 insertions(+), 19 deletions(-) diff --git a/src/components/node/preview/BooleanSnake.tsx b/src/components/node/preview/BooleanSnake.tsx index 3ffbcdf..73241cd 100644 --- a/src/components/node/preview/BooleanSnake.tsx +++ b/src/components/node/preview/BooleanSnake.tsx @@ -3,23 +3,82 @@ import { usePreviewStore } from "../../../engine/preview"; import { NodeHandleValuePreviewProps } from "../NodeHandleValuePreview"; import { timerNodeDef } from "../../../nodes/TimerNode"; import produce from "immer"; +import _ from "lodash"; +import clsx from "clsx"; +type Entry = { + begin: number; + end: number; + value: boolean; +}; + +const SAMPLE_RATE = 30.0; +const LENGTH = 5.0; export const BooleanSnakeHandleValuePreview: FunctionComponent = (props) => { - const value = usePreviewStore((s) => s.outputHandlePreviews[props.nodeId]?.[props.handleId]); - - // useEffect(() => { - // let timeout = setInterval(() => { - // const value = usePreviewStore.getState().outputHandlePreviews[props.nodeId]?.[props.handleId]; - // setPreview((s) => - // produce(s, (draft) => { - // draft.history[draft.index] = value ?? null; - // draft.index = (draft.index + 1) % HISTORY_LENGTH; - // }) - // ); - // }, 1000 / SAMPLE_RATE); - // return () => { - // clearInterval(timeout); - // }; - // }, [props.nodeId, props.handleId]); - return
      {value ? "true" : "false"}
      ; + const value = usePreviewStore((s) => s.outputHandlePreviews[props.nodeId]?.[props.handleId]); + + const [data, setData] = useState([ + { + begin: new Date().getTime(), + end: new Date().getTime(), + value: value, + }, + ]); + + useEffect(() => { + let timeout = setInterval(() => { + const value = usePreviewStore.getState().outputHandlePreviews[props.nodeId]?.[props.handleId]; + + const oldest = new Date().getTime() - LENGTH * 1000.0; + + setData((old) => + produce(old, (draft) => { + if (draft[draft.length - 1].value !== value) { + draft.push({ + begin: new Date().getTime(), + end: new Date().getTime(), + value: value, + }); + } else { + draft[draft.length - 1].end = new Date().getTime(); + } + while (draft[0].end < oldest) { + draft.splice(0, 1); + } + draft[0].begin = oldest; + }) + ); + }, 1000 / SAMPLE_RATE); + return () => { + clearInterval(timeout); + }; + }, [props.nodeId, props.handleId, setData]); + + const begin = data[0].begin; + const end = data[data.length - 1].end; + const duration = Math.max(end - begin, 1); + + const blocks = data + .filter((v) => v.value) + .map((block) => ({ + begin: (block.begin - begin) / duration, + end: (block.end - begin) / duration, + })); + + return ( +
      +
      + {blocks.map((it, index) => ( + // +
      + ))} +
      +
      + {value ? "true" : "false"} +
      +
      + ); }; diff --git a/src/components/node/preview/GraphNodeValuePreview.tsx b/src/components/node/preview/GraphNodeValuePreview.tsx index 6e5887c..8ddd864 100644 --- a/src/components/node/preview/GraphNodeValuePreview.tsx +++ b/src/components/node/preview/GraphNodeValuePreview.tsx @@ -27,7 +27,7 @@ export const GraphNodeValuePreview: FunctionComponent +
      ); diff --git a/src/remotePlugin/publish/publishStore.ts b/src/remotePlugin/publish/publishStore.ts index d6ab19c..20bf540 100644 --- a/src/remotePlugin/publish/publishStore.ts +++ b/src/remotePlugin/publish/publishStore.ts @@ -98,7 +98,6 @@ function makeConnectedState(socket: WebSocket, id: string): PublishConnectionSta }); }, emitSignal: (valueId, data) => { - console.log("(TODO) Publishing sigal emssion at ", valueId, ": ", data); sendMessage(socket, { EmitSignal: { endpoint: valueId, From d4f02f79ec2dda0fdbf8053094e620b8ac342f3c Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Mon, 7 Aug 2023 21:00:52 +0200 Subject: [PATCH 070/109] Impulse preview --- .../node/preview/ImpulseNodeValuePreview.tsx | 51 ++++++++++++------- src/engine/preview.ts | 30 ++++++++++- src/engine/runner.ts | 1 + src/hooks/useAnimationFrame.ts | 31 +++++++++++ 4 files changed, 95 insertions(+), 18 deletions(-) create mode 100644 src/hooks/useAnimationFrame.ts diff --git a/src/components/node/preview/ImpulseNodeValuePreview.tsx b/src/components/node/preview/ImpulseNodeValuePreview.tsx index ac0c5ca..8c44baf 100644 --- a/src/components/node/preview/ImpulseNodeValuePreview.tsx +++ b/src/components/node/preview/ImpulseNodeValuePreview.tsx @@ -1,25 +1,42 @@ -import { FunctionComponent, useEffect, useState } from "react"; +import { FunctionComponent, useCallback, useEffect, useState } from "react"; import { usePreviewStore } from "../../../engine/preview"; import { NodeHandleValuePreviewProps } from "../NodeHandleValuePreview"; import { timerNodeDef } from "../../../nodes/TimerNode"; import produce from "immer"; +import { useSignalBus } from "../../../engine/signal"; +import { useAnimationFrame } from "../../../hooks/useAnimationFrame"; + +const HISTORY_LENGTH = 10.0; +const REFRESH_RATE = 30.0; export const ImpuulseHandleValuePreview: FunctionComponent = (props) => { - const value = usePreviewStore((s) => s.outputHandlePreviews[props.nodeId]?.[props.handleId]); + const signals = usePreviewStore((s) => s.signalLog[props.nodeId]?.[props.handleId]) ?? []; + + const [oldest, setOldest] = useState(new Date().getTime() - HISTORY_LENGTH * 1000.0); + + const update = useCallback(() => { + let timeout = setInterval(() => { + setOldest(new Date().getTime() - HISTORY_LENGTH * 1000.0); + }, 1000 / REFRESH_RATE); + return () => { + clearInterval(timeout); + }; + }, [setOldest]); + + useAnimationFrame(update); + + const blobs = signals.map((it) => ({ + age: (it.getTime() - oldest) / (HISTORY_LENGTH * 1000.0), + })); - // useEffect(() => { - // let timeout = setInterval(() => { - // const value = usePreviewStore.getState().outputHandlePreviews[props.nodeId]?.[props.handleId]; - // setPreview((s) => - // produce(s, (draft) => { - // draft.history[draft.index] = value ?? null; - // draft.index = (draft.index + 1) % HISTORY_LENGTH; - // }) - // ); - // }, 1000 / SAMPLE_RATE); - // return () => { - // clearInterval(timeout); - // }; - // }, [props.nodeId, props.handleId]); - return
      {JSON.stringify(value)}
      ; + return ( +
      +
      + {blobs.map((it, index) => ( + // +
      + ))} +
      +
      + ); }; diff --git a/src/engine/preview.ts b/src/engine/preview.ts index 27e5965..a938d53 100644 --- a/src/engine/preview.ts +++ b/src/engine/preview.ts @@ -1,8 +1,36 @@ +import produce from "immer"; +import _ from "lodash"; import create from "zustand"; type PreviewStore = { outputHandlePreviews: Record>; + signalLog: Record>; + + pushSignals: (signals: Record>) => void; }; -export const usePreviewStore = create()(() => ({ +export const usePreviewStore = create()((set, get) => ({ outputHandlePreviews: {}, + signalLog: {}, + + pushSignals: (signals) => { + if (_.isEmpty(signals)) { + return; + } + const oldest = new Date().getTime() - 10.0 * 1000.0; + set((s) => + produce(s, (draft) => { + const sig = _.mapValues(signals, (nodeSignals) => _.mapValues(nodeSignals, (signals) => [new Date()])); + console.log(sig); + + _.mergeWith(draft.signalLog, sig, (objValue, srcValue) => { + if (_.isArray(objValue)) { + return objValue.concat(srcValue).filter((it) => it.getTime() > oldest); + } + }); + }) + ); + + console.log("PushSIgnals", signals); + console.log(get().signalLog); + }, })); diff --git a/src/engine/runner.ts b/src/engine/runner.ts index a236c3d..56146d7 100644 --- a/src/engine/runner.ts +++ b/src/engine/runner.ts @@ -96,6 +96,7 @@ function runEngineLoop(model: Model) { } usePreviewStore.setState({ outputHandlePreviews: handleValues }); + usePreviewStore.getState().pushSignals(signals); timeout = setTimeout(update, timestep) as any; } timeout = setTimeout(update, timestep) as any; diff --git a/src/hooks/useAnimationFrame.ts b/src/hooks/useAnimationFrame.ts new file mode 100644 index 0000000..e33f934 --- /dev/null +++ b/src/hooks/useAnimationFrame.ts @@ -0,0 +1,31 @@ +import { useCallback, useEffect, useRef } from "react"; + +export function useAnimationFrame(callback: (delta: number) => void) { + // Use useRef for mutable variables that we want to persist + // without triggering a re-render on their change + const requestRef = useRef(); + const previousTimeRef = useRef(); + + const animate: FrameRequestCallback = useCallback( + (time) => { + if (previousTimeRef.current !== undefined) { + const deltaTime = time - previousTimeRef.current; + callback(deltaTime); + } + previousTimeRef.current = time; + requestRef.current = requestAnimationFrame(animate); + }, + [callback] + ); + + useEffect(() => { + console.log("Starting AnimationFrame Loop"); + requestRef.current = requestAnimationFrame(animate); + return () => { + console.log("Clearning AnimationFrame Loop"); + if (requestRef.current !== undefined) { + cancelAnimationFrame(requestRef.current); + } + }; + }, [animate]); // Make sure the effect runs only once +} From da5ce221f216dd6ceeefa3edbd0c200883434552 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Mon, 7 Aug 2023 21:07:12 +0200 Subject: [PATCH 071/109] fix positive wave --- src/nodes/WaveNode.tsx | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/src/nodes/WaveNode.tsx b/src/nodes/WaveNode.tsx index 01e54eb..37bfc28 100644 --- a/src/nodes/WaveNode.tsx +++ b/src/nodes/WaveNode.tsx @@ -1,23 +1,34 @@ import { FunctionComponent } from "react"; import { NodeDef, NodeHeaderProps, nodeDef } from "../engine/node"; -import { useInputHandleData } from "../engine/store"; +import { useFileStore, useInputHandleData } from "../engine/store"; import { categories } from "./category"; import _ from "lodash"; -const PositiveWaveNode: FunctionComponent> = ({ id }) => { - const [positive, setPositive] = useInputHandleData(id, "positive"); +type PositiveWaveNodeSettings = { + positiveOnly: boolean; +}; + +const PositiveWaveNode: FunctionComponent> = ({ id, data }) => { + // const [positive, setPositive] = useInputHandleData(id, "positive"); + const updateNode = useFileStore((s) => s.updateNode); + + const setPositive = (p: boolean) => { + updateNode(id, (r) => { + (r.data.settings as PositiveWaveNodeSettings).positiveOnly = p; + }); + }; return (
      ); }; -export const positiveWaveNodeDef = nodeDef()({ +export const positiveWaveNodeDef = nodeDef()({ label: "Wave Generator", category: categories["generators"], type: "wave", @@ -30,13 +41,6 @@ export const positiveWaveNodeDef = nodeDef()({ }, }, inputs: { - positive: { - id: "positive", - label: "Positive", - type: "boolean", - default: true, - hidden: true, - }, amplitude: { id: "amplitude", label: "Height", @@ -66,7 +70,13 @@ export const positiveWaveNodeDef = nodeDef()({ frequency: 0.0, offset: 0.0, }, - executor: ({ positive, amplitude, frequency, phase: phaseShift }, persistent) => { + inputDriver: (context) => { + return { + positive: context.settings.positiveOnly ?? true, + }; + }, + executor: ({ amplitude, frequency, phase: phaseShift }, persistent, { positive }) => { + console.log(positive); const seconds = Date.now() / 1000; const committedFreq = persistent.frequency; let offset = persistent.offset; @@ -103,7 +113,7 @@ export const positiveWaveNodeDef = nodeDef()({ } else { return { outputs: { - value: sine / 2.0 + amplitude / 2.0, + value: sine, }, driverOutputs: {}, persistentData: persistent, From cd2716f450536d0a08d84a23a829851f17ccc7e6 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Mon, 7 Aug 2023 21:07:45 +0200 Subject: [PATCH 072/109] Remove Button Node --- src/nodes/ButtonNode.tsx | 73 ---------------------------------------- src/registries.ts | 8 ----- 2 files changed, 81 deletions(-) delete mode 100644 src/nodes/ButtonNode.tsx diff --git a/src/nodes/ButtonNode.tsx b/src/nodes/ButtonNode.tsx deleted file mode 100644 index 16c6106..0000000 --- a/src/nodes/ButtonNode.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import { FunctionComponent, useCallback } from "react"; -import { Button } from "../components/input/Button"; -import { TextInput } from "../components/input/TextInput"; -import { NodeHeaderProps, nodeDef } from "../engine/node"; -import { useFileStore } from "../engine/store"; -import { categories } from "./category"; -import { emitImpulse, useSignalBus } from "../engine/signal"; - -// const ButtonMobile: FunctionComponent = ({ id, data }) => { -// const push = usePushEphermalData(id, "signal"); - -// return ( -// -// ); -// }; - -const ButtonNode: FunctionComponent> = ({ id, data }) => { - const emit = useSignalBus((s) => s.emit); - - const updateNode = useFileStore((s) => s.updateNode); - - const setNodeName = useCallback( - (name: string) => { - updateNode(id, (node) => { - node.data.name = name; - }); - }, - [updateNode, id] - ); - - return ( -
      - - -
      - ); -}; - -export const BUTTON_NODE_TYPE = "button"; -export const buttonNodeDef = nodeDef()({ - label: "Button", - category: categories["ui"], - publishable: true, - type: BUTTON_NODE_TYPE, - header: ButtonNode, - inputs: { - id: { - label: "Press", - type: "impulse", - default: false, - }, - }, - outputs: { - signal: { - label: "Signal", - type: "impulse", - }, - }, - executor: { - initialPersistence: undefined, - executor: () => { - return { - driverOutputs: {}, - outputs: { - signal: emitImpulse(0), - }, - persistentData: {}, - }; - }, - }, -}); diff --git a/src/registries.ts b/src/registries.ts index 43bbee3..0f566f7 100644 --- a/src/registries.ts +++ b/src/registries.ts @@ -1,12 +1,5 @@ import { AnyNodeDef } from "./engine/node"; -// import { -// addNodeDef, -// divideNodeDef, -// multiplyNodeDef, -// subtractNodeDef, -// } from "../nodes/AddNode"; -import { buttonNodeDef } from "./nodes/ButtonNode"; import { timerNodeDef } from "./nodes/TimerNode"; import { inputAdapterNode } from "./nodes/InputAdapterNode"; import { toggleNodeDef } from "./nodes/ToggleNode"; @@ -33,7 +26,6 @@ const nodeDefList: AnyNodeDef[] = [ memoryNodeDef as any, randomNodeDef as any, timerNodeDef as any, - buttonNodeDef as any, toggleNodeDef as any, inputAdapterNode as any, outputAdapterNode as any, From 8b4a842a1e9d2e63c58746e9cd03d166082d2a18 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Mon, 7 Aug 2023 21:30:11 +0200 Subject: [PATCH 073/109] Comment node --- src/nodes/CommentNode.tsx | 92 +++++++++++++++++++++++++++++++++++ src/nodes/CommentNode.tsx.off | 42 ---------------- src/nodes/WaveNode.tsx | 3 -- src/registries.ts | 3 +- 4 files changed, 94 insertions(+), 46 deletions(-) create mode 100644 src/nodes/CommentNode.tsx delete mode 100644 src/nodes/CommentNode.tsx.off diff --git a/src/nodes/CommentNode.tsx b/src/nodes/CommentNode.tsx new file mode 100644 index 0000000..caf5071 --- /dev/null +++ b/src/nodes/CommentNode.tsx @@ -0,0 +1,92 @@ +import { FunctionComponent, useEffect, useRef, useState } from "react"; +import { NodeProps } from "reactflow"; +import { NodeDef, nodeDef } from "../engine/node"; +import { categories } from "./category"; +import { BeadiNodeData, useFileStore } from "../engine/store"; + +type CommentNodeSettings = { + text: string; + height: number; +}; +export const CommentNode: FunctionComponent>> = ({ id, data }) => { + const [editing, setEditing] = useState(false); + // const [text, setText] = useHandleData("input", id, "text"); + const text = data.settings.text; + const updateNode = useFileStore((s) => s.updateNode); + const setText = (t: string) => { + updateNode(id, (r) => { + (r.data.settings as CommentNodeSettings).text = t; + }); + }; + const setHeight = (t: number) => { + console.log(t); + updateNode(id, (r) => { + (r.data.settings as CommentNodeSettings).height = t; + }); + }; + + const textAreaRef = useRef(null); + + useEffect(() => { + if (textAreaRef.current !== null) { + const obs = new ResizeObserver((e) => { + console.log("Resize: ", e); + for (const entry of e) { + if (entry.target === textAreaRef.current) { + setHeight(entry.target.clientHeight); + } + } + }); + obs.observe(textAreaRef.current); + return () => { + obs.disconnect(); + }; + } + }); + + const className = "bg-transparent p-2 w-full h-full whitespace-pre-wrap border-none font-mono box-border block rounded-md"; + return ( +
      setEditing(true)} + onMouseDownCapture={(e) => { + if (editing) { + e.stopPropagation(); + } + }} + > + {editing ? ( + + ) : ( +
      + {text} +
      + )} +
      + ); +}; + +export const commentNodeDef = nodeDef()({ + nodeComponent: CommentNode, + label: "Comment", + category: categories["extra"], + type: "comment", + outputs: {}, + inputs: {}, + executor: { + initialPersistence: {}, + executor: () => ({ outputs: {}, driverOutputs: {}, persistentData: {} }), + }, +}); diff --git a/src/nodes/CommentNode.tsx.off b/src/nodes/CommentNode.tsx.off deleted file mode 100644 index 408fe7b..0000000 --- a/src/nodes/CommentNode.tsx.off +++ /dev/null @@ -1,42 +0,0 @@ -import { FunctionComponent, useState } from "react"; -import { NodeProps } from "reactflow"; -import { NodeDef } from "../engine/node"; -import { useHandleData } from "../engine/store"; -import { categories } from "./category"; - -export const CommentNode: FunctionComponent = ({ id }) => { - const [editing, setEditing] = useState(false); - const [text, setText] = useHandleData("input", id, "text"); - - const className = "bg-transparent outline-none w-full h-full"; - return ( -
      - {editing ? ( - - ) : ( -
      setEditing(true)} className={className}> - {text} -
      - )} -
      - ); -}; - -export const commentNodeDef: NodeDef = { - nodeComponent: CommentNode, - label: "Comment", - category: categories["extra"], - type: "comment", - outputs: [], - inputs: [], - executor: () => [], -}; diff --git a/src/nodes/WaveNode.tsx b/src/nodes/WaveNode.tsx index 37bfc28..be48b3f 100644 --- a/src/nodes/WaveNode.tsx +++ b/src/nodes/WaveNode.tsx @@ -76,7 +76,6 @@ export const positiveWaveNodeDef = nodeDef()({ }; }, executor: ({ amplitude, frequency, phase: phaseShift }, persistent, { positive }) => { - console.log(positive); const seconds = Date.now() / 1000; const committedFreq = persistent.frequency; let offset = persistent.offset; @@ -95,8 +94,6 @@ export const positiveWaveNodeDef = nodeDef()({ persistent.offset = newOffset; persistent.frequency = frequency; - // commit("offset", newOffset); - // commit("frequency", frequency); offset = newOffset; } diff --git a/src/registries.ts b/src/registries.ts index 0f566f7..934f1e6 100644 --- a/src/registries.ts +++ b/src/registries.ts @@ -18,6 +18,7 @@ import { mathNodeDef } from "./nodes/MathNode"; import { constantValueNodeDef } from "./nodes/ConstantValueNode"; import { curveNodeDef } from "./nodes/CurveNode"; import { hysteresisNodeDef } from "./nodes/HysteresisNode"; +import { commentNodeDef } from "./nodes/CommentNode"; const nodeDefList: AnyNodeDef[] = [ constantValueNodeDef as any, @@ -33,7 +34,7 @@ const nodeDefList: AnyNodeDef[] = [ positiveWaveNodeDef as any, curveNodeDef as any, delayNodeDef as any, - // commentNodeDef, + commentNodeDef as any, // edgeDetectorNodeDef, ]; From 639861b0f2e4333847db5fc82d2f9ed69bb99f6e Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Mon, 7 Aug 2023 21:37:44 +0200 Subject: [PATCH 074/109] Edge Detector --- src/nodes/EdgeDetector.tsx | 77 ++++++++++++++++++++++++++++++++++ src/nodes/EdgeDetector.tsx.off | 42 ------------------- src/registries.ts | 3 +- 3 files changed, 79 insertions(+), 43 deletions(-) create mode 100644 src/nodes/EdgeDetector.tsx delete mode 100644 src/nodes/EdgeDetector.tsx.off diff --git a/src/nodes/EdgeDetector.tsx b/src/nodes/EdgeDetector.tsx new file mode 100644 index 0000000..314cdff --- /dev/null +++ b/src/nodes/EdgeDetector.tsx @@ -0,0 +1,77 @@ +import { FunctionComponent, useCallback } from "react"; +import { Button } from "../components/input/Button"; +import { TextInput } from "../components/input/TextInput"; +import { MobileViewProps, NodeDef, NodeHeaderProps, nodeDef } from "../engine/node"; +import { categories } from "./category"; +import { useFileStore } from "../engine/store"; +import { emitImpulse } from "../engine/signal"; + +type EdgeDetectorNodeSettings = { + raising: boolean; +}; + +const EdgeDetectorWaveNode: FunctionComponent> = ({ id, data }) => { + // const [positive, setPositive] = useInputHandleData(id, "positive"); + const updateNode = useFileStore((s) => s.updateNode); + + const setPositive = (p: boolean) => { + updateNode(id, (r) => { + (r.data.settings as EdgeDetectorNodeSettings).raising = p; + }); + }; + + return ( +
      + +
      + ); +}; + +export const RAISING_EDGE_DETECTOR_TYPE = "edgeDetector"; +export const edgeDetectorNodeDef = nodeDef()({ + label: "Boolean Edge", + category: categories["control"], + type: RAISING_EDGE_DETECTOR_TYPE, + header: EdgeDetectorWaveNode, + inputs: { + value: { + id: "value", + label: "Value", + type: "boolean", + default: false, + }, + }, + outputs: { + signal: { + id: "signal", + label: "Edge", + type: "impulse", + }, + }, + executor: { + initialPersistence: { + last: null as boolean | null, + }, + inputDriver: (context) => { + return { + raising: context.settings.raising ?? true, + }; + }, + + executor: ({ value }, { last }, { raising }) => { + const detected = raising ? last === false && value === true : last === true && value === false; + return { + driverOutputs: {}, + persistentData: { + last: value, + }, + outputs: { + signal: emitImpulse(detected ? 1 : 0), + }, + }; + }, + }, +}); diff --git a/src/nodes/EdgeDetector.tsx.off b/src/nodes/EdgeDetector.tsx.off deleted file mode 100644 index a627b1c..0000000 --- a/src/nodes/EdgeDetector.tsx.off +++ /dev/null @@ -1,42 +0,0 @@ -import { FunctionComponent, useCallback } from "react"; -import { Button } from "../components/input/Button"; -import { TextInput } from "../components/input/TextInput"; -import { MobileViewProps, NodeDef, NodeHeaderProps } from "../engine/node"; -import { usePushEphermalData, useSetNodeName } from "../engine/store"; -import { categories } from "./category"; - -const Mobile: FunctionComponent = ({ id, data }) => { - return <>; -}; - -const Header: FunctionComponent = ({ id, data }) => { - return <>; -}; - -export const RAISING_EDGE_DETECTOR_TYPE = "edgeDetector"; -export const edgeDetectorNodeDef: NodeDef = { - label: "On Raising Edge", - category: categories["control"], - type: RAISING_EDGE_DETECTOR_TYPE, - header: Header, - inputs: [ - { - id: "value", - label: "Value", - type: "boolean", - default: false, - }, - ], - outputs: [ - { - id: "signal", - label: "Signal", - type: "impulse", - }, - ], - executor: ([v], { commit, committed }) => { - const last = committed["last"] ?? false; - commit("last", v); - return [v && !last]; - }, -}; diff --git a/src/registries.ts b/src/registries.ts index 934f1e6..1bf3de2 100644 --- a/src/registries.ts +++ b/src/registries.ts @@ -19,6 +19,7 @@ import { constantValueNodeDef } from "./nodes/ConstantValueNode"; import { curveNodeDef } from "./nodes/CurveNode"; import { hysteresisNodeDef } from "./nodes/HysteresisNode"; import { commentNodeDef } from "./nodes/CommentNode"; +import { edgeDetectorNodeDef } from "./nodes/EdgeDetector"; const nodeDefList: AnyNodeDef[] = [ constantValueNodeDef as any, @@ -35,7 +36,7 @@ const nodeDefList: AnyNodeDef[] = [ curveNodeDef as any, delayNodeDef as any, commentNodeDef as any, - // edgeDetectorNodeDef, + edgeDetectorNodeDef as any, ]; export const nodeDefs: Record = Object.assign({}, ...nodeDefList.map((it) => ({ [it.type]: it }))); From 2e39417d2d39fec6d1f6ad7f470c20baf28ee8eb Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Mon, 7 Aug 2023 22:20:54 +0200 Subject: [PATCH 075/109] Fix CommentNode --- src/nodes/CommentNode.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/nodes/CommentNode.tsx b/src/nodes/CommentNode.tsx index caf5071..89077d0 100644 --- a/src/nodes/CommentNode.tsx +++ b/src/nodes/CommentNode.tsx @@ -44,7 +44,8 @@ export const CommentNode: FunctionComponent Date: Sat, 12 Aug 2023 15:58:15 +0200 Subject: [PATCH 076/109] cleanups --- src/components/Viewport.tsx | 2 +- src/index.tsx | 54 ++++++++++++++++++++++++++ src/remotePlugin/remote/remoteStore.ts | 2 +- 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/src/components/Viewport.tsx b/src/components/Viewport.tsx index 491a951..04794e1 100644 --- a/src/components/Viewport.tsx +++ b/src/components/Viewport.tsx @@ -237,7 +237,7 @@ const Viewport: FunctionComponent<{ [project, wrapper, connectingNode, setNodeDropdownData] ); - console.log("Viewport rerendered: ", nodes); + // console.log("Viewport rerendered: ", nodes); return ( <> = {}; + +// type TimeoutParams = Parameters; +// (window.setTimeout as any) = (func: TimeoutParams[0], timeout: TimeoutParams[1]) => { +// let to = oldSetTimeout(() => { +// func(); +// delete timeouts[to]; +// }, timeout); +// const stack = new Error().stack; +// timeouts[to] = stack; +// const len = Object.keys(timeouts).length; +// console.log("Timeouts: ", len); +// if (len > 100) { +// console.log(timeouts); +// debugger; +// } + +// // console.trace("Timeouts: ", timeouts.size); +// return to; +// }; +// (window.clearTimeout as any) = (a: any) => { +// delete timeouts[a]; +// return oldClearTimeout(a); +// }; + +// const oldSetInterval = window.setInterval; +// const oldClearInterval = window.clearInterval; + +// const intervals: Record = {}; + +// type IntervalParams = Parameters; +// (window.setInterval as any) = (func: IntervalParams[0], interval: IntervalParams[1]) => { +// let to = oldSetInterval(func, interval); +// const stack = new Error().stack; +// intervals[to] = stack; +// const len = Object.keys(intervals).length; +// console.log("Intervals: ", len); +// if (len > 100) { +// console.log(intervals); +// debugger; +// } + +// // console.trace("Intervals: ", intervals.size); +// return to; +// }; +// (window.clearInterval as any) = (a: any) => { +// delete intervals[a]; +// return oldClearInterval(a); +// }; diff --git a/src/remotePlugin/remote/remoteStore.ts b/src/remotePlugin/remote/remoteStore.ts index 6587305..7c5db84 100644 --- a/src/remotePlugin/remote/remoteStore.ts +++ b/src/remotePlugin/remote/remoteStore.ts @@ -194,7 +194,7 @@ function startSyncRemoteStateStore() { const syncRemoteStateStore = (state: RemoteStore) => { const oldRemotes = useRemoteStateStore.getState().remotes; const { missing, extra } = diffByKeys(oldRemotes, state.remotes, (a, b) => _.isEqual(a.definition, b)); - console.log("syncRemoteStateStore: ", missing, extra); + // console.log("syncRemoteStateStore: ", missing, extra); for (const extraKey in extra) { console.log("Closing Remote: ", extraKey); From 5d94851d50cd33dc3272838acae6fb961b1efa1c Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Sat, 12 Aug 2023 17:02:08 +0200 Subject: [PATCH 077/109] make pnpm workspace --- .gitignore | 4 +- .env => app/.env | 0 craco.config.js => app/craco.config.js | 2 +- package-lock.json => app/package-lock.json | 0 app/package.json | 71 + postcss.config.js => app/postcss.config.js | 0 {public => app/public}/favicon.png | Bin {public => app/public}/favicon.svg | 0 {public => app/public}/index.html | 0 {public => app/public}/logo192.png | Bin {public => app/public}/logo512.png | Bin {public => app/public}/manifest.json | 0 {public => app/public}/robots.txt | 0 {src => app/src}/App.tsx | 0 {src => app/src}/adapters/buttplug.ts | 0 {src => app/src}/adapters/store.ts | 0 .../src}/buttplugPlugin/ButtplugNode.tsx.off | 0 .../src}/components/CollapsibleCard.tsx | 0 {src => app/src}/components/Drawer.tsx | 0 {src => app/src}/components/Logo.tsx | 0 {src => app/src}/components/Settings.tsx | 0 {src => app/src}/components/Typo.tsx | 0 {src => app/src}/components/Viewport.tsx | 5 + {src => app/src}/components/drawer/Entry.tsx | 0 {src => app/src}/components/graph/Graph.tsx | 0 {src => app/src}/components/input/Button.tsx | 0 .../src}/components/input/Checkbox.tsx | 0 .../src}/components/input/NumberInput.tsx | 0 {src => app/src}/components/input/Select.tsx | 0 .../src}/components/input/TextInput.tsx | 0 .../src}/components/mobile/BottomBar.tsx | 0 .../src}/components/mobile/MobileView.tsx | 0 .../src}/components/mobile/Welcome.tsx | 0 .../components/node/EditableNodeTitle.tsx | 0 .../src}/components/node/NodeHandle.tsx | 0 .../src}/components/node/NodeHandleLine.tsx | 0 .../node/NodeHandleValuePreview.tsx | 0 .../components/node/NodeHeaderIcons.tsx.off | 0 {src => app/src}/components/node/NodeLine.tsx | 0 .../src}/components/node/NodeRenderer.tsx | 0 .../src}/components/node/NodeShell.tsx | 0 .../src}/components/node/nodeInputs.tsx | 0 .../components/node/preview/BooleanSnake.tsx | 0 .../node/preview/GraphNodeValuePreview.tsx | 0 .../node/preview/ImpulseNodeValuePreview.tsx | 0 .../components/settings/ButtplugSettings.tsx | 0 .../src}/components/settings/FileSettings.tsx | 0 .../src}/components/settings/JsonExport.tsx | 0 .../src}/components/settings/Litterbox.tsx | 0 {src => app/src}/engine/adapter.ts | 0 {src => app/src}/engine/compiler.ts | 0 {src => app/src}/engine/handles.ts | 0 {src => app/src}/engine/index.ts | 0 {src => app/src}/engine/node.ts | 0 {src => app/src}/engine/nodeDriverStore.ts | 0 {src => app/src}/engine/preview.ts | 0 {src => app/src}/engine/runner.ts | 0 {src => app/src}/engine/signal.ts | 0 {src => app/src}/engine/store.ts | 0 {src => app/src}/hooks/useAnimationFrame.ts | 0 {src => app/src}/hooks/useDeepDebounced.ts | 0 {src => app/src}/hooks/useDynamicStore.ts | 0 {src => app/src}/index.css | 0 {src => app/src}/index.tsx | 0 {src => app/src}/markdown.d.ts | 0 .../src}/mediaPlugin/MediaFurry.tsx.off | 0 {src => app/src}/nodes/CommentNode.tsx | 0 {src => app/src}/nodes/ConstantValueNode.tsx | 0 {src => app/src}/nodes/CurveNode.tsx | 0 {src => app/src}/nodes/DelayNode.tsx | 0 {src => app/src}/nodes/EdgeDetector.tsx | 0 {src => app/src}/nodes/HysteresisNode.tsx | 0 {src => app/src}/nodes/InputAdapterNode.tsx | 0 {src => app/src}/nodes/MathNode.tsx | 0 {src => app/src}/nodes/MemoryNode.tsx | 0 {src => app/src}/nodes/OutputAdapterNode.tsx | 0 {src => app/src}/nodes/RandomNode.tsx | 0 {src => app/src}/nodes/SwitchNode.tsx | 0 {src => app/src}/nodes/TimerNode.tsx | 0 {src => app/src}/nodes/ToggleNode.tsx | 0 {src => app/src}/nodes/WaveNode.tsx | 0 {src => app/src}/nodes/WelcomeNode.tsx | 2 +- {src => app/src}/nodes/category.ts | 0 .../src}/phoneSensorPlugin/SensorNode.tsx.off | 0 {src => app/src}/react-app-env.d.ts | 0 {src => app/src}/registries.ts | 0 .../src}/remotePlugin/RemoteDrawerPage.tsx | 0 .../src}/remotePlugin/inputAdapter.tsx | 0 .../src}/remotePlugin/inputOutputStore.ts | 0 .../src}/remotePlugin/interface/Interface.tsx | 0 .../interface/InterfaceEditor.tsx | 0 .../remotePlugin/interface/InterfaceList.tsx | 0 .../remotePlugin/interface/interfaceStores.ts | 0 .../src}/remotePlugin/interface/widget.ts | 0 {src => app/src}/remotePlugin/message.ts | 0 .../src}/remotePlugin/outputAdapter.tsx | 0 .../remotePlugin/publish/PublishManager.tsx | 0 .../src}/remotePlugin/publish/publishStore.ts | 0 {src => app/src}/remotePlugin/registry.ts | 0 .../remotePlugin/remote/ConnectionManager.tsx | 0 .../src}/remotePlugin/remote/remoteStore.ts | 0 .../remotePlugin/widgets/ButtonWidget.tsx | 0 .../src}/remotePlugin/widgets/GraphWidget.tsx | 0 .../remotePlugin/widgets/SliderWidget.tsx | 0 .../remotePlugin/widgets/SwitchWidget.tsx | 0 {src => app/src}/reportWebVitals.ts | 0 {src => app/src}/setupTests.ts | 0 {src => app/src}/utils/diffBy.ts | 0 {src => app/src}/utils/notNull.ts | 0 tailwind.config.js => app/tailwind.config.js | 0 app/tsconfig.json | 4 + flake.nix | 1 + package.json | 44 +- pnpm-lock.yaml | 10516 ++++++++++++++++ pnpm-workspace.yaml | 4 + tsconfig.json => tsconfig.base.json | 0 116 files changed, 10606 insertions(+), 47 deletions(-) rename .env => app/.env (100%) rename craco.config.js => app/craco.config.js (90%) rename package-lock.json => app/package-lock.json (100%) create mode 100644 app/package.json rename postcss.config.js => app/postcss.config.js (100%) rename {public => app/public}/favicon.png (100%) rename {public => app/public}/favicon.svg (100%) rename {public => app/public}/index.html (100%) rename {public => app/public}/logo192.png (100%) rename {public => app/public}/logo512.png (100%) rename {public => app/public}/manifest.json (100%) rename {public => app/public}/robots.txt (100%) rename {src => app/src}/App.tsx (100%) rename {src => app/src}/adapters/buttplug.ts (100%) rename {src => app/src}/adapters/store.ts (100%) rename {src => app/src}/buttplugPlugin/ButtplugNode.tsx.off (100%) rename {src => app/src}/components/CollapsibleCard.tsx (100%) rename {src => app/src}/components/Drawer.tsx (100%) rename {src => app/src}/components/Logo.tsx (100%) rename {src => app/src}/components/Settings.tsx (100%) rename {src => app/src}/components/Typo.tsx (100%) rename {src => app/src}/components/Viewport.tsx (97%) rename {src => app/src}/components/drawer/Entry.tsx (100%) rename {src => app/src}/components/graph/Graph.tsx (100%) rename {src => app/src}/components/input/Button.tsx (100%) rename {src => app/src}/components/input/Checkbox.tsx (100%) rename {src => app/src}/components/input/NumberInput.tsx (100%) rename {src => app/src}/components/input/Select.tsx (100%) rename {src => app/src}/components/input/TextInput.tsx (100%) rename {src => app/src}/components/mobile/BottomBar.tsx (100%) rename {src => app/src}/components/mobile/MobileView.tsx (100%) rename {src => app/src}/components/mobile/Welcome.tsx (100%) rename {src => app/src}/components/node/EditableNodeTitle.tsx (100%) rename {src => app/src}/components/node/NodeHandle.tsx (100%) rename {src => app/src}/components/node/NodeHandleLine.tsx (100%) rename {src => app/src}/components/node/NodeHandleValuePreview.tsx (100%) rename {src => app/src}/components/node/NodeHeaderIcons.tsx.off (100%) rename {src => app/src}/components/node/NodeLine.tsx (100%) rename {src => app/src}/components/node/NodeRenderer.tsx (100%) rename {src => app/src}/components/node/NodeShell.tsx (100%) rename {src => app/src}/components/node/nodeInputs.tsx (100%) rename {src => app/src}/components/node/preview/BooleanSnake.tsx (100%) rename {src => app/src}/components/node/preview/GraphNodeValuePreview.tsx (100%) rename {src => app/src}/components/node/preview/ImpulseNodeValuePreview.tsx (100%) rename {src => app/src}/components/settings/ButtplugSettings.tsx (100%) rename {src => app/src}/components/settings/FileSettings.tsx (100%) rename {src => app/src}/components/settings/JsonExport.tsx (100%) rename {src => app/src}/components/settings/Litterbox.tsx (100%) rename {src => app/src}/engine/adapter.ts (100%) rename {src => app/src}/engine/compiler.ts (100%) rename {src => app/src}/engine/handles.ts (100%) rename {src => app/src}/engine/index.ts (100%) rename {src => app/src}/engine/node.ts (100%) rename {src => app/src}/engine/nodeDriverStore.ts (100%) rename {src => app/src}/engine/preview.ts (100%) rename {src => app/src}/engine/runner.ts (100%) rename {src => app/src}/engine/signal.ts (100%) rename {src => app/src}/engine/store.ts (100%) rename {src => app/src}/hooks/useAnimationFrame.ts (100%) rename {src => app/src}/hooks/useDeepDebounced.ts (100%) rename {src => app/src}/hooks/useDynamicStore.ts (100%) rename {src => app/src}/index.css (100%) rename {src => app/src}/index.tsx (100%) rename {src => app/src}/markdown.d.ts (100%) rename {src => app/src}/mediaPlugin/MediaFurry.tsx.off (100%) rename {src => app/src}/nodes/CommentNode.tsx (100%) rename {src => app/src}/nodes/ConstantValueNode.tsx (100%) rename {src => app/src}/nodes/CurveNode.tsx (100%) rename {src => app/src}/nodes/DelayNode.tsx (100%) rename {src => app/src}/nodes/EdgeDetector.tsx (100%) rename {src => app/src}/nodes/HysteresisNode.tsx (100%) rename {src => app/src}/nodes/InputAdapterNode.tsx (100%) rename {src => app/src}/nodes/MathNode.tsx (100%) rename {src => app/src}/nodes/MemoryNode.tsx (100%) rename {src => app/src}/nodes/OutputAdapterNode.tsx (100%) rename {src => app/src}/nodes/RandomNode.tsx (100%) rename {src => app/src}/nodes/SwitchNode.tsx (100%) rename {src => app/src}/nodes/TimerNode.tsx (100%) rename {src => app/src}/nodes/ToggleNode.tsx (100%) rename {src => app/src}/nodes/WaveNode.tsx (100%) rename {src => app/src}/nodes/WelcomeNode.tsx (98%) rename {src => app/src}/nodes/category.ts (100%) rename {src => app/src}/phoneSensorPlugin/SensorNode.tsx.off (100%) rename {src => app/src}/react-app-env.d.ts (100%) rename {src => app/src}/registries.ts (100%) rename {src => app/src}/remotePlugin/RemoteDrawerPage.tsx (100%) rename {src => app/src}/remotePlugin/inputAdapter.tsx (100%) rename {src => app/src}/remotePlugin/inputOutputStore.ts (100%) rename {src => app/src}/remotePlugin/interface/Interface.tsx (100%) rename {src => app/src}/remotePlugin/interface/InterfaceEditor.tsx (100%) rename {src => app/src}/remotePlugin/interface/InterfaceList.tsx (100%) rename {src => app/src}/remotePlugin/interface/interfaceStores.ts (100%) rename {src => app/src}/remotePlugin/interface/widget.ts (100%) rename {src => app/src}/remotePlugin/message.ts (100%) rename {src => app/src}/remotePlugin/outputAdapter.tsx (100%) rename {src => app/src}/remotePlugin/publish/PublishManager.tsx (100%) rename {src => app/src}/remotePlugin/publish/publishStore.ts (100%) rename {src => app/src}/remotePlugin/registry.ts (100%) rename {src => app/src}/remotePlugin/remote/ConnectionManager.tsx (100%) rename {src => app/src}/remotePlugin/remote/remoteStore.ts (100%) rename {src => app/src}/remotePlugin/widgets/ButtonWidget.tsx (100%) rename {src => app/src}/remotePlugin/widgets/GraphWidget.tsx (100%) rename {src => app/src}/remotePlugin/widgets/SliderWidget.tsx (100%) rename {src => app/src}/remotePlugin/widgets/SwitchWidget.tsx (100%) rename {src => app/src}/reportWebVitals.ts (100%) rename {src => app/src}/setupTests.ts (100%) rename {src => app/src}/utils/diffBy.ts (100%) rename {src => app/src}/utils/notNull.ts (100%) rename tailwind.config.js => app/tailwind.config.js (100%) create mode 100644 app/tsconfig.json create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml rename tsconfig.json => tsconfig.base.json (100%) diff --git a/.gitignore b/.gitignore index 6e454b9..434a010 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. # dependencies -/node_modules +node_modules /.pnp .pnp.js @@ -9,7 +9,7 @@ /coverage # production -/build +/app/build # misc .DS_Store diff --git a/.env b/app/.env similarity index 100% rename from .env rename to app/.env diff --git a/craco.config.js b/app/craco.config.js similarity index 90% rename from craco.config.js rename to app/craco.config.js index 3d27329..f564e70 100644 --- a/craco.config.js +++ b/app/craco.config.js @@ -2,7 +2,7 @@ const path = require("path"); const fs = require("fs"); const webpack = require("webpack"); -const changelog_file = path.resolve(__dirname, "CHANGELOG.md"); +const changelog_file = path.resolve(__dirname, "../CHANGELOG.md"); module.exports = { webpack: { diff --git a/package-lock.json b/app/package-lock.json similarity index 100% rename from package-lock.json rename to app/package-lock.json diff --git a/app/package.json b/app/package.json new file mode 100644 index 0000000..f279328 --- /dev/null +++ b/app/package.json @@ -0,0 +1,71 @@ +{ + "name": "beadi", + "version": "0.0.3", + "private": true, + "dependencies": { + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^13.4.0", + "@testing-library/user-event": "^13.5.0", + "@types/jest": "^27.5.2", + "@types/node": "^16.18.3", + "@types/react": "^18.0.25", + "@types/react-dom": "^18.0.9", + "buttplug": "=3.1.1", + "clsx": "^1.2.1", + "file-saver": "^2.0.5", + "idb": "^7.1.1", + "immer": "^9.0.19", + "lodash": "^4.17.21", + "luxon": "^3.1.1", + "react": "^18.2.0", + "react-dnd": "^16.0.1", + "react-dnd-html5-backend": "^16.0.1", + "react-dom": "^18.2.0", + "react-icons": "^4.7.1", + "react-markdown": "^8.0.4", + "react-router-dom": "^6.14.1", + "react-scripts": "5.0.1", + "reactflow": "^11.3.2", + "swr": "^2.1.0", + "typescript": "^4.9.3", + "use-debounce": "^9.0.3", + "web-vitals": "^2.1.4", + "zustand": "^4.1.4" + }, + "homepage": "https://beadi.onrender.com/", + "scripts": { + "start": "craco start", + "build": "craco build", + "build:ci": "CI=true craco build", + "test": "craco test" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "@craco/craco": "^7.0.0", + "@types/file-saver": "^2.0.5", + "@types/lodash": "^4.14.191", + "@types/luxon": "^3.1.0", + "autoprefixer": "^10.4.13", + "gh-pages": "^4.0.0", + "postcss": "^8.4.19", + "tailwindcss": "^3.2.4", + "wasm-loader": "^1.3.0" + } +} diff --git a/postcss.config.js b/app/postcss.config.js similarity index 100% rename from postcss.config.js rename to app/postcss.config.js diff --git a/public/favicon.png b/app/public/favicon.png similarity index 100% rename from public/favicon.png rename to app/public/favicon.png diff --git a/public/favicon.svg b/app/public/favicon.svg similarity index 100% rename from public/favicon.svg rename to app/public/favicon.svg diff --git a/public/index.html b/app/public/index.html similarity index 100% rename from public/index.html rename to app/public/index.html diff --git a/public/logo192.png b/app/public/logo192.png similarity index 100% rename from public/logo192.png rename to app/public/logo192.png diff --git a/public/logo512.png b/app/public/logo512.png similarity index 100% rename from public/logo512.png rename to app/public/logo512.png diff --git a/public/manifest.json b/app/public/manifest.json similarity index 100% rename from public/manifest.json rename to app/public/manifest.json diff --git a/public/robots.txt b/app/public/robots.txt similarity index 100% rename from public/robots.txt rename to app/public/robots.txt diff --git a/src/App.tsx b/app/src/App.tsx similarity index 100% rename from src/App.tsx rename to app/src/App.tsx diff --git a/src/adapters/buttplug.ts b/app/src/adapters/buttplug.ts similarity index 100% rename from src/adapters/buttplug.ts rename to app/src/adapters/buttplug.ts diff --git a/src/adapters/store.ts b/app/src/adapters/store.ts similarity index 100% rename from src/adapters/store.ts rename to app/src/adapters/store.ts diff --git a/src/buttplugPlugin/ButtplugNode.tsx.off b/app/src/buttplugPlugin/ButtplugNode.tsx.off similarity index 100% rename from src/buttplugPlugin/ButtplugNode.tsx.off rename to app/src/buttplugPlugin/ButtplugNode.tsx.off diff --git a/src/components/CollapsibleCard.tsx b/app/src/components/CollapsibleCard.tsx similarity index 100% rename from src/components/CollapsibleCard.tsx rename to app/src/components/CollapsibleCard.tsx diff --git a/src/components/Drawer.tsx b/app/src/components/Drawer.tsx similarity index 100% rename from src/components/Drawer.tsx rename to app/src/components/Drawer.tsx diff --git a/src/components/Logo.tsx b/app/src/components/Logo.tsx similarity index 100% rename from src/components/Logo.tsx rename to app/src/components/Logo.tsx diff --git a/src/components/Settings.tsx b/app/src/components/Settings.tsx similarity index 100% rename from src/components/Settings.tsx rename to app/src/components/Settings.tsx diff --git a/src/components/Typo.tsx b/app/src/components/Typo.tsx similarity index 100% rename from src/components/Typo.tsx rename to app/src/components/Typo.tsx diff --git a/src/components/Viewport.tsx b/app/src/components/Viewport.tsx similarity index 97% rename from src/components/Viewport.tsx rename to app/src/components/Viewport.tsx index 04794e1..6500b9e 100644 --- a/src/components/Viewport.tsx +++ b/app/src/components/Viewport.tsx @@ -212,6 +212,11 @@ const Viewport: FunctionComponent<{ (event) => { const targetIsPane = (event.target as any).classList.contains("react-flow__pane"); if (targetIsPane) { + if (!("clientX" in event)) { + //TODO Handle if event is TouchEvent + console.warn("Touch Events aren't yet properly handled for onConnectEnd"); + return; + } const rect = wrapper.current?.getBoundingClientRect(); const pos = project({ diff --git a/src/components/drawer/Entry.tsx b/app/src/components/drawer/Entry.tsx similarity index 100% rename from src/components/drawer/Entry.tsx rename to app/src/components/drawer/Entry.tsx diff --git a/src/components/graph/Graph.tsx b/app/src/components/graph/Graph.tsx similarity index 100% rename from src/components/graph/Graph.tsx rename to app/src/components/graph/Graph.tsx diff --git a/src/components/input/Button.tsx b/app/src/components/input/Button.tsx similarity index 100% rename from src/components/input/Button.tsx rename to app/src/components/input/Button.tsx diff --git a/src/components/input/Checkbox.tsx b/app/src/components/input/Checkbox.tsx similarity index 100% rename from src/components/input/Checkbox.tsx rename to app/src/components/input/Checkbox.tsx diff --git a/src/components/input/NumberInput.tsx b/app/src/components/input/NumberInput.tsx similarity index 100% rename from src/components/input/NumberInput.tsx rename to app/src/components/input/NumberInput.tsx diff --git a/src/components/input/Select.tsx b/app/src/components/input/Select.tsx similarity index 100% rename from src/components/input/Select.tsx rename to app/src/components/input/Select.tsx diff --git a/src/components/input/TextInput.tsx b/app/src/components/input/TextInput.tsx similarity index 100% rename from src/components/input/TextInput.tsx rename to app/src/components/input/TextInput.tsx diff --git a/src/components/mobile/BottomBar.tsx b/app/src/components/mobile/BottomBar.tsx similarity index 100% rename from src/components/mobile/BottomBar.tsx rename to app/src/components/mobile/BottomBar.tsx diff --git a/src/components/mobile/MobileView.tsx b/app/src/components/mobile/MobileView.tsx similarity index 100% rename from src/components/mobile/MobileView.tsx rename to app/src/components/mobile/MobileView.tsx diff --git a/src/components/mobile/Welcome.tsx b/app/src/components/mobile/Welcome.tsx similarity index 100% rename from src/components/mobile/Welcome.tsx rename to app/src/components/mobile/Welcome.tsx diff --git a/src/components/node/EditableNodeTitle.tsx b/app/src/components/node/EditableNodeTitle.tsx similarity index 100% rename from src/components/node/EditableNodeTitle.tsx rename to app/src/components/node/EditableNodeTitle.tsx diff --git a/src/components/node/NodeHandle.tsx b/app/src/components/node/NodeHandle.tsx similarity index 100% rename from src/components/node/NodeHandle.tsx rename to app/src/components/node/NodeHandle.tsx diff --git a/src/components/node/NodeHandleLine.tsx b/app/src/components/node/NodeHandleLine.tsx similarity index 100% rename from src/components/node/NodeHandleLine.tsx rename to app/src/components/node/NodeHandleLine.tsx diff --git a/src/components/node/NodeHandleValuePreview.tsx b/app/src/components/node/NodeHandleValuePreview.tsx similarity index 100% rename from src/components/node/NodeHandleValuePreview.tsx rename to app/src/components/node/NodeHandleValuePreview.tsx diff --git a/src/components/node/NodeHeaderIcons.tsx.off b/app/src/components/node/NodeHeaderIcons.tsx.off similarity index 100% rename from src/components/node/NodeHeaderIcons.tsx.off rename to app/src/components/node/NodeHeaderIcons.tsx.off diff --git a/src/components/node/NodeLine.tsx b/app/src/components/node/NodeLine.tsx similarity index 100% rename from src/components/node/NodeLine.tsx rename to app/src/components/node/NodeLine.tsx diff --git a/src/components/node/NodeRenderer.tsx b/app/src/components/node/NodeRenderer.tsx similarity index 100% rename from src/components/node/NodeRenderer.tsx rename to app/src/components/node/NodeRenderer.tsx diff --git a/src/components/node/NodeShell.tsx b/app/src/components/node/NodeShell.tsx similarity index 100% rename from src/components/node/NodeShell.tsx rename to app/src/components/node/NodeShell.tsx diff --git a/src/components/node/nodeInputs.tsx b/app/src/components/node/nodeInputs.tsx similarity index 100% rename from src/components/node/nodeInputs.tsx rename to app/src/components/node/nodeInputs.tsx diff --git a/src/components/node/preview/BooleanSnake.tsx b/app/src/components/node/preview/BooleanSnake.tsx similarity index 100% rename from src/components/node/preview/BooleanSnake.tsx rename to app/src/components/node/preview/BooleanSnake.tsx diff --git a/src/components/node/preview/GraphNodeValuePreview.tsx b/app/src/components/node/preview/GraphNodeValuePreview.tsx similarity index 100% rename from src/components/node/preview/GraphNodeValuePreview.tsx rename to app/src/components/node/preview/GraphNodeValuePreview.tsx diff --git a/src/components/node/preview/ImpulseNodeValuePreview.tsx b/app/src/components/node/preview/ImpulseNodeValuePreview.tsx similarity index 100% rename from src/components/node/preview/ImpulseNodeValuePreview.tsx rename to app/src/components/node/preview/ImpulseNodeValuePreview.tsx diff --git a/src/components/settings/ButtplugSettings.tsx b/app/src/components/settings/ButtplugSettings.tsx similarity index 100% rename from src/components/settings/ButtplugSettings.tsx rename to app/src/components/settings/ButtplugSettings.tsx diff --git a/src/components/settings/FileSettings.tsx b/app/src/components/settings/FileSettings.tsx similarity index 100% rename from src/components/settings/FileSettings.tsx rename to app/src/components/settings/FileSettings.tsx diff --git a/src/components/settings/JsonExport.tsx b/app/src/components/settings/JsonExport.tsx similarity index 100% rename from src/components/settings/JsonExport.tsx rename to app/src/components/settings/JsonExport.tsx diff --git a/src/components/settings/Litterbox.tsx b/app/src/components/settings/Litterbox.tsx similarity index 100% rename from src/components/settings/Litterbox.tsx rename to app/src/components/settings/Litterbox.tsx diff --git a/src/engine/adapter.ts b/app/src/engine/adapter.ts similarity index 100% rename from src/engine/adapter.ts rename to app/src/engine/adapter.ts diff --git a/src/engine/compiler.ts b/app/src/engine/compiler.ts similarity index 100% rename from src/engine/compiler.ts rename to app/src/engine/compiler.ts diff --git a/src/engine/handles.ts b/app/src/engine/handles.ts similarity index 100% rename from src/engine/handles.ts rename to app/src/engine/handles.ts diff --git a/src/engine/index.ts b/app/src/engine/index.ts similarity index 100% rename from src/engine/index.ts rename to app/src/engine/index.ts diff --git a/src/engine/node.ts b/app/src/engine/node.ts similarity index 100% rename from src/engine/node.ts rename to app/src/engine/node.ts diff --git a/src/engine/nodeDriverStore.ts b/app/src/engine/nodeDriverStore.ts similarity index 100% rename from src/engine/nodeDriverStore.ts rename to app/src/engine/nodeDriverStore.ts diff --git a/src/engine/preview.ts b/app/src/engine/preview.ts similarity index 100% rename from src/engine/preview.ts rename to app/src/engine/preview.ts diff --git a/src/engine/runner.ts b/app/src/engine/runner.ts similarity index 100% rename from src/engine/runner.ts rename to app/src/engine/runner.ts diff --git a/src/engine/signal.ts b/app/src/engine/signal.ts similarity index 100% rename from src/engine/signal.ts rename to app/src/engine/signal.ts diff --git a/src/engine/store.ts b/app/src/engine/store.ts similarity index 100% rename from src/engine/store.ts rename to app/src/engine/store.ts diff --git a/src/hooks/useAnimationFrame.ts b/app/src/hooks/useAnimationFrame.ts similarity index 100% rename from src/hooks/useAnimationFrame.ts rename to app/src/hooks/useAnimationFrame.ts diff --git a/src/hooks/useDeepDebounced.ts b/app/src/hooks/useDeepDebounced.ts similarity index 100% rename from src/hooks/useDeepDebounced.ts rename to app/src/hooks/useDeepDebounced.ts diff --git a/src/hooks/useDynamicStore.ts b/app/src/hooks/useDynamicStore.ts similarity index 100% rename from src/hooks/useDynamicStore.ts rename to app/src/hooks/useDynamicStore.ts diff --git a/src/index.css b/app/src/index.css similarity index 100% rename from src/index.css rename to app/src/index.css diff --git a/src/index.tsx b/app/src/index.tsx similarity index 100% rename from src/index.tsx rename to app/src/index.tsx diff --git a/src/markdown.d.ts b/app/src/markdown.d.ts similarity index 100% rename from src/markdown.d.ts rename to app/src/markdown.d.ts diff --git a/src/mediaPlugin/MediaFurry.tsx.off b/app/src/mediaPlugin/MediaFurry.tsx.off similarity index 100% rename from src/mediaPlugin/MediaFurry.tsx.off rename to app/src/mediaPlugin/MediaFurry.tsx.off diff --git a/src/nodes/CommentNode.tsx b/app/src/nodes/CommentNode.tsx similarity index 100% rename from src/nodes/CommentNode.tsx rename to app/src/nodes/CommentNode.tsx diff --git a/src/nodes/ConstantValueNode.tsx b/app/src/nodes/ConstantValueNode.tsx similarity index 100% rename from src/nodes/ConstantValueNode.tsx rename to app/src/nodes/ConstantValueNode.tsx diff --git a/src/nodes/CurveNode.tsx b/app/src/nodes/CurveNode.tsx similarity index 100% rename from src/nodes/CurveNode.tsx rename to app/src/nodes/CurveNode.tsx diff --git a/src/nodes/DelayNode.tsx b/app/src/nodes/DelayNode.tsx similarity index 100% rename from src/nodes/DelayNode.tsx rename to app/src/nodes/DelayNode.tsx diff --git a/src/nodes/EdgeDetector.tsx b/app/src/nodes/EdgeDetector.tsx similarity index 100% rename from src/nodes/EdgeDetector.tsx rename to app/src/nodes/EdgeDetector.tsx diff --git a/src/nodes/HysteresisNode.tsx b/app/src/nodes/HysteresisNode.tsx similarity index 100% rename from src/nodes/HysteresisNode.tsx rename to app/src/nodes/HysteresisNode.tsx diff --git a/src/nodes/InputAdapterNode.tsx b/app/src/nodes/InputAdapterNode.tsx similarity index 100% rename from src/nodes/InputAdapterNode.tsx rename to app/src/nodes/InputAdapterNode.tsx diff --git a/src/nodes/MathNode.tsx b/app/src/nodes/MathNode.tsx similarity index 100% rename from src/nodes/MathNode.tsx rename to app/src/nodes/MathNode.tsx diff --git a/src/nodes/MemoryNode.tsx b/app/src/nodes/MemoryNode.tsx similarity index 100% rename from src/nodes/MemoryNode.tsx rename to app/src/nodes/MemoryNode.tsx diff --git a/src/nodes/OutputAdapterNode.tsx b/app/src/nodes/OutputAdapterNode.tsx similarity index 100% rename from src/nodes/OutputAdapterNode.tsx rename to app/src/nodes/OutputAdapterNode.tsx diff --git a/src/nodes/RandomNode.tsx b/app/src/nodes/RandomNode.tsx similarity index 100% rename from src/nodes/RandomNode.tsx rename to app/src/nodes/RandomNode.tsx diff --git a/src/nodes/SwitchNode.tsx b/app/src/nodes/SwitchNode.tsx similarity index 100% rename from src/nodes/SwitchNode.tsx rename to app/src/nodes/SwitchNode.tsx diff --git a/src/nodes/TimerNode.tsx b/app/src/nodes/TimerNode.tsx similarity index 100% rename from src/nodes/TimerNode.tsx rename to app/src/nodes/TimerNode.tsx diff --git a/src/nodes/ToggleNode.tsx b/app/src/nodes/ToggleNode.tsx similarity index 100% rename from src/nodes/ToggleNode.tsx rename to app/src/nodes/ToggleNode.tsx diff --git a/src/nodes/WaveNode.tsx b/app/src/nodes/WaveNode.tsx similarity index 100% rename from src/nodes/WaveNode.tsx rename to app/src/nodes/WaveNode.tsx diff --git a/src/nodes/WelcomeNode.tsx b/app/src/nodes/WelcomeNode.tsx similarity index 98% rename from src/nodes/WelcomeNode.tsx rename to app/src/nodes/WelcomeNode.tsx index de3414b..ec25be4 100644 --- a/src/nodes/WelcomeNode.tsx +++ b/app/src/nodes/WelcomeNode.tsx @@ -24,7 +24,7 @@ const examples: Record = {}; function importAll(r: any) { r.keys().forEach((key: any) => (examples[key] = r(key))); } -importAll((require as any).context("../../examples", false, /\.json$/)); +importAll((require as any).context("../../../examples", false, /\.json$/)); export const ExampleList: FunctionComponent<{}> = () => { const overwriteStore = useFileStore((it) => it.overwrite); diff --git a/src/nodes/category.ts b/app/src/nodes/category.ts similarity index 100% rename from src/nodes/category.ts rename to app/src/nodes/category.ts diff --git a/src/phoneSensorPlugin/SensorNode.tsx.off b/app/src/phoneSensorPlugin/SensorNode.tsx.off similarity index 100% rename from src/phoneSensorPlugin/SensorNode.tsx.off rename to app/src/phoneSensorPlugin/SensorNode.tsx.off diff --git a/src/react-app-env.d.ts b/app/src/react-app-env.d.ts similarity index 100% rename from src/react-app-env.d.ts rename to app/src/react-app-env.d.ts diff --git a/src/registries.ts b/app/src/registries.ts similarity index 100% rename from src/registries.ts rename to app/src/registries.ts diff --git a/src/remotePlugin/RemoteDrawerPage.tsx b/app/src/remotePlugin/RemoteDrawerPage.tsx similarity index 100% rename from src/remotePlugin/RemoteDrawerPage.tsx rename to app/src/remotePlugin/RemoteDrawerPage.tsx diff --git a/src/remotePlugin/inputAdapter.tsx b/app/src/remotePlugin/inputAdapter.tsx similarity index 100% rename from src/remotePlugin/inputAdapter.tsx rename to app/src/remotePlugin/inputAdapter.tsx diff --git a/src/remotePlugin/inputOutputStore.ts b/app/src/remotePlugin/inputOutputStore.ts similarity index 100% rename from src/remotePlugin/inputOutputStore.ts rename to app/src/remotePlugin/inputOutputStore.ts diff --git a/src/remotePlugin/interface/Interface.tsx b/app/src/remotePlugin/interface/Interface.tsx similarity index 100% rename from src/remotePlugin/interface/Interface.tsx rename to app/src/remotePlugin/interface/Interface.tsx diff --git a/src/remotePlugin/interface/InterfaceEditor.tsx b/app/src/remotePlugin/interface/InterfaceEditor.tsx similarity index 100% rename from src/remotePlugin/interface/InterfaceEditor.tsx rename to app/src/remotePlugin/interface/InterfaceEditor.tsx diff --git a/src/remotePlugin/interface/InterfaceList.tsx b/app/src/remotePlugin/interface/InterfaceList.tsx similarity index 100% rename from src/remotePlugin/interface/InterfaceList.tsx rename to app/src/remotePlugin/interface/InterfaceList.tsx diff --git a/src/remotePlugin/interface/interfaceStores.ts b/app/src/remotePlugin/interface/interfaceStores.ts similarity index 100% rename from src/remotePlugin/interface/interfaceStores.ts rename to app/src/remotePlugin/interface/interfaceStores.ts diff --git a/src/remotePlugin/interface/widget.ts b/app/src/remotePlugin/interface/widget.ts similarity index 100% rename from src/remotePlugin/interface/widget.ts rename to app/src/remotePlugin/interface/widget.ts diff --git a/src/remotePlugin/message.ts b/app/src/remotePlugin/message.ts similarity index 100% rename from src/remotePlugin/message.ts rename to app/src/remotePlugin/message.ts diff --git a/src/remotePlugin/outputAdapter.tsx b/app/src/remotePlugin/outputAdapter.tsx similarity index 100% rename from src/remotePlugin/outputAdapter.tsx rename to app/src/remotePlugin/outputAdapter.tsx diff --git a/src/remotePlugin/publish/PublishManager.tsx b/app/src/remotePlugin/publish/PublishManager.tsx similarity index 100% rename from src/remotePlugin/publish/PublishManager.tsx rename to app/src/remotePlugin/publish/PublishManager.tsx diff --git a/src/remotePlugin/publish/publishStore.ts b/app/src/remotePlugin/publish/publishStore.ts similarity index 100% rename from src/remotePlugin/publish/publishStore.ts rename to app/src/remotePlugin/publish/publishStore.ts diff --git a/src/remotePlugin/registry.ts b/app/src/remotePlugin/registry.ts similarity index 100% rename from src/remotePlugin/registry.ts rename to app/src/remotePlugin/registry.ts diff --git a/src/remotePlugin/remote/ConnectionManager.tsx b/app/src/remotePlugin/remote/ConnectionManager.tsx similarity index 100% rename from src/remotePlugin/remote/ConnectionManager.tsx rename to app/src/remotePlugin/remote/ConnectionManager.tsx diff --git a/src/remotePlugin/remote/remoteStore.ts b/app/src/remotePlugin/remote/remoteStore.ts similarity index 100% rename from src/remotePlugin/remote/remoteStore.ts rename to app/src/remotePlugin/remote/remoteStore.ts diff --git a/src/remotePlugin/widgets/ButtonWidget.tsx b/app/src/remotePlugin/widgets/ButtonWidget.tsx similarity index 100% rename from src/remotePlugin/widgets/ButtonWidget.tsx rename to app/src/remotePlugin/widgets/ButtonWidget.tsx diff --git a/src/remotePlugin/widgets/GraphWidget.tsx b/app/src/remotePlugin/widgets/GraphWidget.tsx similarity index 100% rename from src/remotePlugin/widgets/GraphWidget.tsx rename to app/src/remotePlugin/widgets/GraphWidget.tsx diff --git a/src/remotePlugin/widgets/SliderWidget.tsx b/app/src/remotePlugin/widgets/SliderWidget.tsx similarity index 100% rename from src/remotePlugin/widgets/SliderWidget.tsx rename to app/src/remotePlugin/widgets/SliderWidget.tsx diff --git a/src/remotePlugin/widgets/SwitchWidget.tsx b/app/src/remotePlugin/widgets/SwitchWidget.tsx similarity index 100% rename from src/remotePlugin/widgets/SwitchWidget.tsx rename to app/src/remotePlugin/widgets/SwitchWidget.tsx diff --git a/src/reportWebVitals.ts b/app/src/reportWebVitals.ts similarity index 100% rename from src/reportWebVitals.ts rename to app/src/reportWebVitals.ts diff --git a/src/setupTests.ts b/app/src/setupTests.ts similarity index 100% rename from src/setupTests.ts rename to app/src/setupTests.ts diff --git a/src/utils/diffBy.ts b/app/src/utils/diffBy.ts similarity index 100% rename from src/utils/diffBy.ts rename to app/src/utils/diffBy.ts diff --git a/src/utils/notNull.ts b/app/src/utils/notNull.ts similarity index 100% rename from src/utils/notNull.ts rename to app/src/utils/notNull.ts diff --git a/tailwind.config.js b/app/tailwind.config.js similarity index 100% rename from tailwind.config.js rename to app/tailwind.config.js diff --git a/app/tsconfig.json b/app/tsconfig.json new file mode 100644 index 0000000..924da70 --- /dev/null +++ b/app/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../tsconfig.base.json", + "include": ["src/**/*", "types/**/*"] +} diff --git a/flake.nix b/flake.nix index ddeeac6..18b710a 100644 --- a/flake.nix +++ b/flake.nix @@ -37,6 +37,7 @@ # add things you want in your shell here buildInputs = with pkgs; [ nodejs + nodePackages.pnpm ]; }; }); diff --git a/package.json b/package.json index f279328..9eb7085 100644 --- a/package.json +++ b/package.json @@ -2,42 +2,9 @@ "name": "beadi", "version": "0.0.3", "private": true, - "dependencies": { - "@testing-library/jest-dom": "^5.16.5", - "@testing-library/react": "^13.4.0", - "@testing-library/user-event": "^13.5.0", - "@types/jest": "^27.5.2", - "@types/node": "^16.18.3", - "@types/react": "^18.0.25", - "@types/react-dom": "^18.0.9", - "buttplug": "=3.1.1", - "clsx": "^1.2.1", - "file-saver": "^2.0.5", - "idb": "^7.1.1", - "immer": "^9.0.19", - "lodash": "^4.17.21", - "luxon": "^3.1.1", - "react": "^18.2.0", - "react-dnd": "^16.0.1", - "react-dnd-html5-backend": "^16.0.1", - "react-dom": "^18.2.0", - "react-icons": "^4.7.1", - "react-markdown": "^8.0.4", - "react-router-dom": "^6.14.1", - "react-scripts": "5.0.1", - "reactflow": "^11.3.2", - "swr": "^2.1.0", - "typescript": "^4.9.3", - "use-debounce": "^9.0.3", - "web-vitals": "^2.1.4", - "zustand": "^4.1.4" - }, "homepage": "https://beadi.onrender.com/", "scripts": { - "start": "craco start", - "build": "craco build", - "build:ci": "CI=true craco build", - "test": "craco test" + "preinstall": "npx only-allow pnpm" }, "eslintConfig": { "extends": [ @@ -58,14 +25,5 @@ ] }, "devDependencies": { - "@craco/craco": "^7.0.0", - "@types/file-saver": "^2.0.5", - "@types/lodash": "^4.14.191", - "@types/luxon": "^3.1.0", - "autoprefixer": "^10.4.13", - "gh-pages": "^4.0.0", - "postcss": "^8.4.19", - "tailwindcss": "^3.2.4", - "wasm-loader": "^1.3.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..fa0b736 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,10516 @@ +lockfileVersion: 5.4 + +importers: + + .: + specifiers: {} + + app: + specifiers: + '@craco/craco': ^7.0.0 + '@testing-library/jest-dom': ^5.16.5 + '@testing-library/react': ^13.4.0 + '@testing-library/user-event': ^13.5.0 + '@types/file-saver': ^2.0.5 + '@types/jest': ^27.5.2 + '@types/lodash': ^4.14.191 + '@types/luxon': ^3.1.0 + '@types/node': ^16.18.3 + '@types/react': ^18.0.25 + '@types/react-dom': ^18.0.9 + autoprefixer: ^10.4.13 + buttplug: '=3.1.1' + clsx: ^1.2.1 + file-saver: ^2.0.5 + gh-pages: ^4.0.0 + idb: ^7.1.1 + immer: ^9.0.19 + lodash: ^4.17.21 + luxon: ^3.1.1 + postcss: ^8.4.19 + react: ^18.2.0 + react-dnd: ^16.0.1 + react-dnd-html5-backend: ^16.0.1 + react-dom: ^18.2.0 + react-icons: ^4.7.1 + react-markdown: ^8.0.4 + react-router-dom: ^6.14.1 + react-scripts: 5.0.1 + reactflow: ^11.3.2 + swr: ^2.1.0 + tailwindcss: ^3.2.4 + typescript: ^4.9.3 + use-debounce: ^9.0.3 + wasm-loader: ^1.3.0 + web-vitals: ^2.1.4 + zustand: ^4.1.4 + dependencies: + '@testing-library/jest-dom': 5.17.0 + '@testing-library/react': 13.4.0_biqbaboplfbrettd7655fr4n2y + '@testing-library/user-event': 13.5.0 + '@types/jest': 27.5.2 + '@types/node': 16.18.40 + '@types/react': 18.2.20 + '@types/react-dom': 18.2.7 + buttplug: 3.1.1 + clsx: 1.2.1 + file-saver: 2.0.5 + idb: 7.1.1 + immer: 9.0.21 + lodash: 4.17.21 + luxon: 3.4.0 + react: 18.2.0 + react-dnd: 16.0.1_tmexzulqvmqns5ldwaibu3jqgu + react-dnd-html5-backend: 16.0.1 + react-dom: 18.2.0_react@18.2.0 + react-icons: 4.10.1_react@18.2.0 + react-markdown: 8.0.7_j3ahe22lw6ac2w6qvqp4kjqnqy + react-router-dom: 6.15.0_biqbaboplfbrettd7655fr4n2y + react-scripts: 5.0.1_j5ip3o3v6sktjzl5cxtjyfbuo4 + reactflow: 11.8.1_4jhe43xn235rpbr6wcgfu3576u + swr: 2.2.1_react@18.2.0 + typescript: 4.9.5 + use-debounce: 9.0.4_react@18.2.0 + web-vitals: 2.1.4 + zustand: 4.4.1_6r35cis3cdrdimxih7xf3am2py + devDependencies: + '@craco/craco': 7.1.0_emapjj4win3okqyvyzkcgvkhqy + '@types/file-saver': 2.0.5 + '@types/lodash': 4.14.197 + '@types/luxon': 3.3.1 + autoprefixer: 10.4.14_postcss@8.4.27 + gh-pages: 4.0.0 + postcss: 8.4.27 + tailwindcss: 3.3.3 + wasm-loader: 1.3.0 + +packages: + + /@aashutoshrathi/word-wrap/1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + + /@adobe/css-tools/4.3.0: + resolution: {integrity: sha512-+RNNcQvw2V1bmnBTPAtOLfW/9mhH2vC67+rUSi5T8EtEWt6lEnGNY2GuhZ1/YwbgikT1TkhvidCDmN5Q5YCo/w==} + dev: false + + /@alloc/quick-lru/5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + /@ampproject/remapping/2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + + /@apideck/better-ajv-errors/0.3.6_ajv@8.12.0: + resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} + engines: {node: '>=10'} + peerDependencies: + ajv: '>=8' + dependencies: + ajv: 8.12.0 + json-schema: 0.4.0 + jsonpointer: 5.0.1 + leven: 3.1.0 + + /@babel/code-frame/7.22.10: + resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.10 + chalk: 2.4.2 + + /@babel/compat-data/7.22.9: + resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} + engines: {node: '>=6.9.0'} + + /@babel/core/7.22.10: + resolution: {integrity: sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.10 + '@babel/generator': 7.22.10 + '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-module-transforms': 7.22.9_@babel+core@7.22.10 + '@babel/helpers': 7.22.10 + '@babel/parser': 7.22.10 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.10 + '@babel/types': 7.22.10 + convert-source-map: 1.9.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /@babel/eslint-parser/7.22.10_zyanktnjxrtfnufugapahvd75q: + resolution: {integrity: sha512-0J8DNPRXQRLeR9rPaUMM3fA+RbixjnVLe/MRMYCkp3hzgsSuxCHQ8NN8xQG1wIHKJ4a1DTROTvFJdW+B5/eOsg==} + engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} + peerDependencies: + '@babel/core': ^7.11.0 + eslint: ^7.5.0 || ^8.0.0 + dependencies: + '@babel/core': 7.22.10 + '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 + eslint: 8.47.0 + eslint-visitor-keys: 2.1.0 + semver: 6.3.1 + + /@babel/generator/7.22.10: + resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.10 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + jsesc: 2.5.2 + + /@babel/helper-annotate-as-pure/7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.10 + + /@babel/helper-builder-binary-assignment-operator-visitor/7.22.10: + resolution: {integrity: sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.10 + + /@babel/helper-compilation-targets/7.22.10: + resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.22.9 + '@babel/helper-validator-option': 7.22.5 + browserslist: 4.21.10 + lru-cache: 5.1.1 + semver: 6.3.1 + + /@babel/helper-create-class-features-plugin/7.22.10_@babel+core@7.22.10: + resolution: {integrity: sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-member-expression-to-functions': 7.22.5 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.9_@babel+core@7.22.10 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + + /@babel/helper-create-regexp-features-plugin/7.22.9_@babel+core@7.22.10: + resolution: {integrity: sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-annotate-as-pure': 7.22.5 + regexpu-core: 5.3.2 + semver: 6.3.1 + + /@babel/helper-define-polyfill-provider/0.4.2_@babel+core@7.22.10: + resolution: {integrity: sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.4 + transitivePeerDependencies: + - supports-color + + /@babel/helper-environment-visitor/7.22.5: + resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} + engines: {node: '>=6.9.0'} + + /@babel/helper-function-name/7.22.5: + resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.5 + '@babel/types': 7.22.10 + + /@babel/helper-hoist-variables/7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.10 + + /@babel/helper-member-expression-to-functions/7.22.5: + resolution: {integrity: sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.10 + + /@babel/helper-module-imports/7.22.5: + resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.10 + + /@babel/helper-module-transforms/7.22.9_@babel+core@7.22.10: + resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.5 + + /@babel/helper-optimise-call-expression/7.22.5: + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.10 + + /@babel/helper-plugin-utils/7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + + /@babel/helper-remap-async-to-generator/7.22.9_@babel+core@7.22.10: + resolution: {integrity: sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-wrap-function': 7.22.10 + + /@babel/helper-replace-supers/7.22.9_@babel+core@7.22.10: + resolution: {integrity: sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-member-expression-to-functions': 7.22.5 + '@babel/helper-optimise-call-expression': 7.22.5 + + /@babel/helper-simple-access/7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.10 + + /@babel/helper-skip-transparent-expression-wrappers/7.22.5: + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.10 + + /@babel/helper-split-export-declaration/7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.10 + + /@babel/helper-string-parser/7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier/7.22.5: + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option/7.22.5: + resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} + engines: {node: '>=6.9.0'} + + /@babel/helper-wrap-function/7.22.10: + resolution: {integrity: sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-function-name': 7.22.5 + '@babel/template': 7.22.5 + '@babel/types': 7.22.10 + + /@babel/helpers/7.22.10: + resolution: {integrity: sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.10 + '@babel/types': 7.22.10 + transitivePeerDependencies: + - supports-color + + /@babel/highlight/7.22.10: + resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + + /@babel/parser/7.22.10: + resolution: {integrity: sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.22.10 + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-transform-optional-chaining': 7.22.10_@babel+core@7.22.10 + + /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.22.10: + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-create-class-features-plugin': 7.22.10_@babel+core@7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-proposal-decorators/7.22.10_@babel+core@7.22.10: + resolution: {integrity: sha512-KxN6TqZzcFi4uD3UifqXElBTBNLAEH1l3vzMQj6JwJZbL2sZlThxSViOKCYY+4Ah4V4JhQ95IVB7s/Y6SJSlMQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-create-class-features-plugin': 7.22.10_@babel+core@7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.9_@babel+core@7.22.10 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/plugin-syntax-decorators': 7.22.10_@babel+core@7.22.10 + + /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.22.10: + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.22.10 + + /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.22.10: + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.22.10 + + /@babel/plugin-proposal-optional-chaining/7.21.0_@babel+core@7.22.10: + resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.22.10 + + /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.22.10: + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-create-class-features-plugin': 7.22.10_@babel+core@7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-proposal-private-property-in-object/7.21.0-placeholder-for-preset-env.2_@babel+core@7.22.10: + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + + /@babel/plugin-proposal-private-property-in-object/7.21.11_@babel+core@7.22.10: + resolution: {integrity: sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.10_@babel+core@7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.22.10 + + /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.22.10: + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.22.10: + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.22.10: + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.22.10: + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-decorators/7.22.10_@babel+core@7.22.10: + resolution: {integrity: sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.22.10: + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.22.10: + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-flow/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-import-assertions/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-import-attributes/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.22.10: + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.22.10: + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-jsx/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.22.10: + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.22.10: + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.22.10: + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.22.10: + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.22.10: + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.22.10: + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.22.10: + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.22.10: + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-typescript/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-unicode-sets-regex/7.18.6_@babel+core@7.22.10: + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-create-regexp-features-plugin': 7.22.9_@babel+core@7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-arrow-functions/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-async-generator-functions/7.22.10_@babel+core@7.22.10: + resolution: {integrity: sha512-eueE8lvKVzq5wIObKK/7dvoeKJ+xc6TvRn6aysIjS6pSCeLy7S/eVi7pEQknZqyqvzaNKdDtem8nUNTBgDVR2g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.9_@babel+core@7.22.10 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.22.10 + + /@babel/plugin-transform-async-to-generator/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.9_@babel+core@7.22.10 + + /@babel/plugin-transform-block-scoped-functions/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-block-scoping/7.22.10_@babel+core@7.22.10: + resolution: {integrity: sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-class-properties/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-create-class-features-plugin': 7.22.10_@babel+core@7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-class-static-block/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-create-class-features-plugin': 7.22.10_@babel+core@7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.22.10 + + /@babel/plugin-transform-classes/7.22.6_@babel+core@7.22.10: + resolution: {integrity: sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.9_@babel+core@7.22.10 + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 + + /@babel/plugin-transform-computed-properties/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/template': 7.22.5 + + /@babel/plugin-transform-destructuring/7.22.10_@babel+core@7.22.10: + resolution: {integrity: sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-dotall-regex/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-create-regexp-features-plugin': 7.22.9_@babel+core@7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-duplicate-keys/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-dynamic-import/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.22.10 + + /@babel/plugin-transform-exponentiation-operator/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-export-namespace-from/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.22.10 + + /@babel/plugin-transform-flow-strip-types/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-flow': 7.22.5_@babel+core@7.22.10 + + /@babel/plugin-transform-for-of/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-function-name/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-json-strings/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.22.10 + + /@babel/plugin-transform-literals/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-logical-assignment-operators/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.22.10 + + /@babel/plugin-transform-member-expression-literals/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-modules-amd/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-module-transforms': 7.22.9_@babel+core@7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-modules-commonjs/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-module-transforms': 7.22.9_@babel+core@7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + + /@babel/plugin-transform-modules-systemjs/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.22.9_@babel+core@7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 + + /@babel/plugin-transform-modules-umd/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-module-transforms': 7.22.9_@babel+core@7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-named-capturing-groups-regex/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-create-regexp-features-plugin': 7.22.9_@babel+core@7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-new-target/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-nullish-coalescing-operator/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.22.10 + + /@babel/plugin-transform-numeric-separator/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.22.10 + + /@babel/plugin-transform-object-rest-spread/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.22.9 + '@babel/core': 7.22.10 + '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.22.10 + '@babel/plugin-transform-parameters': 7.22.5_@babel+core@7.22.10 + + /@babel/plugin-transform-object-super/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.9_@babel+core@7.22.10 + + /@babel/plugin-transform-optional-catch-binding/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.22.10 + + /@babel/plugin-transform-optional-chaining/7.22.10_@babel+core@7.22.10: + resolution: {integrity: sha512-MMkQqZAZ+MGj+jGTG3OTuhKeBpNcO+0oCEbrGNEaOmiEn+1MzRyQlYsruGiU8RTK3zV6XwrVJTmwiDOyYK6J9g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.22.10 + + /@babel/plugin-transform-parameters/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-private-methods/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-create-class-features-plugin': 7.22.10_@babel+core@7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-private-property-in-object/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.10_@babel+core@7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.22.10 + + /@babel/plugin-transform-property-literals/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-react-constant-elements/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-react-display-name/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-react-jsx-development/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/plugin-transform-react-jsx': 7.22.5_@babel+core@7.22.10 + + /@babel/plugin-transform-react-jsx/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-jsx': 7.22.5_@babel+core@7.22.10 + '@babel/types': 7.22.10 + + /@babel/plugin-transform-react-pure-annotations/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-regenerator/7.22.10_@babel+core@7.22.10: + resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + regenerator-transform: 0.15.2 + + /@babel/plugin-transform-reserved-words/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-runtime/7.22.10_@babel+core@7.22.10: + resolution: {integrity: sha512-RchI7HePu1eu0CYNKHHHQdfenZcM4nz8rew5B1VWqeRKdcwW5aQ5HeG9eTUbWiAS1UrmHVLmoxTWHt3iLD/NhA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + babel-plugin-polyfill-corejs2: 0.4.5_@babel+core@7.22.10 + babel-plugin-polyfill-corejs3: 0.8.3_@babel+core@7.22.10 + babel-plugin-polyfill-regenerator: 0.5.2_@babel+core@7.22.10 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /@babel/plugin-transform-shorthand-properties/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-spread/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + + /@babel/plugin-transform-sticky-regex/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-template-literals/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-typeof-symbol/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-typescript/7.22.10_@babel+core@7.22.10: + resolution: {integrity: sha512-7++c8I/ymsDo4QQBAgbraXLzIM6jmfao11KgIBEYZRReWzNWH9NtNgJcyrZiXsOPh523FQm6LfpLyy/U5fn46A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.10_@babel+core@7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-typescript': 7.22.5_@babel+core@7.22.10 + + /@babel/plugin-transform-unicode-escapes/7.22.10_@babel+core@7.22.10: + resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-unicode-property-regex/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-create-regexp-features-plugin': 7.22.9_@babel+core@7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-unicode-regex/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-create-regexp-features-plugin': 7.22.9_@babel+core@7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-unicode-sets-regex/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-create-regexp-features-plugin': 7.22.9_@babel+core@7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/preset-env/7.22.10_@babel+core@7.22.10: + resolution: {integrity: sha512-riHpLb1drNkpLlocmSyEg4oYJIQFeXAK/d7rI6mbD0XsvoTOOweXDmQPG/ErxsEhWk3rl3Q/3F6RFQlVFS8m0A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.22.9 + '@babel/core': 7.22.10 + '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.5 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2_@babel+core@7.22.10 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.22.10 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.22.10 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.22.10 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.22.10 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.22.10 + '@babel/plugin-syntax-import-assertions': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-syntax-import-attributes': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.22.10 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.22.10 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.22.10 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.22.10 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.22.10 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.22.10 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.22.10 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.22.10 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.22.10 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.22.10 + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6_@babel+core@7.22.10 + '@babel/plugin-transform-arrow-functions': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-async-generator-functions': 7.22.10_@babel+core@7.22.10 + '@babel/plugin-transform-async-to-generator': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-block-scoped-functions': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-block-scoping': 7.22.10_@babel+core@7.22.10 + '@babel/plugin-transform-class-properties': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-class-static-block': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-classes': 7.22.6_@babel+core@7.22.10 + '@babel/plugin-transform-computed-properties': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-destructuring': 7.22.10_@babel+core@7.22.10 + '@babel/plugin-transform-dotall-regex': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-duplicate-keys': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-dynamic-import': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-exponentiation-operator': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-export-namespace-from': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-for-of': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-function-name': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-json-strings': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-literals': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-logical-assignment-operators': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-member-expression-literals': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-modules-amd': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-modules-commonjs': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-modules-systemjs': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-modules-umd': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-new-target': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-nullish-coalescing-operator': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-numeric-separator': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-object-rest-spread': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-object-super': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-optional-catch-binding': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-optional-chaining': 7.22.10_@babel+core@7.22.10 + '@babel/plugin-transform-parameters': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-private-methods': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-private-property-in-object': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-property-literals': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-regenerator': 7.22.10_@babel+core@7.22.10 + '@babel/plugin-transform-reserved-words': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-shorthand-properties': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-spread': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-sticky-regex': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-template-literals': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-typeof-symbol': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-unicode-escapes': 7.22.10_@babel+core@7.22.10 + '@babel/plugin-transform-unicode-property-regex': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-unicode-regex': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-unicode-sets-regex': 7.22.5_@babel+core@7.22.10 + '@babel/preset-modules': 0.1.6-no-external-plugins_@babel+core@7.22.10 + '@babel/types': 7.22.10 + babel-plugin-polyfill-corejs2: 0.4.5_@babel+core@7.22.10 + babel-plugin-polyfill-corejs3: 0.8.3_@babel+core@7.22.10 + babel-plugin-polyfill-regenerator: 0.5.2_@babel+core@7.22.10 + core-js-compat: 3.32.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /@babel/preset-modules/0.1.6-no-external-plugins_@babel+core@7.22.10: + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/types': 7.22.10 + esutils: 2.0.3 + + /@babel/preset-react/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.5 + '@babel/plugin-transform-react-display-name': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-react-jsx': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-react-jsx-development': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-react-pure-annotations': 7.22.5_@babel+core@7.22.10 + + /@babel/preset-typescript/7.22.5_@babel+core@7.22.10: + resolution: {integrity: sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.5 + '@babel/plugin-syntax-jsx': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-modules-commonjs': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-typescript': 7.22.10_@babel+core@7.22.10 + + /@babel/regjsgen/0.8.0: + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + + /@babel/runtime/7.22.10: + resolution: {integrity: sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.0 + + /@babel/template/7.22.5: + resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.10 + '@babel/parser': 7.22.10 + '@babel/types': 7.22.10 + + /@babel/traverse/7.22.10: + resolution: {integrity: sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.10 + '@babel/generator': 7.22.10 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.22.10 + '@babel/types': 7.22.10 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + /@babel/types/7.22.10: + resolution: {integrity: sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 + to-fast-properties: 2.0.0 + + /@bcoe/v8-coverage/0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + /@craco/craco/7.1.0_emapjj4win3okqyvyzkcgvkhqy: + resolution: {integrity: sha512-oRAcPIKYrfPXp9rSzlsDNeOaVtDiKhoyqSXUoqiK24jCkHr4T8m/a2f74yXIzCbIheoUWDOIfWZyRgFgT+cpqA==} + engines: {node: '>=6'} + hasBin: true + peerDependencies: + react-scripts: ^5.0.0 + dependencies: + autoprefixer: 10.4.14_postcss@8.4.27 + cosmiconfig: 7.1.0 + cosmiconfig-typescript-loader: 1.0.9_osiawaesgot4tuqtrzm2bzteda + cross-spawn: 7.0.3 + lodash: 4.17.21 + react-scripts: 5.0.1_j5ip3o3v6sktjzl5cxtjyfbuo4 + semver: 7.5.4 + webpack-merge: 5.9.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - postcss + - typescript + dev: true + + /@cspotcode/source-map-support/0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: true + + /@csstools/normalize.css/12.0.0: + resolution: {integrity: sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==} + + /@csstools/postcss-cascade-layers/1.1.1_postcss@8.4.27: + resolution: {integrity: sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + '@csstools/selector-specificity': 2.2.0_c3vcbepomgmxc74cgtawpgpkyi + postcss: 8.4.27 + postcss-selector-parser: 6.0.13 + + /@csstools/postcss-color-function/1.1.1_postcss@8.4.27: + resolution: {integrity: sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.27 + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /@csstools/postcss-font-format-keywords/1.0.1_postcss@8.4.27: + resolution: {integrity: sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /@csstools/postcss-hwb-function/1.0.2_postcss@8.4.27: + resolution: {integrity: sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /@csstools/postcss-ic-unit/1.0.1_postcss@8.4.27: + resolution: {integrity: sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.27 + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /@csstools/postcss-is-pseudo-class/2.0.7_postcss@8.4.27: + resolution: {integrity: sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + '@csstools/selector-specificity': 2.2.0_c3vcbepomgmxc74cgtawpgpkyi + postcss: 8.4.27 + postcss-selector-parser: 6.0.13 + + /@csstools/postcss-nested-calc/1.0.0_postcss@8.4.27: + resolution: {integrity: sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /@csstools/postcss-normalize-display-values/1.0.1_postcss@8.4.27: + resolution: {integrity: sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /@csstools/postcss-oklab-function/1.1.1_postcss@8.4.27: + resolution: {integrity: sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.27 + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /@csstools/postcss-progressive-custom-properties/1.3.0_postcss@8.4.27: + resolution: {integrity: sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.3 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /@csstools/postcss-stepped-value-functions/1.0.1_postcss@8.4.27: + resolution: {integrity: sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /@csstools/postcss-text-decoration-shorthand/1.0.0_postcss@8.4.27: + resolution: {integrity: sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /@csstools/postcss-trigonometric-functions/1.0.2_postcss@8.4.27: + resolution: {integrity: sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==} + engines: {node: ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /@csstools/postcss-unset-value/1.0.2_postcss@8.4.27: + resolution: {integrity: sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.27 + + /@csstools/selector-specificity/2.2.0_c3vcbepomgmxc74cgtawpgpkyi: + resolution: {integrity: sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss-selector-parser: ^6.0.10 + dependencies: + postcss-selector-parser: 6.0.13 + + /@eslint-community/eslint-utils/4.4.0_eslint@8.47.0: + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.47.0 + eslint-visitor-keys: 3.4.3 + + /@eslint-community/regexpp/4.6.2: + resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + /@eslint/eslintrc/2.1.2: + resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.21.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + /@eslint/js/8.47.0: + resolution: {integrity: sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + /@humanwhocodes/config-array/0.11.10: + resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + /@humanwhocodes/module-importer/1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + /@humanwhocodes/object-schema/1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + + /@istanbuljs/load-nyc-config/1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + + /@istanbuljs/schema/0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + /@jest/console/27.5.1: + resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 16.18.40 + chalk: 4.1.2 + jest-message-util: 27.5.1 + jest-util: 27.5.1 + slash: 3.0.0 + + /@jest/console/28.1.3: + resolution: {integrity: sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.3 + '@types/node': 16.18.40 + chalk: 4.1.2 + jest-message-util: 28.1.3 + jest-util: 28.1.3 + slash: 3.0.0 + + /@jest/core/27.5.1: + resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 27.5.1 + '@jest/reporters': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 16.18.40 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.8.1 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 27.5.1 + jest-config: 27.5.1 + jest-haste-map: 27.5.1 + jest-message-util: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-resolve-dependencies: 27.5.1 + jest-runner: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + jest-watcher: 27.5.1 + micromatch: 4.0.5 + rimraf: 3.0.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + + /@jest/environment/27.5.1: + resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 16.18.40 + jest-mock: 27.5.1 + + /@jest/fake-timers/27.5.1: + resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@sinonjs/fake-timers': 8.1.0 + '@types/node': 16.18.40 + jest-message-util: 27.5.1 + jest-mock: 27.5.1 + jest-util: 27.5.1 + + /@jest/globals/27.5.1: + resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/types': 27.5.1 + expect: 27.5.1 + + /@jest/reporters/27.5.1: + resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 16.18.40 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-instrument: 5.2.1 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.6 + jest-haste-map: 27.5.1 + jest-resolve: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + slash: 3.0.0 + source-map: 0.6.1 + string-length: 4.0.2 + terminal-link: 2.1.1 + v8-to-istanbul: 8.1.1 + transitivePeerDependencies: + - supports-color + + /@jest/schemas/28.1.3: + resolution: {integrity: sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@sinclair/typebox': 0.24.51 + + /@jest/source-map/27.5.1: + resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + callsites: 3.1.0 + graceful-fs: 4.2.11 + source-map: 0.6.1 + + /@jest/test-result/27.5.1: + resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/console': 27.5.1 + '@jest/types': 27.5.1 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.2 + + /@jest/test-result/28.1.3: + resolution: {integrity: sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/console': 28.1.3 + '@jest/types': 28.1.3 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.2 + + /@jest/test-sequencer/27.5.1: + resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/test-result': 27.5.1 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-runtime: 27.5.1 + transitivePeerDependencies: + - supports-color + + /@jest/transform/27.5.1: + resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/core': 7.22.10 + '@jest/types': 27.5.1 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 1.9.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-regex-util: 27.5.1 + jest-util: 27.5.1 + micromatch: 4.0.5 + pirates: 4.0.6 + slash: 3.0.0 + source-map: 0.6.1 + write-file-atomic: 3.0.3 + transitivePeerDependencies: + - supports-color + + /@jest/types/27.5.1: + resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 16.18.40 + '@types/yargs': 16.0.5 + chalk: 4.1.2 + + /@jest/types/28.1.3: + resolution: {integrity: sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/schemas': 28.1.3 + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 16.18.40 + '@types/yargs': 17.0.24 + chalk: 4.1.2 + + /@jridgewell/gen-mapping/0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.19 + + /@jridgewell/resolve-uri/3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array/1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/source-map/0.3.5: + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + + /@jridgewell/sourcemap-codec/1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping/0.3.19: + resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + + /@jridgewell/trace-mapping/0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@leichtgewicht/ip-codec/2.0.4: + resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} + + /@nicolo-ribaudo/eslint-scope-5-internals/5.1.1-v1: + resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} + dependencies: + eslint-scope: 5.1.1 + + /@nodelib/fs.scandir/2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat/2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + /@nodelib/fs.walk/1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + + /@pmmmwh/react-refresh-webpack-plugin/0.5.10_yzxi3427mpmymp2edesmoixdua: + resolution: {integrity: sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==} + engines: {node: '>= 10.13'} + peerDependencies: + '@types/webpack': 4.x || 5.x + react-refresh: '>=0.10.0 <1.0.0' + sockjs-client: ^1.4.0 + type-fest: '>=0.17.0 <4.0.0' + webpack: '>=4.43.0 <6.0.0' + webpack-dev-server: 3.x || 4.x + webpack-hot-middleware: 2.x + webpack-plugin-serve: 0.x || 1.x + peerDependenciesMeta: + '@types/webpack': + optional: true + sockjs-client: + optional: true + type-fest: + optional: true + webpack-dev-server: + optional: true + webpack-hot-middleware: + optional: true + webpack-plugin-serve: + optional: true + dependencies: + ansi-html-community: 0.0.8 + common-path-prefix: 3.0.0 + core-js-pure: 3.32.0 + error-stack-parser: 2.1.4 + find-up: 5.0.0 + html-entities: 2.4.0 + loader-utils: 2.0.4 + react-refresh: 0.11.0 + schema-utils: 3.3.0 + source-map: 0.7.4 + webpack: 5.88.2 + webpack-dev-server: 4.15.1_webpack@5.88.2 + + /@react-dnd/asap/5.0.2: + resolution: {integrity: sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A==} + dev: false + + /@react-dnd/invariant/4.0.2: + resolution: {integrity: sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw==} + dev: false + + /@react-dnd/shallowequal/4.0.2: + resolution: {integrity: sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA==} + dev: false + + /@reactflow/background/11.2.6_4jhe43xn235rpbr6wcgfu3576u: + resolution: {integrity: sha512-SoBArxNk/NygB6ztCR2RWVcx7yRh+zuSKh37bLbW+hdFcTx6ZgC4vs5+HX2xGY9ZIyR9ipg4Z3+l11ubyzr/lw==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + dependencies: + '@reactflow/core': 11.8.1_4jhe43xn235rpbr6wcgfu3576u + classcat: 5.0.4 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + zustand: 4.4.1_6r35cis3cdrdimxih7xf3am2py + transitivePeerDependencies: + - '@types/react' + - immer + dev: false + + /@reactflow/controls/11.1.17_4jhe43xn235rpbr6wcgfu3576u: + resolution: {integrity: sha512-iMMuTwF5QEqlgqKr+3wg3YS0wyEQOX2DV1AQJUaZ9WSW17cjH/pH1B7iNAS1giWyyvpYvd1HiXG2zpJIS/NQDg==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + dependencies: + '@reactflow/core': 11.8.1_4jhe43xn235rpbr6wcgfu3576u + classcat: 5.0.4 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + zustand: 4.4.1_6r35cis3cdrdimxih7xf3am2py + transitivePeerDependencies: + - '@types/react' + - immer + dev: false + + /@reactflow/core/11.8.1_4jhe43xn235rpbr6wcgfu3576u: + resolution: {integrity: sha512-Ob/21U3Wnugq10zbBESwUxH6NMBoJGvBmJdLJB8ux/w4mzGUMxTR78gFXAsPGsuO3J/pf9MVMPrhTsPA0rApCw==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + dependencies: + '@types/d3': 7.4.0 + '@types/d3-drag': 3.0.2 + '@types/d3-selection': 3.0.5 + '@types/d3-zoom': 3.0.3 + classcat: 5.0.4 + d3-drag: 3.0.0 + d3-selection: 3.0.0 + d3-zoom: 3.0.0 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + zustand: 4.4.1_6r35cis3cdrdimxih7xf3am2py + transitivePeerDependencies: + - '@types/react' + - immer + dev: false + + /@reactflow/minimap/11.6.1_4jhe43xn235rpbr6wcgfu3576u: + resolution: {integrity: sha512-158m6x0f7es5cmmkfhZYVNI7Yc5gxo+9aHqNDFwu9SR5HeyOU5ezJ6CDsSdHuM6xUNq3kXY1f0Ds6YxvyfRmGg==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + dependencies: + '@reactflow/core': 11.8.1_4jhe43xn235rpbr6wcgfu3576u + '@types/d3-selection': 3.0.5 + '@types/d3-zoom': 3.0.3 + classcat: 5.0.4 + d3-selection: 3.0.0 + d3-zoom: 3.0.0 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + zustand: 4.4.1_6r35cis3cdrdimxih7xf3am2py + transitivePeerDependencies: + - '@types/react' + - immer + dev: false + + /@reactflow/node-resizer/2.1.3_4jhe43xn235rpbr6wcgfu3576u: + resolution: {integrity: sha512-wwEcftxG4BBQGpIfPdsSyDTM5XxwXBkihcoVJRY92t71qNi9CzSuX1xoFO2jvP8thwk8MiWdppVuCKs+1QVAXA==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + dependencies: + '@reactflow/core': 11.8.1_4jhe43xn235rpbr6wcgfu3576u + classcat: 5.0.4 + d3-drag: 3.0.0 + d3-selection: 3.0.0 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + zustand: 4.4.1_6r35cis3cdrdimxih7xf3am2py + transitivePeerDependencies: + - '@types/react' + - immer + dev: false + + /@reactflow/node-toolbar/1.2.5_4jhe43xn235rpbr6wcgfu3576u: + resolution: {integrity: sha512-VrnlzumrnTYGhX5CDylSuPgONexTbI5rnnI+NJWeW+9LXm1mkn3A9DUbIn3jWKcBYdzKW8GPyuPFzaCw0EyVZw==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + dependencies: + '@reactflow/core': 11.8.1_4jhe43xn235rpbr6wcgfu3576u + classcat: 5.0.4 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + zustand: 4.4.1_6r35cis3cdrdimxih7xf3am2py + transitivePeerDependencies: + - '@types/react' + - immer + dev: false + + /@remix-run/router/1.8.0: + resolution: {integrity: sha512-mrfKqIHnSZRyIzBcanNJmVQELTnX+qagEDlcKO90RgRBVOZGSGvZKeDihTRfWcqoDn5N/NkUcwWTccnpN18Tfg==} + engines: {node: '>=14.0.0'} + dev: false + + /@rollup/plugin-babel/5.3.1_vdsg3cryjz3q3k3s4sc37bag2u: + resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} + engines: {node: '>= 10.0.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/babel__core': ^7.1.9 + rollup: ^1.20.0||^2.0.0 + peerDependenciesMeta: + '@types/babel__core': + optional: true + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-module-imports': 7.22.5 + '@rollup/pluginutils': 3.1.0_rollup@2.79.1 + rollup: 2.79.1 + + /@rollup/plugin-node-resolve/11.2.1_rollup@2.79.1: + resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} + engines: {node: '>= 10.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0_rollup@2.79.1 + '@types/resolve': 1.17.1 + builtin-modules: 3.3.0 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.4 + rollup: 2.79.1 + + /@rollup/plugin-replace/2.4.2_rollup@2.79.1: + resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0_rollup@2.79.1 + magic-string: 0.25.9 + rollup: 2.79.1 + + /@rollup/pluginutils/3.1.0_rollup@2.79.1: + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.3.1 + rollup: 2.79.1 + + /@rushstack/eslint-patch/1.3.3: + resolution: {integrity: sha512-0xd7qez0AQ+MbHatZTlI1gu5vkG8r7MYRUJAHPAHJBmGLs16zpkrpAVLvjQKQOqaXPDUBwOiJzNc00znHSCVBw==} + + /@sinclair/typebox/0.24.51: + resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} + + /@sinonjs/commons/1.8.6: + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + dependencies: + type-detect: 4.0.8 + + /@sinonjs/fake-timers/8.1.0: + resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} + dependencies: + '@sinonjs/commons': 1.8.6 + + /@surma/rollup-plugin-off-main-thread/2.2.3: + resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} + dependencies: + ejs: 3.1.9 + json5: 2.2.3 + magic-string: 0.25.9 + string.prototype.matchall: 4.0.8 + + /@svgr/babel-plugin-add-jsx-attribute/5.4.0: + resolution: {integrity: sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==} + engines: {node: '>=10'} + + /@svgr/babel-plugin-remove-jsx-attribute/5.4.0: + resolution: {integrity: sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==} + engines: {node: '>=10'} + + /@svgr/babel-plugin-remove-jsx-empty-expression/5.0.1: + resolution: {integrity: sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==} + engines: {node: '>=10'} + + /@svgr/babel-plugin-replace-jsx-attribute-value/5.0.1: + resolution: {integrity: sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==} + engines: {node: '>=10'} + + /@svgr/babel-plugin-svg-dynamic-title/5.4.0: + resolution: {integrity: sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==} + engines: {node: '>=10'} + + /@svgr/babel-plugin-svg-em-dimensions/5.4.0: + resolution: {integrity: sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==} + engines: {node: '>=10'} + + /@svgr/babel-plugin-transform-react-native-svg/5.4.0: + resolution: {integrity: sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==} + engines: {node: '>=10'} + + /@svgr/babel-plugin-transform-svg-component/5.5.0: + resolution: {integrity: sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==} + engines: {node: '>=10'} + + /@svgr/babel-preset/5.5.0: + resolution: {integrity: sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==} + engines: {node: '>=10'} + dependencies: + '@svgr/babel-plugin-add-jsx-attribute': 5.4.0 + '@svgr/babel-plugin-remove-jsx-attribute': 5.4.0 + '@svgr/babel-plugin-remove-jsx-empty-expression': 5.0.1 + '@svgr/babel-plugin-replace-jsx-attribute-value': 5.0.1 + '@svgr/babel-plugin-svg-dynamic-title': 5.4.0 + '@svgr/babel-plugin-svg-em-dimensions': 5.4.0 + '@svgr/babel-plugin-transform-react-native-svg': 5.4.0 + '@svgr/babel-plugin-transform-svg-component': 5.5.0 + + /@svgr/core/5.5.0: + resolution: {integrity: sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==} + engines: {node: '>=10'} + dependencies: + '@svgr/plugin-jsx': 5.5.0 + camelcase: 6.3.0 + cosmiconfig: 7.1.0 + transitivePeerDependencies: + - supports-color + + /@svgr/hast-util-to-babel-ast/5.5.0: + resolution: {integrity: sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==} + engines: {node: '>=10'} + dependencies: + '@babel/types': 7.22.10 + + /@svgr/plugin-jsx/5.5.0: + resolution: {integrity: sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==} + engines: {node: '>=10'} + dependencies: + '@babel/core': 7.22.10 + '@svgr/babel-preset': 5.5.0 + '@svgr/hast-util-to-babel-ast': 5.5.0 + svg-parser: 2.0.4 + transitivePeerDependencies: + - supports-color + + /@svgr/plugin-svgo/5.5.0: + resolution: {integrity: sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==} + engines: {node: '>=10'} + dependencies: + cosmiconfig: 7.1.0 + deepmerge: 4.3.1 + svgo: 1.3.2 + + /@svgr/webpack/5.5.0: + resolution: {integrity: sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==} + engines: {node: '>=10'} + dependencies: + '@babel/core': 7.22.10 + '@babel/plugin-transform-react-constant-elements': 7.22.5_@babel+core@7.22.10 + '@babel/preset-env': 7.22.10_@babel+core@7.22.10 + '@babel/preset-react': 7.22.5_@babel+core@7.22.10 + '@svgr/core': 5.5.0 + '@svgr/plugin-jsx': 5.5.0 + '@svgr/plugin-svgo': 5.5.0 + loader-utils: 2.0.4 + transitivePeerDependencies: + - supports-color + + /@testing-library/dom/8.20.1: + resolution: {integrity: sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==} + engines: {node: '>=12'} + dependencies: + '@babel/code-frame': 7.22.10 + '@babel/runtime': 7.22.10 + '@types/aria-query': 5.0.1 + aria-query: 5.1.3 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + dev: false + + /@testing-library/jest-dom/5.17.0: + resolution: {integrity: sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==} + engines: {node: '>=8', npm: '>=6', yarn: '>=1'} + dependencies: + '@adobe/css-tools': 4.3.0 + '@babel/runtime': 7.22.10 + '@types/testing-library__jest-dom': 5.14.9 + aria-query: 5.3.0 + chalk: 3.0.0 + css.escape: 1.5.1 + dom-accessibility-api: 0.5.16 + lodash: 4.17.21 + redent: 3.0.0 + dev: false + + /@testing-library/react/13.4.0_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==} + engines: {node: '>=12'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@babel/runtime': 7.22.10 + '@testing-library/dom': 8.20.1 + '@types/react-dom': 18.2.7 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + dev: false + + /@testing-library/user-event/13.5.0: + resolution: {integrity: sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==} + engines: {node: '>=10', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' + dependencies: + '@babel/runtime': 7.22.10 + dev: false + + /@tootallnate/once/1.1.2: + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + + /@trysound/sax/0.2.0: + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + + /@tsconfig/node10/1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + dev: true + + /@tsconfig/node12/1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: true + + /@tsconfig/node14/1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: true + + /@tsconfig/node16/1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + dev: true + + /@types/aria-query/5.0.1: + resolution: {integrity: sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==} + dev: false + + /@types/babel__core/7.20.1: + resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} + dependencies: + '@babel/parser': 7.22.10 + '@babel/types': 7.22.10 + '@types/babel__generator': 7.6.4 + '@types/babel__template': 7.4.1 + '@types/babel__traverse': 7.20.1 + + /@types/babel__generator/7.6.4: + resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} + dependencies: + '@babel/types': 7.22.10 + + /@types/babel__template/7.4.1: + resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} + dependencies: + '@babel/parser': 7.22.10 + '@babel/types': 7.22.10 + + /@types/babel__traverse/7.20.1: + resolution: {integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==} + dependencies: + '@babel/types': 7.22.10 + + /@types/body-parser/1.19.2: + resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} + dependencies: + '@types/connect': 3.4.35 + '@types/node': 16.18.40 + + /@types/bonjour/3.5.10: + resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==} + dependencies: + '@types/node': 16.18.40 + + /@types/connect-history-api-fallback/1.5.0: + resolution: {integrity: sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==} + dependencies: + '@types/express-serve-static-core': 4.17.35 + '@types/node': 16.18.40 + + /@types/connect/3.4.35: + resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} + dependencies: + '@types/node': 16.18.40 + + /@types/d3-array/3.0.5: + resolution: {integrity: sha512-Qk7fpJ6qFp+26VeQ47WY0mkwXaiq8+76RJcncDEfMc2ocRzXLO67bLFRNI4OX1aGBoPzsM5Y2T+/m1pldOgD+A==} + dev: false + + /@types/d3-axis/3.0.2: + resolution: {integrity: sha512-uGC7DBh0TZrU/LY43Fd8Qr+2ja1FKmH07q2FoZFHo1eYl8aj87GhfVoY1saJVJiq24rp1+wpI6BvQJMKgQm8oA==} + dependencies: + '@types/d3-selection': 3.0.5 + dev: false + + /@types/d3-brush/3.0.2: + resolution: {integrity: sha512-2TEm8KzUG3N7z0TrSKPmbxByBx54M+S9lHoP2J55QuLU0VSQ9mE96EJSAOVNEqd1bbynMjeTS9VHmz8/bSw8rA==} + dependencies: + '@types/d3-selection': 3.0.5 + dev: false + + /@types/d3-chord/3.0.2: + resolution: {integrity: sha512-abT/iLHD3sGZwqMTX1TYCMEulr+wBd0SzyOQnjYNLp7sngdOHYtNkMRI5v3w5thoN+BWtlHVDx2Osvq6fxhZWw==} + dev: false + + /@types/d3-color/3.1.0: + resolution: {integrity: sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==} + dev: false + + /@types/d3-contour/3.0.2: + resolution: {integrity: sha512-k6/bGDoAGJZnZWaKzeB+9glgXCYGvh6YlluxzBREiVo8f/X2vpTEdgPy9DN7Z2i42PZOZ4JDhVdlTSTSkLDPlQ==} + dependencies: + '@types/d3-array': 3.0.5 + '@types/geojson': 7946.0.10 + dev: false + + /@types/d3-delaunay/6.0.1: + resolution: {integrity: sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==} + dev: false + + /@types/d3-dispatch/3.0.2: + resolution: {integrity: sha512-rxN6sHUXEZYCKV05MEh4z4WpPSqIw+aP7n9ZN6WYAAvZoEAghEK1WeVZMZcHRBwyaKflU43PCUAJNjFxCzPDjg==} + dev: false + + /@types/d3-drag/3.0.2: + resolution: {integrity: sha512-qmODKEDvyKWVHcWWCOVcuVcOwikLVsyc4q4EBJMREsoQnR2Qoc2cZQUyFUPgO9q4S3qdSqJKBsuefv+h0Qy+tw==} + dependencies: + '@types/d3-selection': 3.0.5 + dev: false + + /@types/d3-dsv/3.0.1: + resolution: {integrity: sha512-76pBHCMTvPLt44wFOieouXcGXWOF0AJCceUvaFkxSZEu4VDUdv93JfpMa6VGNFs01FHfuP4a5Ou68eRG1KBfTw==} + dev: false + + /@types/d3-ease/3.0.0: + resolution: {integrity: sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==} + dev: false + + /@types/d3-fetch/3.0.2: + resolution: {integrity: sha512-gllwYWozWfbep16N9fByNBDTkJW/SyhH6SGRlXloR7WdtAaBui4plTP+gbUgiEot7vGw/ZZop1yDZlgXXSuzjA==} + dependencies: + '@types/d3-dsv': 3.0.1 + dev: false + + /@types/d3-force/3.0.4: + resolution: {integrity: sha512-q7xbVLrWcXvSBBEoadowIUJ7sRpS1yvgMWnzHJggFy5cUZBq2HZL5k/pBSm0GdYWS1vs5/EDwMjSKF55PDY4Aw==} + dev: false + + /@types/d3-format/3.0.1: + resolution: {integrity: sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==} + dev: false + + /@types/d3-geo/3.0.3: + resolution: {integrity: sha512-bK9uZJS3vuDCNeeXQ4z3u0E7OeJZXjUgzFdSOtNtMCJCLvDtWDwfpRVWlyt3y8EvRzI0ccOu9xlMVirawolSCw==} + dependencies: + '@types/geojson': 7946.0.10 + dev: false + + /@types/d3-hierarchy/3.1.2: + resolution: {integrity: sha512-9hjRTVoZjRFR6xo8igAJyNXQyPX6Aq++Nhb5ebrUF414dv4jr2MitM2fWiOY475wa3Za7TOS2Gh9fmqEhLTt0A==} + dev: false + + /@types/d3-interpolate/3.0.1: + resolution: {integrity: sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==} + dependencies: + '@types/d3-color': 3.1.0 + dev: false + + /@types/d3-path/3.0.0: + resolution: {integrity: sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==} + dev: false + + /@types/d3-polygon/3.0.0: + resolution: {integrity: sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==} + dev: false + + /@types/d3-quadtree/3.0.2: + resolution: {integrity: sha512-QNcK8Jguvc8lU+4OfeNx+qnVy7c0VrDJ+CCVFS9srBo2GL9Y18CnIxBdTF3v38flrGy5s1YggcoAiu6s4fLQIw==} + dev: false + + /@types/d3-random/3.0.1: + resolution: {integrity: sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==} + dev: false + + /@types/d3-scale-chromatic/3.0.0: + resolution: {integrity: sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==} + dev: false + + /@types/d3-scale/4.0.3: + resolution: {integrity: sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==} + dependencies: + '@types/d3-time': 3.0.0 + dev: false + + /@types/d3-selection/3.0.5: + resolution: {integrity: sha512-xCB0z3Hi8eFIqyja3vW8iV01+OHGYR2di/+e+AiOcXIOrY82lcvWW8Ke1DYE/EUVMsBl4Db9RppSBS3X1U6J0w==} + dev: false + + /@types/d3-shape/3.1.1: + resolution: {integrity: sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==} + dependencies: + '@types/d3-path': 3.0.0 + dev: false + + /@types/d3-time-format/4.0.0: + resolution: {integrity: sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw==} + dev: false + + /@types/d3-time/3.0.0: + resolution: {integrity: sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==} + dev: false + + /@types/d3-timer/3.0.0: + resolution: {integrity: sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==} + dev: false + + /@types/d3-transition/3.0.3: + resolution: {integrity: sha512-/S90Od8Id1wgQNvIA8iFv9jRhCiZcGhPd2qX0bKF/PS+y0W5CrXKgIiELd2CvG1mlQrWK/qlYh3VxicqG1ZvgA==} + dependencies: + '@types/d3-selection': 3.0.5 + dev: false + + /@types/d3-zoom/3.0.3: + resolution: {integrity: sha512-OWk1yYIIWcZ07+igN6BeoG6rqhnJ/pYe+R1qWFM2DtW49zsoSjgb9G5xB0ZXA8hh2jAzey1XuRmMSoXdKw8MDA==} + dependencies: + '@types/d3-interpolate': 3.0.1 + '@types/d3-selection': 3.0.5 + dev: false + + /@types/d3/7.4.0: + resolution: {integrity: sha512-jIfNVK0ZlxcuRDKtRS/SypEyOQ6UHaFQBKv032X45VvxSJ6Yi5G9behy9h6tNTHTDGh5Vq+KbmBjUWLgY4meCA==} + dependencies: + '@types/d3-array': 3.0.5 + '@types/d3-axis': 3.0.2 + '@types/d3-brush': 3.0.2 + '@types/d3-chord': 3.0.2 + '@types/d3-color': 3.1.0 + '@types/d3-contour': 3.0.2 + '@types/d3-delaunay': 6.0.1 + '@types/d3-dispatch': 3.0.2 + '@types/d3-drag': 3.0.2 + '@types/d3-dsv': 3.0.1 + '@types/d3-ease': 3.0.0 + '@types/d3-fetch': 3.0.2 + '@types/d3-force': 3.0.4 + '@types/d3-format': 3.0.1 + '@types/d3-geo': 3.0.3 + '@types/d3-hierarchy': 3.1.2 + '@types/d3-interpolate': 3.0.1 + '@types/d3-path': 3.0.0 + '@types/d3-polygon': 3.0.0 + '@types/d3-quadtree': 3.0.2 + '@types/d3-random': 3.0.1 + '@types/d3-scale': 4.0.3 + '@types/d3-scale-chromatic': 3.0.0 + '@types/d3-selection': 3.0.5 + '@types/d3-shape': 3.1.1 + '@types/d3-time': 3.0.0 + '@types/d3-time-format': 4.0.0 + '@types/d3-timer': 3.0.0 + '@types/d3-transition': 3.0.3 + '@types/d3-zoom': 3.0.3 + dev: false + + /@types/debug/4.1.8: + resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==} + dependencies: + '@types/ms': 0.7.31 + dev: false + + /@types/eslint-scope/3.7.4: + resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} + dependencies: + '@types/eslint': 8.44.2 + '@types/estree': 1.0.1 + + /@types/eslint/8.44.2: + resolution: {integrity: sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==} + dependencies: + '@types/estree': 1.0.1 + '@types/json-schema': 7.0.12 + + /@types/estree/0.0.39: + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + + /@types/estree/1.0.1: + resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} + + /@types/express-serve-static-core/4.17.35: + resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} + dependencies: + '@types/node': 16.18.40 + '@types/qs': 6.9.7 + '@types/range-parser': 1.2.4 + '@types/send': 0.17.1 + + /@types/express/4.17.17: + resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} + dependencies: + '@types/body-parser': 1.19.2 + '@types/express-serve-static-core': 4.17.35 + '@types/qs': 6.9.7 + '@types/serve-static': 1.15.2 + + /@types/file-saver/2.0.5: + resolution: {integrity: sha512-zv9kNf3keYegP5oThGLaPk8E081DFDuwfqjtiTzm6PoxChdJ1raSuADf2YGCVIyrSynLrgc8JWv296s7Q7pQSQ==} + dev: true + + /@types/geojson/7946.0.10: + resolution: {integrity: sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==} + dev: false + + /@types/graceful-fs/4.1.6: + resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} + dependencies: + '@types/node': 16.18.40 + + /@types/hast/2.3.5: + resolution: {integrity: sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg==} + dependencies: + '@types/unist': 2.0.7 + dev: false + + /@types/html-minifier-terser/6.1.0: + resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} + + /@types/http-errors/2.0.1: + resolution: {integrity: sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==} + + /@types/http-proxy/1.17.11: + resolution: {integrity: sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==} + dependencies: + '@types/node': 16.18.40 + + /@types/istanbul-lib-coverage/2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + + /@types/istanbul-lib-report/3.0.0: + resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + + /@types/istanbul-reports/3.0.1: + resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} + dependencies: + '@types/istanbul-lib-report': 3.0.0 + + /@types/jest/27.5.2: + resolution: {integrity: sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==} + dependencies: + jest-matcher-utils: 27.5.1 + pretty-format: 27.5.1 + dev: false + + /@types/json-schema/7.0.12: + resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} + + /@types/json5/0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + /@types/lodash/4.14.197: + resolution: {integrity: sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g==} + dev: true + + /@types/luxon/3.3.1: + resolution: {integrity: sha512-XOS5nBcgEeP2PpcqJHjCWhUCAzGfXIU8ILOSLpx2FhxqMW9KdxgCGXNOEKGVBfveKtIpztHzKK5vSRVLyW/NqA==} + dev: true + + /@types/mdast/3.0.12: + resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==} + dependencies: + '@types/unist': 2.0.7 + dev: false + + /@types/mime/1.3.2: + resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} + + /@types/mime/3.0.1: + resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} + + /@types/ms/0.7.31: + resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} + dev: false + + /@types/node/16.18.40: + resolution: {integrity: sha512-+yno3ItTEwGxXiS/75Q/aHaa5srkpnJaH+kdkTVJ3DtJEwv92itpKbxU+FjPoh2m/5G9zmUQfrL4A4C13c+iGA==} + + /@types/parse-json/4.0.0: + resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + + /@types/prettier/2.7.3: + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + + /@types/prop-types/15.7.5: + resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + dev: false + + /@types/q/1.5.5: + resolution: {integrity: sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==} + + /@types/qs/6.9.7: + resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} + + /@types/range-parser/1.2.4: + resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} + + /@types/react-dom/18.2.7: + resolution: {integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==} + dependencies: + '@types/react': 18.2.20 + dev: false + + /@types/react/18.2.20: + resolution: {integrity: sha512-WKNtmsLWJM/3D5mG4U84cysVY31ivmyw85dE84fOCk5Hx78wezB/XEjVPWl2JTZ5FkEeaTJf+VgUAUn3PE7Isw==} + dependencies: + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.16.3 + csstype: 3.1.2 + dev: false + + /@types/resolve/1.17.1: + resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} + dependencies: + '@types/node': 16.18.40 + + /@types/retry/0.12.0: + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + + /@types/scheduler/0.16.3: + resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} + dev: false + + /@types/semver/7.5.0: + resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} + + /@types/send/0.17.1: + resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} + dependencies: + '@types/mime': 1.3.2 + '@types/node': 16.18.40 + + /@types/serve-index/1.9.1: + resolution: {integrity: sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==} + dependencies: + '@types/express': 4.17.17 + + /@types/serve-static/1.15.2: + resolution: {integrity: sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==} + dependencies: + '@types/http-errors': 2.0.1 + '@types/mime': 3.0.1 + '@types/node': 16.18.40 + + /@types/sockjs/0.3.33: + resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} + dependencies: + '@types/node': 16.18.40 + + /@types/stack-utils/2.0.1: + resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} + + /@types/testing-library__jest-dom/5.14.9: + resolution: {integrity: sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==} + dependencies: + '@types/jest': 27.5.2 + dev: false + + /@types/trusted-types/2.0.3: + resolution: {integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==} + + /@types/unist/2.0.7: + resolution: {integrity: sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==} + dev: false + + /@types/ws/8.5.5: + resolution: {integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==} + dependencies: + '@types/node': 16.18.40 + + /@types/yargs-parser/21.0.0: + resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} + + /@types/yargs/16.0.5: + resolution: {integrity: sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==} + dependencies: + '@types/yargs-parser': 21.0.0 + + /@types/yargs/17.0.24: + resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} + dependencies: + '@types/yargs-parser': 21.0.0 + + /@typescript-eslint/eslint-plugin/5.62.0_b4dpngykx2cv4esjowwmn5pt3a: + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.6.2 + '@typescript-eslint/parser': 5.62.0_2voyjndugpfz33zwqvnblpgcve + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0_2voyjndugpfz33zwqvnblpgcve + '@typescript-eslint/utils': 5.62.0_2voyjndugpfz33zwqvnblpgcve + debug: 4.3.4 + eslint: 8.47.0 + graphemer: 1.4.0 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 + semver: 7.5.4 + tsutils: 3.21.0_typescript@4.9.5 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + + /@typescript-eslint/experimental-utils/5.62.0_2voyjndugpfz33zwqvnblpgcve: + resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@typescript-eslint/utils': 5.62.0_2voyjndugpfz33zwqvnblpgcve + eslint: 8.47.0 + transitivePeerDependencies: + - supports-color + - typescript + + /@typescript-eslint/parser/5.62.0_2voyjndugpfz33zwqvnblpgcve: + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0_typescript@4.9.5 + debug: 4.3.4 + eslint: 8.47.0 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + + /@typescript-eslint/scope-manager/5.62.0: + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + + /@typescript-eslint/type-utils/5.62.0_2voyjndugpfz33zwqvnblpgcve: + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.62.0_typescript@4.9.5 + '@typescript-eslint/utils': 5.62.0_2voyjndugpfz33zwqvnblpgcve + debug: 4.3.4 + eslint: 8.47.0 + tsutils: 3.21.0_typescript@4.9.5 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + + /@typescript-eslint/types/5.62.0: + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + /@typescript-eslint/typescript-estree/5.62.0_typescript@4.9.5: + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + tsutils: 3.21.0_typescript@4.9.5 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + + /@typescript-eslint/utils/5.62.0_2voyjndugpfz33zwqvnblpgcve: + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0_eslint@8.47.0 + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0_typescript@4.9.5 + eslint: 8.47.0 + eslint-scope: 5.1.1 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + + /@typescript-eslint/visitor-keys/5.62.0: + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + + /@webassemblyjs/ast/1.11.6: + resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + + /@webassemblyjs/floating-point-hex-parser/1.11.6: + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + /@webassemblyjs/helper-api-error/1.11.6: + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + /@webassemblyjs/helper-buffer/1.11.6: + resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} + + /@webassemblyjs/helper-numbers/1.11.6: + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + + /@webassemblyjs/helper-wasm-bytecode/1.11.6: + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + /@webassemblyjs/helper-wasm-section/1.11.6: + resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + + /@webassemblyjs/ieee754/1.11.6: + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + dependencies: + '@xtuc/ieee754': 1.2.0 + + /@webassemblyjs/leb128/1.11.6: + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + dependencies: + '@xtuc/long': 4.2.2 + + /@webassemblyjs/utf8/1.11.6: + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + /@webassemblyjs/wasm-edit/1.11.6: + resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-opt': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/wast-printer': 1.11.6 + + /@webassemblyjs/wasm-gen/1.11.6: + resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + /@webassemblyjs/wasm-opt/1.11.6: + resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + + /@webassemblyjs/wasm-parser/1.11.6: + resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + /@webassemblyjs/wast-printer/1.11.6: + resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@xtuc/long': 4.2.2 + + /@xtuc/ieee754/1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + /@xtuc/long/4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + /abab/2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + + /accepts/1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + /acorn-globals/6.0.0: + resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} + dependencies: + acorn: 7.4.1 + acorn-walk: 7.2.0 + + /acorn-import-assertions/1.9.0_acorn@8.10.0: + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.10.0 + + /acorn-jsx/5.3.2_acorn@8.10.0: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.10.0 + + /acorn-walk/7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} + + /acorn-walk/8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn/7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + + /acorn/8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + + /address/1.2.2: + resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} + engines: {node: '>= 10.0.0'} + + /adjust-sourcemap-loader/4.0.0: + resolution: {integrity: sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==} + engines: {node: '>=8.9'} + dependencies: + loader-utils: 2.0.4 + regex-parser: 2.2.11 + + /agent-base/6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + /ajv-formats/2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.12.0 + + /ajv-keywords/3.5.2_ajv@6.12.6: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + dependencies: + ajv: 6.12.6 + + /ajv-keywords/5.1.0_ajv@8.12.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + dependencies: + ajv: 8.12.0 + fast-deep-equal: 3.1.3 + + /ajv/6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ajv/8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + /ansi-escapes/4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + + /ansi-html-community/0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.0} + hasBin: true + + /ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-regex/6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + /ansi-styles/3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + + /ansi-styles/4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles/5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + /any-promise/1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + /anymatch/3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + /arg/4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /arg/5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + /argparse/1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + + /argparse/2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + /aria-query/5.1.3: + resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + dependencies: + deep-equal: 2.2.2 + dev: false + + /aria-query/5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + dependencies: + dequal: 2.0.3 + + /array-buffer-byte-length/1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.2 + is-array-buffer: 3.0.2 + + /array-flatten/1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + /array-flatten/2.1.2: + resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==} + + /array-includes/3.1.6: + resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 + is-string: 1.0.7 + + /array-union/1.0.2: + resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} + engines: {node: '>=0.10.0'} + dependencies: + array-uniq: 1.0.3 + dev: true + + /array-union/2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + /array-uniq/1.0.3: + resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} + engines: {node: '>=0.10.0'} + dev: true + + /array.prototype.findlastindex/1.2.2: + resolution: {integrity: sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 + get-intrinsic: 1.2.1 + + /array.prototype.flat/1.3.1: + resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 + + /array.prototype.flatmap/1.3.1: + resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 + + /array.prototype.reduce/1.0.5: + resolution: {integrity: sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-array-method-boxes-properly: 1.0.0 + is-string: 1.0.7 + + /array.prototype.tosorted/1.1.1: + resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 + get-intrinsic: 1.2.1 + + /arraybuffer.prototype.slice/1.0.1: + resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.2 + define-properties: 1.2.0 + get-intrinsic: 1.2.1 + is-array-buffer: 3.0.2 + is-shared-array-buffer: 1.0.2 + + /asap/2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + /ast-types-flow/0.0.7: + resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} + + /async/2.6.4: + resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} + dependencies: + lodash: 4.17.21 + dev: true + + /async/3.2.4: + resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} + + /asynckit/0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + /at-least-node/1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + /autoprefixer/10.4.14_postcss@8.4.27: + resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.21.10 + caniuse-lite: 1.0.30001519 + fraction.js: 4.2.0 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /available-typed-arrays/1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + + /axe-core/4.7.2: + resolution: {integrity: sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==} + engines: {node: '>=4'} + + /axobject-query/3.2.1: + resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + dependencies: + dequal: 2.0.3 + + /babel-jest/27.5.1_@babel+core@7.22.10: + resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.22.10 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/babel__core': 7.20.1 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 27.5.1_@babel+core@7.22.10 + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + /babel-loader/8.3.0_a7bz5yhgcoab2comip4bcc2pf4: + resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} + engines: {node: '>= 8.9'} + peerDependencies: + '@babel/core': ^7.0.0 + webpack: '>=2' + dependencies: + '@babel/core': 7.22.10 + find-cache-dir: 3.3.2 + loader-utils: 2.0.4 + make-dir: 3.1.0 + schema-utils: 2.7.1 + webpack: 5.88.2 + + /babel-plugin-istanbul/6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': 7.22.5 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + + /babel-plugin-jest-hoist/27.5.1: + resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/template': 7.22.5 + '@babel/types': 7.22.10 + '@types/babel__core': 7.20.1 + '@types/babel__traverse': 7.20.1 + + /babel-plugin-macros/3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + dependencies: + '@babel/runtime': 7.22.10 + cosmiconfig: 7.1.0 + resolve: 1.22.4 + + /babel-plugin-named-asset-import/0.3.8_@babel+core@7.22.10: + resolution: {integrity: sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==} + peerDependencies: + '@babel/core': ^7.1.0 + dependencies: + '@babel/core': 7.22.10 + + /babel-plugin-polyfill-corejs2/0.4.5_@babel+core@7.22.10: + resolution: {integrity: sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/compat-data': 7.22.9 + '@babel/core': 7.22.10 + '@babel/helper-define-polyfill-provider': 0.4.2_@babel+core@7.22.10 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /babel-plugin-polyfill-corejs3/0.8.3_@babel+core@7.22.10: + resolution: {integrity: sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-define-polyfill-provider': 0.4.2_@babel+core@7.22.10 + core-js-compat: 3.32.0 + transitivePeerDependencies: + - supports-color + + /babel-plugin-polyfill-regenerator/0.5.2_@babel+core@7.22.10: + resolution: {integrity: sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-define-polyfill-provider': 0.4.2_@babel+core@7.22.10 + transitivePeerDependencies: + - supports-color + + /babel-plugin-transform-react-remove-prop-types/0.4.24: + resolution: {integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==} + + /babel-preset-current-node-syntax/1.0.1_@babel+core@7.22.10: + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.10 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.22.10 + '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.22.10 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.22.10 + '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.22.10 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.22.10 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.22.10 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.22.10 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.22.10 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.22.10 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.22.10 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.22.10 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.22.10 + + /babel-preset-jest/27.5.1_@babel+core@7.22.10: + resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.10 + babel-plugin-jest-hoist: 27.5.1 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.22.10 + + /babel-preset-react-app/10.0.1: + resolution: {integrity: sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==} + dependencies: + '@babel/core': 7.22.10 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.22.10 + '@babel/plugin-proposal-decorators': 7.22.10_@babel+core@7.22.10 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.22.10 + '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.22.10 + '@babel/plugin-proposal-optional-chaining': 7.21.0_@babel+core@7.22.10 + '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.22.10 + '@babel/plugin-proposal-private-property-in-object': 7.21.11_@babel+core@7.22.10 + '@babel/plugin-transform-flow-strip-types': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-react-display-name': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-runtime': 7.22.10_@babel+core@7.22.10 + '@babel/preset-env': 7.22.10_@babel+core@7.22.10 + '@babel/preset-react': 7.22.5_@babel+core@7.22.10 + '@babel/preset-typescript': 7.22.5_@babel+core@7.22.10 + '@babel/runtime': 7.22.10 + babel-plugin-macros: 3.1.0 + babel-plugin-transform-react-remove-prop-types: 0.4.24 + transitivePeerDependencies: + - supports-color + + /babylon/7.0.0-beta.47: + resolution: {integrity: sha512-+rq2cr4GDhtToEzKFD6KZZMDBXhjFAr9JjPw9pAppZACeEWqNM294j+NdBzkSHYXwzzBmVjZ3nEVJlOhbR2gOQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dev: true + + /bail/2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + dev: false + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /batch/0.6.1: + resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + + /bfj/7.0.2: + resolution: {integrity: sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==} + engines: {node: '>= 8.0.0'} + dependencies: + bluebird: 3.7.2 + check-types: 11.2.2 + hoopy: 0.1.4 + tryer: 1.0.1 + + /big.js/5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + /binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + + /bluebird/3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + /body-parser/1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + 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.1 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + /bonjour-service/1.1.1: + resolution: {integrity: sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==} + dependencies: + array-flatten: 2.1.2 + dns-equal: 1.0.0 + fast-deep-equal: 3.1.3 + multicast-dns: 7.2.5 + + /boolbase/1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /brace-expansion/2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + + /browser-process-hrtime/1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + + /browserslist/4.21.10: + resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001519 + electron-to-chromium: 1.4.490 + node-releases: 2.0.13 + update-browserslist-db: 1.0.11_browserslist@4.21.10 + + /bser/2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + dependencies: + node-int64: 0.4.0 + + /buffer-from/1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + /builtin-modules/3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + + /buttplug/3.1.1: + resolution: {integrity: sha512-IRFlLKiESVMxgTnteONjGfDF3DleMzycSBWnmkwQFzqmOlrdvXJ8VSZ96gzC3e6XEsX7lXbcQGrRNcQezha2UA==} + dependencies: + class-transformer: 0.5.1 + eventemitter3: 5.0.1 + reflect-metadata: 0.1.13 + ws: 8.13.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /bytes/3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} + + /bytes/3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + /call-bind/1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + + /callsites/3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + /camel-case/4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + dependencies: + pascal-case: 3.1.2 + tslib: 2.6.1 + + /camelcase-css/2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + /camelcase/5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + /camelcase/6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + /caniuse-api/3.0.0: + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + dependencies: + browserslist: 4.21.10 + caniuse-lite: 1.0.30001519 + lodash.memoize: 4.1.2 + lodash.uniq: 4.5.0 + + /caniuse-lite/1.0.30001519: + resolution: {integrity: sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==} + + /case-sensitive-paths-webpack-plugin/2.4.0: + resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} + engines: {node: '>=4'} + + /chalk/2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chalk/3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: false + + /chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /char-regex/1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + /char-regex/2.0.1: + resolution: {integrity: sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==} + engines: {node: '>=12.20'} + + /character-entities/2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + dev: false + + /check-types/11.2.2: + resolution: {integrity: sha512-HBiYvXvn9Z70Z88XKjz3AEKd4HJhBXsa3j7xFnITAzoS8+q6eIGi8qDB8FKPBAjtuxjI/zFpwuiCb8oDtKOYrA==} + + /chokidar/3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + + /chrome-trace-event/1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + + /ci-info/3.8.0: + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + engines: {node: '>=8'} + + /cjs-module-lexer/1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + + /class-transformer/0.5.1: + resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} + dev: false + + /classcat/5.0.4: + resolution: {integrity: sha512-sbpkOw6z413p+HDGcBENe498WM9woqWHiJxCq7nvmxe9WmrUmqfAcxpIwAiMtM5Q3AhYkzXcNQHqsWq0mND51g==} + dev: false + + /clean-css/5.3.2: + resolution: {integrity: sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==} + engines: {node: '>= 10.0'} + dependencies: + source-map: 0.6.1 + + /client-only/0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + dev: false + + /cliui/7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + /clone-deep/4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + dev: true + + /clsx/1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} + dev: false + + /co/4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + /coa/2.0.2: + resolution: {integrity: sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==} + engines: {node: '>= 4.0'} + dependencies: + '@types/q': 1.5.5 + chalk: 2.4.2 + q: 1.5.1 + + /collect-v8-coverage/1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + + /color-convert/1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + + /color-convert/2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name/1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + /color-name/1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /colord/2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + /colorette/2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + /combined-stream/1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + + /comma-separated-tokens/2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + dev: false + + /commander/2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + /commander/4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + /commander/7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + /commander/8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + /common-path-prefix/3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + + /common-tags/1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + + /commondir/1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + /compressible/2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /compression/1.7.4: + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.8 + bytes: 3.0.0 + compressible: 2.0.18 + debug: 2.6.9 + on-headers: 1.0.2 + safe-buffer: 5.1.2 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + /concat-map/0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /confusing-browser-globals/1.0.11: + resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} + + /connect-history-api-fallback/2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} + + /content-disposition/0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + + /content-type/1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + /convert-source-map/1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + /cookie-signature/1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + /cookie/0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + + /core-js-compat/3.32.0: + resolution: {integrity: sha512-7a9a3D1k4UCVKnLhrgALyFcP7YCsLOQIxPd0dKjf/6GuPcgyiGP70ewWdCGrSK7evyhymi0qO4EqCmSJofDeYw==} + dependencies: + browserslist: 4.21.10 + + /core-js-pure/3.32.0: + resolution: {integrity: sha512-qsev1H+dTNYpDUEURRuOXMvpdtAnNEvQWS/FMJ2Vb5AY8ZP4rAPQldkE27joykZPJTe0+IVgHZYh1P5Xu1/i1g==} + requiresBuild: true + + /core-js/3.32.0: + resolution: {integrity: sha512-rd4rYZNlF3WuoYuRIDEmbR/ga9CeuWX9U05umAvgrrZoHY4Z++cp/xwPQMvUpBB4Ag6J8KfD80G0zwCyaSxDww==} + requiresBuild: true + + /core-util-is/1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + /cosmiconfig-typescript-loader/1.0.9_osiawaesgot4tuqtrzm2bzteda: + resolution: {integrity: sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@types/node': '*' + typescript: '>=3' + dependencies: + '@types/node': 16.18.40 + cosmiconfig: 7.1.0 + ts-node: 10.9.1_osiawaesgot4tuqtrzm2bzteda + typescript: 4.9.5 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + /cosmiconfig/6.0.0: + resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} + engines: {node: '>=8'} + dependencies: + '@types/parse-json': 4.0.0 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + /cosmiconfig/7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.0 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + /create-require/1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /cross-spawn/7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /crypto-random-string/2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + + /css-blank-pseudo/3.0.3_postcss@8.4.27: + resolution: {integrity: sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==} + engines: {node: ^12 || ^14 || >=16} + hasBin: true + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.27 + postcss-selector-parser: 6.0.13 + + /css-declaration-sorter/6.4.1_postcss@8.4.27: + resolution: {integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==} + engines: {node: ^10 || ^12 || >=14} + peerDependencies: + postcss: ^8.0.9 + dependencies: + postcss: 8.4.27 + + /css-has-pseudo/3.0.4_postcss@8.4.27: + resolution: {integrity: sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==} + engines: {node: ^12 || ^14 || >=16} + hasBin: true + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.27 + postcss-selector-parser: 6.0.13 + + /css-loader/6.8.1_webpack@5.88.2: + resolution: {integrity: sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + dependencies: + icss-utils: 5.1.0_postcss@8.4.27 + postcss: 8.4.27 + postcss-modules-extract-imports: 3.0.0_postcss@8.4.27 + postcss-modules-local-by-default: 4.0.3_postcss@8.4.27 + postcss-modules-scope: 3.0.0_postcss@8.4.27 + postcss-modules-values: 4.0.0_postcss@8.4.27 + postcss-value-parser: 4.2.0 + semver: 7.5.4 + webpack: 5.88.2 + + /css-minimizer-webpack-plugin/3.4.1_webpack@5.88.2: + resolution: {integrity: sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==} + engines: {node: '>= 12.13.0'} + peerDependencies: + '@parcel/css': '*' + clean-css: '*' + csso: '*' + esbuild: '*' + webpack: ^5.0.0 + peerDependenciesMeta: + '@parcel/css': + optional: true + clean-css: + optional: true + csso: + optional: true + esbuild: + optional: true + dependencies: + cssnano: 5.1.15_postcss@8.4.27 + jest-worker: 27.5.1 + postcss: 8.4.27 + schema-utils: 4.2.0 + serialize-javascript: 6.0.1 + source-map: 0.6.1 + webpack: 5.88.2 + + /css-prefers-color-scheme/6.0.3_postcss@8.4.27: + resolution: {integrity: sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==} + engines: {node: ^12 || ^14 || >=16} + hasBin: true + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.27 + + /css-select-base-adapter/0.1.1: + resolution: {integrity: sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==} + + /css-select/2.1.0: + resolution: {integrity: sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==} + dependencies: + boolbase: 1.0.0 + css-what: 3.4.2 + domutils: 1.7.0 + nth-check: 1.0.2 + + /css-select/4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + + /css-tree/1.0.0-alpha.37: + resolution: {integrity: sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.4 + source-map: 0.6.1 + + /css-tree/1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + + /css-what/3.4.2: + resolution: {integrity: sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==} + engines: {node: '>= 6'} + + /css-what/6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + /css.escape/1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + dev: false + + /cssdb/7.7.0: + resolution: {integrity: sha512-1hN+I3r4VqSNQ+OmMXxYexnumbOONkSil0TWMebVXHtzYW4tRRPovUNHPHj2d4nrgOuYJ8Vs3XwvywsuwwXNNA==} + + /cssesc/3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + /cssnano-preset-default/5.2.14_postcss@8.4.27: + resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + css-declaration-sorter: 6.4.1_postcss@8.4.27 + cssnano-utils: 3.1.0_postcss@8.4.27 + postcss: 8.4.27 + postcss-calc: 8.2.4_postcss@8.4.27 + postcss-colormin: 5.3.1_postcss@8.4.27 + postcss-convert-values: 5.1.3_postcss@8.4.27 + postcss-discard-comments: 5.1.2_postcss@8.4.27 + postcss-discard-duplicates: 5.1.0_postcss@8.4.27 + postcss-discard-empty: 5.1.1_postcss@8.4.27 + postcss-discard-overridden: 5.1.0_postcss@8.4.27 + postcss-merge-longhand: 5.1.7_postcss@8.4.27 + postcss-merge-rules: 5.1.4_postcss@8.4.27 + postcss-minify-font-values: 5.1.0_postcss@8.4.27 + postcss-minify-gradients: 5.1.1_postcss@8.4.27 + postcss-minify-params: 5.1.4_postcss@8.4.27 + postcss-minify-selectors: 5.2.1_postcss@8.4.27 + postcss-normalize-charset: 5.1.0_postcss@8.4.27 + postcss-normalize-display-values: 5.1.0_postcss@8.4.27 + postcss-normalize-positions: 5.1.1_postcss@8.4.27 + postcss-normalize-repeat-style: 5.1.1_postcss@8.4.27 + postcss-normalize-string: 5.1.0_postcss@8.4.27 + postcss-normalize-timing-functions: 5.1.0_postcss@8.4.27 + postcss-normalize-unicode: 5.1.1_postcss@8.4.27 + postcss-normalize-url: 5.1.0_postcss@8.4.27 + postcss-normalize-whitespace: 5.1.1_postcss@8.4.27 + postcss-ordered-values: 5.1.3_postcss@8.4.27 + postcss-reduce-initial: 5.1.2_postcss@8.4.27 + postcss-reduce-transforms: 5.1.0_postcss@8.4.27 + postcss-svgo: 5.1.0_postcss@8.4.27 + postcss-unique-selectors: 5.1.1_postcss@8.4.27 + + /cssnano-utils/3.1.0_postcss@8.4.27: + resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + + /cssnano/5.1.15_postcss@8.4.27: + resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-preset-default: 5.2.14_postcss@8.4.27 + lilconfig: 2.1.0 + postcss: 8.4.27 + yaml: 1.10.2 + + /csso/4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + dependencies: + css-tree: 1.1.3 + + /cssom/0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + + /cssom/0.4.4: + resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} + + /cssstyle/2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + engines: {node: '>=8'} + dependencies: + cssom: 0.3.8 + + /csstype/3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + dev: false + + /d3-color/3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + dev: false + + /d3-dispatch/3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + dev: false + + /d3-drag/3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + dev: false + + /d3-ease/3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + dev: false + + /d3-interpolate/3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + dependencies: + d3-color: 3.1.0 + dev: false + + /d3-selection/3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + dev: false + + /d3-timer/3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + dev: false + + /d3-transition/3.0.1_d3-selection@3.0.0: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + dev: false + + /d3-zoom/3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1_d3-selection@3.0.0 + dev: false + + /damerau-levenshtein/1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + + /data-urls/2.0.0: + resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} + engines: {node: '>=10'} + dependencies: + abab: 2.0.6 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + + /debug/2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + + /debug/3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /decimal.js/10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + + /decode-named-character-reference/1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + dependencies: + character-entities: 2.0.2 + dev: false + + /dedent/0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + + /deep-equal/2.2.2: + resolution: {integrity: sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.2 + es-get-iterator: 1.1.3 + get-intrinsic: 1.2.1 + is-arguments: 1.1.1 + is-array-buffer: 3.0.2 + is-date-object: 1.0.5 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + isarray: 2.0.5 + object-is: 1.1.5 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.5.0 + side-channel: 1.0.4 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.11 + dev: false + + /deep-is/0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + /deepmerge/4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + /default-gateway/6.0.3: + resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} + engines: {node: '>= 10'} + dependencies: + execa: 5.1.1 + + /define-lazy-prop/2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + /define-properties/1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + + /delayed-stream/1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + /depd/1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + + /depd/2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + /dequal/2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + /destroy/1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + /detect-newline/3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + + /detect-node/2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + /detect-port-alt/1.1.6: + resolution: {integrity: sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==} + engines: {node: '>= 4.2.1'} + hasBin: true + dependencies: + address: 1.2.2 + debug: 2.6.9 + transitivePeerDependencies: + - supports-color + + /didyoumean/1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + /diff-sequences/27.5.1: + resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + /diff/4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /diff/5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + engines: {node: '>=0.3.1'} + dev: false + + /dir-glob/3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + + /dlv/1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + /dnd-core/16.0.1: + resolution: {integrity: sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng==} + dependencies: + '@react-dnd/asap': 5.0.2 + '@react-dnd/invariant': 4.0.2 + redux: 4.2.1 + dev: false + + /dns-equal/1.0.0: + resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} + + /dns-packet/5.6.0: + resolution: {integrity: sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==} + engines: {node: '>=6'} + dependencies: + '@leichtgewicht/ip-codec': 2.0.4 + + /doctrine/2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + + /doctrine/3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + + /dom-accessibility-api/0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + dev: false + + /dom-converter/0.2.0: + resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} + dependencies: + utila: 0.4.0 + + /dom-serializer/0.2.2: + resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} + dependencies: + domelementtype: 2.3.0 + entities: 2.2.0 + + /dom-serializer/1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + + /domelementtype/1.3.1: + resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} + + /domelementtype/2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + /domexception/2.0.1: + resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} + engines: {node: '>=8'} + dependencies: + webidl-conversions: 5.0.0 + + /domhandler/4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + + /domutils/1.7.0: + resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} + dependencies: + dom-serializer: 0.2.2 + domelementtype: 1.3.1 + + /domutils/2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + + /dot-case/3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.1 + + /dotenv-expand/5.1.0: + resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} + + /dotenv/10.0.0: + resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} + engines: {node: '>=10'} + + /duplexer/0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + + /ee-first/1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + /ejs/3.1.9: + resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + jake: 10.8.7 + + /electron-to-chromium/1.4.490: + resolution: {integrity: sha512-6s7NVJz+sATdYnIwhdshx/N/9O6rvMxmhVoDSDFdj6iA45gHR8EQje70+RYsF4GeB+k0IeNSBnP7yG9ZXJFr7A==} + + /email-addresses/3.1.0: + resolution: {integrity: sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg==} + dev: true + + /emittery/0.10.2: + resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} + engines: {node: '>=12'} + + /emittery/0.8.1: + resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} + engines: {node: '>=10'} + + /emoji-regex/8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex/9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + /emojis-list/3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + /encodeurl/1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + /enhanced-resolve/5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + /entities/2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + /error-ex/1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + + /error-stack-parser/2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + dependencies: + stackframe: 1.3.4 + + /es-abstract/1.22.1: + resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + arraybuffer.prototype.slice: 1.0.1 + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + es-set-tostringtag: 2.0.1 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.5 + get-intrinsic: 1.2.1 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has: 1.0.3 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + is-array-buffer: 3.0.2 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.12 + is-weakref: 1.0.2 + object-inspect: 1.12.3 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.5.0 + safe-array-concat: 1.0.0 + safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.7 + string.prototype.trimend: 1.0.6 + string.prototype.trimstart: 1.0.6 + typed-array-buffer: 1.0.0 + typed-array-byte-length: 1.0.0 + typed-array-byte-offset: 1.0.0 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.11 + + /es-array-method-boxes-properly/1.0.0: + resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} + + /es-get-iterator/1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + is-arguments: 1.1.1 + is-map: 2.0.2 + is-set: 2.0.2 + is-string: 1.0.7 + isarray: 2.0.5 + stop-iteration-iterator: 1.0.0 + dev: false + + /es-module-lexer/1.3.0: + resolution: {integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==} + + /es-set-tostringtag/2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + has: 1.0.3 + has-tostringtag: 1.0.0 + + /es-shim-unscopables/1.0.0: + resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + dependencies: + has: 1.0.3 + + /es-to-primitive/1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + + /escalade/3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + /escape-html/1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + /escape-string-regexp/1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escape-string-regexp/2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + /escape-string-regexp/4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + /escodegen/2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + + /eslint-config-react-app/7.0.1_hewhl32arvhpzpkgjcsdnjm62y: + resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==} + engines: {node: '>=14.0.0'} + peerDependencies: + eslint: ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@babel/core': 7.22.10 + '@babel/eslint-parser': 7.22.10_zyanktnjxrtfnufugapahvd75q + '@rushstack/eslint-patch': 1.3.3 + '@typescript-eslint/eslint-plugin': 5.62.0_b4dpngykx2cv4esjowwmn5pt3a + '@typescript-eslint/parser': 5.62.0_2voyjndugpfz33zwqvnblpgcve + babel-preset-react-app: 10.0.1 + confusing-browser-globals: 1.0.11 + eslint: 8.47.0 + eslint-plugin-flowtype: 8.0.3_eslint@8.47.0 + eslint-plugin-import: 2.28.0_d2ajlqlsbxlpxgtbsghthbjqlq + eslint-plugin-jest: 25.7.0_47pcserzpcerwqzibc3ujuvssa + eslint-plugin-jsx-a11y: 6.7.1_eslint@8.47.0 + eslint-plugin-react: 7.33.1_eslint@8.47.0 + eslint-plugin-react-hooks: 4.6.0_eslint@8.47.0 + eslint-plugin-testing-library: 5.11.1_2voyjndugpfz33zwqvnblpgcve + typescript: 4.9.5 + transitivePeerDependencies: + - '@babel/plugin-syntax-flow' + - '@babel/plugin-transform-react-jsx' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - jest + - supports-color + + /eslint-import-resolver-node/0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + dependencies: + debug: 3.2.7 + is-core-module: 2.13.0 + resolve: 1.22.4 + transitivePeerDependencies: + - supports-color + + /eslint-module-utils/2.8.0_2yc2ge3cubbryl5klvrqpgyyii: + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 5.62.0_2voyjndugpfz33zwqvnblpgcve + debug: 3.2.7 + eslint: 8.47.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + + /eslint-plugin-flowtype/8.0.3_eslint@8.47.0: + resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@babel/plugin-syntax-flow': ^7.14.5 + '@babel/plugin-transform-react-jsx': ^7.14.9 + eslint: ^8.1.0 + dependencies: + eslint: 8.47.0 + lodash: 4.17.21 + string-natural-compare: 3.0.1 + + /eslint-plugin-import/2.28.0_d2ajlqlsbxlpxgtbsghthbjqlq: + resolution: {integrity: sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 5.62.0_2voyjndugpfz33zwqvnblpgcve + array-includes: 3.1.6 + array.prototype.findlastindex: 1.2.2 + array.prototype.flat: 1.3.1 + array.prototype.flatmap: 1.3.1 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.47.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0_2yc2ge3cubbryl5klvrqpgyyii + has: 1.0.3 + is-core-module: 2.13.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.6 + object.groupby: 1.0.0 + object.values: 1.1.6 + resolve: 1.22.4 + semver: 6.3.1 + tsconfig-paths: 3.14.2 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + /eslint-plugin-jest/25.7.0_47pcserzpcerwqzibc3ujuvssa: + resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^4.0.0 || ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 5.62.0_b4dpngykx2cv4esjowwmn5pt3a + '@typescript-eslint/experimental-utils': 5.62.0_2voyjndugpfz33zwqvnblpgcve + eslint: 8.47.0 + jest: 27.5.1 + transitivePeerDependencies: + - supports-color + - typescript + + /eslint-plugin-jsx-a11y/6.7.1_eslint@8.47.0: + resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + '@babel/runtime': 7.22.10 + aria-query: 5.3.0 + array-includes: 3.1.6 + array.prototype.flatmap: 1.3.1 + ast-types-flow: 0.0.7 + axe-core: 4.7.2 + axobject-query: 3.2.1 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 8.47.0 + has: 1.0.3 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.5 + minimatch: 3.1.2 + object.entries: 1.1.6 + object.fromentries: 2.0.6 + semver: 6.3.1 + + /eslint-plugin-react-hooks/4.6.0_eslint@8.47.0: + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 8.47.0 + + /eslint-plugin-react/7.33.1_eslint@8.47.0: + resolution: {integrity: sha512-L093k0WAMvr6VhNwReB8VgOq5s2LesZmrpPdKz/kZElQDzqS7G7+DnKoqT+w4JwuiGeAhAvHO0fvy0Eyk4ejDA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + array-includes: 3.1.6 + array.prototype.flatmap: 1.3.1 + array.prototype.tosorted: 1.1.1 + doctrine: 2.1.0 + eslint: 8.47.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.6 + object.fromentries: 2.0.6 + object.hasown: 1.1.2 + object.values: 1.1.6 + prop-types: 15.8.1 + resolve: 2.0.0-next.4 + semver: 6.3.1 + string.prototype.matchall: 4.0.8 + + /eslint-plugin-testing-library/5.11.1_2voyjndugpfz33zwqvnblpgcve: + resolution: {integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} + peerDependencies: + eslint: ^7.5.0 || ^8.0.0 + dependencies: + '@typescript-eslint/utils': 5.62.0_2voyjndugpfz33zwqvnblpgcve + eslint: 8.47.0 + transitivePeerDependencies: + - supports-color + - typescript + + /eslint-scope/5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + /eslint-scope/7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + /eslint-visitor-keys/2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + + /eslint-visitor-keys/3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + /eslint-webpack-plugin/3.2.0_3zsjo4afjru4a27oz7f2yugqoa: + resolution: {integrity: sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==} + engines: {node: '>= 12.13.0'} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + webpack: ^5.0.0 + dependencies: + '@types/eslint': 8.44.2 + eslint: 8.47.0 + jest-worker: 28.1.3 + micromatch: 4.0.5 + normalize-path: 3.0.0 + schema-utils: 4.2.0 + webpack: 5.88.2 + + /eslint/8.47.0: + resolution: {integrity: sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0_eslint@8.47.0 + '@eslint-community/regexpp': 4.6.2 + '@eslint/eslintrc': 2.1.2 + '@eslint/js': 8.47.0 + '@humanwhocodes/config-array': 0.11.10 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + 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.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.21.0 + graphemer: 1.4.0 + ignore: 5.2.4 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + 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 + transitivePeerDependencies: + - supports-color + + /espree/9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.10.0 + acorn-jsx: 5.3.2_acorn@8.10.0 + eslint-visitor-keys: 3.4.3 + + /esprima/4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + /esquery/1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + + /esrecurse/4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + + /estraverse/4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + /estraverse/5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + /estree-walker/1.0.1: + resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + + /esutils/2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + /etag/1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + /eventemitter3/4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + /eventemitter3/5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + dev: false + + /events/3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + /execa/5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + /exit/0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + + /expect/27.5.1: + resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + jest-get-type: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + + /express/4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + /extend/3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: false + + /fast-deep-equal/3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-glob/3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + /fast-json-stable-stringify/2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + /fast-levenshtein/2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + /fastq/1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + + /faye-websocket/0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + dependencies: + websocket-driver: 0.7.4 + + /fb-watchman/2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + dependencies: + bser: 2.1.1 + + /file-entry-cache/6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.0.4 + + /file-loader/6.2.0_webpack@5.88.2: + resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + loader-utils: 2.0.4 + schema-utils: 3.3.0 + webpack: 5.88.2 + + /file-saver/2.0.5: + resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==} + dev: false + + /filelist/1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + dependencies: + minimatch: 5.1.6 + + /filename-reserved-regex/2.0.0: + resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==} + engines: {node: '>=4'} + dev: true + + /filenamify/4.3.0: + resolution: {integrity: sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==} + engines: {node: '>=8'} + dependencies: + filename-reserved-regex: 2.0.0 + strip-outer: 1.0.1 + trim-repeated: 1.0.0 + dev: true + + /filesize/8.0.7: + resolution: {integrity: sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==} + engines: {node: '>= 0.4.0'} + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + + /finalhandler/1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + /find-cache-dir/3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + + /find-up/3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + dependencies: + locate-path: 3.0.0 + + /find-up/4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + /find-up/5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + /flat-cache/3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.7 + rimraf: 3.0.2 + + /flatted/3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + + /follow-redirects/1.15.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + /for-each/0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + + /fork-ts-checker-webpack-plugin/6.5.3_l5uwip6bj2qr7x44tnq7g5rwia: + resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} + engines: {node: '>=10', yarn: '>=1.0.0'} + peerDependencies: + eslint: '>= 6' + typescript: '>= 2.7' + vue-template-compiler: '*' + webpack: '>= 4' + peerDependenciesMeta: + eslint: + optional: true + vue-template-compiler: + optional: true + dependencies: + '@babel/code-frame': 7.22.10 + '@types/json-schema': 7.0.12 + chalk: 4.1.2 + chokidar: 3.5.3 + cosmiconfig: 6.0.0 + deepmerge: 4.3.1 + eslint: 8.47.0 + fs-extra: 9.1.0 + glob: 7.2.3 + memfs: 3.5.3 + minimatch: 3.1.2 + schema-utils: 2.7.0 + semver: 7.5.4 + tapable: 1.1.3 + typescript: 4.9.5 + webpack: 5.88.2 + + /form-data/3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + /forwarded/0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + /fraction.js/4.2.0: + resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} + + /fresh/0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + /fs-extra/10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + + /fs-extra/8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + + /fs-extra/9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + + /fs-monkey/1.0.4: + resolution: {integrity: sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==} + + /fs.realpath/1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + + /function.prototype.name/1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + functions-have-names: 1.2.3 + + /functions-have-names/1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + /gensync/1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + /get-caller-file/2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + /get-intrinsic/1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-proto: 1.0.1 + has-symbols: 1.0.3 + + /get-own-enumerable-property-symbols/3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + + /get-package-type/0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + /get-stream/6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + /get-symbol-description/1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + + /gh-pages/4.0.0: + resolution: {integrity: sha512-p8S0T3aGJc68MtwOcZusul5qPSNZCalap3NWbhRUZYu1YOdp+EjZ+4kPmRM8h3NNRdqw00yuevRjlkuSzCn7iQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + async: 2.6.4 + commander: 2.20.3 + email-addresses: 3.1.0 + filenamify: 4.3.0 + find-cache-dir: 3.3.2 + fs-extra: 8.1.0 + globby: 6.1.0 + dev: true + + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + + /glob-parent/6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + + /glob-to-regexp/0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + /glob/7.1.6: + resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /glob/7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /global-modules/2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + dependencies: + global-prefix: 3.0.0 + + /global-prefix/3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + + /globals/11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + /globals/13.21.0: + resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + + /globalthis/1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.0 + + /globby/11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.1 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + + /globby/6.1.0: + resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} + engines: {node: '>=0.10.0'} + dependencies: + array-union: 1.0.2 + glob: 7.2.3 + object-assign: 4.1.1 + pify: 2.3.0 + pinkie-promise: 2.0.1 + dev: true + + /gopd/1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.1 + + /graceful-fs/4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /graphemer/1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + /gzip-size/6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + dependencies: + duplexer: 0.1.2 + + /handle-thing/2.0.1: + resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + + /harmony-reflect/1.6.2: + resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==} + + /has-bigints/1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + /has-flag/3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /has-property-descriptors/1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + dependencies: + get-intrinsic: 1.2.1 + + /has-proto/1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + + /has-symbols/1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + /has-tostringtag/1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + + /hast-util-whitespace/2.0.1: + resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + dev: false + + /he/1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + /hoist-non-react-statics/3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + dependencies: + react-is: 16.13.1 + dev: false + + /hoopy/0.1.4: + resolution: {integrity: sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==} + engines: {node: '>= 6.0.0'} + + /hpack.js/2.1.6: + resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + dependencies: + inherits: 2.0.4 + obuf: 1.1.2 + readable-stream: 2.3.8 + wbuf: 1.7.3 + + /html-encoding-sniffer/2.0.1: + resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} + engines: {node: '>=10'} + dependencies: + whatwg-encoding: 1.0.5 + + /html-entities/2.4.0: + resolution: {integrity: sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==} + + /html-escaper/2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + /html-minifier-terser/6.1.0: + resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} + engines: {node: '>=12'} + hasBin: true + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.2 + commander: 8.3.0 + he: 1.2.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.19.2 + + /html-webpack-plugin/5.5.3_webpack@5.88.2: + resolution: {integrity: sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==} + engines: {node: '>=10.13.0'} + peerDependencies: + webpack: ^5.20.0 + dependencies: + '@types/html-minifier-terser': 6.1.0 + html-minifier-terser: 6.1.0 + lodash: 4.17.21 + pretty-error: 4.0.0 + tapable: 2.2.1 + webpack: 5.88.2 + + /htmlparser2/6.1.0: + resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 2.2.0 + + /http-deceiver/1.2.7: + resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + + /http-errors/1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.0 + statuses: 1.5.0 + + /http-errors/2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + /http-parser-js/0.5.8: + resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} + + /http-proxy-agent/4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + /http-proxy-middleware/2.0.6_@types+express@4.17.17: + resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/express': ^4.17.13 + peerDependenciesMeta: + '@types/express': + optional: true + dependencies: + '@types/express': 4.17.17 + '@types/http-proxy': 1.17.11 + http-proxy: 1.18.1 + is-glob: 4.0.3 + is-plain-obj: 3.0.0 + micromatch: 4.0.5 + transitivePeerDependencies: + - debug + + /http-proxy/1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.2 + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + + /https-proxy-agent/5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + /human-signals/2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + /iconv-lite/0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + + /iconv-lite/0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + + /icss-utils/5.1.0_postcss@8.4.27: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.27 + + /idb/7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + + /identity-obj-proxy/3.0.0: + resolution: {integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==} + engines: {node: '>=4'} + dependencies: + harmony-reflect: 1.6.2 + + /ignore/5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + + /immer/9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + + /import-fresh/3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /import-local/3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + + /imurmurhash/0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + /indent-string/4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: false + + /inflight/1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits/2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini/1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + /inline-style-parser/0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + dev: false + + /internal-slot/1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + has: 1.0.3 + side-channel: 1.0.4 + + /ipaddr.js/1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + /ipaddr.js/2.1.0: + resolution: {integrity: sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==} + engines: {node: '>= 10'} + + /is-arguments/1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: false + + /is-array-buffer/3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.12 + + /is-arrayish/0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + /is-bigint/1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + + /is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + + /is-boolean-object/1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + + /is-buffer/2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + dev: false + + /is-callable/1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + /is-core-module/2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + dependencies: + has: 1.0.3 + + /is-date-object/1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + + /is-docker/2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + /is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-fullwidth-code-point/3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-generator-fn/2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-map/2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + dev: false + + /is-module/1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + + /is-negative-zero/2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + + /is-number-object/1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /is-obj/1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + + /is-path-inside/3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + /is-plain-obj/3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + + /is-plain-obj/4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + dev: false + + /is-plain-object/2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /is-potential-custom-element-name/1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + + /is-regex/1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + + /is-regexp/1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} + + /is-root/2.1.0: + resolution: {integrity: sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==} + engines: {node: '>=6'} + + /is-set/2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + dev: false + + /is-shared-array-buffer/1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.2 + + /is-stream/2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + /is-string/1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + + /is-symbol/1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + + /is-typed-array/1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.11 + + /is-typedarray/1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + /is-weakmap/2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + dev: false + + /is-weakref/1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.2 + + /is-weakset/2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + dev: false + + /is-wsl/2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + + /isarray/1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + /isarray/2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + /isexe/2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /isobject/3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + dev: true + + /istanbul-lib-coverage/3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} + + /istanbul-lib-instrument/5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.22.10 + '@babel/parser': 7.22.10 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /istanbul-lib-report/3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + dependencies: + istanbul-lib-coverage: 3.2.0 + make-dir: 4.0.0 + supports-color: 7.2.0 + + /istanbul-lib-source-maps/4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + dependencies: + debug: 4.3.4 + istanbul-lib-coverage: 3.2.0 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + + /istanbul-reports/3.1.6: + resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + /jake/10.8.7: + resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} + engines: {node: '>=10'} + hasBin: true + dependencies: + async: 3.2.4 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + + /jest-changed-files/27.5.1: + resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + execa: 5.1.1 + throat: 6.0.2 + + /jest-circus/27.5.1: + resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 16.18.40 + chalk: 4.1.2 + co: 4.6.0 + dedent: 0.7.0 + expect: 27.5.1 + is-generator-fn: 2.1.0 + jest-each: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 + slash: 3.0.0 + stack-utils: 2.0.6 + throat: 6.0.2 + transitivePeerDependencies: + - supports-color + + /jest-cli/27.5.1: + resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.1.0 + jest-config: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + prompts: 2.4.2 + yargs: 16.2.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + + /jest-config/27.5.1: + resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + ts-node: '>=9.0.0' + peerDependenciesMeta: + ts-node: + optional: true + dependencies: + '@babel/core': 7.22.10 + '@jest/test-sequencer': 27.5.1 + '@jest/types': 27.5.1 + babel-jest: 27.5.1_@babel+core@7.22.10 + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 27.5.1 + jest-environment-jsdom: 27.5.1 + jest-environment-node: 27.5.1 + jest-get-type: 27.5.1 + jest-jasmine2: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-runner: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 27.5.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + + /jest-diff/27.5.1: + resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 27.5.1 + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + + /jest-docblock/27.5.1: + resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + detect-newline: 3.1.0 + + /jest-each/27.5.1: + resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + chalk: 4.1.2 + jest-get-type: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 + + /jest-environment-jsdom/27.5.1: + resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 16.18.40 + jest-mock: 27.5.1 + jest-util: 27.5.1 + jsdom: 16.7.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + + /jest-environment-node/27.5.1: + resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 16.18.40 + jest-mock: 27.5.1 + jest-util: 27.5.1 + + /jest-get-type/27.5.1: + resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + /jest-haste-map/27.5.1: + resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/graceful-fs': 4.1.6 + '@types/node': 16.18.40 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 27.5.1 + jest-serializer: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.2 + + /jest-jasmine2/27.5.1: + resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/source-map': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 16.18.40 + chalk: 4.1.2 + co: 4.6.0 + expect: 27.5.1 + is-generator-fn: 2.1.0 + jest-each: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 + throat: 6.0.2 + transitivePeerDependencies: + - supports-color + + /jest-leak-detector/27.5.1: + resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + + /jest-matcher-utils/27.5.1: + resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 27.5.1 + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + + /jest-message-util/27.5.1: + resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/code-frame': 7.22.10 + '@jest/types': 27.5.1 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 27.5.1 + slash: 3.0.0 + stack-utils: 2.0.6 + + /jest-message-util/28.1.3: + resolution: {integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@babel/code-frame': 7.22.10 + '@jest/types': 28.1.3 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 28.1.3 + slash: 3.0.0 + stack-utils: 2.0.6 + + /jest-mock/27.5.1: + resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 16.18.40 + + /jest-pnp-resolver/1.2.3_jest-resolve@27.5.1: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 27.5.1 + + /jest-regex-util/27.5.1: + resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + /jest-regex-util/28.0.2: + resolution: {integrity: sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + + /jest-resolve-dependencies/27.5.1: + resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + jest-regex-util: 27.5.1 + jest-snapshot: 27.5.1 + transitivePeerDependencies: + - supports-color + + /jest-resolve/27.5.1: + resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-pnp-resolver: 1.2.3_jest-resolve@27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + resolve: 1.22.4 + resolve.exports: 1.1.1 + slash: 3.0.0 + + /jest-runner/27.5.1: + resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/console': 27.5.1 + '@jest/environment': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 16.18.40 + chalk: 4.1.2 + emittery: 0.8.1 + graceful-fs: 4.2.11 + jest-docblock: 27.5.1 + jest-environment-jsdom: 27.5.1 + jest-environment-node: 27.5.1 + jest-haste-map: 27.5.1 + jest-leak-detector: 27.5.1 + jest-message-util: 27.5.1 + jest-resolve: 27.5.1 + jest-runtime: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + source-map-support: 0.5.21 + throat: 6.0.2 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + + /jest-runtime/27.5.1: + resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/globals': 27.5.1 + '@jest/source-map': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + chalk: 4.1.2 + cjs-module-lexer: 1.2.3 + collect-v8-coverage: 1.0.2 + execa: 5.1.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-message-util: 27.5.1 + jest-mock: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + + /jest-serializer/27.5.1: + resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/node': 16.18.40 + graceful-fs: 4.2.11 + + /jest-snapshot/27.5.1: + resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/core': 7.22.10 + '@babel/generator': 7.22.10 + '@babel/plugin-syntax-typescript': 7.22.5_@babel+core@7.22.10 + '@babel/traverse': 7.22.10 + '@babel/types': 7.22.10 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/babel__traverse': 7.20.1 + '@types/prettier': 2.7.3 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.22.10 + chalk: 4.1.2 + expect: 27.5.1 + graceful-fs: 4.2.11 + jest-diff: 27.5.1 + jest-get-type: 27.5.1 + jest-haste-map: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-util: 27.5.1 + natural-compare: 1.4.0 + pretty-format: 27.5.1 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + + /jest-util/27.5.1: + resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 16.18.40 + chalk: 4.1.2 + ci-info: 3.8.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + + /jest-util/28.1.3: + resolution: {integrity: sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.3 + '@types/node': 16.18.40 + chalk: 4.1.2 + ci-info: 3.8.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + + /jest-validate/27.5.1: + resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 27.5.1 + leven: 3.1.0 + pretty-format: 27.5.1 + + /jest-watch-typeahead/1.1.0_jest@27.5.1: + resolution: {integrity: sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + jest: ^27.0.0 || ^28.0.0 + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + jest: 27.5.1 + jest-regex-util: 28.0.2 + jest-watcher: 28.1.3 + slash: 4.0.0 + string-length: 5.0.1 + strip-ansi: 7.1.0 + + /jest-watcher/27.5.1: + resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 16.18.40 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + jest-util: 27.5.1 + string-length: 4.0.2 + + /jest-watcher/28.1.3: + resolution: {integrity: sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/test-result': 28.1.3 + '@jest/types': 28.1.3 + '@types/node': 16.18.40 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.10.2 + jest-util: 28.1.3 + string-length: 4.0.2 + + /jest-worker/26.6.2: + resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 16.18.40 + merge-stream: 2.0.0 + supports-color: 7.2.0 + + /jest-worker/27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 16.18.40 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + /jest-worker/28.1.3: + resolution: {integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@types/node': 16.18.40 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + /jest/27.5.1: + resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 27.5.1 + import-local: 3.1.0 + jest-cli: 27.5.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + + /jiti/1.19.1: + resolution: {integrity: sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==} + hasBin: true + + /js-tokens/4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml/3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + /js-yaml/4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + + /jsdom/16.7.0: + resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} + engines: {node: '>=10'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + abab: 2.0.6 + acorn: 8.10.0 + acorn-globals: 6.0.0 + cssom: 0.4.4 + cssstyle: 2.3.0 + data-urls: 2.0.0 + decimal.js: 10.4.3 + domexception: 2.0.1 + escodegen: 2.1.0 + form-data: 3.0.1 + html-encoding-sniffer: 2.0.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.7 + parse5: 6.0.1 + saxes: 5.0.1 + symbol-tree: 3.2.4 + tough-cookie: 4.1.3 + w3c-hr-time: 1.0.2 + w3c-xmlserializer: 2.0.0 + webidl-conversions: 6.1.0 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + ws: 7.5.9 + xml-name-validator: 3.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + /jsesc/0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + + /jsesc/2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + /json-parse-even-better-errors/2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + /json-schema-traverse/0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + /json-schema-traverse/1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + /json-schema/0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + /json-stable-stringify-without-jsonify/1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + /json5/1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + + /json5/2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + /jsonfile/4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /jsonfile/6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.11 + + /jsonpointer/5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + + /jsx-ast-utils/3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + dependencies: + array-includes: 3.1.6 + array.prototype.flat: 1.3.1 + object.assign: 4.1.4 + object.values: 1.1.6 + + /kind-of/6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + /kleur/3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + /kleur/4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + dev: false + + /klona/2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} + + /language-subtag-registry/0.3.22: + resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} + + /language-tags/1.0.5: + resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==} + dependencies: + language-subtag-registry: 0.3.22 + + /launch-editor/2.6.0: + resolution: {integrity: sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==} + dependencies: + picocolors: 1.0.0 + shell-quote: 1.8.1 + + /leven/3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + /levn/0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /lilconfig/2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + /lines-and-columns/1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + /loader-runner/4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + /loader-utils/1.4.2: + resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} + engines: {node: '>=4.0.0'} + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 1.0.2 + dev: true + + /loader-utils/2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + + /loader-utils/3.2.1: + resolution: {integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==} + engines: {node: '>= 12.13.0'} + + /locate-path/3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + + /locate-path/5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + + /locate-path/6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + + /lodash.debounce/4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + /lodash.memoize/4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + /lodash.merge/4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + /lodash.sortby/4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + /lodash.uniq/4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + /lodash/4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /long/3.2.0: + resolution: {integrity: sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg==} + engines: {node: '>=0.6'} + dev: true + + /loose-envify/1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + + /lower-case/2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.6.1 + + /lru-cache/5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + + /lru-cache/6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /luxon/3.4.0: + resolution: {integrity: sha512-7eDo4Pt7aGhoCheGFIuq4Xa2fJm4ZpmldpGhjTYBNUYNCN6TIEP6v7chwwwt3KRp7YR+rghbfvjyo3V5y9hgBw==} + engines: {node: '>=12'} + dev: false + + /lz-string/1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + dev: false + + /magic-string/0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + + /make-dir/3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.1 + + /make-dir/4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + + /make-error/1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /makeerror/1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + dependencies: + tmpl: 1.0.5 + + /mdast-util-definitions/5.1.2: + resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} + dependencies: + '@types/mdast': 3.0.12 + '@types/unist': 2.0.7 + unist-util-visit: 4.1.2 + dev: false + + /mdast-util-from-markdown/1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + dependencies: + '@types/mdast': 3.0.12 + '@types/unist': 2.0.7 + decode-named-character-reference: 1.0.2 + mdast-util-to-string: 3.2.0 + micromark: 3.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-decode-string: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-stringify-position: 3.0.3 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-to-hast/12.3.0: + resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} + dependencies: + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 + mdast-util-definitions: 5.1.2 + micromark-util-sanitize-uri: 1.2.0 + trim-lines: 3.0.1 + unist-util-generated: 2.0.1 + unist-util-position: 4.0.4 + unist-util-visit: 4.1.2 + dev: false + + /mdast-util-to-string/3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + dependencies: + '@types/mdast': 3.0.12 + dev: false + + /mdn-data/2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + + /mdn-data/2.0.4: + resolution: {integrity: sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==} + + /media-typer/0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + /memfs/3.5.3: + resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} + engines: {node: '>= 4.0.0'} + dependencies: + fs-monkey: 1.0.4 + + /merge-descriptors/1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + + /merge-stream/2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + /merge2/1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + /methods/1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + /micromark-core-commonmark/1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-factory-destination: 1.1.0 + micromark-factory-label: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-factory-title: 1.1.0 + micromark-factory-whitespace: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-html-tag-name: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-factory-destination/1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-factory-label/1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-factory-space/1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-factory-title/1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-factory-whitespace/1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-util-character/1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-util-chunked/1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + dependencies: + micromark-util-symbol: 1.1.0 + dev: false + + /micromark-util-classify-character/1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-util-combine-extensions/1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-util-decode-numeric-character-reference/1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + dependencies: + micromark-util-symbol: 1.1.0 + dev: false + + /micromark-util-decode-string/1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 1.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-symbol: 1.1.0 + dev: false + + /micromark-util-encode/1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + dev: false + + /micromark-util-html-tag-name/1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + dev: false + + /micromark-util-normalize-identifier/1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + dependencies: + micromark-util-symbol: 1.1.0 + dev: false + + /micromark-util-resolve-all/1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + dependencies: + micromark-util-types: 1.1.0 + dev: false + + /micromark-util-sanitize-uri/1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-encode: 1.1.0 + micromark-util-symbol: 1.1.0 + dev: false + + /micromark-util-subtokenize/1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-util-symbol/1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + dev: false + + /micromark-util-types/1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + dev: false + + /micromark/3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + dependencies: + '@types/debug': 4.1.8 + debug: 4.3.4 + decode-named-character-reference: 1.0.2 + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-combine-extensions: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-encode: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: false + + /micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + /mime-db/1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types/2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /mime/1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + /mimic-fn/2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + /min-indent/1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: false + + /mini-css-extract-plugin/2.7.6_webpack@5.88.2: + resolution: {integrity: sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + dependencies: + schema-utils: 4.2.0 + webpack: 5.88.2 + + /minimalistic-assert/1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /minimatch/5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + + /minimist/1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + /mkdirp/0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + + /mri/1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + dev: false + + /ms/2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms/2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + /multicast-dns/7.2.5: + resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} + hasBin: true + dependencies: + dns-packet: 5.6.0 + thunky: 1.1.0 + + /mz/2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + /nanoid/3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /natural-compare-lite/1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + + /natural-compare/1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + /negotiator/0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + /neo-async/2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + /no-case/3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + dependencies: + lower-case: 2.0.2 + tslib: 2.6.1 + + /node-forge/1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + /node-int64/0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + /node-releases/2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + /normalize-range/0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + /normalize-url/6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + /npm-run-path/4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + + /nth-check/1.0.2: + resolution: {integrity: sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==} + dependencies: + boolbase: 1.0.0 + + /nth-check/2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + + /nwsapi/2.2.7: + resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} + + /object-assign/4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + /object-hash/3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + /object-inspect/1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + + /object-is/1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + dev: false + + /object-keys/1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + /object.assign/4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + has-symbols: 1.0.3 + object-keys: 1.1.1 + + /object.entries/1.1.6: + resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + + /object.fromentries/2.0.6: + resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + + /object.getownpropertydescriptors/2.1.6: + resolution: {integrity: sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ==} + engines: {node: '>= 0.8'} + dependencies: + array.prototype.reduce: 1.0.5 + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + safe-array-concat: 1.0.0 + + /object.groupby/1.0.0: + resolution: {integrity: sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 + + /object.hasown/1.1.2: + resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} + dependencies: + define-properties: 1.2.0 + es-abstract: 1.22.1 + + /object.values/1.1.6: + resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + + /obuf/1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + + /on-finished/2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + + /on-headers/1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + + /once/1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /onetime/5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + + /open/8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + /optionator/0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /p-limit/2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + + /p-limit/3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + + /p-locate/3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + dependencies: + p-limit: 2.3.0 + + /p-locate/4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + + /p-locate/5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + + /p-retry/4.6.2: + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} + dependencies: + '@types/retry': 0.12.0 + retry: 0.13.1 + + /p-try/2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + /param-case/3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + dependencies: + dot-case: 3.0.4 + tslib: 2.6.1 + + /parent-module/1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + + /parse-json/5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.22.10 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + /parse5/6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + + /parseurl/1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + /pascal-case/3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.1 + + /path-exists/3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + /path-exists/4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + /path-is-absolute/1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-key/3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-to-regexp/0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + + /path-type/4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + /performance-now/2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + + /picocolors/0.2.1: + resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /pify/2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + /pinkie-promise/2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + dependencies: + pinkie: 2.0.4 + dev: true + + /pinkie/2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + dev: true + + /pirates/4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + /pkg-dir/4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + + /pkg-up/3.1.0: + resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} + engines: {node: '>=8'} + dependencies: + find-up: 3.0.0 + + /postcss-attribute-case-insensitive/5.0.2_postcss@8.4.27: + resolution: {integrity: sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.27 + postcss-selector-parser: 6.0.13 + + /postcss-browser-comments/4.0.0_inz5kvjhnomxaytbzwg5ouybvm: + resolution: {integrity: sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==} + engines: {node: '>=8'} + peerDependencies: + browserslist: '>=4' + postcss: '>=8' + dependencies: + browserslist: 4.21.10 + postcss: 8.4.27 + + /postcss-calc/8.2.4_postcss@8.4.27: + resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} + peerDependencies: + postcss: ^8.2.2 + dependencies: + postcss: 8.4.27 + postcss-selector-parser: 6.0.13 + postcss-value-parser: 4.2.0 + + /postcss-clamp/4.1.0_postcss@8.4.27: + resolution: {integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==} + engines: {node: '>=7.6.0'} + peerDependencies: + postcss: ^8.4.6 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-color-functional-notation/4.2.4_postcss@8.4.27: + resolution: {integrity: sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-color-hex-alpha/8.0.4_postcss@8.4.27: + resolution: {integrity: sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-color-rebeccapurple/7.1.1_postcss@8.4.27: + resolution: {integrity: sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-colormin/5.3.1_postcss@8.4.27: + resolution: {integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.10 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-convert-values/5.1.3_postcss@8.4.27: + resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.10 + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-custom-media/8.0.2_postcss@8.4.27: + resolution: {integrity: sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.3 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-custom-properties/12.1.11_postcss@8.4.27: + resolution: {integrity: sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-custom-selectors/6.0.3_postcss@8.4.27: + resolution: {integrity: sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.3 + dependencies: + postcss: 8.4.27 + postcss-selector-parser: 6.0.13 + + /postcss-dir-pseudo-class/6.0.5_postcss@8.4.27: + resolution: {integrity: sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.27 + postcss-selector-parser: 6.0.13 + + /postcss-discard-comments/5.1.2_postcss@8.4.27: + resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + + /postcss-discard-duplicates/5.1.0_postcss@8.4.27: + resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + + /postcss-discard-empty/5.1.1_postcss@8.4.27: + resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + + /postcss-discard-overridden/5.1.0_postcss@8.4.27: + resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + + /postcss-double-position-gradients/3.1.2_postcss@8.4.27: + resolution: {integrity: sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.27 + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-env-function/4.0.6_postcss@8.4.27: + resolution: {integrity: sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-flexbugs-fixes/5.0.2_postcss@8.4.27: + resolution: {integrity: sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==} + peerDependencies: + postcss: ^8.1.4 + dependencies: + postcss: 8.4.27 + + /postcss-focus-visible/6.0.4_postcss@8.4.27: + resolution: {integrity: sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.27 + postcss-selector-parser: 6.0.13 + + /postcss-focus-within/5.0.4_postcss@8.4.27: + resolution: {integrity: sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.27 + postcss-selector-parser: 6.0.13 + + /postcss-font-variant/5.0.0_postcss@8.4.27: + resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.27 + + /postcss-gap-properties/3.0.5_postcss@8.4.27: + resolution: {integrity: sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.27 + + /postcss-image-set-function/4.0.7_postcss@8.4.27: + resolution: {integrity: sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-import/15.1.0_postcss@8.4.27: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.4 + + /postcss-initial/4.0.1_postcss@8.4.27: + resolution: {integrity: sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.27 + + /postcss-js/4.0.1_postcss@8.4.27: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.27 + + /postcss-lab-function/4.2.1_postcss@8.4.27: + resolution: {integrity: sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.27 + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-load-config/4.0.1_postcss@8.4.27: + resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 2.1.0 + postcss: 8.4.27 + yaml: 2.3.1 + + /postcss-loader/6.2.1_wtdfwmg7ycxaq333qvq47tatda: + resolution: {integrity: sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==} + engines: {node: '>= 12.13.0'} + peerDependencies: + postcss: ^7.0.0 || ^8.0.1 + webpack: ^5.0.0 + dependencies: + cosmiconfig: 7.1.0 + klona: 2.0.6 + postcss: 8.4.27 + semver: 7.5.4 + webpack: 5.88.2 + + /postcss-logical/5.0.4_postcss@8.4.27: + resolution: {integrity: sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.27 + + /postcss-media-minmax/5.0.0_postcss@8.4.27: + resolution: {integrity: sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.27 + + /postcss-merge-longhand/5.1.7_postcss@8.4.27: + resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + stylehacks: 5.1.1_postcss@8.4.27 + + /postcss-merge-rules/5.1.4_postcss@8.4.27: + resolution: {integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.10 + caniuse-api: 3.0.0 + cssnano-utils: 3.1.0_postcss@8.4.27 + postcss: 8.4.27 + postcss-selector-parser: 6.0.13 + + /postcss-minify-font-values/5.1.0_postcss@8.4.27: + resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-minify-gradients/5.1.1_postcss@8.4.27: + resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + colord: 2.9.3 + cssnano-utils: 3.1.0_postcss@8.4.27 + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-minify-params/5.1.4_postcss@8.4.27: + resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.10 + cssnano-utils: 3.1.0_postcss@8.4.27 + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-minify-selectors/5.2.1_postcss@8.4.27: + resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + postcss-selector-parser: 6.0.13 + + /postcss-modules-extract-imports/3.0.0_postcss@8.4.27: + resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.27 + + /postcss-modules-local-by-default/4.0.3_postcss@8.4.27: + resolution: {integrity: sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + icss-utils: 5.1.0_postcss@8.4.27 + postcss: 8.4.27 + postcss-selector-parser: 6.0.13 + postcss-value-parser: 4.2.0 + + /postcss-modules-scope/3.0.0_postcss@8.4.27: + resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.27 + postcss-selector-parser: 6.0.13 + + /postcss-modules-values/4.0.0_postcss@8.4.27: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + icss-utils: 5.1.0_postcss@8.4.27 + postcss: 8.4.27 + + /postcss-nested/6.0.1_postcss@8.4.27: + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.27 + postcss-selector-parser: 6.0.13 + + /postcss-nesting/10.2.0_postcss@8.4.27: + resolution: {integrity: sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + '@csstools/selector-specificity': 2.2.0_c3vcbepomgmxc74cgtawpgpkyi + postcss: 8.4.27 + postcss-selector-parser: 6.0.13 + + /postcss-normalize-charset/5.1.0_postcss@8.4.27: + resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + + /postcss-normalize-display-values/5.1.0_postcss@8.4.27: + resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-normalize-positions/5.1.1_postcss@8.4.27: + resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-normalize-repeat-style/5.1.1_postcss@8.4.27: + resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-normalize-string/5.1.0_postcss@8.4.27: + resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-normalize-timing-functions/5.1.0_postcss@8.4.27: + resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-normalize-unicode/5.1.1_postcss@8.4.27: + resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.10 + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-normalize-url/5.1.0_postcss@8.4.27: + resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + normalize-url: 6.1.0 + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-normalize-whitespace/5.1.1_postcss@8.4.27: + resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-normalize/10.0.1_inz5kvjhnomxaytbzwg5ouybvm: + resolution: {integrity: sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==} + engines: {node: '>= 12'} + peerDependencies: + browserslist: '>= 4' + postcss: '>= 8' + dependencies: + '@csstools/normalize.css': 12.0.0 + browserslist: 4.21.10 + postcss: 8.4.27 + postcss-browser-comments: 4.0.0_inz5kvjhnomxaytbzwg5ouybvm + sanitize.css: 13.0.0 + + /postcss-opacity-percentage/1.1.3_postcss@8.4.27: + resolution: {integrity: sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.27 + + /postcss-ordered-values/5.1.3_postcss@8.4.27: + resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-utils: 3.1.0_postcss@8.4.27 + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-overflow-shorthand/3.0.4_postcss@8.4.27: + resolution: {integrity: sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-page-break/3.0.4_postcss@8.4.27: + resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==} + peerDependencies: + postcss: ^8 + dependencies: + postcss: 8.4.27 + + /postcss-place/7.0.5_postcss@8.4.27: + resolution: {integrity: sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-preset-env/7.8.3_postcss@8.4.27: + resolution: {integrity: sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + '@csstools/postcss-cascade-layers': 1.1.1_postcss@8.4.27 + '@csstools/postcss-color-function': 1.1.1_postcss@8.4.27 + '@csstools/postcss-font-format-keywords': 1.0.1_postcss@8.4.27 + '@csstools/postcss-hwb-function': 1.0.2_postcss@8.4.27 + '@csstools/postcss-ic-unit': 1.0.1_postcss@8.4.27 + '@csstools/postcss-is-pseudo-class': 2.0.7_postcss@8.4.27 + '@csstools/postcss-nested-calc': 1.0.0_postcss@8.4.27 + '@csstools/postcss-normalize-display-values': 1.0.1_postcss@8.4.27 + '@csstools/postcss-oklab-function': 1.1.1_postcss@8.4.27 + '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.27 + '@csstools/postcss-stepped-value-functions': 1.0.1_postcss@8.4.27 + '@csstools/postcss-text-decoration-shorthand': 1.0.0_postcss@8.4.27 + '@csstools/postcss-trigonometric-functions': 1.0.2_postcss@8.4.27 + '@csstools/postcss-unset-value': 1.0.2_postcss@8.4.27 + autoprefixer: 10.4.14_postcss@8.4.27 + browserslist: 4.21.10 + css-blank-pseudo: 3.0.3_postcss@8.4.27 + css-has-pseudo: 3.0.4_postcss@8.4.27 + css-prefers-color-scheme: 6.0.3_postcss@8.4.27 + cssdb: 7.7.0 + postcss: 8.4.27 + postcss-attribute-case-insensitive: 5.0.2_postcss@8.4.27 + postcss-clamp: 4.1.0_postcss@8.4.27 + postcss-color-functional-notation: 4.2.4_postcss@8.4.27 + postcss-color-hex-alpha: 8.0.4_postcss@8.4.27 + postcss-color-rebeccapurple: 7.1.1_postcss@8.4.27 + postcss-custom-media: 8.0.2_postcss@8.4.27 + postcss-custom-properties: 12.1.11_postcss@8.4.27 + postcss-custom-selectors: 6.0.3_postcss@8.4.27 + postcss-dir-pseudo-class: 6.0.5_postcss@8.4.27 + postcss-double-position-gradients: 3.1.2_postcss@8.4.27 + postcss-env-function: 4.0.6_postcss@8.4.27 + postcss-focus-visible: 6.0.4_postcss@8.4.27 + postcss-focus-within: 5.0.4_postcss@8.4.27 + postcss-font-variant: 5.0.0_postcss@8.4.27 + postcss-gap-properties: 3.0.5_postcss@8.4.27 + postcss-image-set-function: 4.0.7_postcss@8.4.27 + postcss-initial: 4.0.1_postcss@8.4.27 + postcss-lab-function: 4.2.1_postcss@8.4.27 + postcss-logical: 5.0.4_postcss@8.4.27 + postcss-media-minmax: 5.0.0_postcss@8.4.27 + postcss-nesting: 10.2.0_postcss@8.4.27 + postcss-opacity-percentage: 1.1.3_postcss@8.4.27 + postcss-overflow-shorthand: 3.0.4_postcss@8.4.27 + postcss-page-break: 3.0.4_postcss@8.4.27 + postcss-place: 7.0.5_postcss@8.4.27 + postcss-pseudo-class-any-link: 7.1.6_postcss@8.4.27 + postcss-replace-overflow-wrap: 4.0.0_postcss@8.4.27 + postcss-selector-not: 6.0.1_postcss@8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-pseudo-class-any-link/7.1.6_postcss@8.4.27: + resolution: {integrity: sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.27 + postcss-selector-parser: 6.0.13 + + /postcss-reduce-initial/5.1.2_postcss@8.4.27: + resolution: {integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.10 + caniuse-api: 3.0.0 + postcss: 8.4.27 + + /postcss-reduce-transforms/5.1.0_postcss@8.4.27: + resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + + /postcss-replace-overflow-wrap/4.0.0_postcss@8.4.27: + resolution: {integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==} + peerDependencies: + postcss: ^8.0.3 + dependencies: + postcss: 8.4.27 + + /postcss-selector-not/6.0.1_postcss@8.4.27: + resolution: {integrity: sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.27 + postcss-selector-parser: 6.0.13 + + /postcss-selector-parser/6.0.13: + resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + /postcss-svgo/5.1.0_postcss@8.4.27: + resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + svgo: 2.8.0 + + /postcss-unique-selectors/5.1.1_postcss@8.4.27: + resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.27 + postcss-selector-parser: 6.0.13 + + /postcss-value-parser/4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + /postcss/7.0.39: + resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==} + engines: {node: '>=6.0.0'} + dependencies: + picocolors: 0.2.1 + source-map: 0.6.1 + + /postcss/8.4.27: + resolution: {integrity: sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + + /prelude-ls/1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + /pretty-bytes/5.6.0: + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} + + /pretty-error/4.0.0: + resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} + dependencies: + lodash: 4.17.21 + renderkid: 3.0.0 + + /pretty-format/27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + + /pretty-format/28.1.3: + resolution: {integrity: sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/schemas': 28.1.3 + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 18.2.0 + + /process-nextick-args/2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + /promise/8.3.0: + resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} + dependencies: + asap: 2.0.6 + + /prompts/2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + /prop-types/15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + /property-information/6.2.0: + resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==} + dev: false + + /proxy-addr/2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + /psl/1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + + /punycode/2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + + /q/1.5.1: + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + + /qs/6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + + /querystringify/2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + + /queue-microtask/1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + /raf/3.4.1: + resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} + dependencies: + performance-now: 2.1.0 + + /randombytes/2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + + /range-parser/1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + /raw-body/2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + /react-app-polyfill/3.0.0: + resolution: {integrity: sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==} + engines: {node: '>=14'} + dependencies: + core-js: 3.32.0 + object-assign: 4.1.1 + promise: 8.3.0 + raf: 3.4.1 + regenerator-runtime: 0.13.11 + whatwg-fetch: 3.6.17 + + /react-dev-utils/12.0.1_l5uwip6bj2qr7x44tnq7g5rwia: + resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=2.7' + webpack: '>=4' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@babel/code-frame': 7.22.10 + address: 1.2.2 + browserslist: 4.21.10 + chalk: 4.1.2 + cross-spawn: 7.0.3 + detect-port-alt: 1.1.6 + escape-string-regexp: 4.0.0 + filesize: 8.0.7 + find-up: 5.0.0 + fork-ts-checker-webpack-plugin: 6.5.3_l5uwip6bj2qr7x44tnq7g5rwia + global-modules: 2.0.0 + globby: 11.1.0 + gzip-size: 6.0.0 + immer: 9.0.21 + is-root: 2.1.0 + loader-utils: 3.2.1 + open: 8.4.2 + pkg-up: 3.1.0 + prompts: 2.4.2 + react-error-overlay: 6.0.11 + recursive-readdir: 2.2.3 + shell-quote: 1.8.1 + strip-ansi: 6.0.1 + text-table: 0.2.0 + typescript: 4.9.5 + webpack: 5.88.2 + transitivePeerDependencies: + - eslint + - supports-color + - vue-template-compiler + + /react-dnd-html5-backend/16.0.1: + resolution: {integrity: sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw==} + dependencies: + dnd-core: 16.0.1 + dev: false + + /react-dnd/16.0.1_tmexzulqvmqns5ldwaibu3jqgu: + resolution: {integrity: sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q==} + peerDependencies: + '@types/hoist-non-react-statics': '>= 3.3.1' + '@types/node': '>= 12' + '@types/react': '>= 16' + react: '>= 16.14' + peerDependenciesMeta: + '@types/hoist-non-react-statics': + optional: true + '@types/node': + optional: true + '@types/react': + optional: true + dependencies: + '@react-dnd/invariant': 4.0.2 + '@react-dnd/shallowequal': 4.0.2 + '@types/node': 16.18.40 + '@types/react': 18.2.20 + dnd-core: 16.0.1 + fast-deep-equal: 3.1.3 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + dev: false + + /react-dom/18.2.0_react@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: false + + /react-error-overlay/6.0.11: + resolution: {integrity: sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==} + + /react-icons/4.10.1_react@18.2.0: + resolution: {integrity: sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw==} + peerDependencies: + react: '*' + dependencies: + react: 18.2.0 + dev: false + + /react-is/16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + /react-is/17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + /react-is/18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + + /react-markdown/8.0.7_j3ahe22lw6ac2w6qvqp4kjqnqy: + resolution: {integrity: sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + dependencies: + '@types/hast': 2.3.5 + '@types/prop-types': 15.7.5 + '@types/react': 18.2.20 + '@types/unist': 2.0.7 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 2.0.1 + prop-types: 15.8.1 + property-information: 6.2.0 + react: 18.2.0 + react-is: 18.2.0 + remark-parse: 10.0.2 + remark-rehype: 10.1.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.2 + unified: 10.1.2 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + transitivePeerDependencies: + - supports-color + dev: false + + /react-refresh/0.11.0: + resolution: {integrity: sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==} + engines: {node: '>=0.10.0'} + + /react-router-dom/6.15.0_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-aR42t0fs7brintwBGAv2+mGlCtgtFQeOzK0BM1/OiqEzRejOZtpMZepvgkscpMUnKb8YO84G7s3LsHnnDNonbQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + '@remix-run/router': 1.8.0 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + react-router: 6.15.0_react@18.2.0 + dev: false + + /react-router/6.15.0_react@18.2.0: + resolution: {integrity: sha512-NIytlzvzLwJkCQj2HLefmeakxxWHWAP+02EGqWEZy+DgfHHKQMUoBBjUQLOtFInBMhWtb3hiUy6MfFgwLjXhqg==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + dependencies: + '@remix-run/router': 1.8.0 + react: 18.2.0 + dev: false + + /react-scripts/5.0.1_j5ip3o3v6sktjzl5cxtjyfbuo4: + resolution: {integrity: sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==} + engines: {node: '>=14.0.0'} + hasBin: true + peerDependencies: + react: '>= 16' + typescript: ^3.2.1 || ^4 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@babel/core': 7.22.10 + '@pmmmwh/react-refresh-webpack-plugin': 0.5.10_yzxi3427mpmymp2edesmoixdua + '@svgr/webpack': 5.5.0 + babel-jest: 27.5.1_@babel+core@7.22.10 + babel-loader: 8.3.0_a7bz5yhgcoab2comip4bcc2pf4 + babel-plugin-named-asset-import: 0.3.8_@babel+core@7.22.10 + babel-preset-react-app: 10.0.1 + bfj: 7.0.2 + browserslist: 4.21.10 + camelcase: 6.3.0 + case-sensitive-paths-webpack-plugin: 2.4.0 + css-loader: 6.8.1_webpack@5.88.2 + css-minimizer-webpack-plugin: 3.4.1_webpack@5.88.2 + dotenv: 10.0.0 + dotenv-expand: 5.1.0 + eslint: 8.47.0 + eslint-config-react-app: 7.0.1_hewhl32arvhpzpkgjcsdnjm62y + eslint-webpack-plugin: 3.2.0_3zsjo4afjru4a27oz7f2yugqoa + file-loader: 6.2.0_webpack@5.88.2 + fs-extra: 10.1.0 + html-webpack-plugin: 5.5.3_webpack@5.88.2 + identity-obj-proxy: 3.0.0 + jest: 27.5.1 + jest-resolve: 27.5.1 + jest-watch-typeahead: 1.1.0_jest@27.5.1 + mini-css-extract-plugin: 2.7.6_webpack@5.88.2 + postcss: 8.4.27 + postcss-flexbugs-fixes: 5.0.2_postcss@8.4.27 + postcss-loader: 6.2.1_wtdfwmg7ycxaq333qvq47tatda + postcss-normalize: 10.0.1_inz5kvjhnomxaytbzwg5ouybvm + postcss-preset-env: 7.8.3_postcss@8.4.27 + prompts: 2.4.2 + react: 18.2.0 + react-app-polyfill: 3.0.0 + react-dev-utils: 12.0.1_l5uwip6bj2qr7x44tnq7g5rwia + react-refresh: 0.11.0 + resolve: 1.22.4 + resolve-url-loader: 4.0.0 + sass-loader: 12.6.0_webpack@5.88.2 + semver: 7.5.4 + source-map-loader: 3.0.2_webpack@5.88.2 + style-loader: 3.3.3_webpack@5.88.2 + tailwindcss: 3.3.3 + terser-webpack-plugin: 5.3.9_webpack@5.88.2 + typescript: 4.9.5 + webpack: 5.88.2 + webpack-dev-server: 4.15.1_webpack@5.88.2 + webpack-manifest-plugin: 4.1.1_webpack@5.88.2 + workbox-webpack-plugin: 6.6.0_webpack@5.88.2 + optionalDependencies: + fsevents: 2.3.2 + transitivePeerDependencies: + - '@babel/plugin-syntax-flow' + - '@babel/plugin-transform-react-jsx' + - '@parcel/css' + - '@swc/core' + - '@types/babel__core' + - '@types/webpack' + - bufferutil + - canvas + - clean-css + - csso + - debug + - esbuild + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - fibers + - node-notifier + - node-sass + - rework + - rework-visit + - sass + - sass-embedded + - sockjs-client + - supports-color + - ts-node + - type-fest + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + - webpack-hot-middleware + - webpack-plugin-serve + + /react/18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + + /reactflow/11.8.1_4jhe43xn235rpbr6wcgfu3576u: + resolution: {integrity: sha512-OuhsSCiefrCAUZqjuYJNVhhUpLrNQNzBz1rORCMXYO2j7y0FQ02oZLoMT/5mhCmNGMqR7BZwwvOMCSZM7wAn5A==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + dependencies: + '@reactflow/background': 11.2.6_4jhe43xn235rpbr6wcgfu3576u + '@reactflow/controls': 11.1.17_4jhe43xn235rpbr6wcgfu3576u + '@reactflow/core': 11.8.1_4jhe43xn235rpbr6wcgfu3576u + '@reactflow/minimap': 11.6.1_4jhe43xn235rpbr6wcgfu3576u + '@reactflow/node-resizer': 2.1.3_4jhe43xn235rpbr6wcgfu3576u + '@reactflow/node-toolbar': 1.2.5_4jhe43xn235rpbr6wcgfu3576u + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + transitivePeerDependencies: + - '@types/react' + - immer + dev: false + + /read-cache/1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + + /readable-stream/2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + /readable-stream/3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + /readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + + /recursive-readdir/2.2.3: + resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} + engines: {node: '>=6.0.0'} + dependencies: + minimatch: 3.1.2 + + /redent/3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: false + + /redux/4.2.1: + resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} + dependencies: + '@babel/runtime': 7.22.10 + dev: false + + /reflect-metadata/0.1.13: + resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} + dev: false + + /regenerate-unicode-properties/10.1.0: + resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + + /regenerate/1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + /regenerator-runtime/0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + + /regenerator-runtime/0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + + /regenerator-transform/0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + dependencies: + '@babel/runtime': 7.22.10 + + /regex-parser/2.2.11: + resolution: {integrity: sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==} + + /regexp.prototype.flags/1.5.0: + resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + functions-have-names: 1.2.3 + + /regexpu-core/5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} + dependencies: + '@babel/regjsgen': 0.8.0 + regenerate: 1.4.2 + regenerate-unicode-properties: 10.1.0 + regjsparser: 0.9.1 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.1.0 + + /regjsparser/0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + dependencies: + jsesc: 0.5.0 + + /relateurl/0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + + /remark-parse/10.0.2: + resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} + dependencies: + '@types/mdast': 3.0.12 + mdast-util-from-markdown: 1.3.1 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-rehype/10.1.0: + resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} + dependencies: + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 + mdast-util-to-hast: 12.3.0 + unified: 10.1.2 + dev: false + + /renderkid/3.0.0: + resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} + dependencies: + css-select: 4.3.0 + dom-converter: 0.2.0 + htmlparser2: 6.1.0 + lodash: 4.17.21 + strip-ansi: 6.0.1 + + /require-directory/2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + /require-from-string/2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + /requires-port/1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + /resolve-cwd/3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + + /resolve-from/4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + /resolve-from/5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + /resolve-url-loader/4.0.0: + resolution: {integrity: sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==} + engines: {node: '>=8.9'} + peerDependencies: + rework: 1.0.1 + rework-visit: 1.0.0 + peerDependenciesMeta: + rework: + optional: true + rework-visit: + optional: true + dependencies: + adjust-sourcemap-loader: 4.0.0 + convert-source-map: 1.9.0 + loader-utils: 2.0.4 + postcss: 7.0.39 + source-map: 0.6.1 + + /resolve.exports/1.1.1: + resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==} + engines: {node: '>=10'} + + /resolve/1.22.4: + resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} + hasBin: true + dependencies: + is-core-module: 2.13.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /resolve/2.0.0-next.4: + resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} + hasBin: true + dependencies: + is-core-module: 2.13.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /retry/0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + /reusify/1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + /rimraf/3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + + /rollup-plugin-terser/7.0.2_rollup@2.79.1: + resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser + peerDependencies: + rollup: ^2.0.0 + dependencies: + '@babel/code-frame': 7.22.10 + jest-worker: 26.6.2 + rollup: 2.79.1 + serialize-javascript: 4.0.0 + terser: 5.19.2 + + /rollup/2.79.1: + resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + + /run-parallel/1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + + /sade/1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + dependencies: + mri: 1.2.0 + dev: false + + /safe-array-concat/1.0.0: + resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + isarray: 2.0.5 + + /safe-buffer/5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + /safe-buffer/5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safe-regex-test/1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-regex: 1.1.4 + + /safer-buffer/2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + /sanitize.css/13.0.0: + resolution: {integrity: sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==} + + /sass-loader/12.6.0_webpack@5.88.2: + resolution: {integrity: sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + fibers: '>= 3.1.0' + node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + sass: ^1.3.0 + sass-embedded: '*' + webpack: ^5.0.0 + peerDependenciesMeta: + fibers: + optional: true + node-sass: + optional: true + sass: + optional: true + sass-embedded: + optional: true + dependencies: + klona: 2.0.6 + neo-async: 2.6.2 + webpack: 5.88.2 + + /sax/1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + + /saxes/5.0.1: + resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} + engines: {node: '>=10'} + dependencies: + xmlchars: 2.2.0 + + /scheduler/0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /schema-utils/2.7.0: + resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==} + engines: {node: '>= 8.9.0'} + dependencies: + '@types/json-schema': 7.0.12 + ajv: 6.12.6 + ajv-keywords: 3.5.2_ajv@6.12.6 + + /schema-utils/2.7.1: + resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} + engines: {node: '>= 8.9.0'} + dependencies: + '@types/json-schema': 7.0.12 + ajv: 6.12.6 + ajv-keywords: 3.5.2_ajv@6.12.6 + + /schema-utils/3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/json-schema': 7.0.12 + ajv: 6.12.6 + ajv-keywords: 3.5.2_ajv@6.12.6 + + /schema-utils/4.2.0: + resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} + engines: {node: '>= 12.13.0'} + dependencies: + '@types/json-schema': 7.0.12 + ajv: 8.12.0 + ajv-formats: 2.1.1 + ajv-keywords: 5.1.0_ajv@8.12.0 + + /select-hose/2.0.0: + resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + + /selfsigned/2.1.1: + resolution: {integrity: sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==} + engines: {node: '>=10'} + dependencies: + node-forge: 1.3.1 + + /semver/6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + /semver/7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /send/0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + /serialize-javascript/4.0.0: + resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} + dependencies: + randombytes: 2.1.0 + + /serialize-javascript/6.0.1: + resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + dependencies: + randombytes: 2.1.0 + + /serve-index/1.9.1: + resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.8 + batch: 0.6.1 + debug: 2.6.9 + escape-html: 1.0.3 + http-errors: 1.6.3 + mime-types: 2.1.35 + parseurl: 1.3.3 + transitivePeerDependencies: + - supports-color + + /serve-static/1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + + /setprototypeof/1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + + /setprototypeof/1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + /shallow-clone/3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + dependencies: + kind-of: 6.0.3 + dev: true + + /shebang-command/2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex/3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /shell-quote/1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + + /side-channel/1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + object-inspect: 1.12.3 + + /signal-exit/3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + /sisteransi/1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + /slash/3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + /slash/4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + + /sockjs/0.3.24: + resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + dependencies: + faye-websocket: 0.11.4 + uuid: 8.3.2 + websocket-driver: 0.7.4 + + /source-list-map/2.0.1: + resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} + + /source-map-js/1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + /source-map-loader/3.0.2_webpack@5.88.2: + resolution: {integrity: sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + dependencies: + abab: 2.0.6 + iconv-lite: 0.6.3 + source-map-js: 1.0.2 + webpack: 5.88.2 + + /source-map-support/0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + /source-map/0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /source-map/0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + /source-map/0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + dependencies: + whatwg-url: 7.1.0 + + /sourcemap-codec/1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + + /space-separated-tokens/2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + dev: false + + /spdy-transport/3.0.0: + resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + dependencies: + debug: 4.3.4 + detect-node: 2.1.0 + hpack.js: 2.1.6 + obuf: 1.1.2 + readable-stream: 3.6.2 + wbuf: 1.7.3 + transitivePeerDependencies: + - supports-color + + /spdy/4.0.2: + resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} + engines: {node: '>=6.0.0'} + dependencies: + debug: 4.3.4 + handle-thing: 2.0.1 + http-deceiver: 1.2.7 + select-hose: 2.0.0 + spdy-transport: 3.0.0 + transitivePeerDependencies: + - supports-color + + /sprintf-js/1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + /stable/0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + + /stack-utils/2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + + /stackframe/1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + + /statuses/1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + /statuses/2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + /stop-iteration-iterator/1.0.0: + resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} + engines: {node: '>= 0.4'} + dependencies: + internal-slot: 1.0.5 + dev: false + + /string-length/4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + + /string-length/5.0.1: + resolution: {integrity: sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==} + engines: {node: '>=12.20'} + dependencies: + char-regex: 2.0.1 + strip-ansi: 7.1.0 + + /string-natural-compare/3.0.1: + resolution: {integrity: sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==} + + /string-width/4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + /string.prototype.matchall/4.0.8: + resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + regexp.prototype.flags: 1.5.0 + side-channel: 1.0.4 + + /string.prototype.trim/1.2.7: + resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + + /string.prototype.trimend/1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + + /string.prototype.trimstart/1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + + /string_decoder/1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + + /string_decoder/1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + + /stringify-object/3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} + dependencies: + get-own-enumerable-property-symbols: 3.0.2 + is-obj: 1.0.1 + is-regexp: 1.0.0 + + /strip-ansi/6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi/7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + + /strip-bom/3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + /strip-bom/4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + /strip-comments/2.0.1: + resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} + engines: {node: '>=10'} + + /strip-final-newline/2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + /strip-indent/3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: false + + /strip-json-comments/3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + /strip-outer/1.0.1: + resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} + engines: {node: '>=0.10.0'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /style-loader/3.3.3_webpack@5.88.2: + resolution: {integrity: sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + dependencies: + webpack: 5.88.2 + + /style-to-object/0.4.2: + resolution: {integrity: sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA==} + dependencies: + inline-style-parser: 0.1.1 + dev: false + + /stylehacks/5.1.1_postcss@8.4.27: + resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.10 + postcss: 8.4.27 + postcss-selector-parser: 6.0.13 + + /sucrase/3.34.0: + resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} + engines: {node: '>=8'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + commander: 4.1.1 + glob: 7.1.6 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + /supports-color/5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + + /supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + + /supports-color/8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + + /supports-hyperlinks/2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /svg-parser/2.0.4: + resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + + /svgo/1.3.2: + resolution: {integrity: sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==} + engines: {node: '>=4.0.0'} + deprecated: This SVGO version is no longer supported. Upgrade to v2.x.x. + hasBin: true + dependencies: + chalk: 2.4.2 + coa: 2.0.2 + css-select: 2.1.0 + css-select-base-adapter: 0.1.1 + css-tree: 1.0.0-alpha.37 + csso: 4.2.0 + js-yaml: 3.14.1 + mkdirp: 0.5.6 + object.values: 1.1.6 + sax: 1.2.4 + stable: 0.1.8 + unquote: 1.1.1 + util.promisify: 1.0.1 + + /svgo/2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.0.0 + stable: 0.1.8 + + /swr/2.2.1_react@18.2.0: + resolution: {integrity: sha512-KJVA7dGtOBeZ+2sycEuzUfVIP5lZ/cd0xjevv85n2YG0x1uHJQicjAtahVZL6xG3+TjqhbBqimwYzVo3saeVXQ==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 + dependencies: + client-only: 0.0.1 + react: 18.2.0 + use-sync-external-store: 1.2.0_react@18.2.0 + dev: false + + /symbol-tree/3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + /tailwindcss/3.3.3: + resolution: {integrity: sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==} + engines: {node: '>=14.0.0'} + hasBin: 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.1 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.19.1 + 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.27 + postcss-import: 15.1.0_postcss@8.4.27 + postcss-js: 4.0.1_postcss@8.4.27 + postcss-load-config: 4.0.1_postcss@8.4.27 + postcss-nested: 6.0.1_postcss@8.4.27 + postcss-selector-parser: 6.0.13 + resolve: 1.22.4 + sucrase: 3.34.0 + transitivePeerDependencies: + - ts-node + + /tapable/1.1.3: + resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} + engines: {node: '>=6'} + + /tapable/2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + /temp-dir/2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} + + /tempy/0.6.0: + resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} + engines: {node: '>=10'} + dependencies: + is-stream: 2.0.1 + temp-dir: 2.0.0 + type-fest: 0.16.0 + unique-string: 2.0.0 + + /terminal-link/2.1.1: + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + engines: {node: '>=8'} + dependencies: + ansi-escapes: 4.3.2 + supports-hyperlinks: 2.3.0 + + /terser-webpack-plugin/5.3.9_webpack@5.88.2: + resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.19 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.1 + terser: 5.19.2 + webpack: 5.88.2 + + /terser/5.19.2: + resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.5 + acorn: 8.10.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + /test-exclude/6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + + /text-table/0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + /thenify-all/1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + + /thenify/3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + + /throat/6.0.2: + resolution: {integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==} + + /thunky/1.1.0: + resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + + /tmpl/1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + /to-fast-properties/2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /toidentifier/1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + /tough-cookie/4.1.3: + resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} + engines: {node: '>=6'} + dependencies: + psl: 1.9.0 + punycode: 2.3.0 + universalify: 0.2.0 + url-parse: 1.5.10 + + /tr46/1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + dependencies: + punycode: 2.3.0 + + /tr46/2.1.0: + resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} + engines: {node: '>=8'} + dependencies: + punycode: 2.3.0 + + /trim-lines/3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + dev: false + + /trim-repeated/1.0.0: + resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==} + engines: {node: '>=0.10.0'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /trough/2.1.0: + resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} + dev: false + + /tryer/1.0.1: + resolution: {integrity: sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==} + + /ts-interface-checker/0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + /ts-node/10.9.1_osiawaesgot4tuqtrzm2bzteda: + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 16.18.40 + acorn: 8.10.0 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.9.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tsconfig-paths/3.14.2: + resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + + /tslib/1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + /tslib/2.6.1: + resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} + + /tsutils/3.21.0_typescript@4.9.5: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 4.9.5 + + /type-check/0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + + /type-detect/4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + /type-fest/0.16.0: + resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} + engines: {node: '>=10'} + + /type-fest/0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + /type-fest/0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + /type-is/1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + /typed-array-buffer/1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.12 + + /typed-array-byte-length/1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + + /typed-array-byte-offset/1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + + /typed-array-length/1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + is-typed-array: 1.1.12 + + /typedarray-to-buffer/3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + + /typescript/4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + + /unbox-primitive/1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.2 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + + /unicode-canonical-property-names-ecmascript/2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + + /unicode-match-property-ecmascript/2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.1.0 + + /unicode-match-property-value-ecmascript/2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + + /unicode-property-aliases-ecmascript/2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + + /unified/10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + dependencies: + '@types/unist': 2.0.7 + bail: 2.0.2 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 4.1.0 + trough: 2.1.0 + vfile: 5.3.7 + dev: false + + /unique-string/2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + dependencies: + crypto-random-string: 2.0.0 + + /unist-util-generated/2.0.1: + resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} + dev: false + + /unist-util-is/5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + dependencies: + '@types/unist': 2.0.7 + dev: false + + /unist-util-position/4.0.4: + resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + dependencies: + '@types/unist': 2.0.7 + dev: false + + /unist-util-stringify-position/3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + dependencies: + '@types/unist': 2.0.7 + dev: false + + /unist-util-visit-parents/5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + dependencies: + '@types/unist': 2.0.7 + unist-util-is: 5.2.1 + dev: false + + /unist-util-visit/4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + dependencies: + '@types/unist': 2.0.7 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + dev: false + + /universalify/0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: true + + /universalify/0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + + /universalify/2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + + /unpipe/1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + /unquote/1.1.1: + resolution: {integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==} + + /upath/1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} + + /update-browserslist-db/1.0.11_browserslist@4.21.10: + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.10 + escalade: 3.1.1 + picocolors: 1.0.0 + + /uri-js/4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.0 + + /url-parse/1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + + /use-debounce/9.0.4_react@18.2.0: + resolution: {integrity: sha512-6X8H/mikbrt0XE8e+JXRtZ8yYVvKkdYRfmIhWZYsP8rcNs9hk3APV8Ua2mFkKRLcJKVdnX2/Vwrmg2GWKUQEaQ==} + engines: {node: '>= 10.0.0'} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + dev: false + + /use-sync-external-store/1.2.0_react@18.2.0: + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + + /util-deprecate/1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + /util.promisify/1.0.1: + resolution: {integrity: sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==} + dependencies: + define-properties: 1.2.0 + es-abstract: 1.22.1 + has-symbols: 1.0.3 + object.getownpropertydescriptors: 2.1.6 + + /utila/0.4.0: + resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} + + /utils-merge/1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + /uuid/8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + /uvu/0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + dequal: 2.0.3 + diff: 5.1.0 + kleur: 4.1.5 + sade: 1.8.1 + dev: false + + /v8-compile-cache-lib/3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + + /v8-to-istanbul/8.1.1: + resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} + engines: {node: '>=10.12.0'} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + convert-source-map: 1.9.0 + source-map: 0.7.4 + + /vary/1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + /vfile-message/3.1.4: + resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + dependencies: + '@types/unist': 2.0.7 + unist-util-stringify-position: 3.0.3 + dev: false + + /vfile/5.3.7: + resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + dependencies: + '@types/unist': 2.0.7 + is-buffer: 2.0.5 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + dev: false + + /w3c-hr-time/1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + dependencies: + browser-process-hrtime: 1.0.0 + + /w3c-xmlserializer/2.0.0: + resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} + engines: {node: '>=10'} + dependencies: + xml-name-validator: 3.0.0 + + /walker/1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + + /wasm-dce/1.0.2: + resolution: {integrity: sha512-Fq1+nu43ybsjSnBquLrW/cULmKs61qbv9k8ep13QUe0nABBezMoNAA+j6QY66MW0/eoDVDp1rjXDqQ2VKyS/Xg==} + dependencies: + '@babel/core': 7.22.10 + '@babel/traverse': 7.22.10 + '@babel/types': 7.22.10 + babylon: 7.0.0-beta.47 + webassembly-interpreter: 0.0.30 + transitivePeerDependencies: + - supports-color + dev: true + + /wasm-loader/1.3.0: + resolution: {integrity: sha512-R4s75XH+o8qM+WaRrAU9S2rbAMDzob18/S3V8R9ZoFpZkPWLAohWWlzWAp1ybeTkOuuku/X1zJtxiV0pBYxZww==} + dependencies: + loader-utils: 1.4.2 + wasm-dce: 1.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /watchpack/2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + /wbuf/1.7.3: + resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + dependencies: + minimalistic-assert: 1.0.1 + + /web-vitals/2.1.4: + resolution: {integrity: sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==} + dev: false + + /webassembly-floating-point-hex-parser/0.1.2: + resolution: {integrity: sha512-TUf1H++8U10+stJbFydnvrpG5Sznz5Rilez/oZlV5zI0C/e4cSxd8rALAJ8VpTvjVWxLmL3SVSJUK6Ap9AoiNg==} + dev: true + + /webassembly-interpreter/0.0.30: + resolution: {integrity: sha512-+Jdy2piEvz9T5j751mOE8+rBO12p+nNW6Fg4kJZ+zP1oUfsm+151sbAbM8AFxWTURmWCGP+r8Lxwfv3pzN1bCQ==} + hasBin: true + dependencies: + '@babel/code-frame': 7.22.10 + long: 3.2.0 + webassembly-floating-point-hex-parser: 0.1.2 + dev: true + + /webidl-conversions/4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + /webidl-conversions/5.0.0: + resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} + engines: {node: '>=8'} + + /webidl-conversions/6.1.0: + resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} + engines: {node: '>=10.4'} + + /webpack-dev-middleware/5.3.3_webpack@5.88.2: + resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + colorette: 2.0.20 + memfs: 3.5.3 + mime-types: 2.1.35 + range-parser: 1.2.1 + schema-utils: 4.2.0 + webpack: 5.88.2 + + /webpack-dev-server/4.15.1_webpack@5.88.2: + resolution: {integrity: sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==} + engines: {node: '>= 12.13.0'} + hasBin: true + peerDependencies: + webpack: ^4.37.0 || ^5.0.0 + webpack-cli: '*' + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + dependencies: + '@types/bonjour': 3.5.10 + '@types/connect-history-api-fallback': 1.5.0 + '@types/express': 4.17.17 + '@types/serve-index': 1.9.1 + '@types/serve-static': 1.15.2 + '@types/sockjs': 0.3.33 + '@types/ws': 8.5.5 + ansi-html-community: 0.0.8 + bonjour-service: 1.1.1 + chokidar: 3.5.3 + colorette: 2.0.20 + compression: 1.7.4 + connect-history-api-fallback: 2.0.0 + default-gateway: 6.0.3 + express: 4.18.2 + graceful-fs: 4.2.11 + html-entities: 2.4.0 + http-proxy-middleware: 2.0.6_@types+express@4.17.17 + ipaddr.js: 2.1.0 + launch-editor: 2.6.0 + open: 8.4.2 + p-retry: 4.6.2 + rimraf: 3.0.2 + schema-utils: 4.2.0 + selfsigned: 2.1.1 + serve-index: 1.9.1 + sockjs: 0.3.24 + spdy: 4.0.2 + webpack: 5.88.2 + webpack-dev-middleware: 5.3.3_webpack@5.88.2 + ws: 8.13.0 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + + /webpack-manifest-plugin/4.1.1_webpack@5.88.2: + resolution: {integrity: sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==} + engines: {node: '>=12.22.0'} + peerDependencies: + webpack: ^4.44.2 || ^5.47.0 + dependencies: + tapable: 2.2.1 + webpack: 5.88.2 + webpack-sources: 2.3.1 + + /webpack-merge/5.9.0: + resolution: {integrity: sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==} + engines: {node: '>=10.0.0'} + dependencies: + clone-deep: 4.0.1 + wildcard: 2.0.1 + dev: true + + /webpack-sources/1.4.3: + resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} + dependencies: + source-list-map: 2.0.1 + source-map: 0.6.1 + + /webpack-sources/2.3.1: + resolution: {integrity: sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==} + engines: {node: '>=10.13.0'} + dependencies: + source-list-map: 2.0.1 + source-map: 0.6.1 + + /webpack-sources/3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + /webpack/5.88.2: + resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.4 + '@types/estree': 1.0.1 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/wasm-edit': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + acorn: 8.10.0 + acorn-import-assertions: 1.9.0_acorn@8.10.0 + browserslist: 4.21.10 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.15.0 + es-module-lexer: 1.3.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.9_webpack@5.88.2 + watchpack: 2.4.0 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + /websocket-driver/0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} + dependencies: + http-parser-js: 0.5.8 + safe-buffer: 5.2.1 + websocket-extensions: 0.1.4 + + /websocket-extensions/0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + + /whatwg-encoding/1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + dependencies: + iconv-lite: 0.4.24 + + /whatwg-fetch/3.6.17: + resolution: {integrity: sha512-c4ghIvG6th0eudYwKZY5keb81wtFz9/WeAHAoy8+r18kcWlitUIrmGFQ2rWEl4UCKUilD3zCLHOIPheHx5ypRQ==} + + /whatwg-mimetype/2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + + /whatwg-url/7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + /whatwg-url/8.7.0: + resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} + engines: {node: '>=10'} + dependencies: + lodash: 4.17.21 + tr46: 2.1.0 + webidl-conversions: 6.1.0 + + /which-boxed-primitive/1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + + /which-collection/1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + dependencies: + is-map: 2.0.2 + is-set: 2.0.2 + is-weakmap: 2.0.1 + is-weakset: 2.0.2 + dev: false + + /which-typed-array/1.1.11: + resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + + /which/1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + + /which/2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /wildcard/2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + dev: true + + /workbox-background-sync/6.6.0: + resolution: {integrity: sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==} + dependencies: + idb: 7.1.1 + workbox-core: 6.6.0 + + /workbox-broadcast-update/6.6.0: + resolution: {integrity: sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==} + dependencies: + workbox-core: 6.6.0 + + /workbox-build/6.6.0: + resolution: {integrity: sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==} + engines: {node: '>=10.0.0'} + dependencies: + '@apideck/better-ajv-errors': 0.3.6_ajv@8.12.0 + '@babel/core': 7.22.10 + '@babel/preset-env': 7.22.10_@babel+core@7.22.10 + '@babel/runtime': 7.22.10 + '@rollup/plugin-babel': 5.3.1_vdsg3cryjz3q3k3s4sc37bag2u + '@rollup/plugin-node-resolve': 11.2.1_rollup@2.79.1 + '@rollup/plugin-replace': 2.4.2_rollup@2.79.1 + '@surma/rollup-plugin-off-main-thread': 2.2.3 + ajv: 8.12.0 + common-tags: 1.8.2 + fast-json-stable-stringify: 2.1.0 + fs-extra: 9.1.0 + glob: 7.2.3 + lodash: 4.17.21 + pretty-bytes: 5.6.0 + rollup: 2.79.1 + rollup-plugin-terser: 7.0.2_rollup@2.79.1 + source-map: 0.8.0-beta.0 + stringify-object: 3.3.0 + strip-comments: 2.0.1 + tempy: 0.6.0 + upath: 1.2.0 + workbox-background-sync: 6.6.0 + workbox-broadcast-update: 6.6.0 + workbox-cacheable-response: 6.6.0 + workbox-core: 6.6.0 + workbox-expiration: 6.6.0 + workbox-google-analytics: 6.6.0 + workbox-navigation-preload: 6.6.0 + workbox-precaching: 6.6.0 + workbox-range-requests: 6.6.0 + workbox-recipes: 6.6.0 + workbox-routing: 6.6.0 + workbox-strategies: 6.6.0 + workbox-streams: 6.6.0 + workbox-sw: 6.6.0 + workbox-window: 6.6.0 + transitivePeerDependencies: + - '@types/babel__core' + - supports-color + + /workbox-cacheable-response/6.6.0: + resolution: {integrity: sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==} + deprecated: workbox-background-sync@6.6.0 + dependencies: + workbox-core: 6.6.0 + + /workbox-core/6.6.0: + resolution: {integrity: sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==} + + /workbox-expiration/6.6.0: + resolution: {integrity: sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==} + dependencies: + idb: 7.1.1 + workbox-core: 6.6.0 + + /workbox-google-analytics/6.6.0: + resolution: {integrity: sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==} + dependencies: + workbox-background-sync: 6.6.0 + workbox-core: 6.6.0 + workbox-routing: 6.6.0 + workbox-strategies: 6.6.0 + + /workbox-navigation-preload/6.6.0: + resolution: {integrity: sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==} + dependencies: + workbox-core: 6.6.0 + + /workbox-precaching/6.6.0: + resolution: {integrity: sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==} + dependencies: + workbox-core: 6.6.0 + workbox-routing: 6.6.0 + workbox-strategies: 6.6.0 + + /workbox-range-requests/6.6.0: + resolution: {integrity: sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==} + dependencies: + workbox-core: 6.6.0 + + /workbox-recipes/6.6.0: + resolution: {integrity: sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==} + dependencies: + workbox-cacheable-response: 6.6.0 + workbox-core: 6.6.0 + workbox-expiration: 6.6.0 + workbox-precaching: 6.6.0 + workbox-routing: 6.6.0 + workbox-strategies: 6.6.0 + + /workbox-routing/6.6.0: + resolution: {integrity: sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==} + dependencies: + workbox-core: 6.6.0 + + /workbox-strategies/6.6.0: + resolution: {integrity: sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==} + dependencies: + workbox-core: 6.6.0 + + /workbox-streams/6.6.0: + resolution: {integrity: sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==} + dependencies: + workbox-core: 6.6.0 + workbox-routing: 6.6.0 + + /workbox-sw/6.6.0: + resolution: {integrity: sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==} + + /workbox-webpack-plugin/6.6.0_webpack@5.88.2: + resolution: {integrity: sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==} + engines: {node: '>=10.0.0'} + peerDependencies: + webpack: ^4.4.0 || ^5.9.0 + dependencies: + fast-json-stable-stringify: 2.1.0 + pretty-bytes: 5.6.0 + upath: 1.2.0 + webpack: 5.88.2 + webpack-sources: 1.4.3 + workbox-build: 6.6.0 + transitivePeerDependencies: + - '@types/babel__core' + - supports-color + + /workbox-window/6.6.0: + resolution: {integrity: sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==} + dependencies: + '@types/trusted-types': 2.0.3 + workbox-core: 6.6.0 + + /wrap-ansi/7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + /wrappy/1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /write-file-atomic/3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + + /ws/7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /ws/8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /xml-name-validator/3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + + /xmlchars/2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + /y18n/5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + /yallist/3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + /yallist/4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yaml/1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + /yaml/2.3.1: + resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} + engines: {node: '>= 14'} + + /yargs-parser/20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + /yargs/16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + + /yn/3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true + + /yocto-queue/0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + /zustand/4.4.1_6r35cis3cdrdimxih7xf3am2py: + resolution: {integrity: sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw==} + engines: {node: '>=12.7.0'} + peerDependencies: + '@types/react': '>=16.8' + immer: '>=9.0' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + dependencies: + '@types/react': 18.2.20 + immer: 9.0.21 + react: 18.2.0 + use-sync-external-store: 1.2.0_react@18.2.0 + dev: false diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..4cfc049 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,4 @@ +packages: + - "engine" + - "app" + - "plugins/*" diff --git a/tsconfig.json b/tsconfig.base.json similarity index 100% rename from tsconfig.json rename to tsconfig.base.json From 381883b94a3da6e4b994d4858e71093e0d4fd9f8 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Sat, 12 Aug 2023 19:05:16 +0200 Subject: [PATCH 078/109] extract remotePlugin from app --- app/package.json | 1 + app/src/engine/runner.ts | 5 +- app/src/index.tsx | 3 +- app/src/plugin.ts | 38 + app/src/registries.ts | 13 +- flake.lock | 8 +- flake.nix | 6 +- plugins/remote/package.json | 39 + .../remote/src}/RemoteDrawerPage.tsx | 0 plugins/remote/src/index.ts | 0 .../remote/src}/inputAdapter.tsx | 0 .../remote/src}/inputOutputStore.ts | 2 + .../remote/src}/interface/Interface.tsx | 0 .../remote/src}/interface/InterfaceEditor.tsx | 0 .../remote/src}/interface/InterfaceList.tsx | 0 .../remote/src}/interface/interfaceStores.ts | 0 .../remote/src}/interface/widget.ts | 0 .../remote/src}/message.ts | 0 .../remote/src}/outputAdapter.tsx | 0 .../remote/src}/publish/PublishManager.tsx | 0 .../remote/src}/publish/publishStore.ts | 0 .../remote/src}/registry.ts | 0 .../remote/src}/remote/ConnectionManager.tsx | 0 .../remote/src}/remote/remoteStore.ts | 0 .../remote/src}/widgets/ButtonWidget.tsx | 0 .../remote/src}/widgets/GraphWidget.tsx | 0 .../remote/src}/widgets/SliderWidget.tsx | 0 .../remote/src}/widgets/SwitchWidget.tsx | 0 plugins/remote/tsconfig.json | 4 + pnpm-lock.yaml | 4050 +++++++++-------- 30 files changed, 2296 insertions(+), 1873 deletions(-) create mode 100644 app/src/plugin.ts create mode 100644 plugins/remote/package.json rename {app/src/remotePlugin => plugins/remote/src}/RemoteDrawerPage.tsx (100%) create mode 100644 plugins/remote/src/index.ts rename {app/src/remotePlugin => plugins/remote/src}/inputAdapter.tsx (100%) rename {app/src/remotePlugin => plugins/remote/src}/inputOutputStore.ts (99%) rename {app/src/remotePlugin => plugins/remote/src}/interface/Interface.tsx (100%) rename {app/src/remotePlugin => plugins/remote/src}/interface/InterfaceEditor.tsx (100%) rename {app/src/remotePlugin => plugins/remote/src}/interface/InterfaceList.tsx (100%) rename {app/src/remotePlugin => plugins/remote/src}/interface/interfaceStores.ts (100%) rename {app/src/remotePlugin => plugins/remote/src}/interface/widget.ts (100%) rename {app/src/remotePlugin => plugins/remote/src}/message.ts (100%) rename {app/src/remotePlugin => plugins/remote/src}/outputAdapter.tsx (100%) rename {app/src/remotePlugin => plugins/remote/src}/publish/PublishManager.tsx (100%) rename {app/src/remotePlugin => plugins/remote/src}/publish/publishStore.ts (100%) rename {app/src/remotePlugin => plugins/remote/src}/registry.ts (100%) rename {app/src/remotePlugin => plugins/remote/src}/remote/ConnectionManager.tsx (100%) rename {app/src/remotePlugin => plugins/remote/src}/remote/remoteStore.ts (100%) rename {app/src/remotePlugin => plugins/remote/src}/widgets/ButtonWidget.tsx (100%) rename {app/src/remotePlugin => plugins/remote/src}/widgets/GraphWidget.tsx (100%) rename {app/src/remotePlugin => plugins/remote/src}/widgets/SliderWidget.tsx (100%) rename {app/src/remotePlugin => plugins/remote/src}/widgets/SwitchWidget.tsx (100%) create mode 100644 plugins/remote/tsconfig.json diff --git a/app/package.json b/app/package.json index f279328..1c0fcdf 100644 --- a/app/package.json +++ b/app/package.json @@ -10,6 +10,7 @@ "@types/node": "^16.18.3", "@types/react": "^18.0.25", "@types/react-dom": "^18.0.9", + "@beadi/plugin-remote": "0.0.3", "buttplug": "=3.1.1", "clsx": "^1.2.1", "file-saver": "^2.0.5", diff --git a/app/src/engine/runner.ts b/app/src/engine/runner.ts index 56146d7..8281f08 100644 --- a/app/src/engine/runner.ts +++ b/app/src/engine/runner.ts @@ -5,7 +5,7 @@ import { useSignalBus } from "./signal"; import { NodeContext, getNodeInputs, getNodeOutputs } from "./node"; import { nodeDefs } from "../registries"; import { usePreviewStore } from "./preview"; -import { tempPopSignalBuffer } from "../remotePlugin/inputOutputStore"; +import { runHooks } from "../plugin"; /** NodeId -> HandleId -> Value */ type HandleValues = Record>; @@ -31,7 +31,8 @@ function runEngineLoop(model: Model) { if (!_.isEmpty(signals)) { console.log("Signals: ", signals); } - tempPopSignalBuffer(); + // tempPopSignalBuffer(); + runHooks("postPrepareSignals"); // const delta = Date.now() - last; // last = Date.now(); diff --git a/app/src/index.tsx b/app/src/index.tsx index 8808658..c750364 100644 --- a/app/src/index.tsx +++ b/app/src/index.tsx @@ -8,8 +8,8 @@ import { enableAllPlugins } from "immer"; import { RouterProvider, createBrowserRouter } from "react-router-dom"; import { watchForChanges } from "./engine"; import { useFileStore } from "./engine/store"; -import { tempSyncIOValueStore } from "./remotePlugin/inputOutputStore"; import { settingsTabs } from "./registries"; +import { finalizePlugins } from "./plugin"; // import { setButtplugInstance } from "./adapters/store"; // enableAllPlugins(); @@ -53,7 +53,6 @@ watchForChanges(); // to log results (for example: reportWebVitals(console.log)) // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals reportWebVitals(); -tempSyncIOValueStore(); /* ===== Debug timeouts and intevals ==== */ // const oldSetTimeout = window.setTimeout; diff --git a/app/src/plugin.ts b/app/src/plugin.ts new file mode 100644 index 0000000..84a0e39 --- /dev/null +++ b/app/src/plugin.ts @@ -0,0 +1,38 @@ +import { Tab } from "./components/Settings"; +import { AnyInputAdapterDef, AnyOutputAdapterDef } from "./engine/adapter"; +import { AnyNodeDef } from "./engine/node"; + +export type Plugin = { + nodeDefs?: AnyNodeDef[]; + inputAdapterDefs?: AnyInputAdapterDef[]; + outputAdapterDefs?: AnyOutputAdapterDef[]; + settingsTabs?: Tab[]; + processingHooks: { + postPrepareSignals?: () => {}; + }; +}; + +let finalized = false; +const plugins: Plugin[] = []; + +export function loadPlugin(plugin: Plugin) { + if (finalized) { + throw new Error("Attempt to load plugin after plugins have been finalized."); + } + plugins.push(plugin); +} + +export function finalizePlugins() { + finalized = true; +} + +export function getPlugins(): Plugin[] { + if (!finalized) { + throw new Error("Attempt to access plugins before plugins have been finalized."); + } + return plugins; +} + +export function runHooks(hook: keyof Plugin["processingHooks"]) { + getPlugins().forEach((it) => it.processingHooks[hook]?.()); +} diff --git a/app/src/registries.ts b/app/src/registries.ts index 1bf3de2..7a78da3 100644 --- a/app/src/registries.ts +++ b/app/src/registries.ts @@ -4,13 +4,10 @@ import { timerNodeDef } from "./nodes/TimerNode"; import { inputAdapterNode } from "./nodes/InputAdapterNode"; import { toggleNodeDef } from "./nodes/ToggleNode"; import { AnyInputAdapterDef, AnyOutputAdapterDef } from "./engine/adapter"; -import { remoteInputAdapter, remoteInputFromOutputAdapter } from "./remotePlugin/inputAdapter"; -import { remoteOutputAdapter, remoteOutputToInputAdapter } from "./remotePlugin/outputAdapter"; import { outputAdapterNode } from "./nodes/OutputAdapterNode"; import { randomNodeDef } from "./nodes/RandomNode"; import { memoryNodeDef } from "./nodes/MemoryNode"; import { Tab, fileTab as fileTabDef } from "./components/Settings"; -import { remoteSettingsTab as remoteSettingsTabDef } from "./remotePlugin/RemoteDrawerPage"; import { switchNodeDef } from "./nodes/SwitchNode"; import { positiveWaveNodeDef } from "./nodes/WaveNode"; import { delayNodeDef } from "./nodes/DelayNode"; @@ -21,6 +18,10 @@ import { hysteresisNodeDef } from "./nodes/HysteresisNode"; import { commentNodeDef } from "./nodes/CommentNode"; import { edgeDetectorNodeDef } from "./nodes/EdgeDetector"; +import { finalizePlugins, getPlugins } from "./plugin"; + +finalizePlugins(); + const nodeDefList: AnyNodeDef[] = [ constantValueNodeDef as any, mathNodeDef as any, @@ -41,20 +42,20 @@ const nodeDefList: AnyNodeDef[] = [ export const nodeDefs: Record = Object.assign({}, ...nodeDefList.map((it) => ({ [it.type]: it }))); -const inputAdapterDefList: AnyInputAdapterDef[] = [remoteInputAdapter, remoteInputFromOutputAdapter]; +const inputAdapterDefList: AnyInputAdapterDef[] = [...getPlugins().flatMap((it) => it.inputAdapterDefs ?? [])]; export const inputAdapterDefs: Record = Object.assign( {}, ...inputAdapterDefList.map((it) => ({ [it.id]: it })) ); -const outputAdapterDefList: AnyOutputAdapterDef[] = [remoteOutputAdapter, remoteOutputToInputAdapter]; +const outputAdapterDefList: AnyOutputAdapterDef[] = [...getPlugins().flatMap((it) => it.outputAdapterDefs ?? [])]; export const outputAdapterDefs: Record = Object.assign( {}, ...outputAdapterDefList.map((it) => ({ [it.id]: it })) ); -const settingsTabsList: Tab[] = [fileTabDef, remoteSettingsTabDef]; +const settingsTabsList: Tab[] = [fileTabDef, ...getPlugins().flatMap((it) => it.settingsTabs ?? [])]; export const settingsTabs: Record = Object.assign({}, ...settingsTabsList.map((it) => ({ [it.id]: it }))); diff --git a/flake.lock b/flake.lock index cf25392..57612bd 100644 --- a/flake.lock +++ b/flake.lock @@ -20,16 +20,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1686476475, - "narHash": "sha256-W9yUePvCSDghn+YUXewuodyPxt+kJl/a7zdY4Q6r4MU=", + "lastModified": 1691693223, + "narHash": "sha256-9t8ZY1XNAsWqxAJmXgg+GXqF5chORMVnBT6PSHaRV3I=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "eef86b8a942913a828b9ef13722835f359deef29", + "rev": "18784aac1013da9b442adf29b6c7c228518b5d3f", "type": "github" }, "original": { "id": "nixpkgs", - "ref": "nixos-22.11", + "ref": "nixos-23.05", "type": "indirect" } }, diff --git a/flake.nix b/flake.nix index 18b710a..0f0236e 100644 --- a/flake.nix +++ b/flake.nix @@ -3,7 +3,7 @@ inputs = { nixpkgs = { - url = "nixpkgs/nixos-22.11"; + url = "nixpkgs/nixos-23.05"; }; flake-utils.url = "github:numtide/flake-utils"; @@ -26,8 +26,8 @@ nodejs = buildNodeJs { enableNpm = true; - version = "18.16.0"; - sha256 = "sha256-M9gaIz4jWlCa3aSk8iCQCNBFkZed5rPw9nwckGCT8Rg="; + version = "18.17.1"; + sha256 = "sha256-8hXPA9DwDwesC2dMaBn4BMFULhbxUtoEmAAirsz15lo="; }; in rec { flakedPkgs = pkgs; diff --git a/plugins/remote/package.json b/plugins/remote/package.json new file mode 100644 index 0000000..d672f33 --- /dev/null +++ b/plugins/remote/package.json @@ -0,0 +1,39 @@ +{ + "name": "@beadi/plugin-remote", + "version": "0.0.3", + "private": true, + "dependencies": { + "immer": "^9.0.19", + "lodash": "^4.17.21", + "react": "^18.2.0", + "zustand": "^4.1.4" + }, + "homepage": "https://beadi.onrender.com/", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "typescript": "^4.9.3", + "vite": "^4.4.9" + } +} diff --git a/app/src/remotePlugin/RemoteDrawerPage.tsx b/plugins/remote/src/RemoteDrawerPage.tsx similarity index 100% rename from app/src/remotePlugin/RemoteDrawerPage.tsx rename to plugins/remote/src/RemoteDrawerPage.tsx diff --git a/plugins/remote/src/index.ts b/plugins/remote/src/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/app/src/remotePlugin/inputAdapter.tsx b/plugins/remote/src/inputAdapter.tsx similarity index 100% rename from app/src/remotePlugin/inputAdapter.tsx rename to plugins/remote/src/inputAdapter.tsx diff --git a/app/src/remotePlugin/inputOutputStore.ts b/plugins/remote/src/inputOutputStore.ts similarity index 99% rename from app/src/remotePlugin/inputOutputStore.ts rename to plugins/remote/src/inputOutputStore.ts index a3efb95..f0b3175 100644 --- a/app/src/remotePlugin/inputOutputStore.ts +++ b/plugins/remote/src/inputOutputStore.ts @@ -171,3 +171,5 @@ export function tempSyncIOValueStore() { func(useFileStore.getState()); } + +tempSyncIOValueStore(); diff --git a/app/src/remotePlugin/interface/Interface.tsx b/plugins/remote/src/interface/Interface.tsx similarity index 100% rename from app/src/remotePlugin/interface/Interface.tsx rename to plugins/remote/src/interface/Interface.tsx diff --git a/app/src/remotePlugin/interface/InterfaceEditor.tsx b/plugins/remote/src/interface/InterfaceEditor.tsx similarity index 100% rename from app/src/remotePlugin/interface/InterfaceEditor.tsx rename to plugins/remote/src/interface/InterfaceEditor.tsx diff --git a/app/src/remotePlugin/interface/InterfaceList.tsx b/plugins/remote/src/interface/InterfaceList.tsx similarity index 100% rename from app/src/remotePlugin/interface/InterfaceList.tsx rename to plugins/remote/src/interface/InterfaceList.tsx diff --git a/app/src/remotePlugin/interface/interfaceStores.ts b/plugins/remote/src/interface/interfaceStores.ts similarity index 100% rename from app/src/remotePlugin/interface/interfaceStores.ts rename to plugins/remote/src/interface/interfaceStores.ts diff --git a/app/src/remotePlugin/interface/widget.ts b/plugins/remote/src/interface/widget.ts similarity index 100% rename from app/src/remotePlugin/interface/widget.ts rename to plugins/remote/src/interface/widget.ts diff --git a/app/src/remotePlugin/message.ts b/plugins/remote/src/message.ts similarity index 100% rename from app/src/remotePlugin/message.ts rename to plugins/remote/src/message.ts diff --git a/app/src/remotePlugin/outputAdapter.tsx b/plugins/remote/src/outputAdapter.tsx similarity index 100% rename from app/src/remotePlugin/outputAdapter.tsx rename to plugins/remote/src/outputAdapter.tsx diff --git a/app/src/remotePlugin/publish/PublishManager.tsx b/plugins/remote/src/publish/PublishManager.tsx similarity index 100% rename from app/src/remotePlugin/publish/PublishManager.tsx rename to plugins/remote/src/publish/PublishManager.tsx diff --git a/app/src/remotePlugin/publish/publishStore.ts b/plugins/remote/src/publish/publishStore.ts similarity index 100% rename from app/src/remotePlugin/publish/publishStore.ts rename to plugins/remote/src/publish/publishStore.ts diff --git a/app/src/remotePlugin/registry.ts b/plugins/remote/src/registry.ts similarity index 100% rename from app/src/remotePlugin/registry.ts rename to plugins/remote/src/registry.ts diff --git a/app/src/remotePlugin/remote/ConnectionManager.tsx b/plugins/remote/src/remote/ConnectionManager.tsx similarity index 100% rename from app/src/remotePlugin/remote/ConnectionManager.tsx rename to plugins/remote/src/remote/ConnectionManager.tsx diff --git a/app/src/remotePlugin/remote/remoteStore.ts b/plugins/remote/src/remote/remoteStore.ts similarity index 100% rename from app/src/remotePlugin/remote/remoteStore.ts rename to plugins/remote/src/remote/remoteStore.ts diff --git a/app/src/remotePlugin/widgets/ButtonWidget.tsx b/plugins/remote/src/widgets/ButtonWidget.tsx similarity index 100% rename from app/src/remotePlugin/widgets/ButtonWidget.tsx rename to plugins/remote/src/widgets/ButtonWidget.tsx diff --git a/app/src/remotePlugin/widgets/GraphWidget.tsx b/plugins/remote/src/widgets/GraphWidget.tsx similarity index 100% rename from app/src/remotePlugin/widgets/GraphWidget.tsx rename to plugins/remote/src/widgets/GraphWidget.tsx diff --git a/app/src/remotePlugin/widgets/SliderWidget.tsx b/plugins/remote/src/widgets/SliderWidget.tsx similarity index 100% rename from app/src/remotePlugin/widgets/SliderWidget.tsx rename to plugins/remote/src/widgets/SliderWidget.tsx diff --git a/app/src/remotePlugin/widgets/SwitchWidget.tsx b/plugins/remote/src/widgets/SwitchWidget.tsx similarity index 100% rename from app/src/remotePlugin/widgets/SwitchWidget.tsx rename to plugins/remote/src/widgets/SwitchWidget.tsx diff --git a/plugins/remote/tsconfig.json b/plugins/remote/tsconfig.json new file mode 100644 index 0000000..0e6f93f --- /dev/null +++ b/plugins/remote/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../../tsconfig.base.json", + "include": ["src/**/*", "types/**/*"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fa0b736..8b576fd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,111 +1,171 @@ -lockfileVersion: 5.4 +lockfileVersion: '6.0' importers: - .: - specifiers: {} + .: {} app: - specifiers: - '@craco/craco': ^7.0.0 - '@testing-library/jest-dom': ^5.16.5 - '@testing-library/react': ^13.4.0 - '@testing-library/user-event': ^13.5.0 - '@types/file-saver': ^2.0.5 - '@types/jest': ^27.5.2 - '@types/lodash': ^4.14.191 - '@types/luxon': ^3.1.0 - '@types/node': ^16.18.3 - '@types/react': ^18.0.25 - '@types/react-dom': ^18.0.9 - autoprefixer: ^10.4.13 - buttplug: '=3.1.1' - clsx: ^1.2.1 - file-saver: ^2.0.5 - gh-pages: ^4.0.0 - idb: ^7.1.1 - immer: ^9.0.19 - lodash: ^4.17.21 - luxon: ^3.1.1 - postcss: ^8.4.19 - react: ^18.2.0 - react-dnd: ^16.0.1 - react-dnd-html5-backend: ^16.0.1 - react-dom: ^18.2.0 - react-icons: ^4.7.1 - react-markdown: ^8.0.4 - react-router-dom: ^6.14.1 - react-scripts: 5.0.1 - reactflow: ^11.3.2 - swr: ^2.1.0 - tailwindcss: ^3.2.4 - typescript: ^4.9.3 - use-debounce: ^9.0.3 - wasm-loader: ^1.3.0 - web-vitals: ^2.1.4 - zustand: ^4.1.4 - dependencies: - '@testing-library/jest-dom': 5.17.0 - '@testing-library/react': 13.4.0_biqbaboplfbrettd7655fr4n2y - '@testing-library/user-event': 13.5.0 - '@types/jest': 27.5.2 - '@types/node': 16.18.40 - '@types/react': 18.2.20 - '@types/react-dom': 18.2.7 - buttplug: 3.1.1 - clsx: 1.2.1 - file-saver: 2.0.5 - idb: 7.1.1 - immer: 9.0.21 - lodash: 4.17.21 - luxon: 3.4.0 - react: 18.2.0 - react-dnd: 16.0.1_tmexzulqvmqns5ldwaibu3jqgu - react-dnd-html5-backend: 16.0.1 - react-dom: 18.2.0_react@18.2.0 - react-icons: 4.10.1_react@18.2.0 - react-markdown: 8.0.7_j3ahe22lw6ac2w6qvqp4kjqnqy - react-router-dom: 6.15.0_biqbaboplfbrettd7655fr4n2y - react-scripts: 5.0.1_j5ip3o3v6sktjzl5cxtjyfbuo4 - reactflow: 11.8.1_4jhe43xn235rpbr6wcgfu3576u - swr: 2.2.1_react@18.2.0 - typescript: 4.9.5 - use-debounce: 9.0.4_react@18.2.0 - web-vitals: 2.1.4 - zustand: 4.4.1_6r35cis3cdrdimxih7xf3am2py + dependencies: + '@beadi/plugin-remote': + specifier: 0.0.3 + version: link:../plugins/remote + '@testing-library/jest-dom': + specifier: ^5.16.5 + version: 5.17.0 + '@testing-library/react': + specifier: ^13.4.0 + version: 13.4.0(react-dom@18.2.0)(react@18.2.0) + '@testing-library/user-event': + specifier: ^13.5.0 + version: 13.5.0(@testing-library/dom@8.20.1) + '@types/jest': + specifier: ^27.5.2 + version: 27.5.2 + '@types/node': + specifier: ^16.18.3 + version: 16.18.40 + '@types/react': + specifier: ^18.0.25 + version: 18.2.20 + '@types/react-dom': + specifier: ^18.0.9 + version: 18.2.7 + buttplug: + specifier: '=3.1.1' + version: 3.1.1 + clsx: + specifier: ^1.2.1 + version: 1.2.1 + file-saver: + specifier: ^2.0.5 + version: 2.0.5 + idb: + specifier: ^7.1.1 + version: 7.1.1 + immer: + specifier: ^9.0.19 + version: 9.0.21 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + luxon: + specifier: ^3.1.1 + version: 3.4.0 + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dnd: + specifier: ^16.0.1 + version: 16.0.1(@types/node@16.18.40)(@types/react@18.2.20)(react@18.2.0) + react-dnd-html5-backend: + specifier: ^16.0.1 + version: 16.0.1 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + react-icons: + specifier: ^4.7.1 + version: 4.10.1(react@18.2.0) + react-markdown: + specifier: ^8.0.4 + version: 8.0.7(@types/react@18.2.20)(react@18.2.0) + react-router-dom: + specifier: ^6.14.1 + version: 6.15.0(react-dom@18.2.0)(react@18.2.0) + react-scripts: + specifier: 5.0.1 + version: 5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.5)(eslint@8.47.0)(react@18.2.0)(typescript@4.9.5) + reactflow: + specifier: ^11.3.2 + version: 11.8.1(@types/react@18.2.20)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) + swr: + specifier: ^2.1.0 + version: 2.2.1(react@18.2.0) + typescript: + specifier: ^4.9.3 + version: 4.9.5 + use-debounce: + specifier: ^9.0.3 + version: 9.0.4(react@18.2.0) + web-vitals: + specifier: ^2.1.4 + version: 2.1.4 + zustand: + specifier: ^4.1.4 + version: 4.4.1(@types/react@18.2.20)(immer@9.0.21)(react@18.2.0) devDependencies: - '@craco/craco': 7.1.0_emapjj4win3okqyvyzkcgvkhqy - '@types/file-saver': 2.0.5 - '@types/lodash': 4.14.197 - '@types/luxon': 3.3.1 - autoprefixer: 10.4.14_postcss@8.4.27 - gh-pages: 4.0.0 - postcss: 8.4.27 - tailwindcss: 3.3.3 - wasm-loader: 1.3.0 + '@craco/craco': + specifier: ^7.0.0 + version: 7.1.0(@types/node@16.18.40)(postcss@8.4.27)(react-scripts@5.0.1)(typescript@4.9.5) + '@types/file-saver': + specifier: ^2.0.5 + version: 2.0.5 + '@types/lodash': + specifier: ^4.14.191 + version: 4.14.197 + '@types/luxon': + specifier: ^3.1.0 + version: 3.3.1 + autoprefixer: + specifier: ^10.4.13 + version: 10.4.14(postcss@8.4.27) + gh-pages: + specifier: ^4.0.0 + version: 4.0.0 + postcss: + specifier: ^8.4.19 + version: 8.4.27 + tailwindcss: + specifier: ^3.2.4 + version: 3.3.3 + wasm-loader: + specifier: ^1.3.0 + version: 1.3.0(wasm-dce@1.0.2) + + plugins/remote: + dependencies: + immer: + specifier: ^9.0.19 + version: 9.0.21 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + react: + specifier: ^18.2.0 + version: 18.2.0 + zustand: + specifier: ^4.1.4 + version: 4.4.1(@types/react@18.2.20)(immer@9.0.21)(react@18.2.0) + devDependencies: + typescript: + specifier: ^4.9.3 + version: 4.9.5 + vite: + specifier: ^4.4.9 + version: 4.4.9 packages: - /@aashutoshrathi/word-wrap/1.2.6: + /@aashutoshrathi/word-wrap@1.2.6: resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} - /@adobe/css-tools/4.3.0: + /@adobe/css-tools@4.3.0: resolution: {integrity: sha512-+RNNcQvw2V1bmnBTPAtOLfW/9mhH2vC67+rUSi5T8EtEWt6lEnGNY2GuhZ1/YwbgikT1TkhvidCDmN5Q5YCo/w==} dev: false - /@alloc/quick-lru/5.2.0: + /@alloc/quick-lru@5.2.0: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - /@ampproject/remapping/2.2.1: + /@ampproject/remapping@2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} dependencies: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.19 - /@apideck/better-ajv-errors/0.3.6_ajv@8.12.0: + /@apideck/better-ajv-errors@0.3.6(ajv@8.12.0): resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} engines: {node: '>=10'} peerDependencies: @@ -116,18 +176,18 @@ packages: jsonpointer: 5.0.1 leven: 3.1.0 - /@babel/code-frame/7.22.10: + /@babel/code-frame@7.22.10: resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.22.10 chalk: 2.4.2 - /@babel/compat-data/7.22.9: + /@babel/compat-data@7.22.9: resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} engines: {node: '>=6.9.0'} - /@babel/core/7.22.10: + /@babel/core@7.22.10: resolution: {integrity: sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==} engines: {node: '>=6.9.0'} dependencies: @@ -135,7 +195,7 @@ packages: '@babel/code-frame': 7.22.10 '@babel/generator': 7.22.10 '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-module-transforms': 7.22.9_@babel+core@7.22.10 + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.10) '@babel/helpers': 7.22.10 '@babel/parser': 7.22.10 '@babel/template': 7.22.5 @@ -149,7 +209,7 @@ packages: transitivePeerDependencies: - supports-color - /@babel/eslint-parser/7.22.10_zyanktnjxrtfnufugapahvd75q: + /@babel/eslint-parser@7.22.10(@babel/core@7.22.10)(eslint@8.47.0): resolution: {integrity: sha512-0J8DNPRXQRLeR9rPaUMM3fA+RbixjnVLe/MRMYCkp3hzgsSuxCHQ8NN8xQG1wIHKJ4a1DTROTvFJdW+B5/eOsg==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: @@ -162,7 +222,7 @@ packages: eslint-visitor-keys: 2.1.0 semver: 6.3.1 - /@babel/generator/7.22.10: + /@babel/generator@7.22.10: resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} engines: {node: '>=6.9.0'} dependencies: @@ -171,19 +231,19 @@ packages: '@jridgewell/trace-mapping': 0.3.19 jsesc: 2.5.2 - /@babel/helper-annotate-as-pure/7.22.5: + /@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.10 - /@babel/helper-builder-binary-assignment-operator-visitor/7.22.10: + /@babel/helper-builder-binary-assignment-operator-visitor@7.22.10: resolution: {integrity: sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.10 - /@babel/helper-compilation-targets/7.22.10: + /@babel/helper-compilation-targets@7.22.10: resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==} engines: {node: '>=6.9.0'} dependencies: @@ -193,7 +253,7 @@ packages: lru-cache: 5.1.1 semver: 6.3.1 - /@babel/helper-create-class-features-plugin/7.22.10_@babel+core@7.22.10: + /@babel/helper-create-class-features-plugin@7.22.10(@babel/core@7.22.10): resolution: {integrity: sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -205,12 +265,12 @@ packages: '@babel/helper-function-name': 7.22.5 '@babel/helper-member-expression-to-functions': 7.22.5 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.9_@babel+core@7.22.10 + '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.10) '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 - /@babel/helper-create-regexp-features-plugin/7.22.9_@babel+core@7.22.10: + /@babel/helper-create-regexp-features-plugin@7.22.9(@babel/core@7.22.10): resolution: {integrity: sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -221,7 +281,7 @@ packages: regexpu-core: 5.3.2 semver: 6.3.1 - /@babel/helper-define-polyfill-provider/0.4.2_@babel+core@7.22.10: + /@babel/helper-define-polyfill-provider@0.4.2(@babel/core@7.22.10): resolution: {integrity: sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -235,36 +295,36 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-environment-visitor/7.22.5: + /@babel/helper-environment-visitor@7.22.5: resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} engines: {node: '>=6.9.0'} - /@babel/helper-function-name/7.22.5: + /@babel/helper-function-name@7.22.5: resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.22.5 '@babel/types': 7.22.10 - /@babel/helper-hoist-variables/7.22.5: + /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.10 - /@babel/helper-member-expression-to-functions/7.22.5: + /@babel/helper-member-expression-to-functions@7.22.5: resolution: {integrity: sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.10 - /@babel/helper-module-imports/7.22.5: + /@babel/helper-module-imports@7.22.5: resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.10 - /@babel/helper-module-transforms/7.22.9_@babel+core@7.22.10: + /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.10): resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -277,17 +337,17 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.5 - /@babel/helper-optimise-call-expression/7.22.5: + /@babel/helper-optimise-call-expression@7.22.5: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.10 - /@babel/helper-plugin-utils/7.22.5: + /@babel/helper-plugin-utils@7.22.5: resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} engines: {node: '>=6.9.0'} - /@babel/helper-remap-async-to-generator/7.22.9_@babel+core@7.22.10: + /@babel/helper-remap-async-to-generator@7.22.9(@babel/core@7.22.10): resolution: {integrity: sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -298,7 +358,7 @@ packages: '@babel/helper-environment-visitor': 7.22.5 '@babel/helper-wrap-function': 7.22.10 - /@babel/helper-replace-supers/7.22.9_@babel+core@7.22.10: + /@babel/helper-replace-supers@7.22.9(@babel/core@7.22.10): resolution: {integrity: sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -309,37 +369,37 @@ packages: '@babel/helper-member-expression-to-functions': 7.22.5 '@babel/helper-optimise-call-expression': 7.22.5 - /@babel/helper-simple-access/7.22.5: + /@babel/helper-simple-access@7.22.5: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.10 - /@babel/helper-skip-transparent-expression-wrappers/7.22.5: + /@babel/helper-skip-transparent-expression-wrappers@7.22.5: resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.10 - /@babel/helper-split-export-declaration/7.22.6: + /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.10 - /@babel/helper-string-parser/7.22.5: + /@babel/helper-string-parser@7.22.5: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-identifier/7.22.5: + /@babel/helper-validator-identifier@7.22.5: resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-option/7.22.5: + /@babel/helper-validator-option@7.22.5: resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} engines: {node: '>=6.9.0'} - /@babel/helper-wrap-function/7.22.10: + /@babel/helper-wrap-function@7.22.10: resolution: {integrity: sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==} engines: {node: '>=6.9.0'} dependencies: @@ -347,7 +407,7 @@ packages: '@babel/template': 7.22.5 '@babel/types': 7.22.10 - /@babel/helpers/7.22.10: + /@babel/helpers@7.22.10: resolution: {integrity: sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==} engines: {node: '>=6.9.0'} dependencies: @@ -357,7 +417,7 @@ packages: transitivePeerDependencies: - supports-color - /@babel/highlight/7.22.10: + /@babel/highlight@7.22.10: resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} engines: {node: '>=6.9.0'} dependencies: @@ -365,14 +425,14 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/parser/7.22.10: + /@babel/parser@7.22.10: resolution: {integrity: sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==} engines: {node: '>=6.0.0'} hasBin: true dependencies: '@babel/types': 7.22.10 - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.22.5_@babel+core@7.22.10: + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -381,7 +441,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.22.5_@babel+core@7.22.10: + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==} engines: {node: '>=6.9.0'} peerDependencies: @@ -390,32 +450,32 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.22.10_@babel+core@7.22.10 + '@babel/plugin-transform-optional-chaining': 7.22.10(@babel/core@7.22.10) - /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.22.10: + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.22.10): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.10 - '@babel/helper-create-class-features-plugin': 7.22.10_@babel+core@7.22.10 + '@babel/helper-create-class-features-plugin': 7.22.10(@babel/core@7.22.10) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-proposal-decorators/7.22.10_@babel+core@7.22.10: + /@babel/plugin-proposal-decorators@7.22.10(@babel/core@7.22.10): resolution: {integrity: sha512-KxN6TqZzcFi4uD3UifqXElBTBNLAEH1l3vzMQj6JwJZbL2sZlThxSViOKCYY+4Ah4V4JhQ95IVB7s/Y6SJSlMQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.10 - '@babel/helper-create-class-features-plugin': 7.22.10_@babel+core@7.22.10 + '@babel/helper-create-class-features-plugin': 7.22.10(@babel/core@7.22.10) '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.9_@babel+core@7.22.10 + '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.10) '@babel/helper-split-export-declaration': 7.22.6 - '@babel/plugin-syntax-decorators': 7.22.10_@babel+core@7.22.10 + '@babel/plugin-syntax-decorators': 7.22.10(@babel/core@7.22.10) - /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.22.10: + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.22.10): resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -423,9 +483,9 @@ packages: dependencies: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.22.10 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.10) - /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.22.10: + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.22.10): resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} peerDependencies: @@ -433,9 +493,9 @@ packages: dependencies: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.22.10 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.10) - /@babel/plugin-proposal-optional-chaining/7.21.0_@babel+core@7.22.10: + /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.22.10): resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -444,19 +504,19 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.22.10 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.10) - /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.22.10: + /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.22.10): resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.10 - '@babel/helper-create-class-features-plugin': 7.22.10_@babel+core@7.22.10 + '@babel/helper-create-class-features-plugin': 7.22.10(@babel/core@7.22.10) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-proposal-private-property-in-object/7.21.0-placeholder-for-preset-env.2_@babel+core@7.22.10: + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.10): resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} peerDependencies: @@ -464,7 +524,7 @@ packages: dependencies: '@babel/core': 7.22.10 - /@babel/plugin-proposal-private-property-in-object/7.21.11_@babel+core@7.22.10: + /@babel/plugin-proposal-private-property-in-object@7.21.11(@babel/core@7.22.10): resolution: {integrity: sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -472,11 +532,11 @@ packages: dependencies: '@babel/core': 7.22.10 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.10_@babel+core@7.22.10 + '@babel/helper-create-class-features-plugin': 7.22.10(@babel/core@7.22.10) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.22.10 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.10) - /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.22.10: + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.10): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -484,7 +544,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.22.10: + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.22.10): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -492,7 +552,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.22.10: + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.10): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -500,7 +560,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.22.10: + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.22.10): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -509,7 +569,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-decorators/7.22.10_@babel+core@7.22.10: + /@babel/plugin-syntax-decorators@7.22.10(@babel/core@7.22.10): resolution: {integrity: sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -518,7 +578,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.22.10: + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.22.10): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -526,7 +586,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.22.10: + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.22.10): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -534,7 +594,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-flow/7.22.5_@babel+core@7.22.10: + /@babel/plugin-syntax-flow@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -543,7 +603,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-import-assertions/7.22.5_@babel+core@7.22.10: + /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -552,7 +612,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-import-attributes/7.22.5_@babel+core@7.22.10: + /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -561,7 +621,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.22.10: + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.10): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -569,7 +629,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.22.10: + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.10): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -577,7 +637,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-jsx/7.22.5_@babel+core@7.22.10: + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -586,7 +646,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.22.10: + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.10): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -594,7 +654,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.22.10: + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.10): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -602,7 +662,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.22.10: + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.10): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -610,7 +670,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.22.10: + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.10): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -618,7 +678,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.22.10: + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.10): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -626,7 +686,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.22.10: + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.10): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -634,7 +694,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.22.10: + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.22.10): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -643,7 +703,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.22.10: + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.10): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -652,7 +712,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-typescript/7.22.5_@babel+core@7.22.10: + /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -661,17 +721,17 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-unicode-sets-regex/7.18.6_@babel+core@7.22.10: + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.22.10): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.22.10 - '@babel/helper-create-regexp-features-plugin': 7.22.9_@babel+core@7.22.10 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.10) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-arrow-functions/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -680,7 +740,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-async-generator-functions/7.22.10_@babel+core@7.22.10: + /@babel/plugin-transform-async-generator-functions@7.22.10(@babel/core@7.22.10): resolution: {integrity: sha512-eueE8lvKVzq5wIObKK/7dvoeKJ+xc6TvRn6aysIjS6pSCeLy7S/eVi7pEQknZqyqvzaNKdDtem8nUNTBgDVR2g==} engines: {node: '>=6.9.0'} peerDependencies: @@ -689,10 +749,10 @@ packages: '@babel/core': 7.22.10 '@babel/helper-environment-visitor': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.9_@babel+core@7.22.10 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.22.10 + '@babel/helper-remap-async-to-generator': 7.22.9(@babel/core@7.22.10) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.10) - /@babel/plugin-transform-async-to-generator/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -701,9 +761,9 @@ packages: '@babel/core': 7.22.10 '@babel/helper-module-imports': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.9_@babel+core@7.22.10 + '@babel/helper-remap-async-to-generator': 7.22.9(@babel/core@7.22.10) - /@babel/plugin-transform-block-scoped-functions/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -712,7 +772,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-block-scoping/7.22.10_@babel+core@7.22.10: + /@babel/plugin-transform-block-scoping@7.22.10(@babel/core@7.22.10): resolution: {integrity: sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -721,28 +781,28 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-class-properties/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.10 - '@babel/helper-create-class-features-plugin': 7.22.10_@babel+core@7.22.10 + '@babel/helper-create-class-features-plugin': 7.22.10(@babel/core@7.22.10) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-class-static-block/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-class-static-block@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: '@babel/core': 7.22.10 - '@babel/helper-create-class-features-plugin': 7.22.10_@babel+core@7.22.10 + '@babel/helper-create-class-features-plugin': 7.22.10(@babel/core@7.22.10) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.22.10 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.10) - /@babel/plugin-transform-classes/7.22.6_@babel+core@7.22.10: + /@babel/plugin-transform-classes@7.22.6(@babel/core@7.22.10): resolution: {integrity: sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -755,11 +815,11 @@ packages: '@babel/helper-function-name': 7.22.5 '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.9_@babel+core@7.22.10 + '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.10) '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 - /@babel/plugin-transform-computed-properties/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -769,7 +829,7 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/template': 7.22.5 - /@babel/plugin-transform-destructuring/7.22.10_@babel+core@7.22.10: + /@babel/plugin-transform-destructuring@7.22.10(@babel/core@7.22.10): resolution: {integrity: sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -778,17 +838,17 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-dotall-regex/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.10 - '@babel/helper-create-regexp-features-plugin': 7.22.9_@babel+core@7.22.10 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.10) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-duplicate-keys/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -797,7 +857,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-dynamic-import/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-dynamic-import@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -805,9 +865,9 @@ packages: dependencies: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.22.10 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.10) - /@babel/plugin-transform-exponentiation-operator/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} engines: {node: '>=6.9.0'} peerDependencies: @@ -817,7 +877,7 @@ packages: '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-export-namespace-from/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-export-namespace-from@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -825,9 +885,9 @@ packages: dependencies: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.22.10 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.10) - /@babel/plugin-transform-flow-strip-types/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-flow-strip-types@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -835,9 +895,9 @@ packages: dependencies: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-flow': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.10) - /@babel/plugin-transform-for-of/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-for-of@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==} engines: {node: '>=6.9.0'} peerDependencies: @@ -846,7 +906,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-function-name/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -857,7 +917,7 @@ packages: '@babel/helper-function-name': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-json-strings/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-json-strings@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==} engines: {node: '>=6.9.0'} peerDependencies: @@ -865,9 +925,9 @@ packages: dependencies: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.22.10 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.10) - /@babel/plugin-transform-literals/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-literals@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} engines: {node: '>=6.9.0'} peerDependencies: @@ -876,7 +936,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-logical-assignment-operators/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-logical-assignment-operators@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -884,9 +944,9 @@ packages: dependencies: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.22.10 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.10) - /@babel/plugin-transform-member-expression-literals/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} engines: {node: '>=6.9.0'} peerDependencies: @@ -895,28 +955,28 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-modules-amd/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-modules-amd@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.10 - '@babel/helper-module-transforms': 7.22.9_@babel+core@7.22.10 + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.10) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-modules-commonjs/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-modules-commonjs@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.10 - '@babel/helper-module-transforms': 7.22.9_@babel+core@7.22.10 + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.10) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.22.5 - /@babel/plugin-transform-modules-systemjs/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-modules-systemjs@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -924,31 +984,31 @@ packages: dependencies: '@babel/core': 7.22.10 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.22.9_@babel+core@7.22.10 + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.10) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-identifier': 7.22.5 - /@babel/plugin-transform-modules-umd/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.10 - '@babel/helper-module-transforms': 7.22.9_@babel+core@7.22.10 + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.10) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-named-capturing-groups-regex/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.22.10 - '@babel/helper-create-regexp-features-plugin': 7.22.9_@babel+core@7.22.10 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.10) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-new-target/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -957,7 +1017,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-nullish-coalescing-operator/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-nullish-coalescing-operator@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -965,9 +1025,9 @@ packages: dependencies: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.22.10 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.10) - /@babel/plugin-transform-numeric-separator/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-numeric-separator@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==} engines: {node: '>=6.9.0'} peerDependencies: @@ -975,9 +1035,9 @@ packages: dependencies: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.22.10 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.10) - /@babel/plugin-transform-object-rest-spread/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-object-rest-spread@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -987,10 +1047,10 @@ packages: '@babel/core': 7.22.10 '@babel/helper-compilation-targets': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.22.10 - '@babel/plugin-transform-parameters': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.10) + '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.10) - /@babel/plugin-transform-object-super/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -998,9 +1058,9 @@ packages: dependencies: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.9_@babel+core@7.22.10 + '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.10) - /@babel/plugin-transform-optional-catch-binding/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-optional-catch-binding@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1008,9 +1068,9 @@ packages: dependencies: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.22.10 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.10) - /@babel/plugin-transform-optional-chaining/7.22.10_@babel+core@7.22.10: + /@babel/plugin-transform-optional-chaining@7.22.10(@babel/core@7.22.10): resolution: {integrity: sha512-MMkQqZAZ+MGj+jGTG3OTuhKeBpNcO+0oCEbrGNEaOmiEn+1MzRyQlYsruGiU8RTK3zV6XwrVJTmwiDOyYK6J9g==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1019,9 +1079,9 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.22.10 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.10) - /@babel/plugin-transform-parameters/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-parameters@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1030,17 +1090,17 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-private-methods/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.10 - '@babel/helper-create-class-features-plugin': 7.22.10_@babel+core@7.22.10 + '@babel/helper-create-class-features-plugin': 7.22.10(@babel/core@7.22.10) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-private-property-in-object/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-private-property-in-object@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1048,11 +1108,11 @@ packages: dependencies: '@babel/core': 7.22.10 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.10_@babel+core@7.22.10 + '@babel/helper-create-class-features-plugin': 7.22.10(@babel/core@7.22.10) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.22.10 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.10) - /@babel/plugin-transform-property-literals/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1061,7 +1121,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-react-constant-elements/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-react-constant-elements@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1070,7 +1130,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-react-display-name/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1079,16 +1139,16 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-react-jsx-development/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.10 - '@babel/plugin-transform-react-jsx': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.10) - /@babel/plugin-transform-react-jsx/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-react-jsx@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1098,10 +1158,10 @@ packages: '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-module-imports': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-jsx': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.10) '@babel/types': 7.22.10 - /@babel/plugin-transform-react-pure-annotations/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1111,7 +1171,7 @@ packages: '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-regenerator/7.22.10_@babel+core@7.22.10: + /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.22.10): resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1121,7 +1181,7 @@ packages: '@babel/helper-plugin-utils': 7.22.5 regenerator-transform: 0.15.2 - /@babel/plugin-transform-reserved-words/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1130,7 +1190,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-runtime/7.22.10_@babel+core@7.22.10: + /@babel/plugin-transform-runtime@7.22.10(@babel/core@7.22.10): resolution: {integrity: sha512-RchI7HePu1eu0CYNKHHHQdfenZcM4nz8rew5B1VWqeRKdcwW5aQ5HeG9eTUbWiAS1UrmHVLmoxTWHt3iLD/NhA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1139,14 +1199,14 @@ packages: '@babel/core': 7.22.10 '@babel/helper-module-imports': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - babel-plugin-polyfill-corejs2: 0.4.5_@babel+core@7.22.10 - babel-plugin-polyfill-corejs3: 0.8.3_@babel+core@7.22.10 - babel-plugin-polyfill-regenerator: 0.5.2_@babel+core@7.22.10 + babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.22.10) + babel-plugin-polyfill-corejs3: 0.8.3(@babel/core@7.22.10) + babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.22.10) semver: 6.3.1 transitivePeerDependencies: - supports-color - /@babel/plugin-transform-shorthand-properties/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1155,7 +1215,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-spread/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-spread@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1165,7 +1225,7 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - /@babel/plugin-transform-sticky-regex/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1174,7 +1234,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-template-literals/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1183,7 +1243,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-typeof-symbol/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1192,7 +1252,7 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-typescript/7.22.10_@babel+core@7.22.10: + /@babel/plugin-transform-typescript@7.22.10(@babel/core@7.22.10): resolution: {integrity: sha512-7++c8I/ymsDo4QQBAgbraXLzIM6jmfao11KgIBEYZRReWzNWH9NtNgJcyrZiXsOPh523FQm6LfpLyy/U5fn46A==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1200,11 +1260,11 @@ packages: dependencies: '@babel/core': 7.22.10 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.10_@babel+core@7.22.10 + '@babel/helper-create-class-features-plugin': 7.22.10(@babel/core@7.22.10) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.10) - /@babel/plugin-transform-unicode-escapes/7.22.10_@babel+core@7.22.10: + /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.22.10): resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1213,37 +1273,37 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-unicode-property-regex/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.10 - '@babel/helper-create-regexp-features-plugin': 7.22.9_@babel+core@7.22.10 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.10) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-unicode-regex/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.10 - '@babel/helper-create-regexp-features-plugin': 7.22.9_@babel+core@7.22.10 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.10) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-unicode-sets-regex/7.22.5_@babel+core@7.22.10: + /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.22.10 - '@babel/helper-create-regexp-features-plugin': 7.22.9_@babel+core@7.22.10 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.10) '@babel/helper-plugin-utils': 7.22.5 - /@babel/preset-env/7.22.10_@babel+core@7.22.10: + /@babel/preset-env@7.22.10(@babel/core@7.22.10): resolution: {integrity: sha512-riHpLb1drNkpLlocmSyEg4oYJIQFeXAK/d7rI6mbD0XsvoTOOweXDmQPG/ErxsEhWk3rl3Q/3F6RFQlVFS8m0A==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1254,86 +1314,86 @@ packages: '@babel/helper-compilation-targets': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.22.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2_@babel+core@7.22.10 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.22.10 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.22.10 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.22.10 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.22.10 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.22.10 - '@babel/plugin-syntax-import-assertions': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-syntax-import-attributes': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.22.10 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.22.10 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.22.10 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.22.10 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.22.10 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.22.10 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.22.10 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.22.10 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.22.10 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.22.10 - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6_@babel+core@7.22.10 - '@babel/plugin-transform-arrow-functions': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-async-generator-functions': 7.22.10_@babel+core@7.22.10 - '@babel/plugin-transform-async-to-generator': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-block-scoped-functions': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-block-scoping': 7.22.10_@babel+core@7.22.10 - '@babel/plugin-transform-class-properties': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-class-static-block': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-classes': 7.22.6_@babel+core@7.22.10 - '@babel/plugin-transform-computed-properties': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-destructuring': 7.22.10_@babel+core@7.22.10 - '@babel/plugin-transform-dotall-regex': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-duplicate-keys': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-dynamic-import': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-exponentiation-operator': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-export-namespace-from': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-for-of': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-function-name': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-json-strings': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-literals': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-logical-assignment-operators': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-member-expression-literals': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-modules-amd': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-modules-commonjs': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-modules-systemjs': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-modules-umd': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-new-target': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-nullish-coalescing-operator': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-numeric-separator': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-object-rest-spread': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-object-super': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-optional-catch-binding': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-optional-chaining': 7.22.10_@babel+core@7.22.10 - '@babel/plugin-transform-parameters': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-private-methods': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-private-property-in-object': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-property-literals': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-regenerator': 7.22.10_@babel+core@7.22.10 - '@babel/plugin-transform-reserved-words': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-shorthand-properties': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-spread': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-sticky-regex': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-template-literals': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-typeof-symbol': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-unicode-escapes': 7.22.10_@babel+core@7.22.10 - '@babel/plugin-transform-unicode-property-regex': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-unicode-regex': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-unicode-sets-regex': 7.22.5_@babel+core@7.22.10 - '@babel/preset-modules': 0.1.6-no-external-plugins_@babel+core@7.22.10 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.10) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.10) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.10) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.10) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.10) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.10) + '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.10) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.10) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.10) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.10) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.10) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.10) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.10) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.10) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.10) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.10) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.22.10) + '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-async-generator-functions': 7.22.10(@babel/core@7.22.10) + '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-block-scoping': 7.22.10(@babel/core@7.22.10) + '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-class-static-block': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-classes': 7.22.6(@babel/core@7.22.10) + '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-destructuring': 7.22.10(@babel/core@7.22.10) + '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-dynamic-import': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-export-namespace-from': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-for-of': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-json-strings': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-logical-assignment-operators': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-modules-amd': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-modules-systemjs': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-nullish-coalescing-operator': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-numeric-separator': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-object-rest-spread': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-optional-catch-binding': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-optional-chaining': 7.22.10(@babel/core@7.22.10) + '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-private-property-in-object': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-regenerator': 7.22.10(@babel/core@7.22.10) + '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-unicode-escapes': 7.22.10(@babel/core@7.22.10) + '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.22.10) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.22.10) '@babel/types': 7.22.10 - babel-plugin-polyfill-corejs2: 0.4.5_@babel+core@7.22.10 - babel-plugin-polyfill-corejs3: 0.8.3_@babel+core@7.22.10 - babel-plugin-polyfill-regenerator: 0.5.2_@babel+core@7.22.10 + babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.22.10) + babel-plugin-polyfill-corejs3: 0.8.3(@babel/core@7.22.10) + babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.22.10) core-js-compat: 3.32.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - /@babel/preset-modules/0.1.6-no-external-plugins_@babel+core@7.22.10: + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.22.10): resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 @@ -1343,7 +1403,7 @@ packages: '@babel/types': 7.22.10 esutils: 2.0.3 - /@babel/preset-react/7.22.5_@babel+core@7.22.10: + /@babel/preset-react@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1352,12 +1412,12 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.22.5 - '@babel/plugin-transform-react-display-name': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-react-jsx': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-react-jsx-development': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-react-pure-annotations': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-react-pure-annotations': 7.22.5(@babel/core@7.22.10) - /@babel/preset-typescript/7.22.5_@babel+core@7.22.10: + /@babel/preset-typescript@7.22.5(@babel/core@7.22.10): resolution: {integrity: sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1366,20 +1426,20 @@ packages: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.22.5 - '@babel/plugin-syntax-jsx': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-modules-commonjs': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-typescript': 7.22.10_@babel+core@7.22.10 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-typescript': 7.22.10(@babel/core@7.22.10) - /@babel/regjsgen/0.8.0: + /@babel/regjsgen@0.8.0: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - /@babel/runtime/7.22.10: + /@babel/runtime@7.22.10: resolution: {integrity: sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.0 - /@babel/template/7.22.5: + /@babel/template@7.22.5: resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} engines: {node: '>=6.9.0'} dependencies: @@ -1387,7 +1447,7 @@ packages: '@babel/parser': 7.22.10 '@babel/types': 7.22.10 - /@babel/traverse/7.22.10: + /@babel/traverse@7.22.10: resolution: {integrity: sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==} engines: {node: '>=6.9.0'} dependencies: @@ -1404,7 +1464,7 @@ packages: transitivePeerDependencies: - supports-color - /@babel/types/7.22.10: + /@babel/types@7.22.10: resolution: {integrity: sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==} engines: {node: '>=6.9.0'} dependencies: @@ -1412,22 +1472,22 @@ packages: '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 - /@bcoe/v8-coverage/0.2.3: + /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - /@craco/craco/7.1.0_emapjj4win3okqyvyzkcgvkhqy: + /@craco/craco@7.1.0(@types/node@16.18.40)(postcss@8.4.27)(react-scripts@5.0.1)(typescript@4.9.5): resolution: {integrity: sha512-oRAcPIKYrfPXp9rSzlsDNeOaVtDiKhoyqSXUoqiK24jCkHr4T8m/a2f74yXIzCbIheoUWDOIfWZyRgFgT+cpqA==} engines: {node: '>=6'} hasBin: true peerDependencies: react-scripts: ^5.0.0 dependencies: - autoprefixer: 10.4.14_postcss@8.4.27 + autoprefixer: 10.4.14(postcss@8.4.27) cosmiconfig: 7.1.0 - cosmiconfig-typescript-loader: 1.0.9_osiawaesgot4tuqtrzm2bzteda + cosmiconfig-typescript-loader: 1.0.9(@types/node@16.18.40)(cosmiconfig@7.1.0)(typescript@4.9.5) cross-spawn: 7.0.3 lodash: 4.17.21 - react-scripts: 5.0.1_j5ip3o3v6sktjzl5cxtjyfbuo4 + react-scripts: 5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.5)(eslint@8.47.0)(react@18.2.0)(typescript@4.9.5) semver: 7.5.4 webpack-merge: 5.9.0 transitivePeerDependencies: @@ -1438,37 +1498,37 @@ packages: - typescript dev: true - /@cspotcode/source-map-support/0.8.1: + /@cspotcode/source-map-support@0.8.1: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} dependencies: '@jridgewell/trace-mapping': 0.3.9 dev: true - /@csstools/normalize.css/12.0.0: + /@csstools/normalize.css@12.0.0: resolution: {integrity: sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==} - /@csstools/postcss-cascade-layers/1.1.1_postcss@8.4.27: + /@csstools/postcss-cascade-layers@1.1.1(postcss@8.4.27): resolution: {integrity: sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/selector-specificity': 2.2.0_c3vcbepomgmxc74cgtawpgpkyi + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.0.13) postcss: 8.4.27 postcss-selector-parser: 6.0.13 - /@csstools/postcss-color-function/1.1.1_postcss@8.4.27: + /@csstools/postcss-color-function@1.1.1(postcss@8.4.27): resolution: {integrity: sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.27 + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.27) postcss: 8.4.27 postcss-value-parser: 4.2.0 - /@csstools/postcss-font-format-keywords/1.0.1_postcss@8.4.27: + /@csstools/postcss-font-format-keywords@1.0.1(postcss@8.4.27): resolution: {integrity: sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: @@ -1477,7 +1537,7 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /@csstools/postcss-hwb-function/1.0.2_postcss@8.4.27: + /@csstools/postcss-hwb-function@1.0.2(postcss@8.4.27): resolution: {integrity: sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==} engines: {node: ^12 || ^14 || >=16} peerDependencies: @@ -1486,27 +1546,27 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /@csstools/postcss-ic-unit/1.0.1_postcss@8.4.27: + /@csstools/postcss-ic-unit@1.0.1(postcss@8.4.27): resolution: {integrity: sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.27 + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.27) postcss: 8.4.27 postcss-value-parser: 4.2.0 - /@csstools/postcss-is-pseudo-class/2.0.7_postcss@8.4.27: + /@csstools/postcss-is-pseudo-class@2.0.7(postcss@8.4.27): resolution: {integrity: sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/selector-specificity': 2.2.0_c3vcbepomgmxc74cgtawpgpkyi + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.0.13) postcss: 8.4.27 postcss-selector-parser: 6.0.13 - /@csstools/postcss-nested-calc/1.0.0_postcss@8.4.27: + /@csstools/postcss-nested-calc@1.0.0(postcss@8.4.27): resolution: {integrity: sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: @@ -1515,7 +1575,7 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /@csstools/postcss-normalize-display-values/1.0.1_postcss@8.4.27: + /@csstools/postcss-normalize-display-values@1.0.1(postcss@8.4.27): resolution: {integrity: sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==} engines: {node: ^12 || ^14 || >=16} peerDependencies: @@ -1524,17 +1584,17 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /@csstools/postcss-oklab-function/1.1.1_postcss@8.4.27: + /@csstools/postcss-oklab-function@1.1.1(postcss@8.4.27): resolution: {integrity: sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.27 + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.27) postcss: 8.4.27 postcss-value-parser: 4.2.0 - /@csstools/postcss-progressive-custom-properties/1.3.0_postcss@8.4.27: + /@csstools/postcss-progressive-custom-properties@1.3.0(postcss@8.4.27): resolution: {integrity: sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: @@ -1543,7 +1603,7 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /@csstools/postcss-stepped-value-functions/1.0.1_postcss@8.4.27: + /@csstools/postcss-stepped-value-functions@1.0.1(postcss@8.4.27): resolution: {integrity: sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: @@ -1552,7 +1612,7 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /@csstools/postcss-text-decoration-shorthand/1.0.0_postcss@8.4.27: + /@csstools/postcss-text-decoration-shorthand@1.0.0(postcss@8.4.27): resolution: {integrity: sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==} engines: {node: ^12 || ^14 || >=16} peerDependencies: @@ -1561,7 +1621,7 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /@csstools/postcss-trigonometric-functions/1.0.2_postcss@8.4.27: + /@csstools/postcss-trigonometric-functions@1.0.2(postcss@8.4.27): resolution: {integrity: sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==} engines: {node: ^14 || >=16} peerDependencies: @@ -1570,7 +1630,7 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /@csstools/postcss-unset-value/1.0.2_postcss@8.4.27: + /@csstools/postcss-unset-value@1.0.2(postcss@8.4.27): resolution: {integrity: sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==} engines: {node: ^12 || ^14 || >=16} peerDependencies: @@ -1578,7 +1638,7 @@ packages: dependencies: postcss: 8.4.27 - /@csstools/selector-specificity/2.2.0_c3vcbepomgmxc74cgtawpgpkyi: + /@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.0.13): resolution: {integrity: sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -1586,7 +1646,205 @@ packages: dependencies: postcss-selector-parser: 6.0.13 - /@eslint-community/eslint-utils/4.4.0_eslint@8.47.0: + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.47.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1595,11 +1853,11 @@ packages: eslint: 8.47.0 eslint-visitor-keys: 3.4.3 - /@eslint-community/regexpp/4.6.2: + /@eslint-community/regexpp@4.6.2: resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - /@eslint/eslintrc/2.1.2: + /@eslint/eslintrc@2.1.2: resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -1615,11 +1873,11 @@ packages: transitivePeerDependencies: - supports-color - /@eslint/js/8.47.0: + /@eslint/js@8.47.0: resolution: {integrity: sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /@humanwhocodes/config-array/0.11.10: + /@humanwhocodes/config-array@0.11.10: resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} engines: {node: '>=10.10.0'} dependencies: @@ -1629,14 +1887,14 @@ packages: transitivePeerDependencies: - supports-color - /@humanwhocodes/module-importer/1.0.1: + /@humanwhocodes/module-importer@1.0.1: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - /@humanwhocodes/object-schema/1.2.1: + /@humanwhocodes/object-schema@1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - /@istanbuljs/load-nyc-config/1.1.0: + /@istanbuljs/load-nyc-config@1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} dependencies: @@ -1646,11 +1904,11 @@ packages: js-yaml: 3.14.1 resolve-from: 5.0.0 - /@istanbuljs/schema/0.1.3: + /@istanbuljs/schema@0.1.3: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - /@jest/console/27.5.1: + /@jest/console@27.5.1: resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -1661,7 +1919,7 @@ packages: jest-util: 27.5.1 slash: 3.0.0 - /@jest/console/28.1.3: + /@jest/console@28.1.3: resolution: {integrity: sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -1672,7 +1930,7 @@ packages: jest-util: 28.1.3 slash: 3.0.0 - /@jest/core/27.5.1: + /@jest/core@27.5.1: resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: @@ -1716,7 +1974,7 @@ packages: - ts-node - utf-8-validate - /@jest/environment/27.5.1: + /@jest/environment@27.5.1: resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -1725,7 +1983,7 @@ packages: '@types/node': 16.18.40 jest-mock: 27.5.1 - /@jest/fake-timers/27.5.1: + /@jest/fake-timers@27.5.1: resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -1736,7 +1994,7 @@ packages: jest-mock: 27.5.1 jest-util: 27.5.1 - /@jest/globals/27.5.1: + /@jest/globals@27.5.1: resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -1744,7 +2002,7 @@ packages: '@jest/types': 27.5.1 expect: 27.5.1 - /@jest/reporters/27.5.1: + /@jest/reporters@27.5.1: resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: @@ -1781,13 +2039,13 @@ packages: transitivePeerDependencies: - supports-color - /@jest/schemas/28.1.3: + /@jest/schemas@28.1.3: resolution: {integrity: sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@sinclair/typebox': 0.24.51 - /@jest/source-map/27.5.1: + /@jest/source-map@27.5.1: resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -1795,7 +2053,7 @@ packages: graceful-fs: 4.2.11 source-map: 0.6.1 - /@jest/test-result/27.5.1: + /@jest/test-result@27.5.1: resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -1804,7 +2062,7 @@ packages: '@types/istanbul-lib-coverage': 2.0.4 collect-v8-coverage: 1.0.2 - /@jest/test-result/28.1.3: + /@jest/test-result@28.1.3: resolution: {integrity: sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -1813,7 +2071,7 @@ packages: '@types/istanbul-lib-coverage': 2.0.4 collect-v8-coverage: 1.0.2 - /@jest/test-sequencer/27.5.1: + /@jest/test-sequencer@27.5.1: resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -1824,7 +2082,7 @@ packages: transitivePeerDependencies: - supports-color - /@jest/transform/27.5.1: + /@jest/transform@27.5.1: resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -1846,7 +2104,7 @@ packages: transitivePeerDependencies: - supports-color - /@jest/types/27.5.1: + /@jest/types@27.5.1: resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -1856,7 +2114,7 @@ packages: '@types/yargs': 16.0.5 chalk: 4.1.2 - /@jest/types/28.1.3: + /@jest/types@28.1.3: resolution: {integrity: sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -1867,7 +2125,7 @@ packages: '@types/yargs': 17.0.24 chalk: 4.1.2 - /@jridgewell/gen-mapping/0.3.3: + /@jridgewell/gen-mapping@0.3.3: resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} dependencies: @@ -1875,63 +2133,63 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.19 - /@jridgewell/resolve-uri/3.1.1: + /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} - /@jridgewell/set-array/1.1.2: + /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} - /@jridgewell/source-map/0.3.5: + /@jridgewell/source-map@0.3.5: resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} dependencies: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.19 - /@jridgewell/sourcemap-codec/1.4.15: + /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - /@jridgewell/trace-mapping/0.3.19: + /@jridgewell/trace-mapping@0.3.19: resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 - /@jridgewell/trace-mapping/0.3.9: + /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 dev: true - /@leichtgewicht/ip-codec/2.0.4: + /@leichtgewicht/ip-codec@2.0.4: resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} - /@nicolo-ribaudo/eslint-scope-5-internals/5.1.1-v1: + /@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1: resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} dependencies: eslint-scope: 5.1.1 - /@nodelib/fs.scandir/2.1.5: + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - /@nodelib/fs.stat/2.0.5: + /@nodelib/fs.stat@2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} - /@nodelib/fs.walk/1.2.8: + /@nodelib/fs.walk@1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 - /@pmmmwh/react-refresh-webpack-plugin/0.5.10_yzxi3427mpmymp2edesmoixdua: + /@pmmmwh/react-refresh-webpack-plugin@0.5.10(react-refresh@0.11.0)(webpack-dev-server@4.15.1)(webpack@5.88.2): resolution: {integrity: sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==} engines: {node: '>= 10.13'} peerDependencies: @@ -1968,53 +2226,53 @@ packages: schema-utils: 3.3.0 source-map: 0.7.4 webpack: 5.88.2 - webpack-dev-server: 4.15.1_webpack@5.88.2 + webpack-dev-server: 4.15.1(webpack@5.88.2) - /@react-dnd/asap/5.0.2: + /@react-dnd/asap@5.0.2: resolution: {integrity: sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A==} dev: false - /@react-dnd/invariant/4.0.2: + /@react-dnd/invariant@4.0.2: resolution: {integrity: sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw==} dev: false - /@react-dnd/shallowequal/4.0.2: + /@react-dnd/shallowequal@4.0.2: resolution: {integrity: sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA==} dev: false - /@reactflow/background/11.2.6_4jhe43xn235rpbr6wcgfu3576u: + /@reactflow/background@11.2.6(@types/react@18.2.20)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-SoBArxNk/NygB6ztCR2RWVcx7yRh+zuSKh37bLbW+hdFcTx6ZgC4vs5+HX2xGY9ZIyR9ipg4Z3+l11ubyzr/lw==} peerDependencies: react: '>=17' react-dom: '>=17' dependencies: - '@reactflow/core': 11.8.1_4jhe43xn235rpbr6wcgfu3576u + '@reactflow/core': 11.8.1(@types/react@18.2.20)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) classcat: 5.0.4 react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - zustand: 4.4.1_6r35cis3cdrdimxih7xf3am2py + react-dom: 18.2.0(react@18.2.0) + zustand: 4.4.1(@types/react@18.2.20)(immer@9.0.21)(react@18.2.0) transitivePeerDependencies: - '@types/react' - immer dev: false - /@reactflow/controls/11.1.17_4jhe43xn235rpbr6wcgfu3576u: + /@reactflow/controls@11.1.17(@types/react@18.2.20)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-iMMuTwF5QEqlgqKr+3wg3YS0wyEQOX2DV1AQJUaZ9WSW17cjH/pH1B7iNAS1giWyyvpYvd1HiXG2zpJIS/NQDg==} peerDependencies: react: '>=17' react-dom: '>=17' dependencies: - '@reactflow/core': 11.8.1_4jhe43xn235rpbr6wcgfu3576u + '@reactflow/core': 11.8.1(@types/react@18.2.20)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) classcat: 5.0.4 react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - zustand: 4.4.1_6r35cis3cdrdimxih7xf3am2py + react-dom: 18.2.0(react@18.2.0) + zustand: 4.4.1(@types/react@18.2.20)(immer@9.0.21)(react@18.2.0) transitivePeerDependencies: - '@types/react' - immer dev: false - /@reactflow/core/11.8.1_4jhe43xn235rpbr6wcgfu3576u: + /@reactflow/core@11.8.1(@types/react@18.2.20)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Ob/21U3Wnugq10zbBESwUxH6NMBoJGvBmJdLJB8ux/w4mzGUMxTR78gFXAsPGsuO3J/pf9MVMPrhTsPA0rApCw==} peerDependencies: react: '>=17' @@ -2029,73 +2287,73 @@ packages: d3-selection: 3.0.0 d3-zoom: 3.0.0 react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - zustand: 4.4.1_6r35cis3cdrdimxih7xf3am2py + react-dom: 18.2.0(react@18.2.0) + zustand: 4.4.1(@types/react@18.2.20)(immer@9.0.21)(react@18.2.0) transitivePeerDependencies: - '@types/react' - immer dev: false - /@reactflow/minimap/11.6.1_4jhe43xn235rpbr6wcgfu3576u: + /@reactflow/minimap@11.6.1(@types/react@18.2.20)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-158m6x0f7es5cmmkfhZYVNI7Yc5gxo+9aHqNDFwu9SR5HeyOU5ezJ6CDsSdHuM6xUNq3kXY1f0Ds6YxvyfRmGg==} peerDependencies: react: '>=17' react-dom: '>=17' dependencies: - '@reactflow/core': 11.8.1_4jhe43xn235rpbr6wcgfu3576u + '@reactflow/core': 11.8.1(@types/react@18.2.20)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) '@types/d3-selection': 3.0.5 '@types/d3-zoom': 3.0.3 classcat: 5.0.4 d3-selection: 3.0.0 d3-zoom: 3.0.0 react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - zustand: 4.4.1_6r35cis3cdrdimxih7xf3am2py + react-dom: 18.2.0(react@18.2.0) + zustand: 4.4.1(@types/react@18.2.20)(immer@9.0.21)(react@18.2.0) transitivePeerDependencies: - '@types/react' - immer dev: false - /@reactflow/node-resizer/2.1.3_4jhe43xn235rpbr6wcgfu3576u: + /@reactflow/node-resizer@2.1.3(@types/react@18.2.20)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-wwEcftxG4BBQGpIfPdsSyDTM5XxwXBkihcoVJRY92t71qNi9CzSuX1xoFO2jvP8thwk8MiWdppVuCKs+1QVAXA==} peerDependencies: react: '>=17' react-dom: '>=17' dependencies: - '@reactflow/core': 11.8.1_4jhe43xn235rpbr6wcgfu3576u + '@reactflow/core': 11.8.1(@types/react@18.2.20)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) classcat: 5.0.4 d3-drag: 3.0.0 d3-selection: 3.0.0 react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - zustand: 4.4.1_6r35cis3cdrdimxih7xf3am2py + react-dom: 18.2.0(react@18.2.0) + zustand: 4.4.1(@types/react@18.2.20)(immer@9.0.21)(react@18.2.0) transitivePeerDependencies: - '@types/react' - immer dev: false - /@reactflow/node-toolbar/1.2.5_4jhe43xn235rpbr6wcgfu3576u: + /@reactflow/node-toolbar@1.2.5(@types/react@18.2.20)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-VrnlzumrnTYGhX5CDylSuPgONexTbI5rnnI+NJWeW+9LXm1mkn3A9DUbIn3jWKcBYdzKW8GPyuPFzaCw0EyVZw==} peerDependencies: react: '>=17' react-dom: '>=17' dependencies: - '@reactflow/core': 11.8.1_4jhe43xn235rpbr6wcgfu3576u + '@reactflow/core': 11.8.1(@types/react@18.2.20)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) classcat: 5.0.4 react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - zustand: 4.4.1_6r35cis3cdrdimxih7xf3am2py + react-dom: 18.2.0(react@18.2.0) + zustand: 4.4.1(@types/react@18.2.20)(immer@9.0.21)(react@18.2.0) transitivePeerDependencies: - '@types/react' - immer dev: false - /@remix-run/router/1.8.0: + /@remix-run/router@1.8.0: resolution: {integrity: sha512-mrfKqIHnSZRyIzBcanNJmVQELTnX+qagEDlcKO90RgRBVOZGSGvZKeDihTRfWcqoDn5N/NkUcwWTccnpN18Tfg==} engines: {node: '>=14.0.0'} dev: false - /@rollup/plugin-babel/5.3.1_vdsg3cryjz3q3k3s4sc37bag2u: + /@rollup/plugin-babel@5.3.1(@babel/core@7.22.10)(rollup@2.79.1): resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} engines: {node: '>= 10.0.0'} peerDependencies: @@ -2108,16 +2366,16 @@ packages: dependencies: '@babel/core': 7.22.10 '@babel/helper-module-imports': 7.22.5 - '@rollup/pluginutils': 3.1.0_rollup@2.79.1 + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) rollup: 2.79.1 - /@rollup/plugin-node-resolve/11.2.1_rollup@2.79.1: + /@rollup/plugin-node-resolve@11.2.1(rollup@2.79.1): resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} engines: {node: '>= 10.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0 dependencies: - '@rollup/pluginutils': 3.1.0_rollup@2.79.1 + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) '@types/resolve': 1.17.1 builtin-modules: 3.3.0 deepmerge: 4.3.1 @@ -2125,16 +2383,16 @@ packages: resolve: 1.22.4 rollup: 2.79.1 - /@rollup/plugin-replace/2.4.2_rollup@2.79.1: + /@rollup/plugin-replace@2.4.2(rollup@2.79.1): resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} peerDependencies: rollup: ^1.20.0 || ^2.0.0 dependencies: - '@rollup/pluginutils': 3.1.0_rollup@2.79.1 + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) magic-string: 0.25.9 rollup: 2.79.1 - /@rollup/pluginutils/3.1.0_rollup@2.79.1: + /@rollup/pluginutils@3.1.0(rollup@2.79.1): resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} engines: {node: '>= 8.0.0'} peerDependencies: @@ -2145,23 +2403,23 @@ packages: picomatch: 2.3.1 rollup: 2.79.1 - /@rushstack/eslint-patch/1.3.3: + /@rushstack/eslint-patch@1.3.3: resolution: {integrity: sha512-0xd7qez0AQ+MbHatZTlI1gu5vkG8r7MYRUJAHPAHJBmGLs16zpkrpAVLvjQKQOqaXPDUBwOiJzNc00znHSCVBw==} - /@sinclair/typebox/0.24.51: + /@sinclair/typebox@0.24.51: resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} - /@sinonjs/commons/1.8.6: + /@sinonjs/commons@1.8.6: resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} dependencies: type-detect: 4.0.8 - /@sinonjs/fake-timers/8.1.0: + /@sinonjs/fake-timers@8.1.0: resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} dependencies: '@sinonjs/commons': 1.8.6 - /@surma/rollup-plugin-off-main-thread/2.2.3: + /@surma/rollup-plugin-off-main-thread@2.2.3: resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} dependencies: ejs: 3.1.9 @@ -2169,39 +2427,39 @@ packages: magic-string: 0.25.9 string.prototype.matchall: 4.0.8 - /@svgr/babel-plugin-add-jsx-attribute/5.4.0: + /@svgr/babel-plugin-add-jsx-attribute@5.4.0: resolution: {integrity: sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==} engines: {node: '>=10'} - /@svgr/babel-plugin-remove-jsx-attribute/5.4.0: + /@svgr/babel-plugin-remove-jsx-attribute@5.4.0: resolution: {integrity: sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==} engines: {node: '>=10'} - /@svgr/babel-plugin-remove-jsx-empty-expression/5.0.1: + /@svgr/babel-plugin-remove-jsx-empty-expression@5.0.1: resolution: {integrity: sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==} engines: {node: '>=10'} - /@svgr/babel-plugin-replace-jsx-attribute-value/5.0.1: + /@svgr/babel-plugin-replace-jsx-attribute-value@5.0.1: resolution: {integrity: sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==} engines: {node: '>=10'} - /@svgr/babel-plugin-svg-dynamic-title/5.4.0: + /@svgr/babel-plugin-svg-dynamic-title@5.4.0: resolution: {integrity: sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==} engines: {node: '>=10'} - /@svgr/babel-plugin-svg-em-dimensions/5.4.0: + /@svgr/babel-plugin-svg-em-dimensions@5.4.0: resolution: {integrity: sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==} engines: {node: '>=10'} - /@svgr/babel-plugin-transform-react-native-svg/5.4.0: + /@svgr/babel-plugin-transform-react-native-svg@5.4.0: resolution: {integrity: sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==} engines: {node: '>=10'} - /@svgr/babel-plugin-transform-svg-component/5.5.0: + /@svgr/babel-plugin-transform-svg-component@5.5.0: resolution: {integrity: sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==} engines: {node: '>=10'} - /@svgr/babel-preset/5.5.0: + /@svgr/babel-preset@5.5.0: resolution: {integrity: sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==} engines: {node: '>=10'} dependencies: @@ -2214,7 +2472,7 @@ packages: '@svgr/babel-plugin-transform-react-native-svg': 5.4.0 '@svgr/babel-plugin-transform-svg-component': 5.5.0 - /@svgr/core/5.5.0: + /@svgr/core@5.5.0: resolution: {integrity: sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==} engines: {node: '>=10'} dependencies: @@ -2224,13 +2482,13 @@ packages: transitivePeerDependencies: - supports-color - /@svgr/hast-util-to-babel-ast/5.5.0: + /@svgr/hast-util-to-babel-ast@5.5.0: resolution: {integrity: sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==} engines: {node: '>=10'} dependencies: '@babel/types': 7.22.10 - /@svgr/plugin-jsx/5.5.0: + /@svgr/plugin-jsx@5.5.0: resolution: {integrity: sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==} engines: {node: '>=10'} dependencies: @@ -2241,7 +2499,7 @@ packages: transitivePeerDependencies: - supports-color - /@svgr/plugin-svgo/5.5.0: + /@svgr/plugin-svgo@5.5.0: resolution: {integrity: sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==} engines: {node: '>=10'} dependencies: @@ -2249,14 +2507,14 @@ packages: deepmerge: 4.3.1 svgo: 1.3.2 - /@svgr/webpack/5.5.0: + /@svgr/webpack@5.5.0: resolution: {integrity: sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==} engines: {node: '>=10'} dependencies: '@babel/core': 7.22.10 - '@babel/plugin-transform-react-constant-elements': 7.22.5_@babel+core@7.22.10 - '@babel/preset-env': 7.22.10_@babel+core@7.22.10 - '@babel/preset-react': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-transform-react-constant-elements': 7.22.5(@babel/core@7.22.10) + '@babel/preset-env': 7.22.10(@babel/core@7.22.10) + '@babel/preset-react': 7.22.5(@babel/core@7.22.10) '@svgr/core': 5.5.0 '@svgr/plugin-jsx': 5.5.0 '@svgr/plugin-svgo': 5.5.0 @@ -2264,7 +2522,7 @@ packages: transitivePeerDependencies: - supports-color - /@testing-library/dom/8.20.1: + /@testing-library/dom@8.20.1: resolution: {integrity: sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==} engines: {node: '>=12'} dependencies: @@ -2278,7 +2536,7 @@ packages: pretty-format: 27.5.1 dev: false - /@testing-library/jest-dom/5.17.0: + /@testing-library/jest-dom@5.17.0: resolution: {integrity: sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==} engines: {node: '>=8', npm: '>=6', yarn: '>=1'} dependencies: @@ -2293,7 +2551,7 @@ packages: redent: 3.0.0 dev: false - /@testing-library/react/13.4.0_biqbaboplfbrettd7655fr4n2y: + /@testing-library/react@13.4.0(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==} engines: {node: '>=12'} peerDependencies: @@ -2304,47 +2562,48 @@ packages: '@testing-library/dom': 8.20.1 '@types/react-dom': 18.2.7 react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@testing-library/user-event/13.5.0: + /@testing-library/user-event@13.5.0(@testing-library/dom@8.20.1): resolution: {integrity: sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==} engines: {node: '>=10', npm: '>=6'} peerDependencies: '@testing-library/dom': '>=7.21.4' dependencies: '@babel/runtime': 7.22.10 + '@testing-library/dom': 8.20.1 dev: false - /@tootallnate/once/1.1.2: + /@tootallnate/once@1.1.2: resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} engines: {node: '>= 6'} - /@trysound/sax/0.2.0: + /@trysound/sax@0.2.0: resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} - /@tsconfig/node10/1.0.9: + /@tsconfig/node10@1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} dev: true - /@tsconfig/node12/1.0.11: + /@tsconfig/node12@1.0.11: resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} dev: true - /@tsconfig/node14/1.0.3: + /@tsconfig/node14@1.0.3: resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} dev: true - /@tsconfig/node16/1.0.4: + /@tsconfig/node16@1.0.4: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} dev: true - /@types/aria-query/5.0.1: + /@types/aria-query@5.0.1: resolution: {integrity: sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==} dev: false - /@types/babel__core/7.20.1: + /@types/babel__core@7.20.1: resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} dependencies: '@babel/parser': 7.22.10 @@ -2353,189 +2612,189 @@ packages: '@types/babel__template': 7.4.1 '@types/babel__traverse': 7.20.1 - /@types/babel__generator/7.6.4: + /@types/babel__generator@7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: '@babel/types': 7.22.10 - /@types/babel__template/7.4.1: + /@types/babel__template@7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: '@babel/parser': 7.22.10 '@babel/types': 7.22.10 - /@types/babel__traverse/7.20.1: + /@types/babel__traverse@7.20.1: resolution: {integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==} dependencies: '@babel/types': 7.22.10 - /@types/body-parser/1.19.2: + /@types/body-parser@1.19.2: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 '@types/node': 16.18.40 - /@types/bonjour/3.5.10: + /@types/bonjour@3.5.10: resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==} dependencies: '@types/node': 16.18.40 - /@types/connect-history-api-fallback/1.5.0: + /@types/connect-history-api-fallback@1.5.0: resolution: {integrity: sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==} dependencies: '@types/express-serve-static-core': 4.17.35 '@types/node': 16.18.40 - /@types/connect/3.4.35: + /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: '@types/node': 16.18.40 - /@types/d3-array/3.0.5: + /@types/d3-array@3.0.5: resolution: {integrity: sha512-Qk7fpJ6qFp+26VeQ47WY0mkwXaiq8+76RJcncDEfMc2ocRzXLO67bLFRNI4OX1aGBoPzsM5Y2T+/m1pldOgD+A==} dev: false - /@types/d3-axis/3.0.2: + /@types/d3-axis@3.0.2: resolution: {integrity: sha512-uGC7DBh0TZrU/LY43Fd8Qr+2ja1FKmH07q2FoZFHo1eYl8aj87GhfVoY1saJVJiq24rp1+wpI6BvQJMKgQm8oA==} dependencies: '@types/d3-selection': 3.0.5 dev: false - /@types/d3-brush/3.0.2: + /@types/d3-brush@3.0.2: resolution: {integrity: sha512-2TEm8KzUG3N7z0TrSKPmbxByBx54M+S9lHoP2J55QuLU0VSQ9mE96EJSAOVNEqd1bbynMjeTS9VHmz8/bSw8rA==} dependencies: '@types/d3-selection': 3.0.5 dev: false - /@types/d3-chord/3.0.2: + /@types/d3-chord@3.0.2: resolution: {integrity: sha512-abT/iLHD3sGZwqMTX1TYCMEulr+wBd0SzyOQnjYNLp7sngdOHYtNkMRI5v3w5thoN+BWtlHVDx2Osvq6fxhZWw==} dev: false - /@types/d3-color/3.1.0: + /@types/d3-color@3.1.0: resolution: {integrity: sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==} dev: false - /@types/d3-contour/3.0.2: + /@types/d3-contour@3.0.2: resolution: {integrity: sha512-k6/bGDoAGJZnZWaKzeB+9glgXCYGvh6YlluxzBREiVo8f/X2vpTEdgPy9DN7Z2i42PZOZ4JDhVdlTSTSkLDPlQ==} dependencies: '@types/d3-array': 3.0.5 '@types/geojson': 7946.0.10 dev: false - /@types/d3-delaunay/6.0.1: + /@types/d3-delaunay@6.0.1: resolution: {integrity: sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==} dev: false - /@types/d3-dispatch/3.0.2: + /@types/d3-dispatch@3.0.2: resolution: {integrity: sha512-rxN6sHUXEZYCKV05MEh4z4WpPSqIw+aP7n9ZN6WYAAvZoEAghEK1WeVZMZcHRBwyaKflU43PCUAJNjFxCzPDjg==} dev: false - /@types/d3-drag/3.0.2: + /@types/d3-drag@3.0.2: resolution: {integrity: sha512-qmODKEDvyKWVHcWWCOVcuVcOwikLVsyc4q4EBJMREsoQnR2Qoc2cZQUyFUPgO9q4S3qdSqJKBsuefv+h0Qy+tw==} dependencies: '@types/d3-selection': 3.0.5 dev: false - /@types/d3-dsv/3.0.1: + /@types/d3-dsv@3.0.1: resolution: {integrity: sha512-76pBHCMTvPLt44wFOieouXcGXWOF0AJCceUvaFkxSZEu4VDUdv93JfpMa6VGNFs01FHfuP4a5Ou68eRG1KBfTw==} dev: false - /@types/d3-ease/3.0.0: + /@types/d3-ease@3.0.0: resolution: {integrity: sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==} dev: false - /@types/d3-fetch/3.0.2: + /@types/d3-fetch@3.0.2: resolution: {integrity: sha512-gllwYWozWfbep16N9fByNBDTkJW/SyhH6SGRlXloR7WdtAaBui4plTP+gbUgiEot7vGw/ZZop1yDZlgXXSuzjA==} dependencies: '@types/d3-dsv': 3.0.1 dev: false - /@types/d3-force/3.0.4: + /@types/d3-force@3.0.4: resolution: {integrity: sha512-q7xbVLrWcXvSBBEoadowIUJ7sRpS1yvgMWnzHJggFy5cUZBq2HZL5k/pBSm0GdYWS1vs5/EDwMjSKF55PDY4Aw==} dev: false - /@types/d3-format/3.0.1: + /@types/d3-format@3.0.1: resolution: {integrity: sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==} dev: false - /@types/d3-geo/3.0.3: + /@types/d3-geo@3.0.3: resolution: {integrity: sha512-bK9uZJS3vuDCNeeXQ4z3u0E7OeJZXjUgzFdSOtNtMCJCLvDtWDwfpRVWlyt3y8EvRzI0ccOu9xlMVirawolSCw==} dependencies: '@types/geojson': 7946.0.10 dev: false - /@types/d3-hierarchy/3.1.2: + /@types/d3-hierarchy@3.1.2: resolution: {integrity: sha512-9hjRTVoZjRFR6xo8igAJyNXQyPX6Aq++Nhb5ebrUF414dv4jr2MitM2fWiOY475wa3Za7TOS2Gh9fmqEhLTt0A==} dev: false - /@types/d3-interpolate/3.0.1: + /@types/d3-interpolate@3.0.1: resolution: {integrity: sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==} dependencies: '@types/d3-color': 3.1.0 dev: false - /@types/d3-path/3.0.0: + /@types/d3-path@3.0.0: resolution: {integrity: sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==} dev: false - /@types/d3-polygon/3.0.0: + /@types/d3-polygon@3.0.0: resolution: {integrity: sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==} dev: false - /@types/d3-quadtree/3.0.2: + /@types/d3-quadtree@3.0.2: resolution: {integrity: sha512-QNcK8Jguvc8lU+4OfeNx+qnVy7c0VrDJ+CCVFS9srBo2GL9Y18CnIxBdTF3v38flrGy5s1YggcoAiu6s4fLQIw==} dev: false - /@types/d3-random/3.0.1: + /@types/d3-random@3.0.1: resolution: {integrity: sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==} dev: false - /@types/d3-scale-chromatic/3.0.0: + /@types/d3-scale-chromatic@3.0.0: resolution: {integrity: sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==} dev: false - /@types/d3-scale/4.0.3: + /@types/d3-scale@4.0.3: resolution: {integrity: sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==} dependencies: '@types/d3-time': 3.0.0 dev: false - /@types/d3-selection/3.0.5: + /@types/d3-selection@3.0.5: resolution: {integrity: sha512-xCB0z3Hi8eFIqyja3vW8iV01+OHGYR2di/+e+AiOcXIOrY82lcvWW8Ke1DYE/EUVMsBl4Db9RppSBS3X1U6J0w==} dev: false - /@types/d3-shape/3.1.1: + /@types/d3-shape@3.1.1: resolution: {integrity: sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==} dependencies: '@types/d3-path': 3.0.0 dev: false - /@types/d3-time-format/4.0.0: + /@types/d3-time-format@4.0.0: resolution: {integrity: sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw==} dev: false - /@types/d3-time/3.0.0: + /@types/d3-time@3.0.0: resolution: {integrity: sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==} dev: false - /@types/d3-timer/3.0.0: + /@types/d3-timer@3.0.0: resolution: {integrity: sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==} dev: false - /@types/d3-transition/3.0.3: + /@types/d3-transition@3.0.3: resolution: {integrity: sha512-/S90Od8Id1wgQNvIA8iFv9jRhCiZcGhPd2qX0bKF/PS+y0W5CrXKgIiELd2CvG1mlQrWK/qlYh3VxicqG1ZvgA==} dependencies: '@types/d3-selection': 3.0.5 dev: false - /@types/d3-zoom/3.0.3: + /@types/d3-zoom@3.0.3: resolution: {integrity: sha512-OWk1yYIIWcZ07+igN6BeoG6rqhnJ/pYe+R1qWFM2DtW49zsoSjgb9G5xB0ZXA8hh2jAzey1XuRmMSoXdKw8MDA==} dependencies: '@types/d3-interpolate': 3.0.1 '@types/d3-selection': 3.0.5 dev: false - /@types/d3/7.4.0: + /@types/d3@7.4.0: resolution: {integrity: sha512-jIfNVK0ZlxcuRDKtRS/SypEyOQ6UHaFQBKv032X45VvxSJ6Yi5G9behy9h6tNTHTDGh5Vq+KbmBjUWLgY4meCA==} dependencies: '@types/d3-array': 3.0.5 @@ -2570,31 +2829,31 @@ packages: '@types/d3-zoom': 3.0.3 dev: false - /@types/debug/4.1.8: + /@types/debug@4.1.8: resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==} dependencies: '@types/ms': 0.7.31 dev: false - /@types/eslint-scope/3.7.4: + /@types/eslint-scope@3.7.4: resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} dependencies: '@types/eslint': 8.44.2 '@types/estree': 1.0.1 - /@types/eslint/8.44.2: + /@types/eslint@8.44.2: resolution: {integrity: sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==} dependencies: '@types/estree': 1.0.1 '@types/json-schema': 7.0.12 - /@types/estree/0.0.39: + /@types/estree@0.0.39: resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} - /@types/estree/1.0.1: + /@types/estree@1.0.1: resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} - /@types/express-serve-static-core/4.17.35: + /@types/express-serve-static-core@4.17.35: resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} dependencies: '@types/node': 16.18.40 @@ -2602,7 +2861,7 @@ packages: '@types/range-parser': 1.2.4 '@types/send': 0.17.1 - /@types/express/4.17.17: + /@types/express@4.17.17: resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} dependencies: '@types/body-parser': 1.19.2 @@ -2610,115 +2869,115 @@ packages: '@types/qs': 6.9.7 '@types/serve-static': 1.15.2 - /@types/file-saver/2.0.5: + /@types/file-saver@2.0.5: resolution: {integrity: sha512-zv9kNf3keYegP5oThGLaPk8E081DFDuwfqjtiTzm6PoxChdJ1raSuADf2YGCVIyrSynLrgc8JWv296s7Q7pQSQ==} dev: true - /@types/geojson/7946.0.10: + /@types/geojson@7946.0.10: resolution: {integrity: sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==} dev: false - /@types/graceful-fs/4.1.6: + /@types/graceful-fs@4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: '@types/node': 16.18.40 - /@types/hast/2.3.5: + /@types/hast@2.3.5: resolution: {integrity: sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg==} dependencies: '@types/unist': 2.0.7 dev: false - /@types/html-minifier-terser/6.1.0: + /@types/html-minifier-terser@6.1.0: resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} - /@types/http-errors/2.0.1: + /@types/http-errors@2.0.1: resolution: {integrity: sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==} - /@types/http-proxy/1.17.11: + /@types/http-proxy@1.17.11: resolution: {integrity: sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==} dependencies: '@types/node': 16.18.40 - /@types/istanbul-lib-coverage/2.0.4: + /@types/istanbul-lib-coverage@2.0.4: resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} - /@types/istanbul-lib-report/3.0.0: + /@types/istanbul-lib-report@3.0.0: resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} dependencies: '@types/istanbul-lib-coverage': 2.0.4 - /@types/istanbul-reports/3.0.1: + /@types/istanbul-reports@3.0.1: resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} dependencies: '@types/istanbul-lib-report': 3.0.0 - /@types/jest/27.5.2: + /@types/jest@27.5.2: resolution: {integrity: sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==} dependencies: jest-matcher-utils: 27.5.1 pretty-format: 27.5.1 dev: false - /@types/json-schema/7.0.12: + /@types/json-schema@7.0.12: resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} - /@types/json5/0.0.29: + /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - /@types/lodash/4.14.197: + /@types/lodash@4.14.197: resolution: {integrity: sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g==} dev: true - /@types/luxon/3.3.1: + /@types/luxon@3.3.1: resolution: {integrity: sha512-XOS5nBcgEeP2PpcqJHjCWhUCAzGfXIU8ILOSLpx2FhxqMW9KdxgCGXNOEKGVBfveKtIpztHzKK5vSRVLyW/NqA==} dev: true - /@types/mdast/3.0.12: + /@types/mdast@3.0.12: resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==} dependencies: '@types/unist': 2.0.7 dev: false - /@types/mime/1.3.2: + /@types/mime@1.3.2: resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} - /@types/mime/3.0.1: + /@types/mime@3.0.1: resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} - /@types/ms/0.7.31: + /@types/ms@0.7.31: resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} dev: false - /@types/node/16.18.40: + /@types/node@16.18.40: resolution: {integrity: sha512-+yno3ItTEwGxXiS/75Q/aHaa5srkpnJaH+kdkTVJ3DtJEwv92itpKbxU+FjPoh2m/5G9zmUQfrL4A4C13c+iGA==} - /@types/parse-json/4.0.0: + /@types/parse-json@4.0.0: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} - /@types/prettier/2.7.3: + /@types/prettier@2.7.3: resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} - /@types/prop-types/15.7.5: + /@types/prop-types@15.7.5: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} dev: false - /@types/q/1.5.5: + /@types/q@1.5.5: resolution: {integrity: sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==} - /@types/qs/6.9.7: + /@types/qs@6.9.7: resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} - /@types/range-parser/1.2.4: + /@types/range-parser@1.2.4: resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} - /@types/react-dom/18.2.7: + /@types/react-dom@18.2.7: resolution: {integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==} dependencies: '@types/react': 18.2.20 dev: false - /@types/react/18.2.20: + /@types/react@18.2.20: resolution: {integrity: sha512-WKNtmsLWJM/3D5mG4U84cysVY31ivmyw85dE84fOCk5Hx78wezB/XEjVPWl2JTZ5FkEeaTJf+VgUAUn3PE7Isw==} dependencies: '@types/prop-types': 15.7.5 @@ -2726,79 +2985,79 @@ packages: csstype: 3.1.2 dev: false - /@types/resolve/1.17.1: + /@types/resolve@1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: '@types/node': 16.18.40 - /@types/retry/0.12.0: + /@types/retry@0.12.0: resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} - /@types/scheduler/0.16.3: + /@types/scheduler@0.16.3: resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} dev: false - /@types/semver/7.5.0: + /@types/semver@7.5.0: resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} - /@types/send/0.17.1: + /@types/send@0.17.1: resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} dependencies: '@types/mime': 1.3.2 '@types/node': 16.18.40 - /@types/serve-index/1.9.1: + /@types/serve-index@1.9.1: resolution: {integrity: sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==} dependencies: '@types/express': 4.17.17 - /@types/serve-static/1.15.2: + /@types/serve-static@1.15.2: resolution: {integrity: sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==} dependencies: '@types/http-errors': 2.0.1 '@types/mime': 3.0.1 '@types/node': 16.18.40 - /@types/sockjs/0.3.33: + /@types/sockjs@0.3.33: resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} dependencies: '@types/node': 16.18.40 - /@types/stack-utils/2.0.1: + /@types/stack-utils@2.0.1: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} - /@types/testing-library__jest-dom/5.14.9: + /@types/testing-library__jest-dom@5.14.9: resolution: {integrity: sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==} dependencies: '@types/jest': 27.5.2 dev: false - /@types/trusted-types/2.0.3: + /@types/trusted-types@2.0.3: resolution: {integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==} - /@types/unist/2.0.7: + /@types/unist@2.0.7: resolution: {integrity: sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==} dev: false - /@types/ws/8.5.5: + /@types/ws@8.5.5: resolution: {integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==} dependencies: '@types/node': 16.18.40 - /@types/yargs-parser/21.0.0: + /@types/yargs-parser@21.0.0: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} - /@types/yargs/16.0.5: + /@types/yargs@16.0.5: resolution: {integrity: sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==} dependencies: '@types/yargs-parser': 21.0.0 - /@types/yargs/17.0.24: + /@types/yargs@17.0.24: resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} dependencies: '@types/yargs-parser': 21.0.0 - /@typescript-eslint/eslint-plugin/5.62.0_b4dpngykx2cv4esjowwmn5pt3a: + /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.47.0)(typescript@4.9.5): resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2810,34 +3069,34 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.6.2 - '@typescript-eslint/parser': 5.62.0_2voyjndugpfz33zwqvnblpgcve + '@typescript-eslint/parser': 5.62.0(eslint@8.47.0)(typescript@4.9.5) '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0_2voyjndugpfz33zwqvnblpgcve - '@typescript-eslint/utils': 5.62.0_2voyjndugpfz33zwqvnblpgcve + '@typescript-eslint/type-utils': 5.62.0(eslint@8.47.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.47.0)(typescript@4.9.5) debug: 4.3.4 eslint: 8.47.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare-lite: 1.4.0 semver: 7.5.4 - tsutils: 3.21.0_typescript@4.9.5 + tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - supports-color - /@typescript-eslint/experimental-utils/5.62.0_2voyjndugpfz33zwqvnblpgcve: + /@typescript-eslint/experimental-utils@5.62.0(eslint@8.47.0)(typescript@4.9.5): resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.62.0_2voyjndugpfz33zwqvnblpgcve + '@typescript-eslint/utils': 5.62.0(eslint@8.47.0)(typescript@4.9.5) eslint: 8.47.0 transitivePeerDependencies: - supports-color - typescript - /@typescript-eslint/parser/5.62.0_2voyjndugpfz33zwqvnblpgcve: + /@typescript-eslint/parser@5.62.0(eslint@8.47.0)(typescript@4.9.5): resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2849,21 +3108,21 @@ packages: dependencies: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0_typescript@4.9.5 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) debug: 4.3.4 eslint: 8.47.0 typescript: 4.9.5 transitivePeerDependencies: - supports-color - /@typescript-eslint/scope-manager/5.62.0: + /@typescript-eslint/scope-manager@5.62.0: resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - /@typescript-eslint/type-utils/5.62.0_2voyjndugpfz33zwqvnblpgcve: + /@typescript-eslint/type-utils@5.62.0(eslint@8.47.0)(typescript@4.9.5): resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2873,20 +3132,20 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.62.0_typescript@4.9.5 - '@typescript-eslint/utils': 5.62.0_2voyjndugpfz33zwqvnblpgcve + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.47.0)(typescript@4.9.5) debug: 4.3.4 eslint: 8.47.0 - tsutils: 3.21.0_typescript@4.9.5 + tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - supports-color - /@typescript-eslint/types/5.62.0: + /@typescript-eslint/types@5.62.0: resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /@typescript-eslint/typescript-estree/5.62.0_typescript@4.9.5: + /@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5): resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2901,23 +3160,23 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - tsutils: 3.21.0_typescript@4.9.5 + tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - supports-color - /@typescript-eslint/utils/5.62.0_2voyjndugpfz33zwqvnblpgcve: + /@typescript-eslint/utils@5.62.0(eslint@8.47.0)(typescript@4.9.5): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0_eslint@8.47.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) '@types/json-schema': 7.0.12 '@types/semver': 7.5.0 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0_typescript@4.9.5 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) eslint: 8.47.0 eslint-scope: 5.1.1 semver: 7.5.4 @@ -2925,39 +3184,39 @@ packages: - supports-color - typescript - /@typescript-eslint/visitor-keys/5.62.0: + /@typescript-eslint/visitor-keys@5.62.0: resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 - /@webassemblyjs/ast/1.11.6: + /@webassemblyjs/ast@1.11.6: resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} dependencies: '@webassemblyjs/helper-numbers': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - /@webassemblyjs/floating-point-hex-parser/1.11.6: + /@webassemblyjs/floating-point-hex-parser@1.11.6: resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - /@webassemblyjs/helper-api-error/1.11.6: + /@webassemblyjs/helper-api-error@1.11.6: resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - /@webassemblyjs/helper-buffer/1.11.6: + /@webassemblyjs/helper-buffer@1.11.6: resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} - /@webassemblyjs/helper-numbers/1.11.6: + /@webassemblyjs/helper-numbers@1.11.6: resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} dependencies: '@webassemblyjs/floating-point-hex-parser': 1.11.6 '@webassemblyjs/helper-api-error': 1.11.6 '@xtuc/long': 4.2.2 - /@webassemblyjs/helper-wasm-bytecode/1.11.6: + /@webassemblyjs/helper-wasm-bytecode@1.11.6: resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - /@webassemblyjs/helper-wasm-section/1.11.6: + /@webassemblyjs/helper-wasm-section@1.11.6: resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} dependencies: '@webassemblyjs/ast': 1.11.6 @@ -2965,20 +3224,20 @@ packages: '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/wasm-gen': 1.11.6 - /@webassemblyjs/ieee754/1.11.6: + /@webassemblyjs/ieee754@1.11.6: resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} dependencies: '@xtuc/ieee754': 1.2.0 - /@webassemblyjs/leb128/1.11.6: + /@webassemblyjs/leb128@1.11.6: resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} dependencies: '@xtuc/long': 4.2.2 - /@webassemblyjs/utf8/1.11.6: + /@webassemblyjs/utf8@1.11.6: resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - /@webassemblyjs/wasm-edit/1.11.6: + /@webassemblyjs/wasm-edit@1.11.6: resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} dependencies: '@webassemblyjs/ast': 1.11.6 @@ -2990,7 +3249,7 @@ packages: '@webassemblyjs/wasm-parser': 1.11.6 '@webassemblyjs/wast-printer': 1.11.6 - /@webassemblyjs/wasm-gen/1.11.6: + /@webassemblyjs/wasm-gen@1.11.6: resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} dependencies: '@webassemblyjs/ast': 1.11.6 @@ -2999,7 +3258,7 @@ packages: '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - /@webassemblyjs/wasm-opt/1.11.6: + /@webassemblyjs/wasm-opt@1.11.6: resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} dependencies: '@webassemblyjs/ast': 1.11.6 @@ -3007,7 +3266,7 @@ packages: '@webassemblyjs/wasm-gen': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 - /@webassemblyjs/wasm-parser/1.11.6: + /@webassemblyjs/wasm-parser@1.11.6: resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} dependencies: '@webassemblyjs/ast': 1.11.6 @@ -3017,79 +3276,79 @@ packages: '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - /@webassemblyjs/wast-printer/1.11.6: + /@webassemblyjs/wast-printer@1.11.6: resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} dependencies: '@webassemblyjs/ast': 1.11.6 '@xtuc/long': 4.2.2 - /@xtuc/ieee754/1.2.0: + /@xtuc/ieee754@1.2.0: resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - /@xtuc/long/4.2.2: + /@xtuc/long@4.2.2: resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - /abab/2.0.6: + /abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - /accepts/1.3.8: + /accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} dependencies: mime-types: 2.1.35 negotiator: 0.6.3 - /acorn-globals/6.0.0: + /acorn-globals@6.0.0: resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} dependencies: acorn: 7.4.1 acorn-walk: 7.2.0 - /acorn-import-assertions/1.9.0_acorn@8.10.0: + /acorn-import-assertions@1.9.0(acorn@8.10.0): resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} peerDependencies: acorn: ^8 dependencies: acorn: 8.10.0 - /acorn-jsx/5.3.2_acorn@8.10.0: + /acorn-jsx@5.3.2(acorn@8.10.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: acorn: 8.10.0 - /acorn-walk/7.2.0: + /acorn-walk@7.2.0: resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} engines: {node: '>=0.4.0'} - /acorn-walk/8.2.0: + /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} dev: true - /acorn/7.4.1: + /acorn@7.4.1: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} hasBin: true - /acorn/8.10.0: + /acorn@8.10.0: resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} engines: {node: '>=0.4.0'} hasBin: true - /address/1.2.2: + /address@1.2.2: resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} engines: {node: '>= 10.0.0'} - /adjust-sourcemap-loader/4.0.0: + /adjust-sourcemap-loader@4.0.0: resolution: {integrity: sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==} engines: {node: '>=8.9'} dependencies: loader-utils: 2.0.4 regex-parser: 2.2.11 - /agent-base/6.0.2: + /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: @@ -3097,22 +3356,24 @@ packages: transitivePeerDependencies: - supports-color - /ajv-formats/2.1.1: + /ajv-formats@2.1.1(ajv@8.12.0): resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 peerDependenciesMeta: ajv: optional: true dependencies: ajv: 8.12.0 - /ajv-keywords/3.5.2_ajv@6.12.6: + /ajv-keywords@3.5.2(ajv@6.12.6): resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} peerDependencies: ajv: ^6.9.1 dependencies: ajv: 6.12.6 - /ajv-keywords/5.1.0_ajv@8.12.0: + /ajv-keywords@5.1.0(ajv@8.12.0): resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} peerDependencies: ajv: ^8.8.2 @@ -3120,7 +3381,7 @@ packages: ajv: 8.12.0 fast-deep-equal: 3.1.3 - /ajv/6.12.6: + /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: fast-deep-equal: 3.1.3 @@ -3128,7 +3389,7 @@ packages: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - /ajv/8.12.0: + /ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} dependencies: fast-deep-equal: 3.1.3 @@ -3136,90 +3397,90 @@ packages: require-from-string: 2.0.2 uri-js: 4.4.1 - /ansi-escapes/4.3.2: + /ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} dependencies: type-fest: 0.21.3 - /ansi-html-community/0.0.8: + /ansi-html-community@0.0.8: resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} engines: {'0': node >= 0.8.0} hasBin: true - /ansi-regex/5.0.1: + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - /ansi-regex/6.0.1: + /ansi-regex@6.0.1: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} - /ansi-styles/3.2.1: + /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} dependencies: color-convert: 1.9.3 - /ansi-styles/4.3.0: + /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} dependencies: color-convert: 2.0.1 - /ansi-styles/5.2.0: + /ansi-styles@5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} - /any-promise/1.3.0: + /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - /anymatch/3.1.3: + /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - /arg/4.1.3: + /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true - /arg/5.0.2: + /arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - /argparse/1.0.10: + /argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: sprintf-js: 1.0.3 - /argparse/2.0.1: + /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - /aria-query/5.1.3: + /aria-query@5.1.3: resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} dependencies: deep-equal: 2.2.2 dev: false - /aria-query/5.3.0: + /aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} dependencies: dequal: 2.0.3 - /array-buffer-byte-length/1.0.0: + /array-buffer-byte-length@1.0.0: resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} dependencies: call-bind: 1.0.2 is-array-buffer: 3.0.2 - /array-flatten/1.1.1: + /array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - /array-flatten/2.1.2: + /array-flatten@2.1.2: resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==} - /array-includes/3.1.6: + /array-includes@3.1.6: resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} engines: {node: '>= 0.4'} dependencies: @@ -3229,23 +3490,23 @@ packages: get-intrinsic: 1.2.1 is-string: 1.0.7 - /array-union/1.0.2: + /array-union@1.0.2: resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} engines: {node: '>=0.10.0'} dependencies: array-uniq: 1.0.3 dev: true - /array-union/2.1.0: + /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - /array-uniq/1.0.3: + /array-uniq@1.0.3: resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} engines: {node: '>=0.10.0'} dev: true - /array.prototype.findlastindex/1.2.2: + /array.prototype.findlastindex@1.2.2: resolution: {integrity: sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==} engines: {node: '>= 0.4'} dependencies: @@ -3255,7 +3516,7 @@ packages: es-shim-unscopables: 1.0.0 get-intrinsic: 1.2.1 - /array.prototype.flat/1.3.1: + /array.prototype.flat@1.3.1: resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} engines: {node: '>= 0.4'} dependencies: @@ -3264,7 +3525,7 @@ packages: es-abstract: 1.22.1 es-shim-unscopables: 1.0.0 - /array.prototype.flatmap/1.3.1: + /array.prototype.flatmap@1.3.1: resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} engines: {node: '>= 0.4'} dependencies: @@ -3273,7 +3534,7 @@ packages: es-abstract: 1.22.1 es-shim-unscopables: 1.0.0 - /array.prototype.reduce/1.0.5: + /array.prototype.reduce@1.0.5: resolution: {integrity: sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==} engines: {node: '>= 0.4'} dependencies: @@ -3283,7 +3544,7 @@ packages: es-array-method-boxes-properly: 1.0.0 is-string: 1.0.7 - /array.prototype.tosorted/1.1.1: + /array.prototype.tosorted@1.1.1: resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} dependencies: call-bind: 1.0.2 @@ -3292,7 +3553,7 @@ packages: es-shim-unscopables: 1.0.0 get-intrinsic: 1.2.1 - /arraybuffer.prototype.slice/1.0.1: + /arraybuffer.prototype.slice@1.0.1: resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==} engines: {node: '>= 0.4'} dependencies: @@ -3303,29 +3564,29 @@ packages: is-array-buffer: 3.0.2 is-shared-array-buffer: 1.0.2 - /asap/2.0.6: + /asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - /ast-types-flow/0.0.7: + /ast-types-flow@0.0.7: resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} - /async/2.6.4: + /async@2.6.4: resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} dependencies: lodash: 4.17.21 dev: true - /async/3.2.4: + /async@3.2.4: resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} - /asynckit/0.4.0: + /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - /at-least-node/1.0.0: + /at-least-node@1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} - /autoprefixer/10.4.14_postcss@8.4.27: + /autoprefixer@10.4.14(postcss@8.4.27): resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} engines: {node: ^10 || ^12 || >=14} hasBin: true @@ -3340,20 +3601,20 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /available-typed-arrays/1.0.5: + /available-typed-arrays@1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} - /axe-core/4.7.2: + /axe-core@4.7.2: resolution: {integrity: sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==} engines: {node: '>=4'} - /axobject-query/3.2.1: + /axobject-query@3.2.1: resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} dependencies: dequal: 2.0.3 - /babel-jest/27.5.1_@babel+core@7.22.10: + /babel-jest@27.5.1(@babel/core@7.22.10): resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: @@ -3364,14 +3625,14 @@ packages: '@jest/types': 27.5.1 '@types/babel__core': 7.20.1 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 27.5.1_@babel+core@7.22.10 + babel-preset-jest: 27.5.1(@babel/core@7.22.10) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 transitivePeerDependencies: - supports-color - /babel-loader/8.3.0_a7bz5yhgcoab2comip4bcc2pf4: + /babel-loader@8.3.0(@babel/core@7.22.10)(webpack@5.88.2): resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} engines: {node: '>= 8.9'} peerDependencies: @@ -3385,7 +3646,7 @@ packages: schema-utils: 2.7.1 webpack: 5.88.2 - /babel-plugin-istanbul/6.1.1: + /babel-plugin-istanbul@6.1.1: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} dependencies: @@ -3397,7 +3658,7 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-jest-hoist/27.5.1: + /babel-plugin-jest-hoist@27.5.1: resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -3406,7 +3667,7 @@ packages: '@types/babel__core': 7.20.1 '@types/babel__traverse': 7.20.1 - /babel-plugin-macros/3.1.0: + /babel-plugin-macros@3.1.0: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} dependencies: @@ -3414,69 +3675,69 @@ packages: cosmiconfig: 7.1.0 resolve: 1.22.4 - /babel-plugin-named-asset-import/0.3.8_@babel+core@7.22.10: + /babel-plugin-named-asset-import@0.3.8(@babel/core@7.22.10): resolution: {integrity: sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==} peerDependencies: '@babel/core': ^7.1.0 dependencies: '@babel/core': 7.22.10 - /babel-plugin-polyfill-corejs2/0.4.5_@babel+core@7.22.10: + /babel-plugin-polyfill-corejs2@0.4.5(@babel/core@7.22.10): resolution: {integrity: sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: '@babel/compat-data': 7.22.9 '@babel/core': 7.22.10 - '@babel/helper-define-polyfill-provider': 0.4.2_@babel+core@7.22.10 + '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.10) semver: 6.3.1 transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-corejs3/0.8.3_@babel+core@7.22.10: + /babel-plugin-polyfill-corejs3@0.8.3(@babel/core@7.22.10): resolution: {integrity: sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: '@babel/core': 7.22.10 - '@babel/helper-define-polyfill-provider': 0.4.2_@babel+core@7.22.10 + '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.10) core-js-compat: 3.32.0 transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-regenerator/0.5.2_@babel+core@7.22.10: + /babel-plugin-polyfill-regenerator@0.5.2(@babel/core@7.22.10): resolution: {integrity: sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: '@babel/core': 7.22.10 - '@babel/helper-define-polyfill-provider': 0.4.2_@babel+core@7.22.10 + '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.10) transitivePeerDependencies: - supports-color - /babel-plugin-transform-react-remove-prop-types/0.4.24: + /babel-plugin-transform-react-remove-prop-types@0.4.24: resolution: {integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==} - /babel-preset-current-node-syntax/1.0.1_@babel+core@7.22.10: + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.22.10): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.22.10 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.22.10 - '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.22.10 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.22.10 - '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.22.10 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.22.10 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.22.10 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.22.10 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.22.10 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.22.10 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.22.10 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.22.10 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.22.10 - - /babel-preset-jest/27.5.1_@babel+core@7.22.10: + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.10) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.22.10) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.10) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.10) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.10) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.10) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.10) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.10) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.10) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.10) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.10) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.10) + + /babel-preset-jest@27.5.1(@babel/core@7.22.10): resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: @@ -3484,48 +3745,48 @@ packages: dependencies: '@babel/core': 7.22.10 babel-plugin-jest-hoist: 27.5.1 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.22.10 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.10) - /babel-preset-react-app/10.0.1: + /babel-preset-react-app@10.0.1: resolution: {integrity: sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==} dependencies: '@babel/core': 7.22.10 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.22.10 - '@babel/plugin-proposal-decorators': 7.22.10_@babel+core@7.22.10 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.22.10 - '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.22.10 - '@babel/plugin-proposal-optional-chaining': 7.21.0_@babel+core@7.22.10 - '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.22.10 - '@babel/plugin-proposal-private-property-in-object': 7.21.11_@babel+core@7.22.10 - '@babel/plugin-transform-flow-strip-types': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-react-display-name': 7.22.5_@babel+core@7.22.10 - '@babel/plugin-transform-runtime': 7.22.10_@babel+core@7.22.10 - '@babel/preset-env': 7.22.10_@babel+core@7.22.10 - '@babel/preset-react': 7.22.5_@babel+core@7.22.10 - '@babel/preset-typescript': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.10) + '@babel/plugin-proposal-decorators': 7.22.10(@babel/core@7.22.10) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.22.10) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.22.10) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.22.10) + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.22.10) + '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.22.10) + '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-runtime': 7.22.10(@babel/core@7.22.10) + '@babel/preset-env': 7.22.10(@babel/core@7.22.10) + '@babel/preset-react': 7.22.5(@babel/core@7.22.10) + '@babel/preset-typescript': 7.22.5(@babel/core@7.22.10) '@babel/runtime': 7.22.10 babel-plugin-macros: 3.1.0 babel-plugin-transform-react-remove-prop-types: 0.4.24 transitivePeerDependencies: - supports-color - /babylon/7.0.0-beta.47: + /babylon@7.0.0-beta.47: resolution: {integrity: sha512-+rq2cr4GDhtToEzKFD6KZZMDBXhjFAr9JjPw9pAppZACeEWqNM294j+NdBzkSHYXwzzBmVjZ3nEVJlOhbR2gOQ==} engines: {node: '>=6.0.0'} hasBin: true dev: true - /bail/2.0.2: + /bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} dev: false - /balanced-match/1.0.2: + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - /batch/0.6.1: + /batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} - /bfj/7.0.2: + /bfj@7.0.2: resolution: {integrity: sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==} engines: {node: '>= 8.0.0'} dependencies: @@ -3534,17 +3795,17 @@ packages: hoopy: 0.1.4 tryer: 1.0.1 - /big.js/5.2.2: + /big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - /binary-extensions/2.2.0: + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} - /bluebird/3.7.2: + /bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - /body-parser/1.20.1: + /body-parser@1.20.1: resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dependencies: @@ -3563,7 +3824,7 @@ packages: transitivePeerDependencies: - supports-color - /bonjour-service/1.1.1: + /bonjour-service@1.1.1: resolution: {integrity: sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==} dependencies: array-flatten: 2.1.2 @@ -3571,30 +3832,30 @@ packages: fast-deep-equal: 3.1.3 multicast-dns: 7.2.5 - /boolbase/1.0.0: + /boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - /brace-expansion/1.1.11: + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - /brace-expansion/2.0.1: + /brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 - /braces/3.0.2: + /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} dependencies: fill-range: 7.0.1 - /browser-process-hrtime/1.0.0: + /browser-process-hrtime@1.0.0: resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} - /browserslist/4.21.10: + /browserslist@4.21.10: resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -3602,21 +3863,21 @@ packages: caniuse-lite: 1.0.30001519 electron-to-chromium: 1.4.490 node-releases: 2.0.13 - update-browserslist-db: 1.0.11_browserslist@4.21.10 + update-browserslist-db: 1.0.11(browserslist@4.21.10) - /bser/2.1.1: + /bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} dependencies: node-int64: 0.4.0 - /buffer-from/1.1.2: + /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - /builtin-modules/3.3.0: + /builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} - /buttplug/3.1.1: + /buttplug@3.1.1: resolution: {integrity: sha512-IRFlLKiESVMxgTnteONjGfDF3DleMzycSBWnmkwQFzqmOlrdvXJ8VSZ96gzC3e6XEsX7lXbcQGrRNcQezha2UA==} dependencies: class-transformer: 0.5.1 @@ -3628,43 +3889,43 @@ packages: - utf-8-validate dev: false - /bytes/3.0.0: + /bytes@3.0.0: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} engines: {node: '>= 0.8'} - /bytes/3.1.2: + /bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} - /call-bind/1.0.2: + /call-bind@1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: function-bind: 1.1.1 get-intrinsic: 1.2.1 - /callsites/3.1.0: + /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - /camel-case/4.1.2: + /camel-case@4.1.2: resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} dependencies: pascal-case: 3.1.2 tslib: 2.6.1 - /camelcase-css/2.0.1: + /camelcase-css@2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} - /camelcase/5.3.1: + /camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} - /camelcase/6.3.0: + /camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - /caniuse-api/3.0.0: + /caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: browserslist: 4.21.10 @@ -3672,14 +3933,14 @@ packages: lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - /caniuse-lite/1.0.30001519: + /caniuse-lite@1.0.30001519: resolution: {integrity: sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==} - /case-sensitive-paths-webpack-plugin/2.4.0: + /case-sensitive-paths-webpack-plugin@2.4.0: resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} engines: {node: '>=4'} - /chalk/2.4.2: + /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} dependencies: @@ -3687,7 +3948,7 @@ packages: escape-string-regexp: 1.0.5 supports-color: 5.5.0 - /chalk/3.0.0: + /chalk@3.0.0: resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} engines: {node: '>=8'} dependencies: @@ -3695,29 +3956,29 @@ packages: supports-color: 7.2.0 dev: false - /chalk/4.1.2: + /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - /char-regex/1.0.2: + /char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} - /char-regex/2.0.1: + /char-regex@2.0.1: resolution: {integrity: sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==} engines: {node: '>=12.20'} - /character-entities/2.0.2: + /character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} dev: false - /check-types/11.2.2: + /check-types@11.2.2: resolution: {integrity: sha512-HBiYvXvn9Z70Z88XKjz3AEKd4HJhBXsa3j7xFnITAzoS8+q6eIGi8qDB8FKPBAjtuxjI/zFpwuiCb8oDtKOYrA==} - /chokidar/3.5.3: + /chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} dependencies: @@ -3731,43 +3992,43 @@ packages: optionalDependencies: fsevents: 2.3.2 - /chrome-trace-event/1.0.3: + /chrome-trace-event@1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} - /ci-info/3.8.0: + /ci-info@3.8.0: resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} engines: {node: '>=8'} - /cjs-module-lexer/1.2.3: + /cjs-module-lexer@1.2.3: resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} - /class-transformer/0.5.1: + /class-transformer@0.5.1: resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} dev: false - /classcat/5.0.4: + /classcat@5.0.4: resolution: {integrity: sha512-sbpkOw6z413p+HDGcBENe498WM9woqWHiJxCq7nvmxe9WmrUmqfAcxpIwAiMtM5Q3AhYkzXcNQHqsWq0mND51g==} dev: false - /clean-css/5.3.2: + /clean-css@5.3.2: resolution: {integrity: sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==} engines: {node: '>= 10.0'} dependencies: source-map: 0.6.1 - /client-only/0.0.1: + /client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} dev: false - /cliui/7.0.4: + /cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - /clone-deep/4.0.1: + /clone-deep@4.0.1: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} engines: {node: '>=6'} dependencies: @@ -3776,16 +4037,16 @@ packages: shallow-clone: 3.0.1 dev: true - /clsx/1.2.1: + /clsx@1.2.1: resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} engines: {node: '>=6'} dev: false - /co/4.6.0: + /co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - /coa/2.0.2: + /coa@2.0.2: resolution: {integrity: sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==} engines: {node: '>= 4.0'} dependencies: @@ -3793,74 +4054,74 @@ packages: chalk: 2.4.2 q: 1.5.1 - /collect-v8-coverage/1.0.2: + /collect-v8-coverage@1.0.2: resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} - /color-convert/1.9.3: + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 - /color-convert/2.0.1: + /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 - /color-name/1.1.3: + /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - /color-name/1.1.4: + /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - /colord/2.9.3: + /colord@2.9.3: resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} - /colorette/2.0.20: + /colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - /combined-stream/1.0.8: + /combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 - /comma-separated-tokens/2.0.3: + /comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} dev: false - /commander/2.20.3: + /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - /commander/4.1.1: + /commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} - /commander/7.2.0: + /commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} - /commander/8.3.0: + /commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} - /common-path-prefix/3.0.0: + /common-path-prefix@3.0.0: resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} - /common-tags/1.8.2: + /common-tags@1.8.2: resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} engines: {node: '>=4.0.0'} - /commondir/1.0.1: + /commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - /compressible/2.0.18: + /compressible@2.0.18: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 - /compression/1.7.4: + /compression@1.7.4: resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} engines: {node: '>= 0.8.0'} dependencies: @@ -3874,69 +4135,70 @@ packages: transitivePeerDependencies: - supports-color - /concat-map/0.0.1: + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - /confusing-browser-globals/1.0.11: + /confusing-browser-globals@1.0.11: resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} - /connect-history-api-fallback/2.0.0: + /connect-history-api-fallback@2.0.0: resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} engines: {node: '>=0.8'} - /content-disposition/0.5.4: + /content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} dependencies: safe-buffer: 5.2.1 - /content-type/1.0.5: + /content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} - /convert-source-map/1.9.0: + /convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - /cookie-signature/1.0.6: + /cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - /cookie/0.5.0: + /cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} - /core-js-compat/3.32.0: + /core-js-compat@3.32.0: resolution: {integrity: sha512-7a9a3D1k4UCVKnLhrgALyFcP7YCsLOQIxPd0dKjf/6GuPcgyiGP70ewWdCGrSK7evyhymi0qO4EqCmSJofDeYw==} dependencies: browserslist: 4.21.10 - /core-js-pure/3.32.0: + /core-js-pure@3.32.0: resolution: {integrity: sha512-qsev1H+dTNYpDUEURRuOXMvpdtAnNEvQWS/FMJ2Vb5AY8ZP4rAPQldkE27joykZPJTe0+IVgHZYh1P5Xu1/i1g==} requiresBuild: true - /core-js/3.32.0: + /core-js@3.32.0: resolution: {integrity: sha512-rd4rYZNlF3WuoYuRIDEmbR/ga9CeuWX9U05umAvgrrZoHY4Z++cp/xwPQMvUpBB4Ag6J8KfD80G0zwCyaSxDww==} requiresBuild: true - /core-util-is/1.0.3: + /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - /cosmiconfig-typescript-loader/1.0.9_osiawaesgot4tuqtrzm2bzteda: + /cosmiconfig-typescript-loader@1.0.9(@types/node@16.18.40)(cosmiconfig@7.1.0)(typescript@4.9.5): resolution: {integrity: sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@types/node': '*' + cosmiconfig: '>=7' typescript: '>=3' dependencies: '@types/node': 16.18.40 cosmiconfig: 7.1.0 - ts-node: 10.9.1_osiawaesgot4tuqtrzm2bzteda + ts-node: 10.9.1(@types/node@16.18.40)(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' dev: true - /cosmiconfig/6.0.0: + /cosmiconfig@6.0.0: resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} engines: {node: '>=8'} dependencies: @@ -3946,7 +4208,7 @@ packages: path-type: 4.0.0 yaml: 1.10.2 - /cosmiconfig/7.1.0: + /cosmiconfig@7.1.0: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} dependencies: @@ -3956,11 +4218,11 @@ packages: path-type: 4.0.0 yaml: 1.10.2 - /create-require/1.1.1: + /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true - /cross-spawn/7.0.3: + /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} dependencies: @@ -3968,11 +4230,11 @@ packages: shebang-command: 2.0.0 which: 2.0.2 - /crypto-random-string/2.0.0: + /crypto-random-string@2.0.0: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} engines: {node: '>=8'} - /css-blank-pseudo/3.0.3_postcss@8.4.27: + /css-blank-pseudo@3.0.3(postcss@8.4.27): resolution: {integrity: sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==} engines: {node: ^12 || ^14 || >=16} hasBin: true @@ -3982,7 +4244,7 @@ packages: postcss: 8.4.27 postcss-selector-parser: 6.0.13 - /css-declaration-sorter/6.4.1_postcss@8.4.27: + /css-declaration-sorter@6.4.1(postcss@8.4.27): resolution: {integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==} engines: {node: ^10 || ^12 || >=14} peerDependencies: @@ -3990,7 +4252,7 @@ packages: dependencies: postcss: 8.4.27 - /css-has-pseudo/3.0.4_postcss@8.4.27: + /css-has-pseudo@3.0.4(postcss@8.4.27): resolution: {integrity: sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==} engines: {node: ^12 || ^14 || >=16} hasBin: true @@ -4000,23 +4262,23 @@ packages: postcss: 8.4.27 postcss-selector-parser: 6.0.13 - /css-loader/6.8.1_webpack@5.88.2: + /css-loader@6.8.1(webpack@5.88.2): resolution: {integrity: sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 dependencies: - icss-utils: 5.1.0_postcss@8.4.27 + icss-utils: 5.1.0(postcss@8.4.27) postcss: 8.4.27 - postcss-modules-extract-imports: 3.0.0_postcss@8.4.27 - postcss-modules-local-by-default: 4.0.3_postcss@8.4.27 - postcss-modules-scope: 3.0.0_postcss@8.4.27 - postcss-modules-values: 4.0.0_postcss@8.4.27 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.27) + postcss-modules-local-by-default: 4.0.3(postcss@8.4.27) + postcss-modules-scope: 3.0.0(postcss@8.4.27) + postcss-modules-values: 4.0.0(postcss@8.4.27) postcss-value-parser: 4.2.0 semver: 7.5.4 webpack: 5.88.2 - /css-minimizer-webpack-plugin/3.4.1_webpack@5.88.2: + /css-minimizer-webpack-plugin@3.4.1(webpack@5.88.2): resolution: {integrity: sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -4035,7 +4297,7 @@ packages: esbuild: optional: true dependencies: - cssnano: 5.1.15_postcss@8.4.27 + cssnano: 5.1.15(postcss@8.4.27) jest-worker: 27.5.1 postcss: 8.4.27 schema-utils: 4.2.0 @@ -4043,7 +4305,7 @@ packages: source-map: 0.6.1 webpack: 5.88.2 - /css-prefers-color-scheme/6.0.3_postcss@8.4.27: + /css-prefers-color-scheme@6.0.3(postcss@8.4.27): resolution: {integrity: sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==} engines: {node: ^12 || ^14 || >=16} hasBin: true @@ -4052,10 +4314,10 @@ packages: dependencies: postcss: 8.4.27 - /css-select-base-adapter/0.1.1: + /css-select-base-adapter@0.1.1: resolution: {integrity: sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==} - /css-select/2.1.0: + /css-select@2.1.0: resolution: {integrity: sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==} dependencies: boolbase: 1.0.0 @@ -4063,7 +4325,7 @@ packages: domutils: 1.7.0 nth-check: 1.0.2 - /css-select/4.3.0: + /css-select@4.3.0: resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} dependencies: boolbase: 1.0.0 @@ -4072,78 +4334,78 @@ packages: domutils: 2.8.0 nth-check: 2.1.1 - /css-tree/1.0.0-alpha.37: + /css-tree@1.0.0-alpha.37: resolution: {integrity: sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==} engines: {node: '>=8.0.0'} dependencies: mdn-data: 2.0.4 source-map: 0.6.1 - /css-tree/1.1.3: + /css-tree@1.1.3: resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} engines: {node: '>=8.0.0'} dependencies: mdn-data: 2.0.14 source-map: 0.6.1 - /css-what/3.4.2: + /css-what@3.4.2: resolution: {integrity: sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==} engines: {node: '>= 6'} - /css-what/6.1.0: + /css-what@6.1.0: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} engines: {node: '>= 6'} - /css.escape/1.5.1: + /css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} dev: false - /cssdb/7.7.0: + /cssdb@7.7.0: resolution: {integrity: sha512-1hN+I3r4VqSNQ+OmMXxYexnumbOONkSil0TWMebVXHtzYW4tRRPovUNHPHj2d4nrgOuYJ8Vs3XwvywsuwwXNNA==} - /cssesc/3.0.0: + /cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} hasBin: true - /cssnano-preset-default/5.2.14_postcss@8.4.27: + /cssnano-preset-default@5.2.14(postcss@8.4.27): resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - css-declaration-sorter: 6.4.1_postcss@8.4.27 - cssnano-utils: 3.1.0_postcss@8.4.27 + css-declaration-sorter: 6.4.1(postcss@8.4.27) + cssnano-utils: 3.1.0(postcss@8.4.27) postcss: 8.4.27 - postcss-calc: 8.2.4_postcss@8.4.27 - postcss-colormin: 5.3.1_postcss@8.4.27 - postcss-convert-values: 5.1.3_postcss@8.4.27 - postcss-discard-comments: 5.1.2_postcss@8.4.27 - postcss-discard-duplicates: 5.1.0_postcss@8.4.27 - postcss-discard-empty: 5.1.1_postcss@8.4.27 - postcss-discard-overridden: 5.1.0_postcss@8.4.27 - postcss-merge-longhand: 5.1.7_postcss@8.4.27 - postcss-merge-rules: 5.1.4_postcss@8.4.27 - postcss-minify-font-values: 5.1.0_postcss@8.4.27 - postcss-minify-gradients: 5.1.1_postcss@8.4.27 - postcss-minify-params: 5.1.4_postcss@8.4.27 - postcss-minify-selectors: 5.2.1_postcss@8.4.27 - postcss-normalize-charset: 5.1.0_postcss@8.4.27 - postcss-normalize-display-values: 5.1.0_postcss@8.4.27 - postcss-normalize-positions: 5.1.1_postcss@8.4.27 - postcss-normalize-repeat-style: 5.1.1_postcss@8.4.27 - postcss-normalize-string: 5.1.0_postcss@8.4.27 - postcss-normalize-timing-functions: 5.1.0_postcss@8.4.27 - postcss-normalize-unicode: 5.1.1_postcss@8.4.27 - postcss-normalize-url: 5.1.0_postcss@8.4.27 - postcss-normalize-whitespace: 5.1.1_postcss@8.4.27 - postcss-ordered-values: 5.1.3_postcss@8.4.27 - postcss-reduce-initial: 5.1.2_postcss@8.4.27 - postcss-reduce-transforms: 5.1.0_postcss@8.4.27 - postcss-svgo: 5.1.0_postcss@8.4.27 - postcss-unique-selectors: 5.1.1_postcss@8.4.27 - - /cssnano-utils/3.1.0_postcss@8.4.27: + postcss-calc: 8.2.4(postcss@8.4.27) + postcss-colormin: 5.3.1(postcss@8.4.27) + postcss-convert-values: 5.1.3(postcss@8.4.27) + postcss-discard-comments: 5.1.2(postcss@8.4.27) + postcss-discard-duplicates: 5.1.0(postcss@8.4.27) + postcss-discard-empty: 5.1.1(postcss@8.4.27) + postcss-discard-overridden: 5.1.0(postcss@8.4.27) + postcss-merge-longhand: 5.1.7(postcss@8.4.27) + postcss-merge-rules: 5.1.4(postcss@8.4.27) + postcss-minify-font-values: 5.1.0(postcss@8.4.27) + postcss-minify-gradients: 5.1.1(postcss@8.4.27) + postcss-minify-params: 5.1.4(postcss@8.4.27) + postcss-minify-selectors: 5.2.1(postcss@8.4.27) + postcss-normalize-charset: 5.1.0(postcss@8.4.27) + postcss-normalize-display-values: 5.1.0(postcss@8.4.27) + postcss-normalize-positions: 5.1.1(postcss@8.4.27) + postcss-normalize-repeat-style: 5.1.1(postcss@8.4.27) + postcss-normalize-string: 5.1.0(postcss@8.4.27) + postcss-normalize-timing-functions: 5.1.0(postcss@8.4.27) + postcss-normalize-unicode: 5.1.1(postcss@8.4.27) + postcss-normalize-url: 5.1.0(postcss@8.4.27) + postcss-normalize-whitespace: 5.1.1(postcss@8.4.27) + postcss-ordered-values: 5.1.3(postcss@8.4.27) + postcss-reduce-initial: 5.1.2(postcss@8.4.27) + postcss-reduce-transforms: 5.1.0(postcss@8.4.27) + postcss-svgo: 5.1.0(postcss@8.4.27) + postcss-unique-selectors: 5.1.1(postcss@8.4.27) + + /cssnano-utils@3.1.0(postcss@8.4.27): resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -4151,50 +4413,50 @@ packages: dependencies: postcss: 8.4.27 - /cssnano/5.1.15_postcss@8.4.27: + /cssnano@5.1.15(postcss@8.4.27): resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-preset-default: 5.2.14_postcss@8.4.27 + cssnano-preset-default: 5.2.14(postcss@8.4.27) lilconfig: 2.1.0 postcss: 8.4.27 yaml: 1.10.2 - /csso/4.2.0: + /csso@4.2.0: resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} engines: {node: '>=8.0.0'} dependencies: css-tree: 1.1.3 - /cssom/0.3.8: + /cssom@0.3.8: resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} - /cssom/0.4.4: + /cssom@0.4.4: resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} - /cssstyle/2.3.0: + /cssstyle@2.3.0: resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} engines: {node: '>=8'} dependencies: cssom: 0.3.8 - /csstype/3.1.2: + /csstype@3.1.2: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} dev: false - /d3-color/3.1.0: + /d3-color@3.1.0: resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} engines: {node: '>=12'} dev: false - /d3-dispatch/3.0.1: + /d3-dispatch@3.0.1: resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} engines: {node: '>=12'} dev: false - /d3-drag/3.0.0: + /d3-drag@3.0.0: resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} engines: {node: '>=12'} dependencies: @@ -4202,29 +4464,29 @@ packages: d3-selection: 3.0.0 dev: false - /d3-ease/3.0.1: + /d3-ease@3.0.1: resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} engines: {node: '>=12'} dev: false - /d3-interpolate/3.0.1: + /d3-interpolate@3.0.1: resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} engines: {node: '>=12'} dependencies: d3-color: 3.1.0 dev: false - /d3-selection/3.0.0: + /d3-selection@3.0.0: resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} engines: {node: '>=12'} dev: false - /d3-timer/3.0.1: + /d3-timer@3.0.1: resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} engines: {node: '>=12'} dev: false - /d3-transition/3.0.1_d3-selection@3.0.0: + /d3-transition@3.0.1(d3-selection@3.0.0): resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} engines: {node: '>=12'} peerDependencies: @@ -4238,7 +4500,7 @@ packages: d3-timer: 3.0.1 dev: false - /d3-zoom/3.0.0: + /d3-zoom@3.0.0: resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} engines: {node: '>=12'} dependencies: @@ -4246,13 +4508,13 @@ packages: d3-drag: 3.0.0 d3-interpolate: 3.0.1 d3-selection: 3.0.0 - d3-transition: 3.0.1_d3-selection@3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) dev: false - /damerau-levenshtein/1.0.8: + /damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - /data-urls/2.0.0: + /data-urls@2.0.0: resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} engines: {node: '>=10'} dependencies: @@ -4260,7 +4522,7 @@ packages: whatwg-mimetype: 2.3.0 whatwg-url: 8.7.0 - /debug/2.6.9: + /debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: supports-color: '*' @@ -4270,7 +4532,7 @@ packages: dependencies: ms: 2.0.0 - /debug/3.2.7: + /debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: supports-color: '*' @@ -4280,7 +4542,7 @@ packages: dependencies: ms: 2.1.3 - /debug/4.3.4: + /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: @@ -4291,19 +4553,19 @@ packages: dependencies: ms: 2.1.2 - /decimal.js/10.4.3: + /decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - /decode-named-character-reference/1.0.2: + /decode-named-character-reference@1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} dependencies: character-entities: 2.0.2 dev: false - /dedent/0.7.0: + /dedent@0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - /deep-equal/2.2.2: + /deep-equal@2.2.2: resolution: {integrity: sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==} dependencies: array-buffer-byte-length: 1.0.0 @@ -4326,58 +4588,58 @@ packages: which-typed-array: 1.1.11 dev: false - /deep-is/0.1.4: + /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - /deepmerge/4.3.1: + /deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} - /default-gateway/6.0.3: + /default-gateway@6.0.3: resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} engines: {node: '>= 10'} dependencies: execa: 5.1.1 - /define-lazy-prop/2.0.0: + /define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} - /define-properties/1.2.0: + /define-properties@1.2.0: resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} engines: {node: '>= 0.4'} dependencies: has-property-descriptors: 1.0.0 object-keys: 1.1.1 - /delayed-stream/1.0.0: + /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - /depd/1.1.2: + /depd@1.1.2: resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} engines: {node: '>= 0.6'} - /depd/2.0.0: + /depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} - /dequal/2.0.3: + /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - /destroy/1.2.0: + /destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - /detect-newline/3.1.0: + /detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} - /detect-node/2.1.0: + /detect-node@2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} - /detect-port-alt/1.1.6: + /detect-port-alt@1.1.6: resolution: {integrity: sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==} engines: {node: '>= 4.2.1'} hasBin: true @@ -4387,33 +4649,33 @@ packages: transitivePeerDependencies: - supports-color - /didyoumean/1.2.2: + /didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - /diff-sequences/27.5.1: + /diff-sequences@27.5.1: resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - /diff/4.0.2: + /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} dev: true - /diff/5.1.0: + /diff@5.1.0: resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} engines: {node: '>=0.3.1'} dev: false - /dir-glob/3.0.1: + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} dependencies: path-type: 4.0.0 - /dlv/1.1.3: + /dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - /dnd-core/16.0.1: + /dnd-core@16.0.1: resolution: {integrity: sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng==} dependencies: '@react-dnd/asap': 5.0.2 @@ -4421,156 +4683,156 @@ packages: redux: 4.2.1 dev: false - /dns-equal/1.0.0: + /dns-equal@1.0.0: resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} - /dns-packet/5.6.0: + /dns-packet@5.6.0: resolution: {integrity: sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==} engines: {node: '>=6'} dependencies: '@leichtgewicht/ip-codec': 2.0.4 - /doctrine/2.1.0: + /doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} dependencies: esutils: 2.0.3 - /doctrine/3.0.0: + /doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 - /dom-accessibility-api/0.5.16: + /dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} dev: false - /dom-converter/0.2.0: + /dom-converter@0.2.0: resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} dependencies: utila: 0.4.0 - /dom-serializer/0.2.2: + /dom-serializer@0.2.2: resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} dependencies: domelementtype: 2.3.0 entities: 2.2.0 - /dom-serializer/1.4.1: + /dom-serializer@1.4.1: resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} dependencies: domelementtype: 2.3.0 domhandler: 4.3.1 entities: 2.2.0 - /domelementtype/1.3.1: + /domelementtype@1.3.1: resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} - /domelementtype/2.3.0: + /domelementtype@2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - /domexception/2.0.1: + /domexception@2.0.1: resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} engines: {node: '>=8'} dependencies: webidl-conversions: 5.0.0 - /domhandler/4.3.1: + /domhandler@4.3.1: resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} engines: {node: '>= 4'} dependencies: domelementtype: 2.3.0 - /domutils/1.7.0: + /domutils@1.7.0: resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} dependencies: dom-serializer: 0.2.2 domelementtype: 1.3.1 - /domutils/2.8.0: + /domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} dependencies: dom-serializer: 1.4.1 domelementtype: 2.3.0 domhandler: 4.3.1 - /dot-case/3.0.4: + /dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} dependencies: no-case: 3.0.4 tslib: 2.6.1 - /dotenv-expand/5.1.0: + /dotenv-expand@5.1.0: resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} - /dotenv/10.0.0: + /dotenv@10.0.0: resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} engines: {node: '>=10'} - /duplexer/0.1.2: + /duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - /ee-first/1.1.1: + /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - /ejs/3.1.9: + /ejs@3.1.9: resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} engines: {node: '>=0.10.0'} hasBin: true dependencies: jake: 10.8.7 - /electron-to-chromium/1.4.490: + /electron-to-chromium@1.4.490: resolution: {integrity: sha512-6s7NVJz+sATdYnIwhdshx/N/9O6rvMxmhVoDSDFdj6iA45gHR8EQje70+RYsF4GeB+k0IeNSBnP7yG9ZXJFr7A==} - /email-addresses/3.1.0: + /email-addresses@3.1.0: resolution: {integrity: sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg==} dev: true - /emittery/0.10.2: + /emittery@0.10.2: resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} engines: {node: '>=12'} - /emittery/0.8.1: + /emittery@0.8.1: resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} engines: {node: '>=10'} - /emoji-regex/8.0.0: + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - /emoji-regex/9.2.2: + /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - /emojis-list/3.0.0: + /emojis-list@3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} - /encodeurl/1.0.2: + /encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} - /enhanced-resolve/5.15.0: + /enhanced-resolve@5.15.0: resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} engines: {node: '>=10.13.0'} dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 - /entities/2.2.0: + /entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - /error-ex/1.3.2: + /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 - /error-stack-parser/2.1.4: + /error-stack-parser@2.1.4: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} dependencies: stackframe: 1.3.4 - /es-abstract/1.22.1: + /es-abstract@1.22.1: resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==} engines: {node: '>= 0.4'} dependencies: @@ -4614,10 +4876,10 @@ packages: unbox-primitive: 1.0.2 which-typed-array: 1.1.11 - /es-array-method-boxes-properly/1.0.0: + /es-array-method-boxes-properly@1.0.0: resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} - /es-get-iterator/1.1.3: + /es-get-iterator@1.1.3: resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} dependencies: call-bind: 1.0.2 @@ -4631,10 +4893,10 @@ packages: stop-iteration-iterator: 1.0.0 dev: false - /es-module-lexer/1.3.0: + /es-module-lexer@1.3.0: resolution: {integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==} - /es-set-tostringtag/2.0.1: + /es-set-tostringtag@2.0.1: resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} engines: {node: '>= 0.4'} dependencies: @@ -4642,12 +4904,12 @@ packages: has: 1.0.3 has-tostringtag: 1.0.0 - /es-shim-unscopables/1.0.0: + /es-shim-unscopables@1.0.0: resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} dependencies: has: 1.0.3 - /es-to-primitive/1.2.1: + /es-to-primitive@1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} dependencies: @@ -4655,26 +4917,56 @@ packages: is-date-object: 1.0.5 is-symbol: 1.0.4 - /escalade/3.1.1: + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: true + + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - /escape-html/1.0.3: + /escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - /escape-string-regexp/1.0.5: + /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - /escape-string-regexp/2.0.0: + /escape-string-regexp@2.0.0: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} - /escape-string-regexp/4.0.0: + /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - /escodegen/2.1.0: + /escodegen@2.1.0: resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} engines: {node: '>=6.0'} hasBin: true @@ -4685,7 +4977,7 @@ packages: optionalDependencies: source-map: 0.6.1 - /eslint-config-react-app/7.0.1_hewhl32arvhpzpkgjcsdnjm62y: + /eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.5)(eslint@8.47.0)(jest@27.5.1)(typescript@4.9.5): resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -4696,20 +4988,20 @@ packages: optional: true dependencies: '@babel/core': 7.22.10 - '@babel/eslint-parser': 7.22.10_zyanktnjxrtfnufugapahvd75q + '@babel/eslint-parser': 7.22.10(@babel/core@7.22.10)(eslint@8.47.0) '@rushstack/eslint-patch': 1.3.3 - '@typescript-eslint/eslint-plugin': 5.62.0_b4dpngykx2cv4esjowwmn5pt3a - '@typescript-eslint/parser': 5.62.0_2voyjndugpfz33zwqvnblpgcve + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.47.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.62.0(eslint@8.47.0)(typescript@4.9.5) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 eslint: 8.47.0 - eslint-plugin-flowtype: 8.0.3_eslint@8.47.0 - eslint-plugin-import: 2.28.0_d2ajlqlsbxlpxgtbsghthbjqlq - eslint-plugin-jest: 25.7.0_47pcserzpcerwqzibc3ujuvssa - eslint-plugin-jsx-a11y: 6.7.1_eslint@8.47.0 - eslint-plugin-react: 7.33.1_eslint@8.47.0 - eslint-plugin-react-hooks: 4.6.0_eslint@8.47.0 - eslint-plugin-testing-library: 5.11.1_2voyjndugpfz33zwqvnblpgcve + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.5)(eslint@8.47.0) + eslint-plugin-import: 2.28.0(@typescript-eslint/parser@5.62.0)(eslint@8.47.0) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.47.0)(jest@27.5.1)(typescript@4.9.5) + eslint-plugin-jsx-a11y: 6.7.1(eslint@8.47.0) + eslint-plugin-react: 7.33.1(eslint@8.47.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.47.0) + eslint-plugin-testing-library: 5.11.1(eslint@8.47.0)(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - '@babel/plugin-syntax-flow' @@ -4719,7 +5011,7 @@ packages: - jest - supports-color - /eslint-import-resolver-node/0.3.9: + /eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} dependencies: debug: 3.2.7 @@ -4728,7 +5020,7 @@ packages: transitivePeerDependencies: - supports-color - /eslint-module-utils/2.8.0_2yc2ge3cubbryl5klvrqpgyyii: + /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.47.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -4749,14 +5041,14 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.62.0_2voyjndugpfz33zwqvnblpgcve + '@typescript-eslint/parser': 5.62.0(eslint@8.47.0)(typescript@4.9.5) debug: 3.2.7 eslint: 8.47.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - /eslint-plugin-flowtype/8.0.3_eslint@8.47.0: + /eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.5)(eslint@8.47.0): resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -4764,11 +5056,13 @@ packages: '@babel/plugin-transform-react-jsx': ^7.14.9 eslint: ^8.1.0 dependencies: + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.10) eslint: 8.47.0 lodash: 4.17.21 string-natural-compare: 3.0.1 - /eslint-plugin-import/2.28.0_d2ajlqlsbxlpxgtbsghthbjqlq: + /eslint-plugin-import@2.28.0(@typescript-eslint/parser@5.62.0)(eslint@8.47.0): resolution: {integrity: sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==} engines: {node: '>=4'} peerDependencies: @@ -4778,7 +5072,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.62.0_2voyjndugpfz33zwqvnblpgcve + '@typescript-eslint/parser': 5.62.0(eslint@8.47.0)(typescript@4.9.5) array-includes: 3.1.6 array.prototype.findlastindex: 1.2.2 array.prototype.flat: 1.3.1 @@ -4787,7 +5081,7 @@ packages: doctrine: 2.1.0 eslint: 8.47.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0_2yc2ge3cubbryl5klvrqpgyyii + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.47.0) has: 1.0.3 is-core-module: 2.13.0 is-glob: 4.0.3 @@ -4803,7 +5097,7 @@ packages: - eslint-import-resolver-webpack - supports-color - /eslint-plugin-jest/25.7.0_47pcserzpcerwqzibc3ujuvssa: + /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.47.0)(jest@27.5.1)(typescript@4.9.5): resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} peerDependencies: @@ -4816,15 +5110,15 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0_b4dpngykx2cv4esjowwmn5pt3a - '@typescript-eslint/experimental-utils': 5.62.0_2voyjndugpfz33zwqvnblpgcve + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.47.0)(typescript@4.9.5) + '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.47.0)(typescript@4.9.5) eslint: 8.47.0 jest: 27.5.1 transitivePeerDependencies: - supports-color - typescript - /eslint-plugin-jsx-a11y/6.7.1_eslint@8.47.0: + /eslint-plugin-jsx-a11y@6.7.1(eslint@8.47.0): resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} engines: {node: '>=4.0'} peerDependencies: @@ -4848,7 +5142,7 @@ packages: object.fromentries: 2.0.6 semver: 6.3.1 - /eslint-plugin-react-hooks/4.6.0_eslint@8.47.0: + /eslint-plugin-react-hooks@4.6.0(eslint@8.47.0): resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} peerDependencies: @@ -4856,7 +5150,7 @@ packages: dependencies: eslint: 8.47.0 - /eslint-plugin-react/7.33.1_eslint@8.47.0: + /eslint-plugin-react@7.33.1(eslint@8.47.0): resolution: {integrity: sha512-L093k0WAMvr6VhNwReB8VgOq5s2LesZmrpPdKz/kZElQDzqS7G7+DnKoqT+w4JwuiGeAhAvHO0fvy0Eyk4ejDA==} engines: {node: '>=4'} peerDependencies: @@ -4879,41 +5173,41 @@ packages: semver: 6.3.1 string.prototype.matchall: 4.0.8 - /eslint-plugin-testing-library/5.11.1_2voyjndugpfz33zwqvnblpgcve: + /eslint-plugin-testing-library@5.11.1(eslint@8.47.0)(typescript@4.9.5): resolution: {integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} peerDependencies: eslint: ^7.5.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.62.0_2voyjndugpfz33zwqvnblpgcve + '@typescript-eslint/utils': 5.62.0(eslint@8.47.0)(typescript@4.9.5) eslint: 8.47.0 transitivePeerDependencies: - supports-color - typescript - /eslint-scope/5.1.1: + /eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 - /eslint-scope/7.2.2: + /eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - /eslint-visitor-keys/2.1.0: + /eslint-visitor-keys@2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} - /eslint-visitor-keys/3.4.3: + /eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /eslint-webpack-plugin/3.2.0_3zsjo4afjru4a27oz7f2yugqoa: + /eslint-webpack-plugin@3.2.0(eslint@8.47.0)(webpack@5.88.2): resolution: {integrity: sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -4928,12 +5222,12 @@ packages: schema-utils: 4.2.0 webpack: 5.88.2 - /eslint/8.47.0: + /eslint@8.47.0: resolution: {integrity: sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0_eslint@8.47.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) '@eslint-community/regexpp': 4.6.2 '@eslint/eslintrc': 2.1.2 '@eslint/js': 8.47.0 @@ -4973,62 +5267,62 @@ packages: transitivePeerDependencies: - supports-color - /espree/9.6.1: + /espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: acorn: 8.10.0 - acorn-jsx: 5.3.2_acorn@8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) eslint-visitor-keys: 3.4.3 - /esprima/4.0.1: + /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - /esquery/1.5.0: + /esquery@1.5.0: resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 - /esrecurse/4.3.0: + /esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} dependencies: estraverse: 5.3.0 - /estraverse/4.3.0: + /estraverse@4.3.0: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} engines: {node: '>=4.0'} - /estraverse/5.3.0: + /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} - /estree-walker/1.0.1: + /estree-walker@1.0.1: resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} - /esutils/2.0.3: + /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - /etag/1.8.1: + /etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} - /eventemitter3/4.0.7: + /eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - /eventemitter3/5.0.1: + /eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} dev: false - /events/3.3.0: + /events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - /execa/5.1.1: + /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} dependencies: @@ -5042,11 +5336,11 @@ packages: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - /exit/0.1.2: + /exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} - /expect/27.5.1: + /expect@27.5.1: resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -5055,7 +5349,7 @@ packages: jest-matcher-utils: 27.5.1 jest-message-util: 27.5.1 - /express/4.18.2: + /express@4.18.2: resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} engines: {node: '>= 0.10.0'} dependencies: @@ -5093,14 +5387,14 @@ packages: transitivePeerDependencies: - supports-color - /extend/3.0.2: + /extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} dev: false - /fast-deep-equal/3.1.3: + /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - /fast-glob/3.3.1: + /fast-glob@3.3.1: resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} engines: {node: '>=8.6.0'} dependencies: @@ -5110,35 +5404,35 @@ packages: merge2: 1.4.1 micromatch: 4.0.5 - /fast-json-stable-stringify/2.1.0: + /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - /fast-levenshtein/2.0.6: + /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - /fastq/1.15.0: + /fastq@1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: reusify: 1.0.4 - /faye-websocket/0.11.4: + /faye-websocket@0.11.4: resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} engines: {node: '>=0.8.0'} dependencies: websocket-driver: 0.7.4 - /fb-watchman/2.0.2: + /fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} dependencies: bser: 2.1.1 - /file-entry-cache/6.0.1: + /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.0.4 - /file-loader/6.2.0_webpack@5.88.2: + /file-loader@6.2.0(webpack@5.88.2): resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -5148,21 +5442,21 @@ packages: schema-utils: 3.3.0 webpack: 5.88.2 - /file-saver/2.0.5: + /file-saver@2.0.5: resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==} dev: false - /filelist/1.0.4: + /filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} dependencies: minimatch: 5.1.6 - /filename-reserved-regex/2.0.0: + /filename-reserved-regex@2.0.0: resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==} engines: {node: '>=4'} dev: true - /filenamify/4.3.0: + /filenamify@4.3.0: resolution: {integrity: sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==} engines: {node: '>=8'} dependencies: @@ -5171,17 +5465,17 @@ packages: trim-repeated: 1.0.0 dev: true - /filesize/8.0.7: + /filesize@8.0.7: resolution: {integrity: sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==} engines: {node: '>= 0.4.0'} - /fill-range/7.0.1: + /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 - /finalhandler/1.2.0: + /finalhandler@1.2.0: resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} engines: {node: '>= 0.8'} dependencies: @@ -5195,7 +5489,7 @@ packages: transitivePeerDependencies: - supports-color - /find-cache-dir/3.3.2: + /find-cache-dir@3.3.2: resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} engines: {node: '>=8'} dependencies: @@ -5203,37 +5497,37 @@ packages: make-dir: 3.1.0 pkg-dir: 4.2.0 - /find-up/3.0.0: + /find-up@3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} engines: {node: '>=6'} dependencies: locate-path: 3.0.0 - /find-up/4.1.0: + /find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - /find-up/5.0.0: + /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - /flat-cache/3.0.4: + /flat-cache@3.0.4: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: flatted: 3.2.7 rimraf: 3.0.2 - /flatted/3.2.7: + /flatted@3.2.7: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} - /follow-redirects/1.15.2: + /follow-redirects@1.15.2: resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} peerDependencies: @@ -5242,12 +5536,12 @@ packages: debug: optional: true - /for-each/0.3.3: + /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.7 - /fork-ts-checker-webpack-plugin/6.5.3_l5uwip6bj2qr7x44tnq7g5rwia: + /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.47.0)(typescript@4.9.5)(webpack@5.88.2): resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} engines: {node: '>=10', yarn: '>=1.0.0'} peerDependencies: @@ -5278,7 +5572,7 @@ packages: typescript: 4.9.5 webpack: 5.88.2 - /form-data/3.0.1: + /form-data@3.0.1: resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} engines: {node: '>= 6'} dependencies: @@ -5286,18 +5580,18 @@ packages: combined-stream: 1.0.8 mime-types: 2.1.35 - /forwarded/0.2.0: + /forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} - /fraction.js/4.2.0: + /fraction.js@4.2.0: resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} - /fresh/0.5.2: + /fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} - /fs-extra/10.1.0: + /fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} dependencies: @@ -5305,7 +5599,7 @@ packages: jsonfile: 6.1.0 universalify: 2.0.0 - /fs-extra/8.1.0: + /fs-extra@8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} dependencies: @@ -5314,7 +5608,7 @@ packages: universalify: 0.1.2 dev: true - /fs-extra/9.1.0: + /fs-extra@9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} dependencies: @@ -5323,23 +5617,23 @@ packages: jsonfile: 6.1.0 universalify: 2.0.0 - /fs-monkey/1.0.4: + /fs-monkey@1.0.4: resolution: {integrity: sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==} - /fs.realpath/1.0.0: + /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - /fsevents/2.3.2: + /fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true optional: true - /function-bind/1.1.1: + /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - /function.prototype.name/1.1.5: + /function.prototype.name@1.1.5: resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} engines: {node: '>= 0.4'} dependencies: @@ -5348,18 +5642,18 @@ packages: es-abstract: 1.22.1 functions-have-names: 1.2.3 - /functions-have-names/1.2.3: + /functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - /gensync/1.0.0-beta.2: + /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - /get-caller-file/2.0.5: + /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - /get-intrinsic/1.2.1: + /get-intrinsic@1.2.1: resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} dependencies: function-bind: 1.1.1 @@ -5367,25 +5661,25 @@ packages: has-proto: 1.0.1 has-symbols: 1.0.3 - /get-own-enumerable-property-symbols/3.0.2: + /get-own-enumerable-property-symbols@3.0.2: resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} - /get-package-type/0.1.0: + /get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} - /get-stream/6.0.1: + /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - /get-symbol-description/1.0.0: + /get-symbol-description@1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 - /gh-pages/4.0.0: + /gh-pages@4.0.0: resolution: {integrity: sha512-p8S0T3aGJc68MtwOcZusul5qPSNZCalap3NWbhRUZYu1YOdp+EjZ+4kPmRM8h3NNRdqw00yuevRjlkuSzCn7iQ==} engines: {node: '>=10'} hasBin: true @@ -5399,22 +5693,22 @@ packages: globby: 6.1.0 dev: true - /glob-parent/5.1.2: + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 - /glob-parent/6.0.2: + /glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} dependencies: is-glob: 4.0.3 - /glob-to-regexp/0.4.1: + /glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - /glob/7.1.6: + /glob@7.1.6: resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} dependencies: fs.realpath: 1.0.0 @@ -5424,7 +5718,7 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 - /glob/7.2.3: + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: fs.realpath: 1.0.0 @@ -5434,13 +5728,13 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 - /global-modules/2.0.0: + /global-modules@2.0.0: resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} engines: {node: '>=6'} dependencies: global-prefix: 3.0.0 - /global-prefix/3.0.0: + /global-prefix@3.0.0: resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} engines: {node: '>=6'} dependencies: @@ -5448,23 +5742,23 @@ packages: kind-of: 6.0.3 which: 1.3.1 - /globals/11.12.0: + /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - /globals/13.21.0: + /globals@13.21.0: resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 - /globalthis/1.0.3: + /globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} dependencies: define-properties: 1.2.0 - /globby/11.1.0: + /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} dependencies: @@ -5475,7 +5769,7 @@ packages: merge2: 1.4.1 slash: 3.0.0 - /globby/6.1.0: + /globby@6.1.0: resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} engines: {node: '>=0.10.0'} dependencies: @@ -5486,84 +5780,84 @@ packages: pinkie-promise: 2.0.1 dev: true - /gopd/1.0.1: + /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: get-intrinsic: 1.2.1 - /graceful-fs/4.2.11: + /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - /graphemer/1.4.0: + /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - /gzip-size/6.0.0: + /gzip-size@6.0.0: resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} engines: {node: '>=10'} dependencies: duplexer: 0.1.2 - /handle-thing/2.0.1: + /handle-thing@2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} - /harmony-reflect/1.6.2: + /harmony-reflect@1.6.2: resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==} - /has-bigints/1.0.2: + /has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - /has-flag/3.0.0: + /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} - /has-flag/4.0.0: + /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - /has-property-descriptors/1.0.0: + /has-property-descriptors@1.0.0: resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} dependencies: get-intrinsic: 1.2.1 - /has-proto/1.0.1: + /has-proto@1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} engines: {node: '>= 0.4'} - /has-symbols/1.0.3: + /has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} - /has-tostringtag/1.0.0: + /has-tostringtag@1.0.0: resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 - /has/1.0.3: + /has@1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 - /hast-util-whitespace/2.0.1: + /hast-util-whitespace@2.0.1: resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} dev: false - /he/1.2.0: + /he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - /hoist-non-react-statics/3.3.2: + /hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} dependencies: react-is: 16.13.1 dev: false - /hoopy/0.1.4: + /hoopy@0.1.4: resolution: {integrity: sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==} engines: {node: '>= 6.0.0'} - /hpack.js/2.1.6: + /hpack.js@2.1.6: resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} dependencies: inherits: 2.0.4 @@ -5571,19 +5865,19 @@ packages: readable-stream: 2.3.8 wbuf: 1.7.3 - /html-encoding-sniffer/2.0.1: + /html-encoding-sniffer@2.0.1: resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} engines: {node: '>=10'} dependencies: whatwg-encoding: 1.0.5 - /html-entities/2.4.0: + /html-entities@2.4.0: resolution: {integrity: sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==} - /html-escaper/2.0.2: + /html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - /html-minifier-terser/6.1.0: + /html-minifier-terser@6.1.0: resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} engines: {node: '>=12'} hasBin: true @@ -5596,7 +5890,7 @@ packages: relateurl: 0.2.7 terser: 5.19.2 - /html-webpack-plugin/5.5.3_webpack@5.88.2: + /html-webpack-plugin@5.5.3(webpack@5.88.2): resolution: {integrity: sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==} engines: {node: '>=10.13.0'} peerDependencies: @@ -5609,7 +5903,7 @@ packages: tapable: 2.2.1 webpack: 5.88.2 - /htmlparser2/6.1.0: + /htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} dependencies: domelementtype: 2.3.0 @@ -5617,10 +5911,10 @@ packages: domutils: 2.8.0 entities: 2.2.0 - /http-deceiver/1.2.7: + /http-deceiver@1.2.7: resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} - /http-errors/1.6.3: + /http-errors@1.6.3: resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} engines: {node: '>= 0.6'} dependencies: @@ -5629,7 +5923,7 @@ packages: setprototypeof: 1.1.0 statuses: 1.5.0 - /http-errors/2.0.0: + /http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} dependencies: @@ -5639,10 +5933,10 @@ packages: statuses: 2.0.1 toidentifier: 1.0.1 - /http-parser-js/0.5.8: + /http-parser-js@0.5.8: resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} - /http-proxy-agent/4.0.1: + /http-proxy-agent@4.0.1: resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} engines: {node: '>= 6'} dependencies: @@ -5652,7 +5946,7 @@ packages: transitivePeerDependencies: - supports-color - /http-proxy-middleware/2.0.6_@types+express@4.17.17: + /http-proxy-middleware@2.0.6(@types/express@4.17.17): resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} engines: {node: '>=12.0.0'} peerDependencies: @@ -5670,7 +5964,7 @@ packages: transitivePeerDependencies: - debug - /http-proxy/1.18.1: + /http-proxy@1.18.1: resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} dependencies: @@ -5680,7 +5974,7 @@ packages: transitivePeerDependencies: - debug - /https-proxy-agent/5.0.1: + /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} dependencies: @@ -5689,23 +5983,23 @@ packages: transitivePeerDependencies: - supports-color - /human-signals/2.1.0: + /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} - /iconv-lite/0.4.24: + /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 - /iconv-lite/0.6.3: + /iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 - /icss-utils/5.1.0_postcss@8.4.27: + /icss-utils@5.1.0(postcss@8.4.27): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: @@ -5713,30 +6007,30 @@ packages: dependencies: postcss: 8.4.27 - /idb/7.1.1: + /idb@7.1.1: resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} - /identity-obj-proxy/3.0.0: + /identity-obj-proxy@3.0.0: resolution: {integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==} engines: {node: '>=4'} dependencies: harmony-reflect: 1.6.2 - /ignore/5.2.4: + /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} - /immer/9.0.21: + /immer@9.0.21: resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} - /import-fresh/3.3.0: + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - /import-local/3.1.0: + /import-local@3.1.0: resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} engines: {node: '>=8'} hasBin: true @@ -5744,35 +6038,35 @@ packages: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 - /imurmurhash/0.1.4: + /imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - /indent-string/4.0.0: + /indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} dev: false - /inflight/1.0.6: + /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 - /inherits/2.0.3: + /inherits@2.0.3: resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} - /inherits/2.0.4: + /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - /ini/1.3.8: + /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - /inline-style-parser/0.1.1: + /inline-style-parser@0.1.1: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} dev: false - /internal-slot/1.0.5: + /internal-slot@1.0.5: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} dependencies: @@ -5780,15 +6074,15 @@ packages: has: 1.0.3 side-channel: 1.0.4 - /ipaddr.js/1.9.1: + /ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - /ipaddr.js/2.1.0: + /ipaddr.js@2.1.0: resolution: {integrity: sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==} engines: {node: '>= 10'} - /is-arguments/1.1.1: + /is-arguments@1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} dependencies: @@ -5796,215 +6090,215 @@ packages: has-tostringtag: 1.0.0 dev: false - /is-array-buffer/3.0.2: + /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 is-typed-array: 1.1.12 - /is-arrayish/0.2.1: + /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - /is-bigint/1.0.4: + /is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: has-bigints: 1.0.2 - /is-binary-path/2.1.0: + /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} dependencies: binary-extensions: 2.2.0 - /is-boolean-object/1.1.2: + /is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 - /is-buffer/2.0.5: + /is-buffer@2.0.5: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} engines: {node: '>=4'} dev: false - /is-callable/1.2.7: + /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - /is-core-module/2.13.0: + /is-core-module@2.13.0: resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} dependencies: has: 1.0.3 - /is-date-object/1.0.5: + /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 - /is-docker/2.2.1: + /is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} hasBin: true - /is-extglob/2.1.1: + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - /is-fullwidth-code-point/3.0.0: + /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - /is-generator-fn/2.1.0: + /is-generator-fn@2.1.0: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} - /is-glob/4.0.3: + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 - /is-map/2.0.2: + /is-map@2.0.2: resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} dev: false - /is-module/1.0.0: + /is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - /is-negative-zero/2.0.2: + /is-negative-zero@2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} - /is-number-object/1.0.7: + /is-number-object@1.0.7: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 - /is-number/7.0.0: + /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - /is-obj/1.0.1: + /is-obj@1.0.1: resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} engines: {node: '>=0.10.0'} - /is-path-inside/3.0.3: + /is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} - /is-plain-obj/3.0.0: + /is-plain-obj@3.0.0: resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} engines: {node: '>=10'} - /is-plain-obj/4.1.0: + /is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} dev: false - /is-plain-object/2.0.4: + /is-plain-object@2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 dev: true - /is-potential-custom-element-name/1.0.1: + /is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - /is-regex/1.1.4: + /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 - /is-regexp/1.0.0: + /is-regexp@1.0.0: resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} engines: {node: '>=0.10.0'} - /is-root/2.1.0: + /is-root@2.1.0: resolution: {integrity: sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==} engines: {node: '>=6'} - /is-set/2.0.2: + /is-set@2.0.2: resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} dev: false - /is-shared-array-buffer/1.0.2: + /is-shared-array-buffer@1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: call-bind: 1.0.2 - /is-stream/2.0.1: + /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - /is-string/1.0.7: + /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 - /is-symbol/1.0.4: + /is-symbol@1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 - /is-typed-array/1.1.12: + /is-typed-array@1.1.12: resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} engines: {node: '>= 0.4'} dependencies: which-typed-array: 1.1.11 - /is-typedarray/1.0.0: + /is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - /is-weakmap/2.0.1: + /is-weakmap@2.0.1: resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} dev: false - /is-weakref/1.0.2: + /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.2 - /is-weakset/2.0.2: + /is-weakset@2.0.2: resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 dev: false - /is-wsl/2.2.0: + /is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} dependencies: is-docker: 2.2.1 - /isarray/1.0.0: + /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - /isarray/2.0.5: + /isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - /isexe/2.0.0: + /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - /isobject/3.0.1: + /isobject@3.0.1: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} dev: true - /istanbul-lib-coverage/3.2.0: + /istanbul-lib-coverage@3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} - /istanbul-lib-instrument/5.2.1: + /istanbul-lib-instrument@5.2.1: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: @@ -6016,7 +6310,7 @@ packages: transitivePeerDependencies: - supports-color - /istanbul-lib-report/3.0.1: + /istanbul-lib-report@3.0.1: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} dependencies: @@ -6024,7 +6318,7 @@ packages: make-dir: 4.0.0 supports-color: 7.2.0 - /istanbul-lib-source-maps/4.0.1: + /istanbul-lib-source-maps@4.0.1: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: @@ -6034,14 +6328,14 @@ packages: transitivePeerDependencies: - supports-color - /istanbul-reports/3.1.6: + /istanbul-reports@3.1.6: resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} engines: {node: '>=8'} dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - /jake/10.8.7: + /jake@10.8.7: resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} engines: {node: '>=10'} hasBin: true @@ -6051,7 +6345,7 @@ packages: filelist: 1.0.4 minimatch: 3.1.2 - /jest-changed-files/27.5.1: + /jest-changed-files@27.5.1: resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -6059,7 +6353,7 @@ packages: execa: 5.1.1 throat: 6.0.2 - /jest-circus/27.5.1: + /jest-circus@27.5.1: resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -6085,7 +6379,7 @@ packages: transitivePeerDependencies: - supports-color - /jest-cli/27.5.1: + /jest-cli@27.5.1: resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -6114,7 +6408,7 @@ packages: - ts-node - utf-8-validate - /jest-config/27.5.1: + /jest-config@27.5.1: resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: @@ -6126,7 +6420,7 @@ packages: '@babel/core': 7.22.10 '@jest/test-sequencer': 27.5.1 '@jest/types': 27.5.1 - babel-jest: 27.5.1_@babel+core@7.22.10 + babel-jest: 27.5.1(@babel/core@7.22.10) chalk: 4.1.2 ci-info: 3.8.0 deepmerge: 4.3.1 @@ -6153,7 +6447,7 @@ packages: - supports-color - utf-8-validate - /jest-diff/27.5.1: + /jest-diff@27.5.1: resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -6162,13 +6456,13 @@ packages: jest-get-type: 27.5.1 pretty-format: 27.5.1 - /jest-docblock/27.5.1: + /jest-docblock@27.5.1: resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: detect-newline: 3.1.0 - /jest-each/27.5.1: + /jest-each@27.5.1: resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -6178,7 +6472,7 @@ packages: jest-util: 27.5.1 pretty-format: 27.5.1 - /jest-environment-jsdom/27.5.1: + /jest-environment-jsdom@27.5.1: resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -6195,7 +6489,7 @@ packages: - supports-color - utf-8-validate - /jest-environment-node/27.5.1: + /jest-environment-node@27.5.1: resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -6206,11 +6500,11 @@ packages: jest-mock: 27.5.1 jest-util: 27.5.1 - /jest-get-type/27.5.1: + /jest-get-type@27.5.1: resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - /jest-haste-map/27.5.1: + /jest-haste-map@27.5.1: resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -6229,7 +6523,7 @@ packages: optionalDependencies: fsevents: 2.3.2 - /jest-jasmine2/27.5.1: + /jest-jasmine2@27.5.1: resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -6253,14 +6547,14 @@ packages: transitivePeerDependencies: - supports-color - /jest-leak-detector/27.5.1: + /jest-leak-detector@27.5.1: resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: jest-get-type: 27.5.1 pretty-format: 27.5.1 - /jest-matcher-utils/27.5.1: + /jest-matcher-utils@27.5.1: resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -6269,7 +6563,7 @@ packages: jest-get-type: 27.5.1 pretty-format: 27.5.1 - /jest-message-util/27.5.1: + /jest-message-util@27.5.1: resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -6283,7 +6577,7 @@ packages: slash: 3.0.0 stack-utils: 2.0.6 - /jest-message-util/28.1.3: + /jest-message-util@28.1.3: resolution: {integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -6297,14 +6591,14 @@ packages: slash: 3.0.0 stack-utils: 2.0.6 - /jest-mock/27.5.1: + /jest-mock@27.5.1: resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 '@types/node': 16.18.40 - /jest-pnp-resolver/1.2.3_jest-resolve@27.5.1: + /jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} peerDependencies: @@ -6315,15 +6609,15 @@ packages: dependencies: jest-resolve: 27.5.1 - /jest-regex-util/27.5.1: + /jest-regex-util@27.5.1: resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - /jest-regex-util/28.0.2: + /jest-regex-util@28.0.2: resolution: {integrity: sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - /jest-resolve-dependencies/27.5.1: + /jest-resolve-dependencies@27.5.1: resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -6333,7 +6627,7 @@ packages: transitivePeerDependencies: - supports-color - /jest-resolve/27.5.1: + /jest-resolve@27.5.1: resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -6341,14 +6635,14 @@ packages: chalk: 4.1.2 graceful-fs: 4.2.11 jest-haste-map: 27.5.1 - jest-pnp-resolver: 1.2.3_jest-resolve@27.5.1 + jest-pnp-resolver: 1.2.3(jest-resolve@27.5.1) jest-util: 27.5.1 jest-validate: 27.5.1 resolve: 1.22.4 resolve.exports: 1.1.1 slash: 3.0.0 - /jest-runner/27.5.1: + /jest-runner@27.5.1: resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -6379,7 +6673,7 @@ packages: - supports-color - utf-8-validate - /jest-runtime/27.5.1: + /jest-runtime@27.5.1: resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -6408,27 +6702,27 @@ packages: transitivePeerDependencies: - supports-color - /jest-serializer/27.5.1: + /jest-serializer@27.5.1: resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@types/node': 16.18.40 graceful-fs: 4.2.11 - /jest-snapshot/27.5.1: + /jest-snapshot@27.5.1: resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@babel/core': 7.22.10 '@babel/generator': 7.22.10 - '@babel/plugin-syntax-typescript': 7.22.5_@babel+core@7.22.10 + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.10) '@babel/traverse': 7.22.10 '@babel/types': 7.22.10 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 '@types/babel__traverse': 7.20.1 '@types/prettier': 2.7.3 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.22.10 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.10) chalk: 4.1.2 expect: 27.5.1 graceful-fs: 4.2.11 @@ -6444,7 +6738,7 @@ packages: transitivePeerDependencies: - supports-color - /jest-util/27.5.1: + /jest-util@27.5.1: resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -6455,7 +6749,7 @@ packages: graceful-fs: 4.2.11 picomatch: 2.3.1 - /jest-util/28.1.3: + /jest-util@28.1.3: resolution: {integrity: sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -6466,7 +6760,7 @@ packages: graceful-fs: 4.2.11 picomatch: 2.3.1 - /jest-validate/27.5.1: + /jest-validate@27.5.1: resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -6477,7 +6771,7 @@ packages: leven: 3.1.0 pretty-format: 27.5.1 - /jest-watch-typeahead/1.1.0_jest@27.5.1: + /jest-watch-typeahead@1.1.0(jest@27.5.1): resolution: {integrity: sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -6492,7 +6786,7 @@ packages: string-length: 5.0.1 strip-ansi: 7.1.0 - /jest-watcher/27.5.1: + /jest-watcher@27.5.1: resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -6504,7 +6798,7 @@ packages: jest-util: 27.5.1 string-length: 4.0.2 - /jest-watcher/28.1.3: + /jest-watcher@28.1.3: resolution: {integrity: sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -6517,7 +6811,7 @@ packages: jest-util: 28.1.3 string-length: 4.0.2 - /jest-worker/26.6.2: + /jest-worker@26.6.2: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} dependencies: @@ -6525,7 +6819,7 @@ packages: merge-stream: 2.0.0 supports-color: 7.2.0 - /jest-worker/27.5.1: + /jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: @@ -6533,7 +6827,7 @@ packages: merge-stream: 2.0.0 supports-color: 8.1.1 - /jest-worker/28.1.3: + /jest-worker@28.1.3: resolution: {integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -6541,7 +6835,7 @@ packages: merge-stream: 2.0.0 supports-color: 8.1.1 - /jest/27.5.1: + /jest@27.5.1: resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -6561,27 +6855,27 @@ packages: - ts-node - utf-8-validate - /jiti/1.19.1: + /jiti@1.19.1: resolution: {integrity: sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==} hasBin: true - /js-tokens/4.0.0: + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - /js-yaml/3.14.1: + /js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true dependencies: argparse: 1.0.10 esprima: 4.0.1 - /js-yaml/4.1.0: + /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true dependencies: argparse: 2.0.1 - /jsdom/16.7.0: + /jsdom@16.7.0: resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} engines: {node: '>=10'} peerDependencies: @@ -6622,59 +6916,59 @@ packages: - supports-color - utf-8-validate - /jsesc/0.5.0: + /jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true - /jsesc/2.5.2: + /jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true - /json-parse-even-better-errors/2.3.1: + /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - /json-schema-traverse/0.4.1: + /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - /json-schema-traverse/1.0.0: + /json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - /json-schema/0.4.0: + /json-schema@0.4.0: resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - /json-stable-stringify-without-jsonify/1.0.1: + /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - /json5/1.0.2: + /json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true dependencies: minimist: 1.2.8 - /json5/2.2.3: + /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true - /jsonfile/4.0.0: + /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} optionalDependencies: graceful-fs: 4.2.11 dev: true - /jsonfile/6.1.0: + /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: universalify: 2.0.0 optionalDependencies: graceful-fs: 4.2.11 - /jsonpointer/5.0.1: + /jsonpointer@5.0.1: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} - /jsx-ast-utils/3.3.5: + /jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} dependencies: @@ -6683,60 +6977,60 @@ packages: object.assign: 4.1.4 object.values: 1.1.6 - /kind-of/6.0.3: + /kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - /kleur/3.0.3: + /kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} - /kleur/4.1.5: + /kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} dev: false - /klona/2.0.6: + /klona@2.0.6: resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} engines: {node: '>= 8'} - /language-subtag-registry/0.3.22: + /language-subtag-registry@0.3.22: resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} - /language-tags/1.0.5: + /language-tags@1.0.5: resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==} dependencies: language-subtag-registry: 0.3.22 - /launch-editor/2.6.0: + /launch-editor@2.6.0: resolution: {integrity: sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==} dependencies: picocolors: 1.0.0 shell-quote: 1.8.1 - /leven/3.1.0: + /leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} - /levn/0.4.1: + /levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - /lilconfig/2.1.0: + /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} - /lines-and-columns/1.2.4: + /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - /loader-runner/4.3.0: + /loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} - /loader-utils/1.4.2: + /loader-utils@1.4.2: resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} engines: {node: '>=4.0.0'} dependencies: @@ -6745,7 +7039,7 @@ packages: json5: 1.0.2 dev: true - /loader-utils/2.0.4: + /loader-utils@2.0.4: resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} engines: {node: '>=8.9.0'} dependencies: @@ -6753,111 +7047,111 @@ packages: emojis-list: 3.0.0 json5: 2.2.3 - /loader-utils/3.2.1: + /loader-utils@3.2.1: resolution: {integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==} engines: {node: '>= 12.13.0'} - /locate-path/3.0.0: + /locate-path@3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} dependencies: p-locate: 3.0.0 path-exists: 3.0.0 - /locate-path/5.0.0: + /locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} dependencies: p-locate: 4.1.0 - /locate-path/6.0.0: + /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} dependencies: p-locate: 5.0.0 - /lodash.debounce/4.0.8: + /lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - /lodash.memoize/4.1.2: + /lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - /lodash.merge/4.6.2: + /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - /lodash.sortby/4.7.0: + /lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - /lodash.uniq/4.5.0: + /lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - /lodash/4.17.21: + /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - /long/3.2.0: + /long@3.2.0: resolution: {integrity: sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg==} engines: {node: '>=0.6'} dev: true - /loose-envify/1.4.0: + /loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true dependencies: js-tokens: 4.0.0 - /lower-case/2.0.2: + /lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} dependencies: tslib: 2.6.1 - /lru-cache/5.1.1: + /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: yallist: 3.1.1 - /lru-cache/6.0.0: + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} dependencies: yallist: 4.0.0 - /luxon/3.4.0: + /luxon@3.4.0: resolution: {integrity: sha512-7eDo4Pt7aGhoCheGFIuq4Xa2fJm4ZpmldpGhjTYBNUYNCN6TIEP6v7chwwwt3KRp7YR+rghbfvjyo3V5y9hgBw==} engines: {node: '>=12'} dev: false - /lz-string/1.5.0: + /lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true dev: false - /magic-string/0.25.9: + /magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} dependencies: sourcemap-codec: 1.4.8 - /make-dir/3.1.0: + /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} dependencies: semver: 6.3.1 - /make-dir/4.0.0: + /make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} dependencies: semver: 7.5.4 - /make-error/1.3.6: + /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true - /makeerror/1.0.12: + /makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} dependencies: tmpl: 1.0.5 - /mdast-util-definitions/5.1.2: + /mdast-util-definitions@5.1.2: resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} dependencies: '@types/mdast': 3.0.12 @@ -6865,7 +7159,7 @@ packages: unist-util-visit: 4.1.2 dev: false - /mdast-util-from-markdown/1.3.1: + /mdast-util-from-markdown@1.3.1: resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} dependencies: '@types/mdast': 3.0.12 @@ -6884,7 +7178,7 @@ packages: - supports-color dev: false - /mdast-util-to-hast/12.3.0: + /mdast-util-to-hast@12.3.0: resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} dependencies: '@types/hast': 2.3.5 @@ -6897,43 +7191,43 @@ packages: unist-util-visit: 4.1.2 dev: false - /mdast-util-to-string/3.2.0: + /mdast-util-to-string@3.2.0: resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} dependencies: '@types/mdast': 3.0.12 dev: false - /mdn-data/2.0.14: + /mdn-data@2.0.14: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} - /mdn-data/2.0.4: + /mdn-data@2.0.4: resolution: {integrity: sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==} - /media-typer/0.3.0: + /media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} - /memfs/3.5.3: + /memfs@3.5.3: resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} engines: {node: '>= 4.0.0'} dependencies: fs-monkey: 1.0.4 - /merge-descriptors/1.0.1: + /merge-descriptors@1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} - /merge-stream/2.0.0: + /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - /merge2/1.4.1: + /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - /methods/1.1.2: + /methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} - /micromark-core-commonmark/1.1.0: + /micromark-core-commonmark@1.1.0: resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} dependencies: decode-named-character-reference: 1.0.2 @@ -6954,7 +7248,7 @@ packages: uvu: 0.5.6 dev: false - /micromark-factory-destination/1.1.0: + /micromark-factory-destination@1.1.0: resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} dependencies: micromark-util-character: 1.2.0 @@ -6962,7 +7256,7 @@ packages: micromark-util-types: 1.1.0 dev: false - /micromark-factory-label/1.1.0: + /micromark-factory-label@1.1.0: resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} dependencies: micromark-util-character: 1.2.0 @@ -6971,14 +7265,14 @@ packages: uvu: 0.5.6 dev: false - /micromark-factory-space/1.1.0: + /micromark-factory-space@1.1.0: resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} dependencies: micromark-util-character: 1.2.0 micromark-util-types: 1.1.0 dev: false - /micromark-factory-title/1.1.0: + /micromark-factory-title@1.1.0: resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} dependencies: micromark-factory-space: 1.1.0 @@ -6987,7 +7281,7 @@ packages: micromark-util-types: 1.1.0 dev: false - /micromark-factory-whitespace/1.1.0: + /micromark-factory-whitespace@1.1.0: resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} dependencies: micromark-factory-space: 1.1.0 @@ -6996,20 +7290,20 @@ packages: micromark-util-types: 1.1.0 dev: false - /micromark-util-character/1.2.0: + /micromark-util-character@1.2.0: resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} dependencies: micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 dev: false - /micromark-util-chunked/1.1.0: + /micromark-util-chunked@1.1.0: resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} dependencies: micromark-util-symbol: 1.1.0 dev: false - /micromark-util-classify-character/1.1.0: + /micromark-util-classify-character@1.1.0: resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} dependencies: micromark-util-character: 1.2.0 @@ -7017,20 +7311,20 @@ packages: micromark-util-types: 1.1.0 dev: false - /micromark-util-combine-extensions/1.1.0: + /micromark-util-combine-extensions@1.1.0: resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} dependencies: micromark-util-chunked: 1.1.0 micromark-util-types: 1.1.0 dev: false - /micromark-util-decode-numeric-character-reference/1.1.0: + /micromark-util-decode-numeric-character-reference@1.1.0: resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} dependencies: micromark-util-symbol: 1.1.0 dev: false - /micromark-util-decode-string/1.1.0: + /micromark-util-decode-string@1.1.0: resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} dependencies: decode-named-character-reference: 1.0.2 @@ -7039,27 +7333,27 @@ packages: micromark-util-symbol: 1.1.0 dev: false - /micromark-util-encode/1.1.0: + /micromark-util-encode@1.1.0: resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} dev: false - /micromark-util-html-tag-name/1.2.0: + /micromark-util-html-tag-name@1.2.0: resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} dev: false - /micromark-util-normalize-identifier/1.1.0: + /micromark-util-normalize-identifier@1.1.0: resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} dependencies: micromark-util-symbol: 1.1.0 dev: false - /micromark-util-resolve-all/1.1.0: + /micromark-util-resolve-all@1.1.0: resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} dependencies: micromark-util-types: 1.1.0 dev: false - /micromark-util-sanitize-uri/1.2.0: + /micromark-util-sanitize-uri@1.2.0: resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} dependencies: micromark-util-character: 1.2.0 @@ -7067,7 +7361,7 @@ packages: micromark-util-symbol: 1.1.0 dev: false - /micromark-util-subtokenize/1.1.0: + /micromark-util-subtokenize@1.1.0: resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} dependencies: micromark-util-chunked: 1.1.0 @@ -7076,15 +7370,15 @@ packages: uvu: 0.5.6 dev: false - /micromark-util-symbol/1.1.0: + /micromark-util-symbol@1.1.0: resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} dev: false - /micromark-util-types/1.1.0: + /micromark-util-types@1.1.0: resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} dev: false - /micromark/3.2.0: + /micromark@3.2.0: resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} dependencies: '@types/debug': 4.1.8 @@ -7108,38 +7402,38 @@ packages: - supports-color dev: false - /micromatch/4.0.5: + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} dependencies: braces: 3.0.2 picomatch: 2.3.1 - /mime-db/1.52.0: + /mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} - /mime-types/2.1.35: + /mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 - /mime/1.6.0: + /mime@1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} hasBin: true - /mimic-fn/2.1.0: + /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - /min-indent/1.0.1: + /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} dev: false - /mini-css-extract-plugin/2.7.6_webpack@5.88.2: + /mini-css-extract-plugin@2.7.6(webpack@5.88.2): resolution: {integrity: sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -7148,134 +7442,134 @@ packages: schema-utils: 4.2.0 webpack: 5.88.2 - /minimalistic-assert/1.0.1: + /minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - /minimatch/3.1.2: + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 - /minimatch/5.1.6: + /minimatch@5.1.6: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 - /minimist/1.2.8: + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - /mkdirp/0.5.6: + /mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true dependencies: minimist: 1.2.8 - /mri/1.2.0: + /mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} dev: false - /ms/2.0.0: + /ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - /ms/2.1.2: + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - /ms/2.1.3: + /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - /multicast-dns/7.2.5: + /multicast-dns@7.2.5: resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} hasBin: true dependencies: dns-packet: 5.6.0 thunky: 1.1.0 - /mz/2.7.0: + /mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} dependencies: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 - /nanoid/3.3.6: + /nanoid@3.3.6: resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - /natural-compare-lite/1.4.0: + /natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - /natural-compare/1.4.0: + /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - /negotiator/0.6.3: + /negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} - /neo-async/2.6.2: + /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - /no-case/3.0.4: + /no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} dependencies: lower-case: 2.0.2 tslib: 2.6.1 - /node-forge/1.3.1: + /node-forge@1.3.1: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} - /node-int64/0.4.0: + /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - /node-releases/2.0.13: + /node-releases@2.0.13: resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} - /normalize-path/3.0.0: + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - /normalize-range/0.1.2: + /normalize-range@0.1.2: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} - /normalize-url/6.1.0: + /normalize-url@6.1.0: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} - /npm-run-path/4.0.1: + /npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} dependencies: path-key: 3.1.1 - /nth-check/1.0.2: + /nth-check@1.0.2: resolution: {integrity: sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==} dependencies: boolbase: 1.0.0 - /nth-check/2.1.1: + /nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} dependencies: boolbase: 1.0.0 - /nwsapi/2.2.7: + /nwsapi@2.2.7: resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} - /object-assign/4.1.1: + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - /object-hash/3.0.0: + /object-hash@3.0.0: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} - /object-inspect/1.12.3: + /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} - /object-is/1.1.5: + /object-is@1.1.5: resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} engines: {node: '>= 0.4'} dependencies: @@ -7283,11 +7577,11 @@ packages: define-properties: 1.2.0 dev: false - /object-keys/1.1.1: + /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - /object.assign/4.1.4: + /object.assign@4.1.4: resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} engines: {node: '>= 0.4'} dependencies: @@ -7296,7 +7590,7 @@ packages: has-symbols: 1.0.3 object-keys: 1.1.1 - /object.entries/1.1.6: + /object.entries@1.1.6: resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} engines: {node: '>= 0.4'} dependencies: @@ -7304,7 +7598,7 @@ packages: define-properties: 1.2.0 es-abstract: 1.22.1 - /object.fromentries/2.0.6: + /object.fromentries@2.0.6: resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} engines: {node: '>= 0.4'} dependencies: @@ -7312,7 +7606,7 @@ packages: define-properties: 1.2.0 es-abstract: 1.22.1 - /object.getownpropertydescriptors/2.1.6: + /object.getownpropertydescriptors@2.1.6: resolution: {integrity: sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ==} engines: {node: '>= 0.8'} dependencies: @@ -7322,7 +7616,7 @@ packages: es-abstract: 1.22.1 safe-array-concat: 1.0.0 - /object.groupby/1.0.0: + /object.groupby@1.0.0: resolution: {integrity: sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==} dependencies: call-bind: 1.0.2 @@ -7330,13 +7624,13 @@ packages: es-abstract: 1.22.1 get-intrinsic: 1.2.1 - /object.hasown/1.1.2: + /object.hasown@1.1.2: resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} dependencies: define-properties: 1.2.0 es-abstract: 1.22.1 - /object.values/1.1.6: + /object.values@1.1.6: resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} engines: {node: '>= 0.4'} dependencies: @@ -7344,31 +7638,31 @@ packages: define-properties: 1.2.0 es-abstract: 1.22.1 - /obuf/1.1.2: + /obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} - /on-finished/2.4.1: + /on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} dependencies: ee-first: 1.1.1 - /on-headers/1.0.2: + /on-headers@1.0.2: resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} engines: {node: '>= 0.8'} - /once/1.4.0: + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 - /onetime/5.1.2: + /onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} dependencies: mimic-fn: 2.1.0 - /open/8.4.2: + /open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} dependencies: @@ -7376,7 +7670,7 @@ packages: is-docker: 2.2.1 is-wsl: 2.2.0 - /optionator/0.9.3: + /optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} dependencies: @@ -7387,60 +7681,60 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 - /p-limit/2.3.0: + /p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} dependencies: p-try: 2.2.0 - /p-limit/3.1.0: + /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 - /p-locate/3.0.0: + /p-locate@3.0.0: resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} engines: {node: '>=6'} dependencies: p-limit: 2.3.0 - /p-locate/4.1.0: + /p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} dependencies: p-limit: 2.3.0 - /p-locate/5.0.0: + /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} dependencies: p-limit: 3.1.0 - /p-retry/4.6.2: + /p-retry@4.6.2: resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} engines: {node: '>=8'} dependencies: '@types/retry': 0.12.0 retry: 0.13.1 - /p-try/2.2.0: + /p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - /param-case/3.0.4: + /param-case@3.0.4: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} dependencies: dot-case: 3.0.4 tslib: 2.6.1 - /parent-module/1.0.1: + /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} dependencies: callsites: 3.1.0 - /parse-json/5.2.0: + /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: @@ -7449,91 +7743,91 @@ packages: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - /parse5/6.0.1: + /parse5@6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - /parseurl/1.3.3: + /parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} - /pascal-case/3.1.2: + /pascal-case@3.1.2: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} dependencies: no-case: 3.0.4 tslib: 2.6.1 - /path-exists/3.0.0: + /path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} - /path-exists/4.0.0: + /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - /path-is-absolute/1.0.1: + /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} - /path-key/3.1.1: + /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - /path-parse/1.0.7: + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - /path-to-regexp/0.1.7: + /path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} - /path-type/4.0.0: + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - /performance-now/2.1.0: + /performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - /picocolors/0.2.1: + /picocolors@0.2.1: resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} - /picocolors/1.0.0: + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - /picomatch/2.3.1: + /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - /pify/2.3.0: + /pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} - /pinkie-promise/2.0.1: + /pinkie-promise@2.0.1: resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} engines: {node: '>=0.10.0'} dependencies: pinkie: 2.0.4 dev: true - /pinkie/2.0.4: + /pinkie@2.0.4: resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} engines: {node: '>=0.10.0'} dev: true - /pirates/4.0.6: + /pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} - /pkg-dir/4.2.0: + /pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} dependencies: find-up: 4.1.0 - /pkg-up/3.1.0: + /pkg-up@3.1.0: resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} engines: {node: '>=8'} dependencies: find-up: 3.0.0 - /postcss-attribute-case-insensitive/5.0.2_postcss@8.4.27: + /postcss-attribute-case-insensitive@5.0.2(postcss@8.4.27): resolution: {integrity: sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: @@ -7542,7 +7836,7 @@ packages: postcss: 8.4.27 postcss-selector-parser: 6.0.13 - /postcss-browser-comments/4.0.0_inz5kvjhnomxaytbzwg5ouybvm: + /postcss-browser-comments@4.0.0(browserslist@4.21.10)(postcss@8.4.27): resolution: {integrity: sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==} engines: {node: '>=8'} peerDependencies: @@ -7552,7 +7846,7 @@ packages: browserslist: 4.21.10 postcss: 8.4.27 - /postcss-calc/8.2.4_postcss@8.4.27: + /postcss-calc@8.2.4(postcss@8.4.27): resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} peerDependencies: postcss: ^8.2.2 @@ -7561,7 +7855,7 @@ packages: postcss-selector-parser: 6.0.13 postcss-value-parser: 4.2.0 - /postcss-clamp/4.1.0_postcss@8.4.27: + /postcss-clamp@4.1.0(postcss@8.4.27): resolution: {integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==} engines: {node: '>=7.6.0'} peerDependencies: @@ -7570,7 +7864,7 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /postcss-color-functional-notation/4.2.4_postcss@8.4.27: + /postcss-color-functional-notation@4.2.4(postcss@8.4.27): resolution: {integrity: sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: @@ -7579,7 +7873,7 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /postcss-color-hex-alpha/8.0.4_postcss@8.4.27: + /postcss-color-hex-alpha@8.0.4(postcss@8.4.27): resolution: {integrity: sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: @@ -7588,7 +7882,7 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /postcss-color-rebeccapurple/7.1.1_postcss@8.4.27: + /postcss-color-rebeccapurple@7.1.1(postcss@8.4.27): resolution: {integrity: sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: @@ -7597,7 +7891,7 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /postcss-colormin/5.3.1_postcss@8.4.27: + /postcss-colormin@5.3.1(postcss@8.4.27): resolution: {integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -7609,7 +7903,7 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /postcss-convert-values/5.1.3_postcss@8.4.27: + /postcss-convert-values@5.1.3(postcss@8.4.27): resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -7619,7 +7913,7 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /postcss-custom-media/8.0.2_postcss@8.4.27: + /postcss-custom-media@8.0.2(postcss@8.4.27): resolution: {integrity: sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: @@ -7628,7 +7922,7 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /postcss-custom-properties/12.1.11_postcss@8.4.27: + /postcss-custom-properties@12.1.11(postcss@8.4.27): resolution: {integrity: sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: @@ -7637,7 +7931,7 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /postcss-custom-selectors/6.0.3_postcss@8.4.27: + /postcss-custom-selectors@6.0.3(postcss@8.4.27): resolution: {integrity: sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: @@ -7646,7 +7940,7 @@ packages: postcss: 8.4.27 postcss-selector-parser: 6.0.13 - /postcss-dir-pseudo-class/6.0.5_postcss@8.4.27: + /postcss-dir-pseudo-class@6.0.5(postcss@8.4.27): resolution: {integrity: sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: @@ -7655,7 +7949,7 @@ packages: postcss: 8.4.27 postcss-selector-parser: 6.0.13 - /postcss-discard-comments/5.1.2_postcss@8.4.27: + /postcss-discard-comments@5.1.2(postcss@8.4.27): resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -7663,7 +7957,7 @@ packages: dependencies: postcss: 8.4.27 - /postcss-discard-duplicates/5.1.0_postcss@8.4.27: + /postcss-discard-duplicates@5.1.0(postcss@8.4.27): resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -7671,7 +7965,7 @@ packages: dependencies: postcss: 8.4.27 - /postcss-discard-empty/5.1.1_postcss@8.4.27: + /postcss-discard-empty@5.1.1(postcss@8.4.27): resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -7679,7 +7973,7 @@ packages: dependencies: postcss: 8.4.27 - /postcss-discard-overridden/5.1.0_postcss@8.4.27: + /postcss-discard-overridden@5.1.0(postcss@8.4.27): resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -7687,17 +7981,17 @@ packages: dependencies: postcss: 8.4.27 - /postcss-double-position-gradients/3.1.2_postcss@8.4.27: + /postcss-double-position-gradients@3.1.2(postcss@8.4.27): resolution: {integrity: sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.27 + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.27) postcss: 8.4.27 postcss-value-parser: 4.2.0 - /postcss-env-function/4.0.6_postcss@8.4.27: + /postcss-env-function@4.0.6(postcss@8.4.27): resolution: {integrity: sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: @@ -7706,14 +8000,14 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /postcss-flexbugs-fixes/5.0.2_postcss@8.4.27: + /postcss-flexbugs-fixes@5.0.2(postcss@8.4.27): resolution: {integrity: sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==} peerDependencies: postcss: ^8.1.4 dependencies: postcss: 8.4.27 - /postcss-focus-visible/6.0.4_postcss@8.4.27: + /postcss-focus-visible@6.0.4(postcss@8.4.27): resolution: {integrity: sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==} engines: {node: ^12 || ^14 || >=16} peerDependencies: @@ -7722,7 +8016,7 @@ packages: postcss: 8.4.27 postcss-selector-parser: 6.0.13 - /postcss-focus-within/5.0.4_postcss@8.4.27: + /postcss-focus-within@5.0.4(postcss@8.4.27): resolution: {integrity: sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: @@ -7731,14 +8025,14 @@ packages: postcss: 8.4.27 postcss-selector-parser: 6.0.13 - /postcss-font-variant/5.0.0_postcss@8.4.27: + /postcss-font-variant@5.0.0(postcss@8.4.27): resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==} peerDependencies: postcss: ^8.1.0 dependencies: postcss: 8.4.27 - /postcss-gap-properties/3.0.5_postcss@8.4.27: + /postcss-gap-properties@3.0.5(postcss@8.4.27): resolution: {integrity: sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: @@ -7746,7 +8040,7 @@ packages: dependencies: postcss: 8.4.27 - /postcss-image-set-function/4.0.7_postcss@8.4.27: + /postcss-image-set-function@4.0.7(postcss@8.4.27): resolution: {integrity: sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==} engines: {node: ^12 || ^14 || >=16} peerDependencies: @@ -7755,7 +8049,7 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /postcss-import/15.1.0_postcss@8.4.27: + /postcss-import@15.1.0(postcss@8.4.27): resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} peerDependencies: @@ -7766,14 +8060,14 @@ packages: read-cache: 1.0.0 resolve: 1.22.4 - /postcss-initial/4.0.1_postcss@8.4.27: + /postcss-initial@4.0.1(postcss@8.4.27): resolution: {integrity: sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==} peerDependencies: postcss: ^8.0.0 dependencies: postcss: 8.4.27 - /postcss-js/4.0.1_postcss@8.4.27: + /postcss-js@4.0.1(postcss@8.4.27): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} peerDependencies: @@ -7782,17 +8076,17 @@ packages: camelcase-css: 2.0.1 postcss: 8.4.27 - /postcss-lab-function/4.2.1_postcss@8.4.27: + /postcss-lab-function@4.2.1(postcss@8.4.27): resolution: {integrity: sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.27 + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.27) postcss: 8.4.27 postcss-value-parser: 4.2.0 - /postcss-load-config/4.0.1_postcss@8.4.27: + /postcss-load-config@4.0.1(postcss@8.4.27): resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} engines: {node: '>= 14'} peerDependencies: @@ -7808,7 +8102,7 @@ packages: postcss: 8.4.27 yaml: 2.3.1 - /postcss-loader/6.2.1_wtdfwmg7ycxaq333qvq47tatda: + /postcss-loader@6.2.1(postcss@8.4.27)(webpack@5.88.2): resolution: {integrity: sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -7821,7 +8115,7 @@ packages: semver: 7.5.4 webpack: 5.88.2 - /postcss-logical/5.0.4_postcss@8.4.27: + /postcss-logical@5.0.4(postcss@8.4.27): resolution: {integrity: sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==} engines: {node: ^12 || ^14 || >=16} peerDependencies: @@ -7829,7 +8123,7 @@ packages: dependencies: postcss: 8.4.27 - /postcss-media-minmax/5.0.0_postcss@8.4.27: + /postcss-media-minmax@5.0.0(postcss@8.4.27): resolution: {integrity: sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==} engines: {node: '>=10.0.0'} peerDependencies: @@ -7837,7 +8131,7 @@ packages: dependencies: postcss: 8.4.27 - /postcss-merge-longhand/5.1.7_postcss@8.4.27: + /postcss-merge-longhand@5.1.7(postcss@8.4.27): resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -7845,9 +8139,9 @@ packages: dependencies: postcss: 8.4.27 postcss-value-parser: 4.2.0 - stylehacks: 5.1.1_postcss@8.4.27 + stylehacks: 5.1.1(postcss@8.4.27) - /postcss-merge-rules/5.1.4_postcss@8.4.27: + /postcss-merge-rules@5.1.4(postcss@8.4.27): resolution: {integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -7855,11 +8149,11 @@ packages: dependencies: browserslist: 4.21.10 caniuse-api: 3.0.0 - cssnano-utils: 3.1.0_postcss@8.4.27 + cssnano-utils: 3.1.0(postcss@8.4.27) postcss: 8.4.27 postcss-selector-parser: 6.0.13 - /postcss-minify-font-values/5.1.0_postcss@8.4.27: + /postcss-minify-font-values@5.1.0(postcss@8.4.27): resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -7868,29 +8162,29 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /postcss-minify-gradients/5.1.1_postcss@8.4.27: + /postcss-minify-gradients@5.1.1(postcss@8.4.27): resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: colord: 2.9.3 - cssnano-utils: 3.1.0_postcss@8.4.27 + cssnano-utils: 3.1.0(postcss@8.4.27) postcss: 8.4.27 postcss-value-parser: 4.2.0 - /postcss-minify-params/5.1.4_postcss@8.4.27: + /postcss-minify-params@5.1.4(postcss@8.4.27): resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: browserslist: 4.21.10 - cssnano-utils: 3.1.0_postcss@8.4.27 + cssnano-utils: 3.1.0(postcss@8.4.27) postcss: 8.4.27 postcss-value-parser: 4.2.0 - /postcss-minify-selectors/5.2.1_postcss@8.4.27: + /postcss-minify-selectors@5.2.1(postcss@8.4.27): resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -7899,7 +8193,7 @@ packages: postcss: 8.4.27 postcss-selector-parser: 6.0.13 - /postcss-modules-extract-imports/3.0.0_postcss@8.4.27: + /postcss-modules-extract-imports@3.0.0(postcss@8.4.27): resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: @@ -7907,18 +8201,18 @@ packages: dependencies: postcss: 8.4.27 - /postcss-modules-local-by-default/4.0.3_postcss@8.4.27: + /postcss-modules-local-by-default@4.0.3(postcss@8.4.27): resolution: {integrity: sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0_postcss@8.4.27 + icss-utils: 5.1.0(postcss@8.4.27) postcss: 8.4.27 postcss-selector-parser: 6.0.13 postcss-value-parser: 4.2.0 - /postcss-modules-scope/3.0.0_postcss@8.4.27: + /postcss-modules-scope@3.0.0(postcss@8.4.27): resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: @@ -7927,16 +8221,16 @@ packages: postcss: 8.4.27 postcss-selector-parser: 6.0.13 - /postcss-modules-values/4.0.0_postcss@8.4.27: + /postcss-modules-values@4.0.0(postcss@8.4.27): resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0_postcss@8.4.27 + icss-utils: 5.1.0(postcss@8.4.27) postcss: 8.4.27 - /postcss-nested/6.0.1_postcss@8.4.27: + /postcss-nested@6.0.1(postcss@8.4.27): resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} engines: {node: '>=12.0'} peerDependencies: @@ -7945,17 +8239,17 @@ packages: postcss: 8.4.27 postcss-selector-parser: 6.0.13 - /postcss-nesting/10.2.0_postcss@8.4.27: + /postcss-nesting@10.2.0(postcss@8.4.27): resolution: {integrity: sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/selector-specificity': 2.2.0_c3vcbepomgmxc74cgtawpgpkyi + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.0.13) postcss: 8.4.27 postcss-selector-parser: 6.0.13 - /postcss-normalize-charset/5.1.0_postcss@8.4.27: + /postcss-normalize-charset@5.1.0(postcss@8.4.27): resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -7963,7 +8257,7 @@ packages: dependencies: postcss: 8.4.27 - /postcss-normalize-display-values/5.1.0_postcss@8.4.27: + /postcss-normalize-display-values@5.1.0(postcss@8.4.27): resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -7972,7 +8266,7 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /postcss-normalize-positions/5.1.1_postcss@8.4.27: + /postcss-normalize-positions@5.1.1(postcss@8.4.27): resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -7981,7 +8275,7 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /postcss-normalize-repeat-style/5.1.1_postcss@8.4.27: + /postcss-normalize-repeat-style@5.1.1(postcss@8.4.27): resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -7990,7 +8284,7 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /postcss-normalize-string/5.1.0_postcss@8.4.27: + /postcss-normalize-string@5.1.0(postcss@8.4.27): resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -7999,7 +8293,7 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /postcss-normalize-timing-functions/5.1.0_postcss@8.4.27: + /postcss-normalize-timing-functions@5.1.0(postcss@8.4.27): resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -8008,7 +8302,7 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /postcss-normalize-unicode/5.1.1_postcss@8.4.27: + /postcss-normalize-unicode@5.1.1(postcss@8.4.27): resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -8018,7 +8312,7 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /postcss-normalize-url/5.1.0_postcss@8.4.27: + /postcss-normalize-url@5.1.0(postcss@8.4.27): resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -8028,7 +8322,7 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /postcss-normalize-whitespace/5.1.1_postcss@8.4.27: + /postcss-normalize-whitespace@5.1.1(postcss@8.4.27): resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -8037,7 +8331,7 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /postcss-normalize/10.0.1_inz5kvjhnomxaytbzwg5ouybvm: + /postcss-normalize@10.0.1(browserslist@4.21.10)(postcss@8.4.27): resolution: {integrity: sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==} engines: {node: '>= 12'} peerDependencies: @@ -8047,10 +8341,10 @@ packages: '@csstools/normalize.css': 12.0.0 browserslist: 4.21.10 postcss: 8.4.27 - postcss-browser-comments: 4.0.0_inz5kvjhnomxaytbzwg5ouybvm + postcss-browser-comments: 4.0.0(browserslist@4.21.10)(postcss@8.4.27) sanitize.css: 13.0.0 - /postcss-opacity-percentage/1.1.3_postcss@8.4.27: + /postcss-opacity-percentage@1.1.3(postcss@8.4.27): resolution: {integrity: sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==} engines: {node: ^12 || ^14 || >=16} peerDependencies: @@ -8058,17 +8352,17 @@ packages: dependencies: postcss: 8.4.27 - /postcss-ordered-values/5.1.3_postcss@8.4.27: + /postcss-ordered-values@5.1.3(postcss@8.4.27): resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-utils: 3.1.0_postcss@8.4.27 + cssnano-utils: 3.1.0(postcss@8.4.27) postcss: 8.4.27 postcss-value-parser: 4.2.0 - /postcss-overflow-shorthand/3.0.4_postcss@8.4.27: + /postcss-overflow-shorthand@3.0.4(postcss@8.4.27): resolution: {integrity: sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==} engines: {node: ^12 || ^14 || >=16} peerDependencies: @@ -8077,14 +8371,14 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /postcss-page-break/3.0.4_postcss@8.4.27: + /postcss-page-break@3.0.4(postcss@8.4.27): resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==} peerDependencies: postcss: ^8 dependencies: postcss: 8.4.27 - /postcss-place/7.0.5_postcss@8.4.27: + /postcss-place@7.0.5(postcss@8.4.27): resolution: {integrity: sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==} engines: {node: ^12 || ^14 || >=16} peerDependencies: @@ -8093,64 +8387,64 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /postcss-preset-env/7.8.3_postcss@8.4.27: + /postcss-preset-env@7.8.3(postcss@8.4.27): resolution: {integrity: sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 dependencies: - '@csstools/postcss-cascade-layers': 1.1.1_postcss@8.4.27 - '@csstools/postcss-color-function': 1.1.1_postcss@8.4.27 - '@csstools/postcss-font-format-keywords': 1.0.1_postcss@8.4.27 - '@csstools/postcss-hwb-function': 1.0.2_postcss@8.4.27 - '@csstools/postcss-ic-unit': 1.0.1_postcss@8.4.27 - '@csstools/postcss-is-pseudo-class': 2.0.7_postcss@8.4.27 - '@csstools/postcss-nested-calc': 1.0.0_postcss@8.4.27 - '@csstools/postcss-normalize-display-values': 1.0.1_postcss@8.4.27 - '@csstools/postcss-oklab-function': 1.1.1_postcss@8.4.27 - '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.27 - '@csstools/postcss-stepped-value-functions': 1.0.1_postcss@8.4.27 - '@csstools/postcss-text-decoration-shorthand': 1.0.0_postcss@8.4.27 - '@csstools/postcss-trigonometric-functions': 1.0.2_postcss@8.4.27 - '@csstools/postcss-unset-value': 1.0.2_postcss@8.4.27 - autoprefixer: 10.4.14_postcss@8.4.27 + '@csstools/postcss-cascade-layers': 1.1.1(postcss@8.4.27) + '@csstools/postcss-color-function': 1.1.1(postcss@8.4.27) + '@csstools/postcss-font-format-keywords': 1.0.1(postcss@8.4.27) + '@csstools/postcss-hwb-function': 1.0.2(postcss@8.4.27) + '@csstools/postcss-ic-unit': 1.0.1(postcss@8.4.27) + '@csstools/postcss-is-pseudo-class': 2.0.7(postcss@8.4.27) + '@csstools/postcss-nested-calc': 1.0.0(postcss@8.4.27) + '@csstools/postcss-normalize-display-values': 1.0.1(postcss@8.4.27) + '@csstools/postcss-oklab-function': 1.1.1(postcss@8.4.27) + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.27) + '@csstools/postcss-stepped-value-functions': 1.0.1(postcss@8.4.27) + '@csstools/postcss-text-decoration-shorthand': 1.0.0(postcss@8.4.27) + '@csstools/postcss-trigonometric-functions': 1.0.2(postcss@8.4.27) + '@csstools/postcss-unset-value': 1.0.2(postcss@8.4.27) + autoprefixer: 10.4.14(postcss@8.4.27) browserslist: 4.21.10 - css-blank-pseudo: 3.0.3_postcss@8.4.27 - css-has-pseudo: 3.0.4_postcss@8.4.27 - css-prefers-color-scheme: 6.0.3_postcss@8.4.27 + css-blank-pseudo: 3.0.3(postcss@8.4.27) + css-has-pseudo: 3.0.4(postcss@8.4.27) + css-prefers-color-scheme: 6.0.3(postcss@8.4.27) cssdb: 7.7.0 postcss: 8.4.27 - postcss-attribute-case-insensitive: 5.0.2_postcss@8.4.27 - postcss-clamp: 4.1.0_postcss@8.4.27 - postcss-color-functional-notation: 4.2.4_postcss@8.4.27 - postcss-color-hex-alpha: 8.0.4_postcss@8.4.27 - postcss-color-rebeccapurple: 7.1.1_postcss@8.4.27 - postcss-custom-media: 8.0.2_postcss@8.4.27 - postcss-custom-properties: 12.1.11_postcss@8.4.27 - postcss-custom-selectors: 6.0.3_postcss@8.4.27 - postcss-dir-pseudo-class: 6.0.5_postcss@8.4.27 - postcss-double-position-gradients: 3.1.2_postcss@8.4.27 - postcss-env-function: 4.0.6_postcss@8.4.27 - postcss-focus-visible: 6.0.4_postcss@8.4.27 - postcss-focus-within: 5.0.4_postcss@8.4.27 - postcss-font-variant: 5.0.0_postcss@8.4.27 - postcss-gap-properties: 3.0.5_postcss@8.4.27 - postcss-image-set-function: 4.0.7_postcss@8.4.27 - postcss-initial: 4.0.1_postcss@8.4.27 - postcss-lab-function: 4.2.1_postcss@8.4.27 - postcss-logical: 5.0.4_postcss@8.4.27 - postcss-media-minmax: 5.0.0_postcss@8.4.27 - postcss-nesting: 10.2.0_postcss@8.4.27 - postcss-opacity-percentage: 1.1.3_postcss@8.4.27 - postcss-overflow-shorthand: 3.0.4_postcss@8.4.27 - postcss-page-break: 3.0.4_postcss@8.4.27 - postcss-place: 7.0.5_postcss@8.4.27 - postcss-pseudo-class-any-link: 7.1.6_postcss@8.4.27 - postcss-replace-overflow-wrap: 4.0.0_postcss@8.4.27 - postcss-selector-not: 6.0.1_postcss@8.4.27 + postcss-attribute-case-insensitive: 5.0.2(postcss@8.4.27) + postcss-clamp: 4.1.0(postcss@8.4.27) + postcss-color-functional-notation: 4.2.4(postcss@8.4.27) + postcss-color-hex-alpha: 8.0.4(postcss@8.4.27) + postcss-color-rebeccapurple: 7.1.1(postcss@8.4.27) + postcss-custom-media: 8.0.2(postcss@8.4.27) + postcss-custom-properties: 12.1.11(postcss@8.4.27) + postcss-custom-selectors: 6.0.3(postcss@8.4.27) + postcss-dir-pseudo-class: 6.0.5(postcss@8.4.27) + postcss-double-position-gradients: 3.1.2(postcss@8.4.27) + postcss-env-function: 4.0.6(postcss@8.4.27) + postcss-focus-visible: 6.0.4(postcss@8.4.27) + postcss-focus-within: 5.0.4(postcss@8.4.27) + postcss-font-variant: 5.0.0(postcss@8.4.27) + postcss-gap-properties: 3.0.5(postcss@8.4.27) + postcss-image-set-function: 4.0.7(postcss@8.4.27) + postcss-initial: 4.0.1(postcss@8.4.27) + postcss-lab-function: 4.2.1(postcss@8.4.27) + postcss-logical: 5.0.4(postcss@8.4.27) + postcss-media-minmax: 5.0.0(postcss@8.4.27) + postcss-nesting: 10.2.0(postcss@8.4.27) + postcss-opacity-percentage: 1.1.3(postcss@8.4.27) + postcss-overflow-shorthand: 3.0.4(postcss@8.4.27) + postcss-page-break: 3.0.4(postcss@8.4.27) + postcss-place: 7.0.5(postcss@8.4.27) + postcss-pseudo-class-any-link: 7.1.6(postcss@8.4.27) + postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.27) + postcss-selector-not: 6.0.1(postcss@8.4.27) postcss-value-parser: 4.2.0 - /postcss-pseudo-class-any-link/7.1.6_postcss@8.4.27: + /postcss-pseudo-class-any-link@7.1.6(postcss@8.4.27): resolution: {integrity: sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==} engines: {node: ^12 || ^14 || >=16} peerDependencies: @@ -8159,7 +8453,7 @@ packages: postcss: 8.4.27 postcss-selector-parser: 6.0.13 - /postcss-reduce-initial/5.1.2_postcss@8.4.27: + /postcss-reduce-initial@5.1.2(postcss@8.4.27): resolution: {integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -8169,7 +8463,7 @@ packages: caniuse-api: 3.0.0 postcss: 8.4.27 - /postcss-reduce-transforms/5.1.0_postcss@8.4.27: + /postcss-reduce-transforms@5.1.0(postcss@8.4.27): resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -8178,14 +8472,14 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 - /postcss-replace-overflow-wrap/4.0.0_postcss@8.4.27: + /postcss-replace-overflow-wrap@4.0.0(postcss@8.4.27): resolution: {integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==} peerDependencies: postcss: ^8.0.3 dependencies: postcss: 8.4.27 - /postcss-selector-not/6.0.1_postcss@8.4.27: + /postcss-selector-not@6.0.1(postcss@8.4.27): resolution: {integrity: sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: @@ -8194,14 +8488,14 @@ packages: postcss: 8.4.27 postcss-selector-parser: 6.0.13 - /postcss-selector-parser/6.0.13: + /postcss-selector-parser@6.0.13: resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} engines: {node: '>=4'} dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - /postcss-svgo/5.1.0_postcss@8.4.27: + /postcss-svgo@5.1.0(postcss@8.4.27): resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -8211,7 +8505,7 @@ packages: postcss-value-parser: 4.2.0 svgo: 2.8.0 - /postcss-unique-selectors/5.1.1_postcss@8.4.27: + /postcss-unique-selectors@5.1.1(postcss@8.4.27): resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -8220,17 +8514,17 @@ packages: postcss: 8.4.27 postcss-selector-parser: 6.0.13 - /postcss-value-parser/4.2.0: + /postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - /postcss/7.0.39: + /postcss@7.0.39: resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==} engines: {node: '>=6.0.0'} dependencies: picocolors: 0.2.1 source-map: 0.6.1 - /postcss/8.4.27: + /postcss@8.4.27: resolution: {integrity: sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==} engines: {node: ^10 || ^12 || >=14} dependencies: @@ -8238,21 +8532,21 @@ packages: picocolors: 1.0.0 source-map-js: 1.0.2 - /prelude-ls/1.2.1: + /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - /pretty-bytes/5.6.0: + /pretty-bytes@5.6.0: resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} engines: {node: '>=6'} - /pretty-error/4.0.0: + /pretty-error@4.0.0: resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} dependencies: lodash: 4.17.21 renderkid: 3.0.0 - /pretty-format/27.5.1: + /pretty-format@27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -8260,7 +8554,7 @@ packages: ansi-styles: 5.2.0 react-is: 17.0.2 - /pretty-format/28.1.3: + /pretty-format@28.1.3: resolution: {integrity: sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: @@ -8269,77 +8563,77 @@ packages: ansi-styles: 5.2.0 react-is: 18.2.0 - /process-nextick-args/2.0.1: + /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - /promise/8.3.0: + /promise@8.3.0: resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} dependencies: asap: 2.0.6 - /prompts/2.4.2: + /prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} dependencies: kleur: 3.0.3 sisteransi: 1.0.5 - /prop-types/15.8.1: + /prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 - /property-information/6.2.0: + /property-information@6.2.0: resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==} dev: false - /proxy-addr/2.0.7: + /proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 - /psl/1.9.0: + /psl@1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - /punycode/2.3.0: + /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} - /q/1.5.1: + /q@1.5.1: resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} - /qs/6.11.0: + /qs@6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} dependencies: side-channel: 1.0.4 - /querystringify/2.2.0: + /querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - /queue-microtask/1.2.3: + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - /raf/3.4.1: + /raf@3.4.1: resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} dependencies: performance-now: 2.1.0 - /randombytes/2.1.0: + /randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: safe-buffer: 5.2.1 - /range-parser/1.2.1: + /range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} - /raw-body/2.5.1: + /raw-body@2.5.1: resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} engines: {node: '>= 0.8'} dependencies: @@ -8348,7 +8642,7 @@ packages: iconv-lite: 0.4.24 unpipe: 1.0.0 - /react-app-polyfill/3.0.0: + /react-app-polyfill@3.0.0: resolution: {integrity: sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==} engines: {node: '>=14'} dependencies: @@ -8359,7 +8653,7 @@ packages: regenerator-runtime: 0.13.11 whatwg-fetch: 3.6.17 - /react-dev-utils/12.0.1_l5uwip6bj2qr7x44tnq7g5rwia: + /react-dev-utils@12.0.1(eslint@8.47.0)(typescript@4.9.5)(webpack@5.88.2): resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} engines: {node: '>=14'} peerDependencies: @@ -8378,7 +8672,7 @@ packages: escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3_l5uwip6bj2qr7x44tnq7g5rwia + fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.47.0)(typescript@4.9.5)(webpack@5.88.2) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -8400,13 +8694,13 @@ packages: - supports-color - vue-template-compiler - /react-dnd-html5-backend/16.0.1: + /react-dnd-html5-backend@16.0.1: resolution: {integrity: sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw==} dependencies: dnd-core: 16.0.1 dev: false - /react-dnd/16.0.1_tmexzulqvmqns5ldwaibu3jqgu: + /react-dnd@16.0.1(@types/node@16.18.40)(@types/react@18.2.20)(react@18.2.0): resolution: {integrity: sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q==} peerDependencies: '@types/hoist-non-react-statics': '>= 3.3.1' @@ -8431,7 +8725,7 @@ packages: react: 18.2.0 dev: false - /react-dom/18.2.0_react@18.2.0: + /react-dom@18.2.0(react@18.2.0): resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: react: ^18.2.0 @@ -8441,10 +8735,10 @@ packages: scheduler: 0.23.0 dev: false - /react-error-overlay/6.0.11: + /react-error-overlay@6.0.11: resolution: {integrity: sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==} - /react-icons/4.10.1_react@18.2.0: + /react-icons@4.10.1(react@18.2.0): resolution: {integrity: sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw==} peerDependencies: react: '*' @@ -8452,16 +8746,16 @@ packages: react: 18.2.0 dev: false - /react-is/16.13.1: + /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - /react-is/17.0.2: + /react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - /react-is/18.2.0: + /react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - /react-markdown/8.0.7_j3ahe22lw6ac2w6qvqp4kjqnqy: + /react-markdown@8.0.7(@types/react@18.2.20)(react@18.2.0): resolution: {integrity: sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==} peerDependencies: '@types/react': '>=16' @@ -8488,11 +8782,11 @@ packages: - supports-color dev: false - /react-refresh/0.11.0: + /react-refresh@0.11.0: resolution: {integrity: sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==} engines: {node: '>=0.10.0'} - /react-router-dom/6.15.0_biqbaboplfbrettd7655fr4n2y: + /react-router-dom@6.15.0(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-aR42t0fs7brintwBGAv2+mGlCtgtFQeOzK0BM1/OiqEzRejOZtpMZepvgkscpMUnKb8YO84G7s3LsHnnDNonbQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -8501,11 +8795,11 @@ packages: dependencies: '@remix-run/router': 1.8.0 react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - react-router: 6.15.0_react@18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-router: 6.15.0(react@18.2.0) dev: false - /react-router/6.15.0_react@18.2.0: + /react-router@6.15.0(react@18.2.0): resolution: {integrity: sha512-NIytlzvzLwJkCQj2HLefmeakxxWHWAP+02EGqWEZy+DgfHHKQMUoBBjUQLOtFInBMhWtb3hiUy6MfFgwLjXhqg==} engines: {node: '>=14.0.0'} peerDependencies: @@ -8515,11 +8809,12 @@ packages: react: 18.2.0 dev: false - /react-scripts/5.0.1_j5ip3o3v6sktjzl5cxtjyfbuo4: + /react-scripts@5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.5)(eslint@8.47.0)(react@18.2.0)(typescript@4.9.5): resolution: {integrity: sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==} engines: {node: '>=14.0.0'} hasBin: true peerDependencies: + eslint: '*' react: '>= 16' typescript: ^3.2.1 || ^4 peerDependenciesMeta: @@ -8527,54 +8822,54 @@ packages: optional: true dependencies: '@babel/core': 7.22.10 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.10_yzxi3427mpmymp2edesmoixdua + '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(webpack-dev-server@4.15.1)(webpack@5.88.2) '@svgr/webpack': 5.5.0 - babel-jest: 27.5.1_@babel+core@7.22.10 - babel-loader: 8.3.0_a7bz5yhgcoab2comip4bcc2pf4 - babel-plugin-named-asset-import: 0.3.8_@babel+core@7.22.10 + babel-jest: 27.5.1(@babel/core@7.22.10) + babel-loader: 8.3.0(@babel/core@7.22.10)(webpack@5.88.2) + babel-plugin-named-asset-import: 0.3.8(@babel/core@7.22.10) babel-preset-react-app: 10.0.1 bfj: 7.0.2 browserslist: 4.21.10 camelcase: 6.3.0 case-sensitive-paths-webpack-plugin: 2.4.0 - css-loader: 6.8.1_webpack@5.88.2 - css-minimizer-webpack-plugin: 3.4.1_webpack@5.88.2 + css-loader: 6.8.1(webpack@5.88.2) + css-minimizer-webpack-plugin: 3.4.1(webpack@5.88.2) dotenv: 10.0.0 dotenv-expand: 5.1.0 eslint: 8.47.0 - eslint-config-react-app: 7.0.1_hewhl32arvhpzpkgjcsdnjm62y - eslint-webpack-plugin: 3.2.0_3zsjo4afjru4a27oz7f2yugqoa - file-loader: 6.2.0_webpack@5.88.2 + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.5)(eslint@8.47.0)(jest@27.5.1)(typescript@4.9.5) + eslint-webpack-plugin: 3.2.0(eslint@8.47.0)(webpack@5.88.2) + file-loader: 6.2.0(webpack@5.88.2) fs-extra: 10.1.0 - html-webpack-plugin: 5.5.3_webpack@5.88.2 + html-webpack-plugin: 5.5.3(webpack@5.88.2) identity-obj-proxy: 3.0.0 jest: 27.5.1 jest-resolve: 27.5.1 - jest-watch-typeahead: 1.1.0_jest@27.5.1 - mini-css-extract-plugin: 2.7.6_webpack@5.88.2 + jest-watch-typeahead: 1.1.0(jest@27.5.1) + mini-css-extract-plugin: 2.7.6(webpack@5.88.2) postcss: 8.4.27 - postcss-flexbugs-fixes: 5.0.2_postcss@8.4.27 - postcss-loader: 6.2.1_wtdfwmg7ycxaq333qvq47tatda - postcss-normalize: 10.0.1_inz5kvjhnomxaytbzwg5ouybvm - postcss-preset-env: 7.8.3_postcss@8.4.27 + postcss-flexbugs-fixes: 5.0.2(postcss@8.4.27) + postcss-loader: 6.2.1(postcss@8.4.27)(webpack@5.88.2) + postcss-normalize: 10.0.1(browserslist@4.21.10)(postcss@8.4.27) + postcss-preset-env: 7.8.3(postcss@8.4.27) prompts: 2.4.2 react: 18.2.0 react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1_l5uwip6bj2qr7x44tnq7g5rwia + react-dev-utils: 12.0.1(eslint@8.47.0)(typescript@4.9.5)(webpack@5.88.2) react-refresh: 0.11.0 resolve: 1.22.4 resolve-url-loader: 4.0.0 - sass-loader: 12.6.0_webpack@5.88.2 + sass-loader: 12.6.0(webpack@5.88.2) semver: 7.5.4 - source-map-loader: 3.0.2_webpack@5.88.2 - style-loader: 3.3.3_webpack@5.88.2 + source-map-loader: 3.0.2(webpack@5.88.2) + style-loader: 3.3.3(webpack@5.88.2) tailwindcss: 3.3.3 - terser-webpack-plugin: 5.3.9_webpack@5.88.2 + terser-webpack-plugin: 5.3.9(webpack@5.88.2) typescript: 4.9.5 webpack: 5.88.2 - webpack-dev-server: 4.15.1_webpack@5.88.2 - webpack-manifest-plugin: 4.1.1_webpack@5.88.2 - workbox-webpack-plugin: 6.6.0_webpack@5.88.2 + webpack-dev-server: 4.15.1(webpack@5.88.2) + webpack-manifest-plugin: 4.1.1(webpack@5.88.2) + workbox-webpack-plugin: 6.6.0(webpack@5.88.2) optionalDependencies: fsevents: 2.3.2 transitivePeerDependencies: @@ -8610,37 +8905,37 @@ packages: - webpack-hot-middleware - webpack-plugin-serve - /react/18.2.0: + /react@18.2.0: resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 - /reactflow/11.8.1_4jhe43xn235rpbr6wcgfu3576u: + /reactflow@11.8.1(@types/react@18.2.20)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-OuhsSCiefrCAUZqjuYJNVhhUpLrNQNzBz1rORCMXYO2j7y0FQ02oZLoMT/5mhCmNGMqR7BZwwvOMCSZM7wAn5A==} peerDependencies: react: '>=17' react-dom: '>=17' dependencies: - '@reactflow/background': 11.2.6_4jhe43xn235rpbr6wcgfu3576u - '@reactflow/controls': 11.1.17_4jhe43xn235rpbr6wcgfu3576u - '@reactflow/core': 11.8.1_4jhe43xn235rpbr6wcgfu3576u - '@reactflow/minimap': 11.6.1_4jhe43xn235rpbr6wcgfu3576u - '@reactflow/node-resizer': 2.1.3_4jhe43xn235rpbr6wcgfu3576u - '@reactflow/node-toolbar': 1.2.5_4jhe43xn235rpbr6wcgfu3576u + '@reactflow/background': 11.2.6(@types/react@18.2.20)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/controls': 11.1.17(@types/react@18.2.20)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/core': 11.8.1(@types/react@18.2.20)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/minimap': 11.6.1(@types/react@18.2.20)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/node-resizer': 2.1.3(@types/react@18.2.20)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/node-toolbar': 1.2.5(@types/react@18.2.20)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 + react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: - '@types/react' - immer dev: false - /read-cache/1.0.0: + /read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} dependencies: pify: 2.3.0 - /readable-stream/2.3.8: + /readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} dependencies: core-util-is: 1.0.3 @@ -8651,7 +8946,7 @@ packages: string_decoder: 1.1.1 util-deprecate: 1.0.2 - /readable-stream/3.6.2: + /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} dependencies: @@ -8659,19 +8954,19 @@ packages: string_decoder: 1.3.0 util-deprecate: 1.0.2 - /readdirp/3.6.0: + /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 - /recursive-readdir/2.2.3: + /recursive-readdir@2.2.3: resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} engines: {node: '>=6.0.0'} dependencies: minimatch: 3.1.2 - /redent/3.0.0: + /redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} dependencies: @@ -8679,40 +8974,40 @@ packages: strip-indent: 3.0.0 dev: false - /redux/4.2.1: + /redux@4.2.1: resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} dependencies: '@babel/runtime': 7.22.10 dev: false - /reflect-metadata/0.1.13: + /reflect-metadata@0.1.13: resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} dev: false - /regenerate-unicode-properties/10.1.0: + /regenerate-unicode-properties@10.1.0: resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} engines: {node: '>=4'} dependencies: regenerate: 1.4.2 - /regenerate/1.4.2: + /regenerate@1.4.2: resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - /regenerator-runtime/0.13.11: + /regenerator-runtime@0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - /regenerator-runtime/0.14.0: + /regenerator-runtime@0.14.0: resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} - /regenerator-transform/0.15.2: + /regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} dependencies: '@babel/runtime': 7.22.10 - /regex-parser/2.2.11: + /regex-parser@2.2.11: resolution: {integrity: sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==} - /regexp.prototype.flags/1.5.0: + /regexp.prototype.flags@1.5.0: resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} engines: {node: '>= 0.4'} dependencies: @@ -8720,7 +9015,7 @@ packages: define-properties: 1.2.0 functions-have-names: 1.2.3 - /regexpu-core/5.3.2: + /regexpu-core@5.3.2: resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} engines: {node: '>=4'} dependencies: @@ -8731,17 +9026,17 @@ packages: unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.1.0 - /regjsparser/0.9.1: + /regjsparser@0.9.1: resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} hasBin: true dependencies: jsesc: 0.5.0 - /relateurl/0.2.7: + /relateurl@0.2.7: resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} engines: {node: '>= 0.10'} - /remark-parse/10.0.2: + /remark-parse@10.0.2: resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} dependencies: '@types/mdast': 3.0.12 @@ -8751,7 +9046,7 @@ packages: - supports-color dev: false - /remark-rehype/10.1.0: + /remark-rehype@10.1.0: resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} dependencies: '@types/hast': 2.3.5 @@ -8760,7 +9055,7 @@ packages: unified: 10.1.2 dev: false - /renderkid/3.0.0: + /renderkid@3.0.0: resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} dependencies: css-select: 4.3.0 @@ -8769,32 +9064,32 @@ packages: lodash: 4.17.21 strip-ansi: 6.0.1 - /require-directory/2.1.1: + /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - /require-from-string/2.0.2: + /require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - /requires-port/1.0.0: + /requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - /resolve-cwd/3.0.0: + /resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} dependencies: resolve-from: 5.0.0 - /resolve-from/4.0.0: + /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - /resolve-from/5.0.0: + /resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - /resolve-url-loader/4.0.0: + /resolve-url-loader@4.0.0: resolution: {integrity: sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==} engines: {node: '>=8.9'} peerDependencies: @@ -8812,11 +9107,11 @@ packages: postcss: 7.0.39 source-map: 0.6.1 - /resolve.exports/1.1.1: + /resolve.exports@1.1.1: resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==} engines: {node: '>=10'} - /resolve/1.22.4: + /resolve@1.22.4: resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} hasBin: true dependencies: @@ -8824,7 +9119,7 @@ packages: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - /resolve/2.0.0-next.4: + /resolve@2.0.0-next.4: resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} hasBin: true dependencies: @@ -8832,21 +9127,21 @@ packages: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - /retry/0.13.1: + /retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} - /reusify/1.0.4: + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - /rimraf/3.0.2: + /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true dependencies: glob: 7.2.3 - /rollup-plugin-terser/7.0.2_rollup@2.79.1: + /rollup-plugin-terser@7.0.2(rollup@2.79.1): resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser peerDependencies: @@ -8858,26 +9153,34 @@ packages: serialize-javascript: 4.0.0 terser: 5.19.2 - /rollup/2.79.1: + /rollup@2.79.1: resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} engines: {node: '>=10.0.0'} hasBin: true optionalDependencies: fsevents: 2.3.2 - /run-parallel/1.2.0: + /rollup@3.28.0: + resolution: {integrity: sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 - /sade/1.8.1: + /sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} dependencies: mri: 1.2.0 dev: false - /safe-array-concat/1.0.0: + /safe-array-concat@1.0.0: resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==} engines: {node: '>=0.4'} dependencies: @@ -8886,26 +9189,26 @@ packages: has-symbols: 1.0.3 isarray: 2.0.5 - /safe-buffer/5.1.2: + /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - /safe-buffer/5.2.1: + /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - /safe-regex-test/1.0.0: + /safe-regex-test@1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 is-regex: 1.1.4 - /safer-buffer/2.1.2: + /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - /sanitize.css/13.0.0: + /sanitize.css@13.0.0: resolution: {integrity: sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==} - /sass-loader/12.6.0_webpack@5.88.2: + /sass-loader@12.6.0(webpack@5.88.2): resolution: {integrity: sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -8928,75 +9231,75 @@ packages: neo-async: 2.6.2 webpack: 5.88.2 - /sax/1.2.4: + /sax@1.2.4: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} - /saxes/5.0.1: + /saxes@5.0.1: resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} engines: {node: '>=10'} dependencies: xmlchars: 2.2.0 - /scheduler/0.23.0: + /scheduler@0.23.0: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: loose-envify: 1.4.0 dev: false - /schema-utils/2.7.0: + /schema-utils@2.7.0: resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==} engines: {node: '>= 8.9.0'} dependencies: '@types/json-schema': 7.0.12 ajv: 6.12.6 - ajv-keywords: 3.5.2_ajv@6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) - /schema-utils/2.7.1: + /schema-utils@2.7.1: resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} engines: {node: '>= 8.9.0'} dependencies: '@types/json-schema': 7.0.12 ajv: 6.12.6 - ajv-keywords: 3.5.2_ajv@6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) - /schema-utils/3.3.0: + /schema-utils@3.3.0: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} dependencies: '@types/json-schema': 7.0.12 ajv: 6.12.6 - ajv-keywords: 3.5.2_ajv@6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) - /schema-utils/4.2.0: + /schema-utils@4.2.0: resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} engines: {node: '>= 12.13.0'} dependencies: '@types/json-schema': 7.0.12 ajv: 8.12.0 - ajv-formats: 2.1.1 - ajv-keywords: 5.1.0_ajv@8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + ajv-keywords: 5.1.0(ajv@8.12.0) - /select-hose/2.0.0: + /select-hose@2.0.0: resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} - /selfsigned/2.1.1: + /selfsigned@2.1.1: resolution: {integrity: sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==} engines: {node: '>=10'} dependencies: node-forge: 1.3.1 - /semver/6.3.1: + /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - /semver/7.5.4: + /semver@7.5.4: resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} engines: {node: '>=10'} hasBin: true dependencies: lru-cache: 6.0.0 - /send/0.18.0: + /send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} dependencies: @@ -9016,17 +9319,17 @@ packages: transitivePeerDependencies: - supports-color - /serialize-javascript/4.0.0: + /serialize-javascript@4.0.0: resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} dependencies: randombytes: 2.1.0 - /serialize-javascript/6.0.1: + /serialize-javascript@6.0.1: resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} dependencies: randombytes: 2.1.0 - /serve-index/1.9.1: + /serve-index@1.9.1: resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} engines: {node: '>= 0.8.0'} dependencies: @@ -9040,7 +9343,7 @@ packages: transitivePeerDependencies: - supports-color - /serve-static/1.15.0: + /serve-static@1.15.0: resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} engines: {node: '>= 0.8.0'} dependencies: @@ -9051,68 +9354,68 @@ packages: transitivePeerDependencies: - supports-color - /setprototypeof/1.1.0: + /setprototypeof@1.1.0: resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} - /setprototypeof/1.2.0: + /setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - /shallow-clone/3.0.1: + /shallow-clone@3.0.1: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} dependencies: kind-of: 6.0.3 dev: true - /shebang-command/2.0.0: + /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 - /shebang-regex/3.0.0: + /shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - /shell-quote/1.8.1: + /shell-quote@1.8.1: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - /side-channel/1.0.4: + /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 object-inspect: 1.12.3 - /signal-exit/3.0.7: + /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - /sisteransi/1.0.5: + /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - /slash/3.0.0: + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - /slash/4.0.0: + /slash@4.0.0: resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} engines: {node: '>=12'} - /sockjs/0.3.24: + /sockjs@0.3.24: resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} dependencies: faye-websocket: 0.11.4 uuid: 8.3.2 websocket-driver: 0.7.4 - /source-list-map/2.0.1: + /source-list-map@2.0.1: resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} - /source-map-js/1.0.2: + /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} - /source-map-loader/3.0.2_webpack@5.88.2: + /source-map-loader@3.0.2(webpack@5.88.2): resolution: {integrity: sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -9123,35 +9426,35 @@ packages: source-map-js: 1.0.2 webpack: 5.88.2 - /source-map-support/0.5.21: + /source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - /source-map/0.6.1: + /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - /source-map/0.7.4: + /source-map@0.7.4: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} - /source-map/0.8.0-beta.0: + /source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} dependencies: whatwg-url: 7.1.0 - /sourcemap-codec/1.4.8: + /sourcemap-codec@1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} deprecated: Please use @jridgewell/sourcemap-codec instead - /space-separated-tokens/2.0.2: + /space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} dev: false - /spdy-transport/3.0.0: + /spdy-transport@3.0.0: resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} dependencies: debug: 4.3.4 @@ -9163,7 +9466,7 @@ packages: transitivePeerDependencies: - supports-color - /spdy/4.0.2: + /spdy@4.0.2: resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} engines: {node: '>=6.0.0'} dependencies: @@ -9175,55 +9478,55 @@ packages: transitivePeerDependencies: - supports-color - /sprintf-js/1.0.3: + /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - /stable/0.1.8: + /stable@0.1.8: resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' - /stack-utils/2.0.6: + /stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} dependencies: escape-string-regexp: 2.0.0 - /stackframe/1.3.4: + /stackframe@1.3.4: resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} - /statuses/1.5.0: + /statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} - /statuses/2.0.1: + /statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - /stop-iteration-iterator/1.0.0: + /stop-iteration-iterator@1.0.0: resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} engines: {node: '>= 0.4'} dependencies: internal-slot: 1.0.5 dev: false - /string-length/4.0.2: + /string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} dependencies: char-regex: 1.0.2 strip-ansi: 6.0.1 - /string-length/5.0.1: + /string-length@5.0.1: resolution: {integrity: sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==} engines: {node: '>=12.20'} dependencies: char-regex: 2.0.1 strip-ansi: 7.1.0 - /string-natural-compare/3.0.1: + /string-natural-compare@3.0.1: resolution: {integrity: sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==} - /string-width/4.2.3: + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} dependencies: @@ -9231,7 +9534,7 @@ packages: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string.prototype.matchall/4.0.8: + /string.prototype.matchall@4.0.8: resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} dependencies: call-bind: 1.0.2 @@ -9243,7 +9546,7 @@ packages: regexp.prototype.flags: 1.5.0 side-channel: 1.0.4 - /string.prototype.trim/1.2.7: + /string.prototype.trim@1.2.7: resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} engines: {node: '>= 0.4'} dependencies: @@ -9251,31 +9554,31 @@ packages: define-properties: 1.2.0 es-abstract: 1.22.1 - /string.prototype.trimend/1.0.6: + /string.prototype.trimend@1.0.6: resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 - /string.prototype.trimstart/1.0.6: + /string.prototype.trimstart@1.0.6: resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 - /string_decoder/1.1.1: + /string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: safe-buffer: 5.1.2 - /string_decoder/1.3.0: + /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 - /stringify-object/3.3.0: + /stringify-object@3.3.0: resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} engines: {node: '>=4'} dependencies: @@ -9283,53 +9586,53 @@ packages: is-obj: 1.0.1 is-regexp: 1.0.0 - /strip-ansi/6.0.1: + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 - /strip-ansi/7.1.0: + /strip-ansi@7.1.0: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 - /strip-bom/3.0.0: + /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - /strip-bom/4.0.0: + /strip-bom@4.0.0: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} engines: {node: '>=8'} - /strip-comments/2.0.1: + /strip-comments@2.0.1: resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} engines: {node: '>=10'} - /strip-final-newline/2.0.0: + /strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} - /strip-indent/3.0.0: + /strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} dependencies: min-indent: 1.0.1 dev: false - /strip-json-comments/3.1.1: + /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - /strip-outer/1.0.1: + /strip-outer@1.0.1: resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} engines: {node: '>=0.10.0'} dependencies: escape-string-regexp: 1.0.5 dev: true - /style-loader/3.3.3_webpack@5.88.2: + /style-loader@3.3.3(webpack@5.88.2): resolution: {integrity: sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -9337,13 +9640,13 @@ packages: dependencies: webpack: 5.88.2 - /style-to-object/0.4.2: + /style-to-object@0.4.2: resolution: {integrity: sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA==} dependencies: inline-style-parser: 0.1.1 dev: false - /stylehacks/5.1.1_postcss@8.4.27: + /stylehacks@5.1.1(postcss@8.4.27): resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -9353,7 +9656,7 @@ packages: postcss: 8.4.27 postcss-selector-parser: 6.0.13 - /sucrase/3.34.0: + /sucrase@3.34.0: resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} engines: {node: '>=8'} hasBin: true @@ -9366,39 +9669,39 @@ packages: pirates: 4.0.6 ts-interface-checker: 0.1.13 - /supports-color/5.5.0: + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} dependencies: has-flag: 3.0.0 - /supports-color/7.2.0: + /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} dependencies: has-flag: 4.0.0 - /supports-color/8.1.1: + /supports-color@8.1.1: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} dependencies: has-flag: 4.0.0 - /supports-hyperlinks/2.3.0: + /supports-hyperlinks@2.3.0: resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} engines: {node: '>=8'} dependencies: has-flag: 4.0.0 supports-color: 7.2.0 - /supports-preserve-symlinks-flag/1.0.0: + /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /svg-parser/2.0.4: + /svg-parser@2.0.4: resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} - /svgo/1.3.2: + /svgo@1.3.2: resolution: {integrity: sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==} engines: {node: '>=4.0.0'} deprecated: This SVGO version is no longer supported. Upgrade to v2.x.x. @@ -9418,7 +9721,7 @@ packages: unquote: 1.1.1 util.promisify: 1.0.1 - /svgo/2.8.0: + /svgo@2.8.0: resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} engines: {node: '>=10.13.0'} hasBin: true @@ -9431,20 +9734,20 @@ packages: picocolors: 1.0.0 stable: 0.1.8 - /swr/2.2.1_react@18.2.0: + /swr@2.2.1(react@18.2.0): resolution: {integrity: sha512-KJVA7dGtOBeZ+2sycEuzUfVIP5lZ/cd0xjevv85n2YG0x1uHJQicjAtahVZL6xG3+TjqhbBqimwYzVo3saeVXQ==} peerDependencies: react: ^16.11.0 || ^17.0.0 || ^18.0.0 dependencies: client-only: 0.0.1 react: 18.2.0 - use-sync-external-store: 1.2.0_react@18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) dev: false - /symbol-tree/3.2.4: + /symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - /tailwindcss/3.3.3: + /tailwindcss@3.3.3: resolution: {integrity: sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==} engines: {node: '>=14.0.0'} hasBin: true @@ -9464,29 +9767,29 @@ packages: object-hash: 3.0.0 picocolors: 1.0.0 postcss: 8.4.27 - postcss-import: 15.1.0_postcss@8.4.27 - postcss-js: 4.0.1_postcss@8.4.27 - postcss-load-config: 4.0.1_postcss@8.4.27 - postcss-nested: 6.0.1_postcss@8.4.27 + postcss-import: 15.1.0(postcss@8.4.27) + postcss-js: 4.0.1(postcss@8.4.27) + postcss-load-config: 4.0.1(postcss@8.4.27) + postcss-nested: 6.0.1(postcss@8.4.27) postcss-selector-parser: 6.0.13 resolve: 1.22.4 sucrase: 3.34.0 transitivePeerDependencies: - ts-node - /tapable/1.1.3: + /tapable@1.1.3: resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} engines: {node: '>=6'} - /tapable/2.2.1: + /tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - /temp-dir/2.0.0: + /temp-dir@2.0.0: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} engines: {node: '>=8'} - /tempy/0.6.0: + /tempy@0.6.0: resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} engines: {node: '>=10'} dependencies: @@ -9495,14 +9798,14 @@ packages: type-fest: 0.16.0 unique-string: 2.0.0 - /terminal-link/2.1.1: + /terminal-link@2.1.1: resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} engines: {node: '>=8'} dependencies: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - /terser-webpack-plugin/5.3.9_webpack@5.88.2: + /terser-webpack-plugin@5.3.9(webpack@5.88.2): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -9525,7 +9828,7 @@ packages: terser: 5.19.2 webpack: 5.88.2 - /terser/5.19.2: + /terser@5.19.2: resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} engines: {node: '>=10'} hasBin: true @@ -9535,7 +9838,7 @@ packages: commander: 2.20.3 source-map-support: 0.5.21 - /test-exclude/6.0.0: + /test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} dependencies: @@ -9543,44 +9846,44 @@ packages: glob: 7.2.3 minimatch: 3.1.2 - /text-table/0.2.0: + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - /thenify-all/1.6.0: + /thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} dependencies: thenify: 3.3.1 - /thenify/3.3.1: + /thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} dependencies: any-promise: 1.3.0 - /throat/6.0.2: + /throat@6.0.2: resolution: {integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==} - /thunky/1.1.0: + /thunky@1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} - /tmpl/1.0.5: + /tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - /to-fast-properties/2.0.0: + /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} - /to-regex-range/5.0.1: + /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 - /toidentifier/1.0.1: + /toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - /tough-cookie/4.1.3: + /tough-cookie@4.1.3: resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} engines: {node: '>=6'} dependencies: @@ -9589,39 +9892,39 @@ packages: universalify: 0.2.0 url-parse: 1.5.10 - /tr46/1.0.1: + /tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} dependencies: punycode: 2.3.0 - /tr46/2.1.0: + /tr46@2.1.0: resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} engines: {node: '>=8'} dependencies: punycode: 2.3.0 - /trim-lines/3.0.1: + /trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} dev: false - /trim-repeated/1.0.0: + /trim-repeated@1.0.0: resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==} engines: {node: '>=0.10.0'} dependencies: escape-string-regexp: 1.0.5 dev: true - /trough/2.1.0: + /trough@2.1.0: resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} dev: false - /tryer/1.0.1: + /tryer@1.0.1: resolution: {integrity: sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==} - /ts-interface-checker/0.1.13: + /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - /ts-node/10.9.1_osiawaesgot4tuqtrzm2bzteda: + /ts-node@10.9.1(@types/node@16.18.40)(typescript@4.9.5): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -9652,7 +9955,7 @@ packages: yn: 3.1.1 dev: true - /tsconfig-paths/3.14.2: + /tsconfig-paths@3.14.2: resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} dependencies: '@types/json5': 0.0.29 @@ -9660,13 +9963,13 @@ packages: minimist: 1.2.8 strip-bom: 3.0.0 - /tslib/1.14.1: + /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - /tslib/2.6.1: + /tslib@2.6.1: resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} - /tsutils/3.21.0_typescript@4.9.5: + /tsutils@3.21.0(typescript@4.9.5): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: @@ -9675,36 +9978,36 @@ packages: tslib: 1.14.1 typescript: 4.9.5 - /type-check/0.4.0: + /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 - /type-detect/4.0.8: + /type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} - /type-fest/0.16.0: + /type-fest@0.16.0: resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} engines: {node: '>=10'} - /type-fest/0.20.2: + /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} - /type-fest/0.21.3: + /type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} - /type-is/1.6.18: + /type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} dependencies: media-typer: 0.3.0 mime-types: 2.1.35 - /typed-array-buffer/1.0.0: + /typed-array-buffer@1.0.0: resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} engines: {node: '>= 0.4'} dependencies: @@ -9712,7 +10015,7 @@ packages: get-intrinsic: 1.2.1 is-typed-array: 1.1.12 - /typed-array-byte-length/1.0.0: + /typed-array-byte-length@1.0.0: resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} engines: {node: '>= 0.4'} dependencies: @@ -9721,7 +10024,7 @@ packages: has-proto: 1.0.1 is-typed-array: 1.1.12 - /typed-array-byte-offset/1.0.0: + /typed-array-byte-offset@1.0.0: resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} engines: {node: '>= 0.4'} dependencies: @@ -9731,24 +10034,24 @@ packages: has-proto: 1.0.1 is-typed-array: 1.1.12 - /typed-array-length/1.0.4: + /typed-array-length@1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} dependencies: call-bind: 1.0.2 for-each: 0.3.3 is-typed-array: 1.1.12 - /typedarray-to-buffer/3.1.5: + /typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} dependencies: is-typedarray: 1.0.0 - /typescript/4.9.5: + /typescript@4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} hasBin: true - /unbox-primitive/1.0.2: + /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: call-bind: 1.0.2 @@ -9756,26 +10059,26 @@ packages: has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - /unicode-canonical-property-names-ecmascript/2.0.0: + /unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} - /unicode-match-property-ecmascript/2.0.0: + /unicode-match-property-ecmascript@2.0.0: resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} engines: {node: '>=4'} dependencies: unicode-canonical-property-names-ecmascript: 2.0.0 unicode-property-aliases-ecmascript: 2.1.0 - /unicode-match-property-value-ecmascript/2.1.0: + /unicode-match-property-value-ecmascript@2.1.0: resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} engines: {node: '>=4'} - /unicode-property-aliases-ecmascript/2.1.0: + /unicode-property-aliases-ecmascript@2.1.0: resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} engines: {node: '>=4'} - /unified/10.1.2: + /unified@10.1.2: resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} dependencies: '@types/unist': 2.0.7 @@ -9787,42 +10090,42 @@ packages: vfile: 5.3.7 dev: false - /unique-string/2.0.0: + /unique-string@2.0.0: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} engines: {node: '>=8'} dependencies: crypto-random-string: 2.0.0 - /unist-util-generated/2.0.1: + /unist-util-generated@2.0.1: resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} dev: false - /unist-util-is/5.2.1: + /unist-util-is@5.2.1: resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} dependencies: '@types/unist': 2.0.7 dev: false - /unist-util-position/4.0.4: + /unist-util-position@4.0.4: resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} dependencies: '@types/unist': 2.0.7 dev: false - /unist-util-stringify-position/3.0.3: + /unist-util-stringify-position@3.0.3: resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} dependencies: '@types/unist': 2.0.7 dev: false - /unist-util-visit-parents/5.1.3: + /unist-util-visit-parents@5.1.3: resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} dependencies: '@types/unist': 2.0.7 unist-util-is: 5.2.1 dev: false - /unist-util-visit/4.1.2: + /unist-util-visit@4.1.2: resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} dependencies: '@types/unist': 2.0.7 @@ -9830,31 +10133,31 @@ packages: unist-util-visit-parents: 5.1.3 dev: false - /universalify/0.1.2: + /universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} dev: true - /universalify/0.2.0: + /universalify@0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} - /universalify/2.0.0: + /universalify@2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} - /unpipe/1.0.0: + /unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - /unquote/1.1.1: + /unquote@1.1.1: resolution: {integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==} - /upath/1.2.0: + /upath@1.2.0: resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} engines: {node: '>=4'} - /update-browserslist-db/1.0.11_browserslist@4.21.10: + /update-browserslist-db@1.0.11(browserslist@4.21.10): resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} hasBin: true peerDependencies: @@ -9864,18 +10167,18 @@ packages: escalade: 3.1.1 picocolors: 1.0.0 - /uri-js/4.4.1: + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.0 - /url-parse/1.5.10: + /url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} dependencies: querystringify: 2.2.0 requires-port: 1.0.0 - /use-debounce/9.0.4_react@18.2.0: + /use-debounce@9.0.4(react@18.2.0): resolution: {integrity: sha512-6X8H/mikbrt0XE8e+JXRtZ8yYVvKkdYRfmIhWZYsP8rcNs9hk3APV8Ua2mFkKRLcJKVdnX2/Vwrmg2GWKUQEaQ==} engines: {node: '>= 10.0.0'} peerDependencies: @@ -9884,7 +10187,7 @@ packages: react: 18.2.0 dev: false - /use-sync-external-store/1.2.0_react@18.2.0: + /use-sync-external-store@1.2.0(react@18.2.0): resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -9892,10 +10195,10 @@ packages: react: 18.2.0 dev: false - /util-deprecate/1.0.2: + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - /util.promisify/1.0.1: + /util.promisify@1.0.1: resolution: {integrity: sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==} dependencies: define-properties: 1.2.0 @@ -9903,18 +10206,18 @@ packages: has-symbols: 1.0.3 object.getownpropertydescriptors: 2.1.6 - /utila/0.4.0: + /utila@0.4.0: resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} - /utils-merge/1.0.1: + /utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} - /uuid/8.3.2: + /uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true - /uvu/0.5.6: + /uvu@0.5.6: resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} engines: {node: '>=8'} hasBin: true @@ -9925,11 +10228,11 @@ packages: sade: 1.8.1 dev: false - /v8-compile-cache-lib/3.0.1: + /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true - /v8-to-istanbul/8.1.1: + /v8-to-istanbul@8.1.1: resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} engines: {node: '>=10.12.0'} dependencies: @@ -9937,18 +10240,18 @@ packages: convert-source-map: 1.9.0 source-map: 0.7.4 - /vary/1.1.2: + /vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - /vfile-message/3.1.4: + /vfile-message@3.1.4: resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} dependencies: '@types/unist': 2.0.7 unist-util-stringify-position: 3.0.3 dev: false - /vfile/5.3.7: + /vfile@5.3.7: resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} dependencies: '@types/unist': 2.0.7 @@ -9957,24 +10260,59 @@ packages: vfile-message: 3.1.4 dev: false - /w3c-hr-time/1.0.2: + /vite@4.4.9: + resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.18.20 + postcss: 8.4.27 + rollup: 3.28.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /w3c-hr-time@1.0.2: resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} deprecated: Use your platform's native performance.now() and performance.timeOrigin. dependencies: browser-process-hrtime: 1.0.0 - /w3c-xmlserializer/2.0.0: + /w3c-xmlserializer@2.0.0: resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} engines: {node: '>=10'} dependencies: xml-name-validator: 3.0.0 - /walker/1.0.8: + /walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: makeerror: 1.0.12 - /wasm-dce/1.0.2: + /wasm-dce@1.0.2: resolution: {integrity: sha512-Fq1+nu43ybsjSnBquLrW/cULmKs61qbv9k8ep13QUe0nABBezMoNAA+j6QY66MW0/eoDVDp1rjXDqQ2VKyS/Xg==} dependencies: '@babel/core': 7.22.10 @@ -9986,36 +10324,36 @@ packages: - supports-color dev: true - /wasm-loader/1.3.0: + /wasm-loader@1.3.0(wasm-dce@1.0.2): resolution: {integrity: sha512-R4s75XH+o8qM+WaRrAU9S2rbAMDzob18/S3V8R9ZoFpZkPWLAohWWlzWAp1ybeTkOuuku/X1zJtxiV0pBYxZww==} + peerDependencies: + wasm-dce: 1.x dependencies: loader-utils: 1.4.2 wasm-dce: 1.0.2 - transitivePeerDependencies: - - supports-color dev: true - /watchpack/2.4.0: + /watchpack@2.4.0: resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} engines: {node: '>=10.13.0'} dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - /wbuf/1.7.3: + /wbuf@1.7.3: resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} dependencies: minimalistic-assert: 1.0.1 - /web-vitals/2.1.4: + /web-vitals@2.1.4: resolution: {integrity: sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==} dev: false - /webassembly-floating-point-hex-parser/0.1.2: + /webassembly-floating-point-hex-parser@0.1.2: resolution: {integrity: sha512-TUf1H++8U10+stJbFydnvrpG5Sznz5Rilez/oZlV5zI0C/e4cSxd8rALAJ8VpTvjVWxLmL3SVSJUK6Ap9AoiNg==} dev: true - /webassembly-interpreter/0.0.30: + /webassembly-interpreter@0.0.30: resolution: {integrity: sha512-+Jdy2piEvz9T5j751mOE8+rBO12p+nNW6Fg4kJZ+zP1oUfsm+151sbAbM8AFxWTURmWCGP+r8Lxwfv3pzN1bCQ==} hasBin: true dependencies: @@ -10024,18 +10362,18 @@ packages: webassembly-floating-point-hex-parser: 0.1.2 dev: true - /webidl-conversions/4.0.2: + /webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - /webidl-conversions/5.0.0: + /webidl-conversions@5.0.0: resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} engines: {node: '>=8'} - /webidl-conversions/6.1.0: + /webidl-conversions@6.1.0: resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} engines: {node: '>=10.4'} - /webpack-dev-middleware/5.3.3_webpack@5.88.2: + /webpack-dev-middleware@5.3.3(webpack@5.88.2): resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -10048,7 +10386,7 @@ packages: schema-utils: 4.2.0 webpack: 5.88.2 - /webpack-dev-server/4.15.1_webpack@5.88.2: + /webpack-dev-server@4.15.1(webpack@5.88.2): resolution: {integrity: sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==} engines: {node: '>= 12.13.0'} hasBin: true @@ -10078,7 +10416,7 @@ packages: express: 4.18.2 graceful-fs: 4.2.11 html-entities: 2.4.0 - http-proxy-middleware: 2.0.6_@types+express@4.17.17 + http-proxy-middleware: 2.0.6(@types/express@4.17.17) ipaddr.js: 2.1.0 launch-editor: 2.6.0 open: 8.4.2 @@ -10090,7 +10428,7 @@ packages: sockjs: 0.3.24 spdy: 4.0.2 webpack: 5.88.2 - webpack-dev-middleware: 5.3.3_webpack@5.88.2 + webpack-dev-middleware: 5.3.3(webpack@5.88.2) ws: 8.13.0 transitivePeerDependencies: - bufferutil @@ -10098,7 +10436,7 @@ packages: - supports-color - utf-8-validate - /webpack-manifest-plugin/4.1.1_webpack@5.88.2: + /webpack-manifest-plugin@4.1.1(webpack@5.88.2): resolution: {integrity: sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==} engines: {node: '>=12.22.0'} peerDependencies: @@ -10108,7 +10446,7 @@ packages: webpack: 5.88.2 webpack-sources: 2.3.1 - /webpack-merge/5.9.0: + /webpack-merge@5.9.0: resolution: {integrity: sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==} engines: {node: '>=10.0.0'} dependencies: @@ -10116,24 +10454,24 @@ packages: wildcard: 2.0.1 dev: true - /webpack-sources/1.4.3: + /webpack-sources@1.4.3: resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} dependencies: source-list-map: 2.0.1 source-map: 0.6.1 - /webpack-sources/2.3.1: + /webpack-sources@2.3.1: resolution: {integrity: sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==} engines: {node: '>=10.13.0'} dependencies: source-list-map: 2.0.1 source-map: 0.6.1 - /webpack-sources/3.2.3: + /webpack-sources@3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - /webpack/5.88.2: + /webpack@5.88.2: resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} engines: {node: '>=10.13.0'} hasBin: true @@ -10149,7 +10487,7 @@ packages: '@webassemblyjs/wasm-edit': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 acorn: 8.10.0 - acorn-import-assertions: 1.9.0_acorn@8.10.0 + acorn-import-assertions: 1.9.0(acorn@8.10.0) browserslist: 4.21.10 chrome-trace-event: 1.0.3 enhanced-resolve: 5.15.0 @@ -10164,7 +10502,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.9_webpack@5.88.2 + terser-webpack-plugin: 5.3.9(webpack@5.88.2) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -10172,7 +10510,7 @@ packages: - esbuild - uglify-js - /websocket-driver/0.7.4: + /websocket-driver@0.7.4: resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} engines: {node: '>=0.8.0'} dependencies: @@ -10180,29 +10518,29 @@ packages: safe-buffer: 5.2.1 websocket-extensions: 0.1.4 - /websocket-extensions/0.1.4: + /websocket-extensions@0.1.4: resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} engines: {node: '>=0.8.0'} - /whatwg-encoding/1.0.5: + /whatwg-encoding@1.0.5: resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} dependencies: iconv-lite: 0.4.24 - /whatwg-fetch/3.6.17: + /whatwg-fetch@3.6.17: resolution: {integrity: sha512-c4ghIvG6th0eudYwKZY5keb81wtFz9/WeAHAoy8+r18kcWlitUIrmGFQ2rWEl4UCKUilD3zCLHOIPheHx5ypRQ==} - /whatwg-mimetype/2.3.0: + /whatwg-mimetype@2.3.0: resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} - /whatwg-url/7.1.0: + /whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} dependencies: lodash.sortby: 4.7.0 tr46: 1.0.1 webidl-conversions: 4.0.2 - /whatwg-url/8.7.0: + /whatwg-url@8.7.0: resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} engines: {node: '>=10'} dependencies: @@ -10210,7 +10548,7 @@ packages: tr46: 2.1.0 webidl-conversions: 6.1.0 - /which-boxed-primitive/1.0.2: + /which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: is-bigint: 1.0.4 @@ -10219,7 +10557,7 @@ packages: is-string: 1.0.7 is-symbol: 1.0.4 - /which-collection/1.0.1: + /which-collection@1.0.1: resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} dependencies: is-map: 2.0.2 @@ -10228,7 +10566,7 @@ packages: is-weakset: 2.0.2 dev: false - /which-typed-array/1.1.11: + /which-typed-array@1.1.11: resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} engines: {node: '>= 0.4'} dependencies: @@ -10238,45 +10576,45 @@ packages: gopd: 1.0.1 has-tostringtag: 1.0.0 - /which/1.3.1: + /which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true dependencies: isexe: 2.0.0 - /which/2.0.2: + /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true dependencies: isexe: 2.0.0 - /wildcard/2.0.1: + /wildcard@2.0.1: resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} dev: true - /workbox-background-sync/6.6.0: + /workbox-background-sync@6.6.0: resolution: {integrity: sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==} dependencies: idb: 7.1.1 workbox-core: 6.6.0 - /workbox-broadcast-update/6.6.0: + /workbox-broadcast-update@6.6.0: resolution: {integrity: sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==} dependencies: workbox-core: 6.6.0 - /workbox-build/6.6.0: + /workbox-build@6.6.0: resolution: {integrity: sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==} engines: {node: '>=10.0.0'} dependencies: - '@apideck/better-ajv-errors': 0.3.6_ajv@8.12.0 + '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0) '@babel/core': 7.22.10 - '@babel/preset-env': 7.22.10_@babel+core@7.22.10 + '@babel/preset-env': 7.22.10(@babel/core@7.22.10) '@babel/runtime': 7.22.10 - '@rollup/plugin-babel': 5.3.1_vdsg3cryjz3q3k3s4sc37bag2u - '@rollup/plugin-node-resolve': 11.2.1_rollup@2.79.1 - '@rollup/plugin-replace': 2.4.2_rollup@2.79.1 + '@rollup/plugin-babel': 5.3.1(@babel/core@7.22.10)(rollup@2.79.1) + '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1) + '@rollup/plugin-replace': 2.4.2(rollup@2.79.1) '@surma/rollup-plugin-off-main-thread': 2.2.3 ajv: 8.12.0 common-tags: 1.8.2 @@ -10286,7 +10624,7 @@ packages: lodash: 4.17.21 pretty-bytes: 5.6.0 rollup: 2.79.1 - rollup-plugin-terser: 7.0.2_rollup@2.79.1 + rollup-plugin-terser: 7.0.2(rollup@2.79.1) source-map: 0.8.0-beta.0 stringify-object: 3.3.0 strip-comments: 2.0.1 @@ -10311,22 +10649,22 @@ packages: - '@types/babel__core' - supports-color - /workbox-cacheable-response/6.6.0: + /workbox-cacheable-response@6.6.0: resolution: {integrity: sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==} deprecated: workbox-background-sync@6.6.0 dependencies: workbox-core: 6.6.0 - /workbox-core/6.6.0: + /workbox-core@6.6.0: resolution: {integrity: sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==} - /workbox-expiration/6.6.0: + /workbox-expiration@6.6.0: resolution: {integrity: sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==} dependencies: idb: 7.1.1 workbox-core: 6.6.0 - /workbox-google-analytics/6.6.0: + /workbox-google-analytics@6.6.0: resolution: {integrity: sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==} dependencies: workbox-background-sync: 6.6.0 @@ -10334,24 +10672,24 @@ packages: workbox-routing: 6.6.0 workbox-strategies: 6.6.0 - /workbox-navigation-preload/6.6.0: + /workbox-navigation-preload@6.6.0: resolution: {integrity: sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==} dependencies: workbox-core: 6.6.0 - /workbox-precaching/6.6.0: + /workbox-precaching@6.6.0: resolution: {integrity: sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==} dependencies: workbox-core: 6.6.0 workbox-routing: 6.6.0 workbox-strategies: 6.6.0 - /workbox-range-requests/6.6.0: + /workbox-range-requests@6.6.0: resolution: {integrity: sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==} dependencies: workbox-core: 6.6.0 - /workbox-recipes/6.6.0: + /workbox-recipes@6.6.0: resolution: {integrity: sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==} dependencies: workbox-cacheable-response: 6.6.0 @@ -10361,26 +10699,26 @@ packages: workbox-routing: 6.6.0 workbox-strategies: 6.6.0 - /workbox-routing/6.6.0: + /workbox-routing@6.6.0: resolution: {integrity: sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==} dependencies: workbox-core: 6.6.0 - /workbox-strategies/6.6.0: + /workbox-strategies@6.6.0: resolution: {integrity: sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==} dependencies: workbox-core: 6.6.0 - /workbox-streams/6.6.0: + /workbox-streams@6.6.0: resolution: {integrity: sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==} dependencies: workbox-core: 6.6.0 workbox-routing: 6.6.0 - /workbox-sw/6.6.0: + /workbox-sw@6.6.0: resolution: {integrity: sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==} - /workbox-webpack-plugin/6.6.0_webpack@5.88.2: + /workbox-webpack-plugin@6.6.0(webpack@5.88.2): resolution: {integrity: sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==} engines: {node: '>=10.0.0'} peerDependencies: @@ -10396,13 +10734,13 @@ packages: - '@types/babel__core' - supports-color - /workbox-window/6.6.0: + /workbox-window@6.6.0: resolution: {integrity: sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==} dependencies: '@types/trusted-types': 2.0.3 workbox-core: 6.6.0 - /wrap-ansi/7.0.0: + /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} dependencies: @@ -10410,10 +10748,10 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 - /wrappy/1.0.2: + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - /write-file-atomic/3.0.3: + /write-file-atomic@3.0.3: resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} dependencies: imurmurhash: 0.1.4 @@ -10421,7 +10759,7 @@ packages: signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 - /ws/7.5.9: + /ws@7.5.9: resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} engines: {node: '>=8.3.0'} peerDependencies: @@ -10433,7 +10771,7 @@ packages: utf-8-validate: optional: true - /ws/8.13.0: + /ws@8.13.0: resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} engines: {node: '>=10.0.0'} peerDependencies: @@ -10445,35 +10783,35 @@ packages: utf-8-validate: optional: true - /xml-name-validator/3.0.0: + /xml-name-validator@3.0.0: resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} - /xmlchars/2.2.0: + /xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - /y18n/5.0.8: + /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - /yallist/3.1.1: + /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - /yallist/4.0.0: + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - /yaml/1.10.2: + /yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - /yaml/2.3.1: + /yaml@2.3.1: resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} engines: {node: '>= 14'} - /yargs-parser/20.2.9: + /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} - /yargs/16.2.0: + /yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} dependencies: @@ -10485,16 +10823,16 @@ packages: y18n: 5.0.8 yargs-parser: 20.2.9 - /yn/3.1.1: + /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} dev: true - /yocto-queue/0.1.0: + /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - /zustand/4.4.1_6r35cis3cdrdimxih7xf3am2py: + /zustand@4.4.1(@types/react@18.2.20)(immer@9.0.21)(react@18.2.0): resolution: {integrity: sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw==} engines: {node: '>=12.7.0'} peerDependencies: @@ -10512,5 +10850,5 @@ packages: '@types/react': 18.2.20 immer: 9.0.21 react: 18.2.0 - use-sync-external-store: 1.2.0_react@18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) dev: false From c840e54d7660d69c516d3f308f55b657898b7c68 Mon Sep 17 00:00:00 2001 From: Luna The Bat Date: Sat, 12 Aug 2023 19:53:54 +0200 Subject: [PATCH 079/109] split engine and app --- app/.eslintrc.cjs | 18 ++ app/.gitignore | 24 ++ app/README.md | 27 ++ app/index.html | 13 + app/package.json | 83 ++---- app/postcss.config.js | 2 +- app/public/vite.svg | 1 + app/src/App.tsx | 58 ++-- app/src/assets/react.svg | 1 + app/src/main.tsx | 16 ++ app/src/vite-env.d.ts | 1 + app/tailwind.config.js | 5 +- app/tsconfig.node.json | 10 + app/vite.config.ts | 10 + {app => engine}/.env | 0 engine/build/asset-manifest.json | 15 ++ {app/public => engine/build}/favicon.png | Bin {app/public => engine/build}/favicon.svg | 0 engine/build/index.html | 1 + {app/public => engine/build}/logo192.png | Bin {app/public => engine/build}/logo512.png | Bin {app/public => engine/build}/manifest.json | 0 {app/public => engine/build}/robots.txt | 0 engine/build/static/css/main.af4949d1.css | 6 + engine/build/static/css/main.af4949d1.css.map | 1 + engine/build/static/js/787.d5a091f2.chunk.js | 2 + .../build/static/js/787.d5a091f2.chunk.js.map | 1 + engine/build/static/js/main.148e1d42.js | 3 + .../static/js/main.148e1d42.js.LICENSE.txt | 110 ++++++++ engine/build/static/js/main.148e1d42.js.map | 1 + {app => engine}/craco.config.js | 0 {app => engine}/package-lock.json | 0 engine/package.json | 73 +++++ engine/postcss.config.js | 6 + engine/public/favicon.png | Bin 0 -> 1315 bytes engine/public/favicon.svg | 14 + {app => engine}/public/index.html | 0 engine/public/logo192.png | Bin 0 -> 6919 bytes engine/public/logo512.png | Bin 0 -> 20558 bytes engine/public/manifest.json | 25 ++ engine/public/robots.txt | 3 + engine/src/App.tsx | 44 +++ {app => engine}/src/adapters/buttplug.ts | 0 {app => engine}/src/adapters/store.ts | 0 .../src/buttplugPlugin/ButtplugNode.tsx.off | 0 .../src/components/CollapsibleCard.tsx | 0 {app => engine}/src/components/Drawer.tsx | 0 {app => engine}/src/components/Logo.tsx | 13 +- {app => engine}/src/components/Settings.tsx | 0 {app => engine}/src/components/Typo.tsx | 0 {app => engine}/src/components/Viewport.tsx | 0 .../src/components/drawer/Entry.tsx | 0 .../src/components/graph/Graph.tsx | 0 .../src/components/input/Button.tsx | 0 .../src/components/input/Checkbox.tsx | 0 .../src/components/input/NumberInput.tsx | 0 .../src/components/input/Select.tsx | 0 .../src/components/input/TextInput.tsx | 0 .../src/components/mobile/BottomBar.tsx | 0 .../src/components/mobile/MobileView.tsx | 0 .../src/components/mobile/Welcome.tsx | 0 .../src/components/node/EditableNodeTitle.tsx | 0 .../src/components/node/NodeHandle.tsx | 0 .../src/components/node/NodeHandleLine.tsx | 0 .../node/NodeHandleValuePreview.tsx | 0 .../components/node/NodeHeaderIcons.tsx.off | 0 .../src/components/node/NodeLine.tsx | 0 .../src/components/node/NodeRenderer.tsx | 0 .../src/components/node/NodeShell.tsx | 0 .../src/components/node/nodeInputs.tsx | 0 .../components/node/preview/BooleanSnake.tsx | 0 .../node/preview/GraphNodeValuePreview.tsx | 0 .../node/preview/ImpulseNodeValuePreview.tsx | 0 .../components/settings/ButtplugSettings.tsx | 0 .../src/components/settings/FileSettings.tsx | 0 .../src/components/settings/JsonExport.tsx | 0 .../src/components/settings/Litterbox.tsx | 0 {app => engine}/src/engine/adapter.ts | 0 {app => engine}/src/engine/compiler.ts | 0 {app => engine}/src/engine/handles.ts | 0 {app => engine}/src/engine/index.ts | 0 {app => engine}/src/engine/node.ts | 0 {app => engine}/src/engine/nodeDriverStore.ts | 0 {app => engine}/src/engine/preview.ts | 0 {app => engine}/src/engine/runner.ts | 0 {app => engine}/src/engine/signal.ts | 0 {app => engine}/src/engine/store.ts | 0 .../src/hooks/useAnimationFrame.ts | 0 {app => engine}/src/hooks/useDeepDebounced.ts | 0 {app => engine}/src/hooks/useDynamicStore.ts | 0 engine/src/index.css | 16 ++ engine/src/index.tsx | 38 +++ app/src/index.tsx => engine/src/index.tsx.off | 0 {app => engine}/src/markdown.d.ts | 0 .../src/mediaPlugin/MediaFurry.tsx.off | 0 {app => engine}/src/nodes/CommentNode.tsx | 0 .../src/nodes/ConstantValueNode.tsx | 0 {app => engine}/src/nodes/CurveNode.tsx | 0 {app => engine}/src/nodes/DelayNode.tsx | 0 {app => engine}/src/nodes/EdgeDetector.tsx | 0 {app => engine}/src/nodes/HysteresisNode.tsx | 0 .../src/nodes/InputAdapterNode.tsx | 0 {app => engine}/src/nodes/MathNode.tsx | 0 {app => engine}/src/nodes/MemoryNode.tsx | 0 .../src/nodes/OutputAdapterNode.tsx | 0 {app => engine}/src/nodes/RandomNode.tsx | 0 {app => engine}/src/nodes/SwitchNode.tsx | 0 {app => engine}/src/nodes/TimerNode.tsx | 0 {app => engine}/src/nodes/ToggleNode.tsx | 0 {app => engine}/src/nodes/WaveNode.tsx | 0 {app => engine}/src/nodes/WelcomeNode.tsx | 9 +- {app => engine}/src/nodes/category.ts | 0 .../src/phoneSensorPlugin/SensorNode.tsx.off | 0 {app => engine}/src/plugin.ts | 0 {app => engine}/src/react-app-env.d.ts | 1 + {app => engine}/src/registries.ts | 0 {app => engine}/src/reportWebVitals.ts | 0 {app => engine}/src/setupTests.ts | 0 {app => engine}/src/utils/diffBy.ts | 0 {app => engine}/src/utils/notNull.ts | 0 engine/tailwind.config.js | 25 ++ engine/tsconfig.json | 4 + plugins/remote/package.json | 1 + plugins/remote/src/publish/publishStore.ts | 2 +- plugins/remote/src/remote/remoteStore.ts | 3 +- pnpm-lock.yaml | 252 +++++++++++++++++- tsconfig.base.json | 18 +- 127 files changed, 825 insertions(+), 131 deletions(-) create mode 100644 app/.eslintrc.cjs create mode 100644 app/.gitignore create mode 100644 app/README.md create mode 100644 app/index.html create mode 100644 app/public/vite.svg create mode 100644 app/src/assets/react.svg create mode 100644 app/src/main.tsx create mode 100644 app/src/vite-env.d.ts create mode 100644 app/tsconfig.node.json create mode 100644 app/vite.config.ts rename {app => engine}/.env (100%) create mode 100644 engine/build/asset-manifest.json rename {app/public => engine/build}/favicon.png (100%) rename {app/public => engine/build}/favicon.svg (100%) create mode 100644 engine/build/index.html rename {app/public => engine/build}/logo192.png (100%) rename {app/public => engine/build}/logo512.png (100%) rename {app/public => engine/build}/manifest.json (100%) rename {app/public => engine/build}/robots.txt (100%) create mode 100644 engine/build/static/css/main.af4949d1.css create mode 100644 engine/build/static/css/main.af4949d1.css.map create mode 100644 engine/build/static/js/787.d5a091f2.chunk.js create mode 100644 engine/build/static/js/787.d5a091f2.chunk.js.map create mode 100644 engine/build/static/js/main.148e1d42.js create mode 100644 engine/build/static/js/main.148e1d42.js.LICENSE.txt create mode 100644 engine/build/static/js/main.148e1d42.js.map rename {app => engine}/craco.config.js (100%) rename {app => engine}/package-lock.json (100%) create mode 100644 engine/package.json create mode 100644 engine/postcss.config.js create mode 100644 engine/public/favicon.png create mode 100644 engine/public/favicon.svg rename {app => engine}/public/index.html (100%) create mode 100644 engine/public/logo192.png create mode 100644 engine/public/logo512.png create mode 100644 engine/public/manifest.json create mode 100644 engine/public/robots.txt create mode 100644 engine/src/App.tsx rename {app => engine}/src/adapters/buttplug.ts (100%) rename {app => engine}/src/adapters/store.ts (100%) rename {app => engine}/src/buttplugPlugin/ButtplugNode.tsx.off (100%) rename {app => engine}/src/components/CollapsibleCard.tsx (100%) rename {app => engine}/src/components/Drawer.tsx (100%) rename {app => engine}/src/components/Logo.tsx (89%) rename {app => engine}/src/components/Settings.tsx (100%) rename {app => engine}/src/components/Typo.tsx (100%) rename {app => engine}/src/components/Viewport.tsx (100%) rename {app => engine}/src/components/drawer/Entry.tsx (100%) rename {app => engine}/src/components/graph/Graph.tsx (100%) rename {app => engine}/src/components/input/Button.tsx (100%) rename {app => engine}/src/components/input/Checkbox.tsx (100%) rename {app => engine}/src/components/input/NumberInput.tsx (100%) rename {app => engine}/src/components/input/Select.tsx (100%) rename {app => engine}/src/components/input/TextInput.tsx (100%) rename {app => engine}/src/components/mobile/BottomBar.tsx (100%) rename {app => engine}/src/components/mobile/MobileView.tsx (100%) rename {app => engine}/src/components/mobile/Welcome.tsx (100%) rename {app => engine}/src/components/node/EditableNodeTitle.tsx (100%) rename {app => engine}/src/components/node/NodeHandle.tsx (100%) rename {app => engine}/src/components/node/NodeHandleLine.tsx (100%) rename {app => engine}/src/components/node/NodeHandleValuePreview.tsx (100%) rename {app => engine}/src/components/node/NodeHeaderIcons.tsx.off (100%) rename {app => engine}/src/components/node/NodeLine.tsx (100%) rename {app => engine}/src/components/node/NodeRenderer.tsx (100%) rename {app => engine}/src/components/node/NodeShell.tsx (100%) rename {app => engine}/src/components/node/nodeInputs.tsx (100%) rename {app => engine}/src/components/node/preview/BooleanSnake.tsx (100%) rename {app => engine}/src/components/node/preview/GraphNodeValuePreview.tsx (100%) rename {app => engine}/src/components/node/preview/ImpulseNodeValuePreview.tsx (100%) rename {app => engine}/src/components/settings/ButtplugSettings.tsx (100%) rename {app => engine}/src/components/settings/FileSettings.tsx (100%) rename {app => engine}/src/components/settings/JsonExport.tsx (100%) rename {app => engine}/src/components/settings/Litterbox.tsx (100%) rename {app => engine}/src/engine/adapter.ts (100%) rename {app => engine}/src/engine/compiler.ts (100%) rename {app => engine}/src/engine/handles.ts (100%) rename {app => engine}/src/engine/index.ts (100%) rename {app => engine}/src/engine/node.ts (100%) rename {app => engine}/src/engine/nodeDriverStore.ts (100%) rename {app => engine}/src/engine/preview.ts (100%) rename {app => engine}/src/engine/runner.ts (100%) rename {app => engine}/src/engine/signal.ts (100%) rename {app => engine}/src/engine/store.ts (100%) rename {app => engine}/src/hooks/useAnimationFrame.ts (100%) rename {app => engine}/src/hooks/useDeepDebounced.ts (100%) rename {app => engine}/src/hooks/useDynamicStore.ts (100%) create mode 100644 engine/src/index.css create mode 100644 engine/src/index.tsx rename app/src/index.tsx => engine/src/index.tsx.off (100%) rename {app => engine}/src/markdown.d.ts (100%) rename {app => engine}/src/mediaPlugin/MediaFurry.tsx.off (100%) rename {app => engine}/src/nodes/CommentNode.tsx (100%) rename {app => engine}/src/nodes/ConstantValueNode.tsx (100%) rename {app => engine}/src/nodes/CurveNode.tsx (100%) rename {app => engine}/src/nodes/DelayNode.tsx (100%) rename {app => engine}/src/nodes/EdgeDetector.tsx (100%) rename {app => engine}/src/nodes/HysteresisNode.tsx (100%) rename {app => engine}/src/nodes/InputAdapterNode.tsx (100%) rename {app => engine}/src/nodes/MathNode.tsx (100%) rename {app => engine}/src/nodes/MemoryNode.tsx (100%) rename {app => engine}/src/nodes/OutputAdapterNode.tsx (100%) rename {app => engine}/src/nodes/RandomNode.tsx (100%) rename {app => engine}/src/nodes/SwitchNode.tsx (100%) rename {app => engine}/src/nodes/TimerNode.tsx (100%) rename {app => engine}/src/nodes/ToggleNode.tsx (100%) rename {app => engine}/src/nodes/WaveNode.tsx (100%) rename {app => engine}/src/nodes/WelcomeNode.tsx (94%) rename {app => engine}/src/nodes/category.ts (100%) rename {app => engine}/src/phoneSensorPlugin/SensorNode.tsx.off (100%) rename {app => engine}/src/plugin.ts (100%) rename {app => engine}/src/react-app-env.d.ts (66%) rename {app => engine}/src/registries.ts (100%) rename {app => engine}/src/reportWebVitals.ts (100%) rename {app => engine}/src/setupTests.ts (100%) rename {app => engine}/src/utils/diffBy.ts (100%) rename {app => engine}/src/utils/notNull.ts (100%) create mode 100644 engine/tailwind.config.js create mode 100644 engine/tsconfig.json diff --git a/app/.eslintrc.cjs b/app/.eslintrc.cjs new file mode 100644 index 0000000..d6c9537 --- /dev/null +++ b/app/.eslintrc.cjs @@ -0,0 +1,18 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parser: '@typescript-eslint/parser', + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/app/.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/app/README.md b/app/README.md new file mode 100644 index 0000000..1ebe379 --- /dev/null +++ b/app/README.md @@ -0,0 +1,27 @@ +# React + TypeScript + 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 + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + project: ['./tsconfig.json', './tsconfig.node.json'], + tsconfigRootDir: __dirname, + }, +``` + +- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked` +- Optionally add `plugin:@typescript-eslint/stylistic-type-checked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list diff --git a/app/index.html b/app/index.html new file mode 100644 index 0000000..e4b78ea --- /dev/null +++ b/app/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + TS + + +
      + + + diff --git a/app/package.json b/app/package.json index 1c0fcdf..5b3f009 100644 --- a/app/package.json +++ b/app/package.json @@ -1,72 +1,29 @@ { "name": "beadi", - "version": "0.0.3", "private": true, - "dependencies": { - "@testing-library/jest-dom": "^5.16.5", - "@testing-library/react": "^13.4.0", - "@testing-library/user-event": "^13.5.0", - "@types/jest": "^27.5.2", - "@types/node": "^16.18.3", - "@types/react": "^18.0.25", - "@types/react-dom": "^18.0.9", - "@beadi/plugin-remote": "0.0.3", - "buttplug": "=3.1.1", - "clsx": "^1.2.1", - "file-saver": "^2.0.5", - "idb": "^7.1.1", - "immer": "^9.0.19", - "lodash": "^4.17.21", - "luxon": "^3.1.1", - "react": "^18.2.0", - "react-dnd": "^16.0.1", - "react-dnd-html5-backend": "^16.0.1", - "react-dom": "^18.2.0", - "react-icons": "^4.7.1", - "react-markdown": "^8.0.4", - "react-router-dom": "^6.14.1", - "react-scripts": "5.0.1", - "reactflow": "^11.3.2", - "swr": "^2.1.0", - "typescript": "^4.9.3", - "use-debounce": "^9.0.3", - "web-vitals": "^2.1.4", - "zustand": "^4.1.4" - }, - "homepage": "https://beadi.onrender.com/", + "version": "0.0.0", + "type": "module", "scripts": { - "start": "craco start", - "build": "craco build", - "build:ci": "CI=true craco build", - "test": "craco test" + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" }, - "eslintConfig": { - "extends": [ - "react-app", - "react-app/jest" - ] - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] + "dependencies": { + "@beadi/engine": "workspace:^", + "react": "^18.2.0", + "react-dom": "^18.2.0" }, "devDependencies": { - "@craco/craco": "^7.0.0", - "@types/file-saver": "^2.0.5", - "@types/lodash": "^4.14.191", - "@types/luxon": "^3.1.0", - "autoprefixer": "^10.4.13", - "gh-pages": "^4.0.0", - "postcss": "^8.4.19", - "tailwindcss": "^3.2.4", - "wasm-loader": "^1.3.0" + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "@vitejs/plugin-react": "^4.0.3", + "eslint": "^8.45.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.3", + "typescript": "^5.0.2", + "vite": "^4.4.5" } } diff --git a/app/postcss.config.js b/app/postcss.config.js index 33ad091..2e7af2b 100644 --- a/app/postcss.config.js +++ b/app/postcss.config.js @@ -1,4 +1,4 @@ -module.exports = { +export default { plugins: { tailwindcss: {}, autoprefixer: {}, diff --git a/app/public/vite.svg b/app/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/app/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/src/App.tsx b/app/src/App.tsx index 10e189c..e3436d4 100644 --- a/app/src/App.tsx +++ b/app/src/App.tsx @@ -1,43 +1,29 @@ -import { DndProvider } from "react-dnd"; -import { HTML5Backend } from "react-dnd-html5-backend"; -import create from "zustand"; -import { immer } from "zustand/middleware/immer"; -import Drawer from "./components/Drawer"; -import { MobileView } from "./components/mobile/MobileView"; -import { Settings } from "./components/Settings"; -import Viewport from "./components/Viewport"; - -type GlobalSettings = { - mobileView: boolean; - - setMobileView: (mobile: boolean) => void; -}; -export const useGlobalSettings = create( - immer((set, get) => ({ - mobileView: window.innerWidth < 768, - setMobileView: (mobile) => { - set((state) => { - state.mobileView = mobile; - }); - }, - })) -); +import { useState } from "react"; +import reactLogo from "./assets/react.svg"; +import viteLogo from "/vite.svg"; function App() { - const mobile = useGlobalSettings((s) => s.mobileView); + const [count, setCount] = useState(0); return ( -
      - {mobile ? ( - - ) : ( - - - - - - )} -
      + <> + +

      Vite + React

      +
      + +

      + Edit src/App.tsx and save to test HMR +

      +
      +

      Click on the Vite and React logos to learn more

      + ); } diff --git a/app/src/assets/react.svg b/app/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/app/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/src/main.tsx b/app/src/main.tsx new file mode 100644 index 0000000..6d2230e --- /dev/null +++ b/app/src/main.tsx @@ -0,0 +1,16 @@ +import React from "react"; +import ReactDOM from "react-dom/client"; +import App from "./App.tsx"; +import "./index.css"; +import { startBeadi } from "@beadi/engine"; + +// ReactDOM.createRoot(document.getElementById("root")!).render( +// +// +// +// ); + +startBeadi({ + plugins: [], + rootElement: "root", +}); diff --git a/app/src/vite-env.d.ts b/app/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/app/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/app/tailwind.config.js b/app/tailwind.config.js index 055bbcb..813c1a6 100644 --- a/app/tailwind.config.js +++ b/app/tailwind.config.js @@ -1,6 +1,9 @@ /** @type {import('tailwindcss').Config} */ module.exports = { - content: ["./src/**/*.{js,jsx,ts,tsx}"], + content: [ + "./src/**/*.{js,jsx,ts,tsx}", + "./node_modules/@beadi/engine/src/**/*.{js,jsx,ts,tsx}" +], theme: { extend: { colors: { diff --git a/app/tsconfig.node.json b/app/tsconfig.node.json new file mode 100644 index 0000000..42872c5 --- /dev/null +++ b/app/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/app/vite.config.ts b/app/vite.config.ts new file mode 100644 index 0000000..dfd6469 --- /dev/null +++ b/app/vite.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; + +// https://vitejs.dev/config/ +export default defineConfig({ + define: { + BEADI_CHANGELOG: JSON.stringify("Hi"), + }, + plugins: [react()], +}); diff --git a/app/.env b/engine/.env similarity index 100% rename from app/.env rename to engine/.env diff --git a/engine/build/asset-manifest.json b/engine/build/asset-manifest.json new file mode 100644 index 0000000..4716df6 --- /dev/null +++ b/engine/build/asset-manifest.json @@ -0,0 +1,15 @@ +{ + "files": { + "main.css": "/Beadi/static/css/main.af4949d1.css", + "main.js": "/Beadi/static/js/main.148e1d42.js", + "static/js/787.d5a091f2.chunk.js": "/Beadi/static/js/787.d5a091f2.chunk.js", + "index.html": "/Beadi/index.html", + "main.af4949d1.css.map": "/Beadi/static/css/main.af4949d1.css.map", + "main.148e1d42.js.map": "/Beadi/static/js/main.148e1d42.js.map", + "787.d5a091f2.chunk.js.map": "/Beadi/static/js/787.d5a091f2.chunk.js.map" + }, + "entrypoints": [ + "static/css/main.af4949d1.css", + "static/js/main.148e1d42.js" + ] +} \ No newline at end of file diff --git a/app/public/favicon.png b/engine/build/favicon.png similarity index 100% rename from app/public/favicon.png rename to engine/build/favicon.png diff --git a/app/public/favicon.svg b/engine/build/favicon.svg similarity index 100% rename from app/public/favicon.svg rename to engine/build/favicon.svg diff --git a/engine/build/index.html b/engine/build/index.html new file mode 100644 index 0000000..ddfa641 --- /dev/null +++ b/engine/build/index.html @@ -0,0 +1 @@ +Beadi
      \ No newline at end of file diff --git a/app/public/logo192.png b/engine/build/logo192.png similarity index 100% rename from app/public/logo192.png rename to engine/build/logo192.png diff --git a/app/public/logo512.png b/engine/build/logo512.png similarity index 100% rename from app/public/logo512.png rename to engine/build/logo512.png diff --git a/app/public/manifest.json b/engine/build/manifest.json similarity index 100% rename from app/public/manifest.json rename to engine/build/manifest.json diff --git a/app/public/robots.txt b/engine/build/robots.txt similarity index 100% rename from app/public/robots.txt rename to engine/build/robots.txt diff --git a/engine/build/static/css/main.af4949d1.css b/engine/build/static/css/main.af4949d1.css new file mode 100644 index 0000000..acc9559 --- /dev/null +++ b/engine/build/static/css/main.af4949d1.css @@ -0,0 +1,6 @@ +#root,body,html{height:100vh;width:100vw} + +/* +! tailwindcss v3.2.4 | MIT License | https://tailwindcss.com +*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}html{-webkit-text-size-adjust:100%;-webkit-font-feature-settings:normal;font-feature-settings:normal;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}.markdown h1{font-size:1.25rem;line-height:1.75rem;margin-bottom:.25rem;margin-top:.5rem}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::-webkit-backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.\!static{position:static!important}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.top-0{top:0}.left-0{left:0}.bottom-0{bottom:0}.right-0{right:0}.z-50{z-index:50}.z-0{z-index:0}.z-10{z-index:10}.m-2{margin:.5rem}.m-4{margin:1rem}.m-1{margin:.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-auto{margin-left:auto;margin-right:auto}.my-auto{margin-bottom:auto;margin-top:auto}.mx-3{margin-left:.75rem;margin-right:.75rem}.my-2{margin-top:.5rem}.mb-2,.my-2{margin-bottom:.5rem}.mt-auto{margin-top:auto}.mt-0{margin-top:0}.ml-auto{margin-left:auto}.mt-8{margin-top:2rem}.mt-2{margin-top:.5rem}.\!-ml-1\.5{margin-left:-.375rem!important}.\!-ml-1{margin-left:-.25rem!important}.mr-1\.5{margin-right:.375rem}.ml-3{margin-left:.75rem}.mr-1{margin-right:.25rem}.mr-3{margin-right:.75rem}.ml-1\.5{margin-left:.375rem}.ml-1{margin-left:.25rem}.\!-mr-1\.5{margin-right:-.375rem!important}.\!-mr-1{margin-right:-.25rem!important}.mb-0{margin-bottom:0}.block{display:block}.flex{display:flex}.hidden{display:none}.aspect-square{aspect-ratio:1/1}.h-full{height:100%}.h-8{height:2rem}.h-10{height:2.5rem}.h-4{height:1rem}.h-\[10px\]{height:10px}.h-12{height:3rem}.h-6{height:1.5rem}.h-20{height:5rem}.h-3{height:.75rem}.\!h-fit{height:-webkit-fit-content!important;height:-moz-fit-content!important;height:fit-content!important}.max-h-60{max-height:15rem}.max-h-52{max-height:13rem}.max-h-56{max-height:14rem}.min-h-full{min-height:100%}.min-h-\[4em\]{min-height:4em}.w-full{width:100%}.w-60{width:15rem}.w-10{width:2.5rem}.w-96{width:24rem}.w-0{width:0}.w-\[200px\]{width:200px}.w-fit{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.w-8{width:2rem}.w-3{width:.75rem}.\!w-fit{width:-webkit-fit-content!important;width:-moz-fit-content!important;width:fit-content!important}.w-6{width:1.5rem}.min-w-0{min-width:0}.grow{flex-grow:1}.\!translate-y-0{--tw-translate-y:0px!important;-webkit-transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}@-webkit-keyframes pulse{50%{opacity:.5}}@keyframes pulse{50%{opacity:.5}}.animate-pulse{-webkit-animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite;animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.cursor-pointer{cursor:pointer}.cursor-crosshair{cursor:crosshair}.cursor-grab{cursor:grab}.cursor-ew-resize{cursor:ew-resize}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-end{align-items:flex-end}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-visible{overflow-y:visible}.overflow-y-scroll{overflow-y:scroll}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.rounded-md{border-radius:.375rem}.rounded-full{border-radius:9999px}.rounded-sm{border-radius:.125rem}.rounded-l-md{border-bottom-left-radius:.375rem}.rounded-l-md,.rounded-t-md{border-top-left-radius:.375rem}.rounded-t-md{border-top-right-radius:.375rem}.rounded-b-md{border-bottom-left-radius:.375rem;border-bottom-right-radius:.375rem}.border{border-width:1px}.border-2{border-width:2px}.\!border-none{border-style:none!important}.border-primary-700{--tw-border-opacity:1;border-color:rgb(47 42 59/var(--tw-border-opacity))}.border-primary-500{--tw-border-opacity:1;border-color:rgb(68 63 80/var(--tw-border-opacity))}.border-black{--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity))}.border-primary-800{--tw-border-opacity:1;border-color:rgb(37 32 48/var(--tw-border-opacity))}.bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity))}.bg-primary-900{--tw-bg-opacity:1;background-color:rgb(27 23 38/var(--tw-bg-opacity))}.bg-purple-400{--tw-bg-opacity:1;background-color:rgb(192 132 252/var(--tw-bg-opacity))}.bg-primary-1100{--tw-bg-opacity:1;background-color:rgb(10 8 16/var(--tw-bg-opacity))}.bg-primary-1000{--tw-bg-opacity:1;background-color:rgb(18 15 27/var(--tw-bg-opacity))}.bg-black\/90{background-color:rgba(0,0,0,.9)}.bg-transparent{background-color:initial}.bg-black\/50{background-color:rgba(0,0,0,.5)}.bg-purple-700{--tw-bg-opacity:1;background-color:rgb(126 34 206/var(--tw-bg-opacity))}.bg-primary-500{--tw-bg-opacity:1;background-color:rgb(68 63 80/var(--tw-bg-opacity))}.bg-primary-600{--tw-bg-opacity:1;background-color:rgb(57 53 70/var(--tw-bg-opacity))}.bg-blue-900{--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity))}.bg-primary-700{--tw-bg-opacity:1;background-color:rgb(47 42 59/var(--tw-bg-opacity))}.bg-red-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.\!bg-transparent{background-color:initial!important}.bg-red-800{--tw-bg-opacity:1;background-color:rgb(153 27 27/var(--tw-bg-opacity))}.fill-white{fill:#fff}.fill-none{fill:none}.fill-blue-900{fill:#1e3a8a}.stroke-white{stroke:#fff}.stroke-primary-600{stroke:#393546}.stroke-primary-800{stroke:#252030}.stroke-slate-500{stroke:#64748b}.stroke-none{stroke:none}.stroke-black{stroke:#000}.p-2{padding:.5rem}.p-1{padding:.25rem}.p-4{padding:1rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.px-4{padding-left:1rem;padding-right:1rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.pb-4{padding-bottom:1rem}.pl-2{padding-left:.5rem}.text-center{text-align:center}.text-start{text-align:start}.text-end{text-align:end}.text-xs{font-size:.75rem;line-height:1rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-2xl{font-size:1.5rem;line-height:2rem}.text-xl{font-size:1.25rem}.text-lg,.text-xl{line-height:1.75rem}.text-lg{font-size:1.125rem}.font-bold{font-weight:700}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity))}.text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.text-purple-400{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity))}.text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-inner,.shadow-sm{box-shadow:0 0 #0000,0 0 #0000,var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,.05);--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color)}.shadow-\[1px_1px_1px_0_black\]{--tw-shadow:1px 1px 1px 0 #000;--tw-shadow-colored:1px 1px 1px 0 var(--tw-shadow-color);box-shadow:0 0 #0000,0 0 #0000,var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.blur{--tw-blur:blur(8px)}.blur,.filter{-webkit-filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.focus-within\:bg-primary-1100:focus-within{--tw-bg-opacity:1;background-color:rgb(10 8 16/var(--tw-bg-opacity))}.hover\:bg-primary-800:hover{--tw-bg-opacity:1;background-color:rgb(37 32 48/var(--tw-bg-opacity))}.hover\:bg-primary-400:hover{--tw-bg-opacity:1;background-color:rgb(78 74 91/var(--tw-bg-opacity))}.hover\:bg-primary-500:hover{--tw-bg-opacity:1;background-color:rgb(68 63 80/var(--tw-bg-opacity))}.hover\:bg-primary-1100:hover{--tw-bg-opacity:1;background-color:rgb(10 8 16/var(--tw-bg-opacity))}.hover\:fill-blue-700:hover{fill:#1d4ed8}.hover\:underline:hover{text-decoration-line:underline}.hover\:focus-within\:bg-primary-1100:focus-within:hover{--tw-bg-opacity:1;background-color:rgb(10 8 16/var(--tw-bg-opacity))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.disabled\:bg-primary-500:disabled{--tw-bg-opacity:1;background-color:rgb(68 63 80/var(--tw-bg-opacity))}.disabled\:text-slate-400:disabled{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.disabled\:hover\:bg-primary-500:hover:disabled{--tw-bg-opacity:1;background-color:rgb(68 63 80/var(--tw-bg-opacity))}@media (min-width:768px){.md\:h-6{height:1.5rem}}.react-flow__container{height:100%;left:0;position:absolute;top:0;width:100%}.react-flow__pane{cursor:grab;z-index:1}.react-flow__pane.dragging{cursor:grabbing}.react-flow__viewport{pointer-events:none;-webkit-transform-origin:0 0;transform-origin:0 0;z-index:2}.react-flow__renderer{z-index:4}.react-flow__selectionpane{z-index:5}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow .react-flow__edges{overflow:visible;pointer-events:none}.react-flow__connection-path,.react-flow__edge-path{stroke:#b1b1b7;stroke-width:1;fill:none}.react-flow__edge{cursor:pointer;pointer-events:visibleStroke}.react-flow__edge.animated path{stroke-dasharray:5;-webkit-animation:dashdraw .5s linear infinite;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;-webkit-animation:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge:focus .react-flow__edge-path,.react-flow__edge:focus-visible .react-flow__edge-path{stroke:#555}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge-textbg{fill:#fff}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;user-select:none}.react-flow__connection{pointer-events:none}.react-flow__connection.animated{stroke-dasharray:5;-webkit-animation:dashdraw .5s linear infinite;animation:dashdraw .5s linear infinite}.react-flow__connectionline{z-index:1001}.react-flow__nodes{pointer-events:none}.react-flow__node,.react-flow__nodes{-webkit-transform-origin:0 0;transform-origin:0 0}.react-flow__node{box-sizing:border-box;cursor:grab;pointer-events:all;position:absolute;-webkit-user-select:none;user-select:none}.react-flow__node.dragging{cursor:grabbing}.react-flow__nodesselection{pointer-events:none;-webkit-transform-origin:left top;transform-origin:left top;z-index:3}.react-flow__nodesselection-rect{cursor:grab;pointer-events:all;position:absolute}.react-flow__handle{background:#1a192b;border:1px solid #fff;border-radius:100%;height:6px;min-height:5px;min-width:5px;pointer-events:none;position:absolute;width:6px}.react-flow__handle.connectable{cursor:crosshair;pointer-events:all}.react-flow__handle-bottom{bottom:-4px;top:auto}.react-flow__handle-bottom,.react-flow__handle-top{left:50%;-webkit-transform:translate(-50%);transform:translate(-50%)}.react-flow__handle-top{top:-4px}.react-flow__handle-left{left:-4px}.react-flow__handle-left,.react-flow__handle-right{top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.react-flow__handle-right{right:-4px}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__panel{margin:15px;position:absolute;z-index:5}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.center{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.react-flow__attribution{background:hsla(0,0%,100%,.5);font-size:10px;margin:0;padding:2px 3px}.react-flow__attribution a{color:#999;text-decoration:none}@-webkit-keyframes dashdraw{0%{stroke-dashoffset:10}}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{height:100%;pointer-events:none;position:absolute;width:100%}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node-default,.react-flow__node-group,.react-flow__node-input,.react-flow__node-output{background-color:#fff;border:1px solid #1a192b;border-radius:3px;color:#222;font-size:12px;padding:10px;text-align:center;width:150px}.react-flow__node-default.selectable:hover,.react-flow__node-group.selectable:hover,.react-flow__node-input.selectable:hover,.react-flow__node-output.selectable:hover{box-shadow:0 1px 4px 1px rgba(0,0,0,.08)}.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible,.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible{box-shadow:0 0 0 .5px #1a192b;outline:none}.react-flow__node-group{background-color:hsla(0,0%,94%,.25)}.react-flow__nodesselection-rect,.react-flow__selection{background:rgba(0,89,220,.08);border:1px dotted rgba(0,89,220,.8)}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls{box-shadow:0 0 2px 1px rgba(0,0,0,.08)}.react-flow__controls-button{align-items:center;background:#fefefe;border:none;border-bottom:1px solid #eee;box-sizing:initial;cursor:pointer;display:flex;height:16px;justify-content:center;padding:5px;-webkit-user-select:none;user-select:none;width:16px}.react-flow__controls-button:hover{background:#f4f4f4}.react-flow__controls-button svg{max-height:12px;max-width:12px;width:100%}.react-flow__minimap{background-color:#fff} +/*# sourceMappingURL=main.af4949d1.css.map*/ \ No newline at end of file diff --git a/engine/build/static/css/main.af4949d1.css.map b/engine/build/static/css/main.af4949d1.css.map new file mode 100644 index 0000000..8653d00 --- /dev/null +++ b/engine/build/static/css/main.af4949d1.css.map @@ -0,0 +1 @@ +{"version":3,"file":"static/css/main.af4949d1.css","mappings":"AAAA,gBAGE,YAAa,CACb,WACF;;AAEA;;CAAc,CAAd,uCAAc,CAAd,qBAAc,CAAd,8BAAc,CAAd,kCAAc,CAAd,oCAAc,CAAd,4BAAc,CAAd,gMAAc,CAAd,eAAc,CAAd,UAAc,CAAd,wBAAc,CAAd,QAAc,CAAd,uBAAc,CAAd,aAAc,CAAd,QAAc,CAAd,4DAAc,CAAd,gCAAc,CAAd,mCAAc,CAAd,mBAAc,CAAd,eAAc,CAAd,uBAAc,CAAd,2BAAc,CAAd,qHAAc,CAAd,aAAc,CAAd,mBAAc,CAAd,qBAAc,CAAd,aAAc,CAAd,iBAAc,CAAd,sBAAc,CAAd,iBAAc,CAAd,aAAc,CAAd,8BAAc,CAAd,oBAAc,CAAd,aAAc,CAAd,mDAAc,CAAd,mBAAc,CAAd,cAAc,CAAd,mBAAc,CAAd,mBAAc,CAAd,QAAc,CAAd,SAAc,CAAd,iCAAc,CAAd,yEAAc,CAAd,wBAAc,CAAd,qBAAc,CAAd,4BAAc,CAAd,gCAAc,CAAd,+BAAc,CAAd,mEAAc,CAAd,0CAAc,CAAd,mBAAc,CAAd,mDAAc,CAAd,sDAAc,CAAd,YAAc,CAAd,yBAAc,CAAd,2DAAc,CAAd,iBAAc,CAAd,yBAAc,CAAd,0BAAc,CAAd,QAAc,CAAd,SAAc,CAAd,wBAAc,CAAd,kFAAc,CAAd,SAAc,CAAd,sDAAc,CAAd,SAAc,CAAd,mCAAc,CAAd,wBAAc,CAAd,4DAAc,CAAd,qBAAc,CAAd,qBAAc,CAAd,cAAc,CAAd,qBAAc,CAAd,8BAAc,CAAd,wCAAc,CAAd,gBAAc,CAAd,wCAAc,CAAd,uBAAc,CAAd,kBAAc,CAAd,kBAAc,CAAd,aAAc,CAAd,aAAc,CAAd,aAAc,CAAd,cAAc,CAAd,cAAc,CAAd,YAAc,CAAd,YAAc,CAAd,iBAAc,CAAd,qCAAc,CAAd,cAAc,CAAd,mBAAc,CAAd,qBAAc,CAAd,sBAAc,CAAd,uBAAc,CAAd,iBAAc,CAAd,0BAAc,CAAd,2BAAc,CAAd,mCAAc,CAAd,iCAAc,CAAd,0BAAc,CAAd,qBAAc,CAAd,6BAAc,CAAd,WAAc,CAAd,iBAAc,CAAd,eAAc,CAAd,gBAAc,CAAd,iBAAc,CAAd,aAAc,CAAd,eAAc,CAAd,YAAc,CAAd,kBAAc,CAAd,oBAAc,CAAd,0BAAc,CAAd,wBAAc,CAAd,yBAAc,CAAd,0BAAc,CAAd,sBAAc,CAAd,uBAAc,CAAd,wBAAc,CAAd,qBAAc,CAAd,0CAAc,CAAd,uBAAc,CAAd,kBAAc,CAAd,kBAAc,CAAd,aAAc,CAAd,aAAc,CAAd,aAAc,CAAd,cAAc,CAAd,cAAc,CAAd,YAAc,CAAd,YAAc,CAAd,iBAAc,CAAd,qCAAc,CAAd,cAAc,CAAd,mBAAc,CAAd,qBAAc,CAAd,sBAAc,CAAd,uBAAc,CAAd,iBAAc,CAAd,0BAAc,CAAd,2BAAc,CAAd,mCAAc,CAAd,iCAAc,CAAd,0BAAc,CAAd,qBAAc,CAAd,6BAAc,CAAd,WAAc,CAAd,iBAAc,CAAd,eAAc,CAAd,gBAAc,CAAd,iBAAc,CAAd,aAAc,CAAd,eAAc,CAAd,YAAc,CAAd,kBAAc,CAAd,oBAAc,CAAd,0BAAc,CAAd,wBAAc,CAAd,yBAAc,CAAd,0BAAc,CAAd,sBAAc,CAAd,uBAAc,CAAd,wBAAc,CAAd,qBAAc,CAAd,kCAAc,CAAd,uBAAc,CAAd,kBAAc,CAAd,kBAAc,CAAd,aAAc,CAAd,aAAc,CAAd,aAAc,CAAd,cAAc,CAAd,cAAc,CAAd,YAAc,CAAd,YAAc,CAAd,iBAAc,CAAd,qCAAc,CAAd,cAAc,CAAd,mBAAc,CAAd,qBAAc,CAAd,sBAAc,CAAd,uBAAc,CAAd,iBAAc,CAAd,0BAAc,CAAd,2BAAc,CAAd,mCAAc,CAAd,iCAAc,CAAd,0BAAc,CAAd,qBAAc,CAAd,6BAAc,CAAd,WAAc,CAAd,iBAAc,CAAd,eAAc,CAAd,gBAAc,CAAd,iBAAc,CAAd,aAAc,CAAd,eAAc,CAAd,YAAc,CAAd,kBAAc,CAAd,oBAAc,CAAd,0BAAc,CAAd,wBAAc,CAAd,yBAAc,CAAd,0BAAc,CAAd,sBAAc,CAAd,uBAAc,CAAd,wBAAc,CAAd,qBAAc,CAEd,wCAAmB,CAAnB,wCAAmB,CAAnB,2BAAmB,CAAnB,mCAAmB,CAAnB,qBAAmB,CAAnB,2BAAmB,CAAnB,2BAAmB,CAAnB,YAAmB,CAAnB,cAAmB,CAAnB,kBAAmB,CAAnB,gBAAmB,CAAnB,gBAAmB,CAAnB,cAAmB,CAAnB,gBAAmB,CAAnB,iBAAmB,CAAnB,gBAAmB,CAAnB,kBAAmB,CAAnB,uBAAmB,CAAnB,kBAAmB,CAAnB,yBAAmB,CAAnB,iBAAmB,CAAnB,2CAAmB,CAAnB,wBAAmB,CAAnB,mBAAmB,CAAnB,sBAAmB,CAAnB,+BAAmB,CAAnB,wBAAmB,CAAnB,kBAAmB,CAAnB,yBAAmB,CAAnB,qBAAmB,CAAnB,sBAAmB,CAAnB,0CAAmB,CAAnB,sCAAmB,CAAnB,6BAAmB,CAAnB,wBAAmB,CAAnB,yBAAmB,CAAnB,yBAAmB,CAAnB,4BAAmB,CAAnB,wBAAmB,CAAnB,2CAAmB,CAAnB,uCAAmB,CAAnB,qBAAmB,CAAnB,oBAAmB,CAAnB,kBAAmB,CAAnB,oBAAmB,CAAnB,+BAAmB,CAAnB,mBAAmB,CAAnB,gBAAmB,CAAnB,mBAAmB,CAAnB,gBAAmB,CAAnB,uBAAmB,CAAnB,iBAAmB,CAAnB,kBAAmB,CAAnB,iBAAmB,CAAnB,kBAAmB,CAAnB,6CAAmB,CAAnB,iCAAmB,CAAnB,4BAAmB,CAAnB,0BAAmB,CAAnB,0BAAmB,CAAnB,0BAAmB,CAAnB,2BAAmB,CAAnB,6BAAmB,CAAnB,kBAAmB,CAAnB,iBAAmB,CAAnB,kBAAmB,CAAnB,iBAAmB,CAAnB,YAAmB,CAAnB,wBAAmB,CAAnB,gCAAmB,CAAnB,sBAAmB,CAAnB,iBAAmB,CAAnB,eAAmB,CAAnB,iBAAmB,CAAnB,4CAAmB,CAAnB,gCAAmB,CAAnB,2BAAmB,CAAnB,iBAAmB,CAAnB,oBAAmB,CAAnB,iBAAmB,CAAnB,+CAAmB,CAAnB,+MAAmB,CAAnB,uMAAmB,CAAnB,uCAAmB,EAAnB,+BAAmB,EAAnB,0EAAmB,CAAnB,mDAAmB,CAAnB,8BAAmB,CAAnB,kCAAmB,CAAnB,wBAAmB,CAAnB,kCAAmB,CAAnB,4BAAmB,CAAnB,+BAAmB,CAAnB,yBAAmB,CAAnB,+BAAmB,CAAnB,gCAAmB,CAAnB,kCAAmB,CAAnB,yCAAmB,CAAnB,qCAAmB,CAAnB,sCAAmB,CAAnB,iBAAmB,CAAnB,gBAAmB,CAAnB,gCAAmB,CAAnB,kCAAmB,CAAnB,gCAAmB,CAAnB,oCAAmB,CAAnB,sCAAmB,CAAnB,oCAAmB,CAAnB,qCAAmB,CAAnB,qCAAmB,CAAnB,iCAAmB,CAAnB,kCAAmB,CAAnB,iCAAmB,CAAnB,+CAAmB,CAAnB,0DAAmB,CAAnB,6CAAmB,CAAnB,kFAAmB,CAAnB,wBAAmB,CAAnB,0BAAmB,CAAnB,0CAAmB,CAAnB,yCAAmB,CAAnB,mDAAmB,CAAnB,yCAAmB,CAAnB,mDAAmB,CAAnB,mCAAmB,CAAnB,gDAAmB,CAAnB,yCAAmB,CAAnB,mDAAmB,CAAnB,2BAAmB,CAAnB,gDAAmB,CAAnB,iCAAmB,CAAnB,mDAAmB,CAAnB,gCAAmB,CAAnB,sDAAmB,CAAnB,kCAAmB,CAAnB,kDAAmB,CAAnB,kCAAmB,CAAnB,mDAAmB,CAAnB,6CAAmB,CAAnB,wCAAmB,CAAnB,6CAAmB,CAAnB,gCAAmB,CAAnB,qDAAmB,CAAnB,iCAAmB,CAAnB,mDAAmB,CAAnB,iCAAmB,CAAnB,mDAAmB,CAAnB,8BAAmB,CAAnB,oDAAmB,CAAnB,iCAAmB,CAAnB,mDAAmB,CAAnB,6BAAmB,CAAnB,oDAAmB,CAAnB,oDAAmB,CAAnB,6BAAmB,CAAnB,oDAAmB,CAAnB,qBAAmB,CAAnB,oBAAmB,CAAnB,2BAAmB,CAAnB,yBAAmB,CAAnB,kCAAmB,CAAnB,kCAAmB,CAAnB,gCAAmB,CAAnB,wBAAmB,CAAnB,yBAAmB,CAAnB,kBAAmB,CAAnB,mBAAmB,CAAnB,iBAAmB,CAAnB,wBAAmB,CAAnB,mBAAmB,CAAnB,8CAAmB,CAAnB,uBAAmB,CAAnB,kBAAmB,CAAnB,4CAAmB,CAAnB,yBAAmB,CAAnB,oBAAmB,CAAnB,yBAAmB,CAAnB,wBAAmB,CAAnB,8BAAmB,CAAnB,4BAAmB,CAAnB,wBAAmB,CAAnB,yBAAmB,CAAnB,gBAAmB,CAAnB,0BAAmB,CAAnB,mBAAmB,CAAnB,4BAAmB,CAAnB,mBAAmB,CAAnB,0BAAmB,CAAnB,gBAAmB,CAAnB,0BAAmB,CAAnB,qCAAmB,CAAnB,2BAAmB,CAAnB,0BAAmB,CAAnB,+BAAmB,CAAnB,6CAAmB,CAAnB,+BAAmB,CAAnB,uCAAmB,CAAnB,mCAAmB,CAAnB,6CAAmB,CAAnB,oCAAmB,CAAnB,6CAAmB,CAAnB,iCAAmB,CAAnB,6CAAmB,CAAnB,yCAAmB,CAAnB,oBAAmB,CAAnB,kDAAmB,CAAnB,sDAAmB,CAAnB,wEAAmB,CAAnB,kGAAmB,CAAnB,2DAAmB,CAAnB,4DAAmB,CAAnB,8DAAmB,CAAnB,wDAAmB,CAAnB,+CAAmB,CAAnB,kGAAmB,CAAnB,2CAAmB,CAAnB,kBAAmB,CAAnB,yBAAmB,CAAnB,sMAAmB,CAAnB,gLAAmB,CAAnB,gEAAmB,CAAnB,kDAAmB,CATnB,gH,CAAA,kG,CAAA,kG,CAAA,kG,CAAA,kG,CAAA,wC,CAAA,sD,CAAA,6H,CAAA,2E,CAAA,wG,CAAA,oG,CAAA,qH,CAAA,+C,ECEA,uBAGE,WAAY,CAEZ,MAAO,CAJP,iBAAkB,CAGlB,KAAM,CAFN,UAIF,CACA,kBAGE,WAAY,CAFZ,SAGF,CACA,2BAEI,eACF,CACF,sBAGE,mBAAoB,CAFpB,4BAAqB,CAArB,oBAAqB,CACrB,SAEF,CACA,sBACE,SACF,CACA,2BACE,SACF,CACA,sFAEE,YACF,CACA,+BAEE,gBAAiB,CADjB,mBAEF,CACA,oDAEE,cAAe,CACf,cAAe,CACf,SACF,CACA,kBAEE,cAAe,CADf,4BAEF,CACA,gCACI,kBAAmB,CACnB,8CAAgD,CACxC,sCACV,CACF,6DACI,qBAAsB,CACtB,sBAAuB,CACf,cACV,CACF,2BACI,mBACF,CACF,mFAGI,YACF,CACF,wJAGI,WACF,CACF,8BACI,kBACF,CACF,yBACI,SACF,CACF,yCACI,mBAAoB,CACpB,wBAAyB,CAEjB,gBACV,CACF,wBACE,mBACF,CACA,iCACI,kBAAmB,CACnB,8CAAgD,CACxC,sCACV,CACF,4BACE,YACF,CACA,mBACE,mBAEF,CACA,qCAFE,4BAAqB,CAArB,oBAYF,CAVA,kBAOE,qBAAsB,CAEtB,WAAY,CAJZ,kBAAmB,CAJnB,iBAAkB,CAClB,wBAAyB,CAEjB,gBAMV,CACA,2BAEI,eACF,CACF,4BAGE,mBAAoB,CADpB,iCAA0B,CAA1B,yBAA0B,CAD1B,SAGF,CACA,iCAII,WAAY,CAFZ,kBAAmB,CADnB,iBAIF,CACF,oBAOE,kBAAmB,CACnB,qBAAuB,CACvB,kBAAmB,CAHnB,UAAW,CAFX,cAAe,CADf,aAAc,CADd,mBAAoB,CADpB,iBAAkB,CAIlB,SAKF,CACA,gCAEI,gBAAiB,CADjB,kBAEF,CACF,2BAGI,WAAY,CAFZ,QAIF,CACF,mDAJI,QAAS,CAET,iCAA6B,CAA7B,yBAMF,CAJF,wBAEI,QAEF,CACF,yBAEI,SAEF,CACF,mDAJI,OAAQ,CAER,kCAA6B,CAA7B,0BAMF,CAJF,0BACI,UAGF,CACF,yBACE,WAAY,CACZ,kBACF,CACA,mBAGE,WAAY,CAFZ,iBAAkB,CAClB,SAEF,CACA,uBACI,KACF,CACF,0BACI,QACF,CACF,wBACI,MACF,CACF,yBACI,OACF,CACF,0BACI,QAAS,CACT,kCAA2B,CAA3B,0BACF,CACF,yBAEE,6BAAoC,CADpC,cAAe,CAGf,QAAS,CADT,eAEF,CACA,2BAEI,UAAW,CADX,oBAEF,CACF,4BACE,GACE,oBACF,CACF,CACA,oBACE,GACE,oBACF,CACF,CACA,gCAGE,WAAY,CACZ,mBAAoB,CAHpB,iBAAkB,CAClB,UAGF,CACA,kDACM,WACF,CACJ,uBACI,cACF,CACF,mGAaE,qBAAuB,CADvB,wBAAqB,CAPrB,iBAAkB,CAGlB,UAAW,CADX,cAAe,CAHf,YAAa,CAKb,iBAAkB,CAHlB,WAQF,CACA,uKACM,wCACF,CACJ,iiBAYM,6BAA+B,CAC/B,YACF,CACJ,wBACE,mCACF,CACA,wDAEE,6BAAkC,CAClC,mCACF,CACA,wJAII,YACF,CACF,sBACE,sCACF,CACA,6BAOI,kBAAmB,CALnB,kBAAmB,CACnB,WAA6B,CAA7B,4BAA6B,CAC7B,kBAAuB,CAMvB,cAAe,CALf,YAAa,CAIb,WAAY,CAHZ,sBAAuB,CAQvB,WAAY,CAHZ,wBAAyB,CAEjB,gBAAiB,CALzB,UAOF,CACF,mCACM,kBACF,CACJ,iCAGM,eAAgB,CADhB,cAAe,CADf,UAGF,CACJ,qBACE,qBACF","sources":["index.css","../node_modules/reactflow/dist/style.css"],"sourcesContent":["html,\nbody,\n#root {\n height: 100vh;\n width: 100vw;\n}\n\n@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n@layer base {\n .markdown h1 {\n @apply text-xl mt-2 mb-1;\n }\n}\n","/* this gets exported as style.css and can be used for the default theming */\n/* these are the necessary styles for React Flow, they get used by base.css and style.css */\n.react-flow__container {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n}\n.react-flow__pane {\n z-index: 1;\n cursor: -webkit-grab;\n cursor: grab;\n}\n.react-flow__pane.dragging {\n cursor: -webkit-grabbing;\n cursor: grabbing;\n }\n.react-flow__viewport {\n transform-origin: 0 0;\n z-index: 2;\n pointer-events: none;\n}\n.react-flow__renderer {\n z-index: 4;\n}\n.react-flow__selectionpane {\n z-index: 5;\n}\n.react-flow__nodesselection-rect:focus,\n.react-flow__nodesselection-rect:focus-visible {\n outline: none;\n}\n.react-flow .react-flow__edges {\n pointer-events: none;\n overflow: visible;\n}\n.react-flow__edge-path,\n.react-flow__connection-path {\n stroke: #b1b1b7;\n stroke-width: 1;\n fill: none;\n}\n.react-flow__edge {\n pointer-events: visibleStroke;\n cursor: pointer;\n}\n.react-flow__edge.animated path {\n stroke-dasharray: 5;\n -webkit-animation: dashdraw 0.5s linear infinite;\n animation: dashdraw 0.5s linear infinite;\n }\n.react-flow__edge.animated path.react-flow__edge-interaction {\n stroke-dasharray: none;\n -webkit-animation: none;\n animation: none;\n }\n.react-flow__edge.inactive {\n pointer-events: none;\n }\n.react-flow__edge.selected,\n .react-flow__edge:focus,\n .react-flow__edge:focus-visible {\n outline: none;\n }\n.react-flow__edge.selected .react-flow__edge-path,\n .react-flow__edge:focus .react-flow__edge-path,\n .react-flow__edge:focus-visible .react-flow__edge-path {\n stroke: #555;\n }\n.react-flow__edge-textwrapper {\n pointer-events: all;\n }\n.react-flow__edge-textbg {\n fill: white;\n }\n.react-flow__edge .react-flow__edge-text {\n pointer-events: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n }\n.react-flow__connection {\n pointer-events: none;\n}\n.react-flow__connection.animated {\n stroke-dasharray: 5;\n -webkit-animation: dashdraw 0.5s linear infinite;\n animation: dashdraw 0.5s linear infinite;\n }\n.react-flow__connectionline {\n z-index: 1001;\n}\n.react-flow__nodes {\n pointer-events: none;\n transform-origin: 0 0;\n}\n.react-flow__node {\n position: absolute;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n pointer-events: all;\n transform-origin: 0 0;\n box-sizing: border-box;\n cursor: -webkit-grab;\n cursor: grab;\n}\n.react-flow__node.dragging {\n cursor: -webkit-grabbing;\n cursor: grabbing;\n }\n.react-flow__nodesselection {\n z-index: 3;\n transform-origin: left top;\n pointer-events: none;\n}\n.react-flow__nodesselection-rect {\n position: absolute;\n pointer-events: all;\n cursor: -webkit-grab;\n cursor: grab;\n }\n.react-flow__handle {\n position: absolute;\n pointer-events: none;\n min-width: 5px;\n min-height: 5px;\n width: 6px;\n height: 6px;\n background: #1a192b;\n border: 1px solid white;\n border-radius: 100%;\n}\n.react-flow__handle.connectable {\n pointer-events: all;\n cursor: crosshair;\n }\n.react-flow__handle-bottom {\n top: auto;\n left: 50%;\n bottom: -4px;\n transform: translate(-50%, 0);\n }\n.react-flow__handle-top {\n left: 50%;\n top: -4px;\n transform: translate(-50%, 0);\n }\n.react-flow__handle-left {\n top: 50%;\n left: -4px;\n transform: translate(0, -50%);\n }\n.react-flow__handle-right {\n right: -4px;\n top: 50%;\n transform: translate(0, -50%);\n }\n.react-flow__edgeupdater {\n cursor: move;\n pointer-events: all;\n}\n.react-flow__panel {\n position: absolute;\n z-index: 5;\n margin: 15px;\n}\n.react-flow__panel.top {\n top: 0;\n }\n.react-flow__panel.bottom {\n bottom: 0;\n }\n.react-flow__panel.left {\n left: 0;\n }\n.react-flow__panel.right {\n right: 0;\n }\n.react-flow__panel.center {\n left: 50%;\n transform: translateX(-50%);\n }\n.react-flow__attribution {\n font-size: 10px;\n background: rgba(255, 255, 255, 0.5);\n padding: 2px 3px;\n margin: 0;\n}\n.react-flow__attribution a {\n text-decoration: none;\n color: #999;\n }\n@-webkit-keyframes dashdraw {\n from {\n stroke-dashoffset: 10;\n }\n}\n@keyframes dashdraw {\n from {\n stroke-dashoffset: 10;\n }\n}\n.react-flow__edgelabel-renderer {\n position: absolute;\n width: 100%;\n height: 100%;\n pointer-events: none;\n}\n.react-flow__edge.updating .react-flow__edge-path {\n stroke: #777;\n }\n.react-flow__edge-text {\n font-size: 10px;\n }\n.react-flow__node-default,\n.react-flow__node-input,\n.react-flow__node-output,\n.react-flow__node-group {\n padding: 10px;\n border-radius: 3px;\n width: 150px;\n font-size: 12px;\n color: #222;\n text-align: center;\n border-width: 1px;\n border-style: solid;\n border-color: #1a192b;\n background-color: white;\n}\n.react-flow__node-default.selectable:hover, .react-flow__node-input.selectable:hover, .react-flow__node-output.selectable:hover, .react-flow__node-group.selectable:hover {\n box-shadow: 0 1px 4px 1px rgba(0, 0, 0, 0.08);\n }\n.react-flow__node-default.selectable.selected,\n .react-flow__node-default.selectable:focus,\n .react-flow__node-default.selectable:focus-visible,\n .react-flow__node-input.selectable.selected,\n .react-flow__node-input.selectable:focus,\n .react-flow__node-input.selectable:focus-visible,\n .react-flow__node-output.selectable.selected,\n .react-flow__node-output.selectable:focus,\n .react-flow__node-output.selectable:focus-visible,\n .react-flow__node-group.selectable.selected,\n .react-flow__node-group.selectable:focus,\n .react-flow__node-group.selectable:focus-visible {\n box-shadow: 0 0 0 0.5px #1a192b;\n outline: none;\n }\n.react-flow__node-group {\n background-color: rgba(240, 240, 240, 0.25);\n}\n.react-flow__nodesselection-rect,\n.react-flow__selection {\n background: rgba(0, 89, 220, 0.08);\n border: 1px dotted rgba(0, 89, 220, 0.8);\n}\n.react-flow__nodesselection-rect:focus,\n .react-flow__nodesselection-rect:focus-visible,\n .react-flow__selection:focus,\n .react-flow__selection:focus-visible {\n outline: none;\n }\n.react-flow__controls {\n box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.08);\n}\n.react-flow__controls-button {\n border: none;\n background: #fefefe;\n border-bottom: 1px solid #eee;\n box-sizing: content-box;\n display: flex;\n justify-content: center;\n align-items: center;\n width: 16px;\n height: 16px;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n padding: 5px;\n }\n.react-flow__controls-button:hover {\n background: #f4f4f4;\n }\n.react-flow__controls-button svg {\n width: 100%;\n max-width: 12px;\n max-height: 12px;\n }\n.react-flow__minimap {\n background-color: #fff;\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/engine/build/static/js/787.d5a091f2.chunk.js b/engine/build/static/js/787.d5a091f2.chunk.js new file mode 100644 index 0000000..1c0f676 --- /dev/null +++ b/engine/build/static/js/787.d5a091f2.chunk.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunkbeadi=self.webpackChunkbeadi||[]).push([[787],{787:function(e,t,n){n.r(t),n.d(t,{getCLS:function(){return y},getFCP:function(){return g},getFID:function(){return C},getLCP:function(){return P},getTTFB:function(){return D}});var i,r,a,o,u=function(e,t){return{name:e,value:void 0===t?-1:t,delta:0,entries:[],id:"v2-".concat(Date.now(),"-").concat(Math.floor(8999999999999*Math.random())+1e12)}},c=function(e,t){try{if(PerformanceObserver.supportedEntryTypes.includes(e)){if("first-input"===e&&!("PerformanceEventTiming"in self))return;var n=new PerformanceObserver((function(e){return e.getEntries().map(t)}));return n.observe({type:e,buffered:!0}),n}}catch(e){}},f=function(e,t){var n=function n(i){"pagehide"!==i.type&&"hidden"!==document.visibilityState||(e(i),t&&(removeEventListener("visibilitychange",n,!0),removeEventListener("pagehide",n,!0)))};addEventListener("visibilitychange",n,!0),addEventListener("pagehide",n,!0)},s=function(e){addEventListener("pageshow",(function(t){t.persisted&&e(t)}),!0)},m=function(e,t,n){var i;return function(r){t.value>=0&&(r||n)&&(t.delta=t.value-(i||0),(t.delta||void 0===i)&&(i=t.value,e(t)))}},v=-1,d=function(){return"hidden"===document.visibilityState?0:1/0},p=function(){f((function(e){var t=e.timeStamp;v=t}),!0)},l=function(){return v<0&&(v=d(),p(),s((function(){setTimeout((function(){v=d(),p()}),0)}))),{get firstHiddenTime(){return v}}},g=function(e,t){var n,i=l(),r=u("FCP"),a=function(e){"first-contentful-paint"===e.name&&(f&&f.disconnect(),e.startTime-1&&e(t)},r=u("CLS",0),a=0,o=[],v=function(e){if(!e.hadRecentInput){var t=o[0],i=o[o.length-1];a&&e.startTime-i.startTime<1e3&&e.startTime-t.startTime<5e3?(a+=e.value,o.push(e)):(a=e.value,o=[e]),a>r.value&&(r.value=a,r.entries=o,n())}},d=c("layout-shift",v);d&&(n=m(i,r,t),f((function(){d.takeRecords().map(v),n(!0)})),s((function(){a=0,T=-1,r=u("CLS",0),n=m(i,r,t)})))},E={passive:!0,capture:!0},w=new Date,L=function(e,t){i||(i=t,r=e,a=new Date,F(removeEventListener),S())},S=function(){if(r>=0&&r1e12?new Date:performance.now())-e.timeStamp;"pointerdown"==e.type?function(e,t){var n=function(){L(e,t),r()},i=function(){r()},r=function(){removeEventListener("pointerup",n,E),removeEventListener("pointercancel",i,E)};addEventListener("pointerup",n,E),addEventListener("pointercancel",i,E)}(t,e):L(t,e)}},F=function(e){["mousedown","keydown","touchstart","pointerdown"].forEach((function(t){return e(t,b,E)}))},C=function(e,t){var n,a=l(),v=u("FID"),d=function(e){e.startTimeperformance.now())return;n.entries=[t],e(n)}catch(e){}},"complete"===document.readyState?setTimeout(t,0):addEventListener("load",(function(){return setTimeout(t,0)}))}}}]); +//# sourceMappingURL=787.d5a091f2.chunk.js.map \ No newline at end of file diff --git a/engine/build/static/js/787.d5a091f2.chunk.js.map b/engine/build/static/js/787.d5a091f2.chunk.js.map new file mode 100644 index 0000000..03b83c9 --- /dev/null +++ b/engine/build/static/js/787.d5a091f2.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"static/js/787.d5a091f2.chunk.js","mappings":"+PAAA,IAAIA,EAAEC,EAAEC,EAAEC,EAAEC,EAAE,SAASJ,EAAEC,GAAG,MAAM,CAACI,KAAKL,EAAEM,WAAM,IAASL,GAAG,EAAEA,EAAEM,MAAM,EAAEC,QAAQ,GAAGC,GAAG,MAAMC,OAAOC,KAAKC,MAAM,KAAKF,OAAOG,KAAKC,MAAM,cAAcD,KAAKE,UAAU,MAAM,EAAEC,EAAE,SAAShB,EAAEC,GAAG,IAAI,GAAGgB,oBAAoBC,oBAAoBC,SAASnB,GAAG,CAAC,GAAG,gBAAgBA,KAAK,2BAA2BoB,MAAM,OAAO,IAAIlB,EAAE,IAAIe,qBAAqB,SAASjB,GAAG,OAAOA,EAAEqB,aAAaC,IAAIrB,EAAE,IAAI,OAAOC,EAAEqB,QAAQ,CAACC,KAAKxB,EAAEyB,UAAS,IAAKvB,CAAC,CAAW,CAAT,MAAMF,GAAG,CAAC,EAAE0B,EAAE,SAAS1B,EAAEC,GAAG,IAAIC,EAAE,SAASA,EAAEC,GAAG,aAAaA,EAAEqB,MAAM,WAAWG,SAASC,kBAAkB5B,EAAEG,GAAGF,IAAI4B,oBAAoB,mBAAmB3B,GAAE,GAAI2B,oBAAoB,WAAW3B,GAAE,IAAK,EAAE4B,iBAAiB,mBAAmB5B,GAAE,GAAI4B,iBAAiB,WAAW5B,GAAE,EAAG,EAAE6B,EAAE,SAAS/B,GAAG8B,iBAAiB,YAAY,SAAS7B,GAAGA,EAAE+B,WAAWhC,EAAEC,EAAE,IAAG,EAAG,EAAEgC,EAAE,SAASjC,EAAEC,EAAEC,GAAG,IAAIC,EAAE,OAAO,SAASC,GAAGH,EAAEK,OAAO,IAAIF,GAAGF,KAAKD,EAAEM,MAAMN,EAAEK,OAAOH,GAAG,IAAIF,EAAEM,YAAO,IAASJ,KAAKA,EAAEF,EAAEK,MAAMN,EAAEC,IAAI,CAAC,EAAEiC,GAAG,EAAEC,EAAE,WAAW,MAAM,WAAWR,SAASC,gBAAgB,EAAE,GAAG,EAAEQ,EAAE,WAAWV,GAAG,SAAS1B,GAAG,IAAIC,EAAED,EAAEqC,UAAUH,EAAEjC,CAAC,IAAG,EAAG,EAAEqC,EAAE,WAAW,OAAOJ,EAAE,IAAIA,EAAEC,IAAIC,IAAIL,GAAG,WAAWQ,YAAY,WAAWL,EAAEC,IAAIC,GAAG,GAAG,EAAE,KAAK,CAAKI,sBAAkB,OAAON,CAAC,EAAE,EAAEO,EAAE,SAASzC,EAAEC,GAAG,IAAIC,EAAEC,EAAEmC,IAAIZ,EAAEtB,EAAE,OAAO8B,EAAE,SAASlC,GAAG,2BAA2BA,EAAEK,OAAO+B,GAAGA,EAAEM,aAAa1C,EAAE2C,UAAUxC,EAAEqC,kBAAkBd,EAAEpB,MAAMN,EAAE2C,UAAUjB,EAAElB,QAAQoC,KAAK5C,GAAGE,GAAE,IAAK,EAAEiC,EAAEU,OAAOC,aAAaA,YAAYC,kBAAkBD,YAAYC,iBAAiB,0BAA0B,GAAGX,EAAED,EAAE,KAAKnB,EAAE,QAAQkB,IAAIC,GAAGC,KAAKlC,EAAE+B,EAAEjC,EAAE0B,EAAEzB,GAAGkC,GAAGD,EAAEC,GAAGJ,GAAG,SAAS5B,GAAGuB,EAAEtB,EAAE,OAAOF,EAAE+B,EAAEjC,EAAE0B,EAAEzB,GAAG+C,uBAAuB,WAAWA,uBAAuB,WAAWtB,EAAEpB,MAAMwC,YAAYlC,MAAMT,EAAEkC,UAAUnC,GAAE,EAAG,GAAG,GAAG,IAAI,EAAE+C,GAAE,EAAGC,GAAG,EAAEC,EAAE,SAASnD,EAAEC,GAAGgD,IAAIR,GAAG,SAASzC,GAAGkD,EAAElD,EAAEM,KAAK,IAAI2C,GAAE,GAAI,IAAI/C,EAAEC,EAAE,SAASF,GAAGiD,GAAG,GAAGlD,EAAEC,EAAE,EAAEiC,EAAE9B,EAAE,MAAM,GAAG+B,EAAE,EAAEC,EAAE,GAAGE,EAAE,SAAStC,GAAG,IAAIA,EAAEoD,eAAe,CAAC,IAAInD,EAAEmC,EAAE,GAAGjC,EAAEiC,EAAEA,EAAEiB,OAAO,GAAGlB,GAAGnC,EAAE2C,UAAUxC,EAAEwC,UAAU,KAAK3C,EAAE2C,UAAU1C,EAAE0C,UAAU,KAAKR,GAAGnC,EAAEM,MAAM8B,EAAEQ,KAAK5C,KAAKmC,EAAEnC,EAAEM,MAAM8B,EAAE,CAACpC,IAAImC,EAAED,EAAE5B,QAAQ4B,EAAE5B,MAAM6B,EAAED,EAAE1B,QAAQ4B,EAAElC,IAAI,CAAC,EAAEiD,EAAEnC,EAAE,eAAesB,GAAGa,IAAIjD,EAAE+B,EAAE9B,EAAE+B,EAAEjC,GAAGyB,GAAG,WAAWyB,EAAEG,cAAchC,IAAIgB,GAAGpC,GAAE,EAAG,IAAI6B,GAAG,WAAWI,EAAE,EAAEe,GAAG,EAAEhB,EAAE9B,EAAE,MAAM,GAAGF,EAAE+B,EAAE9B,EAAE+B,EAAEjC,EAAE,IAAI,EAAEsD,EAAE,CAACC,SAAQ,EAAGC,SAAQ,GAAIC,EAAE,IAAI/C,KAAKgD,EAAE,SAASxD,EAAEC,GAAGJ,IAAIA,EAAEI,EAAEH,EAAEE,EAAED,EAAE,IAAIS,KAAKiD,EAAE/B,qBAAqBgC,IAAI,EAAEA,EAAE,WAAW,GAAG5D,GAAG,GAAGA,EAAEC,EAAEwD,EAAE,CAAC,IAAItD,EAAE,CAAC0D,UAAU,cAAczD,KAAKL,EAAEwB,KAAKuC,OAAO/D,EAAE+D,OAAOC,WAAWhE,EAAEgE,WAAWrB,UAAU3C,EAAEqC,UAAU4B,gBAAgBjE,EAAEqC,UAAUpC,GAAGE,EAAE+D,SAAS,SAASlE,GAAGA,EAAEI,EAAE,IAAID,EAAE,EAAE,CAAC,EAAEgE,EAAE,SAASnE,GAAG,GAAGA,EAAEgE,WAAW,CAAC,IAAI/D,GAAGD,EAAEqC,UAAU,KAAK,IAAI1B,KAAKmC,YAAYlC,OAAOZ,EAAEqC,UAAU,eAAerC,EAAEwB,KAAK,SAASxB,EAAEC,GAAG,IAAIC,EAAE,WAAWyD,EAAE3D,EAAEC,GAAGG,GAAG,EAAED,EAAE,WAAWC,GAAG,EAAEA,EAAE,WAAWyB,oBAAoB,YAAY3B,EAAEqD,GAAG1B,oBAAoB,gBAAgB1B,EAAEoD,EAAE,EAAEzB,iBAAiB,YAAY5B,EAAEqD,GAAGzB,iBAAiB,gBAAgB3B,EAAEoD,EAAE,CAAhO,CAAkOtD,EAAED,GAAG2D,EAAE1D,EAAED,EAAE,CAAC,EAAE4D,EAAE,SAAS5D,GAAG,CAAC,YAAY,UAAU,aAAa,eAAekE,SAAS,SAASjE,GAAG,OAAOD,EAAEC,EAAEkE,EAAEZ,EAAE,GAAG,EAAEa,EAAE,SAASlE,EAAEgC,GAAG,IAAIC,EAAEC,EAAEE,IAAIG,EAAErC,EAAE,OAAO6C,EAAE,SAASjD,GAAGA,EAAE2C,UAAUP,EAAEI,kBAAkBC,EAAEnC,MAAMN,EAAEiE,gBAAgBjE,EAAE2C,UAAUF,EAAEjC,QAAQoC,KAAK5C,GAAGmC,GAAE,GAAI,EAAEe,EAAElC,EAAE,cAAciC,GAAGd,EAAEF,EAAE/B,EAAEuC,EAAEP,GAAGgB,GAAGxB,GAAG,WAAWwB,EAAEI,cAAchC,IAAI2B,GAAGC,EAAER,YAAY,IAAG,GAAIQ,GAAGnB,GAAG,WAAW,IAAIf,EAAEyB,EAAErC,EAAE,OAAO+B,EAAEF,EAAE/B,EAAEuC,EAAEP,GAAG/B,EAAE,GAAGF,GAAG,EAAED,EAAE,KAAK4D,EAAE9B,kBAAkBd,EAAEiC,EAAE9C,EAAEyC,KAAK5B,GAAG6C,GAAG,GAAG,EAAEQ,EAAE,CAAC,EAAEC,EAAE,SAAStE,EAAEC,GAAG,IAAIC,EAAEC,EAAEmC,IAAIJ,EAAE9B,EAAE,OAAO+B,EAAE,SAASnC,GAAG,IAAIC,EAAED,EAAE2C,UAAU1C,EAAEE,EAAEqC,kBAAkBN,EAAE5B,MAAML,EAAEiC,EAAE1B,QAAQoC,KAAK5C,GAAGE,IAAI,EAAEkC,EAAEpB,EAAE,2BAA2BmB,GAAG,GAAGC,EAAE,CAAClC,EAAE+B,EAAEjC,EAAEkC,EAAEjC,GAAG,IAAIwC,EAAE,WAAW4B,EAAEnC,EAAEzB,MAAM2B,EAAEkB,cAAchC,IAAIa,GAAGC,EAAEM,aAAa2B,EAAEnC,EAAEzB,KAAI,EAAGP,GAAE,GAAI,EAAE,CAAC,UAAU,SAASgE,SAAS,SAASlE,GAAG8B,iBAAiB9B,EAAEyC,EAAE,CAAC8B,MAAK,EAAGd,SAAQ,GAAI,IAAI/B,EAAEe,GAAE,GAAIV,GAAG,SAAS5B,GAAG+B,EAAE9B,EAAE,OAAOF,EAAE+B,EAAEjC,EAAEkC,EAAEjC,GAAG+C,uBAAuB,WAAWA,uBAAuB,WAAWd,EAAE5B,MAAMwC,YAAYlC,MAAMT,EAAEkC,UAAUgC,EAAEnC,EAAEzB,KAAI,EAAGP,GAAE,EAAG,GAAG,GAAG,GAAG,CAAC,EAAEsE,EAAE,SAASxE,GAAG,IAAIC,EAAEC,EAAEE,EAAE,QAAQH,EAAE,WAAW,IAAI,IAAIA,EAAE6C,YAAY2B,iBAAiB,cAAc,IAAI,WAAW,IAAIzE,EAAE8C,YAAY4B,OAAOzE,EAAE,CAAC6D,UAAU,aAAanB,UAAU,GAAG,IAAI,IAAIzC,KAAKF,EAAE,oBAAoBE,GAAG,WAAWA,IAAID,EAAEC,GAAGW,KAAK8D,IAAI3E,EAAEE,GAAGF,EAAE4E,gBAAgB,IAAI,OAAO3E,CAAC,CAAjL,GAAqL,GAAGC,EAAEI,MAAMJ,EAAEK,MAAMN,EAAE4E,cAAc3E,EAAEI,MAAM,GAAGJ,EAAEI,MAAMwC,YAAYlC,MAAM,OAAOV,EAAEM,QAAQ,CAACP,GAAGD,EAAEE,EAAY,CAAT,MAAMF,GAAG,CAAC,EAAE,aAAa2B,SAASmD,WAAWvC,WAAWtC,EAAE,GAAG6B,iBAAiB,QAAQ,WAAW,OAAOS,WAAWtC,EAAE,EAAE,GAAG,C","sources":["../node_modules/web-vitals/dist/web-vitals.js"],"sourcesContent":["var e,t,n,i,r=function(e,t){return{name:e,value:void 0===t?-1:t,delta:0,entries:[],id:\"v2-\".concat(Date.now(),\"-\").concat(Math.floor(8999999999999*Math.random())+1e12)}},a=function(e,t){try{if(PerformanceObserver.supportedEntryTypes.includes(e)){if(\"first-input\"===e&&!(\"PerformanceEventTiming\"in self))return;var n=new PerformanceObserver((function(e){return e.getEntries().map(t)}));return n.observe({type:e,buffered:!0}),n}}catch(e){}},o=function(e,t){var n=function n(i){\"pagehide\"!==i.type&&\"hidden\"!==document.visibilityState||(e(i),t&&(removeEventListener(\"visibilitychange\",n,!0),removeEventListener(\"pagehide\",n,!0)))};addEventListener(\"visibilitychange\",n,!0),addEventListener(\"pagehide\",n,!0)},u=function(e){addEventListener(\"pageshow\",(function(t){t.persisted&&e(t)}),!0)},c=function(e,t,n){var i;return function(r){t.value>=0&&(r||n)&&(t.delta=t.value-(i||0),(t.delta||void 0===i)&&(i=t.value,e(t)))}},f=-1,s=function(){return\"hidden\"===document.visibilityState?0:1/0},m=function(){o((function(e){var t=e.timeStamp;f=t}),!0)},v=function(){return f<0&&(f=s(),m(),u((function(){setTimeout((function(){f=s(),m()}),0)}))),{get firstHiddenTime(){return f}}},d=function(e,t){var n,i=v(),o=r(\"FCP\"),f=function(e){\"first-contentful-paint\"===e.name&&(m&&m.disconnect(),e.startTime-1&&e(t)},f=r(\"CLS\",0),s=0,m=[],v=function(e){if(!e.hadRecentInput){var t=m[0],i=m[m.length-1];s&&e.startTime-i.startTime<1e3&&e.startTime-t.startTime<5e3?(s+=e.value,m.push(e)):(s=e.value,m=[e]),s>f.value&&(f.value=s,f.entries=m,n())}},h=a(\"layout-shift\",v);h&&(n=c(i,f,t),o((function(){h.takeRecords().map(v),n(!0)})),u((function(){s=0,l=-1,f=r(\"CLS\",0),n=c(i,f,t)})))},T={passive:!0,capture:!0},y=new Date,g=function(i,r){e||(e=r,t=i,n=new Date,w(removeEventListener),E())},E=function(){if(t>=0&&t1e12?new Date:performance.now())-e.timeStamp;\"pointerdown\"==e.type?function(e,t){var n=function(){g(e,t),r()},i=function(){r()},r=function(){removeEventListener(\"pointerup\",n,T),removeEventListener(\"pointercancel\",i,T)};addEventListener(\"pointerup\",n,T),addEventListener(\"pointercancel\",i,T)}(t,e):g(t,e)}},w=function(e){[\"mousedown\",\"keydown\",\"touchstart\",\"pointerdown\"].forEach((function(t){return e(t,S,T)}))},L=function(n,f){var s,m=v(),d=r(\"FID\"),p=function(e){e.startTimeperformance.now())return;n.entries=[t],e(n)}catch(e){}},\"complete\"===document.readyState?setTimeout(t,0):addEventListener(\"load\",(function(){return setTimeout(t,0)}))};export{h as getCLS,d as getFCP,L as getFID,F as getLCP,P as getTTFB};\n"],"names":["e","t","n","i","r","name","value","delta","entries","id","concat","Date","now","Math","floor","random","a","PerformanceObserver","supportedEntryTypes","includes","self","getEntries","map","observe","type","buffered","o","document","visibilityState","removeEventListener","addEventListener","u","persisted","c","f","s","m","timeStamp","v","setTimeout","firstHiddenTime","d","disconnect","startTime","push","window","performance","getEntriesByName","requestAnimationFrame","p","l","h","hadRecentInput","length","takeRecords","T","passive","capture","y","g","w","E","entryType","target","cancelable","processingStart","forEach","S","L","b","F","once","P","getEntriesByType","timing","max","navigationStart","responseStart","readyState"],"sourceRoot":""} \ No newline at end of file diff --git a/engine/build/static/js/main.148e1d42.js b/engine/build/static/js/main.148e1d42.js new file mode 100644 index 0000000..f301a2d --- /dev/null +++ b/engine/build/static/js/main.148e1d42.js @@ -0,0 +1,3 @@ +/*! For license information please see main.148e1d42.js.LICENSE.txt */ +!function(){var e={3140:function(e,t,n){var r={"./Curves.json":9553,"./Edge.json":9586,"./SimpleNodes.json":8164};function o(e){var t=i(e);return n(t)}function i(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=i,e.exports=o,o.id=3140},5969:function(e,t,n){"use strict";var r=n(7061).default,o=n(6690).default,i=n(9728).default,a=n(6115).default,u=n(1655).default,l=n(6389).default,s=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{l(r.next(e))}catch(t){i(t)}}function u(e){try{l(r.throw(e))}catch(t){i(t)}}function l(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,u)}l((r=r.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.ButtplugBrowserWebsocketClientConnector=void 0;var c=n(6893),f=n(7075),d=function(e){u(n,e);var t=l(n);function n(){var e;return o(this,n),(e=t.apply(this,arguments))._sorter=new f.ButtplugMessageSorter(!0),e.Send=function(t){return s(a(e),void 0,void 0,r().mark((function e(){var n;return r().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.Connected){e.next=2;break}throw new Error("ButtplugClient not connected");case 2:return n=this._sorter.PrepareOutgoingMessage(t),this.SendMessage(t),e.next=6,n;case 6:return e.abrupt("return",e.sent);case 7:case"end":return e.stop()}}),e,this)})))},e.ParseIncomingMessage=function(t){if("string"===typeof t.data){var n=(0,c.FromJSON)(t.data),r=e._sorter.ParseIncomingMessages(n);e.emit("message",r)}else t.data,Blob},e}return i(n,[{key:"OnReaderLoad",value:function(e){var t=(0,c.FromJSON)(e.target.result),n=this._sorter.ParseIncomingMessages(t);this.emit("message",n)}}]),n}(n(52).ButtplugBrowserWebsocketConnector);t.ButtplugBrowserWebsocketClientConnector=d},5444:function(e,t,n){"use strict";var r=n(9728).default,o=n(6690).default,i=n(1655).default,a=n(6389).default,u=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var o=Object.getOwnPropertyDescriptor(t,n);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,o)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),l=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),s=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&u(t,e,n);return l(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.ButtplugClientConnectorException=void 0;var c=n(3270),f=s(n(4720)),d=function(e){i(n,e);var t=a(n);function n(e){return o(this,n),t.call(this,e,f.ErrorClass.ERROR_UNKNOWN)}return r(n)}(c.ButtplugError);t.ButtplugClientConnectorException=d},1874:function(e,t,n){"use strict";var r=n(7061).default,o=n(6690).default,i=n(9728).default,a=n(1655).default,u=n(6389).default,l=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var o=Object.getOwnPropertyDescriptor(t,n);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,o)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),c=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&l(t,e,n);return s(t,e),t},f=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{l(r.next(e))}catch(t){i(t)}}function u(e){try{l(r.throw(e))}catch(t){i(t)}}function l(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,u)}l((r=r.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.ButtplugClientDevice=void 0;var d=c(n(4720)),h=n(3270),p=function(e){a(n,e);var t=u(n);function n(e,r){var i;return o(this,n),(i=t.call(this))._deviceInfo=e,i._sendClosure=r,i.allowedMsgs=new Map,e.DeviceMessages.update(),i}return i(n,[{key:"name",get:function(){return this._deviceInfo.DeviceName}},{key:"displayName",get:function(){return this._deviceInfo.DeviceDisplayName}},{key:"index",get:function(){return this._deviceInfo.DeviceIndex}},{key:"messageTimingGap",get:function(){return this._deviceInfo.DeviceMessageTimingGap}},{key:"messageAttributes",get:function(){return this._deviceInfo.DeviceMessages}},{key:"send",value:function(e){return f(this,void 0,void 0,r().mark((function t(){return r().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this._sendClosure(this,e);case 2:return t.abrupt("return",t.sent);case 3:case"end":return t.stop()}}),t,this)})))}},{key:"sendExpectOk",value:function(e){return f(this,void 0,void 0,r().mark((function t(){var n;return r().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.send(e);case 2:n=t.sent,t.t0=n.constructor,t.next=t.t0===d.Ok?6:t.t0===d.Error?7:8;break;case 6:return t.abrupt("return");case 7:throw h.ButtplugError.FromError(n);case 8:throw new h.ButtplugMessageError("Message type ".concat(n.constructor," not handled by SendMsgExpectOk"));case 9:case"end":return t.stop()}}),t,this)})))}},{key:"scalar",value:function(e){return f(this,void 0,void 0,r().mark((function t(){return r().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!Array.isArray(e)){t.next=5;break}return t.next=3,this.sendExpectOk(new d.ScalarCmd(e,this.index));case 3:t.next=7;break;case 5:return t.next=7,this.sendExpectOk(new d.ScalarCmd([e],this.index));case 7:case"end":return t.stop()}}),t,this)})))}},{key:"scalarCommandBuilder",value:function(e,t){var n;return f(this,void 0,void 0,r().mark((function o(){var i,a;return r().wrap((function(r){for(;;)switch(r.prev=r.next){case 0:if((i=null===(n=this.messageAttributes.ScalarCmd)||void 0===n?void 0:n.filter((function(e){return e.ActuatorType===t})))&&0!==i.length){r.next=3;break}throw new h.ButtplugDeviceError("Device ".concat(this.name," has no ").concat(t," capabilities"));case 3:if(a=[],"number"!==typeof e){r.next=8;break}i.forEach((function(n){return a.push(new d.ScalarSubcommand(n.Index,e,t))})),r.next=15;break;case 8:if(!Array.isArray(e)){r.next=14;break}if(!(e.length>i.length)){r.next=11;break}throw new h.ButtplugDeviceError("".concat(e.length," commands send to a device with ").concat(i.length," vibrators"));case 11:i.forEach((function(n,r){a.push(new d.ScalarSubcommand(n.Index,e[r],t))})),r.next=15;break;case 14:throw new h.ButtplugDeviceError("".concat(t," can only take numbers or arrays of numbers."));case 15:return r.next=17,this.scalar(a);case 17:case"end":return r.stop()}}),o,this)})))}},{key:"vibrateAttributes",get:function(){var e,t;return null!==(t=null===(e=this.messageAttributes.ScalarCmd)||void 0===e?void 0:e.filter((function(e){return e.ActuatorType===d.ActuatorType.Vibrate})))&&void 0!==t?t:[]}},{key:"vibrate",value:function(e){return f(this,void 0,void 0,r().mark((function t(){return r().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.scalarCommandBuilder(e,d.ActuatorType.Vibrate);case 2:case"end":return t.stop()}}),t,this)})))}},{key:"oscillateAttributes",get:function(){var e,t;return null!==(t=null===(e=this.messageAttributes.ScalarCmd)||void 0===e?void 0:e.filter((function(e){return e.ActuatorType===d.ActuatorType.Oscillate})))&&void 0!==t?t:[]}},{key:"oscillate",value:function(e){return f(this,void 0,void 0,r().mark((function t(){return r().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.scalarCommandBuilder(e,d.ActuatorType.Oscillate);case 2:case"end":return t.stop()}}),t,this)})))}},{key:"rotateAttributes",get:function(){var e;return null!==(e=this.messageAttributes.RotateCmd)&&void 0!==e?e:[]}},{key:"rotate",value:function(e,t){return f(this,void 0,void 0,r().mark((function n(){var o,i;return r().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if((o=this.messageAttributes.RotateCmd)&&0!==o.length){n.next=3;break}throw new h.ButtplugDeviceError("Device ".concat(this.name," has no Rotate capabilities"));case 3:if("number"!==typeof e){n.next=7;break}i=d.RotateCmd.Create(this.index,new Array(o.length).fill([e,t])),n.next=12;break;case 7:if(!Array.isArray(e)){n.next=11;break}i=d.RotateCmd.Create(this.index,e),n.next=12;break;case 11:throw new h.ButtplugDeviceError("SendRotateCmd can only take a number and boolean, or an array of number/boolean tuples");case 12:return n.next=14,this.sendExpectOk(i);case 14:case"end":return n.stop()}}),n,this)})))}},{key:"linearAttributes",get:function(){var e;return null!==(e=this.messageAttributes.RotateCmd)&&void 0!==e?e:[]}},{key:"linear",value:function(e,t){return f(this,void 0,void 0,r().mark((function n(){var o,i;return r().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if((o=this.messageAttributes.LinearCmd)&&0!==o.length){n.next=3;break}throw new h.ButtplugDeviceError("Device ".concat(this.name," has no Linear capabilities"));case 3:if("number"!==typeof e){n.next=7;break}i=d.LinearCmd.Create(this.index,new Array(o.length).fill([e,t])),n.next=12;break;case 7:if(!Array.isArray(e)){n.next=11;break}i=d.LinearCmd.Create(this.index,e),n.next=12;break;case 11:throw new h.ButtplugDeviceError("SendLinearCmd can only take a number and number, or an array of number/number tuples");case 12:return n.next=14,this.sendExpectOk(i);case 14:case"end":return n.stop()}}),n,this)})))}},{key:"sensorRead",value:function(e,t){return f(this,void 0,void 0,r().mark((function n(){var o;return r().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,this.send(new d.SensorReadCmd(this.index,e,t));case 2:o=n.sent,n.t0=o.constructor,n.next=n.t0===d.SensorReading?6:n.t0===d.Error?7:8;break;case 6:return n.abrupt("return",o.Data);case 7:throw h.ButtplugError.FromError(o);case 8:throw new h.ButtplugMessageError("Message type ".concat(o.constructor," not handled by sensorRead"));case 9:case"end":return n.stop()}}),n,this)})))}},{key:"hasBattery",get:function(){var e,t=null===(e=this.messageAttributes.SensorReadCmd)||void 0===e?void 0:e.filter((function(e){return e.SensorType===d.SensorType.Battery}));return void 0!==t&&t.length>0}},{key:"battery",value:function(){var e;return f(this,void 0,void 0,r().mark((function t(){var n,o;return r().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(this.hasBattery){t.next=2;break}throw new h.ButtplugDeviceError("Device ".concat(this.name," has no Battery capabilities"));case 2:return n=null===(e=this.messageAttributes.SensorReadCmd)||void 0===e?void 0:e.filter((function(e){return e.SensorType===d.SensorType.Battery})),t.next=5,this.sensorRead(n[0].Index,d.SensorType.Battery);case 5:return o=t.sent,t.abrupt("return",o[0]/100);case 7:case"end":return t.stop()}}),t,this)})))}},{key:"hasRssi",get:function(){var e,t=null===(e=this.messageAttributes.SensorReadCmd)||void 0===e?void 0:e.filter((function(e){return e.SensorType===d.SensorType.RSSI}));return void 0!==t&&0===t.length}},{key:"rssi",value:function(){var e;return f(this,void 0,void 0,r().mark((function t(){var n,o;return r().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(this.hasRssi){t.next=2;break}throw new h.ButtplugDeviceError("Device ".concat(this.name," has no RSSI capabilities"));case 2:return n=null===(e=this.messageAttributes.SensorReadCmd)||void 0===e?void 0:e.filter((function(e){return e.SensorType===d.SensorType.RSSI})),t.next=5,this.sensorRead(n[0].Index,d.SensorType.RSSI);case 5:return o=t.sent,t.abrupt("return",o[0]);case 7:case"end":return t.stop()}}),t,this)})))}},{key:"rawRead",value:function(e,t,n){return f(this,void 0,void 0,r().mark((function o(){var i;return r().wrap((function(r){for(;;)switch(r.prev=r.next){case 0:if(this.messageAttributes.RawReadCmd){r.next=2;break}throw new h.ButtplugDeviceError("Device ".concat(this.name," has no raw read capabilities"));case 2:if(-1!==this.messageAttributes.RawReadCmd.Endpoints.indexOf(e)){r.next=4;break}throw new h.ButtplugDeviceError("Device ".concat(this.name," has no raw readable endpoint ").concat(e));case 4:return r.next=6,this.send(new d.RawReadCmd(this.index,e,t,n));case 6:i=r.sent,r.t0=i.constructor,r.next=r.t0===d.RawReading?10:r.t0===d.Error?11:12;break;case 10:return r.abrupt("return",new Uint8Array(i.Data));case 11:throw h.ButtplugError.FromError(i);case 12:throw new h.ButtplugMessageError("Message type ".concat(i.constructor," not handled by rawRead"));case 13:case"end":return r.stop()}}),o,this)})))}},{key:"rawWrite",value:function(e,t,n){return f(this,void 0,void 0,r().mark((function o(){return r().wrap((function(r){for(;;)switch(r.prev=r.next){case 0:if(this.messageAttributes.RawWriteCmd){r.next=2;break}throw new h.ButtplugDeviceError("Device ".concat(this.name," has no raw write capabilities"));case 2:if(-1!==this.messageAttributes.RawWriteCmd.Endpoints.indexOf(e)){r.next=4;break}throw new h.ButtplugDeviceError("Device ".concat(this.name," has no raw writable endpoint ").concat(e));case 4:return r.next=6,this.sendExpectOk(new d.RawWriteCmd(this.index,e,t,n));case 6:case"end":return r.stop()}}),o,this)})))}},{key:"rawSubscribe",value:function(e){return f(this,void 0,void 0,r().mark((function t(){return r().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(this.messageAttributes.RawSubscribeCmd){t.next=2;break}throw new h.ButtplugDeviceError("Device ".concat(this.name," has no raw subscribe capabilities"));case 2:if(-1!==this.messageAttributes.RawSubscribeCmd.Endpoints.indexOf(e)){t.next=4;break}throw new h.ButtplugDeviceError("Device ".concat(this.name," has no raw subscribable endpoint ").concat(e));case 4:return t.next=6,this.sendExpectOk(new d.RawSubscribeCmd(this.index,e));case 6:case"end":return t.stop()}}),t,this)})))}},{key:"rawUnsubscribe",value:function(e){return f(this,void 0,void 0,r().mark((function t(){return r().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(this.messageAttributes.RawSubscribeCmd){t.next=2;break}throw new h.ButtplugDeviceError("Device ".concat(this.name," has no raw unsubscribe capabilities"));case 2:if(-1!==this.messageAttributes.RawSubscribeCmd.Endpoints.indexOf(e)){t.next=4;break}throw new h.ButtplugDeviceError("Device ".concat(this.name," has no raw unsubscribable endpoint ").concat(e));case 4:return t.next=6,this.sendExpectOk(new d.RawUnsubscribeCmd(this.index,e));case 6:case"end":return t.stop()}}),t,this)})))}},{key:"stop",value:function(){return f(this,void 0,void 0,r().mark((function e(){return r().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.sendExpectOk(new d.StopDeviceCmd(this.index));case 2:case"end":return e.stop()}}),e,this)})))}},{key:"emitDisconnected",value:function(){this.emit("deviceremoved")}}],[{key:"fromMsg",value:function(e,t){return new n(e,t)}}]),n}(n(3641).EventEmitter);t.ButtplugClientDevice=p},685:function(e,t,n){"use strict";var r=n(9728).default,o=n(6690).default,i=n(1655).default,a=n(6389).default;Object.defineProperty(t,"__esModule",{value:!0}),t.ButtplugNodeWebsocketClientConnector=void 0;var u=n(5969),l=n(7882),s=function(e){i(n,e);var t=a(n);function n(){var e;return o(this,n),(e=t.apply(this,arguments))._websocketConstructor=l.WebSocket,e}return r(n)}(u.ButtplugBrowserWebsocketClientConnector);t.ButtplugNodeWebsocketClientConnector=s},5252:function(e,t,n){"use strict";var r=n(4704).default,o=n(7061).default,i=n(6690).default,a=n(9728).default,u=n(6115).default,l=n(1655).default,s=n(6389).default,c=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var o=Object.getOwnPropertyDescriptor(t,n);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,o)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),f=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),d=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&c(t,e,n);return f(t,e),t},h=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{l(r.next(e))}catch(t){i(t)}}function u(e){try{l(r.throw(e))}catch(t){i(t)}}function l(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,u)}l((r=r.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.ButtplugClient=void 0;var p=n(9295),v=n(3641),g=n(1874),m=d(n(4720)),y=n(3270),b=n(5444),w=function(e){l(n,e);var t=s(n);function n(){var e,a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"Generic Buttplug Client";return i(this,n),(e=t.call(this))._pingTimer=null,e._connector=null,e._devices=new Map,e._logger=p.ButtplugLogger.Logger,e._isScanning=!1,e.connect=function(t){return h(u(e),void 0,void 0,o().mark((function e(){return o().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this._logger.Info("ButtplugClient: Connecting using ".concat(t.constructor.name)),e.next=3,t.Connect();case 3:return this._connector=t,this._connector.addListener("message",this.parseMessages),this._connector.addListener("disconnect",this.disconnectHandler),e.next=8,this.initializeConnection();case 8:case"end":return e.stop()}}),e,this)})))},e.disconnect=function(){return h(u(e),void 0,void 0,o().mark((function e(){return o().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this._logger.Debug("ButtplugClient: Disconnect called"),this.checkConnector(),e.next=4,this.shutdownConnection();case 4:return e.next=6,this._connector.Disconnect();case 6:case"end":return e.stop()}}),e,this)})))},e.startScanning=function(){return h(u(e),void 0,void 0,o().mark((function e(){return o().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this._logger.Debug("ButtplugClient: StartScanning called"),this._isScanning=!0,e.next=4,this.sendMsgExpectOk(new m.StartScanning);case 4:case"end":return e.stop()}}),e,this)})))},e.stopScanning=function(){return h(u(e),void 0,void 0,o().mark((function e(){return o().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this._logger.Debug("ButtplugClient: StopScanning called"),this._isScanning=!1,e.next=4,this.sendMsgExpectOk(new m.StopScanning);case 4:case"end":return e.stop()}}),e,this)})))},e.stopAllDevices=function(){return h(u(e),void 0,void 0,o().mark((function e(){return o().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this._logger.Debug("ButtplugClient: StopAllDevices"),e.next=3,this.sendMsgExpectOk(new m.StopAllDevices);case 3:case"end":return e.stop()}}),e,this)})))},e.disconnectHandler=function(){e._logger.Info("ButtplugClient: Disconnect event receieved."),e.emit("disconnect")},e.parseMessages=function(t){var n,o=r(t);try{for(o.s();!(n=o.n()).done;){var i=n.value;switch(i.constructor){case m.DeviceAdded:var a=i,u=g.ButtplugClientDevice.fromMsg(a,e.sendDeviceMessageClosure);e._devices.set(a.DeviceIndex,u),e.emit("deviceadded",u);break;case m.DeviceRemoved:var l=i;if(e._devices.has(l.DeviceIndex)){var s=e._devices.get(l.DeviceIndex);null===s||void 0===s||s.emitDisconnected(),e._devices.delete(l.DeviceIndex),e.emit("deviceremoved",s)}break;case m.ScanningFinished:e._isScanning=!1,e.emit("scanningfinished",i)}}}catch(c){o.e(c)}finally{o.f()}},e.initializeConnection=function(){return h(u(e),void 0,void 0,o().mark((function e(){var t,n,r;return o().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this.checkConnector(),e.next=3,this.sendMessage(new m.RequestServerInfo(this._clientName,m.MESSAGE_SPEC_VERSION));case 3:t=e.sent,e.t0=t.constructor,e.next=e.t0===m.ServerInfo?7:e.t0===m.Error?18:22;break;case 7:if(n=t,this._logger.Info("ButtplugClient: Connected to Server ".concat(n.ServerName)),n.MaxPingTime,!(n.MessageVersion2&&void 0!==arguments[2]?arguments[2]:f.SYSTEM_MESSAGE_ID,u=arguments.length>3?arguments[3]:void 0;return r(this,n),(i=t.call(this,e)).errorClass=f.ErrorClass.ERROR_UNKNOWN,i.errorClass=o,i.innerError=u,i.messageId=a,i}return o(n,[{key:"ErrorClass",get:function(){return this.errorClass}},{key:"InnerError",get:function(){return this.innerError}},{key:"Id",get:function(){return this.messageId}},{key:"ErrorMessage",get:function(){return new f.Error(this.message,this.ErrorClass,this.Id)}}],[{key:"LogAndError",value:function(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:f.SYSTEM_MESSAGE_ID;return t.Error(n),new e(n,r)}},{key:"FromError",value:function(e){switch(e.ErrorCode){case f.ErrorClass.ERROR_DEVICE:return new p(e.ErrorMessage,e.Id);case f.ErrorClass.ERROR_INIT:return new h(e.ErrorMessage,e.Id);case f.ErrorClass.ERROR_UNKNOWN:return new m(e.ErrorMessage,e.Id);case f.ErrorClass.ERROR_PING:return new g(e.ErrorMessage,e.Id);case f.ErrorClass.ERROR_MSG:return new v(e.ErrorMessage,e.Id);default:throw new Error("Message type ".concat(e.ErrorCode," not handled"))}}}]),n}(u(Error));t.ButtplugError=d;var h=function(e){i(n,e);var t=a(n);function n(e){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:f.SYSTEM_MESSAGE_ID;return r(this,n),t.call(this,e,f.ErrorClass.ERROR_INIT,o)}return o(n)}(d);t.ButtplugInitError=h;var p=function(e){i(n,e);var t=a(n);function n(e){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:f.SYSTEM_MESSAGE_ID;return r(this,n),t.call(this,e,f.ErrorClass.ERROR_DEVICE,o)}return o(n)}(d);t.ButtplugDeviceError=p;var v=function(e){i(n,e);var t=a(n);function n(e){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:f.SYSTEM_MESSAGE_ID;return r(this,n),t.call(this,e,f.ErrorClass.ERROR_MSG,o)}return o(n)}(d);t.ButtplugMessageError=v;var g=function(e){i(n,e);var t=a(n);function n(e){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:f.SYSTEM_MESSAGE_ID;return r(this,n),t.call(this,e,f.ErrorClass.ERROR_PING,o)}return o(n)}(d);t.ButtplugPingError=g;var m=function(e){i(n,e);var t=a(n);function n(e){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:f.SYSTEM_MESSAGE_ID;return r(this,n),t.call(this,e,f.ErrorClass.ERROR_UNKNOWN,o)}return o(n)}(d);t.ButtplugUnknownError=m},9295:function(e,t,n){"use strict";var r=n(1655).default,o=n(6389).default,i=n(6690).default,a=n(9728).default;Object.defineProperty(t,"__esModule",{value:!0}),t.ButtplugLogger=t.LogMessage=t.ButtplugLogLevel=void 0;var u,l=n(3641);!function(e){e[e.Off=0]="Off",e[e.Error=1]="Error",e[e.Warn=2]="Warn",e[e.Info=3]="Info",e[e.Debug=4]="Debug",e[e.Trace=5]="Trace"}(u=t.ButtplugLogLevel||(t.ButtplugLogLevel={}));var s=function(){function e(t,n){i(this,e);var r=new Date,o=r.getHours(),a=r.getMinutes(),u=r.getSeconds();this.timestamp="".concat(o,":").concat(a,":").concat(u),this.logMessage=t,this.logLevel=n}return a(e,[{key:"Message",get:function(){return this.logMessage}},{key:"LogLevel",get:function(){return this.logLevel}},{key:"Timestamp",get:function(){return this.timestamp}},{key:"FormattedMessage",get:function(){return"".concat(u[this.logLevel]," : ").concat(this.timestamp," : ").concat(this.logMessage)}}]),e}();t.LogMessage=s;var c=function(e){r(n,e);var t=o(n);function n(){var e;return i(this,n),(e=t.call(this)).maximumConsoleLogLevel=u.Off,e.maximumEventLogLevel=u.Off,e}return a(n,[{key:"MaximumConsoleLogLevel",get:function(){return this.maximumConsoleLogLevel},set:function(e){this.maximumConsoleLogLevel=e}},{key:"MaximumEventLogLevel",get:function(){return this.maximumEventLogLevel},set:function(e){this.maximumEventLogLevel=e}},{key:"Error",value:function(e){this.AddLogMessage(e,u.Error)}},{key:"Warn",value:function(e){this.AddLogMessage(e,u.Warn)}},{key:"Info",value:function(e){this.AddLogMessage(e,u.Info)}},{key:"Debug",value:function(e){this.AddLogMessage(e,u.Debug)}},{key:"Trace",value:function(e){this.AddLogMessage(e,u.Trace)}},{key:"AddLogMessage",value:function(e,t){if(!(t>this.maximumEventLogLevel&&t>this.maximumConsoleLogLevel)){var n=new s(e,t);t<=this.maximumConsoleLogLevel&&console.log(n.FormattedMessage),t<=this.maximumEventLogLevel&&this.emit("log",n)}}}],[{key:"Logger",get:function(){return void 0===n.sLogger&&(n.sLogger=new n),this.sLogger}}]),n}(l.EventEmitter);t.ButtplugLogger=c,c.sLogger=void 0},6893:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var o=Object.getOwnPropertyDescriptor(t,n);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,o)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&r(t,e,n);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.FromJSON=void 0;var a=n(72),u=i(n(4720));function l(e){for(var t=0,n=Object.values(u);t=0;u--)(o=e[u])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a},f=this&&this.__metadata||function(e,t){if("object"===typeof Reflect&&"function"===typeof Reflect.metadata)return Reflect.metadata(e,t)};Object.defineProperty(t,"__esModule",{value:!0}),t.RawReading=t.RawUnsubscribeCmd=t.RawSubscribeCmd=t.RawWriteCmd=t.RawReadCmd=t.SensorReading=t.SensorReadCmd=t.LinearCmd=t.VectorSubcommand=t.RotateCmd=t.RotateSubcommand=t.ScalarCmd=t.ScalarSubcommand=t.GenericMessageSubcommand=t.StopAllDevices=t.StopDeviceCmd=t.ServerInfo=t.RequestServerInfo=t.ScanningFinished=t.StopScanning=t.StartScanning=t.RequestDeviceList=t.DeviceRemoved=t.DeviceAdded=t.DeviceList=t.DeviceInfo=t.Error=t.ErrorClass=t.Ping=t.Ok=t.ButtplugSystemMessage=t.ButtplugDeviceMessage=t.ButtplugMessage=t.SensorDeviceMessageAttributes=t.RawDeviceMessageAttributes=t.GenericDeviceMessageAttributes=t.SensorType=t.ActuatorType=t.MessageAttributes=t.MESSAGE_SPEC_VERSION=t.MAX_ID=t.DEFAULT_MESSAGE_ID=t.SYSTEM_MESSAGE_ID=void 0;var d=n(72);n(6121),t.SYSTEM_MESSAGE_ID=0,t.DEFAULT_MESSAGE_ID=1,t.MAX_ID=4294967295,t.MESSAGE_SPEC_VERSION=3;var h=function(){function e(t){l(this,e),Object.assign(this,t)}return s(e,[{key:"update",value:function(){var e,t,n,r,o;null===(e=this.ScalarCmd)||void 0===e||e.forEach((function(e,t){return e.Index=t})),null===(t=this.RotateCmd)||void 0===t||t.forEach((function(e,t){return e.Index=t})),null===(n=this.LinearCmd)||void 0===n||n.forEach((function(e,t){return e.Index=t})),null===(r=this.SensorReadCmd)||void 0===r||r.forEach((function(e,t){return e.Index=t})),null===(o=this.SensorSubscribeCmd)||void 0===o||o.forEach((function(e,t){return e.Index=t}))}}]),e}();t.MessageAttributes=h,function(e){e.Unknown="Unknown",e.Vibrate="Vibrate",e.Rotate="Rotate",e.Oscillate="Oscillate",e.Constrict="Constrict",e.Inflate="Inflate",e.Position="Position"}(t.ActuatorType||(t.ActuatorType={})),function(e){e.Unknown="Unknown",e.Battery="Battery",e.RSSI="RSSI",e.Button="Button",e.Pressure="Pressure"}(t.SensorType||(t.SensorType={}));var p=s((function e(t){l(this,e),this.Index=0,Object.assign(this,t)}));t.GenericDeviceMessageAttributes=p;var v=s((function e(t){l(this,e),this.Endpoints=t}));t.RawDeviceMessageAttributes=v;var g=s((function e(t){l(this,e),this.Index=0,Object.assign(this,t)}));t.SensorDeviceMessageAttributes=g;var m=function(){function e(t){l(this,e),this.Id=t}return s(e,[{key:"Type",get:function(){return this.constructor}},{key:"toJSON",value:function(){return JSON.stringify(this.toProtocolFormat())}},{key:"toProtocolFormat",value:function(){var e={};return e[this.constructor.Name]=(0,d.instanceToPlain)(this),e}},{key:"update",value:function(){}}]),e}();t.ButtplugMessage=m;var y=function(e){a(n,e);var t=u(n);function n(e,r){var o;return l(this,n),(o=t.call(this,r)).DeviceIndex=e,o.Id=r,o}return s(n)}(m);t.ButtplugDeviceMessage=y;var b=function(e){a(r,e);var n=u(r);function r(){var e,o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:t.SYSTEM_MESSAGE_ID;return l(this,r),(e=n.call(this,o)).Id=o,e}return s(r)}(m);t.ButtplugSystemMessage=b;var w=function(e){a(r,e);var n=u(r);function r(){var e,o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:t.DEFAULT_MESSAGE_ID;return l(this,r),(e=n.call(this,o)).Id=o,e}return s(r)}(b);t.Ok=w,w.Name="Ok";var x,_=function(e){a(r,e);var n=u(r);function r(){var e,o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:t.DEFAULT_MESSAGE_ID;return l(this,r),(e=n.call(this,o)).Id=o,e}return s(r)}(m);t.Ping=_,_.Name="Ping",function(e){e[e.ERROR_UNKNOWN=0]="ERROR_UNKNOWN",e[e.ERROR_INIT=1]="ERROR_INIT",e[e.ERROR_PING=2]="ERROR_PING",e[e.ERROR_MSG=3]="ERROR_MSG",e[e.ERROR_DEVICE=4]="ERROR_DEVICE"}(x=t.ErrorClass||(t.ErrorClass={}));var k=function(e){a(r,e);var n=u(r);function r(e){var o,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:x.ERROR_UNKNOWN,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t.DEFAULT_MESSAGE_ID;return l(this,r),(o=n.call(this,a)).ErrorMessage=e,o.ErrorCode=i,o.Id=a,o}return s(r,[{key:"Schemversion",get:function(){return 0}}]),r}(m);t.Error=k,k.Name="Error";var S=s((function e(t){l(this,e),Object.assign(this,t)}));c([(0,d.Type)((function(){return h})),f("design:type",h)],S.prototype,"DeviceMessages",void 0),t.DeviceInfo=S;var E=function(e){a(r,e);var n=u(r);function r(e){var o,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t.DEFAULT_MESSAGE_ID;return l(this,r),(o=n.call(this,i)).Devices=e,o.Id=i,o}return s(r,[{key:"update",value:function(){var e,t=i(this.Devices);try{for(t.s();!(e=t.n()).done;){e.value.DeviceMessages.update()}}catch(n){t.e(n)}finally{t.f()}}}]),r}(m);E.Name="DeviceList",c([(0,d.Type)((function(){return S})),f("design:type",Array)],E.prototype,"Devices",void 0),t.DeviceList=E;var C=function(e){a(n,e);var t=u(n);function n(e){var r;return l(this,n),r=t.call(this),Object.assign(o(r),e),r}return s(n,[{key:"update",value:function(){this.DeviceMessages.update()}}]),n}(b);C.Name="DeviceAdded",c([(0,d.Type)((function(){return h})),f("design:type",h)],C.prototype,"DeviceMessages",void 0),t.DeviceAdded=C;var O=function(e){a(n,e);var t=u(n);function n(e){var r;return l(this,n),(r=t.call(this)).DeviceIndex=e,r}return s(n)}(b);t.DeviceRemoved=O,O.Name="DeviceRemoved";var T=function(e){a(r,e);var n=u(r);function r(){var e,o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:t.DEFAULT_MESSAGE_ID;return l(this,r),(e=n.call(this,o)).Id=o,e}return s(r)}(m);t.RequestDeviceList=T,T.Name="RequestDeviceList";var M=function(e){a(r,e);var n=u(r);function r(){var e,o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:t.DEFAULT_MESSAGE_ID;return l(this,r),(e=n.call(this,o)).Id=o,e}return s(r)}(m);t.StartScanning=M,M.Name="StartScanning";var N=function(e){a(r,e);var n=u(r);function r(){var e,o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:t.DEFAULT_MESSAGE_ID;return l(this,r),(e=n.call(this,o)).Id=o,e}return s(r)}(m);t.StopScanning=N,N.Name="StopScanning";var D=function(e){a(n,e);var t=u(n);function n(){return l(this,n),t.call(this)}return s(n)}(b);t.ScanningFinished=D,D.Name="ScanningFinished";var I=function(e){a(r,e);var n=u(r);function r(e){var o,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t.DEFAULT_MESSAGE_ID;return l(this,r),(o=n.call(this,a)).ClientName=e,o.MessageVersion=i,o.Id=a,o}return s(r)}(m);t.RequestServerInfo=I,I.Name="RequestServerInfo";var P=function(e){a(r,e);var n=u(r);function r(e,o,i){var a,u=arguments.length>3&&void 0!==arguments[3]?arguments[3]:t.DEFAULT_MESSAGE_ID;return l(this,r),(a=n.call(this)).MessageVersion=e,a.MaxPingTime=o,a.ServerName=i,a.Id=u,a}return s(r)}(b);t.ServerInfo=P,P.Name="ServerInfo";var A=function(e){a(r,e);var n=u(r);function r(){var e,o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:-1,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t.DEFAULT_MESSAGE_ID;return l(this,r),(e=n.call(this,o,i)).DeviceIndex=o,e.Id=i,e}return s(r)}(y);t.StopDeviceCmd=A,A.Name="StopDeviceCmd";var j=function(e){a(r,e);var n=u(r);function r(){var e,o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:t.DEFAULT_MESSAGE_ID;return l(this,r),(e=n.call(this,o)).Id=o,e}return s(r)}(m);t.StopAllDevices=j,j.Name="StopAllDevices";var L=s((function e(t){l(this,e),this.Index=t}));t.GenericMessageSubcommand=L;var R=function(e){a(n,e);var t=u(n);function n(e,r,o){var i;return l(this,n),(i=t.call(this,e)).Scalar=r,i.ActuatorType=o,i}return s(n)}(L);t.ScalarSubcommand=R;var z=function(e){a(r,e);var n=u(r);function r(e){var o,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:-1,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t.DEFAULT_MESSAGE_ID;return l(this,r),(o=n.call(this,i,a)).Scalars=e,o.DeviceIndex=i,o.Id=a,o}return s(r)}(y);t.ScalarCmd=z,z.Name="ScalarCmd";var F=function(e){a(n,e);var t=u(n);function n(e,r,o){var i;return l(this,n),(i=t.call(this,e)).Speed=r,i.Clockwise=o,i}return s(n)}(L);t.RotateSubcommand=F;var B=function(e){a(o,e);var n=u(o);function o(e){var r,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:-1,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t.DEFAULT_MESSAGE_ID;return l(this,o),(r=n.call(this,i,a)).Rotations=e,r.DeviceIndex=i,r.Id=a,r}return s(o,null,[{key:"Create",value:function(e,t){var n,a=new Array,u=0,l=i(t);try{for(l.s();!(n=l.n()).done;){var s=r(n.value,2),c=s[0],f=s[1];a.push(new F(u,c,f)),++u}}catch(d){l.e(d)}finally{l.f()}return new o(a,e)}}]),o}(y);t.RotateCmd=B,B.Name="RotateCmd";var V=function(e){a(n,e);var t=u(n);function n(e,r,o){var i;return l(this,n),(i=t.call(this,e)).Position=r,i.Duration=o,i}return s(n)}(L);t.VectorSubcommand=V;var H=function(e){a(r,e);var n=u(r);function r(e){var o,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:-1,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t.DEFAULT_MESSAGE_ID;return l(this,r),(o=n.call(this,i,a)).Vectors=e,o.DeviceIndex=i,o.Id=a,o}return s(r,null,[{key:"Create",value:function(e,t){var n,o=new Array,a=0,u=i(t);try{for(u.s();!(n=u.n()).done;){var l=n.value;o.push(new V(a,l[0],l[1])),++a}}catch(s){u.e(s)}finally{u.f()}return new r(o,e)}}]),r}(y);t.LinearCmd=H,H.Name="LinearCmd";var U=function(e){a(r,e);var n=u(r);function r(e,o,i){var a,u=arguments.length>3&&void 0!==arguments[3]?arguments[3]:t.DEFAULT_MESSAGE_ID;return l(this,r),(a=n.call(this,e,u)).DeviceIndex=e,a.SensorIndex=o,a.SensorType=i,a.Id=u,a}return s(r)}(y);t.SensorReadCmd=U,U.Name="SensorReadCmd";var W=function(e){a(r,e);var n=u(r);function r(e,o,i,a){var u,s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:t.DEFAULT_MESSAGE_ID;return l(this,r),(u=n.call(this,e,s)).DeviceIndex=e,u.SensorIndex=o,u.SensorType=i,u.Data=a,u.Id=s,u}return s(r)}(y);t.SensorReading=W,W.Name="SensorReading";var q=function(e){a(r,e);var n=u(r);function r(e,o,i,a){var u,s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:t.DEFAULT_MESSAGE_ID;return l(this,r),(u=n.call(this,e,s)).DeviceIndex=e,u.Endpoint=o,u.ExpectedLength=i,u.Timeout=a,u.Id=s,u}return s(r)}(y);t.RawReadCmd=q,q.Name="RawReadCmd";var Y=function(e){a(r,e);var n=u(r);function r(e,o,i,a){var u,s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:t.DEFAULT_MESSAGE_ID;return l(this,r),(u=n.call(this,e,s)).DeviceIndex=e,u.Endpoint=o,u.Data=i,u.WriteWithResponse=a,u.Id=s,u}return s(r)}(y);t.RawWriteCmd=Y,Y.Name="RawWriteCmd";var Z=function(e){a(r,e);var n=u(r);function r(e,o){var i,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t.DEFAULT_MESSAGE_ID;return l(this,r),(i=n.call(this,e,a)).DeviceIndex=e,i.Endpoint=o,i.Id=a,i}return s(r)}(y);t.RawSubscribeCmd=Z,Z.Name="RawSubscribeCmd";var G=function(e){a(r,e);var n=u(r);function r(e,o){var i,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t.DEFAULT_MESSAGE_ID;return l(this,r),(i=n.call(this,e,a)).DeviceIndex=e,i.Endpoint=o,i.Id=a,i}return s(r)}(y);t.RawUnsubscribeCmd=G,G.Name="RawUnsubscribeCmd";var X=function(e){a(r,e);var n=u(r);function r(e,o,i){var a,u=arguments.length>3&&void 0!==arguments[3]?arguments[3]:t.DEFAULT_MESSAGE_ID;return l(this,r),(a=n.call(this,e,u)).DeviceIndex=e,a.Endpoint=o,a.Data=i,a.Id=u,a}return s(r)}(y);t.RawReading=X,X.Name="RawReading"},4457:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var o=Object.getOwnPropertyDescriptor(t,n);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,o)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||r(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),o(n(5252),t),o(n(1874),t),o(n(5969),t),o(n(685),t),o(n(5444),t),o(n(7075),t),o(n(9286),t),o(n(4720),t),o(n(6893),t),o(n(9295),t),o(n(3270),t)},52:function(e,t,n){"use strict";var r=n(7061).default,o=n(6690).default,i=n(9728).default,a=n(6115).default,u=n(1655).default,l=n(6389).default,s=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{l(r.next(e))}catch(t){i(t)}}function u(e){try{l(r.throw(e))}catch(t){i(t)}}function l(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,u)}l((r=r.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.ButtplugBrowserWebsocketConnector=void 0;var c=n(3641),f=n(6893),d=function(e){u(n,e);var t=l(n);function n(e){var i;return o(this,n),(i=t.call(this))._url=e,i._websocketConstructor=null,i.Connect=function(){return s(a(i),void 0,void 0,r().mark((function e(){var t,n,o,i,a,u,l=this;return r().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=new(null!==(t=this._websocketConstructor)&&void 0!==t?t:WebSocket)(this._url),a=new Promise((function(e,t){o=e,i=t})),u=function(){return i()},n.addEventListener("open",(function(){return s(l,void 0,void 0,r().mark((function e(){var t=this;return r().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return this._ws=n,e.prev=1,e.next=4,this.Initialize();case 4:this._ws.addEventListener("message",(function(e){t.ParseIncomingMessage(e)})),this._ws.removeEventListener("close",u),this._ws.addEventListener("close",this.Disconnect),o(),e.next=14;break;case 10:e.prev=10,e.t0=e.catch(1),console.log(e.t0),i();case 14:case"end":return e.stop()}}),e,this,[[1,10]])})))})),n.addEventListener("close",u),e.abrupt("return",a);case 6:case"end":return e.stop()}}),e,this)})))},i.Disconnect=function(){return s(a(i),void 0,void 0,r().mark((function e(){return r().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.Connected){e.next=2;break}return e.abrupt("return");case 2:this._ws.close(),this._ws=void 0,this.emit("disconnect");case 5:case"end":return e.stop()}}),e,this)})))},i.Initialize=function(){return s(a(i),void 0,void 0,r().mark((function e(){return r().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",Promise.resolve());case 1:case"end":return e.stop()}}),e)})))},i}return i(n,[{key:"Connected",get:function(){return void 0!==this._ws}},{key:"SendMessage",value:function(e){if(!this.Connected)throw new Error("ButtplugBrowserWebsocketConnector not connected");this._ws.send("["+e.toJSON()+"]")}},{key:"ParseIncomingMessage",value:function(e){if("string"===typeof e.data){var t=(0,f.FromJSON)(e.data);this.emit("message",t)}else e.data,Blob}},{key:"OnReaderLoad",value:function(e){var t=(0,f.FromJSON)(e.target.result);this.emit("message",t)}}]),n}(c.EventEmitter);t.ButtplugBrowserWebsocketConnector=d},7075:function(e,t,n){"use strict";var r=n(7424).default,o=n(4704).default,i=n(6690).default,a=n(9728).default,u=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var o=Object.getOwnPropertyDescriptor(t,n);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,o)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),l=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),s=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&u(t,e,n);return l(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.ButtplugMessageSorter=void 0;var c=s(n(4720)),f=n(3270),d=function(){function e(t){i(this,e),this._useCounter=t,this._counter=1,this._waitingMsgs=new Map}return a(e,[{key:"PrepareOutgoingMessage",value:function(e){var t,n;this._useCounter&&(e.Id=this._counter,this._counter+=1);var r=new Promise((function(e,r){t=e,n=r}));return this._waitingMsgs.set(e.Id,[t,n]),r}},{key:"ParseIncomingMessages",value:function(e){var t,n=[],i=o(e);try{for(i.s();!(t=i.n()).done;){var a=t.value;if(a.Id!==c.SYSTEM_MESSAGE_ID&&this._waitingMsgs.has(a.Id)){var u=this._waitingMsgs.get(a.Id),l=r(u,2),s=l[0],d=l[1];if(a.Type===c.Error){d(f.ButtplugError.FromError(a));continue}s(a)}else n.push(a)}}catch(h){i.e(h)}finally{i.f()}return n}}]),e}();t.ButtplugMessageSorter=d},3641:function(e){"use strict";var t=Object.prototype.hasOwnProperty,n="~";function r(){}function o(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function i(e,t,r,i,a){if("function"!==typeof r)throw new TypeError("The listener must be a function");var u=new o(r,i||e,a),l=n?n+t:t;return e._events[l]?e._events[l].fn?e._events[l]=[e._events[l],u]:e._events[l].push(u):(e._events[l]=u,e._eventsCount++),e}function a(e,t){0===--e._eventsCount?e._events=new r:delete e._events[t]}function u(){this._events=new r,this._eventsCount=0}Object.create&&(r.prototype=Object.create(null),(new r).__proto__||(n=!1)),u.prototype.eventNames=function(){var e,r,o=[];if(0===this._eventsCount)return o;for(r in e=this._events)t.call(e,r)&&o.push(n?r.slice(1):r);return Object.getOwnPropertySymbols?o.concat(Object.getOwnPropertySymbols(e)):o},u.prototype.listeners=function(e){var t=n?n+e:e,r=this._events[t];if(!r)return[];if(r.fn)return[r.fn];for(var o=0,i=r.length,a=new Array(i);o0&&(l=l.filter((function(e){return!f.includes(e)}))),void 0!==this.options.version&&(l=l.filter((function(t){var n=o.findExposeMetadata(e,t);return!n||!n.options||a.checkVersion(n.options.since,n.options.until)}))),l=this.options.groups&&this.options.groups.length?l.filter((function(t){var n=o.findExposeMetadata(e,t);return!n||!n.options||a.checkGroups(n.options.groups)})):l.filter((function(t){var n=o.findExposeMetadata(e,t);return!n||!n.options||!n.options.groups||!n.options.groups.length}))}return this.options.excludePrefixes&&this.options.excludePrefixes.length&&(l=l.filter((function(e){return a.options.excludePrefixes.every((function(t){return e.substr(0,t.length)!==t}))}))),l=l.filter((function(e,t,n){return n.indexOf(e)===t}))},e.prototype.checkVersion=function(e,t){var n=!0;return n&&e&&(n=this.options.version>=e),n&&t&&(n=this.options.version=t.status}function i(e){try{e.dispatchEvent(new MouseEvent("click"))}catch(r){var t=document.createEvent("MouseEvents");t.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),e.dispatchEvent(t)}}var a="object"==typeof window&&window.window===window?window:"object"==typeof self&&self.self===self?self:"object"==typeof n.g&&n.g.global===n.g?n.g:void 0,u=a.navigator&&/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),l=a.saveAs||("object"!=typeof window||window!==a?function(){}:"download"in HTMLAnchorElement.prototype&&!u?function(e,t,n){var u=a.URL||a.webkitURL,l=document.createElement("a");t=t||e.name||"download",l.download=t,l.rel="noopener","string"==typeof e?(l.href=e,l.origin===location.origin?i(l):o(l.href)?r(e,t,n):i(l,l.target="_blank")):(l.href=u.createObjectURL(e),setTimeout((function(){u.revokeObjectURL(l.href)}),4e4),setTimeout((function(){i(l)}),0))}:"msSaveOrOpenBlob"in navigator?function(e,n,a){if(n=n||e.name||"download","string"!=typeof e)navigator.msSaveOrOpenBlob(t(e,a),n);else if(o(e))r(e,n,a);else{var u=document.createElement("a");u.href=e,u.target="_blank",setTimeout((function(){i(u)}))}}:function(e,t,n,o){if((o=o||open("","_blank"))&&(o.document.title=o.document.body.innerText="downloading..."),"string"==typeof e)return r(e,t,n);var i="application/octet-stream"===e.type,l=/constructor/i.test(a.HTMLElement)||a.safari,s=/CriOS\/[\d]+/.test(navigator.userAgent);if((s||i&&l||u)&&"undefined"!=typeof FileReader){var c=new FileReader;c.onloadend=function(){var e=c.result;e=s?e:e.replace(/^data:[^;]*;/,"data:attachment/file;"),o?o.location.href=e:location=e,o=null},c.readAsDataURL(e)}else{var f=a.URL||a.webkitURL,d=f.createObjectURL(e);o?o.location=d:location.href=d,o=null,setTimeout((function(){f.revokeObjectURL(d)}),4e4)}});a.saveAs=l.saveAs=l,e.exports=l},void 0===(i="function"===typeof r?r.apply(t,o):r)||(e.exports=i)},1065:function(e){var t=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g,n=/\n/g,r=/^\s*/,o=/^(\*?[-#/*\\\w]+(\[[0-9a-z_-]+\])?)\s*/,i=/^:\s*/,a=/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};])+)/,u=/^[;\s]*/,l=/^\s+|\s+$/g,s="";function c(e){return e?e.replace(l,s):s}e.exports=function(e,l){if("string"!==typeof e)throw new TypeError("First argument must be a string");if(!e)return[];l=l||{};var f=1,d=1;function h(e){var t=e.match(n);t&&(f+=t.length);var r=e.lastIndexOf("\n");d=~r?e.length-r:d+e.length}function p(){var e={line:f,column:d};return function(t){return t.position=new v(e),b(),t}}function v(e){this.start=e,this.end={line:f,column:d},this.source=l.source}v.prototype.content=e;var g=[];function m(t){var n=new Error(l.source+":"+f+":"+d+": "+t);if(n.reason=t,n.filename=l.source,n.line=f,n.column=d,n.source=e,!l.silent)throw n;g.push(n)}function y(t){var n=t.exec(e);if(n){var r=n[0];return h(r),e=e.slice(r.length),n}}function b(){y(r)}function w(e){var t;for(e=e||[];t=x();)!1!==t&&e.push(t);return e}function x(){var t=p();if("/"==e.charAt(0)&&"*"==e.charAt(1)){for(var n=2;s!=e.charAt(n)&&("*"!=e.charAt(n)||"/"!=e.charAt(n+1));)++n;if(n+=2,s===e.charAt(n-1))return m("End of comment missing");var r=e.slice(2,n-2);return d+=2,h(r),e=e.slice(n),d+=2,t({type:"comment",comment:r})}}function _(){var e=p(),n=y(o);if(n){if(x(),!y(i))return m("property missing ':'");var r=y(a),l=e({type:"declaration",property:c(n[0].replace(t,s)),value:r?c(r[0].replace(t,s)):s});return y(u),l}}return b(),function(){var e,t=[];for(w(t);e=_();)!1!==e&&(t.push(e),w(t));return t}()}},5586:function(e){e.exports=function(e){return null!=e&&null!=e.constructor&&"function"===typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}},763:function(e,t,n){var r;e=n.nmd(e),function(){var o,i="Expected a function",a="__lodash_hash_undefined__",u="__lodash_placeholder__",l=16,s=32,c=64,f=128,d=256,h=1/0,p=9007199254740991,v=NaN,g=4294967295,m=[["ary",f],["bind",1],["bindKey",2],["curry",8],["curryRight",l],["flip",512],["partial",s],["partialRight",c],["rearg",d]],y="[object Arguments]",b="[object Array]",w="[object Boolean]",x="[object Date]",_="[object Error]",k="[object Function]",S="[object GeneratorFunction]",E="[object Map]",C="[object Number]",O="[object Object]",T="[object Promise]",M="[object RegExp]",N="[object Set]",D="[object String]",I="[object Symbol]",P="[object WeakMap]",A="[object ArrayBuffer]",j="[object DataView]",L="[object Float32Array]",R="[object Float64Array]",z="[object Int8Array]",F="[object Int16Array]",B="[object Int32Array]",V="[object Uint8Array]",H="[object Uint8ClampedArray]",U="[object Uint16Array]",W="[object Uint32Array]",q=/\b__p \+= '';/g,Y=/\b(__p \+=) '' \+/g,Z=/(__e\(.*?\)|\b__t\)) \+\n'';/g,G=/&(?:amp|lt|gt|quot|#39);/g,X=/[&<>"']/g,K=RegExp(G.source),$=RegExp(X.source),Q=/<%-([\s\S]+?)%>/g,J=/<%([\s\S]+?)%>/g,ee=/<%=([\s\S]+?)%>/g,te=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,ne=/^\w*$/,re=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,oe=/[\\^$.*+?()[\]{}|]/g,ie=RegExp(oe.source),ae=/^\s+/,ue=/\s/,le=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,se=/\{\n\/\* \[wrapped with (.+)\] \*/,ce=/,? & /,fe=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,de=/[()=,{}\[\]\/\s]/,he=/\\(\\)?/g,pe=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,ve=/\w*$/,ge=/^[-+]0x[0-9a-f]+$/i,me=/^0b[01]+$/i,ye=/^\[object .+?Constructor\]$/,be=/^0o[0-7]+$/i,we=/^(?:0|[1-9]\d*)$/,xe=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,_e=/($^)/,ke=/['\n\r\u2028\u2029\\]/g,Se="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",Ee="\\u2700-\\u27bf",Ce="a-z\\xdf-\\xf6\\xf8-\\xff",Oe="A-Z\\xc0-\\xd6\\xd8-\\xde",Te="\\ufe0e\\ufe0f",Me="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Ne="['\u2019]",De="[\\ud800-\\udfff]",Ie="["+Me+"]",Pe="["+Se+"]",Ae="\\d+",je="[\\u2700-\\u27bf]",Le="["+Ce+"]",Re="[^\\ud800-\\udfff"+Me+Ae+Ee+Ce+Oe+"]",ze="\\ud83c[\\udffb-\\udfff]",Fe="[^\\ud800-\\udfff]",Be="(?:\\ud83c[\\udde6-\\uddff]){2}",Ve="[\\ud800-\\udbff][\\udc00-\\udfff]",He="["+Oe+"]",Ue="(?:"+Le+"|"+Re+")",We="(?:"+He+"|"+Re+")",qe="(?:['\u2019](?:d|ll|m|re|s|t|ve))?",Ye="(?:['\u2019](?:D|LL|M|RE|S|T|VE))?",Ze="(?:"+Pe+"|"+ze+")"+"?",Ge="[\\ufe0e\\ufe0f]?",Xe=Ge+Ze+("(?:\\u200d(?:"+[Fe,Be,Ve].join("|")+")"+Ge+Ze+")*"),Ke="(?:"+[je,Be,Ve].join("|")+")"+Xe,$e="(?:"+[Fe+Pe+"?",Pe,Be,Ve,De].join("|")+")",Qe=RegExp(Ne,"g"),Je=RegExp(Pe,"g"),et=RegExp(ze+"(?="+ze+")|"+$e+Xe,"g"),tt=RegExp([He+"?"+Le+"+"+qe+"(?="+[Ie,He,"$"].join("|")+")",We+"+"+Ye+"(?="+[Ie,He+Ue,"$"].join("|")+")",He+"?"+Ue+"+"+qe,He+"+"+Ye,"\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",Ae,Ke].join("|"),"g"),nt=RegExp("[\\u200d\\ud800-\\udfff"+Se+Te+"]"),rt=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,ot=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],it=-1,at={};at[L]=at[R]=at[z]=at[F]=at[B]=at[V]=at[H]=at[U]=at[W]=!0,at[y]=at[b]=at[A]=at[w]=at[j]=at[x]=at[_]=at[k]=at[E]=at[C]=at[O]=at[M]=at[N]=at[D]=at[P]=!1;var ut={};ut[y]=ut[b]=ut[A]=ut[j]=ut[w]=ut[x]=ut[L]=ut[R]=ut[z]=ut[F]=ut[B]=ut[E]=ut[C]=ut[O]=ut[M]=ut[N]=ut[D]=ut[I]=ut[V]=ut[H]=ut[U]=ut[W]=!0,ut[_]=ut[k]=ut[P]=!1;var lt={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},st=parseFloat,ct=parseInt,ft="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,dt="object"==typeof self&&self&&self.Object===Object&&self,ht=ft||dt||Function("return this")(),pt=t&&!t.nodeType&&t,vt=pt&&e&&!e.nodeType&&e,gt=vt&&vt.exports===pt,mt=gt&&ft.process,yt=function(){try{var e=vt&&vt.require&&vt.require("util").types;return e||mt&&mt.binding&&mt.binding("util")}catch(t){}}(),bt=yt&&yt.isArrayBuffer,wt=yt&&yt.isDate,xt=yt&&yt.isMap,_t=yt&&yt.isRegExp,kt=yt&&yt.isSet,St=yt&&yt.isTypedArray;function Et(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}function Ct(e,t,n,r){for(var o=-1,i=null==e?0:e.length;++o-1}function It(e,t,n){for(var r=-1,o=null==e?0:e.length;++r-1;);return n}function tn(e,t){for(var n=e.length;n--&&Vt(t,e[n],0)>-1;);return n}function nn(e,t){for(var n=e.length,r=0;n--;)e[n]===t&&++r;return r}var rn=Yt({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),on=Yt({"&":"&","<":"<",">":">",'"':""","'":"'"});function an(e){return"\\"+lt[e]}function un(e){return nt.test(e)}function ln(e){var t=-1,n=Array(e.size);return e.forEach((function(e,r){n[++t]=[r,e]})),n}function sn(e,t){return function(n){return e(t(n))}}function cn(e,t){for(var n=-1,r=e.length,o=0,i=[];++n",""":'"',"'":"'"});var mn=function e(t){var n=(t=null==t?ht:mn.defaults(ht.Object(),t,mn.pick(ht,ot))).Array,r=t.Date,ue=t.Error,Se=t.Function,Ee=t.Math,Ce=t.Object,Oe=t.RegExp,Te=t.String,Me=t.TypeError,Ne=n.prototype,De=Se.prototype,Ie=Ce.prototype,Pe=t["__core-js_shared__"],Ae=De.toString,je=Ie.hasOwnProperty,Le=0,Re=function(){var e=/[^.]+$/.exec(Pe&&Pe.keys&&Pe.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}(),ze=Ie.toString,Fe=Ae.call(Ce),Be=ht._,Ve=Oe("^"+Ae.call(je).replace(oe,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),He=gt?t.Buffer:o,Ue=t.Symbol,We=t.Uint8Array,qe=He?He.allocUnsafe:o,Ye=sn(Ce.getPrototypeOf,Ce),Ze=Ce.create,Ge=Ie.propertyIsEnumerable,Xe=Ne.splice,Ke=Ue?Ue.isConcatSpreadable:o,$e=Ue?Ue.iterator:o,et=Ue?Ue.toStringTag:o,nt=function(){try{var e=hi(Ce,"defineProperty");return e({},"",{}),e}catch(t){}}(),lt=t.clearTimeout!==ht.clearTimeout&&t.clearTimeout,ft=r&&r.now!==ht.Date.now&&r.now,dt=t.setTimeout!==ht.setTimeout&&t.setTimeout,pt=Ee.ceil,vt=Ee.floor,mt=Ce.getOwnPropertySymbols,yt=He?He.isBuffer:o,zt=t.isFinite,Yt=Ne.join,yn=sn(Ce.keys,Ce),bn=Ee.max,wn=Ee.min,xn=r.now,_n=t.parseInt,kn=Ee.random,Sn=Ne.reverse,En=hi(t,"DataView"),Cn=hi(t,"Map"),On=hi(t,"Promise"),Tn=hi(t,"Set"),Mn=hi(t,"WeakMap"),Nn=hi(Ce,"create"),Dn=Mn&&new Mn,In={},Pn=Bi(En),An=Bi(Cn),jn=Bi(On),Ln=Bi(Tn),Rn=Bi(Mn),zn=Ue?Ue.prototype:o,Fn=zn?zn.valueOf:o,Bn=zn?zn.toString:o;function Vn(e){if(ru(e)&&!Ya(e)&&!(e instanceof qn)){if(e instanceof Wn)return e;if(je.call(e,"__wrapped__"))return Vi(e)}return new Wn(e)}var Hn=function(){function e(){}return function(t){if(!nu(t))return{};if(Ze)return Ze(t);e.prototype=t;var n=new e;return e.prototype=o,n}}();function Un(){}function Wn(e,t){this.__wrapped__=e,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=o}function qn(e){this.__wrapped__=e,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=g,this.__views__=[]}function Yn(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t=t?e:t)),e}function sr(e,t,n,r,i,a){var u,l=1&t,s=2&t,c=4&t;if(n&&(u=i?n(e,r,i,a):n(e)),u!==o)return u;if(!nu(e))return e;var f=Ya(e);if(f){if(u=function(e){var t=e.length,n=new e.constructor(t);t&&"string"==typeof e[0]&&je.call(e,"index")&&(n.index=e.index,n.input=e.input);return n}(e),!l)return Do(e,u)}else{var d=gi(e),h=d==k||d==S;if(Ka(e))return Eo(e,l);if(d==O||d==y||h&&!i){if(u=s||h?{}:yi(e),!l)return s?function(e,t){return Io(e,vi(e),t)}(e,function(e,t){return e&&Io(t,Au(t),e)}(u,e)):function(e,t){return Io(e,pi(e),t)}(e,ir(u,e))}else{if(!ut[d])return i?e:{};u=function(e,t,n){var r=e.constructor;switch(t){case A:return Co(e);case w:case x:return new r(+e);case j:return function(e,t){var n=t?Co(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.byteLength)}(e,n);case L:case R:case z:case F:case B:case V:case H:case U:case W:return Oo(e,n);case E:return new r;case C:case D:return new r(e);case M:return function(e){var t=new e.constructor(e.source,ve.exec(e));return t.lastIndex=e.lastIndex,t}(e);case N:return new r;case I:return o=e,Fn?Ce(Fn.call(o)):{}}var o}(e,d,l)}}a||(a=new Kn);var p=a.get(e);if(p)return p;a.set(e,u),lu(e)?e.forEach((function(r){u.add(sr(r,t,n,r,e,a))})):ou(e)&&e.forEach((function(r,o){u.set(o,sr(r,t,n,o,e,a))}));var v=f?o:(c?s?ai:ii:s?Au:Pu)(e);return Ot(v||e,(function(r,o){v&&(r=e[o=r]),nr(u,o,sr(r,t,n,o,e,a))})),u}function cr(e,t,n){var r=n.length;if(null==e)return!r;for(e=Ce(e);r--;){var i=n[r],a=t[i],u=e[i];if(u===o&&!(i in e)||!a(u))return!1}return!0}function fr(e,t,n){if("function"!=typeof e)throw new Me(i);return Pi((function(){e.apply(o,n)}),t)}function dr(e,t,n,r){var o=-1,i=Dt,a=!0,u=e.length,l=[],s=t.length;if(!u)return l;n&&(t=Pt(t,$t(n))),r?(i=It,a=!1):t.length>=200&&(i=Jt,a=!1,t=new Xn(t));e:for(;++o-1},Zn.prototype.set=function(e,t){var n=this.__data__,r=rr(n,e);return r<0?(++this.size,n.push([e,t])):n[r][1]=t,this},Gn.prototype.clear=function(){this.size=0,this.__data__={hash:new Yn,map:new(Cn||Zn),string:new Yn}},Gn.prototype.delete=function(e){var t=fi(this,e).delete(e);return this.size-=t?1:0,t},Gn.prototype.get=function(e){return fi(this,e).get(e)},Gn.prototype.has=function(e){return fi(this,e).has(e)},Gn.prototype.set=function(e,t){var n=fi(this,e),r=n.size;return n.set(e,t),this.size+=n.size==r?0:1,this},Xn.prototype.add=Xn.prototype.push=function(e){return this.__data__.set(e,a),this},Xn.prototype.has=function(e){return this.__data__.has(e)},Kn.prototype.clear=function(){this.__data__=new Zn,this.size=0},Kn.prototype.delete=function(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n},Kn.prototype.get=function(e){return this.__data__.get(e)},Kn.prototype.has=function(e){return this.__data__.has(e)},Kn.prototype.set=function(e,t){var n=this.__data__;if(n instanceof Zn){var r=n.__data__;if(!Cn||r.length<199)return r.push([e,t]),this.size=++n.size,this;n=this.__data__=new Gn(r)}return n.set(e,t),this.size=n.size,this};var hr=jo(xr),pr=jo(_r,!0);function vr(e,t){var n=!0;return hr(e,(function(e,r,o){return n=!!t(e,r,o)})),n}function gr(e,t,n){for(var r=-1,i=e.length;++r0&&n(u)?t>1?yr(u,t-1,n,r,o):At(o,u):r||(o[o.length]=u)}return o}var br=Lo(),wr=Lo(!0);function xr(e,t){return e&&br(e,t,Pu)}function _r(e,t){return e&&wr(e,t,Pu)}function kr(e,t){return Nt(t,(function(t){return Ja(e[t])}))}function Sr(e,t){for(var n=0,r=(t=xo(t,e)).length;null!=e&&nt}function Tr(e,t){return null!=e&&je.call(e,t)}function Mr(e,t){return null!=e&&t in Ce(e)}function Nr(e,t,r){for(var i=r?It:Dt,a=e[0].length,u=e.length,l=u,s=n(u),c=1/0,f=[];l--;){var d=e[l];l&&t&&(d=Pt(d,$t(t))),c=wn(d.length,c),s[l]=!r&&(t||a>=120&&d.length>=120)?new Xn(l&&d):o}d=e[0];var h=-1,p=s[0];e:for(;++h=u?l:l*("desc"==n[r]?-1:1)}return e.index-t.index}(e,t,n)}))}function Yr(e,t,n){for(var r=-1,o=t.length,i={};++r-1;)u!==e&&Xe.call(u,l,1),Xe.call(e,l,1);return e}function Gr(e,t){for(var n=e?t.length:0,r=n-1;n--;){var o=t[n];if(n==r||o!==i){var i=o;wi(o)?Xe.call(e,o,1):ho(e,o)}}return e}function Xr(e,t){return e+vt(kn()*(t-e+1))}function Kr(e,t){var n="";if(!e||t<1||t>p)return n;do{t%2&&(n+=e),(t=vt(t/2))&&(e+=e)}while(t);return n}function $r(e,t){return Ai(Ti(e,t,il),e+"")}function Qr(e){return Qn(Hu(e))}function Jr(e,t){var n=Hu(e);return Ri(n,lr(t,0,n.length))}function eo(e,t,n,r){if(!nu(e))return e;for(var i=-1,a=(t=xo(t,e)).length,u=a-1,l=e;null!=l&&++ii?0:i+t),(r=r>i?i:r)<0&&(r+=i),i=t>r?0:r-t>>>0,t>>>=0;for(var a=n(i);++o>>1,a=e[i];null!==a&&!cu(a)&&(n?a<=t:a=200){var s=t?null:$o(e);if(s)return fn(s);a=!1,o=Jt,l=new Xn}else l=t?[]:u;e:for(;++r=r?e:oo(e,t,n)}var So=lt||function(e){return ht.clearTimeout(e)};function Eo(e,t){if(t)return e.slice();var n=e.length,r=qe?qe(n):new e.constructor(n);return e.copy(r),r}function Co(e){var t=new e.constructor(e.byteLength);return new We(t).set(new We(e)),t}function Oo(e,t){var n=t?Co(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.length)}function To(e,t){if(e!==t){var n=e!==o,r=null===e,i=e===e,a=cu(e),u=t!==o,l=null===t,s=t===t,c=cu(t);if(!l&&!c&&!a&&e>t||a&&u&&s&&!l&&!c||r&&u&&s||!n&&s||!i)return 1;if(!r&&!a&&!c&&e1?n[i-1]:o,u=i>2?n[2]:o;for(a=e.length>3&&"function"==typeof a?(i--,a):o,u&&xi(n[0],n[1],u)&&(a=i<3?o:a,i=1),t=Ce(t);++r-1?i[a?t[u]:u]:o}}function Vo(e){return oi((function(t){var n=t.length,r=n,a=Wn.prototype.thru;for(e&&t.reverse();r--;){var u=t[r];if("function"!=typeof u)throw new Me(i);if(a&&!l&&"wrapper"==li(u))var l=new Wn([],!0)}for(r=l?r:n;++r1&&b.reverse(),h&&cl))return!1;var c=a.get(e),f=a.get(t);if(c&&f)return c==t&&f==e;var d=-1,h=!0,p=2&n?new Xn:o;for(a.set(e,t),a.set(t,e);++d-1&&e%1==0&&e1?"& ":"")+t[r],t=t.join(n>2?", ":" "),e.replace(le,"{\n/* [wrapped with "+t+"] */\n")}(r,function(e,t){return Ot(m,(function(n){var r="_."+n[0];t&n[1]&&!Dt(e,r)&&e.push(r)})),e.sort()}(function(e){var t=e.match(se);return t?t[1].split(ce):[]}(r),n)))}function Li(e){var t=0,n=0;return function(){var r=xn(),i=16-(r-n);if(n=r,i>0){if(++t>=800)return arguments[0]}else t=0;return e.apply(o,arguments)}}function Ri(e,t){var n=-1,r=e.length,i=r-1;for(t=t===o?r:t;++n1?e[t-1]:o;return n="function"==typeof n?(e.pop(),n):o,ua(e,n)}));function pa(e){var t=Vn(e);return t.__chain__=!0,t}function va(e,t){return t(e)}var ga=oi((function(e){var t=e.length,n=t?e[0]:0,r=this.__wrapped__,i=function(t){return ur(t,e)};return!(t>1||this.__actions__.length)&&r instanceof qn&&wi(n)?((r=r.slice(n,+n+(t?1:0))).__actions__.push({func:va,args:[i],thisArg:o}),new Wn(r,this.__chain__).thru((function(e){return t&&!e.length&&e.push(o),e}))):this.thru(i)}));var ma=Po((function(e,t,n){je.call(e,n)?++e[n]:ar(e,n,1)}));var ya=Bo(qi),ba=Bo(Yi);function wa(e,t){return(Ya(e)?Ot:hr)(e,ci(t,3))}function xa(e,t){return(Ya(e)?Tt:pr)(e,ci(t,3))}var _a=Po((function(e,t,n){je.call(e,n)?e[n].push(t):ar(e,n,[t])}));var ka=$r((function(e,t,r){var o=-1,i="function"==typeof t,a=Ga(e)?n(e.length):[];return hr(e,(function(e){a[++o]=i?Et(t,e,r):Dr(e,t,r)})),a})),Sa=Po((function(e,t,n){ar(e,n,t)}));function Ea(e,t){return(Ya(e)?Pt:Br)(e,ci(t,3))}var Ca=Po((function(e,t,n){e[n?0:1].push(t)}),(function(){return[[],[]]}));var Oa=$r((function(e,t){if(null==e)return[];var n=t.length;return n>1&&xi(e,t[0],t[1])?t=[]:n>2&&xi(t[0],t[1],t[2])&&(t=[t[0]]),qr(e,yr(t,1),[])})),Ta=ft||function(){return ht.Date.now()};function Ma(e,t,n){return t=n?o:t,t=e&&null==t?e.length:t,Jo(e,f,o,o,o,o,t)}function Na(e,t){var n;if("function"!=typeof t)throw new Me(i);return e=gu(e),function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=o),n}}var Da=$r((function(e,t,n){var r=1;if(n.length){var o=cn(n,si(Da));r|=s}return Jo(e,r,t,n,o)})),Ia=$r((function(e,t,n){var r=3;if(n.length){var o=cn(n,si(Ia));r|=s}return Jo(t,r,e,n,o)}));function Pa(e,t,n){var r,a,u,l,s,c,f=0,d=!1,h=!1,p=!0;if("function"!=typeof e)throw new Me(i);function v(t){var n=r,i=a;return r=a=o,f=t,l=e.apply(i,n)}function g(e){return f=e,s=Pi(y,t),d?v(e):l}function m(e){var n=e-c;return c===o||n>=t||n<0||h&&e-f>=u}function y(){var e=Ta();if(m(e))return b(e);s=Pi(y,function(e){var n=t-(e-c);return h?wn(n,u-(e-f)):n}(e))}function b(e){return s=o,p&&r?v(e):(r=a=o,l)}function w(){var e=Ta(),n=m(e);if(r=arguments,a=this,c=e,n){if(s===o)return g(c);if(h)return So(s),s=Pi(y,t),v(c)}return s===o&&(s=Pi(y,t)),l}return t=yu(t)||0,nu(n)&&(d=!!n.leading,u=(h="maxWait"in n)?bn(yu(n.maxWait)||0,t):u,p="trailing"in n?!!n.trailing:p),w.cancel=function(){s!==o&&So(s),f=0,r=c=a=s=o},w.flush=function(){return s===o?l:b(Ta())},w}var Aa=$r((function(e,t){return fr(e,1,t)})),ja=$r((function(e,t,n){return fr(e,yu(t)||0,n)}));function La(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new Me(i);var n=function n(){var r=arguments,o=t?t.apply(this,r):r[0],i=n.cache;if(i.has(o))return i.get(o);var a=e.apply(this,r);return n.cache=i.set(o,a)||i,a};return n.cache=new(La.Cache||Gn),n}function Ra(e){if("function"!=typeof e)throw new Me(i);return function(){var t=arguments;switch(t.length){case 0:return!e.call(this);case 1:return!e.call(this,t[0]);case 2:return!e.call(this,t[0],t[1]);case 3:return!e.call(this,t[0],t[1],t[2])}return!e.apply(this,t)}}La.Cache=Gn;var za=_o((function(e,t){var n=(t=1==t.length&&Ya(t[0])?Pt(t[0],$t(ci())):Pt(yr(t,1),$t(ci()))).length;return $r((function(r){for(var o=-1,i=wn(r.length,n);++o=t})),qa=Ir(function(){return arguments}())?Ir:function(e){return ru(e)&&je.call(e,"callee")&&!Ge.call(e,"callee")},Ya=n.isArray,Za=bt?$t(bt):function(e){return ru(e)&&Cr(e)==A};function Ga(e){return null!=e&&tu(e.length)&&!Ja(e)}function Xa(e){return ru(e)&&Ga(e)}var Ka=yt||yl,$a=wt?$t(wt):function(e){return ru(e)&&Cr(e)==x};function Qa(e){if(!ru(e))return!1;var t=Cr(e);return t==_||"[object DOMException]"==t||"string"==typeof e.message&&"string"==typeof e.name&&!au(e)}function Ja(e){if(!nu(e))return!1;var t=Cr(e);return t==k||t==S||"[object AsyncFunction]"==t||"[object Proxy]"==t}function eu(e){return"number"==typeof e&&e==gu(e)}function tu(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=p}function nu(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}function ru(e){return null!=e&&"object"==typeof e}var ou=xt?$t(xt):function(e){return ru(e)&&gi(e)==E};function iu(e){return"number"==typeof e||ru(e)&&Cr(e)==C}function au(e){if(!ru(e)||Cr(e)!=O)return!1;var t=Ye(e);if(null===t)return!0;var n=je.call(t,"constructor")&&t.constructor;return"function"==typeof n&&n instanceof n&&Ae.call(n)==Fe}var uu=_t?$t(_t):function(e){return ru(e)&&Cr(e)==M};var lu=kt?$t(kt):function(e){return ru(e)&&gi(e)==N};function su(e){return"string"==typeof e||!Ya(e)&&ru(e)&&Cr(e)==D}function cu(e){return"symbol"==typeof e||ru(e)&&Cr(e)==I}var fu=St?$t(St):function(e){return ru(e)&&tu(e.length)&&!!at[Cr(e)]};var du=Go(Fr),hu=Go((function(e,t){return e<=t}));function pu(e){if(!e)return[];if(Ga(e))return su(e)?pn(e):Do(e);if($e&&e[$e])return function(e){for(var t,n=[];!(t=e.next()).done;)n.push(t.value);return n}(e[$e]());var t=gi(e);return(t==E?ln:t==N?fn:Hu)(e)}function vu(e){return e?(e=yu(e))===h||e===-1/0?17976931348623157e292*(e<0?-1:1):e===e?e:0:0===e?e:0}function gu(e){var t=vu(e),n=t%1;return t===t?n?t-n:t:0}function mu(e){return e?lr(gu(e),0,g):0}function yu(e){if("number"==typeof e)return e;if(cu(e))return v;if(nu(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=nu(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=Kt(e);var n=me.test(e);return n||be.test(e)?ct(e.slice(2),n?2:8):ge.test(e)?v:+e}function bu(e){return Io(e,Au(e))}function wu(e){return null==e?"":co(e)}var xu=Ao((function(e,t){if(Ei(t)||Ga(t))Io(t,Pu(t),e);else for(var n in t)je.call(t,n)&&nr(e,n,t[n])})),_u=Ao((function(e,t){Io(t,Au(t),e)})),ku=Ao((function(e,t,n,r){Io(t,Au(t),e,r)})),Su=Ao((function(e,t,n,r){Io(t,Pu(t),e,r)})),Eu=oi(ur);var Cu=$r((function(e,t){e=Ce(e);var n=-1,r=t.length,i=r>2?t[2]:o;for(i&&xi(t[0],t[1],i)&&(r=1);++n1),t})),Io(e,ai(e),n),r&&(n=sr(n,7,ni));for(var o=t.length;o--;)ho(n,t[o]);return n}));var zu=oi((function(e,t){return null==e?{}:function(e,t){return Yr(e,t,(function(t,n){return Mu(e,n)}))}(e,t)}));function Fu(e,t){if(null==e)return{};var n=Pt(ai(e),(function(e){return[e]}));return t=ci(t),Yr(e,n,(function(e,n){return t(e,n[0])}))}var Bu=Qo(Pu),Vu=Qo(Au);function Hu(e){return null==e?[]:Qt(e,Pu(e))}var Uu=zo((function(e,t,n){return t=t.toLowerCase(),e+(n?Wu(t):t)}));function Wu(e){return Qu(wu(e).toLowerCase())}function qu(e){return(e=wu(e))&&e.replace(xe,rn).replace(Je,"")}var Yu=zo((function(e,t,n){return e+(n?"-":"")+t.toLowerCase()})),Zu=zo((function(e,t,n){return e+(n?" ":"")+t.toLowerCase()})),Gu=Ro("toLowerCase");var Xu=zo((function(e,t,n){return e+(n?"_":"")+t.toLowerCase()}));var Ku=zo((function(e,t,n){return e+(n?" ":"")+Qu(t)}));var $u=zo((function(e,t,n){return e+(n?" ":"")+t.toUpperCase()})),Qu=Ro("toUpperCase");function Ju(e,t,n){return e=wu(e),(t=n?o:t)===o?function(e){return rt.test(e)}(e)?function(e){return e.match(tt)||[]}(e):function(e){return e.match(fe)||[]}(e):e.match(t)||[]}var el=$r((function(e,t){try{return Et(e,o,t)}catch(n){return Qa(n)?n:new ue(n)}})),tl=oi((function(e,t){return Ot(t,(function(t){t=Fi(t),ar(e,t,Da(e[t],e))})),e}));function nl(e){return function(){return e}}var rl=Vo(),ol=Vo(!0);function il(e){return e}function al(e){return Lr("function"==typeof e?e:sr(e,1))}var ul=$r((function(e,t){return function(n){return Dr(n,e,t)}})),ll=$r((function(e,t){return function(n){return Dr(e,n,t)}}));function sl(e,t,n){var r=Pu(t),o=kr(t,r);null!=n||nu(t)&&(o.length||!r.length)||(n=t,t=e,e=this,o=kr(t,Pu(t)));var i=!(nu(n)&&"chain"in n)||!!n.chain,a=Ja(e);return Ot(o,(function(n){var r=t[n];e[n]=r,a&&(e.prototype[n]=function(){var t=this.__chain__;if(i||t){var n=e(this.__wrapped__),o=n.__actions__=Do(this.__actions__);return o.push({func:r,args:arguments,thisArg:e}),n.__chain__=t,n}return r.apply(e,At([this.value()],arguments))})})),e}function cl(){}var fl=qo(Pt),dl=qo(Mt),hl=qo(Rt);function pl(e){return _i(e)?qt(Fi(e)):function(e){return function(t){return Sr(t,e)}}(e)}var vl=Zo(),gl=Zo(!0);function ml(){return[]}function yl(){return!1}var bl=Wo((function(e,t){return e+t}),0),wl=Ko("ceil"),xl=Wo((function(e,t){return e/t}),1),_l=Ko("floor");var kl=Wo((function(e,t){return e*t}),1),Sl=Ko("round"),El=Wo((function(e,t){return e-t}),0);return Vn.after=function(e,t){if("function"!=typeof t)throw new Me(i);return e=gu(e),function(){if(--e<1)return t.apply(this,arguments)}},Vn.ary=Ma,Vn.assign=xu,Vn.assignIn=_u,Vn.assignInWith=ku,Vn.assignWith=Su,Vn.at=Eu,Vn.before=Na,Vn.bind=Da,Vn.bindAll=tl,Vn.bindKey=Ia,Vn.castArray=function(){if(!arguments.length)return[];var e=arguments[0];return Ya(e)?e:[e]},Vn.chain=pa,Vn.chunk=function(e,t,r){t=(r?xi(e,t,r):t===o)?1:bn(gu(t),0);var i=null==e?0:e.length;if(!i||t<1)return[];for(var a=0,u=0,l=n(pt(i/t));ai?0:i+n),(r=r===o||r>i?i:gu(r))<0&&(r+=i),r=n>r?0:mu(r);n>>0)?(e=wu(e))&&("string"==typeof t||null!=t&&!uu(t))&&!(t=co(t))&&un(e)?ko(pn(e),0,n):e.split(t,n):[]},Vn.spread=function(e,t){if("function"!=typeof e)throw new Me(i);return t=null==t?0:bn(gu(t),0),$r((function(n){var r=n[t],o=ko(n,0,t);return r&&At(o,r),Et(e,this,o)}))},Vn.tail=function(e){var t=null==e?0:e.length;return t?oo(e,1,t):[]},Vn.take=function(e,t,n){return e&&e.length?oo(e,0,(t=n||t===o?1:gu(t))<0?0:t):[]},Vn.takeRight=function(e,t,n){var r=null==e?0:e.length;return r?oo(e,(t=r-(t=n||t===o?1:gu(t)))<0?0:t,r):[]},Vn.takeRightWhile=function(e,t){return e&&e.length?vo(e,ci(t,3),!1,!0):[]},Vn.takeWhile=function(e,t){return e&&e.length?vo(e,ci(t,3)):[]},Vn.tap=function(e,t){return t(e),e},Vn.throttle=function(e,t,n){var r=!0,o=!0;if("function"!=typeof e)throw new Me(i);return nu(n)&&(r="leading"in n?!!n.leading:r,o="trailing"in n?!!n.trailing:o),Pa(e,t,{leading:r,maxWait:t,trailing:o})},Vn.thru=va,Vn.toArray=pu,Vn.toPairs=Bu,Vn.toPairsIn=Vu,Vn.toPath=function(e){return Ya(e)?Pt(e,Fi):cu(e)?[e]:Do(zi(wu(e)))},Vn.toPlainObject=bu,Vn.transform=function(e,t,n){var r=Ya(e),o=r||Ka(e)||fu(e);if(t=ci(t,4),null==n){var i=e&&e.constructor;n=o?r?new i:[]:nu(e)&&Ja(i)?Hn(Ye(e)):{}}return(o?Ot:xr)(e,(function(e,r,o){return t(n,e,r,o)})),n},Vn.unary=function(e){return Ma(e,1)},Vn.union=ra,Vn.unionBy=oa,Vn.unionWith=ia,Vn.uniq=function(e){return e&&e.length?fo(e):[]},Vn.uniqBy=function(e,t){return e&&e.length?fo(e,ci(t,2)):[]},Vn.uniqWith=function(e,t){return t="function"==typeof t?t:o,e&&e.length?fo(e,o,t):[]},Vn.unset=function(e,t){return null==e||ho(e,t)},Vn.unzip=aa,Vn.unzipWith=ua,Vn.update=function(e,t,n){return null==e?e:po(e,t,wo(n))},Vn.updateWith=function(e,t,n,r){return r="function"==typeof r?r:o,null==e?e:po(e,t,wo(n),r)},Vn.values=Hu,Vn.valuesIn=function(e){return null==e?[]:Qt(e,Au(e))},Vn.without=la,Vn.words=Ju,Vn.wrap=function(e,t){return Fa(wo(t),e)},Vn.xor=sa,Vn.xorBy=ca,Vn.xorWith=fa,Vn.zip=da,Vn.zipObject=function(e,t){return yo(e||[],t||[],nr)},Vn.zipObjectDeep=function(e,t){return yo(e||[],t||[],eo)},Vn.zipWith=ha,Vn.entries=Bu,Vn.entriesIn=Vu,Vn.extend=_u,Vn.extendWith=ku,sl(Vn,Vn),Vn.add=bl,Vn.attempt=el,Vn.camelCase=Uu,Vn.capitalize=Wu,Vn.ceil=wl,Vn.clamp=function(e,t,n){return n===o&&(n=t,t=o),n!==o&&(n=(n=yu(n))===n?n:0),t!==o&&(t=(t=yu(t))===t?t:0),lr(yu(e),t,n)},Vn.clone=function(e){return sr(e,4)},Vn.cloneDeep=function(e){return sr(e,5)},Vn.cloneDeepWith=function(e,t){return sr(e,5,t="function"==typeof t?t:o)},Vn.cloneWith=function(e,t){return sr(e,4,t="function"==typeof t?t:o)},Vn.conformsTo=function(e,t){return null==t||cr(e,t,Pu(t))},Vn.deburr=qu,Vn.defaultTo=function(e,t){return null==e||e!==e?t:e},Vn.divide=xl,Vn.endsWith=function(e,t,n){e=wu(e),t=co(t);var r=e.length,i=n=n===o?r:lr(gu(n),0,r);return(n-=t.length)>=0&&e.slice(n,i)==t},Vn.eq=Ha,Vn.escape=function(e){return(e=wu(e))&&$.test(e)?e.replace(X,on):e},Vn.escapeRegExp=function(e){return(e=wu(e))&&ie.test(e)?e.replace(oe,"\\$&"):e},Vn.every=function(e,t,n){var r=Ya(e)?Mt:vr;return n&&xi(e,t,n)&&(t=o),r(e,ci(t,3))},Vn.find=ya,Vn.findIndex=qi,Vn.findKey=function(e,t){return Ft(e,ci(t,3),xr)},Vn.findLast=ba,Vn.findLastIndex=Yi,Vn.findLastKey=function(e,t){return Ft(e,ci(t,3),_r)},Vn.floor=_l,Vn.forEach=wa,Vn.forEachRight=xa,Vn.forIn=function(e,t){return null==e?e:br(e,ci(t,3),Au)},Vn.forInRight=function(e,t){return null==e?e:wr(e,ci(t,3),Au)},Vn.forOwn=function(e,t){return e&&xr(e,ci(t,3))},Vn.forOwnRight=function(e,t){return e&&_r(e,ci(t,3))},Vn.get=Tu,Vn.gt=Ua,Vn.gte=Wa,Vn.has=function(e,t){return null!=e&&mi(e,t,Tr)},Vn.hasIn=Mu,Vn.head=Gi,Vn.identity=il,Vn.includes=function(e,t,n,r){e=Ga(e)?e:Hu(e),n=n&&!r?gu(n):0;var o=e.length;return n<0&&(n=bn(o+n,0)),su(e)?n<=o&&e.indexOf(t,n)>-1:!!o&&Vt(e,t,n)>-1},Vn.indexOf=function(e,t,n){var r=null==e?0:e.length;if(!r)return-1;var o=null==n?0:gu(n);return o<0&&(o=bn(r+o,0)),Vt(e,t,o)},Vn.inRange=function(e,t,n){return t=vu(t),n===o?(n=t,t=0):n=vu(n),function(e,t,n){return e>=wn(t,n)&&e=-9007199254740991&&e<=p},Vn.isSet=lu,Vn.isString=su,Vn.isSymbol=cu,Vn.isTypedArray=fu,Vn.isUndefined=function(e){return e===o},Vn.isWeakMap=function(e){return ru(e)&&gi(e)==P},Vn.isWeakSet=function(e){return ru(e)&&"[object WeakSet]"==Cr(e)},Vn.join=function(e,t){return null==e?"":Yt.call(e,t)},Vn.kebabCase=Yu,Vn.last=Qi,Vn.lastIndexOf=function(e,t,n){var r=null==e?0:e.length;if(!r)return-1;var i=r;return n!==o&&(i=(i=gu(n))<0?bn(r+i,0):wn(i,r-1)),t===t?function(e,t,n){for(var r=n+1;r--;)if(e[r]===t)return r;return r}(e,t,i):Bt(e,Ut,i,!0)},Vn.lowerCase=Zu,Vn.lowerFirst=Gu,Vn.lt=du,Vn.lte=hu,Vn.max=function(e){return e&&e.length?gr(e,il,Or):o},Vn.maxBy=function(e,t){return e&&e.length?gr(e,ci(t,2),Or):o},Vn.mean=function(e){return Wt(e,il)},Vn.meanBy=function(e,t){return Wt(e,ci(t,2))},Vn.min=function(e){return e&&e.length?gr(e,il,Fr):o},Vn.minBy=function(e,t){return e&&e.length?gr(e,ci(t,2),Fr):o},Vn.stubArray=ml,Vn.stubFalse=yl,Vn.stubObject=function(){return{}},Vn.stubString=function(){return""},Vn.stubTrue=function(){return!0},Vn.multiply=kl,Vn.nth=function(e,t){return e&&e.length?Wr(e,gu(t)):o},Vn.noConflict=function(){return ht._===this&&(ht._=Be),this},Vn.noop=cl,Vn.now=Ta,Vn.pad=function(e,t,n){e=wu(e);var r=(t=gu(t))?hn(e):0;if(!t||r>=t)return e;var o=(t-r)/2;return Yo(vt(o),n)+e+Yo(pt(o),n)},Vn.padEnd=function(e,t,n){e=wu(e);var r=(t=gu(t))?hn(e):0;return t&&rt){var r=e;e=t,t=r}if(n||e%1||t%1){var i=kn();return wn(e+i*(t-e+st("1e-"+((i+"").length-1))),t)}return Xr(e,t)},Vn.reduce=function(e,t,n){var r=Ya(e)?jt:Zt,o=arguments.length<3;return r(e,ci(t,4),n,o,hr)},Vn.reduceRight=function(e,t,n){var r=Ya(e)?Lt:Zt,o=arguments.length<3;return r(e,ci(t,4),n,o,pr)},Vn.repeat=function(e,t,n){return t=(n?xi(e,t,n):t===o)?1:gu(t),Kr(wu(e),t)},Vn.replace=function(){var e=arguments,t=wu(e[0]);return e.length<3?t:t.replace(e[1],e[2])},Vn.result=function(e,t,n){var r=-1,i=(t=xo(t,e)).length;for(i||(i=1,e=o);++rp)return[];var n=g,r=wn(e,g);t=ci(t),e-=g;for(var o=Xt(r,t);++n=a)return e;var l=n-hn(r);if(l<1)return r;var s=u?ko(u,0,l).join(""):e.slice(0,l);if(i===o)return s+r;if(u&&(l+=s.length-l),uu(i)){if(e.slice(l).search(i)){var c,f=s;for(i.global||(i=Oe(i.source,wu(ve.exec(i))+"g")),i.lastIndex=0;c=i.exec(f);)var d=c.index;s=s.slice(0,d===o?l:d)}}else if(e.indexOf(co(i),l)!=l){var h=s.lastIndexOf(i);h>-1&&(s=s.slice(0,h))}return s+r},Vn.unescape=function(e){return(e=wu(e))&&K.test(e)?e.replace(G,gn):e},Vn.uniqueId=function(e){var t=++Le;return wu(e)+t},Vn.upperCase=$u,Vn.upperFirst=Qu,Vn.each=wa,Vn.eachRight=xa,Vn.first=Gi,sl(Vn,function(){var e={};return xr(Vn,(function(t,n){je.call(Vn.prototype,n)||(e[n]=t)})),e}(),{chain:!1}),Vn.VERSION="4.17.21",Ot(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(e){Vn[e].placeholder=Vn})),Ot(["drop","take"],(function(e,t){qn.prototype[e]=function(n){n=n===o?1:bn(gu(n),0);var r=this.__filtered__&&!t?new qn(this):this.clone();return r.__filtered__?r.__takeCount__=wn(n,r.__takeCount__):r.__views__.push({size:wn(n,g),type:e+(r.__dir__<0?"Right":"")}),r},qn.prototype[e+"Right"]=function(t){return this.reverse()[e](t).reverse()}})),Ot(["filter","map","takeWhile"],(function(e,t){var n=t+1,r=1==n||3==n;qn.prototype[e]=function(e){var t=this.clone();return t.__iteratees__.push({iteratee:ci(e,3),type:n}),t.__filtered__=t.__filtered__||r,t}})),Ot(["head","last"],(function(e,t){var n="take"+(t?"Right":"");qn.prototype[e]=function(){return this[n](1).value()[0]}})),Ot(["initial","tail"],(function(e,t){var n="drop"+(t?"":"Right");qn.prototype[e]=function(){return this.__filtered__?new qn(this):this[n](1)}})),qn.prototype.compact=function(){return this.filter(il)},qn.prototype.find=function(e){return this.filter(e).head()},qn.prototype.findLast=function(e){return this.reverse().find(e)},qn.prototype.invokeMap=$r((function(e,t){return"function"==typeof e?new qn(this):this.map((function(n){return Dr(n,e,t)}))})),qn.prototype.reject=function(e){return this.filter(Ra(ci(e)))},qn.prototype.slice=function(e,t){e=gu(e);var n=this;return n.__filtered__&&(e>0||t<0)?new qn(n):(e<0?n=n.takeRight(-e):e&&(n=n.drop(e)),t!==o&&(n=(t=gu(t))<0?n.dropRight(-t):n.take(t-e)),n)},qn.prototype.takeRightWhile=function(e){return this.reverse().takeWhile(e).reverse()},qn.prototype.toArray=function(){return this.take(g)},xr(qn.prototype,(function(e,t){var n=/^(?:filter|find|map|reject)|While$/.test(t),r=/^(?:head|last)$/.test(t),i=Vn[r?"take"+("last"==t?"Right":""):t],a=r||/^find/.test(t);i&&(Vn.prototype[t]=function(){var t=this.__wrapped__,u=r?[1]:arguments,l=t instanceof qn,s=u[0],c=l||Ya(t),f=function(e){var t=i.apply(Vn,At([e],u));return r&&d?t[0]:t};c&&n&&"function"==typeof s&&1!=s.length&&(l=c=!1);var d=this.__chain__,h=!!this.__actions__.length,p=a&&!d,v=l&&!h;if(!a&&c){t=v?t:new qn(this);var g=e.apply(t,u);return g.__actions__.push({func:va,args:[f],thisArg:o}),new Wn(g,d)}return p&&v?e.apply(this,u):(g=this.thru(f),p?r?g.value()[0]:g.value():g)})})),Ot(["pop","push","shift","sort","splice","unshift"],(function(e){var t=Ne[e],n=/^(?:push|sort|unshift)$/.test(e)?"tap":"thru",r=/^(?:pop|shift)$/.test(e);Vn.prototype[e]=function(){var e=arguments;if(r&&!this.__chain__){var o=this.value();return t.apply(Ya(o)?o:[],e)}return this[n]((function(n){return t.apply(Ya(n)?n:[],e)}))}})),xr(qn.prototype,(function(e,t){var n=Vn[t];if(n){var r=n.name+"";je.call(In,r)||(In[r]=[]),In[r].push({name:t,func:n})}})),In[Ho(o,2).name]=[{name:"wrapper",func:o}],qn.prototype.clone=function(){var e=new qn(this.__wrapped__);return e.__actions__=Do(this.__actions__),e.__dir__=this.__dir__,e.__filtered__=this.__filtered__,e.__iteratees__=Do(this.__iteratees__),e.__takeCount__=this.__takeCount__,e.__views__=Do(this.__views__),e},qn.prototype.reverse=function(){if(this.__filtered__){var e=new qn(this);e.__dir__=-1,e.__filtered__=!0}else(e=this.clone()).__dir__*=-1;return e},qn.prototype.value=function(){var e=this.__wrapped__.value(),t=this.__dir__,n=Ya(e),r=t<0,o=n?e.length:0,i=function(e,t,n){var r=-1,o=n.length;for(;++r=this.__values__.length;return{done:e,value:e?o:this.__values__[this.__index__++]}},Vn.prototype.plant=function(e){for(var t,n=this;n instanceof Un;){var r=Vi(n);r.__index__=0,r.__values__=o,t?i.__wrapped__=r:t=r;var i=r;n=n.__wrapped__}return i.__wrapped__=e,t},Vn.prototype.reverse=function(){var e=this.__wrapped__;if(e instanceof qn){var t=e;return this.__actions__.length&&(t=new qn(this)),(t=t.reverse()).__actions__.push({func:va,args:[na],thisArg:o}),new Wn(t,this.__chain__)}return this.thru(na)},Vn.prototype.toJSON=Vn.prototype.valueOf=Vn.prototype.value=function(){return go(this.__wrapped__,this.__actions__)},Vn.prototype.first=Vn.prototype.head,$e&&(Vn.prototype[$e]=function(){return this}),Vn}();ht._=mn,(r=function(){return mn}.call(t,n,t,e))===o||(e.exports=r)}.call(this)},888:function(e,t,n){"use strict";var r=n(9047);function o(){}function i(){}i.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,i,a){if(a!==r){var u=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw u.name="Invariant Violation",u}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:i,resetWarningCache:o};return n.PropTypes=n,n}},2007:function(e,t,n){e.exports=n(888)()},9047:function(e){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4463:function(e,t,n){"use strict";var r=n(2791),o=n(5296);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n